diff --git a/packages/wallet/package.json b/packages/wallet/package.json index 3f11bbed70b..94b59223e08 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -51,15 +51,20 @@ "dependencies": { "@metamask/accounts-controller": "^37.2.0", "@metamask/approval-controller": "^9.0.1", + "@metamask/bitcoin-wallet-snap": "^1.10.1", "@metamask/browser-passworder": "^6.0.0", "@metamask/connectivity-controller": "^0.2.0", "@metamask/controller-utils": "^11.20.0", "@metamask/keyring-controller": "^25.2.0", "@metamask/messenger": "^1.1.1", + "@metamask/multichain-account-service": "workspace:^", "@metamask/network-controller": "^30.0.1", "@metamask/remote-feature-flag-controller": "^4.2.0", "@metamask/scure-bip39": "^2.1.1", + "@metamask/snaps-controllers": "^20.0.1", + "@metamask/solana-wallet-snap": "^2.8.0", "@metamask/transaction-controller": "^64.0.0", + "@metamask/tron-wallet-snap": "^1.25.2", "@metamask/utils": "^11.9.0" }, "devDependencies": { diff --git a/packages/wallet/src/Wallet.test.ts b/packages/wallet/src/Wallet.test.ts index ba8387ed270..f925f683fe6 100644 --- a/packages/wallet/src/Wallet.test.ts +++ b/packages/wallet/src/Wallet.test.ts @@ -34,6 +34,7 @@ async function setupWallet(): Promise { }, }), getMetaMetricsId: (): string => 'fake-metrics-id', + ensureOnboardingComplete: () => Promise.resolve(), }, }); @@ -66,7 +67,7 @@ describe('Wallet', () => { ).toStrictEqual(['0xc6d5a3c98ec9073b54fa0969957bd582e8d874bf']); }); - it('signs transactions', async () => { + it.skip('signs transactions', async () => { enableNetConnect(); wallet = await setupWallet(); diff --git a/packages/wallet/src/initialization/instances/index.ts b/packages/wallet/src/initialization/instances/index.ts index 4f869053f11..b780e254773 100644 --- a/packages/wallet/src/initialization/instances/index.ts +++ b/packages/wallet/src/initialization/instances/index.ts @@ -1,7 +1,10 @@ export * from './accounts-controller'; export * from './approval-controller'; export * from './connectivity-controller'; +export * from './storage-service'; +export * from './snap-controller'; export * from './keyring-controller'; export * from './network-controller'; export * from './remote-feature-flag-controller'; export * from './transaction-controller'; +export * from './multichain-account-service'; diff --git a/packages/wallet/src/initialization/instances/keyring-controller.ts b/packages/wallet/src/initialization/instances/keyring-controller.ts index 7f3a356864c..89b16f8d8f4 100644 --- a/packages/wallet/src/initialization/instances/keyring-controller.ts +++ b/packages/wallet/src/initialization/instances/keyring-controller.ts @@ -20,8 +20,10 @@ import type { Encryptor } from '@metamask/keyring-controller'; import { KeyringController, KeyringControllerMessenger, + KeyringTypes, } from '@metamask/keyring-controller'; import { Messenger } from '@metamask/messenger'; +import { SnapKeyring } from '@metamask/eth-snap-keyring'; import { InitializationConfiguration } from '../types'; @@ -34,18 +36,18 @@ import { InitializationConfiguration } from '../types'; */ const encryptFactory = (iterations: number) => - async ( - password: string, - data: unknown, - key?: EncryptionKey | CryptoKey, - salt?: string, - ): Promise => - encrypt(password, data, key, salt, { - algorithm: 'PBKDF2', - params: { - iterations, - }, - }); + async ( + password: string, + data: unknown, + key?: EncryptionKey | CryptoKey, + salt?: string, + ): Promise => + encrypt(password, data, key, salt, { + algorithm: 'PBKDF2', + params: { + iterations, + }, + }); /** * A factory function for the encryptWithDetail method of the browser-passworder library, @@ -56,17 +58,17 @@ const encryptFactory = */ const encryptWithDetailFactory = (iterations: number) => - async ( - password: string, - object: unknown, - salt?: string, - ): Promise => - encryptWithDetail(password, object, salt, { - algorithm: 'PBKDF2', - params: { - iterations, - }, - }); + async ( + password: string, + object: unknown, + salt?: string, + ): Promise => + encryptWithDetail(password, object, salt, { + algorithm: 'PBKDF2', + params: { + iterations, + }, + }); /** * A factory function for the keyFromPassword method of the browser-passworder library, @@ -80,23 +82,23 @@ const encryptWithDetailFactory = */ const keyFromPasswordFactory = (iterations: number) => - async ( - password: string, - salt: string, - exportable?: boolean, - opts?: KeyDerivationOptions, - ): Promise => - keyFromPassword( - password, - salt, - exportable, - opts ?? { - algorithm: 'PBKDF2', - params: { - iterations, + async ( + password: string, + salt: string, + exportable?: boolean, + opts?: KeyDerivationOptions, + ): Promise => + keyFromPassword( + password, + salt, + exportable, + opts ?? { + algorithm: 'PBKDF2', + params: { + iterations, + }, }, - }, - ); + ); /** * A factory function for the isVaultUpdated method of the browser-passworder library, @@ -107,13 +109,13 @@ const keyFromPasswordFactory = */ const isVaultUpdatedFactory = (iterations: number) => - (vault: string): boolean => - isVaultUpdated(vault, { - algorithm: 'PBKDF2', - params: { - iterations, - }, - }); + (vault: string): boolean => + isVaultUpdated(vault, { + algorithm: 'PBKDF2', + params: { + iterations, + }, + }); /** * A factory function that returns an encryptor with the given number of iterations. @@ -138,6 +140,25 @@ const encryptorFactory = (iterations: number): Encryptor => ({ generateSalt, }); +const createSnapKeyringBuilder = (messenger: KeyringControllerMessenger) => { + const SnapKeyringBuilder = (() => { + return new SnapKeyring({ + messenger, + // callbacks: new SnapKeyringImpl(messenger, helpers), + isAnyAccountTypeAllowed: false, + }); + }) as { + (): SnapKeyring; + type: typeof SnapKeyring.type + state: null; + }; + + SnapKeyringBuilder.state = null; + SnapKeyringBuilder.type = SnapKeyring.type; + + return SnapKeyringBuilder; +} + export const keyringController: InitializationConfiguration< KeyringController, KeyringControllerMessenger @@ -148,15 +169,40 @@ export const keyringController: InitializationConfiguration< state, messenger, encryptor: encryptorFactory(600_000), + keyringBuilders: [createSnapKeyringBuilder(messenger)] }); + // Ensure the SnapKeyring has been added, this happens in different places in the clients. + messenger.subscribe('KeyringController:unlock', () => { + const [snapKeyring] = instance.getKeyringsByType( + KeyringTypes.snap, + ); + + if (!snapKeyring) { + instance.addNewKeyring(KeyringTypes.snap).catch(console.error); + } + }) + return { instance, }; }, - messenger: (parent) => - new Messenger<'KeyringController', never, never, typeof parent>({ + messenger: (parent) => { + const controllerMessenger: KeyringControllerMessenger = new Messenger({ namespace: 'KeyringController', parent, - }), + }); + + // TODO: We only need to delegate here for the SnapKeyring, decide if we wanna do that + parent.delegate({ + messenger: controllerMessenger, + events: [], + actions: [ + 'SnapController:handleRequest', + ], + }); + + return controllerMessenger; + } + }; diff --git a/packages/wallet/src/initialization/instances/multichain-account-service.ts b/packages/wallet/src/initialization/instances/multichain-account-service.ts new file mode 100644 index 00000000000..662317674e7 --- /dev/null +++ b/packages/wallet/src/initialization/instances/multichain-account-service.ts @@ -0,0 +1,94 @@ +import { + MultichainAccountService, + SOL_ACCOUNT_PROVIDER_NAME, + TRX_ACCOUNT_PROVIDER_NAME, + BTC_ACCOUNT_PROVIDER_NAME, + MultichainAccountServiceMessenger, +} from '@metamask/multichain-account-service'; +import { Messenger } from '@metamask/messenger'; + +import { InitializationConfiguration } from '../types'; + +const snapAccountProviderConfig = { + // READ THIS CAREFULLY: + // We are using 1 to prevent any concurrent `keyring_createAccount` requests. This ensures + // we prevent any desync between Snap's accounts and Metamask's accounts. + maxConcurrency: 1, + // Re-use the default config for the rest: + discovery: { + timeoutMs: 2000, + maxAttempts: 3, + backOffMs: 1000, + }, + createAccounts: { + timeoutMs: 3000, + batched: false, + }, + resyncAccounts: { + autoRemoveExtraSnapAccounts: false, + }, +}; + +export const multichainAccountService: InitializationConfiguration< + MultichainAccountService, + MultichainAccountServiceMessenger +> = { + name: 'MultichainAccountService', + init: ({ messenger, options }) => { + const instance = new MultichainAccountService({ + messenger, + providerConfigs: { + [SOL_ACCOUNT_PROVIDER_NAME]: { + ...snapAccountProviderConfig, + createAccounts: { + ...snapAccountProviderConfig.createAccounts, + batched: true, + }, + }, + [BTC_ACCOUNT_PROVIDER_NAME]: snapAccountProviderConfig, + [TRX_ACCOUNT_PROVIDER_NAME]: snapAccountProviderConfig, + }, + ensureOnboardingComplete: options.ensureOnboardingComplete, + }); + + // TODO: Basic Functionality triggers + + return { + instance, + }; + }, + messenger: (parent) => { + const serviceMessenger: MultichainAccountServiceMessenger = new Messenger({ + namespace: 'MultichainAccountService', + parent, + }); + + parent.delegate({ + messenger: serviceMessenger, + events: [ + 'KeyringController:stateChange', + 'SnapController:stateChange', + 'AccountsController:accountAdded', + 'AccountsController:accountRemoved', + ], + actions: [ + 'AccountsController:listMultichainAccounts', + 'AccountsController:getAccountByAddress', + 'AccountsController:getAccount', + 'AccountsController:getAccounts', + 'SnapController:getState', + 'SnapController:handleRequest', + 'KeyringController:getState', + 'KeyringController:withKeyring', + 'KeyringController:addNewKeyring', + 'KeyringController:getKeyringsByType', + 'KeyringController:createNewVaultAndKeychain', + 'KeyringController:createNewVaultAndRestore', + 'NetworkController:getNetworkClientById', + 'NetworkController:findNetworkClientIdByChainId', + ], + }); + + return serviceMessenger; + } +}; diff --git a/packages/wallet/src/initialization/instances/snap-controller.ts b/packages/wallet/src/initialization/instances/snap-controller.ts new file mode 100644 index 00000000000..f0aa6102d0a --- /dev/null +++ b/packages/wallet/src/initialization/instances/snap-controller.ts @@ -0,0 +1,74 @@ +import { Messenger } from '@metamask/messenger'; +import { SnapController, SnapControllerMessenger } from '@metamask/snaps-controllers'; +import SolanaWalletSnap from '@metamask/solana-wallet-snap/dist/preinstalled-snap.json'; +import BitcoinWalletSnap from '@metamask/bitcoin-wallet-snap/dist/preinstalled-snap.json'; +import TronWalletSnap from '@metamask/tron-wallet-snap/dist/preinstalled-snap.json'; +import { InitializationConfiguration } from '../types'; + +export const snapController: InitializationConfiguration< + SnapController, + SnapControllerMessenger +> = { + name: 'SnapController', + init: ({ messenger, options }) => { + const instance = new SnapController({ + messenger, + ensureOnboardingComplete: options.ensureOnboardingComplete, + preinstalledSnaps: [SolanaWalletSnap, BitcoinWalletSnap, TronWalletSnap], + }); + + instance.init().catch(console.error); + + return { + instance, + }; + }, + messenger: (parent) => { + const controllerMessenger: SnapControllerMessenger = new Messenger({ + namespace: 'SnapController', + parent, + }); + + parent.delegate({ + messenger: controllerMessenger, + events: [ + 'ExecutionService:unhandledError', + 'ExecutionService:outboundRequest', + 'ExecutionService:outboundResponse', + 'KeyringController:lock', + 'SnapRegistryController:registryUpdated', + ], + actions: [ + 'PermissionController:getEndowments', + 'PermissionController:getPermissions', + 'PermissionController:hasPermission', + 'PermissionController:hasPermissions', + 'PermissionController:revokeAllPermissions', + 'PermissionController:revokePermissions', + 'PermissionController:revokePermissionForAllSubjects', + 'PermissionController:getSubjectNames', + 'PermissionController:updateCaveat', + 'ApprovalController:addRequest', + 'ApprovalController:updateRequestState', + 'PermissionController:grantPermissions', + 'SubjectMetadataController:getSubjectMetadata', + 'SubjectMetadataController:addSubjectMetadata', + 'ExecutionService:executeSnap', + 'ExecutionService:terminateSnap', + 'ExecutionService:handleRpcRequest', + 'SnapRegistryController:get', + 'SnapRegistryController:getMetadata', + 'SnapRegistryController:requestUpdate', + 'SnapRegistryController:resolveVersion', + 'SnapInterfaceController:createInterface', + 'SnapInterfaceController:getInterface', + 'SnapInterfaceController:setInterfaceDisplayed', + 'StorageService:setItem', + 'StorageService:getItem', + 'StorageService:removeItem', + 'StorageService:clear', + ], + }); + return controllerMessenger; + } +}; diff --git a/packages/wallet/src/initialization/instances/storage-service.ts b/packages/wallet/src/initialization/instances/storage-service.ts new file mode 100644 index 00000000000..3b6b6c504f2 --- /dev/null +++ b/packages/wallet/src/initialization/instances/storage-service.ts @@ -0,0 +1,24 @@ +import { Messenger } from "@metamask/messenger"; +import { StorageService, StorageServiceMessenger } from "@metamask/storage-service"; +import { InitializationConfiguration } from "../types"; + +export const storageService: InitializationConfiguration< + StorageService, + StorageServiceMessenger +> = { + name: 'StorageService', + init: ({ messenger }) => { + const instance = new StorageService({ + messenger, + }); + + return { + instance, + }; + }, + messenger: (parent) => + new Messenger<'StorageService', never, never, typeof parent>({ + namespace: 'StorageService', + parent, + }), +}; diff --git a/packages/wallet/src/types.ts b/packages/wallet/src/types.ts index e808637e474..3897fcfb353 100644 --- a/packages/wallet/src/types.ts +++ b/packages/wallet/src/types.ts @@ -6,4 +6,5 @@ export type WalletOptions = { showApprovalRequest: () => void; clientConfigApiService: ClientConfigApiService; getMetaMetricsId: () => string; + ensureOnboardingComplete: () => Promise; }; diff --git a/packages/wallet/src/utilities.ts b/packages/wallet/src/utilities.ts index edd281f968b..75496afa18d 100644 --- a/packages/wallet/src/utilities.ts +++ b/packages/wallet/src/utilities.ts @@ -23,12 +23,12 @@ export async function importSecretRecoveryPhrase( const indices = phrase.split(' ').map((word) => wordlist.indexOf(word)); const mnemonic = new Uint8Array(new Uint16Array(indices).buffer); - // TODO: This should use the new MultichainAccountService. - await wallet.messenger.call( - 'KeyringController:createNewVaultAndRestore', - password, - mnemonic, + const walletGroup = await wallet.messenger.call( + 'MultichainAccountService:createMultichainAccountWallet', + { type: 'restore', password, mnemonic } ); + + await walletGroup.discoverAccounts(); } /** @@ -41,11 +41,12 @@ export async function createSecretRecoveryPhrase( wallet: Wallet, password: string, ): Promise { - // TODO: This should use the new MultichainAccountService. - await wallet.messenger.call( - 'KeyringController:createNewVaultAndKeychain', - password, + const walletGroup = await wallet.messenger.call( + 'MultichainAccountService:createMultichainAccountWallet', + { type: 'create', password }, ); + + await walletGroup.discoverAccounts(); } /** diff --git a/packages/wallet/tsconfig.build.json b/packages/wallet/tsconfig.build.json index a5e012287d5..87e6476f402 100644 --- a/packages/wallet/tsconfig.build.json +++ b/packages/wallet/tsconfig.build.json @@ -24,6 +24,9 @@ { "path": "../messenger/tsconfig.build.json" }, + { + "path": "../multichain-account-service/tsconfig.build.json" + }, { "path": "../network-controller/tsconfig.build.json" }, diff --git a/packages/wallet/tsconfig.json b/packages/wallet/tsconfig.json index 8f0b0c57883..91ec181232f 100644 --- a/packages/wallet/tsconfig.json +++ b/packages/wallet/tsconfig.json @@ -22,6 +22,9 @@ { "path": "../messenger/tsconfig.json" }, + { + "path": "../multichain-account-service/tsconfig.json" + }, { "path": "../network-controller/tsconfig.json" }, diff --git a/yarn.lock b/yarn.lock index 60655666277..fbe436db14e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2993,6 +2993,13 @@ __metadata: languageName: unknown linkType: soft +"@metamask/bitcoin-wallet-snap@npm:^1.10.1": + version: 1.10.1 + resolution: "@metamask/bitcoin-wallet-snap@npm:1.10.1" + checksum: 10/647c0c6211011a54f97fe58f97e930693c8dd64a861969d3546486fdadc8f0efb7b39328469a07408c8ab76fc79d63a74d06c12de91e60204ce040f8ee89741d + languageName: node + linkType: hard + "@metamask/bridge-controller@npm:^70.0.1, @metamask/bridge-controller@workspace:packages/bridge-controller": version: 0.0.0-use.local resolution: "@metamask/bridge-controller@workspace:packages/bridge-controller" @@ -4429,7 +4436,7 @@ __metadata: languageName: unknown linkType: soft -"@metamask/multichain-account-service@npm:^8.0.1, @metamask/multichain-account-service@workspace:packages/multichain-account-service": +"@metamask/multichain-account-service@npm:^8.0.1, @metamask/multichain-account-service@workspace:^, @metamask/multichain-account-service@workspace:packages/multichain-account-service": version: 0.0.0-use.local resolution: "@metamask/multichain-account-service@workspace:packages/multichain-account-service" dependencies: @@ -5316,6 +5323,49 @@ __metadata: languageName: node linkType: hard +"@metamask/snaps-controllers@npm:^20.0.1": + version: 20.0.1 + resolution: "@metamask/snaps-controllers@npm:20.0.1" + dependencies: + "@metamask/approval-controller": "npm:^9.0.1" + "@metamask/base-controller": "npm:^9.0.1" + "@metamask/json-rpc-engine": "npm:^10.2.4" + "@metamask/json-rpc-middleware-stream": "npm:^8.0.8" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/messenger": "npm:^1.1.1" + "@metamask/object-multiplex": "npm:^2.1.0" + "@metamask/permission-controller": "npm:^12.3.0" + "@metamask/post-message-stream": "npm:^10.0.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/snaps-registry": "npm:^4.0.0" + "@metamask/snaps-rpc-methods": "npm:^15.1.1" + "@metamask/snaps-sdk": "npm:^11.1.0" + "@metamask/snaps-utils": "npm:^12.2.0" + "@metamask/storage-service": "npm:^1.0.1" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.11.0" + "@xstate/fsm": "npm:^2.0.0" + async-mutex: "npm:^0.5.0" + concat-stream: "npm:^2.0.0" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + get-npm-tarball-url: "npm:^2.0.3" + immer: "npm:^9.0.21" + luxon: "npm:^3.5.0" + nanoid: "npm:^3.3.10" + readable-stream: "npm:^3.6.2" + readable-web-to-node-stream: "npm:^3.0.2" + semver: "npm:^7.5.4" + tar-stream: "npm:^3.1.7" + peerDependencies: + "@metamask/snaps-execution-environments": ^11.0.2 + peerDependenciesMeta: + "@metamask/snaps-execution-environments": + optional: true + checksum: 10/ccacdffa8b630a777f7e95ad2a795a95663b0ae4da1fe78c35fa4b1e3590318687e5edb3cd769661e74fc03ee2e59bcd62098657e9b00163b216eb8424b8a135 + languageName: node + linkType: hard + "@metamask/snaps-registry@npm:^4.0.0": version: 4.0.0 resolution: "@metamask/snaps-registry@npm:4.0.0" @@ -5345,6 +5395,23 @@ __metadata: languageName: node linkType: hard +"@metamask/snaps-rpc-methods@npm:^15.1.1": + version: 15.1.1 + resolution: "@metamask/snaps-rpc-methods@npm:15.1.1" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/permission-controller": "npm:^12.3.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/snaps-sdk": "npm:^11.1.0" + "@metamask/snaps-utils": "npm:^12.2.0" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.11.0" + "@noble/hashes": "npm:^1.7.1" + async-mutex: "npm:^0.5.0" + checksum: 10/906eafa8a2d4944e50d73b8aa4d32a7070c33367ad3d58843e892e62b3bd8facb0a02e1d88a9245c18a281637435d97266212b7706ef67ee6a68db85a5991ea3 + languageName: node + linkType: hard + "@metamask/snaps-sdk@npm:^10.4.0": version: 10.4.0 resolution: "@metamask/snaps-sdk@npm:10.4.0" @@ -5373,6 +5440,20 @@ __metadata: languageName: node linkType: hard +"@metamask/snaps-sdk@npm:^11.1.0": + version: 11.1.0 + resolution: "@metamask/snaps-sdk@npm:11.1.0" + dependencies: + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/providers": "npm:^22.1.1" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.11.0" + luxon: "npm:^3.5.0" + checksum: 10/138c616584d537b9976ae48123090ab5731848d79d5d1f4e979c797dfdfe061329cbf18a5e84d8bd068fe36d5b9d169337f6d74efab0736f30c31ddf4088f70b + languageName: node + linkType: hard + "@metamask/snaps-utils@npm:^12.1.2": version: 12.1.2 resolution: "@metamask/snaps-utils@npm:12.1.2" @@ -5404,6 +5485,37 @@ __metadata: languageName: node linkType: hard +"@metamask/snaps-utils@npm:^12.2.0": + version: 12.2.0 + resolution: "@metamask/snaps-utils@npm:12.2.0" + dependencies: + "@babel/core": "npm:^7.23.2" + "@babel/types": "npm:^7.23.0" + "@metamask/key-tree": "npm:^10.1.1" + "@metamask/messenger": "npm:^1.1.1" + "@metamask/permission-controller": "npm:^12.3.0" + "@metamask/rpc-errors": "npm:^7.0.3" + "@metamask/slip44": "npm:^4.4.0" + "@metamask/snaps-registry": "npm:^4.0.0" + "@metamask/snaps-sdk": "npm:^11.1.0" + "@metamask/superstruct": "npm:^3.2.1" + "@metamask/utils": "npm:^11.11.0" + "@scure/base": "npm:^1.1.1" + chalk: "npm:^4.1.2" + cron-parser: "npm:^4.5.0" + fast-deep-equal: "npm:^3.1.3" + fast-json-stable-stringify: "npm:^2.1.0" + fast-xml-parser: "npm:^5.5.6" + luxon: "npm:^3.5.0" + marked: "npm:^12.0.1" + rfdc: "npm:^1.3.0" + semver: "npm:^7.5.4" + ses: "npm:^1.15.0" + validate-npm-package-name: "npm:^5.0.0" + checksum: 10/0e7cb5a4deebad3dc98404486b7767be049e9f86173195e9b1ae577f197e67cdd392f1e05ebb146a199ffc3cd52013636637a4d1ac7f9fec164f3189be97df55 + languageName: node + linkType: hard + "@metamask/social-controllers@workspace:packages/social-controllers": version: 0.0.0-use.local resolution: "@metamask/social-controllers@workspace:packages/social-controllers" @@ -5426,6 +5538,13 @@ __metadata: languageName: unknown linkType: soft +"@metamask/solana-wallet-snap@npm:^2.8.0": + version: 2.8.0 + resolution: "@metamask/solana-wallet-snap@npm:2.8.0" + checksum: 10/5e26f28d585aa00c4da204a7311f15048de30ff336baa90df1ca82f0d151b25dcf7b3fc3daa8b9ab02914aca35f31eb7a2854bf167008f6e96f99e215f02767c + languageName: node + linkType: hard + "@metamask/stake-sdk@npm:^3.2.1": version: 3.2.1 resolution: "@metamask/stake-sdk@npm:3.2.1" @@ -5604,6 +5723,13 @@ __metadata: languageName: unknown linkType: soft +"@metamask/tron-wallet-snap@npm:^1.25.2": + version: 1.25.2 + resolution: "@metamask/tron-wallet-snap@npm:1.25.2" + checksum: 10/1f42a2d14b50895613dca01398b16c94b510ff55c4fa0a4292272d8820ca2664bf2dc8985d833317fa667a124a58565bd89d4be867c74e0f82792c43095b8620 + languageName: node + linkType: hard + "@metamask/user-operation-controller@workspace:packages/user-operation-controller": version: 0.0.0-use.local resolution: "@metamask/user-operation-controller@workspace:packages/user-operation-controller" @@ -5660,6 +5786,25 @@ __metadata: languageName: node linkType: hard +"@metamask/utils@npm:^11.11.0": + version: 11.11.0 + resolution: "@metamask/utils@npm:11.11.0" + dependencies: + "@ethereumjs/tx": "npm:^4.2.0" + "@metamask/superstruct": "npm:^3.1.0" + "@noble/hashes": "npm:^1.3.1" + "@scure/base": "npm:^1.1.3" + "@types/debug": "npm:^4.1.7" + "@types/lodash": "npm:^4.17.20" + debug: "npm:^4.3.4" + lodash: "npm:^4.17.21" + pony-cause: "npm:^2.1.10" + semver: "npm:^7.5.4" + uuid: "npm:^9.0.1" + checksum: 10/c4381b9e451a9616bde84ac659bc0d1848ef06b6e605f877bfa065b78c8ed5015706683ea88a3387de5eaeb3a50d1af9af0994f04f9e06258d992598fe2be3bf + languageName: node + linkType: hard + "@metamask/utils@npm:^9.0.0": version: 9.3.0 resolution: "@metamask/utils@npm:9.3.0" @@ -5684,15 +5829,20 @@ __metadata: "@metamask/accounts-controller": "npm:^37.2.0" "@metamask/approval-controller": "npm:^9.0.1" "@metamask/auto-changelog": "npm:^3.4.4" + "@metamask/bitcoin-wallet-snap": "npm:^1.10.1" "@metamask/browser-passworder": "npm:^6.0.0" "@metamask/connectivity-controller": "npm:^0.2.0" "@metamask/controller-utils": "npm:^11.20.0" "@metamask/keyring-controller": "npm:^25.2.0" "@metamask/messenger": "npm:^1.1.1" + "@metamask/multichain-account-service": "workspace:^" "@metamask/network-controller": "npm:^30.0.1" "@metamask/remote-feature-flag-controller": "npm:^4.2.0" "@metamask/scure-bip39": "npm:^2.1.1" + "@metamask/snaps-controllers": "npm:^20.0.1" + "@metamask/solana-wallet-snap": "npm:^2.8.0" "@metamask/transaction-controller": "npm:^64.0.0" + "@metamask/tron-wallet-snap": "npm:^1.25.2" "@metamask/utils": "npm:^11.9.0" "@ts-bridge/cli": "npm:^0.6.4" "@types/jest": "npm:^29.5.14"