From 00323958ac47cb78b867fa447dc6a27c7923166e Mon Sep 17 00:00:00 2001 From: Miguel Angel Rojo Date: Mon, 18 Nov 2024 13:06:09 +0000 Subject: [PATCH] refactor: using only `viem` for EIP712 (#1516) * refactor: using viem for eip721 * refactor: using viem for eip721 * refactor: using viem for eip721 * refactor: using viem for eip721 * refactor: using viem for eip721 * refactor: using viem for eip721 * refactor: using viem for eip721 * fix: new slack version --- .github/workflows/unit-integration-test.yml | 4 +-- .../full-flow-delegator-private-key.ts | 2 +- .../transactions/full-flow-delegator-url.ts | 2 +- .../transactions/full-flow-no-delegator.ts | 2 +- docs/transactions.md | 12 ------- packages/aws-kms-adapter/package.json | 3 +- .../aws-kms-adapter/src/KMSVeChainSigner.ts | 18 +++++----- .../tests/KMSVeChainSigner.solo.test.ts | 1 + .../tests/KMSVeChainSigner.unit.test.ts | 6 ++-- packages/core/package.json | 2 +- packages/network/package.json | 2 +- .../eth_signTypedData_v4.ts | 5 +-- .../network/src/signer/signers/types.d.ts | 8 +++-- .../vechain-abstract-signer.ts | 12 ++++--- .../vechain-private-key-signer.ts | 18 +++++----- .../vechain-private-key-signer.unit.test.ts | 7 +++- yarn.lock | 34 ++++++++++++++----- 17 files changed, 80 insertions(+), 58 deletions(-) diff --git a/.github/workflows/unit-integration-test.yml b/.github/workflows/unit-integration-test.yml index b9e9f623c..c544f18a0 100644 --- a/.github/workflows/unit-integration-test.yml +++ b/.github/workflows/unit-integration-test.yml @@ -76,6 +76,8 @@ jobs: if: always() && github.ref == 'refs/heads/main' && (steps.unit-test.outcome == 'failure') uses: slackapi/slack-github-action@v2.0.0 with: + webhook: ${{ secrets.SLACK_WEBHOOK_URL }} + webhook-type: webhook-trigger payload: | { "source": "GitHub", @@ -83,7 +85,5 @@ jobs: "branch": "${{ github.head_ref || github.ref_name }}", "message": "unit tests failed, see run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" } - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} \ No newline at end of file diff --git a/docs/examples/transactions/full-flow-delegator-private-key.ts b/docs/examples/transactions/full-flow-delegator-private-key.ts index 5b470fb17..189b0ce96 100644 --- a/docs/examples/transactions/full-flow-delegator-private-key.ts +++ b/docs/examples/transactions/full-flow-delegator-private-key.ts @@ -12,7 +12,7 @@ import { THOR_SOLO_URL, ThorClient, VeChainProvider -} from '@vechain/sdk-network'; // START_SNIPPET: FullFlowDelegatorPrivateKeySnippet +} from '@vechain/sdk-network'; import { expect } from 'expect'; // START_SNIPPET: FullFlowDelegatorPrivateKeySnippet diff --git a/docs/examples/transactions/full-flow-delegator-url.ts b/docs/examples/transactions/full-flow-delegator-url.ts index a61aaab07..71822faff 100644 --- a/docs/examples/transactions/full-flow-delegator-url.ts +++ b/docs/examples/transactions/full-flow-delegator-url.ts @@ -12,7 +12,7 @@ import { TESTNET_URL, ThorClient, VeChainProvider -} from '@vechain/sdk-network'; // START_SNIPPET: FullFlowDelegatorUrlSnippet +} from '@vechain/sdk-network'; import { expect } from 'expect'; // START_SNIPPET: FullFlowDelegatorUrlSnippet diff --git a/docs/examples/transactions/full-flow-no-delegator.ts b/docs/examples/transactions/full-flow-no-delegator.ts index ca952d8fc..a1f58b25d 100644 --- a/docs/examples/transactions/full-flow-no-delegator.ts +++ b/docs/examples/transactions/full-flow-no-delegator.ts @@ -12,7 +12,7 @@ import { THOR_SOLO_URL, ThorClient, VeChainProvider -} from '@vechain/sdk-network'; // START_SNIPPET: FullFlowNoDelegatorSnippet +} from '@vechain/sdk-network'; import { expect } from 'expect'; // START_SNIPPET: FullFlowNoDelegatorSnippet diff --git a/docs/transactions.md b/docs/transactions.md index 3905253d7..2a50bfae4 100644 --- a/docs/transactions.md +++ b/docs/transactions.md @@ -370,10 +370,6 @@ In the following complete examples, we will explore the entire lifecycle of a Ve 1. **No Delegation (Signing Only with an Origin Private Key)**: In this scenario, we'll demonstrate the basic process of creating a transaction, signing it with the origin private key, and sending it to the VeChainThor blockchain without involving fee delegation. ```typescript { name=full-flow-no-delegator, category=example } -import { expect } from 'expect'; - -// START_SNIPPET: FullFlowNoDelegatorSnippet - // 1 - Create the thor client const thorSoloClient = ThorClient.at(THOR_SOLO_URL, { isPollingEnabled: false @@ -456,10 +452,6 @@ const txReceipt = await thorSoloClient.transactions.waitForTransaction( 2. **Delegation with Private Key**: Here, we'll extend the previous example by incorporating fee delegation. The transaction sender will delegate the transaction fee payment to another entity (delegator), and we'll guide you through the steps of building, signing, and sending such a transaction. ```typescript { name=full-flow-delegator-private-key, category=example } -import { expect } from 'expect'; - -// START_SNIPPET: FullFlowDelegatorPrivateKeySnippet - // 1 - Create the thor client const thorSoloClient = ThorClient.at(THOR_SOLO_URL, { isPollingEnabled: false @@ -561,10 +553,6 @@ const txReceipt = await thorSoloClient.transactions.waitForTransaction( 3. **Delegation with URL**: This example will showcase the use of a delegation URL for fee delegation. The sender will specify a delegation URL in the `signTransaction` options, allowing a designated sponsor to pay the transaction fee. We'll cover the full process, from building clauses to verifying the transaction on-chain. ```typescript { name=full-flow-delegator-url, category=example } -import { expect } from 'expect'; - -// START_SNIPPET: FullFlowDelegatorUrlSnippet - // 1 - Create the thor client const thorClient = ThorClient.at(TESTNET_URL, { isPollingEnabled: false diff --git a/packages/aws-kms-adapter/package.json b/packages/aws-kms-adapter/package.json index 4cc46c412..da3b81a69 100644 --- a/packages/aws-kms-adapter/package.json +++ b/packages/aws-kms-adapter/package.json @@ -44,7 +44,6 @@ "@vechain/sdk-errors": "1.0.0-rc.2", "@vechain/sdk-network": "1.0.0-rc.2", "asn1js": "^3.0.5", - "ethers": "6.13.4", - "viem": "^2.21.19" + "viem": "^2.21.45" } } \ No newline at end of file diff --git a/packages/aws-kms-adapter/src/KMSVeChainSigner.ts b/packages/aws-kms-adapter/src/KMSVeChainSigner.ts index 1550009a0..84904c663 100644 --- a/packages/aws-kms-adapter/src/KMSVeChainSigner.ts +++ b/packages/aws-kms-adapter/src/KMSVeChainSigner.ts @@ -12,11 +12,12 @@ import { } from '@vechain/sdk-network'; import { BitString, ObjectIdentifier, Sequence, verifySchema } from 'asn1js'; import { + hashTypedData, + recoverPublicKey, + toHex, type TypedDataDomain, - TypedDataEncoder, - type TypedDataField -} from 'ethers'; -import { recoverPublicKey, toHex } from 'viem'; + type TypedDataParameter +} from 'viem'; import { KMSVeChainProvider } from './KMSVeChainProvider'; class KMSVeChainSigner extends VeChainAbstractSigner { @@ -388,12 +389,13 @@ class KMSVeChainSigner extends VeChainAbstractSigner { */ public async signTypedData( domain: TypedDataDomain, - types: Record, - value: Record + types: Record, + primaryType: string, + message: Record ): Promise { try { const payload = Hex.of( - TypedDataEncoder.hash(domain, types, value) + hashTypedData({ domain, types, primaryType, message }) ).bytes; return await this.signPayload(payload); @@ -401,7 +403,7 @@ class KMSVeChainSigner extends VeChainAbstractSigner { throw new SignerMethodError( 'KMSVeChainSigner.signTypedData', 'The typed data could not be signed.', - { domain, types, value }, + { domain, types, primaryType, message }, error ); } diff --git a/packages/aws-kms-adapter/tests/KMSVeChainSigner.solo.test.ts b/packages/aws-kms-adapter/tests/KMSVeChainSigner.solo.test.ts index 6833f896c..6ad998f5b 100644 --- a/packages/aws-kms-adapter/tests/KMSVeChainSigner.solo.test.ts +++ b/packages/aws-kms-adapter/tests/KMSVeChainSigner.solo.test.ts @@ -299,6 +299,7 @@ describe('KMSVeChainSigner - Thor Solo', () => { const signature = await signer.signTypedData( typedData.domain, typedData.types, + typedData.primaryType, typedData.data ); expect(signature).toBeDefined(); diff --git a/packages/aws-kms-adapter/tests/KMSVeChainSigner.unit.test.ts b/packages/aws-kms-adapter/tests/KMSVeChainSigner.unit.test.ts index d4f8ce2da..90b76fa91 100644 --- a/packages/aws-kms-adapter/tests/KMSVeChainSigner.unit.test.ts +++ b/packages/aws-kms-adapter/tests/KMSVeChainSigner.unit.test.ts @@ -5,7 +5,7 @@ import { type ThorClient, type TransactionRequestInput } from '@vechain/sdk-network'; -import { type TypedDataDomain, type TypedDataField } from 'ethers'; +import { type TypedDataDomain, type TypedDataParameter } from 'viem'; import { KMSVeChainProvider, KMSVeChainSigner } from '../src'; import { EIP712_CONTRACT, EIP712_FROM, EIP712_TO } from './fixture'; jest.mock('asn1js', () => ({ @@ -136,6 +136,7 @@ describe('KMSVeChainSigner', () => { } ] }, + 'Mail', { from: { name: 'Cow', @@ -159,7 +160,8 @@ describe('KMSVeChainSigner', () => { await expect( signer.signTypedData( {} as unknown as TypedDataDomain, - {} as unknown as Record, + {} as unknown as Record, + 'primaryType', {} as unknown as Record ) ).rejects.toThrow(SignerMethodError); diff --git a/packages/core/package.json b/packages/core/package.json index 6869c8ae9..56cd62a4d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -49,7 +49,7 @@ "abitype": "^1.0.6", "ethers": "6.13.4", "fast-json-stable-stringify": "^2.1.0", - "viem": "^2.21.19" + "viem": "^2.21.45" }, "devDependencies": { "bignumber.js": "^9.1.2", diff --git a/packages/network/package.json b/packages/network/package.json index 8de37267a..6222ae938 100644 --- a/packages/network/package.json +++ b/packages/network/package.json @@ -49,7 +49,7 @@ "abitype": "^1.0.6", "ethers": "6.13.4", "isomorphic-ws": "^5.0.0", - "viem": "^2.21.19", + "viem": "^2.21.45", "ws": "^8.18.0" }, "devDependencies": { diff --git a/packages/network/src/provider/utils/rpc-mapper/methods/eth_signTypedData_v4/eth_signTypedData_v4.ts b/packages/network/src/provider/utils/rpc-mapper/methods/eth_signTypedData_v4/eth_signTypedData_v4.ts index 2b0803d27..b8ff51365 100644 --- a/packages/network/src/provider/utils/rpc-mapper/methods/eth_signTypedData_v4/eth_signTypedData_v4.ts +++ b/packages/network/src/provider/utils/rpc-mapper/methods/eth_signTypedData_v4/eth_signTypedData_v4.ts @@ -4,7 +4,7 @@ import { JSONRPCInvalidParams, stringifyData } from '@vechain/sdk-errors'; -import type { TypedDataDomain, TypedDataField } from 'ethers'; +import type { TypedDataDomain, TypedDataParameter } from 'viem'; import type { VeChainSigner } from '../../../../../signer/signers'; import type { ThorClient } from '../../../../../thor-client'; import type { VeChainProvider } from '../../../../providers/vechain-provider'; @@ -61,7 +61,7 @@ const ethSignTypedDataV4 = async ( { primaryType: string; domain: TypedDataDomain; - types: Record; + types: Record; message: Record; } ]; @@ -74,6 +74,7 @@ const ethSignTypedDataV4 = async ( return await signer.signTypedData( typedData.domain, typedData.types, + typedData.primaryType, typedData.message ); } catch (error) { diff --git a/packages/network/src/signer/signers/types.d.ts b/packages/network/src/signer/signers/types.d.ts index 0548b9aba..a50175eee 100644 --- a/packages/network/src/signer/signers/types.d.ts +++ b/packages/network/src/signer/signers/types.d.ts @@ -4,6 +4,7 @@ import { type HardhatVeChainProvider, type VeChainProvider } from '../../provider'; +import { type TypedDataDomain, type TypedDataParameter } from 'viem'; /** * Available types for the VeChainProvider's @@ -358,9 +359,10 @@ interface VeChainSigner { * Signs the [[link-eip-712]] typed data. */ signTypedData: ( - domain: vechain_sdk_core_ethers.TypedDataDomain, - types: Record, - value: Record, + domain: TypedDataDomain, + types: Record, + primaryType: string, + message: Record, options?: SignTypedDataOptions ) => Promise; diff --git a/packages/network/src/signer/signers/vechain-abstract-signer/vechain-abstract-signer.ts b/packages/network/src/signer/signers/vechain-abstract-signer/vechain-abstract-signer.ts index 1ed0afe76..60a869861 100644 --- a/packages/network/src/signer/signers/vechain-abstract-signer/vechain-abstract-signer.ts +++ b/packages/network/src/signer/signers/vechain-abstract-signer/vechain-abstract-signer.ts @@ -8,7 +8,7 @@ import { type TransactionClause } from '@vechain/sdk-core'; import { InvalidDataType, JSONRPCInvalidParams } from '@vechain/sdk-errors'; -import { type TypedDataDomain, type TypedDataField } from 'ethers'; +import { type TypedDataDomain, type TypedDataParameter } from 'viem'; import { RPC_METHODS } from '../../../provider/utils/const/rpc-mapper/rpc-methods'; import { type TransactionSimulationResult } from '../../../thor-client'; import { vnsUtils } from '../../../utils'; @@ -336,15 +336,17 @@ abstract class VeChainAbstractSigner implements VeChainSigner { * Signs the [[link-eip-712]] typed data. * * @param {TypedDataDomain} domain - The domain parameters used for signing. - * @param {Record} types - The types used for signing. - * @param {Record} value - The message data to be signed. + * @param {Record} types - The types used for signing. + * @param {string} primaryType - The primary type used for signing. + * @param {Record} message - The message data to be signed. * * @return {Promise} - A promise that resolves with the signature string. */ abstract signTypedData( domain: TypedDataDomain, - types: Record, - value: Record, + types: Record, + primaryType: string, + message: Record, options?: SignTypedDataOptions ): Promise; diff --git a/packages/network/src/signer/signers/vechain-private-key-signer/vechain-private-key-signer.ts b/packages/network/src/signer/signers/vechain-private-key-signer/vechain-private-key-signer.ts index f950bdcb9..7e393c7ce 100644 --- a/packages/network/src/signer/signers/vechain-private-key-signer/vechain-private-key-signer.ts +++ b/packages/network/src/signer/signers/vechain-private-key-signer/vechain-private-key-signer.ts @@ -15,10 +15,10 @@ import { stringifyData } from '@vechain/sdk-errors'; import { + hashTypedData, type TypedDataDomain, - TypedDataEncoder, - type TypedDataField -} from 'ethers'; + type TypedDataParameter +} from 'viem'; import { RPC_METHODS } from '../../../provider/utils/const/rpc-mapper/rpc-methods'; import { DelegationHandler, @@ -198,20 +198,22 @@ class VeChainPrivateKeySigner extends VeChainAbstractSigner { * albeit Ethereum Name Services are not resolved because he resolution depends on **ethers** provider implementation. * * @param {TypedDataDomain} domain - The domain parameters used for signing. - * @param {Record} types - The types used for signing. - * @param {Record} value - The value data to be signed. + * @param {Record} types - The types used for signing. + * @param {string} primaryType - The primary type used for signing. + * @param {Record} message - The value data to be signed. * * @return {Promise} - A promise that resolves with the signature string. */ async signTypedData( domain: TypedDataDomain, - types: Record, - value: Record + types: Record, + primaryType: string, + message: Record ): Promise { return await new Promise((resolve, reject) => { try { const hash = Hex.of( - TypedDataEncoder.hash(domain, types, value) + hashTypedData({ domain, types, primaryType, message }) ).bytes; const sign = Secp256k1.sign( hash, diff --git a/packages/network/tests/signer/signers/vechain-private-key-signer/vechain-private-key-signer.unit.test.ts b/packages/network/tests/signer/signers/vechain-private-key-signer/vechain-private-key-signer.unit.test.ts index 65f8a65a2..922ab973e 100644 --- a/packages/network/tests/signer/signers/vechain-private-key-signer/vechain-private-key-signer.unit.test.ts +++ b/packages/network/tests/signer/signers/vechain-private-key-signer/vechain-private-key-signer.unit.test.ts @@ -22,6 +22,7 @@ import { populateCallTestCases, populateCallTestCasesAccount } from './fixture'; +import { InvalidAbiEncodingTypeError } from 'viem'; /** * VeChain base signer tests @@ -290,9 +291,10 @@ describe('VeChain base signer tests', () => { signer.signTypedData( eip712TestCases.invalid.domain, eip712TestCases.invalid.types, + eip712TestCases.invalid.primaryType, eip712TestCases.invalid.data ) - ).rejects.toThrowError(TypeError); + ).rejects.toThrowError(InvalidAbiEncodingTypeError); }); test('signTypedData - exception when parsing to hex', async () => { @@ -313,6 +315,7 @@ describe('VeChain base signer tests', () => { signer.signTypedData( eip712TestCases.valid.domain, eip712TestCases.valid.types, + eip712TestCases.valid.primaryType, eip712TestCases.valid.data ) ).rejects.toThrowError(expectedErrorString); @@ -321,6 +324,7 @@ describe('VeChain base signer tests', () => { signer.signTypedData( eip712TestCases.valid.domain, eip712TestCases.valid.types, + eip712TestCases.valid.primaryType, eip712TestCases.valid.data ) ).rejects.toThrowError('Error while signing typed data'); @@ -341,6 +345,7 @@ describe('VeChain base signer tests', () => { ).signTypedData( eip712TestCases.valid.domain, eip712TestCases.valid.types, + eip712TestCases.valid.primaryType, eip712TestCases.valid.data ); expect(actual).toBe(expected); diff --git a/yarn.lock b/yarn.lock index 52b37f267..f1ecdb184 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,9 +12,9 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== -"@adraffy/ens-normalize@1.11.0": +"@adraffy/ens-normalize@^1.10.1": version "1.11.0" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33" + resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33" integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== "@alloc/quick-lru@^5.2.0": @@ -3935,7 +3935,7 @@ "@noble/hashes" "~1.4.0" "@scure/base" "~1.1.6" -"@scure/bip32@1.5.0", "@scure/bip32@^1.4.0": +"@scure/bip32@1.5.0", "@scure/bip32@^1.4.0", "@scure/bip32@^1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.5.0.tgz#dd4a2e1b8a9da60e012e776d954c4186db6328e6" integrity sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw== @@ -8522,6 +8522,11 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== +eventemitter3@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -11634,6 +11639,19 @@ outvariant@^1.4.0, outvariant@^1.4.3: resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.3.tgz#221c1bfc093e8fec7075497e7799fdbf43d14873" integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== +ox@0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/ox/-/ox-0.1.2.tgz#0f791be2ccabeaf4928e6d423498fe1c8094e560" + integrity sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww== + dependencies: + "@adraffy/ens-normalize" "^1.10.1" + "@noble/curves" "^1.6.0" + "@noble/hashes" "^1.5.0" + "@scure/bip32" "^1.5.0" + "@scure/bip39" "^1.4.0" + abitype "^1.0.6" + eventemitter3 "5.0.1" + p-filter@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" @@ -14438,18 +14456,18 @@ vfile@^6.0.0: "@types/unist" "^3.0.0" vfile-message "^4.0.0" -viem@^2.21.19: - version "2.21.19" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.19.tgz#5e1a7efc45903d83306416ffa2e3a11ed23cd924" - integrity sha512-FdlkN+UI1IU5sYOmzvygkxsUNjDRD5YHht3gZFu2X9xFv6Z3h9pXq9ycrYQ3F17lNfb41O2Ot4/aqbUkwOv9dA== +viem@^2.21.45: + version "2.21.45" + resolved "https://registry.npmjs.org/viem/-/viem-2.21.45.tgz#7a445428d4909cc334f231ee916ede1b69190603" + integrity sha512-I+On/IiaObQdhDKWU5Rurh6nf3G7reVkAODG5ECIfjsrGQ3EPJnxirUPT4FNV6bWER5iphoG62/TidwuTSOA1A== dependencies: - "@adraffy/ens-normalize" "1.11.0" "@noble/curves" "1.6.0" "@noble/hashes" "1.5.0" "@scure/bip32" "1.5.0" "@scure/bip39" "1.4.0" abitype "1.0.6" isows "1.0.6" + ox "0.1.2" webauthn-p256 "0.0.10" ws "8.18.0"