From e71a004cd15a394914c1df2c6f431ffcd5eb943b Mon Sep 17 00:00:00 2001 From: Jungho Bang Date: Wed, 28 Feb 2024 23:25:57 -0800 Subject: [PATCH] Revert "[WALL-31641] Fix invalid signature signing error for message signature verification (#119)" (#1125) This reverts commit 4fb000a81de468e95635464729ccff88329d75b2. --- apps/testapp/package.json | 4 +- .../ViemPublicClient/ViemClientContext.tsx | 37 ---- .../components/RpcMethods/RpcMethodCard.tsx | 42 ++-- .../RpcMethods/method/signMessageMethods.ts | 79 ++++--- .../RpcMethods/shortcut/ShortcutType.ts | 9 +- .../shortcut/signMessageShortcuts.ts | 2 +- apps/testapp/src/pages/index.tsx | 67 +++--- apps/testapp/tsconfig.json | 2 +- yarn.lock | 204 +++++++++--------- 9 files changed, 192 insertions(+), 254 deletions(-) delete mode 100644 apps/testapp/src/ViemPublicClient/ViemClientContext.tsx diff --git a/apps/testapp/package.json b/apps/testapp/package.json index 43d1f73d51..e1611a49db 100644 --- a/apps/testapp/package.json +++ b/apps/testapp/package.json @@ -13,12 +13,12 @@ "@coinbase/wallet-sdk": "workspace:^", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", + "@metamask/eth-sig-util": "^7.0.0", "framer-motion": "^10.13.1", "next": "^13.5.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-hook-form": "^7.45.2", - "viem": "^2.7.15" + "react-hook-form": "^7.45.2" }, "devDependencies": { "@types/react": "18.2.15" diff --git a/apps/testapp/src/ViemPublicClient/ViemClientContext.tsx b/apps/testapp/src/ViemPublicClient/ViemClientContext.tsx deleted file mode 100644 index 3c3679950e..0000000000 --- a/apps/testapp/src/ViemPublicClient/ViemClientContext.tsx +++ /dev/null @@ -1,37 +0,0 @@ -// ViemClientContext.tsx -import React, { createContext, useContext, useMemo } from 'react'; -import { createPublicClient, extractChain, http } from 'viem'; -import * as allViemChains from 'viem/chains'; - -// Define the context shape -export interface ViemClientContextType { - client: ReturnType | null; -} - -const ViemClientContext = createContext(undefined); - -export const ViemClientProvider = ({ children, provider }) => { - const chain = useMemo( - () => extractChain({ chains: Object.values(allViemChains), id: provider?.chainId }), - [provider?.chainId] - ); - - const client = useMemo(() => { - const newClient = createPublicClient({ - chain, - transport: http(), - }); - return newClient; - }, [chain.id]); // update the client when chain changes - - return {children}; -}; - -// Hook to use the client -export const useViemPublicClient = () => { - const context = useContext(ViemClientContext); - if (context === undefined) { - throw new Error('useViemPublicClient must be used within a ViemClientProvider'); - } - return context.client; -}; diff --git a/apps/testapp/src/components/RpcMethods/RpcMethodCard.tsx b/apps/testapp/src/components/RpcMethods/RpcMethodCard.tsx index 28323ef38d..dc7979da63 100644 --- a/apps/testapp/src/components/RpcMethods/RpcMethodCard.tsx +++ b/apps/testapp/src/components/RpcMethods/RpcMethodCard.tsx @@ -18,22 +18,20 @@ import { InputLeftAddon, VStack, } from '@chakra-ui/react'; -import React, { useCallback, useState } from 'react'; +import React, { useCallback } from 'react'; import { useForm } from 'react-hook-form'; import { useCBWSDK } from '../../context/CBWSDKReactContextProvider'; -import { useViemPublicClient } from '../../ViemPublicClient/ViemClientContext'; import { verifySignMsg } from './method/signMessageMethods'; import { ADDR_TO_FILL } from './shortcut/const'; type ResponseType = string; export function RpcMethodCard({ format, method, params, shortcuts }) { - const [response, setResponse] = useState(null); - const [verifyResult, setVerifyResult] = useState(null); - const [error, setError] = useState | string | number | null>(null); + const [response, setResponse] = React.useState(null); + const [verifyResult, setVerifyResult] = React.useState(null); + const [error, setError] = React.useState | string | number | null>(null); const { provider } = useCBWSDK(); - const viemPublicClient = useViemPublicClient(); const { handleSubmit, @@ -41,26 +39,18 @@ export function RpcMethodCard({ format, method, params, shortcuts }) { formState: { errors }, } = useForm(); - const verify = useCallback( - async (response: ResponseType, data: Record) => { - if (!viemPublicClient) { - throw new Error('ViemPublicClient not found'); - } - const verifyResult = await verifySignMsg({ - method, - from: data.address?.toLowerCase(), - sign: response, - message: data.message, - viemPublicClient, - }); - - if (verifyResult) { - setVerifyResult(verifyResult); - return; - } - }, - [viemPublicClient] - ); + const verify = useCallback(async (response: ResponseType, data: Record) => { + const verifyResult = verifySignMsg({ + method, + from: data.address?.toLowerCase(), + sign: response, + message: data.message, + }); + if (verifyResult) { + setVerifyResult(verifyResult); + return; + } + }, []); const submit = useCallback( async (data: Record) => { diff --git a/apps/testapp/src/components/RpcMethods/method/signMessageMethods.ts b/apps/testapp/src/components/RpcMethods/method/signMessageMethods.ts index 9353538ed5..3379b9894f 100644 --- a/apps/testapp/src/components/RpcMethods/method/signMessageMethods.ts +++ b/apps/testapp/src/components/RpcMethods/method/signMessageMethods.ts @@ -1,4 +1,11 @@ -import { PublicClient } from 'viem/_types/clients/createPublicClient'; +import { + MessageTypes, + recoverPersonalSignature, + recoverTypedSignature, + SignTypedDataVersion, + TypedDataV1, + TypedMessage, +} from '@metamask/eth-sig-util'; import { parseMessage } from '../shortcut/ShortcutType'; import { RpcRequestInput } from './RpcRequestInput'; @@ -21,7 +28,10 @@ const personalSign: RpcRequestInput = { { key: 'message', required: true }, { key: 'address', required: true }, ], - format: (data: Record) => [data.message, data.address], + format: (data: Record) => [ + `0x${Buffer.from(data.message, 'utf8').toString('hex')}`, + data.address, + ], }; const ethSignTypedDataV1: RpcRequestInput = { @@ -59,79 +69,64 @@ export const signMessageMethods = [ ethSignTypedDataV4, ]; -export const verifySignMsg = async ({ +export const verifySignMsg = ({ method, from, sign, message, - viemPublicClient, }: { method: string; from: string; sign: string; message: unknown; - viemPublicClient: PublicClient; }) => { switch (method) { case 'personal_sign': { - const valid = await viemPublicClient.verifyMessage({ - address: from, - message, + const msg = `0x${Buffer.from(message as string, 'utf8').toString('hex')}`; + const recoveredAddr = recoverPersonalSignature({ + data: msg, signature: sign, }); - - if (valid) { - return `ViemPublicClient Successfully verified signer: ${from}`; + if (recoveredAddr === from) { + return `SigUtil Successfully verified signer as ${recoveredAddr}`; } else { - return `ViemPublicClient Failed to verify signer: ${from}`; + return `SigUtil Failed to verify signer when comparing ${recoveredAddr} to ${from}`; } } case 'eth_signTypedData_v1': { - const valid = await viemPublicClient.verifyTypedData({ - address: from, - domain: message.domain, - types: message.types, - primaryType: message.primaryType, - message: message.message, + const recoveredAddr = recoverTypedSignature({ + data: message as TypedDataV1, signature: sign, + version: SignTypedDataVersion.V1, }); - - if (valid) { - return `ViemPublicClient Successfully verified signer: ${from}`; + if (recoveredAddr === from) { + return `SigUtil Successfully verified signer as ${recoveredAddr}`; } else { - return `ViemPublicClient Failed to verify signer: ${from}`; + return `SigUtil Failed to verify signer when comparing ${recoveredAddr} to ${from}`; } } case 'eth_signTypedData_v3': { - const valid = await viemPublicClient.verifyTypedData({ - address: from, - domain: message.domain, - types: message.types, - primaryType: message.primaryType, - message: message.message, + const recoveredAddr = recoverTypedSignature({ + data: message as TypedMessage, signature: sign, + version: SignTypedDataVersion.V3, }); - - if (valid) { - return `ViemPublicClient Successfully verified signer: ${from}`; + if (recoveredAddr === from) { + return `SigUtil Successfully verified signer as ${recoveredAddr}`; } else { - return `ViemPublicClient Failed to verify signer: ${from}`; + return `SigUtil Failed to verify signer when comparing ${recoveredAddr} to ${from}`; } } case 'eth_signTypedData_v4': { - const valid = await viemPublicClient.verifyTypedData({ - address: from, - domain: message.domain, - types: message.types, - primaryType: message.primaryType, - message: message.message, + const recoveredAddr = recoverTypedSignature({ + data: message as TypedMessage, signature: sign, + version: SignTypedDataVersion.V4, }); - - if (valid) { - return `ViemPublicClient Successfully verified signer: ${from}`; + if (recoveredAddr === from) { + return `SigUtil Successfully verified signer as ${recoveredAddr}`; } else { - return `ViemPublicClient Failed to verify signer: ${from}`; + return `SigUtil Failed to verify signer when comparing ${recoveredAddr} to ${from}`; } } default: diff --git a/apps/testapp/src/components/RpcMethods/shortcut/ShortcutType.ts b/apps/testapp/src/components/RpcMethods/shortcut/ShortcutType.ts index 03bd9d28d7..7f836188c8 100644 --- a/apps/testapp/src/components/RpcMethods/shortcut/ShortcutType.ts +++ b/apps/testapp/src/components/RpcMethods/shortcut/ShortcutType.ts @@ -1,10 +1,13 @@ -import { SignTypedDataReturnType } from 'viem'; +import { MessageTypes, TypedDataV1, TypedMessage } from '@metamask/eth-sig-util'; + +type messageType = TypedDataV1 | TypedMessage; + export type ShortcutType = { key: string; - data: Record | any; + data: Record; }; -export const parseMessage = (message: string | SignTypedDataReturnType) => { +export const parseMessage = (message: string | messageType) => { if (typeof message === 'string') { return JSON.parse(message); } diff --git a/apps/testapp/src/components/RpcMethods/shortcut/signMessageShortcuts.ts b/apps/testapp/src/components/RpcMethods/shortcut/signMessageShortcuts.ts index 3f30b421c7..03646a6349 100644 --- a/apps/testapp/src/components/RpcMethods/shortcut/signMessageShortcuts.ts +++ b/apps/testapp/src/components/RpcMethods/shortcut/signMessageShortcuts.ts @@ -27,7 +27,7 @@ const ethSignTypedDataV1Shortcuts: ShortcutType[] = [ }, ]; -const ethSignTypedDataV3Shortcuts: (chainId: number) => ShortcutType[] = (chainId: number) => [ +const ethSignTypedDataV3Shortcuts: (chainId) => ShortcutType[] = (chainId: number) => [ { key: EXAMPLE_MESSAGE, data: { diff --git a/apps/testapp/src/pages/index.tsx b/apps/testapp/src/pages/index.tsx index b74ebd0ac6..14efe9deeb 100644 --- a/apps/testapp/src/pages/index.tsx +++ b/apps/testapp/src/pages/index.tsx @@ -1,4 +1,4 @@ -import { Box, Container, Grid, GridItem, Heading, Text } from '@chakra-ui/react'; +import { Box, Container, Grid, GridItem, Heading } from '@chakra-ui/react'; import React, { useEffect } from 'react'; import { EventListenersCard } from '../components/EventListeners/EventListenersCard'; @@ -16,7 +16,6 @@ import { sendShortcutsMap } from '../components/RpcMethods/shortcut/sendShortcut import { ShortcutType } from '../components/RpcMethods/shortcut/ShortcutType'; import { signMessageShortcutsMap } from '../components/RpcMethods/shortcut/signMessageShortcuts'; import { useCBWSDK } from '../context/CBWSDKReactContextProvider'; -import { ViemClientProvider } from '../ViemPublicClient/ViemClientContext'; export default function Home() { const { provider } = useCBWSDK(); @@ -30,42 +29,36 @@ export default function Home() { }); }, [provider]); - if (!provider) { - return Loading...; - } - return ( - - - - Event Listeners - - - - - - {connected && ( - <> - - - - - - )} - - + + + Event Listeners + + + + + + {connected && ( + <> + + + + + + )} + ); } diff --git a/apps/testapp/tsconfig.json b/apps/testapp/tsconfig.json index c383508f85..4c21d038a1 100644 --- a/apps/testapp/tsconfig.json +++ b/apps/testapp/tsconfig.json @@ -7,7 +7,7 @@ ], "allowJs": true, "skipLibCheck": true, - "strict": true, + "strict": false, "forceConsistentCasingInFileNames": true, "noEmit": true, "incremental": true, diff --git a/yarn.lock b/yarn.lock index c948ae89e2..71a540516b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,13 +19,6 @@ __metadata: languageName: node linkType: hard -"@adraffy/ens-normalize@npm:1.10.0": - version: 1.10.0 - resolution: "@adraffy/ens-normalize@npm:1.10.0" - checksum: af0540f963a2632da2bbc37e36ea6593dcfc607b937857133791781e246d47f870d5e3d21fa70d5cfe94e772c284588c81ea3f5b7f4ea8fbb824369444e4dbcb - languageName: node - linkType: hard - "@ampproject/remapping@npm:^2.2.0": version: 2.2.1 resolution: "@ampproject/remapping@npm:2.2.1" @@ -2790,13 +2783,13 @@ __metadata: "@coinbase/wallet-sdk": "workspace:^" "@emotion/react": ^11.11.1 "@emotion/styled": ^11.11.0 + "@metamask/eth-sig-util": ^7.0.0 "@types/react": 18.2.15 framer-motion: ^10.13.1 next: ^13.5.0 react: ^18.2.0 react-dom: ^18.2.0 react-hook-form: ^7.45.2 - viem: ^2.7.15 languageName: unknown linkType: soft @@ -3071,7 +3064,7 @@ __metadata: languageName: node linkType: hard -"@ethereumjs/tx@npm:^4.1.2": +"@ethereumjs/tx@npm:^4.1.2, @ethereumjs/tx@npm:^4.2.0": version: 4.2.0 resolution: "@ethereumjs/tx@npm:4.2.0" dependencies: @@ -3481,6 +3474,16 @@ __metadata: languageName: node linkType: hard +"@metamask/abi-utils@npm:^2.0.2": + version: 2.0.2 + resolution: "@metamask/abi-utils@npm:2.0.2" + dependencies: + "@metamask/utils": ^8.0.0 + superstruct: ^1.0.3 + checksum: 5ec153e7691a4e1dc8738a0ba1a99a354ddb13851fa88a40a19f002f6308310e71c2cee28c3a25d9f7f67e839c7dffe4760e93e308dd17fa725b08d0dc73a3d4 + languageName: node + linkType: hard + "@metamask/eth-json-rpc-provider@npm:^1.0.0": version: 1.0.1 resolution: "@metamask/eth-json-rpc-provider@npm:1.0.1" @@ -3492,6 +3495,21 @@ __metadata: languageName: node linkType: hard +"@metamask/eth-sig-util@npm:^7.0.0": + version: 7.0.0 + resolution: "@metamask/eth-sig-util@npm:7.0.0" + dependencies: + "@ethereumjs/util": ^8.1.0 + "@metamask/abi-utils": ^2.0.2 + "@metamask/utils": ^8.1.0 + ethereum-cryptography: ^2.1.2 + ethjs-util: ^0.1.6 + tweetnacl: ^1.0.3 + tweetnacl-util: ^0.15.1 + checksum: bcb6bd23333e0b4dcb49f8772483dcb4c27e75405a2b111f1eafe0b341b221cf86ba4843e91c567d8836e80b6049d8e2f89c6766c62bbd256533e0f256f6d846 + languageName: node + linkType: hard + "@metamask/json-rpc-engine@npm:^7.0.0": version: 7.0.0 resolution: "@metamask/json-rpc-engine@npm:7.0.0" @@ -3540,6 +3558,22 @@ __metadata: languageName: node linkType: hard +"@metamask/utils@npm:^8.0.0, @metamask/utils@npm:^8.1.0": + version: 8.2.1 + resolution: "@metamask/utils@npm:8.2.1" + dependencies: + "@ethereumjs/tx": ^4.2.0 + "@noble/hashes": ^1.3.1 + "@scure/base": ^1.1.3 + "@types/debug": ^4.1.7 + debug: ^4.3.4 + pony-cause: ^2.1.10 + semver: ^7.5.4 + superstruct: ^1.0.3 + checksum: 36a714a17e4949d2040bedb28d4373a22e7e86bb797aa2d59223f9799fd76e662443bcede113719c4e200f5e9d90a9d62feafad5028fff8b9a7a85fface097ca + languageName: node + linkType: hard + "@next/env@npm:13.5.6": version: 13.5.6 resolution: "@next/env@npm:13.5.6" @@ -3628,15 +3662,6 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0": - version: 1.2.0 - resolution: "@noble/curves@npm:1.2.0" - dependencies: - "@noble/hashes": 1.3.2 - checksum: bb798d7a66d8e43789e93bc3c2ddff91a1e19fdb79a99b86cd98f1e5eff0ee2024a2672902c2576ef3577b6f282f3b5c778bebd55761ddbb30e36bf275e83dd0 - languageName: node - linkType: hard - "@noble/hashes@npm:1.3.1, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.1": version: 1.3.1 resolution: "@noble/hashes@npm:1.3.1" @@ -3644,20 +3669,13 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.3.2": +"@noble/hashes@npm:^1.3.1": version: 1.3.2 resolution: "@noble/hashes@npm:1.3.2" checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 languageName: node linkType: hard -"@noble/hashes@npm:~1.3.2": - version: 1.3.3 - resolution: "@noble/hashes@npm:1.3.3" - checksum: 8a6496d1c0c64797339bc694ad06cdfaa0f9e56cd0c3f68ae3666cfb153a791a55deb0af9c653c7ed2db64d537aa3e3054629740d2f2338bb1dcb7ab60cd205b - languageName: node - linkType: hard - "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -3755,6 +3773,13 @@ __metadata: languageName: node linkType: hard +"@scure/base@npm:^1.1.3": + version: 1.1.3 + resolution: "@scure/base@npm:1.1.3" + checksum: 1606ab8a4db898cb3a1ada16c15437c3bce4e25854fadc8eb03ae93cbbbac1ed90655af4b0be3da37e12056fef11c0374499f69b9e658c9e5b7b3e06353c630c + languageName: node + linkType: hard + "@scure/base@npm:~1.1.0": version: 1.1.1 resolution: "@scure/base@npm:1.1.1" @@ -3762,13 +3787,6 @@ __metadata: languageName: node linkType: hard -"@scure/base@npm:~1.1.2": - version: 1.1.5 - resolution: "@scure/base@npm:1.1.5" - checksum: 9e9ee6088cb3aa0fb91f5a48497d26682c7829df3019b1251d088d166d7a8c0f941c68aaa8e7b96bbad20c71eb210397cb1099062cde3e29d4bad6b975c18519 - languageName: node - linkType: hard - "@scure/bip32@npm:1.3.1": version: 1.3.1 resolution: "@scure/bip32@npm:1.3.1" @@ -3780,17 +3798,6 @@ __metadata: languageName: node linkType: hard -"@scure/bip32@npm:1.3.2": - version: 1.3.2 - resolution: "@scure/bip32@npm:1.3.2" - dependencies: - "@noble/curves": ~1.2.0 - "@noble/hashes": ~1.3.2 - "@scure/base": ~1.1.2 - checksum: c5ae84fae43490853693b481531132b89e056d45c945fc8b92b9d032577f753dfd79c5a7bbcbf0a7f035951006ff0311b6cf7a389e26c9ec6335e42b20c53157 - languageName: node - linkType: hard - "@scure/bip39@npm:1.2.1": version: 1.2.1 resolution: "@scure/bip39@npm:1.2.1" @@ -4455,21 +4462,6 @@ __metadata: languageName: node linkType: hard -"abitype@npm:1.0.0": - version: 1.0.0 - resolution: "abitype@npm:1.0.0" - peerDependencies: - typescript: ">=5.0.4" - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - checksum: ea2c0548c3ba58c37a6de7483d63389074da498e63d803b742bbe94eb4eaa1f51a35d000c424058b2583aef56698cf07c696eb3bc4dd0303bc20c6f0826a241a - languageName: node - linkType: hard - "acorn-globals@npm:^6.0.0": version: 6.0.0 resolution: "acorn-globals@npm:6.0.0" @@ -6232,7 +6224,7 @@ __metadata: languageName: node linkType: hard -"ethereum-cryptography@npm:^2.0.0": +"ethereum-cryptography@npm:^2.0.0, ethereum-cryptography@npm:^2.1.2": version: 2.1.2 resolution: "ethereum-cryptography@npm:2.1.2" dependencies: @@ -6244,6 +6236,16 @@ __metadata: languageName: node linkType: hard +"ethjs-util@npm:^0.1.6": + version: 0.1.6 + resolution: "ethjs-util@npm:0.1.6" + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + checksum: 1f42959e78ec6f49889c49c8a98639e06f52a15966387dd39faf2930db48663d026efb7db2702dcffe7f2a99c4a0144b7ce784efdbf733f4077aae95de76d65f + languageName: node + linkType: hard + "eventemitter3@npm:^5.0.1": version: 5.0.1 resolution: "eventemitter3@npm:5.0.1" @@ -7182,6 +7184,13 @@ __metadata: languageName: node linkType: hard +"is-hex-prefixed@npm:1.0.0": + version: 1.0.0 + resolution: "is-hex-prefixed@npm:1.0.0" + checksum: 5ac58e6e528fb029cc43140f6eeb380fad23d0041cc23154b87f7c9a1b728bcf05909974e47248fd0b7fcc11ba33cf7e58d64804883056fabd23e2b898be41de + languageName: node + linkType: hard + "is-inside-container@npm:^1.0.0": version: 1.0.0 resolution: "is-inside-container@npm:1.0.0" @@ -7336,15 +7345,6 @@ __metadata: languageName: node linkType: hard -"isows@npm:1.0.3": - version: 1.0.3 - resolution: "isows@npm:1.0.3" - peerDependencies: - ws: "*" - checksum: 9cacd5cf59f67deb51e825580cd445ab1725ecb05a67c704050383fb772856f3cd5e7da8ad08f5a3bd2823680d77d099459d0c6a7037972a74d6429af61af440 - languageName: node - linkType: hard - "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.0 resolution: "istanbul-lib-coverage@npm:3.2.0" @@ -9091,6 +9091,13 @@ __metadata: languageName: node linkType: hard +"pony-cause@npm:^2.1.10": + version: 2.1.10 + resolution: "pony-cause@npm:2.1.10" + checksum: 8b61378f213e61056312dc274a1c79980154e9d864f6ad86e0c8b91a50d3ce900d430995ee24147c9f3caa440dfe7d51c274b488d7f033b65b206522536d7217 + languageName: node + linkType: hard + "postcss@npm:8.4.31": version: 8.4.31 resolution: "postcss@npm:8.4.31" @@ -10065,6 +10072,15 @@ __metadata: languageName: node linkType: hard +"strip-hex-prefix@npm:1.0.0": + version: 1.0.0 + resolution: "strip-hex-prefix@npm:1.0.0" + dependencies: + is-hex-prefixed: 1.0.0 + checksum: 4cafe7caee1d281d3694d14920fd5d3c11adf09371cef7e2ccedd5b83efd9e9bd2219b5d6ce6e809df6e0f437dc9d30db1192116580875698aad164a6d6b285b + languageName: node + linkType: hard + "strip-indent@npm:^3.0.0": version: 3.0.0 resolution: "strip-indent@npm:3.0.0" @@ -10425,6 +10441,20 @@ __metadata: languageName: node linkType: hard +"tweetnacl-util@npm:^0.15.1": + version: 0.15.1 + resolution: "tweetnacl-util@npm:0.15.1" + checksum: ae6aa8a52cdd21a95103a4cc10657d6a2040b36c7a6da7b9d3ab811c6750a2d5db77e8c36969e75fdee11f511aa2b91c552496c6e8e989b6e490e54aca2864fc + languageName: node + linkType: hard + +"tweetnacl@npm:^1.0.3": + version: 1.0.3 + resolution: "tweetnacl@npm:1.0.3" + checksum: e4a57cac188f0c53f24c7a33279e223618a2bfb5fea426231991652a13247bea06b081fd745d71291fcae0f4428d29beba1b984b1f1ce6f66b06a6d1ab90645c + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -10702,27 +10732,6 @@ __metadata: languageName: node linkType: hard -"viem@npm:^2.7.15": - version: 2.7.15 - resolution: "viem@npm:2.7.15" - dependencies: - "@adraffy/ens-normalize": 1.10.0 - "@noble/curves": 1.2.0 - "@noble/hashes": 1.3.2 - "@scure/bip32": 1.3.2 - "@scure/bip39": 1.2.1 - abitype: 1.0.0 - isows: 1.0.3 - ws: 8.13.0 - peerDependencies: - typescript: ">=5.0.4" - peerDependenciesMeta: - typescript: - optional: true - checksum: d0d3a9b48fcf64298c08d57dd782fdf6f21538c6472ebc87953928d860f5fd6296a7e22f46f230d68b667df6505fa472414cc3d8e7a041ea2a7f1fd45bc013de - languageName: node - linkType: hard - "w3c-hr-time@npm:^1.0.2": version: 1.0.2 resolution: "w3c-hr-time@npm:1.0.2" @@ -10901,21 +10910,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.13.0": - version: 8.13.0 - resolution: "ws@npm:8.13.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c - languageName: node - linkType: hard - "ws@npm:^7.4.6": version: 7.5.9 resolution: "ws@npm:7.5.9"