diff --git a/package.json b/package.json index 78f6fc6f..03b7c6a3 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,8 @@ "dependencies": { "@ethereumjs/tx": "^4.1.2", "@metamask/eth-sig-util": "^5.1.0", - "@metamask/keyring-api": "^0.1.3", - "@metamask/snaps-controllers": "^0.35.2-flask.1", + "@metamask/keyring-api": "^0.2.1", + "@metamask/snaps-controllers": "^0.38.2-flask.1", "@metamask/utils": "^6.1.0", "@types/uuid": "^9.0.1", "superstruct": "^1.0.3", diff --git a/src/SnapKeyring.test.ts b/src/SnapKeyring.test.ts index 43cad9ff..1d014caf 100644 --- a/src/SnapKeyring.test.ts +++ b/src/SnapKeyring.test.ts @@ -1,5 +1,9 @@ import { TransactionFactory } from '@ethereumjs/tx'; -import { KeyringAccount } from '@metamask/keyring-api'; +import { + EthMethod, + EthAccountType, + InternalAccount, +} from '@metamask/keyring-api'; import { SnapController } from '@metamask/snaps-controllers'; import { KeyringState, SnapKeyring } from '.'; @@ -17,18 +21,16 @@ describe('SnapKeyring', () => { { id: 'b05d918a-b37c-497a-bb28-3d15c0d56b7a', address: '0xC728514Df8A7F9271f4B7a4dd2Aa6d2D723d3eE3', - name: 'Account 1', - options: null, - supportedMethods: ['personal_sign', 'eth_sendTransaction'], - type: 'eip155:eoa', + options: {}, + methods: [EthMethod.PersonalSign], + type: EthAccountType.Eoa, }, { id: '33c96b60-2237-488e-a7bb-233576f3d22f', address: '0x34b13912eAc00152bE0Cb409A301Ab8E55739e63', - name: 'Account 2', - options: null, - supportedMethods: ['eth_sendTransaction', 'eth_signTypedData'], - type: 'eip155:eoa', + options: {}, + methods: [EthMethod.SignTypedData], + type: EthAccountType.Eoa, }, ] as const; @@ -38,7 +40,8 @@ describe('SnapKeyring', () => { mockSnapController.handleRequest.mockResolvedValue(accounts); await keyring.handleKeyringSnapMessage(snapId, { method: 'createAccount', - params: { account: account as unknown as KeyringAccount }, + // @ts-expect-error Check https://github.com/ianstormtaylor/superstruct/issues/983 + params: { account: account as unknown as InternalAccount }, }); } }); @@ -48,7 +51,9 @@ describe('SnapKeyring', () => { const result = await keyring.handleKeyringSnapMessage(snapId, { method: 'listAccounts', }); - expect(result).toStrictEqual(accounts); + expect(result).toStrictEqual( + accounts.map((a) => a.address.toLowerCase()), + ); }); it('should fail if the method is not supported', async () => { @@ -60,7 +65,10 @@ describe('SnapKeyring', () => { }); it('should submit an async request and return the result', async () => { - mockSnapController.handleRequest.mockResolvedValue({ pending: true }); + mockSnapController.handleRequest.mockResolvedValue({ + pending: true, + redirect: 'https://mock-url.com', + }); const requestPromise = keyring.signPersonalMessage( accounts[0].address, 'hello', @@ -82,7 +90,9 @@ describe('SnapKeyring', () => { describe('getAccounts', () => { it('should return all account addresses', async () => { const addresses = await keyring.getAccounts(); - expect(addresses).toStrictEqual(accounts.map((a) => a.address)); + expect(addresses).toStrictEqual( + accounts.map((a) => a.address.toLowerCase()), + ); expect(mockSnapController.handleRequest).toHaveBeenCalledWith({ handler: 'onRpcRequest', origin: 'metamask', @@ -152,7 +162,7 @@ describe('SnapKeyring', () => { }); describe('signTransaction', () => { - it('should sign a transaction synchronously', async () => { + it('should sign a ethereum transaction synchronously', async () => { const mockTx = { data: '0x0', gasLimit: '0x26259fe', @@ -178,6 +188,43 @@ describe('SnapKeyring', () => { const signature = await keyring.signTransaction(accounts[0].address, tx); expect(signature).toStrictEqual(expectedSignedTx); }); + + it('should sign a transaction synchronously and return a userOperation', async () => { + const mockTx = { + data: '0x0', + gasLimit: '0x26259fe', + gasPrice: '0x1', + nonce: '0xfffffffe', + to: '0xccccccccccccd000000000000000000000000000', + value: '0x1869e', + chainId: '0x1', + type: '0x00', + }; + const mockSignedTx = { + userOp: { + sender: accounts[0].address, + nonce: '0x0', + initCode: '0x', + callData: '0x', + callGasLimit: '0x0', + verificationGasLimit: '0x2DC6C0', + preVerificationGas: '0x2DC6C0', + maxFeePerGas: '0x0', + maxPriorityFeePerGas: '0x3B9ACA00', + paymasterAndData: '0x', + signature: '0x', + }, + userOpHash: '0x0', + }; + const tx = TransactionFactory.fromTxData(mockTx); + const expectedSignedTx = mockSignedTx; + mockSnapController.handleRequest.mockResolvedValue({ + pending: false, + result: mockSignedTx, + }); + const signature = await keyring.signTransaction(accounts[0].address, tx); + expect(signature).toStrictEqual(expectedSignedTx); + }); }); describe('signPersonalMessage', () => { @@ -278,14 +325,18 @@ describe('SnapKeyring', () => { it('should remove an account', async () => { mockSnapController.handleRequest.mockResolvedValue(null); await keyring.removeAccount(accounts[0].address); - expect(await keyring.getAccounts()).toStrictEqual([accounts[1].address]); + expect(await keyring.getAccounts()).toStrictEqual([ + accounts[1].address.toLowerCase(), + ]); }); it('should remove the account and warn if snap fails', async () => { const spy = jest.spyOn(console, 'error').mockImplementation(); mockSnapController.handleRequest.mockRejectedValue('error'); await keyring.removeAccount(accounts[0].address); - expect(await keyring.getAccounts()).toStrictEqual([accounts[1].address]); + expect(await keyring.getAccounts()).toStrictEqual([ + accounts[1].address.toLowerCase(), + ]); expect(console.error).toHaveBeenCalledWith( 'Account "0xC728514Df8A7F9271f4B7a4dd2Aa6d2D723d3eE3" may not have been removed from snap "local:snap.mock":', 'error', diff --git a/src/SnapKeyring.ts b/src/SnapKeyring.ts index dd0bc940..13ecd8d7 100644 --- a/src/SnapKeyring.ts +++ b/src/SnapKeyring.ts @@ -1,13 +1,14 @@ import { TransactionFactory, TypedTransaction } from '@ethereumjs/tx'; import { TypedDataV1, TypedMessage } from '@metamask/eth-sig-util'; import { - KeyringSnapControllerClient, KeyringAccount, - KeyringAccountStruct, + KeyringSnapControllerClient, + InternalAccount, + InternalAccountStruct, } from '@metamask/keyring-api'; import { SnapController } from '@metamask/snaps-controllers'; import { Json } from '@metamask/utils'; -import EventEmitter from 'events'; +import { EventEmitter } from 'events'; import { assert, object, string, record, Infer } from 'superstruct'; import { v4 as uuid } from 'uuid'; @@ -19,7 +20,7 @@ import { strictMask, toJson, unique } from './util'; export const SNAP_KEYRING_TYPE = 'Snap Keyring'; export const KeyringStateStruct = object({ - addressToAccount: record(string(), KeyringAccountStruct), + addressToAccount: record(string(), InternalAccountStruct), addressToSnapId: record(string(), string()), }); @@ -35,7 +36,7 @@ export class SnapKeyring extends EventEmitter { #snapClient: KeyringSnapControllerClient; - #addressToAccount: CaseInsensitiveMap; + #addressToAccount: CaseInsensitiveMap; #addressToSnapId: CaseInsensitiveMap; @@ -75,6 +76,7 @@ export class SnapKeyring extends EventEmitter { // Don't call the snap back to list the accounts. The main use case for // this method is to allow the snap to verify if the keyring's state is // in sync with the snap's state. + // @ts-expect-error Check https://github.com/ianstormtaylor/superstruct/issues/983 return [...this.#addressToAccount.values()].filter( (account) => this.#addressToSnapId.get(account.address) === snapId, ); @@ -198,18 +200,22 @@ export class SnapKeyring extends EventEmitter { address: string, transaction: TypedTransaction, _opts = {}, - ): Promise { + ): Promise { const tx = toJson({ ...transaction.toJSON(), type: transaction.type, chainId: transaction.common.chainId().toString(), }); - const signedTx = await this.#submitRequest(address, 'eth_sendTransaction', [ address, tx, ]); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + if (signedTx?.userOp) { + return signedTx; + } return TransactionFactory.fromTxData(signedTx as any); } @@ -316,12 +322,45 @@ export class SnapKeyring extends EventEmitter { } /** - * Syncs all accounts for all snaps. + * List all accounts. + * + * @param sync - Whether to sync accounts with the snaps. + * @returns All accounts. + */ + async listAccounts(sync: boolean): Promise { + if (sync) { + await this.#syncAllSnapsAccounts(); + } + + return [...this.#addressToAccount.values()].map((account) => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const snapId = this.#addressToSnapId.get(account.address)!; + + return { + ...account, + address: account.address.toLowerCase(), + metadata: { + name: 'account', + snap: { + id: snapId, + enabled: true, + name: 'snap', + }, + keyring: { + type: this.type, + }, + }, + }; + }); + } + + /** + * Syncs all accounts from all snaps. * * @param extraSnapIds - Extra snap IDs to sync accounts for. */ async #syncAllSnapsAccounts(...extraSnapIds: string[]): Promise { - const snapIds = [...this.#addressToSnapId.values()].concat(extraSnapIds); + const snapIds = extraSnapIds.concat(...this.#addressToSnapId.values()); for (const snapId of unique(snapIds)) { try { await this.#syncSnapAccounts(snapId); @@ -364,7 +403,7 @@ export class SnapKeyring extends EventEmitter { * found. */ #resolveAddress(address: string): { - account: KeyringAccount; + account: InternalAccount; snapId: string; } { const account = this.#addressToAccount.get(address); @@ -398,7 +437,7 @@ export class SnapKeyring extends EventEmitter { * @returns All accounts associated with the given snap ID. */ #getAccountsBySnapId(snapId: string): KeyringAccount[] { - return Object.values(this.#addressToAccount).filter( + return [...this.#addressToAccount.values()].filter( (account) => this.#addressToSnapId.get(account.address) === snapId, ); } @@ -406,10 +445,14 @@ export class SnapKeyring extends EventEmitter { /** * Add an account to the internal maps. * - * @param account - The account to be added. + * @param snapAccount - The account to be added. * @param snapId - The snap ID of the account. */ - #addAccountToMaps(account: KeyringAccount, snapId: string): void { + #addAccountToMaps(snapAccount: KeyringAccount, snapId: string): void { + const account = { + ...snapAccount, + address: snapAccount.address.toLowerCase(), + }; this.#addressToAccount.set(account.address, account); this.#addressToSnapId.set(account.address, snapId); } @@ -419,7 +462,7 @@ export class SnapKeyring extends EventEmitter { * * @param account - The account to be removed. */ - #removeAccountFromMaps(account: KeyringAccount): void { + #removeAccountFromMaps(account: InternalAccount): void { this.#addressToAccount.delete(account.address); this.#addressToSnapId.delete(account.address); } diff --git a/yarn.lock b/yarn.lock index 576a1c66..ee944600 100644 --- a/yarn.lock +++ b/yarn.lock @@ -932,16 +932,16 @@ __metadata: languageName: node linkType: hard -"@metamask/approval-controller@npm:^3.0.0": - version: 3.4.0 - resolution: "@metamask/approval-controller@npm:3.4.0" +"@metamask/approval-controller@npm:^3.5.0, @metamask/approval-controller@npm:^3.5.1": + version: 3.5.1 + resolution: "@metamask/approval-controller@npm:3.5.1" dependencies: - "@metamask/base-controller": ^3.0.0 - "@metamask/utils": ^5.0.2 + "@metamask/base-controller": ^3.2.1 + "@metamask/utils": ^6.2.0 eth-rpc-errors: ^4.0.2 immer: ^9.0.6 nanoid: ^3.1.31 - checksum: 153136800fbd8cd50e2d6012740526c55e74e3f8e5aa99a05d5788e8bae04ede622608a1adf67dcf0986162e9e7d1d11b6f6f0df438904b65db7435b881c2e3f + checksum: 5d4d1425d44b3848b4486744472fb8eeb31ca9a70d58c6ca6e0603bcbba32f1c5dcd04a8fb2ab6b4bdbf2b4e3309f75387d7d345cd2aedee5e3d6b5d4af4dbad languageName: node linkType: hard @@ -959,28 +959,29 @@ __metadata: languageName: node linkType: hard -"@metamask/base-controller@npm:^3.0.0": - version: 3.0.0 - resolution: "@metamask/base-controller@npm:3.0.0" +"@metamask/base-controller@npm:^3.2.0, @metamask/base-controller@npm:^3.2.1": + version: 3.2.1 + resolution: "@metamask/base-controller@npm:3.2.1" dependencies: - "@metamask/utils": ^5.0.2 + "@metamask/utils": ^6.2.0 immer: ^9.0.6 - checksum: a0853d90b024466c4108531cbf4459bd2f66fa6e0b912e42bd27cdf54262411a5601117649b6061424475ffa6b9714c5199d686c21e4d07c3b7b1ee0b4c17caa + checksum: 73723a275ad2c8c6f9fcfcd69fd8b469bf8f4455fc572fc19ac9a8d76e5b65152cb111d95bfb9a4b9443298147e03a5f9778747dec2ca2203495ace54c97688c languageName: node linkType: hard -"@metamask/controller-utils@npm:^4.0.0": - version: 4.0.0 - resolution: "@metamask/controller-utils@npm:4.0.0" +"@metamask/controller-utils@npm:^4.3.2": + version: 4.3.2 + resolution: "@metamask/controller-utils@npm:4.3.2" dependencies: - "@metamask/utils": ^5.0.2 + "@metamask/eth-query": ^3.0.1 + "@metamask/utils": ^6.2.0 "@spruceid/siwe-parser": 1.1.3 eth-ens-namehash: ^2.0.8 eth-rpc-errors: ^4.0.2 ethereumjs-util: ^7.0.10 ethjs-unit: ^0.1.6 fast-deep-equal: ^3.1.3 - checksum: 3efdaf9b0c9f6d3bb633eeb926e78bedd637b0e042bb1e3974b9829e38456709a2f26d02405499934239351be8bff1854e267df8d0a522738d630bac0aadb732 + checksum: 0af7de11bee8cea81946c424d51e2f0a27f3deeebb491aed00262b2f76b4b1e16ff8fa129309944b3e16a6531b0d153dde6794011bf355234fdebb965261372e languageName: node linkType: hard @@ -1033,6 +1034,16 @@ __metadata: languageName: node linkType: hard +"@metamask/eth-query@npm:^3.0.1": + version: 3.0.1 + resolution: "@metamask/eth-query@npm:3.0.1" + dependencies: + json-rpc-random-id: ^1.0.0 + xtend: ^4.0.1 + checksum: b9a323dff67328eace7d54fc8b0bc4dd763bf15760870656cbd5aad5380d1ee4489fb5c59506290d5f77cf55e74e530ee97b52702a329f1090ec03a6158434b7 + languageName: node + linkType: hard + "@metamask/eth-sig-util@npm:^5.1.0": version: 5.1.0 resolution: "@metamask/eth-sig-util@npm:5.1.0" @@ -1059,8 +1070,8 @@ __metadata: "@metamask/eslint-config-nodejs": ^11.0.1 "@metamask/eslint-config-typescript": ^11.0.0 "@metamask/eth-sig-util": ^5.1.0 - "@metamask/keyring-api": ^0.1.3 - "@metamask/snaps-controllers": ^0.35.2-flask.1 + "@metamask/keyring-api": ^0.2.1 + "@metamask/snaps-controllers": ^0.38.2-flask.1 "@metamask/utils": ^6.1.0 "@types/jest": ^28.1.6 "@types/node": ^17.0.23 @@ -1089,9 +1100,9 @@ __metadata: languageName: unknown linkType: soft -"@metamask/key-tree@npm:^7.1.1": - version: 7.1.1 - resolution: "@metamask/key-tree@npm:7.1.1" +"@metamask/key-tree@npm:^9.0.0": + version: 9.0.0 + resolution: "@metamask/key-tree@npm:9.0.0" dependencies: "@metamask/scure-bip39": ^2.1.0 "@metamask/utils": ^6.0.1 @@ -1099,22 +1110,23 @@ __metadata: "@noble/hashes": ^1.0.0 "@noble/secp256k1": ^1.5.5 "@scure/base": ^1.0.0 - checksum: ddab7917e1214c51508f821a680f8e8819a8c866fd91244e0debf28464331dfcbf9a357e01716fc593cf00a8c71f95fd45ed4ff686ee6abc4c4061aed629537c + checksum: 5c81f07351ca59b37570d52edcc80d60424630b2a8403ed7149c3343c264878ac5d3fc0584a61635ea7ddda4a789295ded1247846606dc529d8e2fd42f6fc61a languageName: node linkType: hard -"@metamask/keyring-api@npm:^0.1.3": - version: 0.1.3 - resolution: "@metamask/keyring-api@npm:0.1.3" +"@metamask/keyring-api@npm:^0.2.1": + version: 0.2.1 + resolution: "@metamask/keyring-api@npm:0.2.1" dependencies: "@metamask/providers": ^11.0.0 - "@metamask/snaps-controllers": ^0.35.2-flask.1 - "@metamask/snaps-utils": ^0.35.2-flask.1 - "@metamask/utils": ^6.0.1 + "@metamask/rpc-methods": ^0.38.1-flask.1 + "@metamask/snaps-controllers": ^0.38.2-flask.1 + "@metamask/snaps-utils": ^0.38.2-flask.1 + "@metamask/utils": ^8.0.0 "@types/uuid": ^9.0.1 superstruct: ^1.0.3 uuid: ^9.0.0 - checksum: 2307b5162dbb66d82f7d8ab8e9f1c3a0ef581b915702187b6b8fa5d8e8533838d0539d6f35853ef4f25096f13c9dbf4505fadff247b73f6d489d9c904015d21c + checksum: 1501d361fa14023f2666575bbde44b37a6ad0fbf95e19d0f956dcbebb83c7fab854fa3b15cdd2c83970540db86bcc7f85d509db1a7cd21b7611579e0da6097c4 languageName: node linkType: hard @@ -1129,14 +1141,14 @@ __metadata: languageName: node linkType: hard -"@metamask/permission-controller@npm:^4.0.0": - version: 4.0.0 - resolution: "@metamask/permission-controller@npm:4.0.0" +"@metamask/permission-controller@npm:^4.1.0": + version: 4.1.1 + resolution: "@metamask/permission-controller@npm:4.1.1" dependencies: - "@metamask/approval-controller": ^3.0.0 - "@metamask/base-controller": ^3.0.0 - "@metamask/controller-utils": ^4.0.0 - "@metamask/utils": ^5.0.2 + "@metamask/approval-controller": ^3.5.1 + "@metamask/base-controller": ^3.2.1 + "@metamask/controller-utils": ^4.3.2 + "@metamask/utils": ^6.2.0 "@types/deep-freeze-strict": ^1.1.0 deep-freeze-strict: ^1.1.1 eth-rpc-errors: ^4.0.2 @@ -1144,8 +1156,8 @@ __metadata: json-rpc-engine: ^6.1.0 nanoid: ^3.1.31 peerDependencies: - "@metamask/approval-controller": ^3.0.0 - checksum: ac07f6180321f875df1ced0e0c60e872a32b334d5c04c280736ad5bf7c292cf07c97a2e9b49d24ed17145f302e83d24c46d5a4fc423e4a1c939b717c8fa653ec + "@metamask/approval-controller": ^3.5.1 + checksum: 45f94c805302256d54f4e25d7f15fd22ea8c9c8548cca4514babeccfe31cfef47ca79dacd5fc45013120a0ad22eaa0ded4b56d37bf59f4dc2712d58edcc0aaca languageName: node linkType: hard @@ -1178,21 +1190,39 @@ __metadata: languageName: node linkType: hard -"@metamask/rpc-methods@npm:^0.35.2-flask.1": - version: 0.35.2-flask.1 - resolution: "@metamask/rpc-methods@npm:0.35.2-flask.1" +"@metamask/providers@npm:^11.1.1": + version: 11.1.1 + resolution: "@metamask/providers@npm:11.1.1" + dependencies: + "@metamask/object-multiplex": ^1.1.0 + "@metamask/safe-event-emitter": ^3.0.0 + detect-browser: ^5.2.0 + eth-rpc-errors: ^4.0.2 + extension-port-stream: ^2.0.1 + fast-deep-equal: ^3.1.3 + is-stream: ^2.0.0 + json-rpc-engine: ^6.1.0 + json-rpc-middleware-stream: ^4.2.1 + pump: ^3.0.0 + webextension-polyfill: ^0.10.0 + checksum: ca0339e5219ef43bccdf1debbf610f5f06c95d879c7bba124463c4c6e6dd34fae30c0cdf673985d85d9326a87e94a6ee7ad5d29ef154dca85a0c672fdab152d1 + languageName: node + linkType: hard + +"@metamask/rpc-methods@npm:^0.38.1-flask.1": + version: 0.38.1-flask.1 + resolution: "@metamask/rpc-methods@npm:0.38.1-flask.1" dependencies: - "@metamask/key-tree": ^7.1.1 - "@metamask/permission-controller": ^4.0.0 - "@metamask/snaps-ui": ^0.35.2-flask.1 - "@metamask/snaps-utils": ^0.35.2-flask.1 + "@metamask/key-tree": ^9.0.0 + "@metamask/permission-controller": ^4.1.0 + "@metamask/snaps-ui": ^0.37.4-flask.1 + "@metamask/snaps-utils": ^0.38.2-flask.1 "@metamask/types": ^1.1.0 "@metamask/utils": ^6.0.1 "@noble/hashes": ^1.3.1 eth-rpc-errors: ^4.0.3 - nanoid: ^3.1.31 superstruct: ^1.0.3 - checksum: e949da37c7d3099c07fc3f110310a1f86dbfbdf0d3a84a584b697beb64dc4662ba93e843b7a28a41e41b6500128782a07a9884e14252ac98206b8ed58776034b + checksum: 49700a41a1340d36d484086a4f6ca0a3fea27f5f8119c9a9af9c2cd0aeecf7f603f6c89a2f122232c66a238e281023df82d4ad38c799da5a137ccfcf0bca6857 languageName: node linkType: hard @@ -1220,23 +1250,22 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-controllers@npm:^0.35.2-flask.1": - version: 0.35.2-flask.1 - resolution: "@metamask/snaps-controllers@npm:0.35.2-flask.1" +"@metamask/snaps-controllers@npm:^0.38.2-flask.1": + version: 0.38.2-flask.1 + resolution: "@metamask/snaps-controllers@npm:0.38.2-flask.1" dependencies: - "@metamask/approval-controller": ^3.0.0 - "@metamask/base-controller": ^3.0.0 + "@metamask/approval-controller": ^3.5.0 + "@metamask/base-controller": ^3.2.0 "@metamask/object-multiplex": ^1.2.0 - "@metamask/permission-controller": ^4.0.0 + "@metamask/permission-controller": ^4.1.0 "@metamask/post-message-stream": ^6.1.2 - "@metamask/rpc-methods": ^0.35.2-flask.1 - "@metamask/snaps-execution-environments": ^0.35.2-flask.1 + "@metamask/rpc-methods": ^0.38.1-flask.1 + "@metamask/snaps-execution-environments": ^0.38.2-flask.1 "@metamask/snaps-registry": ^1.2.1 - "@metamask/snaps-utils": ^0.35.2-flask.1 + "@metamask/snaps-utils": ^0.38.2-flask.1 "@metamask/utils": ^6.0.1 "@xstate/fsm": ^2.0.0 concat-stream: ^2.0.0 - cron-parser: ^4.5.0 eth-rpc-errors: ^4.0.3 gunzip-maybe: ^1.4.2 immer: ^9.0.6 @@ -1246,28 +1275,26 @@ __metadata: pump: ^3.0.0 readable-web-to-node-stream: ^3.0.2 tar-stream: ^2.2.0 - checksum: 8b20ed3176da02c2bb5be642db83912b484dd85a0e9cb36b2d4bca6a0058cd28d578c91c595f20bcc084c73e8802b289191ac41972bc17ae921010e1b05fd307 + checksum: 738044e70b079fd62195219aa68260b4afae4855826b8d7b94f53edad69d8befaf77c67c2a9dbf2363457223b0560652578eeea438150d37a56a4adcd89e6e43 languageName: node linkType: hard -"@metamask/snaps-execution-environments@npm:^0.35.2-flask.1": - version: 0.35.2-flask.1 - resolution: "@metamask/snaps-execution-environments@npm:0.35.2-flask.1" +"@metamask/snaps-execution-environments@npm:^0.38.2-flask.1": + version: 0.38.2-flask.1 + resolution: "@metamask/snaps-execution-environments@npm:0.38.2-flask.1" dependencies: "@metamask/object-multiplex": ^1.2.0 "@metamask/post-message-stream": ^6.1.2 - "@metamask/providers": ^11.0.0 - "@metamask/rpc-methods": ^0.35.2-flask.1 - "@metamask/snaps-utils": ^0.35.2-flask.1 + "@metamask/providers": ^11.1.1 + "@metamask/rpc-methods": ^0.38.1-flask.1 + "@metamask/snaps-utils": ^0.38.2-flask.1 "@metamask/utils": ^6.0.1 eth-rpc-errors: ^4.0.3 json-rpc-engine: ^6.1.0 nanoid: ^3.1.31 pump: ^3.0.0 - ses: ^0.18.1 - stream-browserify: ^3.0.0 superstruct: ^1.0.3 - checksum: b112a25a5cd5574fd84dcc7a62b9076d59d0182d52c37645d44477efcb67d18a4dd40bef3778dcbd67009fe3b261ffe0e247def112737a16bac5e86bf16081e7 + checksum: 68c1adcb8fe227c989c02ea5f7820f0d58b0e9442b21d0043e2f06a7ea3a6607a5e0bdde82aceecc12e265b27bd1e5a719fb4ec901f19adea3a37d5412ca8415 languageName: node linkType: hard @@ -1282,42 +1309,42 @@ __metadata: languageName: node linkType: hard -"@metamask/snaps-ui@npm:^0.35.2-flask.1": - version: 0.35.2-flask.1 - resolution: "@metamask/snaps-ui@npm:0.35.2-flask.1" +"@metamask/snaps-ui@npm:^0.37.4-flask.1": + version: 0.37.4-flask.1 + resolution: "@metamask/snaps-ui@npm:0.37.4-flask.1" dependencies: "@metamask/utils": ^6.0.1 superstruct: ^1.0.3 - checksum: fb272068e04a9d4e0458aecef4df4091a9d9d9c0c3580d40c211a710566eb5610252456f0eb99533379d6d919c0c4156dda1ae6233693723e9227e54a4c5ddbf + checksum: d4e0a3c5f82a6edbf7bc82280fab364b93787e7d9995854208dd4200e188f37691216928967a5b75e6be5ebfeb360e638af39ac0043f1bdddb0c2ff7a5cdbce5 languageName: node linkType: hard -"@metamask/snaps-utils@npm:^0.35.2-flask.1": - version: 0.35.2-flask.1 - resolution: "@metamask/snaps-utils@npm:0.35.2-flask.1" +"@metamask/snaps-utils@npm:^0.38.2-flask.1": + version: 0.38.2-flask.1 + resolution: "@metamask/snaps-utils@npm:0.38.2-flask.1" dependencies: "@babel/core": ^7.20.12 "@babel/types": ^7.18.7 - "@metamask/base-controller": ^3.0.0 - "@metamask/key-tree": ^7.1.1 - "@metamask/permission-controller": ^4.0.0 - "@metamask/providers": ^11.0.0 + "@metamask/base-controller": ^3.2.0 + "@metamask/key-tree": ^9.0.0 + "@metamask/permission-controller": ^4.1.0 "@metamask/snaps-registry": ^1.2.1 - "@metamask/snaps-ui": ^0.35.2-flask.1 + "@metamask/snaps-ui": ^0.37.4-flask.1 "@metamask/utils": ^6.0.1 "@noble/hashes": ^1.3.1 "@scure/base": ^1.1.1 + chalk: ^4.1.2 cron-parser: ^4.5.0 eth-rpc-errors: ^4.0.3 fast-deep-equal: ^3.1.3 fast-json-stable-stringify: ^2.1.0 is-svg: ^4.4.0 rfdc: ^1.3.0 - semver: ^7.3.7 - ses: ^0.18.1 + semver: ^7.5.4 + ses: ^0.18.7 superstruct: ^1.0.3 validate-npm-package-name: ^5.0.0 - checksum: 4a22bf42512e2bdc944042cb05ef8b8f733ce902c0f374f7d36e22344700a3d0674a48ddacbe096a7e253c24f7ba05cff7ff30a05d3e48a840b63cbeeb46f0ce + checksum: cb95a67a1267299aacb5b85b25a35dbfd14f68060198974cc1a26b9a2e7eff5acd13700b9100e3546dfc7e78ed937b06aecb5c4884c32ff77b2d28c77e7f97b6 languageName: node linkType: hard @@ -1328,7 +1355,7 @@ __metadata: languageName: node linkType: hard -"@metamask/utils@npm:^5.0.0, @metamask/utils@npm:^5.0.2": +"@metamask/utils@npm:^5.0.0": version: 5.0.2 resolution: "@metamask/utils@npm:5.0.2" dependencies: @@ -1354,6 +1381,34 @@ __metadata: languageName: node linkType: hard +"@metamask/utils@npm:^6.2.0": + version: 6.2.0 + resolution: "@metamask/utils@npm:6.2.0" + dependencies: + "@ethereumjs/tx": ^4.1.2 + "@noble/hashes": ^1.3.1 + "@types/debug": ^4.1.7 + debug: ^4.3.4 + semver: ^7.3.8 + superstruct: ^1.0.3 + checksum: 0bc675358ecc09b3bc04da613d73666295d7afa51ff6b8554801585966900b24b8545bd93b8b2e9a17db867ebe421fe884baf3558ec4ca3199fa65504f677c1b + languageName: node + linkType: hard + +"@metamask/utils@npm:^8.0.0": + version: 8.1.0 + resolution: "@metamask/utils@npm:8.1.0" + dependencies: + "@ethereumjs/tx": ^4.1.2 + "@noble/hashes": ^1.3.1 + "@types/debug": ^4.1.7 + debug: ^4.3.4 + semver: ^7.5.4 + superstruct: ^1.0.3 + checksum: 4cbee36d0c227f3e528930e83f75a0c6b71b55b332c3e162f0e87f3dd86ae017d0b20405d76ea054ab99e4d924d3d9b8b896ed12a12aae57b090350e5a625999 + languageName: node + linkType: hard + "@noble/curves@npm:1.0.0, @noble/curves@npm:~1.0.0": version: 1.0.0 resolution: "@noble/curves@npm:1.0.0" @@ -2665,7 +2720,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.1": +"chalk@npm:^4.0.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -4542,7 +4597,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3, inherits@npm:~2.0.4": +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 @@ -5421,6 +5476,13 @@ __metadata: languageName: node linkType: hard +"json-rpc-random-id@npm:^1.0.0": + version: 1.0.1 + resolution: "json-rpc-random-id@npm:1.0.1" + checksum: fcd2e884193a129ace4002bd65a86e9cdb206733b4693baea77bd8b372cf8de3043fbea27716a2c9a716581a908ca8d978d9dfec4847eb2cf77edb4cf4b2252c + languageName: node + linkType: hard + "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -6593,7 +6655,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.0.2, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:^3.0.2, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -6897,7 +6959,18 @@ __metadata: languageName: node linkType: hard -"ses@npm:^0.18.1": +"semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + languageName: node + linkType: hard + +"ses@npm:^0.18.7": version: 0.18.7 resolution: "ses@npm:0.18.7" dependencies: @@ -7143,16 +7216,6 @@ __metadata: languageName: node linkType: hard -"stream-browserify@npm:^3.0.0": - version: 3.0.0 - resolution: "stream-browserify@npm:3.0.0" - dependencies: - inherits: ~2.0.4 - readable-stream: ^3.5.0 - checksum: 4c47ef64d6f03815a9ca3874e2319805e8e8a85f3550776c47ce523b6f4c6cd57f40e46ec6a9ab8ad260fde61863c2718f250d3bedb3fe9052444eb9abfd9921 - languageName: node - linkType: hard - "stream-shift@npm:^1.0.0": version: 1.0.1 resolution: "stream-shift@npm:1.0.1" @@ -7886,7 +7949,7 @@ __metadata: languageName: node linkType: hard -"xtend@npm:~4.0.1": +"xtend@npm:^4.0.1, xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a