Skip to content

Commit cfc0fa1

Browse files
feat(ref): improved eth_decrypt method flow (#1765)
1 parent 31756c0 commit cfc0fa1

File tree

5 files changed

+43
-7
lines changed

5 files changed

+43
-7
lines changed

package-lock.json

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
"@intercom/messenger-js-sdk": "^0.0.14",
3939
"@mdx-js/react": "^3.0.0",
4040
"@metamask/design-tokens": "^1.11.1",
41+
"@metamask/eth-sig-util": "^7.0.3",
4142
"@metamask/profile-sync-controller": "^0.9.6",
4243
"@metamask/sdk": "^0.31.1",
4344
"@rjsf/core": "^5.22.1",

src/components/ParserOpenRPC/RequestBox/index.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export default function RequestBox({
4848
requestURL = "",
4949
isLoading,
5050
}: RequestBoxProps) {
51-
const { userAPIKey } = useContext(MetamaskProviderContext);
51+
const { userAPIKey, userEncPublicKey } = useContext(MetamaskProviderContext);
5252
const [currentLang, setCurrentLang] = useState(langOptions[0]);
5353
const exampleRequest = useMemo(() => {
5454
const preparedParams = JSON.stringify(paramsData, null, 2);
@@ -77,15 +77,17 @@ export default function RequestBox({
7777
return false
7878
}, [response, defExampleResponse]);
7979

80-
const methodsWithRequiredWalletConnection = ["eth_accounts", "eth_sendTransaction", "personal_sign", "eth_signTypedData_v4"];
80+
const methodsWithRequiredWalletConnection = ["eth_accounts", "eth_sendTransaction", "personal_sign", "eth_signTypedData_v4", "eth_getEncryptionPublicKey"];
8181
const isRunAndCustomizeRequestDisabled = isMetamaskNetwork && methodsWithRequiredWalletConnection.includes(method) ?
8282
!isMetamaskInstalled :
8383
false;
8484

85+
const isMetamaskDecryptDisabled = isMetamaskNetwork && !userEncPublicKey && method === "eth_decrypt";
86+
8587
const runRequestButton = (
8688
<button
8789
className={clsx(global.primaryBtn, styles.runBtnWrap)}
88-
disabled={isRunAndCustomizeRequestDisabled || isLoading}
90+
disabled={isRunAndCustomizeRequestDisabled || isLoading || isMetamaskDecryptDisabled}
8991
onClick={submitRequest}
9092
data-test-id="run-request"
9193
>
@@ -123,16 +125,20 @@ export default function RequestBox({
123125
{params.length > 0 && (
124126
<button
125127
className={clsx(global.linkBtn, "margin-right--md")}
126-
disabled={isRunAndCustomizeRequestDisabled}
128+
disabled={isRunAndCustomizeRequestDisabled || isMetamaskDecryptDisabled}
127129
onClick={openModal}
128130
data-test-id="customize-request"
129131
>
130132
Customize request
131133
</button>
132134
)}
133135
{
134-
isRunAndCustomizeRequestDisabled ?
135-
(<Tooltip message="Before you can run or customize this request, please connect your MetaMask wallet first.">
136+
isRunAndCustomizeRequestDisabled || isMetamaskDecryptDisabled ?
137+
(<Tooltip message={
138+
isMetamaskDecryptDisabled
139+
? "Please connect your MetaMask wallet first and run eth_getEncryptionPublicKey"
140+
: "Before you can run or customize this request, please connect your MetaMask wallet first."
141+
}>
136142
{runRequestButton}
137143
</Tooltip>) :
138144
runRequestButton

src/components/ParserOpenRPC/index.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import { MetamaskProviderContext } from "@site/src/theme/Root";
2525
import ProjectsBox from "@site/src/components/ParserOpenRPC/ProjectsBox";
2626
import { LINEA_REQUEST_URL } from "@site/src/lib/constants";
2727
import useIsBrowser from '@docusaurus/useIsBrowser';
28+
import { encrypt } from '@metamask/eth-sig-util';
29+
import { hexlify } from 'ethers';
2830

2931
interface ParserProps {
3032
network: NETWORK_NAMES;
@@ -59,7 +61,7 @@ export default function ParserOpenRPC({
5961
const [isDrawerContentFixed, setIsDrawerContentFixed] = useState(false);
6062
const [drawerLabel, setDrawerLabel] = useState(null);
6163
const [isComplexTypeView, setIsComplexTypeView] = useState(false);
62-
const { metaMaskAccount, metaMaskProvider, userAPIKey } = useContext(MetamaskProviderContext);
64+
const { metaMaskAccount, metaMaskProvider, userAPIKey, userEncPublicKey, setUserEncPublicKey } = useContext(MetamaskProviderContext);
6365
const [defExampleResponse, setDefExampleResponse] = useState(undefined);
6466
const [isLoading, setIsLoading] = useState(false);
6567
const { colorMode } = useColorMode();
@@ -126,6 +128,21 @@ export default function ParserOpenRPC({
126128
"tags",
127129
);
128130

131+
if (!!userEncPublicKey && method === "eth_decrypt") {
132+
const encDefValue = hexlify(Buffer.from(JSON.stringify(
133+
encrypt({
134+
publicKey: userEncPublicKey,
135+
data: "Test message",
136+
version: 'x25519-xsalsa20-poly1305',
137+
}),
138+
)))
139+
currentMethod?.examples[0]?.params?.forEach(item => {
140+
if (item.name === "EncryptedMessage" && !!encDefValue) {
141+
item.value = encDefValue;
142+
};
143+
})
144+
}
145+
129146
return {
130147
description: currentMethod.description || null,
131148
summary: currentMethod.summary || null,
@@ -202,6 +219,9 @@ export default function ParserOpenRPC({
202219
});
203220
setReqResult(response);
204221
trackAnalyticsForRequest(response);
222+
if (method === "eth_getEncryptionPublicKey" && response) {
223+
setUserEncPublicKey(response as string)
224+
}
205225
} catch (e) {
206226
setReqResult(e);
207227
} finally {

src/theme/Root.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ interface IMetamaskProviderContext {
6565
userAPIKey?: string;
6666
setUserAPIKey?: (key: string) => void;
6767
fetchLineaEns?: (walletId: string) => Promise<void>;
68+
userEncPublicKey?: string;
69+
setUserEncPublicKey?: (key: string) => void;
6870
}
6971

7072
export const MetamaskProviderContext = createContext<IMetamaskProviderContext>({
@@ -90,6 +92,8 @@ export const MetamaskProviderContext = createContext<IMetamaskProviderContext>({
9092
userAPIKey: "",
9193
setUserAPIKey: () => {},
9294
fetchLineaEns: () => new Promise(() => {}),
95+
userEncPublicKey: undefined,
96+
setUserEncPublicKey: () => {},
9397
});
9498

9599
const sdk = new MetaMaskSDK({
@@ -122,6 +126,7 @@ export const LoginProvider = ({ children }) => {
122126
const [needsMfa, setNeedsMfa] = useState<boolean>(false);
123127
const [walletAuthUrl, setWalletAuthUrl] = useState<string>("");
124128
const [userAPIKey, setUserAPIKey] = useState("");
129+
const [userEncPublicKey, setUserEncPublicKey] = useState(undefined);
125130
const { siteConfig } = useDocusaurusContext();
126131
const { DASHBOARD_URL, GF_SURVEY_KEY, LINEA_ENS_URL } = siteConfig?.customFields || {};
127132

@@ -289,6 +294,8 @@ export const LoginProvider = ({ children }) => {
289294
userAPIKey,
290295
setUserAPIKey,
291296
fetchLineaEns,
297+
userEncPublicKey,
298+
setUserEncPublicKey,
292299
} as IMetamaskProviderContext
293300
}
294301
>

0 commit comments

Comments
 (0)