Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
36cfd5d
migrate `MultichainAssetsController` messenger
mikesposito Sep 29, 2025
c51d90f
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Sep 29, 2025
6c17836
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Sep 29, 2025
1b32baa
migrate `MultichainBalancesController` messenger
mikesposito Sep 29, 2025
10916bc
migrate `RatesController` messenger
mikesposito Sep 29, 2025
3c83baf
migrate `TokenSearchDiscoveryDataController` messenger
mikesposito Sep 29, 2025
f0646a7
migrate `NftDetectionController` messenger
mikesposito Sep 29, 2025
a966f67
remove unused vars
mikesposito Sep 29, 2025
feb00b3
rename leftover `messagingSystem`
mikesposito Sep 29, 2025
fa0f196
update changelog
mikesposito Sep 29, 2025
6e80728
update lint thresholds
mikesposito Sep 29, 2025
6e214d6
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Sep 29, 2025
c24715b
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Sep 29, 2025
dfa7ce1
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Oct 15, 2025
4482331
Merge branch 'main' into mikesposito/messenger/assets-controllers
mikesposito Oct 20, 2025
39d3b58
Merge branch 'main' into mikesposito/messenger/assets-controllers
mikesposito Oct 20, 2025
3f63e4e
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Oct 20, 2025
d92d68b
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Oct 20, 2025
3376b68
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Oct 20, 2025
280c876
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Oct 20, 2025
525cdb1
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Oct 20, 2025
a3d5fc9
fix `RatesController` tests
mikesposito Oct 20, 2025
b33f1f0
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Oct 20, 2025
d480977
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Oct 21, 2025
564f730
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Oct 21, 2025
887b82f
Merge branch 'mikesposito/messenger/polling-controllers' into mikespo…
mikesposito Oct 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions eslint-warning-thresholds.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@
"jsdoc/tag-lines": 1
},
"packages/assets-controllers/src/RatesController/RatesController.test.ts": {
"import-x/order": 2,
"jsdoc/tag-lines": 4
"import-x/order": 1,
"jsdoc/tag-lines": 2
},
"packages/assets-controllers/src/RatesController/RatesController.ts": {
"@typescript-eslint/prefer-readonly": 1,
Expand All @@ -56,7 +56,7 @@
},
"packages/assets-controllers/src/TokenListController.test.ts": {
"import-x/namespace": 7,
"import-x/order": 3,
"import-x/order": 2,
"jest/no-conditional-in-test": 2
},
"packages/assets-controllers/src/TokenRatesController.test.ts": {
Expand Down
13 changes: 3 additions & 10 deletions packages/assets-controllers/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Changed

- **BREAKING:** Migrate the following controllers to the new `Messenger` from `@metamask/messenger` ([#6444](https://github.com/MetaMask/core/pull/6444))
- `AccountTrackerController`
- `CurrencyRateController`
- `DeFiPositionController`
- `MultichainAssetsRatesController`
- `TokenBalancesController`
- `TokenDetectionController`
- `TokenListController`
- `TokenRatesController`
- **BREAKING:** Migrate `AssetsContractController`, `NftController`, and `TokensController` to new `Messenger` from `@metamask/messenger` ([#6386](https://github.com/MetaMask/core/pull/6386))
- **BREAKING:** Migrate controllers to new `Messenger` from `@metamask/messenger` ([#6444](https://github.com/MetaMask/core/pull/6444), [#6386](https://github.com/MetaMask/core/pull/6386), [#6745](https://github.com/MetaMask/core/pull/6745))
- Previously, the controllers accepted a `RestrictedMessenger` instance from `@metamask/base-controller`.
- Add multicall addresses in `MULTICALL_CONTRACT_BY_CHAINID` ([#6896](https://github.com/MetaMask/core/pull/6896))
- Add multicall address for Chains: `Injective`, `Hemi`, `Plasma`, `Nonmia`, `XRPL`, `Soneium`, `Genesys`, `EDU`, `Abstract`, `Berachain`, `MegaETH Testnet`, `Apechain`, `Matchain`, `Monad Testnet`, `Monad`, `Katana`, `Lens`, `Plume`, `XDC`
- Batch `OnAssetConversion` and `OnAssetsMarketData` requests to non-EVM account Snaps ([#6886](https://github.com/MetaMask/core/pull/6886))

## [81.0.1]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { deriveStateFromMetadata, Messenger } from '@metamask/base-controller';
import { deriveStateFromMetadata } from '@metamask/base-controller/next';
import type {
AccountAssetListUpdatedEventPayload,
CaipAssetTypeOrId,
Expand All @@ -11,6 +11,13 @@ import {
} from '@metamask/keyring-api';
import { KeyringTypes } from '@metamask/keyring-controller';
import type { InternalAccount } from '@metamask/keyring-internal-api';
import {
Messenger,
MOCK_ANY_NAMESPACE,
type MessengerActions,
type MessengerEvents,
type MockAnyNamespace,
} from '@metamask/messenger';
import type { PermissionConstraint } from '@metamask/permission-controller';
import type { SubjectPermissions } from '@metamask/permission-controller';
import type { Snap } from '@metamask/snaps-utils';
Expand All @@ -27,10 +34,6 @@ import type {
MultichainAssetsControllerState,
} from './MultichainAssetsController';
import { advanceTime } from '../../../../tests/helpers';
import type {
ExtractAvailableAction,
ExtractAvailableEvent,
} from '../../../base-controller/tests/helpers';

const mockSolanaAccount: InternalAccount = {
type: 'solana:data-account',
Expand Down Expand Up @@ -216,21 +219,26 @@ const mockGetMetadataReturnValue: AssetMetadataResponse | undefined = {
/**
* The union of actions that the root messenger allows.
*/
type RootAction = ExtractAvailableAction<MultichainAssetsControllerMessenger>;
type RootAction = MessengerActions<MultichainAssetsControllerMessenger>;

/**
* The union of events that the root messenger allows.
*/
type RootEvent = ExtractAvailableEvent<MultichainAssetsControllerMessenger>;
type RootEvent = MessengerEvents<MultichainAssetsControllerMessenger>;

/**
* The root messenger type.
*/
type RootMessenger = Messenger<MockAnyNamespace, RootAction, RootEvent>;

/**
* Constructs the unrestricted messenger. This can be used to call actions and
* Constructs the root messenger. This can be used to call actions and
* publish events within the tests for this controller.
*
* @returns The unrestricted messenger suited for MultichainAssetsController.
* @returns The root messenger suited for MultichainAssetsController.
*/
function getRootMessenger(): Messenger<RootAction, RootEvent> {
return new Messenger<RootAction, RootEvent>();
function getRootMessenger(): RootMessenger {
return new Messenger({ namespace: MOCK_ANY_NAMESPACE });
}

const setupController = ({
Expand All @@ -248,20 +256,24 @@ const setupController = ({
const messenger = getRootMessenger();

const multichainAssetsControllerMessenger: MultichainAssetsControllerMessenger =
messenger.getRestricted({
name: 'MultichainAssetsController',
allowedActions: [
'AccountsController:listMultichainAccounts',
'SnapController:handleRequest',
'SnapController:getAll',
'PermissionController:getPermissions',
],
allowedEvents: [
'AccountsController:accountAdded',
'AccountsController:accountRemoved',
'AccountsController:accountAssetListUpdated',
],
new Messenger({
namespace: 'MultichainAssetsController',
parent: messenger,
});
messenger.delegate({
messenger: multichainAssetsControllerMessenger,
actions: [
'AccountsController:listMultichainAccounts',
'SnapController:handleRequest',
'SnapController:getAll',
'PermissionController:getPermissions',
],
events: [
'AccountsController:accountAdded',
'AccountsController:accountRemoved',
'AccountsController:accountAssetListUpdated',
],
});

const mockSnapHandleRequest = jest.fn();
messenger.registerActionHandler(
Expand Down Expand Up @@ -827,7 +839,7 @@ describe('MultichainAssetsController', () => {
deriveStateFromMetadata(
controller.state,
controller.metadata,
'anonymous',
'includeInDebugSnapshot',
),
).toMatchInlineSnapshot(`Object {}`);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import {
BaseController,
type ControllerGetStateAction,
type ControllerStateChangeEvent,
type RestrictedMessenger,
} from '@metamask/base-controller';
type StateMetadata,
} from '@metamask/base-controller/next';
import { isEvmAccountType } from '@metamask/keyring-api';
import type {
AccountAssetListUpdatedEventPayload,
Expand All @@ -18,6 +18,7 @@ import type {
} from '@metamask/keyring-api';
import type { InternalAccount } from '@metamask/keyring-internal-api';
import { KeyringClient } from '@metamask/keyring-snap-client';
import type { Messenger } from '@metamask/messenger';
import type {
GetPermissions,
PermissionConstraint,
Expand Down Expand Up @@ -141,12 +142,10 @@ type AllowedEvents =
/**
* Messenger type for the MultichainAssetsController.
*/
export type MultichainAssetsControllerMessenger = RestrictedMessenger<
export type MultichainAssetsControllerMessenger = Messenger<
typeof controllerName,
MultichainAssetsControllerActions | AllowedActions,
MultichainAssetsControllerEvents | AllowedEvents,
AllowedActions['type'],
AllowedEvents['type']
MultichainAssetsControllerEvents | AllowedEvents
>;

/**
Expand All @@ -156,20 +155,21 @@ export type MultichainAssetsControllerMessenger = RestrictedMessenger<
* using the `persist` flag; and if they can be sent to Sentry or not, using
* the `anonymous` flag.
*/
const assetsControllerMetadata = {
assetsMetadata: {
includeInStateLogs: false,
persist: true,
anonymous: false,
usedInUi: true,
},
accountsAssets: {
includeInStateLogs: false,
persist: true,
anonymous: false,
usedInUi: true,
},
};
const assetsControllerMetadata: StateMetadata<MultichainAssetsControllerState> =
{
assetsMetadata: {
includeInStateLogs: false,
persist: true,
includeInDebugSnapshot: false,
usedInUi: true,
},
accountsAssets: {
includeInStateLogs: false,
persist: true,
includeInDebugSnapshot: false,
usedInUi: true,
},
};

// TODO: make this controller extends StaticIntervalPollingController and update all assetsMetadata once a day.

Expand Down Expand Up @@ -202,15 +202,15 @@ export class MultichainAssetsController extends BaseController<

this.#snaps = {};

this.messagingSystem.subscribe(
this.messenger.subscribe(
'AccountsController:accountAdded',
async (account) => await this.#handleOnAccountAddedEvent(account),
);
this.messagingSystem.subscribe(
this.messenger.subscribe(
'AccountsController:accountRemoved',
async (account) => await this.#handleOnAccountRemovedEvent(account),
);
this.messagingSystem.subscribe(
this.messenger.subscribe(
'AccountsController:accountAssetListUpdated',
async (event) => await this.#handleAccountAssetListUpdatedEvent(event),
);
Expand All @@ -237,7 +237,7 @@ export class MultichainAssetsController extends BaseController<
* actions.
*/
#registerMessageHandlers() {
this.messagingSystem.registerActionHandler(
this.messenger.registerActionHandler(
'MultichainAssetsController:getAssetMetadata',
this.getAssetMetadata.bind(this),
);
Expand Down Expand Up @@ -323,7 +323,7 @@ export class MultichainAssetsController extends BaseController<
// Trigger fetching metadata for new assets
await this.#refreshAssetsMetadata(Array.from(assetsForMetadataRefresh));

this.messagingSystem.publish(`${controllerName}:accountAssetListUpdated`, {
this.messenger.publish(`${controllerName}:accountAssetListUpdated`, {
assets: accountsAndAssetsToUpdate,
});
}
Expand Down Expand Up @@ -364,17 +364,14 @@ export class MultichainAssetsController extends BaseController<
this.update((state) => {
state.accountsAssets[account.id] = assets;
});
this.messagingSystem.publish(
`${controllerName}:accountAssetListUpdated`,
{
assets: {
[account.id]: {
added: assets,
removed: [],
},
this.messenger.publish(`${controllerName}:accountAssetListUpdated`, {
assets: {
[account.id]: {
added: assets,
removed: [],
},
},
);
});
}
}

Expand Down Expand Up @@ -510,7 +507,7 @@ export class MultichainAssetsController extends BaseController<
*/
#getAllSnaps(): Snap[] {
// TODO: Use dedicated SnapController's action once available for this:
return this.messagingSystem
return this.messenger
.call('SnapController:getAll')
.filter((snap) => snap.enabled && !snap.blocked);
}
Expand All @@ -524,7 +521,7 @@ export class MultichainAssetsController extends BaseController<
#getSnapsPermissions(
origin: string,
): SubjectPermissions<PermissionConstraint> {
return this.messagingSystem.call(
return this.messenger.call(
'PermissionController:getPermissions',
origin,
) as SubjectPermissions<PermissionConstraint>;
Expand All @@ -542,7 +539,7 @@ export class MultichainAssetsController extends BaseController<
snapId: string,
): Promise<AssetMetadataResponse | undefined> {
try {
return (await this.messagingSystem.call('SnapController:handleRequest', {
return (await this.messenger.call('SnapController:handleRequest', {
snapId: snapId as SnapId,
origin: 'metamask',
handler: HandlerType.OnAssetsLookup,
Expand Down Expand Up @@ -584,7 +581,7 @@ export class MultichainAssetsController extends BaseController<
#getClient(snapId: string): KeyringClient {
return new KeyringClient({
send: async (request: JsonRpcRequest) =>
(await this.messagingSystem.call('SnapController:handleRequest', {
(await this.messenger.call('SnapController:handleRequest', {
snapId: snapId as SnapId,
origin: 'metamask',
handler: HandlerType.OnKeyringRequest,
Expand Down
Loading
Loading