From f22848c363c045ff7c32ae76bf5c06accc44596c Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Wed, 10 Sep 2025 00:31:00 +0200 Subject: [PATCH 01/11] refactor: migrate MultichainAccountService to @metamask/messenger --- .../multichain-account-service/CHANGELOG.md | 5 + .../multichain-account-service/package.json | 1 + .../src/MultichainAccountService.test.ts | 126 ++++++++++-------- .../src/providers/EvmAccountProvider.test.ts | 18 +-- .../src/providers/SolAccountProvider.test.ts | 18 +-- .../src/tests/messenger.ts | 71 ++++++---- .../multichain-account-service/src/types.ts | 12 +- yarn.lock | 1 + 8 files changed, 131 insertions(+), 121 deletions(-) diff --git a/packages/multichain-account-service/CHANGELOG.md b/packages/multichain-account-service/CHANGELOG.md index 5c43ecc56a6..259dfe8031f 100644 --- a/packages/multichain-account-service/CHANGELOG.md +++ b/packages/multichain-account-service/CHANGELOG.md @@ -13,6 +13,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add `multichainAccountGroupCreated` event emitted from wallet level when new groups are created. - Add `multichainAccountGroupUpdated` event emitted from wallet level when groups are synchronized. +### Changed + +- **BREAKING:** Use new `Messenger` from `@metamask/messenger` ([#6544](https://github.com/MetaMask/core/pull/6544)) + - Previously, `MultichainAccountService` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`. + ## [0.7.0] ### Added diff --git a/packages/multichain-account-service/package.json b/packages/multichain-account-service/package.json index ed2d142c934..2a7abd11350 100644 --- a/packages/multichain-account-service/package.json +++ b/packages/multichain-account-service/package.json @@ -53,6 +53,7 @@ "@metamask/keyring-internal-api": "^8.1.0", "@metamask/keyring-snap-client": "^7.0.0", "@metamask/keyring-utils": "^3.1.0", + "@metamask/messenger": "^0.2.0", "@metamask/snaps-sdk": "^9.0.0", "@metamask/snaps-utils": "^11.0.0", "@metamask/superstruct": "^3.1.0", diff --git a/packages/multichain-account-service/src/MultichainAccountService.test.ts b/packages/multichain-account-service/src/MultichainAccountService.test.ts index 1b2562dda1f..dad09cfe618 100644 --- a/packages/multichain-account-service/src/MultichainAccountService.test.ts +++ b/packages/multichain-account-service/src/MultichainAccountService.test.ts @@ -1,6 +1,5 @@ /* eslint-disable jsdoc/require-jsdoc */ -import type { Messenger } from '@metamask/base-controller'; import type { KeyringAccount } from '@metamask/keyring-api'; import { EthAccountType, SolAccountType } from '@metamask/keyring-api'; import { KeyringTypes, type KeyringObject } from '@metamask/keyring-controller'; @@ -27,14 +26,9 @@ import { makeMockAccountProvider, mockAsInternalAccount, setupAccountProvider, + type RootMessenger, } from './tests'; -import type { - AllowedActions, - AllowedEvents, - MultichainAccountServiceActions, - MultichainAccountServiceEvents, - MultichainAccountServiceMessenger, -} from './types'; +import type { MultichainAccountServiceMessenger } from './types'; // Mock providers. jest.mock('./providers/EvmAccountProvider', () => { @@ -80,22 +74,17 @@ function mockAccountProvider( } function setup({ - messenger = getRootMessenger(), + rootMessenger = getRootMessenger(), keyrings = [MOCK_HD_KEYRING_1, MOCK_HD_KEYRING_2], accounts, }: { - messenger?: Messenger< - MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents - >; + rootMessenger?: RootMessenger; keyrings?: KeyringObject[]; accounts?: KeyringAccount[]; } = {}): { service: MultichainAccountService; - messenger: Messenger< - MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents - >; + rootMessenger: RootMessenger; + messenger: MultichainAccountServiceMessenger; mocks: Mocks; } { const mocks: Mocks = { @@ -118,7 +107,7 @@ function setup({ keyrings: mocks.KeyringController.keyrings, })); - messenger.registerActionHandler( + rootMessenger.registerActionHandler( 'KeyringController:getState', mocks.KeyringController.getState, ); @@ -128,7 +117,7 @@ function setup({ () => accounts, ); - messenger.registerActionHandler( + rootMessenger.registerActionHandler( 'AccountsController:listMultichainAccounts', mocks.AccountsController.listMultichainAccounts, ); @@ -147,12 +136,20 @@ function setup({ ); } + const messenger = getMultichainAccountServiceMessenger(rootMessenger); + const service = new MultichainAccountService({ - messenger: getMultichainAccountServiceMessenger(messenger), + messenger, }); + service.init(); - return { service, messenger, mocks }; + return { + service, + rootMessenger, + messenger, + mocks, + }; } describe('MultichainAccountService', () => { @@ -365,7 +362,7 @@ describe('MultichainAccountService', () => { it('syncs the appropriate wallet and update reverse mapping on AccountsController:accountAdded', () => { const accounts = [account1, account3]; // No `account2` for now. - const { service, messenger, mocks } = setup({ accounts, keyrings }); + const { service, rootMessenger, mocks } = setup({ accounts, keyrings }); const wallet1 = service.getMultichainAccountWallet({ entropySource: entropy1, @@ -374,7 +371,7 @@ describe('MultichainAccountService', () => { // Now we're adding `account2`. mocks.EvmAccountProvider.accounts = [account1, account2]; - messenger.publish( + rootMessenger.publish( 'AccountsController:accountAdded', mockAsInternalAccount(account2), ); @@ -405,7 +402,7 @@ describe('MultichainAccountService', () => { .get(); const accounts = [account1]; // No `otherAccount1` for now. - const { service, messenger, mocks } = setup({ accounts, keyrings }); + const { service, rootMessenger, mocks } = setup({ accounts, keyrings }); const wallet1 = service.getMultichainAccountWallet({ entropySource: entropy1, @@ -414,7 +411,7 @@ describe('MultichainAccountService', () => { // Now we're adding `account2`. mocks.EvmAccountProvider.accounts = [account1, otherAccount1]; - messenger.publish( + rootMessenger.publish( 'AccountsController:accountAdded', mockAsInternalAccount(otherAccount1), ); @@ -446,12 +443,12 @@ describe('MultichainAccountService', () => { .get(); const accounts = [account1]; // No `otherAccount1` for now. - const { messenger, mocks } = setup({ accounts, keyrings }); + const { rootMessenger, messenger, mocks } = setup({ accounts, keyrings }); const publishSpy = jest.spyOn(messenger, 'publish'); // Now we're adding `otherAccount1` to an existing group. mocks.EvmAccountProvider.accounts = [account1, otherAccount1]; - messenger.publish( + rootMessenger.publish( 'AccountsController:accountAdded', mockAsInternalAccount(otherAccount1), ); @@ -465,7 +462,7 @@ describe('MultichainAccountService', () => { it('creates new detected wallets and update reverse mapping on AccountsController:accountAdded', () => { const accounts = [account1, account2]; // No `account3` for now (associated with "Wallet 2"). - const { service, messenger, mocks } = setup({ + const { service, rootMessenger, mocks } = setup({ accounts, keyrings: [keyring1], }); @@ -483,7 +480,7 @@ describe('MultichainAccountService', () => { // Now we're adding `account3`. mocks.KeyringController.keyrings = [keyring1, keyring2]; mocks.EvmAccountProvider.accounts = [account1, account2, account3]; - messenger.publish( + rootMessenger.publish( 'AccountsController:accountAdded', mockAsInternalAccount(account3), ); @@ -507,7 +504,10 @@ describe('MultichainAccountService', () => { it('ignores non-BIP-44 accounts on AccountsController:accountAdded', () => { const accounts = [account1]; - const { service, messenger } = setup({ accounts, keyrings }); + const { service, rootMessenger } = setup({ + accounts, + keyrings, + }); const wallet1 = service.getMultichainAccountWallet({ entropySource: entropy1, @@ -517,7 +517,7 @@ describe('MultichainAccountService', () => { expect(oldMultichainAccounts[0].getAccounts()).toHaveLength(1); // Now we're publishing a new account that is not BIP-44 compatible. - messenger.publish( + rootMessenger.publish( 'AccountsController:accountAdded', mockAsInternalAccount(MOCK_SNAP_ACCOUNT_2), ); @@ -529,7 +529,7 @@ describe('MultichainAccountService', () => { it('syncs the appropriate wallet and update reverse mapping on AccountsController:accountRemoved', () => { const accounts = [account1, account2]; - const { service, messenger, mocks } = setup({ accounts, keyrings }); + const { service, rootMessenger, mocks } = setup({ accounts, keyrings }); const wallet1 = service.getMultichainAccountWallet({ entropySource: entropy1, @@ -538,7 +538,7 @@ describe('MultichainAccountService', () => { // Now we're removing `account2`. mocks.EvmAccountProvider.accounts = [account1]; - messenger.publish('AccountsController:accountRemoved', account2.id); + rootMessenger.publish('AccountsController:accountRemoved', account2.id); expect(wallet1.getMultichainAccountGroups()).toHaveLength(1); const walletAndMultichainAccount2 = service.getAccountContext( @@ -572,7 +572,9 @@ describe('MultichainAccountService', () => { .withGroupIndex(0) .get(); - const { service, messenger } = setup({ accounts: [mockEvmAccount] }); + const { service, messenger } = setup({ + accounts: [mockEvmAccount], + }); const publishSpy = jest.spyOn(messenger, 'publish'); const nextGroup = await service.createNextMultichainAccountGroup({ @@ -626,7 +628,9 @@ describe('MultichainAccountService', () => { .withGroupIndex(0) .get(); - const { service, messenger } = setup({ accounts: [mockEvmAccount] }); + const { service, messenger } = setup({ + accounts: [mockEvmAccount], + }); const publishSpy = jest.spyOn(messenger, 'publish'); const group = await service.createMultichainAccountGroup({ @@ -747,9 +751,9 @@ describe('MultichainAccountService', () => { describe('actions', () => { it('gets a multichain account with MultichainAccountService:getMultichainAccount', () => { const accounts = [MOCK_HD_ACCOUNT_1]; - const { messenger } = setup({ accounts }); + const { rootMessenger } = setup({ accounts }); - const group = messenger.call( + const group = rootMessenger.call( 'MultichainAccountService:getMultichainAccountGroup', { entropySource: MOCK_HD_KEYRING_1.metadata.id, groupIndex: 0 }, ); @@ -758,9 +762,9 @@ describe('MultichainAccountService', () => { it('gets multichain accounts with MultichainAccountService:getMultichainAccounts', () => { const accounts = [MOCK_HD_ACCOUNT_1]; - const { messenger } = setup({ accounts }); + const { rootMessenger } = setup({ accounts }); - const groups = messenger.call( + const groups = rootMessenger.call( 'MultichainAccountService:getMultichainAccountGroups', { entropySource: MOCK_HD_KEYRING_1.metadata.id }, ); @@ -769,9 +773,9 @@ describe('MultichainAccountService', () => { it('gets multichain account wallet with MultichainAccountService:getMultichainAccountWallet', () => { const accounts = [MOCK_HD_ACCOUNT_1]; - const { messenger } = setup({ accounts }); + const { rootMessenger } = setup({ accounts }); - const wallet = messenger.call( + const wallet = rootMessenger.call( 'MultichainAccountService:getMultichainAccountWallet', { entropySource: MOCK_HD_KEYRING_1.metadata.id }, ); @@ -780,9 +784,9 @@ describe('MultichainAccountService', () => { it('gets multichain account wallet with MultichainAccountService:getMultichainAccountWallets', () => { const accounts = [MOCK_HD_ACCOUNT_1]; - const { messenger } = setup({ accounts }); + const { rootMessenger } = setup({ accounts }); - const wallets = messenger.call( + const wallets = rootMessenger.call( 'MultichainAccountService:getMultichainAccountWallets', ); expect(wallets.length).toBeGreaterThan(0); @@ -790,9 +794,9 @@ describe('MultichainAccountService', () => { it('create the next multichain account group with MultichainAccountService:createNextMultichainAccountGroup', async () => { const accounts = [MOCK_HD_ACCOUNT_1]; - const { messenger } = setup({ accounts }); + const { rootMessenger } = setup({ accounts }); - const nextGroup = await messenger.call( + const nextGroup = await rootMessenger.call( 'MultichainAccountService:createNextMultichainAccountGroup', { entropySource: MOCK_HD_KEYRING_1.metadata.id }, ); @@ -803,9 +807,9 @@ describe('MultichainAccountService', () => { it('creates a multichain account group with MultichainAccountService:createMultichainAccountGroup', async () => { const accounts = [MOCK_HD_ACCOUNT_1]; - const { messenger } = setup({ accounts }); + const { rootMessenger } = setup({ accounts }); - const firstGroup = await messenger.call( + const firstGroup = await rootMessenger.call( 'MultichainAccountService:createMultichainAccountGroup', { entropySource: MOCK_HD_KEYRING_1.metadata.id, @@ -827,11 +831,11 @@ describe('MultichainAccountService', () => { .withEntropySource(MOCK_HD_KEYRING_2.metadata.id) .withGroupIndex(0) .get(); - const { messenger, mocks } = setup({ + const { rootMessenger, mocks } = setup({ accounts: [mockEvmAccount1, mockSolAccount1], }); - await messenger.call( + await rootMessenger.call( 'MultichainAccountService:alignWallet', MOCK_HD_KEYRING_1.metadata.id, ); @@ -852,11 +856,11 @@ describe('MultichainAccountService', () => { .withEntropySource(MOCK_HD_KEYRING_2.metadata.id) .withGroupIndex(0) .get(); - const { messenger, mocks } = setup({ + const { rootMessenger, mocks } = setup({ accounts: [mockEvmAccount1, mockSolAccount1], }); - await messenger.call('MultichainAccountService:alignWallets'); + await rootMessenger.call('MultichainAccountService:alignWallets'); expect(mocks.EvmAccountProvider.createAccounts).toHaveBeenCalledWith({ entropySource: MOCK_HD_KEYRING_2.metadata.id, @@ -869,17 +873,19 @@ describe('MultichainAccountService', () => { }); it('sets basic functionality with MultichainAccountService:setBasicFunctionality', async () => { - const { messenger } = setup({ accounts: [MOCK_HD_ACCOUNT_1] }); + const { rootMessenger } = setup({ + accounts: [MOCK_HD_ACCOUNT_1], + }); // This tests the action handler registration expect( - await messenger.call( + await rootMessenger.call( 'MultichainAccountService:setBasicFunctionality', true, ), ).toBeUndefined(); expect( - await messenger.call( + await rootMessenger.call( 'MultichainAccountService:setBasicFunctionality', false, ), @@ -887,11 +893,11 @@ describe('MultichainAccountService', () => { }); it('gets alignment progress with MultichainAccountService:getIsAlignmentInProgress', () => { - const { messenger } = setup({ + const { rootMessenger } = setup({ accounts: [MOCK_HD_ACCOUNT_1], }); - const isInProgress = messenger.call( + const isInProgress = rootMessenger.call( 'MultichainAccountService:getIsAlignmentInProgress', ); @@ -920,11 +926,13 @@ describe('MultichainAccountService', () => { let solProvider: SolAccountProvider; beforeEach(() => { - const { messenger } = setup({ accounts: [MOCK_HD_ACCOUNT_1] }); + const { rootMessenger } = setup({ + accounts: [MOCK_HD_ACCOUNT_1], + }); // Create actual SolAccountProvider instance for wrapping solProvider = new SolAccountProvider( - getMultichainAccountServiceMessenger(messenger), + getMultichainAccountServiceMessenger(rootMessenger), ); // Spy on the provider methods @@ -935,7 +943,7 @@ describe('MultichainAccountService', () => { jest.spyOn(solProvider, 'isAccountCompatible'); wrapper = new AccountProviderWrapper( - getMultichainAccountServiceMessenger(messenger), + getMultichainAccountServiceMessenger(rootMessenger), solProvider, ); }); diff --git a/packages/multichain-account-service/src/providers/EvmAccountProvider.test.ts b/packages/multichain-account-service/src/providers/EvmAccountProvider.test.ts index b75b7e80221..b4efb05cbe3 100644 --- a/packages/multichain-account-service/src/providers/EvmAccountProvider.test.ts +++ b/packages/multichain-account-service/src/providers/EvmAccountProvider.test.ts @@ -1,4 +1,3 @@ -import type { Messenger } from '@metamask/base-controller'; import { type KeyringMetadata } from '@metamask/keyring-controller'; import type { EthKeyring, @@ -17,13 +16,8 @@ import { MOCK_HD_ACCOUNT_2, MOCK_HD_KEYRING_1, MockAccountBuilder, + type RootMessenger, } from '../tests'; -import type { - AllowedActions, - AllowedEvents, - MultichainAccountServiceActions, - MultichainAccountServiceEvents, -} from '../types'; class MockEthKeyring implements EthKeyring { readonly type = 'MockEthKeyring'; @@ -90,17 +84,11 @@ function setup({ messenger = getRootMessenger(), accounts = [], }: { - messenger?: Messenger< - MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents - >; + messenger?: RootMessenger; accounts?: InternalAccount[]; } = {}): { provider: EvmAccountProvider; - messenger: Messenger< - MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents - >; + messenger: RootMessenger; keyring: MockEthKeyring; mocks: { getAccountByAddress: jest.Mock; diff --git a/packages/multichain-account-service/src/providers/SolAccountProvider.test.ts b/packages/multichain-account-service/src/providers/SolAccountProvider.test.ts index 52720d5d62e..7b8a9167512 100644 --- a/packages/multichain-account-service/src/providers/SolAccountProvider.test.ts +++ b/packages/multichain-account-service/src/providers/SolAccountProvider.test.ts @@ -1,5 +1,4 @@ import { isBip44Account } from '@metamask/account-api'; -import type { Messenger } from '@metamask/base-controller'; import type { SnapKeyring } from '@metamask/eth-snap-keyring'; import type { KeyringMetadata } from '@metamask/keyring-controller'; import type { @@ -17,13 +16,8 @@ import { MOCK_SOL_ACCOUNT_1, MOCK_SOL_DISCOVERED_ACCOUNT_1, MockAccountBuilder, + type RootMessenger, } from '../tests'; -import type { - AllowedActions, - AllowedEvents, - MultichainAccountServiceActions, - MultichainAccountServiceEvents, -} from '../types'; class MockSolanaKeyring { readonly type = 'MockSolanaKeyring'; @@ -94,17 +88,11 @@ function setup({ messenger = getRootMessenger(), accounts = [], }: { - messenger?: Messenger< - MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents - >; + messenger?: RootMessenger; accounts?: InternalAccount[]; } = {}): { provider: AccountProviderWrapper; - messenger: Messenger< - MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents - >; + messenger: RootMessenger; keyring: MockSolanaKeyring; mocks: { handleRequest: jest.Mock; diff --git a/packages/multichain-account-service/src/tests/messenger.ts b/packages/multichain-account-service/src/tests/messenger.ts index 92922839293..cb3c40903a9 100644 --- a/packages/multichain-account-service/src/tests/messenger.ts +++ b/packages/multichain-account-service/src/tests/messenger.ts @@ -1,42 +1,57 @@ -import { Messenger } from '@metamask/base-controller'; +import { + Messenger, + MOCK_ANY_NAMESPACE, + type MessengerActions, + type MessengerEvents, + type MockAnyNamespace, +} from '@metamask/messenger'; -import type { - AllowedActions, - AllowedEvents, - MultichainAccountServiceActions, - MultichainAccountServiceEvents, - MultichainAccountServiceMessenger, -} from '../types'; +import type { MultichainAccountServiceMessenger } from '../types'; + +type AllMultichainAccountServiceActions = + MessengerActions; + +type AllMultichainAccountServiceEvents = + MessengerEvents; + +export type RootMessenger = Messenger< + MockAnyNamespace, + AllMultichainAccountServiceActions, + AllMultichainAccountServiceEvents +>; /** - * Creates a new root messenger instance for testing. + * Creates and returns a root messenger for testing * - * @returns A new Messenger instance. + * @returns A messenger instance */ -export function getRootMessenger() { - return new Messenger< - MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents - >(); +export function getRootMessenger(): RootMessenger { + return new Messenger({ + namespace: MOCK_ANY_NAMESPACE, + }); } /** * Retrieves a restricted messenger for the MultichainAccountService. * - * @param messenger - The root messenger instance. Defaults to a new Messenger created by getRootMessenger(). + * @param rootMessenger - The root messenger instance. Defaults to a new Messenger created by getRootMessenger(). * @returns The restricted messenger for the MultichainAccountService. */ export function getMultichainAccountServiceMessenger( - messenger: ReturnType, + rootMessenger: RootMessenger, ): MultichainAccountServiceMessenger { - return messenger.getRestricted({ - name: 'MultichainAccountService', - allowedEvents: [ - 'KeyringController:stateChange', - 'AccountsController:accountAdded', - 'AccountsController:accountRemoved', - ], - allowedActions: [ + const messenger = new Messenger< + 'MultichainAccountService', + AllMultichainAccountServiceActions, + AllMultichainAccountServiceEvents, + RootMessenger + >({ + namespace: 'MultichainAccountService', + parent: rootMessenger, + }); + rootMessenger.delegate({ + messenger, + actions: [ 'AccountsController:getAccount', 'AccountsController:getAccountByAddress', 'AccountsController:listMultichainAccounts', @@ -46,5 +61,11 @@ export function getMultichainAccountServiceMessenger( 'NetworkController:findNetworkClientIdByChainId', 'NetworkController:getNetworkClientById', ], + events: [ + 'KeyringController:stateChange', + 'AccountsController:accountAdded', + 'AccountsController:accountRemoved', + ], }); + return messenger; } diff --git a/packages/multichain-account-service/src/types.ts b/packages/multichain-account-service/src/types.ts index 3249f063772..ed0a1990f64 100644 --- a/packages/multichain-account-service/src/types.ts +++ b/packages/multichain-account-service/src/types.ts @@ -9,13 +9,13 @@ import type { AccountsControllerGetAccountByAddressAction, AccountsControllerListMultichainAccountsAction, } from '@metamask/accounts-controller'; -import type { RestrictedMessenger } from '@metamask/base-controller'; import type { KeyringAccount } from '@metamask/keyring-api'; import type { KeyringControllerGetStateAction, KeyringControllerStateChangeEvent, KeyringControllerWithKeyringAction, } from '@metamask/keyring-controller'; +import type { Messenger } from '@metamask/messenger'; import type { NetworkControllerFindNetworkClientIdByChainIdAction, NetworkControllerGetNetworkClientByIdAction, @@ -115,7 +115,7 @@ export type MultichainAccountServiceEvents = * All actions registered by other modules that {@link MultichainAccountService} * calls. */ -export type AllowedActions = +type AllowedActions = | AccountsControllerListMultichainAccountsAction | AccountsControllerGetAccountAction | AccountsControllerGetAccountByAddressAction @@ -129,7 +129,7 @@ export type AllowedActions = * All events published by other modules that {@link MultichainAccountService} * subscribes to. */ -export type AllowedEvents = +type AllowedEvents = | KeyringControllerStateChangeEvent | AccountsControllerAccountAddedEvent | AccountsControllerAccountRemovedEvent; @@ -138,10 +138,8 @@ export type AllowedEvents = * The messenger restricted to actions and events that * {@link MultichainAccountService} needs to access. */ -export type MultichainAccountServiceMessenger = RestrictedMessenger< +export type MultichainAccountServiceMessenger = Messenger< 'MultichainAccountService', MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents, - AllowedActions['type'], - AllowedEvents['type'] + MultichainAccountServiceEvents | AllowedEvents >; diff --git a/yarn.lock b/yarn.lock index 0cf2a57b624..b81d3e6dc76 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3829,6 +3829,7 @@ __metadata: "@metamask/keyring-internal-api": "npm:^8.1.0" "@metamask/keyring-snap-client": "npm:^7.0.0" "@metamask/keyring-utils": "npm:^3.1.0" + "@metamask/messenger": "npm:^0.2.0" "@metamask/providers": "npm:^22.1.0" "@metamask/snaps-controllers": "npm:^14.0.1" "@metamask/snaps-sdk": "npm:^9.0.0" From f823aa3d6311005cf49c41c2c5c5a4ff0432ca73 Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Tue, 7 Oct 2025 15:20:09 +0200 Subject: [PATCH 02/11] chore: bump @metmask/messenger to 0.3.0 --- packages/multichain-account-service/package.json | 2 +- packages/multichain-account-service/tsconfig.build.json | 3 ++- packages/multichain-account-service/tsconfig.json | 3 ++- yarn.lock | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/multichain-account-service/package.json b/packages/multichain-account-service/package.json index ae19353be28..6686f1b1a45 100644 --- a/packages/multichain-account-service/package.json +++ b/packages/multichain-account-service/package.json @@ -55,7 +55,7 @@ "@metamask/keyring-internal-api": "^9.0.0", "@metamask/keyring-snap-client": "^8.0.0", "@metamask/keyring-utils": "^3.1.0", - "@metamask/messenger": "^0.2.0", + "@metamask/messenger": "^0.3.0", "@metamask/snaps-sdk": "^9.0.0", "@metamask/snaps-utils": "^11.0.0", "@metamask/superstruct": "^3.1.0", diff --git a/packages/multichain-account-service/tsconfig.build.json b/packages/multichain-account-service/tsconfig.build.json index c01fbe218d1..006207ec850 100644 --- a/packages/multichain-account-service/tsconfig.build.json +++ b/packages/multichain-account-service/tsconfig.build.json @@ -8,7 +8,8 @@ "references": [ { "path": "../base-controller/tsconfig.build.json" }, { "path": "../accounts-controller/tsconfig.build.json" }, - { "path": "../keyring-controller/tsconfig.build.json" } + { "path": "../keyring-controller/tsconfig.build.json" }, + { "path": "../messenger/tsconfig.build.json" } ], "include": ["../../types", "./src"] } diff --git a/packages/multichain-account-service/tsconfig.json b/packages/multichain-account-service/tsconfig.json index c67da70b6eb..e1b9b25e4a4 100644 --- a/packages/multichain-account-service/tsconfig.json +++ b/packages/multichain-account-service/tsconfig.json @@ -6,7 +6,8 @@ "references": [ { "path": "../base-controller" }, { "path": "../accounts-controller" }, - { "path": "../keyring-controller" } + { "path": "../keyring-controller" }, + { "path": "../messenger" } ], "include": ["../../types", "./src"] } diff --git a/yarn.lock b/yarn.lock index f2f6e651c7f..6994e56d5b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3861,7 +3861,7 @@ __metadata: "@metamask/keyring-internal-api": "npm:^9.0.0" "@metamask/keyring-snap-client": "npm:^8.0.0" "@metamask/keyring-utils": "npm:^3.1.0" - "@metamask/messenger": "npm:^0.2.0" + "@metamask/messenger": "npm:^0.3.0" "@metamask/providers": "npm:^22.1.0" "@metamask/snaps-controllers": "npm:^14.0.1" "@metamask/snaps-sdk": "npm:^9.0.0" From f9fc126e957d3e3afba7fc43564109328eb2cdab Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Tue, 7 Oct 2025 15:24:29 +0200 Subject: [PATCH 03/11] fix: MultichainAccountGroup.test.ts --- .../src/MultichainAccountGroup.test.ts | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/packages/multichain-account-service/src/MultichainAccountGroup.test.ts b/packages/multichain-account-service/src/MultichainAccountGroup.test.ts index ae915804aaa..7153f6d9b3a 100644 --- a/packages/multichain-account-service/src/MultichainAccountGroup.test.ts +++ b/packages/multichain-account-service/src/MultichainAccountGroup.test.ts @@ -22,13 +22,8 @@ import { setupNamedAccountProvider, getMultichainAccountServiceMessenger, getRootMessenger, + type RootMessenger, } from './tests'; -import type { - AllowedActions, - AllowedEvents, - MultichainAccountServiceActions, - MultichainAccountServiceEvents, -} from './types'; function setup({ groupIndex = 0, @@ -44,10 +39,7 @@ function setup({ ], }: { groupIndex?: number; - messenger?: Messenger< - MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents - >; + messenger?: RootMessenger; accounts?: InternalAccount[][]; } = {}): { wallet: MultichainAccountWallet>; From 04a52680703afdc15eb602f1de1183fda3af685e Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Tue, 7 Oct 2025 15:29:25 +0200 Subject: [PATCH 04/11] fix: MultichainAccountGroup.test.ts --- .../src/MultichainAccountService.test.ts | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/multichain-account-service/src/MultichainAccountService.test.ts b/packages/multichain-account-service/src/MultichainAccountService.test.ts index 60728878563..875c8255721 100644 --- a/packages/multichain-account-service/src/MultichainAccountService.test.ts +++ b/packages/multichain-account-service/src/MultichainAccountService.test.ts @@ -211,17 +211,17 @@ describe('MultichainAccountService', () => { }, }; - const { mocks, rootMessenger } = setup({ + const { mocks, messenger } = setup({ accounts: [MOCK_HD_ACCOUNT_1, MOCK_SOL_ACCOUNT_1], providerConfigs, }); expect(mocks.EvmAccountProvider.constructor).toHaveBeenCalledWith( - rootMessenger, + messenger, providerConfigs[EvmAccountProvider.NAME], ); expect(mocks.SolAccountProvider.constructor).toHaveBeenCalledWith( - rootMessenger, + messenger, providerConfigs[SolAccountProvider.NAME], ); }); @@ -806,9 +806,9 @@ describe('MultichainAccountService', () => { describe('actions', () => { it('gets a multichain account with MultichainAccountService:getMultichainAccount', () => { const accounts = [MOCK_HD_ACCOUNT_1]; - const { rootMessenger } = setup({ accounts }); + const { messenger } = setup({ accounts }); - const group = rootMessenger.call( + const group = messenger.call( 'MultichainAccountService:getMultichainAccountGroup', { entropySource: MOCK_HD_KEYRING_1.metadata.id, groupIndex: 0 }, ); @@ -817,9 +817,9 @@ describe('MultichainAccountService', () => { it('gets multichain accounts with MultichainAccountService:getMultichainAccounts', () => { const accounts = [MOCK_HD_ACCOUNT_1]; - const { rootMessenger } = setup({ accounts }); + const { messenger } = setup({ accounts }); - const groups = rootMessenger.call( + const groups = messenger.call( 'MultichainAccountService:getMultichainAccountGroups', { entropySource: MOCK_HD_KEYRING_1.metadata.id }, ); @@ -828,9 +828,9 @@ describe('MultichainAccountService', () => { it('gets multichain account wallet with MultichainAccountService:getMultichainAccountWallet', () => { const accounts = [MOCK_HD_ACCOUNT_1]; - const { rootMessenger } = setup({ accounts }); + const { messenger } = setup({ accounts }); - const wallet = rootMessenger.call( + const wallet = messenger.call( 'MultichainAccountService:getMultichainAccountWallet', { entropySource: MOCK_HD_KEYRING_1.metadata.id }, ); @@ -839,9 +839,9 @@ describe('MultichainAccountService', () => { it('gets multichain account wallet with MultichainAccountService:getMultichainAccountWallets', () => { const accounts = [MOCK_HD_ACCOUNT_1]; - const { rootMessenger } = setup({ accounts }); + const { messenger } = setup({ accounts }); - const wallets = rootMessenger.call( + const wallets = messenger.call( 'MultichainAccountService:getMultichainAccountWallets', ); expect(wallets.length).toBeGreaterThan(0); From 230d965ccf6aeab39356d1a69c866ed1ccb5d6fa Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Tue, 7 Oct 2025 15:34:32 +0200 Subject: [PATCH 05/11] fix: BtcAccountProvider.test.ts --- .../src/providers/BtcAccountProvider.test.ts | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/packages/multichain-account-service/src/providers/BtcAccountProvider.test.ts b/packages/multichain-account-service/src/providers/BtcAccountProvider.test.ts index a064532d4c2..f9e0c8014ff 100644 --- a/packages/multichain-account-service/src/providers/BtcAccountProvider.test.ts +++ b/packages/multichain-account-service/src/providers/BtcAccountProvider.test.ts @@ -1,5 +1,4 @@ import { isBip44Account } from '@metamask/account-api'; -import type { Messenger } from '@metamask/base-controller'; import type { SnapKeyring } from '@metamask/eth-snap-keyring'; import { BtcAccountType } from '@metamask/keyring-api'; import type { KeyringMetadata } from '@metamask/keyring-controller'; @@ -19,13 +18,8 @@ import { MOCK_HD_ACCOUNT_1, MOCK_HD_KEYRING_1, MockAccountBuilder, + type RootMessenger, } from '../tests'; -import type { - AllowedActions, - AllowedEvents, - MultichainAccountServiceActions, - MultichainAccountServiceEvents, -} from '../types'; class MockBtcKeyring { readonly type = 'MockBtcKeyring'; @@ -111,17 +105,11 @@ function setup({ messenger = getRootMessenger(), accounts = [], }: { - messenger?: Messenger< - MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents - >; + messenger?: RootMessenger; accounts?: InternalAccount[]; } = {}): { provider: AccountProviderWrapper; - messenger: Messenger< - MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents - >; + messenger: RootMessenger; keyring: MockBtcKeyring; mocks: { handleRequest: jest.Mock; From 651317c14c5bfafa791f067e5525f2e027976bb3 Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Tue, 7 Oct 2025 15:41:55 +0200 Subject: [PATCH 06/11] fix: remove unused import --- .../src/MultichainAccountGroup.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/multichain-account-service/src/MultichainAccountGroup.test.ts b/packages/multichain-account-service/src/MultichainAccountGroup.test.ts index 7153f6d9b3a..753393b0799 100644 --- a/packages/multichain-account-service/src/MultichainAccountGroup.test.ts +++ b/packages/multichain-account-service/src/MultichainAccountGroup.test.ts @@ -5,7 +5,6 @@ import { toMultichainAccountGroupId, toMultichainAccountWalletId, } from '@metamask/account-api'; -import type { Messenger } from '@metamask/base-controller'; import { EthScope, SolScope } from '@metamask/keyring-api'; import type { InternalAccount } from '@metamask/keyring-internal-api'; From 72b3357772a5729ab70b0ba20486ea6bc51f8fc6 Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Tue, 7 Oct 2025 16:01:32 +0200 Subject: [PATCH 07/11] fix: MultichainAccountWallet.test.ts --- .../src/MultichainAccountWallet.test.ts | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/packages/multichain-account-service/src/MultichainAccountWallet.test.ts b/packages/multichain-account-service/src/MultichainAccountWallet.test.ts index 09d1b0e9420..5617e745830 100644 --- a/packages/multichain-account-service/src/MultichainAccountWallet.test.ts +++ b/packages/multichain-account-service/src/MultichainAccountWallet.test.ts @@ -31,14 +31,9 @@ import { setupNamedAccountProvider, getMultichainAccountServiceMessenger, getRootMessenger, + type RootMessenger, } from './tests'; -import type { - AllowedActions, - AllowedEvents, - MultichainAccountServiceActions, - MultichainAccountServiceEvents, - MultichainAccountServiceMessenger, -} from './types'; +import type { MultichainAccountServiceMessenger } from './types'; function setup({ entropySource = MOCK_WALLET_1_ENTROPY_SOURCE, @@ -55,10 +50,7 @@ function setup({ ], }: { entropySource?: EntropySourceId; - messenger?: Messenger< - MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents - >; + messenger?: RootMessenger; providers?: MockAccountProvider[]; accounts?: InternalAccount[][]; } = {}): { From b8ff22a4ef7d0de177d598b5f2b89bcfedb018b8 Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Tue, 7 Oct 2025 16:08:06 +0200 Subject: [PATCH 08/11] fix: TrxAccountProvider.test.ts --- .../src/providers/TrxAccountProvider.test.ts | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/packages/multichain-account-service/src/providers/TrxAccountProvider.test.ts b/packages/multichain-account-service/src/providers/TrxAccountProvider.test.ts index d52aaa25f95..7cfd053a08e 100644 --- a/packages/multichain-account-service/src/providers/TrxAccountProvider.test.ts +++ b/packages/multichain-account-service/src/providers/TrxAccountProvider.test.ts @@ -17,13 +17,8 @@ import { MOCK_TRX_ACCOUNT_1, MOCK_TRX_DISCOVERED_ACCOUNT_1, MockAccountBuilder, + type RootMessenger, } from '../tests'; -import type { - AllowedActions, - AllowedEvents, - MultichainAccountServiceActions, - MultichainAccountServiceEvents, -} from '../types'; class MockTronKeyring { readonly type = 'MockTronKeyring'; @@ -94,17 +89,11 @@ function setup({ messenger = getRootMessenger(), accounts = [], }: { - messenger?: Messenger< - MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents - >; + messenger?: RootMessenger; accounts?: InternalAccount[]; } = {}): { provider: AccountProviderWrapper; - messenger: Messenger< - MultichainAccountServiceActions | AllowedActions, - MultichainAccountServiceEvents | AllowedEvents - >; + messenger: RootMessenger; keyring: MockTronKeyring; mocks: { handleRequest: jest.Mock; From 2def7afeb1b9555523b6174ae0f947e4f8b1a73c Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Tue, 7 Oct 2025 16:23:47 +0200 Subject: [PATCH 09/11] fix: remove unused import --- .../src/providers/TrxAccountProvider.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/multichain-account-service/src/providers/TrxAccountProvider.test.ts b/packages/multichain-account-service/src/providers/TrxAccountProvider.test.ts index 7cfd053a08e..8ae4c30856c 100644 --- a/packages/multichain-account-service/src/providers/TrxAccountProvider.test.ts +++ b/packages/multichain-account-service/src/providers/TrxAccountProvider.test.ts @@ -1,5 +1,4 @@ import { isBip44Account } from '@metamask/account-api'; -import type { Messenger } from '@metamask/base-controller'; import type { SnapKeyring } from '@metamask/eth-snap-keyring'; import type { KeyringMetadata } from '@metamask/keyring-controller'; import type { From f41c0b65b2091d19e8a45c26324d1949b475037c Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Tue, 7 Oct 2025 16:30:24 +0200 Subject: [PATCH 10/11] fix: remove unused import --- .../src/MultichainAccountWallet.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/multichain-account-service/src/MultichainAccountWallet.test.ts b/packages/multichain-account-service/src/MultichainAccountWallet.test.ts index 5617e745830..d87a2361881 100644 --- a/packages/multichain-account-service/src/MultichainAccountWallet.test.ts +++ b/packages/multichain-account-service/src/MultichainAccountWallet.test.ts @@ -7,7 +7,6 @@ import { toMultichainAccountGroupId, toMultichainAccountWalletId, } from '@metamask/account-api'; -import type { Messenger } from '@metamask/base-controller'; import { EthAccountType, SolAccountType, From 41a89823e3863b8eac24a75b911a847ecef42d1c Mon Sep 17 00:00:00 2001 From: Salah-Eddine Saakoun Date: Wed, 8 Oct 2025 14:15:10 +0200 Subject: [PATCH 11/11] fix: Incorrect Messenger Passed to Providers --- .../src/MultichainAccountService.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/multichain-account-service/src/MultichainAccountService.test.ts b/packages/multichain-account-service/src/MultichainAccountService.test.ts index 875c8255721..424b5f49805 100644 --- a/packages/multichain-account-service/src/MultichainAccountService.test.ts +++ b/packages/multichain-account-service/src/MultichainAccountService.test.ts @@ -244,17 +244,17 @@ describe('MultichainAccountService', () => { // No `EVM_ACCOUNT_PROVIDER_NAME`, cause it's optional in this test. }; - const { mocks, rootMessenger } = setup({ + const { mocks, messenger } = setup({ accounts: [MOCK_HD_ACCOUNT_1, MOCK_SOL_ACCOUNT_1], providerConfigs, }); expect(mocks.EvmAccountProvider.constructor).toHaveBeenCalledWith( - rootMessenger, + messenger, undefined, ); expect(mocks.SolAccountProvider.constructor).toHaveBeenCalledWith( - rootMessenger, + messenger, providerConfigs[SolAccountProvider.NAME], ); });