Skip to content

Commit 4b5929b

Browse files
mikespositoGudahtt
andauthored
refactor: migrate polling controllers to @metamask/messenger (#6444)
## Explanation <!-- Thanks for your contribution! Take a moment to answer these questions so that reviewers have the information they need to properly understand your changes: * What is the current state of things and why does it need to change? * What is the solution your changes offer and how does it work? * Are there any changes whose purpose might not obvious to those unfamiliar with the domain? * If your primary goal was to update one package but you found you had to update another one along the way, why did you do so? * If you had to upgrade a dependency, why did you do so? --> This PR migrates all controllers extending `StaticIntervalPollingController` to use `@metamask/messenger` instead of `@metamask/base-controller`. This is part of a larger effort to migrate all controllers to use `@metamask/messenger`. ## References <!-- Are there any issues that this pull request is tied to? Are there other links that reviewers should consult to understand these changes better? Are there client or consumer pull requests to adopt any breaking changes? For example: * Fixes #12345 * Related to #67890 --> * Related to #5626 ## Checklist - [ ] I've updated the test suite for new or updated code as appropriate - [ ] I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate - [ ] I've communicated my changes to consumers by [updating changelogs for packages I've changed](https://github.com/MetaMask/core/tree/main/docs/contributing.md#updating-changelogs), highlighting breaking changes as necessary - [ ] I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Migrates polling infrastructure and multiple controllers to use @metamask/messenger, updates state metadata APIs/tests, and adjusts dependencies and exports across affected packages. > > - **Messenger migration**: > - Replace `RestrictedMessenger` with `@metamask/messenger` across controllers: `AccountTrackerController`, `CurrencyRateController`, `DeFiPositionsController`, `MultichainAssetsRatesController`, `TokenBalancesController`, `TokenDetectionController`, `TokenListController`, `TokenRatesController`, `BridgeController`, `BridgeStatusController`, and `SubscriptionController`. > - Update tests to construct/delegate new `Messenger` instances; switch `deriveStateFromMetadata` imports to `@metamask/base-controller/next`. > - **Polling infrastructure**: > - Refactor `StaticIntervalPollingController` and `BlockTrackerPollingController` to use `@metamask/messenger`; remove `StaticIntervalPollingControllerNext`. > - Update `GasFeeController` to extend `StaticIntervalPollingController`. > - **State metadata/API**: > - Rename metadata flag `anonymous` to `includeInDebugSnapshot` and adjust usage in controllers/tests. > - **Bridge package**: > - Add and export `BridgeControllerGetStateAction` and `BridgeControllerStateChangeEvent` types; integrate messenger for actions/subscriptions; fetch/track calls updated. > - **Subscription package**: > - Migrate controller to new messenger; wire authentication actions/events; update polling and handlers. > - **Changelogs/deps**: > - Update changelogs to note BREAKING changes; add `@metamask/messenger` dependencies; update TS references; minor README dependency graph tweaks. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit b9a05a4. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Mark Stacey <markjstacey@gmail.com>
1 parent 7d6e178 commit 4b5929b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+823
-590
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ linkStyle default opacity:0.5
187187
bridge_controller --> base_controller;
188188
bridge_controller --> controller_utils;
189189
bridge_controller --> gas_fee_controller;
190+
bridge_controller --> messenger;
190191
bridge_controller --> multichain_network_controller;
191192
bridge_controller --> polling_controller;
192193
bridge_controller --> accounts_controller;
@@ -352,6 +353,7 @@ linkStyle default opacity:0.5
352353
signature_controller --> network_controller;
353354
subscription_controller --> base_controller;
354355
subscription_controller --> controller_utils;
356+
subscription_controller --> messenger;
355357
subscription_controller --> polling_controller;
356358
subscription_controller --> profile_sync_controller;
357359
token_search_discovery_controller --> base_controller;

eslint-warning-thresholds.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
},
5757
"packages/assets-controllers/src/TokenListController.test.ts": {
5858
"import-x/namespace": 7,
59-
"import-x/order": 3,
59+
"import-x/order": 2,
6060
"jest/no-conditional-in-test": 2
6161
},
6262
"packages/assets-controllers/src/TokenRatesController.test.ts": {

packages/assets-controllers/CHANGELOG.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- Add export for `CurrencyRateMessenger` ([#6444](https://github.com/MetaMask/core/pull/6444))
13+
1014
### Changed
1115

16+
- **BREAKING:** Migrate the following controllers to the new `Messenger` from `@metamask/messenger` ([#6444](https://github.com/MetaMask/core/pull/6444))
17+
- `AccountTrackerController`
18+
- `CurrencyRateController`
19+
- `DeFiPositionController`
20+
- `MultichainAssetsRatesController`
21+
- `TokenBalancesController`
22+
- `TokenDetectionController`
23+
- `TokenListController`
24+
- `TokenRatesController`
1225
- **BREAKING:** Migrate `AssetsContractController`, `NftController`, and `TokensController` to new `Messenger` from `@metamask/messenger` ([#6386](https://github.com/MetaMask/core/pull/6386))
1326
- Previously, the controllers accepted a `RestrictedMessenger` instance from `@metamask/base-controller`.
1427
- Bump `@metamask/polling-controller` from `^14.0.1` to `^14.0.2` ([#6940](https://github.com/MetaMask/core/pull/6940))
@@ -40,7 +53,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4053
### Added
4154

4255
- **BREAKING:** Add new event listeners to refresh balances on `TransactionControllerUnapprovedTransactionAddedEvent` and `TransactionControllerTransactionConfirmedEvent` ([#6903](https://github.com/MetaMask/core/pull/6903))
43-
4456
- Add multicall addresses in `MULTICALL_CONTRACT_BY_CHAINID` ([#6896](https://github.com/MetaMask/core/pull/6896))
4557
- 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`
4658

packages/assets-controllers/src/AccountTrackerController.test.ts

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1-
import { Messenger, deriveStateFromMetadata } from '@metamask/base-controller';
1+
import { deriveStateFromMetadata } from '@metamask/base-controller/next';
22
import { query, toChecksumHexAddress } from '@metamask/controller-utils';
33
import type { InternalAccount } from '@metamask/keyring-internal-api';
4+
import {
5+
MOCK_ANY_NAMESPACE,
6+
Messenger,
7+
type MessengerActions,
8+
type MessengerEvents,
9+
type MockAnyNamespace,
10+
} from '@metamask/messenger';
411
import {
512
type NetworkClientId,
613
type NetworkClientConfiguration,
@@ -14,26 +21,30 @@ import {
1421
import BN from 'bn.js';
1522
import { useFakeTimers, type SinonFakeTimers } from 'sinon';
1623

17-
import type {
18-
AccountTrackerControllerMessenger,
19-
AllowedActions,
20-
AllowedEvents,
21-
} from './AccountTrackerController';
24+
import type { AccountTrackerControllerMessenger } from './AccountTrackerController';
2225
import { AccountTrackerController } from './AccountTrackerController';
2326
import { AccountsApiBalanceFetcher } from './multi-chain-accounts-service/api-balance-fetcher';
2427
import { getTokenBalancesForMultipleAddresses } from './multicall';
2528
import { FakeProvider } from '../../../tests/fake-provider';
2629
import { advanceTime } from '../../../tests/helpers';
2730
import { createMockInternalAccount } from '../../accounts-controller/src/tests/mocks';
28-
import type {
29-
ExtractAvailableAction,
30-
ExtractAvailableEvent,
31-
} from '../../base-controller/tests/helpers';
3231
import {
3332
buildCustomNetworkClientConfiguration,
3433
buildMockGetNetworkClientById,
3534
} from '../../network-controller/tests/helpers';
3635

36+
type AllAccountTrackerControllerActions =
37+
MessengerActions<AccountTrackerControllerMessenger>;
38+
39+
type AllAccountTrackerControllerEvents =
40+
MessengerEvents<AccountTrackerControllerMessenger>;
41+
42+
type RootMessenger = Messenger<
43+
MockAnyNamespace,
44+
AllAccountTrackerControllerActions,
45+
AllAccountTrackerControllerEvents
46+
>;
47+
3748
jest.mock('@metamask/controller-utils', () => {
3849
return {
3950
...jest.requireActual('@metamask/controller-utils'),
@@ -1368,7 +1379,7 @@ describe('AccountTrackerController', () => {
13681379
deriveStateFromMetadata(
13691380
controller.state,
13701381
controller.metadata,
1371-
'anonymous',
1382+
'includeInDebugSnapshot',
13721383
),
13731384
).toMatchInlineSnapshot(`Object {}`);
13741385
});
@@ -1428,10 +1439,7 @@ type WithControllerCallback<ReturnValue> = ({
14281439
controller,
14291440
}: {
14301441
controller: AccountTrackerController;
1431-
messenger: Messenger<
1432-
ExtractAvailableAction<AccountTrackerControllerMessenger> | AllowedActions,
1433-
ExtractAvailableEvent<AccountTrackerControllerMessenger> | AllowedEvents
1434-
>;
1442+
messenger: RootMessenger;
14351443
triggerSelectedAccountChange: (account: InternalAccount) => void;
14361444
refresh: (
14371445
clock: SinonFakeTimers,
@@ -1475,10 +1483,9 @@ async function withController<ReturnValue>(
14751483
testFunction,
14761484
] = args.length === 2 ? args : [{}, args[0]];
14771485

1478-
const messenger = new Messenger<
1479-
ExtractAvailableAction<AccountTrackerControllerMessenger> | AllowedActions,
1480-
ExtractAvailableEvent<AccountTrackerControllerMessenger> | AllowedEvents
1481-
>();
1486+
const messenger: RootMessenger = new Messenger({
1487+
namespace: MOCK_ANY_NAMESPACE,
1488+
});
14821489

14831490
const mockGetSelectedAccount = jest.fn().mockReturnValue(selectedAccount);
14841491
messenger.registerActionHandler(
@@ -1584,16 +1591,25 @@ async function withController<ReturnValue>(
15841591
mockNetworkState,
15851592
);
15861593

1587-
const accountTrackerMessenger = messenger.getRestricted({
1588-
name: 'AccountTrackerController',
1589-
allowedActions: [
1594+
const accountTrackerMessenger = new Messenger<
1595+
'AccountTrackerController',
1596+
AllAccountTrackerControllerActions,
1597+
AllAccountTrackerControllerEvents,
1598+
RootMessenger
1599+
>({
1600+
namespace: 'AccountTrackerController',
1601+
parent: messenger,
1602+
});
1603+
messenger.delegate({
1604+
messenger: accountTrackerMessenger,
1605+
actions: [
15901606
'NetworkController:getNetworkClientById',
15911607
'NetworkController:getState',
15921608
'PreferencesController:getState',
15931609
'AccountsController:getSelectedAccount',
15941610
'AccountsController:listAccounts',
15951611
],
1596-
allowedEvents: [
1612+
events: [
15971613
'AccountsController:selectedEvmAccountChange',
15981614
'TransactionController:unapprovedTransactionAdded',
15991615
'TransactionController:transactionConfirmed',

packages/assets-controllers/src/AccountTrackerController.ts

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@ import type {
88
import type {
99
ControllerStateChangeEvent,
1010
ControllerGetStateAction,
11-
RestrictedMessenger,
12-
} from '@metamask/base-controller';
11+
StateMetadata,
12+
} from '@metamask/base-controller/next';
1313
import {
1414
query,
1515
safelyExecuteWithTimeout,
1616
toChecksumHexAddress,
1717
} from '@metamask/controller-utils';
1818
import EthQuery from '@metamask/eth-query';
1919
import type { InternalAccount } from '@metamask/keyring-internal-api';
20+
import type { Messenger } from '@metamask/messenger';
2021
import type {
2122
NetworkClient,
2223
NetworkClientId,
@@ -127,11 +128,11 @@ export type AccountTrackerControllerState = {
127128
accountsByChainId: Record<string, { [address: string]: AccountInformation }>;
128129
};
129130

130-
const accountTrackerMetadata = {
131+
const accountTrackerMetadata: StateMetadata<AccountTrackerControllerState> = {
131132
accountsByChainId: {
132133
includeInStateLogs: false,
133134
persist: true,
134-
anonymous: false,
135+
includeInDebugSnapshot: false,
135136
usedInUi: true,
136137
},
137138
};
@@ -205,12 +206,10 @@ export type AllowedEvents =
205206
/**
206207
* The messenger of the {@link AccountTrackerController}.
207208
*/
208-
export type AccountTrackerControllerMessenger = RestrictedMessenger<
209+
export type AccountTrackerControllerMessenger = Messenger<
209210
typeof controllerName,
210211
AccountTrackerControllerActions | AllowedActions,
211-
AccountTrackerControllerEvents | AllowedEvents,
212-
AllowedActions['type'],
213-
AllowedEvents['type']
212+
AccountTrackerControllerEvents | AllowedEvents
214213
>;
215214

216215
/** The input to start polling for the {@link AccountTrackerController} */
@@ -243,7 +242,7 @@ export class AccountTrackerController extends StaticIntervalPollingController<Ac
243242
* @param options - The controller options.
244243
* @param options.interval - Polling interval used to fetch new account balances.
245244
* @param options.state - Initial state to set on this controller.
246-
* @param options.messenger - The controller messaging system.
245+
* @param options.messenger - The controller messenger.
247246
* @param options.getStakedBalanceForChain - The function to get the staked native asset balance for a chain.
248247
* @param options.includeStakedAssets - Whether to include staked assets in the account balances.
249248
* @param options.accountsApiChainIds - Function that returns array of chainIds that should use Accounts-API strategy (if supported by API).
@@ -305,7 +304,7 @@ export class AccountTrackerController extends StaticIntervalPollingController<Ac
305304

306305
this.setIntervalLength(interval);
307306

308-
this.messagingSystem.subscribe(
307+
this.messenger.subscribe(
309308
'AccountsController:selectedEvmAccountChange',
310309
(newAddress, prevAddress) => {
311310
if (newAddress !== prevAddress) {
@@ -317,7 +316,7 @@ export class AccountTrackerController extends StaticIntervalPollingController<Ac
317316
(event): string => event.address,
318317
);
319318

320-
this.messagingSystem.subscribe(
319+
this.messenger.subscribe(
321320
'TransactionController:unapprovedTransactionAdded',
322321
async (transactionMeta: TransactionMeta) => {
323322
await this.#refreshAddress(
@@ -327,7 +326,7 @@ export class AccountTrackerController extends StaticIntervalPollingController<Ac
327326
},
328327
);
329328

330-
this.messagingSystem.subscribe(
329+
this.messenger.subscribe(
331330
'TransactionController:transactionConfirmed',
332331
async (transactionMeta: TransactionMeta) => {
333332
await this.#refreshAddress(
@@ -342,12 +341,12 @@ export class AccountTrackerController extends StaticIntervalPollingController<Ac
342341

343342
private syncAccounts(newChainIds: string[]) {
344343
const accountsByChainId = cloneDeep(this.state.accountsByChainId);
345-
const { selectedNetworkClientId } = this.messagingSystem.call(
344+
const { selectedNetworkClientId } = this.messenger.call(
346345
'NetworkController:getState',
347346
);
348347
const {
349348
configuration: { chainId: currentChainId },
350-
} = this.messagingSystem.call(
349+
} = this.messenger.call(
351350
'NetworkController:getNetworkClientById',
352351
selectedNetworkClientId,
353352
);
@@ -367,7 +366,7 @@ export class AccountTrackerController extends StaticIntervalPollingController<Ac
367366
// Note: The address from the preferences controller are checksummed
368367
// The addresses from the accounts controller are lowercased
369368
const addresses = Object.values(
370-
this.messagingSystem
369+
this.messenger
371370
.call('AccountsController:listAccounts')
372371
.map((internalAccount) =>
373372
toChecksumHexAddress(internalAccount.address),
@@ -401,25 +400,25 @@ export class AccountTrackerController extends StaticIntervalPollingController<Ac
401400
}
402401

403402
readonly #getProvider = (chainId: Hex): Web3Provider => {
404-
const { networkConfigurationsByChainId } = this.messagingSystem.call(
403+
const { networkConfigurationsByChainId } = this.messenger.call(
405404
'NetworkController:getState',
406405
);
407406
const cfg = networkConfigurationsByChainId[chainId];
408407
const { networkClientId } = cfg.rpcEndpoints[cfg.defaultRpcEndpointIndex];
409-
const client = this.messagingSystem.call(
408+
const client = this.messenger.call(
410409
'NetworkController:getNetworkClientById',
411410
networkClientId,
412411
);
413412
return new Web3Provider(client.provider);
414413
};
415414

416415
readonly #getNetworkClient = (chainId: Hex) => {
417-
const { networkConfigurationsByChainId } = this.messagingSystem.call(
416+
const { networkConfigurationsByChainId } = this.messenger.call(
418417
'NetworkController:getState',
419418
);
420419
const cfg = networkConfigurationsByChainId[chainId];
421420
const { networkClientId } = cfg.rpcEndpoints[cfg.defaultRpcEndpointIndex];
422-
return this.messagingSystem.call(
421+
return this.messenger.call(
423422
'NetworkController:getNetworkClientById',
424423
networkClientId,
425424
);
@@ -460,13 +459,12 @@ export class AccountTrackerController extends StaticIntervalPollingController<Ac
460459
#getCorrectNetworkClient(networkClientId?: NetworkClientId) {
461460
const selectedNetworkClientId =
462461
networkClientId ??
463-
this.messagingSystem.call('NetworkController:getState')
464-
.selectedNetworkClientId;
462+
this.messenger.call('NetworkController:getState').selectedNetworkClientId;
465463
const {
466464
configuration: { chainId },
467465
provider,
468466
blockTracker,
469-
} = this.messagingSystem.call(
467+
} = this.messenger.call(
470468
'NetworkController:getNetworkClientById',
471469
selectedNetworkClientId,
472470
);
@@ -485,7 +483,7 @@ export class AccountTrackerController extends StaticIntervalPollingController<Ac
485483
* @returns An array of network client IDs.
486484
*/
487485
#getNetworkClientIds(): NetworkClientId[] {
488-
const { networkConfigurationsByChainId } = this.messagingSystem.call(
486+
const { networkConfigurationsByChainId } = this.messenger.call(
489487
'NetworkController:getState',
490488
);
491489
return Object.values(networkConfigurationsByChainId).flatMap(
@@ -524,13 +522,11 @@ export class AccountTrackerController extends StaticIntervalPollingController<Ac
524522
networkClientIds: NetworkClientId[],
525523
queryAllAccounts: boolean = false,
526524
) {
527-
const selectedAccount = this.messagingSystem.call(
525+
const selectedAccount = this.messenger.call(
528526
'AccountsController:getSelectedAccount',
529527
);
530-
const allAccounts = this.messagingSystem.call(
531-
'AccountsController:listAccounts',
532-
);
533-
const { isMultiAccountBalancesEnabled } = this.messagingSystem.call(
528+
const allAccounts = this.messenger.call('AccountsController:listAccounts');
529+
const { isMultiAccountBalancesEnabled } = this.messenger.call(
534530
'PreferencesController:getState',
535531
);
536532

@@ -863,12 +859,12 @@ export class AccountTrackerController extends StaticIntervalPollingController<Ac
863859
}
864860

865861
#registerMessageHandlers() {
866-
this.messagingSystem.registerActionHandler(
862+
this.messenger.registerActionHandler(
867863
`${controllerName}:updateNativeBalances` as const,
868864
this.updateNativeBalances.bind(this),
869865
);
870866

871-
this.messagingSystem.registerActionHandler(
867+
this.messenger.registerActionHandler(
872868
`${controllerName}:updateStakedBalances` as const,
873869
this.updateStakedBalances.bind(this),
874870
);

0 commit comments

Comments
 (0)