diff --git a/app/scripts/metamask-controller.actions.test.js b/app/scripts/metamask-controller.actions.test.js index 765c6844b0da..e6951dde8cc0 100644 --- a/app/scripts/metamask-controller.actions.test.js +++ b/app/scripts/metamask-controller.actions.test.js @@ -220,8 +220,12 @@ describe('MetaMaskController', function () { await metamaskController.createNewVaultAndRestore('test@123', TEST_SEED); const result2 = metamaskController.keyringController.state; + expect(result1.keyrings).toHaveLength(2); + expect(result1.keyrings[0].metadata.id).toBe(mockULIDs[0]); // 0: Primary HD keyring + expect(result1.keyrings[1].metadata.id).toBe(mockULIDs[1]); // 1: Snap keyring + // On restore, a new keyring metadata is generated. - expect(result1.keyrings[0].metadata.id).toBe(mockULIDs[0]); + const ulidNewIndex = 2; expect(result2).toStrictEqual({ ...result1, keyrings: [ @@ -229,7 +233,14 @@ describe('MetaMaskController', function () { ...result1.keyrings[0], metadata: { ...result1.keyrings[0].metadata, - id: mockULIDs[1], + id: mockULIDs[ulidNewIndex + 0], // 0: New primary HD keyring + }, + }, + { + ...result1.keyrings[1], + metadata: { + ...result1.keyrings[1].metadata, + id: mockULIDs[ulidNewIndex + 1], // 1: New Snap keyring }, }, ], @@ -817,6 +828,9 @@ describe('MetaMaskController', function () { ) .mockResolvedValue(); + // We now need the Snap keyring after unlocking the wallet. + jest.spyOn(metamaskController, 'getSnapKeyring').mockReturnValue({}); + const syncAndUnlockResult = await metamaskController.syncPasswordAndUnlockWallet(password); diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 8b8bd63439e8..5fbd31b956d1 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -1307,6 +1307,44 @@ export default class MetamaskController extends EventEmitter { } return snapKeyring; } + + /** + * Get the snap keyring instance if available. + * + * @returns {SnapKeyring} + */ + getSnapKeyringIfAvailable() { + // Check if the controller has been unlocked, otherwise this will throw. + if (this.keyringController.isUnlocked()) { + // TODO: Use `withKeyring` instead + const [snapKeyring] = this.keyringController.getKeyringsByType( + KeyringType.snap, + ); + + return snapKeyring; + } + return undefined; + } + + /** + * Forward currently selected account group to the Snap keyring. + * + * @param snapKeyring - Snap keyring instance or undefined if not available. + * @param groupId - Currently selected account group. + */ + async forwardSelectedAccountGroupToSnapKeyring(snapKeyring, groupId) { + if (!snapKeyring) { + // Nothing to forward if the Snap keyring is not available. + return; + } + + if (groupId) { + const group = this.accountTreeController.getAccountGroupObject(groupId); + if (group) { + await snapKeyring.setSelectedAccounts(group.accounts); + } + } + } ///: END:ONLY_INCLUDE_IF trackInsightSnapView(snapId) { @@ -1611,7 +1649,15 @@ export default class MetamaskController extends EventEmitter { // wallet_notify for solana accountChanged when selected account group changes this.controllerMessenger.subscribe( `${this.accountTreeController.name}:selectedAccountGroupChange`, - () => { + (groupId) => { + // TODO: Move this logic to the SnapKeyring directly. + // Forward selected accounts to the Snap keyring, so each Snaps can fetch those accounts. + // eslint-disable-next-line no-void + void this.forwardSelectedAccountGroupToSnapKeyring( + this.getSnapKeyringIfAvailable(), + groupId, + ); + const [account] = this.accountTreeController.getAccountsFromSelectedAccountGroup({ scopes: [SolScope.Mainnet], @@ -1658,6 +1704,23 @@ export default class MetamaskController extends EventEmitter { }, ); + // TODO: Move this logic to the SnapKeyring directly. + // Forward selected accounts to the Snap keyring, so each Snaps can fetch those accounts. + this.controllerMessenger.subscribe( + `${this.multichainAccountService.name}:multichainAccountGroupUpdated`, + (group) => { + // If the current group gets updated, then maybe there are more accounts being "selected" + // now, so we have to forward them to the Snap keyring too! + if (this.accountTreeController.getSelectedAccountGroup() === group.id) { + // eslint-disable-next-line no-void + void this.forwardSelectedAccountGroupToSnapKeyring( + this.getSnapKeyringIfAvailable(), + group.id, + ); + } + }, + ); + this.controllerMessenger.subscribe( `${this.permissionController.name}:stateChange`, async (currentValue, previousValue) => { @@ -4028,6 +4091,12 @@ export default class MetamaskController extends EventEmitter { await this.accountsController.updateAccounts(); // Then we can build the initial tree. this.accountTreeController.init(); + // TODO: Move this logic to the SnapKeyring directly. + // Forward selected accounts to the Snap keyring, so each Snaps can fetch those accounts. + await this.forwardSelectedAccountGroupToSnapKeyring( + await this.getSnapKeyring(), + this.accountTreeController.getSelectedAccountGroup(), + ); return primaryKeyring; } finally { @@ -4411,6 +4480,12 @@ export default class MetamaskController extends EventEmitter { // TODO: Remove this once the `accounts-controller` once only // depends only on keyrings `:stateChange`. this.accountTreeController.reinit(); + // TODO: Move this logic to the SnapKeyring directly. + // Forward selected accounts to the Snap keyring, so each Snaps can fetch those accounts. + await this.forwardSelectedAccountGroupToSnapKeyring( + await this.getSnapKeyring(), + this.accountTreeController.getSelectedAccountGroup(), + ); if (completedOnboarding) { if (this.isMultichainAccountsFeatureState2Enabled()) { @@ -4765,6 +4840,12 @@ export default class MetamaskController extends EventEmitter { ///: END:ONLY_INCLUDE_IF // Force account-tree refresh after all accounts have been updated. this.accountTreeController.init(); + // TODO: Move this logic to the SnapKeyring directly. + // Forward selected accounts to the Snap keyring, so each Snaps can fetch those accounts. + await this.forwardSelectedAccountGroupToSnapKeyring( + await this.getSnapKeyring(), + this.accountTreeController.getSelectedAccountGroup(), + ); } async _loginUser(password) { diff --git a/app/scripts/metamask-controller.test.js b/app/scripts/metamask-controller.test.js index bffd4b5e03ca..a39fca8ebfad 100644 --- a/app/scripts/metamask-controller.test.js +++ b/app/scripts/metamask-controller.test.js @@ -5,6 +5,7 @@ import { cloneDeep } from 'lodash'; import nock from 'nock'; import { obj as createThroughStream } from 'through2'; import { wordlist as englishWordlist } from '@metamask/scure-bip39/dist/wordlists/english'; +import { SnapKeyring } from '@metamask/eth-snap-keyring'; import { ListNames, METAMASK_STALELIST_URL, @@ -45,6 +46,7 @@ import { KeyringInternalSnapClient } from '@metamask/keyring-internal-snap-clien import log from 'loglevel'; import { parseCaipAccountId } from '@metamask/utils'; +import { KeyringTypes } from '@metamask/keyring-controller'; import { createTestProviderTools } from '../../test/stub/provider'; import { HardwareDeviceNames, @@ -878,40 +880,6 @@ describe('MetaMaskController', () => { allDetectedTokens: { '0x1': { [TEST_ADDRESS_2]: [{}] } }, }); - const mockSnapKeyring = { - createAccount: jest - .fn() - .mockResolvedValue({ address: 'mockedAddress' }), - }; - - const originalGetKeyringsByType = - metamaskController.keyringController.getKeyringsByType; - let snapKeyringCallCount = 0; - jest - .spyOn(metamaskController.keyringController, 'getKeyringsByType') - .mockImplementation((type) => { - if (type === 'Snap Keyring') { - snapKeyringCallCount += 1; - - if (snapKeyringCallCount === 1) { - // First call - use original implementation to let controller initialize snap keyring - return originalGetKeyringsByType.call( - metamaskController.keyringController, - type, - ); - } - // Second call and beyond - return mock - console.log('returning mocked snap keyring!'); - return [mockSnapKeyring]; - } - - // For other types, always use original implementation - return originalGetKeyringsByType.call( - metamaskController.keyringController, - type, - ); - }); - await metamaskController.createNewVaultAndRestore( 'foobar1337', TEST_SEED, @@ -1548,7 +1516,8 @@ describe('MetaMaskController', () => { ); expect( - metamaskController.keyringController.state.keyrings[1].type, + // 0: HD keyring, 1: Snap keyring, 2: Trezor keyring + metamaskController.keyringController.state.keyrings[2].type, ).toBe(TrezorKeyring.type); expect(firstPage).toStrictEqual(KNOWN_PUBLIC_KEY_ADDRESSES); }); @@ -1560,7 +1529,8 @@ describe('MetaMaskController', () => { ); expect( - metamaskController.keyringController.state.keyrings[1].type, + // 0: HD keyring, 1: Snap keyring, 2: Ledger keyring + metamaskController.keyringController.state.keyrings[2].type, ).toBe(LedgerKeyring.type); expect(firstPage).toStrictEqual(KNOWN_PUBLIC_KEY_ADDRESSES); }); @@ -1694,7 +1664,8 @@ describe('MetaMaskController', () => { ); expect( - metamaskController.keyringController.state.keyrings[1] + // 0: HD keyring, 1: Snap keyring, 2: Ledger/Trezor keyring + metamaskController.keyringController.state.keyrings[2] .accounts, ).toStrictEqual([ KNOWN_PUBLIC_KEY_ADDRESSES[ @@ -3510,55 +3481,23 @@ describe('MetaMaskController', () => { .spyOn(metamaskController, 'isMultichainAccountsFeatureState2Enabled') .mockReturnValue(false); - const mockSnapKeyring = { - createAccount: jest - .fn() - .mockResolvedValue({ address: 'mockedAddress' }), - }; - - const originalGetKeyringsByType = - metamaskController.keyringController.getKeyringsByType; - let snapKeyringCallCount = 0; - jest - .spyOn(metamaskController.keyringController, 'getKeyringsByType') - .mockImplementation((type) => { - if (type === 'Snap Keyring') { - snapKeyringCallCount += 1; - - if (snapKeyringCallCount === 1) { - // First call - use original implementation to let controller initialize snap keyring - return originalGetKeyringsByType.call( - metamaskController.keyringController, - type, - ); - } - // Second call and beyond - return mock - console.log('returning mocked snap keyring!'); - return [mockSnapKeyring]; - } - - // For other types, always use original implementation - return originalGetKeyringsByType.call( - metamaskController.keyringController, - type, - ); - }); - await metamaskController.createNewVaultAndRestore(password, TEST_SEED); - const previousKeyrings = - metamaskController.keyringController.state.keyrings; + const previousKeyrings = cloneDeep( + metamaskController.keyringController.state.keyrings, + ); await metamaskController.importMnemonicToVault(TEST_SEED_ALT); const currentKeyrings = metamaskController.keyringController.state.keyrings; + // 0: Primary HD keyring, 1: Snap keyring, 2: Newly imported HD keyring + expect( + metamaskController.keyringController.state.keyrings, + ).toHaveLength(3); const newlyAddedKeyringId = - metamaskController.keyringController.state.keyrings[ - metamaskController.keyringController.state.keyrings.length - 2 // -1 for the snap keyring, -1 for the newly added keyring - ].metadata.id; - + metamaskController.keyringController.state.keyrings[2].metadata.id; const newSRP = Buffer.from( await metamaskController.getSeedPhrase(password, newlyAddedKeyringId), ).toString('utf8'); @@ -3569,7 +3508,7 @@ describe('MetaMaskController', () => { expect( currentKeyrings.filter((kr) => kr.type === 'Snap Keyring'), ).toHaveLength(1); - expect(currentKeyrings).toHaveLength(previousKeyrings.length + 2); + expect(currentKeyrings).toHaveLength(previousKeyrings.length + 1); expect(newSRP).toStrictEqual(TEST_SEED_ALT); }); @@ -3608,10 +3547,11 @@ describe('MetaMaskController', () => { .spyOn(KeyringInternalSnapClient.prototype, 'discoverAccounts') .mockImplementation(mockDiscoverAccounts); - const mockCreateAccount = jest.fn().mockResolvedValue(undefined); - jest - .spyOn(metamaskController, 'getSnapKeyring') - .mockResolvedValue({ createAccount: mockCreateAccount }); + const mockCreateAccount = jest.spyOn( + SnapKeyring.prototype, + 'createAccount', + ); + mockCreateAccount.mockResolvedValue(undefined); await metamaskController.createNewVaultAndRestore(password, TEST_SEED); await metamaskController.importMnemonicToVault(TEST_SEED_ALT); @@ -3689,10 +3629,11 @@ describe('MetaMaskController', () => { .spyOn(KeyringInternalSnapClient.prototype, 'discoverAccounts') .mockImplementation(mockDiscoverAccounts); - const mockCreateAccount = jest.fn().mockResolvedValue(undefined); - jest - .spyOn(metamaskController, 'getSnapKeyring') - .mockResolvedValue({ createAccount: mockCreateAccount }); + const mockCreateAccount = jest.spyOn( + SnapKeyring.prototype, + 'createAccount', + ); + mockCreateAccount.mockResolvedValue(undefined); await metamaskController.createNewVaultAndRestore(password, TEST_SEED); await metamaskController.importMnemonicToVault(TEST_SEED_ALT); @@ -5040,7 +4981,10 @@ describe('MetaMaskController', () => { }); // Avoid KC.addNewKeyring side-effects and AccountTracker sync touching NetworkController - jest.spyOn(metamaskController, 'getSnapKeyring').mockResolvedValue({}); + jest.spyOn(metamaskController, 'getSnapKeyring').mockResolvedValue({ + // Now required, since it's invoked automatically when new account groups get added. + setSelectedAccounts: jest.fn(), + }); jest .spyOn(metamaskController.accountTrackerController, 'syncWithAddresses') .mockReturnValue(); @@ -5315,7 +5259,10 @@ describe('MetaMaskController', () => { }); // Avoid KC.addNewKeyring side-effects and AccountTracker sync touching NetworkController - jest.spyOn(metamaskController, 'getSnapKeyring').mockResolvedValue({}); + jest.spyOn(metamaskController, 'getSnapKeyring').mockResolvedValue({ + // Now required, since it's invoked automatically when new account groups get added. + setSelectedAccounts: jest.fn(), + }); jest .spyOn(metamaskController.accountTrackerController, 'syncWithAddresses') .mockReturnValue(); @@ -5346,7 +5293,9 @@ describe('MetaMaskController', () => { await metamaskController._importAccountsWithBalances(); const { keyrings } = metamaskController.keyringController.state; - const hdIds = keyrings.map((k) => k.metadata.id); + const hdIds = keyrings + .filter((keyring) => keyring.metadata.type === KeyringTypes.hd) + .map((keyring) => keyring.metadata.id); hdIds.forEach((id) => { expect( metamaskController.discoverAndCreateAccounts, @@ -5378,7 +5327,9 @@ describe('MetaMaskController', () => { await metamaskController._importAccountsWithBalances(); const { keyrings } = metamaskController.keyringController.state; - const hdIds = keyrings.map((k) => k.metadata.id); + const hdIds = keyrings + .filter((keyring) => keyring.metadata.type === KeyringTypes.hd) + .map((keyring) => keyring.metadata.id); hdIds.forEach((id) => { expect(metamaskController._addAccountsWithBalance).toHaveBeenCalledWith( id, diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index 316467e95a74..c397c60e9b5d 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -1235,6 +1235,7 @@ "@metamask/keyring-api": true, "@metamask/keyring-internal-api": true, "@metamask/keyring-internal-snap-client": true, + "@metamask/eth-snap-keyring>@metamask/keyring-snap-sdk": true, "@metamask/keyring-utils": true, "@metamask/superstruct": true, "@metamask/utils": true, @@ -1457,6 +1458,13 @@ "@metamask/multichain-transactions-controller>@metamask/keyring-snap-client>uuid": true } }, + "@metamask/eth-snap-keyring>@metamask/keyring-snap-sdk": { + "packages": { + "@metamask/keyring-api": true, + "@metamask/keyring-utils": true, + "@metamask/superstruct": true + } + }, "@metamask/keyring-utils": { "globals": { "URL": true diff --git a/lavamoat/browserify/experimental/policy.json b/lavamoat/browserify/experimental/policy.json index 316467e95a74..c397c60e9b5d 100644 --- a/lavamoat/browserify/experimental/policy.json +++ b/lavamoat/browserify/experimental/policy.json @@ -1235,6 +1235,7 @@ "@metamask/keyring-api": true, "@metamask/keyring-internal-api": true, "@metamask/keyring-internal-snap-client": true, + "@metamask/eth-snap-keyring>@metamask/keyring-snap-sdk": true, "@metamask/keyring-utils": true, "@metamask/superstruct": true, "@metamask/utils": true, @@ -1457,6 +1458,13 @@ "@metamask/multichain-transactions-controller>@metamask/keyring-snap-client>uuid": true } }, + "@metamask/eth-snap-keyring>@metamask/keyring-snap-sdk": { + "packages": { + "@metamask/keyring-api": true, + "@metamask/keyring-utils": true, + "@metamask/superstruct": true + } + }, "@metamask/keyring-utils": { "globals": { "URL": true diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index 316467e95a74..c397c60e9b5d 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -1235,6 +1235,7 @@ "@metamask/keyring-api": true, "@metamask/keyring-internal-api": true, "@metamask/keyring-internal-snap-client": true, + "@metamask/eth-snap-keyring>@metamask/keyring-snap-sdk": true, "@metamask/keyring-utils": true, "@metamask/superstruct": true, "@metamask/utils": true, @@ -1457,6 +1458,13 @@ "@metamask/multichain-transactions-controller>@metamask/keyring-snap-client>uuid": true } }, + "@metamask/eth-snap-keyring>@metamask/keyring-snap-sdk": { + "packages": { + "@metamask/keyring-api": true, + "@metamask/keyring-utils": true, + "@metamask/superstruct": true + } + }, "@metamask/keyring-utils": { "globals": { "URL": true diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index 316467e95a74..c397c60e9b5d 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -1235,6 +1235,7 @@ "@metamask/keyring-api": true, "@metamask/keyring-internal-api": true, "@metamask/keyring-internal-snap-client": true, + "@metamask/eth-snap-keyring>@metamask/keyring-snap-sdk": true, "@metamask/keyring-utils": true, "@metamask/superstruct": true, "@metamask/utils": true, @@ -1457,6 +1458,13 @@ "@metamask/multichain-transactions-controller>@metamask/keyring-snap-client>uuid": true } }, + "@metamask/eth-snap-keyring>@metamask/keyring-snap-sdk": { + "packages": { + "@metamask/keyring-api": true, + "@metamask/keyring-utils": true, + "@metamask/superstruct": true + } + }, "@metamask/keyring-utils": { "globals": { "URL": true diff --git a/lavamoat/webpack/policy.json b/lavamoat/webpack/policy.json index 7ec7f744e381..0e455d25dc6c 100644 --- a/lavamoat/webpack/policy.json +++ b/lavamoat/webpack/policy.json @@ -1295,6 +1295,7 @@ "@metamask/keyring-api": true, "@metamask/keyring-internal-api": true, "@metamask/keyring-internal-snap-client": true, + "@metamask/eth-snap-keyring>@metamask/keyring-snap-sdk": true, "@metamask/keyring-utils": true, "@metamask/superstruct": true, "@metamask/utils": true, @@ -1525,6 +1526,13 @@ "@metamask/multichain-transactions-controller>@metamask/keyring-snap-client>uuid": true } }, + "@metamask/eth-snap-keyring>@metamask/keyring-snap-sdk": { + "packages": { + "@metamask/keyring-api": true, + "@metamask/keyring-utils": true, + "@metamask/superstruct": true + } + }, "@metamask/keyring-utils": { "globals": { "URL": true diff --git a/package.json b/package.json index 24eec28bcb41..5efee8b33991 100644 --- a/package.json +++ b/package.json @@ -295,7 +295,7 @@ "@metamask/eth-ledger-bridge-keyring": "11.1.2", "@metamask/eth-qr-keyring": "^1.1.0", "@metamask/eth-sig-util": "^8.2.0", - "@metamask/eth-snap-keyring": "^17.2.0", + "@metamask/eth-snap-keyring": "^17.3.0", "@metamask/eth-token-tracker": "^10.0.2", "@metamask/eth-trezor-keyring": "^9.0.0", "@metamask/etherscan-link": "^3.0.0", @@ -310,11 +310,11 @@ "@metamask/kernel-shims": "^0.3.0", "@metamask/kernel-ui": "^0.3.0", "@metamask/kernel-utils": "^0.3.0", - "@metamask/keyring-api": "^21.0.0", + "@metamask/keyring-api": "^21.1.0", "@metamask/keyring-controller": "^23.1.0", - "@metamask/keyring-internal-api": "^9.0.0", - "@metamask/keyring-internal-snap-client": "^7.0.0", - "@metamask/keyring-snap-client": "^8.0.0", + "@metamask/keyring-internal-api": "^9.1.0", + "@metamask/keyring-internal-snap-client": "^7.2.0", + "@metamask/keyring-snap-client": "^8.1.0", "@metamask/keyring-utils": "^3.1.0", "@metamask/logger": "^0.5.0", "@metamask/logging-controller": "^6.0.4", @@ -357,7 +357,7 @@ "@metamask/snaps-rpc-methods": "^13.5.2", "@metamask/snaps-sdk": "^10.0.0", "@metamask/snaps-utils": "^11.6.0", - "@metamask/solana-wallet-snap": "^2.4.2", + "@metamask/solana-wallet-snap": "^2.4.3", "@metamask/solana-wallet-standard": "^0.6.0", "@metamask/streams": "^0.4.0", "@metamask/subscription-controller": "^1.0.0", diff --git a/test/e2e/page-objects/pages/home/non-evm-homepage.ts b/test/e2e/page-objects/pages/home/non-evm-homepage.ts index 265204e91506..4ccca833f072 100644 --- a/test/e2e/page-objects/pages/home/non-evm-homepage.ts +++ b/test/e2e/page-objects/pages/home/non-evm-homepage.ts @@ -19,13 +19,13 @@ class NonEvmHomepage extends HomePage { await super.checkPageIsLoaded(); await this.driver.delay(regularDelayMs); // workaround to avoid flakiness if (amount) { - await this.driver.wait(async () => { - await this.driver.waitForSelector({ + await this.driver.waitForSelector( + { + css: this.balanceDiv, text: `${amount}`, - tag: 'span', - }); - return true; - }, 60000); + }, + { timeout: 30000 }, + ); } } @@ -62,16 +62,16 @@ class NonEvmHomepage extends HomePage { async checkGetBalance(balance: string, token: string = 'SOL'): Promise { await this.driver.waitForSelector( { + css: this.balanceDiv, text: balance, - tag: 'span', }, { timeout: 30000 }, ); await this.driver.waitForSelector( { + css: this.balanceDiv, text: token, - tag: 'span', }, { timeout: 30000 }, ); diff --git a/yarn.lock b/yarn.lock index b7d545651589..72d8d7d4b129 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6327,24 +6327,25 @@ __metadata: languageName: node linkType: hard -"@metamask/eth-snap-keyring@npm:^17.0.0, @metamask/eth-snap-keyring@npm:^17.2.0": - version: 17.2.0 - resolution: "@metamask/eth-snap-keyring@npm:17.2.0" +"@metamask/eth-snap-keyring@npm:^17.0.0, @metamask/eth-snap-keyring@npm:^17.3.0": + version: 17.3.0 + resolution: "@metamask/eth-snap-keyring@npm:17.3.0" dependencies: "@ethereumjs/tx": "npm:^5.4.0" "@metamask/base-controller": "npm:^8.3.0" "@metamask/eth-sig-util": "npm:^8.2.0" - "@metamask/keyring-api": "npm:^21.0.0" - "@metamask/keyring-internal-api": "npm:^9.0.0" - "@metamask/keyring-internal-snap-client": "npm:^7.1.0" + "@metamask/keyring-api": "npm:^21.1.0" + "@metamask/keyring-internal-api": "npm:^9.1.0" + "@metamask/keyring-internal-snap-client": "npm:^7.2.0" + "@metamask/keyring-snap-sdk": "npm:^7.1.0" "@metamask/keyring-utils": "npm:^3.1.0" "@metamask/superstruct": "npm:^3.1.0" "@metamask/utils": "npm:^11.1.0" "@types/uuid": "npm:^9.0.8" uuid: "npm:^9.0.1" peerDependencies: - "@metamask/keyring-api": ^21.0.0 - checksum: 10/5ef553d895fb1416fee5dafa8424d0d3770ab4271924902f50c3f03652b5e6104aa60cbdaf3a37fdb9cbba4fe86bc3b87ce589f5d14d1b2b8cd671b420a2c922 + "@metamask/keyring-api": ^21.1.0 + checksum: 10/a9ab4e08acb008ac1d5f7d78a0eb194aa03d125a5fea56dc74fb2978186a1a540b5c75108a9fd035c1a95291916111eb410e3645037aee55a09952c31f6322ae languageName: node linkType: hard @@ -6742,15 +6743,15 @@ __metadata: languageName: node linkType: hard -"@metamask/keyring-api@npm:^21.0.0": - version: 21.0.0 - resolution: "@metamask/keyring-api@npm:21.0.0" +"@metamask/keyring-api@npm:^21.0.0, @metamask/keyring-api@npm:^21.1.0": + version: 21.1.0 + resolution: "@metamask/keyring-api@npm:21.1.0" dependencies: "@metamask/keyring-utils": "npm:^3.1.0" "@metamask/superstruct": "npm:^3.1.0" "@metamask/utils": "npm:^11.1.0" bitcoin-address-validation: "npm:^2.2.3" - checksum: 10/896f3f54080f0a450d47df63bfae93d2dd4e7e1bb8aa35c365e46ea6fd32c3fa27753611de095e9f6feae5d526e911e665628c8b304cb2120cb870f2e82ab095 + checksum: 10/3371a5ab0e9ba0e9b23b30b03a7d83d029e223def5485ab1aa2ec793ba18ff3738422dbe3c47f9cf82411d2ca6ca918928bf998741f0977055071b7bf3042314 languageName: node linkType: hard @@ -6803,27 +6804,27 @@ __metadata: languageName: node linkType: hard -"@metamask/keyring-internal-api@npm:^9.0.0": - version: 9.0.0 - resolution: "@metamask/keyring-internal-api@npm:9.0.0" +"@metamask/keyring-internal-api@npm:^9.0.0, @metamask/keyring-internal-api@npm:^9.1.0": + version: 9.1.0 + resolution: "@metamask/keyring-internal-api@npm:9.1.0" dependencies: - "@metamask/keyring-api": "npm:^21.0.0" + "@metamask/keyring-api": "npm:^21.1.0" "@metamask/keyring-utils": "npm:^3.1.0" "@metamask/superstruct": "npm:^3.1.0" - checksum: 10/2603a3ffa42d53d2c621846288e759e9df2062fb6d46444466062915dbeda5fb3ec5344a48c1d282d37c6a689d7332e953c955be93f10e4bd56879c29ca2bf26 + checksum: 10/6b19f35f57bc1b5dc73957d7f3185236780c93e6292678e22d84f9eb2fe92e15a98437a9bc4fbe5e5e10143d4db36afa2c420636f2cca4bd984e8455ca4332c6 languageName: node linkType: hard -"@metamask/keyring-internal-snap-client@npm:^7.0.0, @metamask/keyring-internal-snap-client@npm:^7.1.0": - version: 7.1.0 - resolution: "@metamask/keyring-internal-snap-client@npm:7.1.0" +"@metamask/keyring-internal-snap-client@npm:^7.2.0": + version: 7.2.0 + resolution: "@metamask/keyring-internal-snap-client@npm:7.2.0" dependencies: "@metamask/base-controller": "npm:^8.3.0" - "@metamask/keyring-api": "npm:^21.0.0" - "@metamask/keyring-internal-api": "npm:^9.0.0" - "@metamask/keyring-snap-client": "npm:^8.0.0" + "@metamask/keyring-api": "npm:^21.1.0" + "@metamask/keyring-internal-api": "npm:^9.1.0" + "@metamask/keyring-snap-client": "npm:^8.1.0" "@metamask/keyring-utils": "npm:^3.1.0" - checksum: 10/4ac11ecbcf9394de606e35e4b3b666026c6eecf8885ae2ee2185c3a5fa26065e3905374343f8cc2b89c2f9ef0d2519be2cabaec7315b2c15fcd583e353c211df + checksum: 10/ed290df433672dc0686386e23f1e4b98a7bfb033498ffab502b682f6d5414deae23383979e5979ad490032876eb859d21d9f768dfd24f6d02045ad10d2baf29b languageName: node linkType: hard @@ -6843,11 +6844,11 @@ __metadata: languageName: node linkType: hard -"@metamask/keyring-snap-client@npm:^8.0.0": - version: 8.0.0 - resolution: "@metamask/keyring-snap-client@npm:8.0.0" +"@metamask/keyring-snap-client@npm:^8.0.0, @metamask/keyring-snap-client@npm:^8.1.0": + version: 8.1.0 + resolution: "@metamask/keyring-snap-client@npm:8.1.0" dependencies: - "@metamask/keyring-api": "npm:^21.0.0" + "@metamask/keyring-api": "npm:^21.1.0" "@metamask/keyring-utils": "npm:^3.1.0" "@metamask/superstruct": "npm:^3.1.0" "@types/uuid": "npm:^9.0.8" @@ -6855,7 +6856,23 @@ __metadata: webextension-polyfill: "npm:^0.12.0" peerDependencies: "@metamask/providers": ^19.0.0 - checksum: 10/f8735df636554f6c4c387126e033dcca7952f9278cadcaedb693a9ced5402ed21f6a64b14892b65b41b14facf9c6579b477b7fe42d8c602600d5d189206ce377 + checksum: 10/e92aa7f6e1454150870e8e0a6d9cf4fac7bbc22280d85a252ca7ee428842dfbaaaccae78dfc5ad773e21d757febfcbe6933a72b966c4478f1a2b3fc0088419a1 + languageName: node + linkType: hard + +"@metamask/keyring-snap-sdk@npm:^7.1.0": + version: 7.1.0 + resolution: "@metamask/keyring-snap-sdk@npm:7.1.0" + dependencies: + "@metamask/keyring-utils": "npm:^3.1.0" + "@metamask/snaps-sdk": "npm:^9.0.0" + "@metamask/superstruct": "npm:^3.1.0" + "@metamask/utils": "npm:^11.1.0" + webextension-polyfill: "npm:^0.12.0" + peerDependencies: + "@metamask/keyring-api": ^21.1.0 + "@metamask/providers": ^19.0.0 + checksum: 10/1a1809733c1f21af87f3491d292c499c5441afa0780e848718ec2b6aff50d76bb03ea44ee93ecaa80d79453a98926d84cd13ff406256ab6a2136d9e31250faa8 languageName: node linkType: hard @@ -7869,10 +7886,10 @@ __metadata: languageName: node linkType: hard -"@metamask/solana-wallet-snap@npm:^2.4.2": - version: 2.4.2 - resolution: "@metamask/solana-wallet-snap@npm:2.4.2" - checksum: 10/a571aa488afb7f29644be72392926c18d067022f7e2837f9b9253d228c518e499b8c2ca07b4397f02a3eb61c7c4d77e5f0f6997fbc41f3c6060d359293291e6e +"@metamask/solana-wallet-snap@npm:^2.4.3": + version: 2.4.3 + resolution: "@metamask/solana-wallet-snap@npm:2.4.3" + checksum: 10/09d6d672c26cb4ae750d2e2a6436ef21fa7f6967dedde8d1511b6a1d11d7f8fc7f60077fa2c3259c1a05c02d7cf3b2289de61d37ea85d0202ae2c4f94d68e97c languageName: node linkType: hard @@ -31872,7 +31889,7 @@ __metadata: "@metamask/eth-ledger-bridge-keyring": "npm:11.1.2" "@metamask/eth-qr-keyring": "npm:^1.1.0" "@metamask/eth-sig-util": "npm:^8.2.0" - "@metamask/eth-snap-keyring": "npm:^17.2.0" + "@metamask/eth-snap-keyring": "npm:^17.3.0" "@metamask/eth-token-tracker": "npm:^10.0.2" "@metamask/eth-trezor-keyring": "npm:^9.0.0" "@metamask/etherscan-link": "npm:^3.0.0" @@ -31889,11 +31906,11 @@ __metadata: "@metamask/kernel-shims": "npm:^0.3.0" "@metamask/kernel-ui": "npm:^0.3.0" "@metamask/kernel-utils": "npm:^0.3.0" - "@metamask/keyring-api": "npm:^21.0.0" + "@metamask/keyring-api": "npm:^21.1.0" "@metamask/keyring-controller": "npm:^23.1.0" - "@metamask/keyring-internal-api": "npm:^9.0.0" - "@metamask/keyring-internal-snap-client": "npm:^7.0.0" - "@metamask/keyring-snap-client": "npm:^8.0.0" + "@metamask/keyring-internal-api": "npm:^9.1.0" + "@metamask/keyring-internal-snap-client": "npm:^7.2.0" + "@metamask/keyring-snap-client": "npm:^8.1.0" "@metamask/keyring-utils": "npm:^3.1.0" "@metamask/logger": "npm:^0.5.0" "@metamask/logging-controller": "npm:^6.0.4" @@ -31939,7 +31956,7 @@ __metadata: "@metamask/snaps-rpc-methods": "npm:^13.5.2" "@metamask/snaps-sdk": "npm:^10.0.0" "@metamask/snaps-utils": "npm:^11.6.0" - "@metamask/solana-wallet-snap": "npm:^2.4.2" + "@metamask/solana-wallet-snap": "npm:^2.4.3" "@metamask/solana-wallet-standard": "npm:^0.6.0" "@metamask/streams": "npm:^0.4.0" "@metamask/subscription-controller": "npm:^1.0.0"