Skip to content

Commit d975a69

Browse files
committed
refactor: migrate tokenRates controller to modular controller init architecture
1 parent 6ad6037 commit d975a69

File tree

9 files changed

+168
-29
lines changed

9 files changed

+168
-29
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { TokenRatesControllerInit } from './token-rates-controller-init';
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import {
2+
TokenRatesController,
3+
TokenRatesControllerMessenger,
4+
} from '@metamask/assets-controllers';
5+
import { Messenger } from '@metamask/base-controller';
6+
import { buildControllerInitRequestMock } from '../test/utils';
7+
import { ControllerInitRequest } from '../types';
8+
import { getTokenRatesControllerMessenger } from '../messengers/assets';
9+
import { TokenRatesControllerInit } from './token-rates-controller-init';
10+
11+
jest.mock('@metamask/assets-controllers');
12+
13+
function buildInitRequestMock(): jest.Mocked<
14+
ControllerInitRequest<TokenRatesControllerMessenger>
15+
> {
16+
const baseControllerMessenger = new Messenger();
17+
18+
return {
19+
...buildControllerInitRequestMock(),
20+
controllerMessenger: getTokenRatesControllerMessenger(
21+
baseControllerMessenger,
22+
),
23+
initMessenger: undefined,
24+
};
25+
}
26+
27+
describe('TokenRatesControllerInit', () => {
28+
const tokenRatesControllerClassMock = jest.mocked(TokenRatesController);
29+
30+
beforeEach(() => {
31+
jest.resetAllMocks();
32+
});
33+
34+
it('returns controller instance', () => {
35+
const requestMock = buildInitRequestMock();
36+
expect(TokenRatesControllerInit(requestMock).controller).toBeInstanceOf(
37+
TokenRatesController,
38+
);
39+
});
40+
41+
it('initializes with correct messenger and state', () => {
42+
const requestMock = buildInitRequestMock();
43+
TokenRatesControllerInit(requestMock);
44+
45+
expect(tokenRatesControllerClassMock).toHaveBeenCalled();
46+
});
47+
});
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import {
2+
CodefiTokenPricesServiceV2,
3+
TokenRatesController,
4+
} from '@metamask/assets-controllers';
5+
import { ControllerInitFunction } from '../types';
6+
import { TokenRatesControllerMessenger } from '../messengers/assets';
7+
8+
/**
9+
* Initialize the Token Rates controller.
10+
*
11+
* @param request - The request object.
12+
* @param request.controllerMessenger - The messenger to use for the controller.
13+
* @param request.persistedState - The persisted state of the extension.
14+
* @returns The initialized controller.
15+
*/
16+
export const TokenRatesControllerInit: ControllerInitFunction<
17+
TokenRatesController,
18+
TokenRatesControllerMessenger
19+
> = ({ controllerMessenger, persistedState }) => {
20+
const controller = new TokenRatesController({
21+
messenger: controllerMessenger,
22+
state: persistedState.TokenRatesController,
23+
tokenPricesService: new CodefiTokenPricesServiceV2(),
24+
disabled: !persistedState.PreferencesController?.useCurrencyRateCheck,
25+
});
26+
27+
return {
28+
controller,
29+
};
30+
};

app/scripts/controller-init/controller-list.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
MultichainAssetsController,
1616
MultichainAssetsRatesController,
1717
MultichainBalancesController,
18+
TokenRatesController,
1819
} from '@metamask/assets-controllers';
1920
import { MultichainNetworkController } from '@metamask/multichain-network-controller';
2021
import { MultichainTransactionsController } from '@metamask/multichain-transactions-controller';
@@ -69,7 +70,8 @@ export type Controller =
6970
name: 'TransactionUpdateController';
7071
state: Record<string, unknown>;
7172
})
72-
| UserStorageController;
73+
| UserStorageController
74+
| TokenRatesController;
7375

7476
/**
7577
* Flat state object for all controllers supporting or required by modular initialization.
@@ -100,4 +102,5 @@ export type ControllerFlatState = AccountsController['state'] &
100102
SnapInterfaceController['state'] &
101103
TransactionController['state'] &
102104
SwapsController['state'] &
103-
UserStorageController['state'];
105+
UserStorageController['state'] &
106+
TokenRatesController['state'];
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export { getTokenRatesControllerMessenger } from './token-rates-controller-messenger';
2+
3+
export type { TokenRatesControllerMessenger } from './token-rates-controller-messenger';
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Messenger, RestrictedMessenger } from '@metamask/base-controller';
2+
import { getTokenRatesControllerMessenger } from './token-rates-controller-messenger';
3+
4+
describe('getTokenRatesControllerMessenger', () => {
5+
it('returns a restricted messenger', () => {
6+
const messenger = new Messenger<never, never>();
7+
const tokenRatesControllerMessenger =
8+
getTokenRatesControllerMessenger(messenger);
9+
10+
expect(tokenRatesControllerMessenger).toBeInstanceOf(RestrictedMessenger);
11+
});
12+
});
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { Messenger } from '@metamask/base-controller';
2+
import {
3+
NetworkControllerGetStateAction,
4+
NetworkControllerGetNetworkClientByIdAction,
5+
NetworkControllerStateChangeEvent,
6+
} from '@metamask/network-controller';
7+
import {
8+
AccountsControllerGetSelectedAccountAction,
9+
AccountsControllerGetAccountAction,
10+
AccountsControllerSelectedEvmAccountChangeEvent,
11+
} from '@metamask/accounts-controller';
12+
import { PreferencesControllerStateChangeEvent } from '@metamask/preferences-controller';
13+
import {
14+
TokensControllerGetStateAction,
15+
TokensControllerStateChangeEvent,
16+
} from '@metamask/assets-controllers';
17+
18+
type Actions =
19+
| TokensControllerGetStateAction
20+
| NetworkControllerGetNetworkClientByIdAction
21+
| NetworkControllerGetStateAction
22+
| AccountsControllerGetAccountAction
23+
| AccountsControllerGetSelectedAccountAction;
24+
25+
type Events =
26+
| NetworkControllerStateChangeEvent
27+
| AccountsControllerSelectedEvmAccountChangeEvent
28+
| PreferencesControllerStateChangeEvent
29+
| TokensControllerStateChangeEvent;
30+
31+
export type TokenRatesControllerMessenger = ReturnType<
32+
typeof getTokenRatesControllerMessenger
33+
>;
34+
35+
/**
36+
* Get a restricted messenger for the Token Rates controller. This is scoped to the
37+
* actions and events that the Token Rates controller is allowed to handle.
38+
*
39+
* @param messenger - The controller messenger to restrict.
40+
* @returns The restricted controller messenger.
41+
*/
42+
export function getTokenRatesControllerMessenger(
43+
messenger: Messenger<Actions, Events>,
44+
) {
45+
return messenger.getRestricted({
46+
name: 'TokenRatesController',
47+
allowedActions: [
48+
'TokensController:getState',
49+
'NetworkController:getNetworkClientById',
50+
'NetworkController:getState',
51+
'AccountsController:getAccount',
52+
'AccountsController:getSelectedAccount',
53+
],
54+
allowedEvents: [
55+
'NetworkController:stateChange',
56+
'AccountsController:selectedEvmAccountChange',
57+
'PreferencesController:stateChange',
58+
'TokensController:stateChange',
59+
],
60+
});
61+
}

app/scripts/controller-init/messengers/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
getAuthenticationControllerMessenger,
3030
getUserStorageControllerMessenger,
3131
} from './identity';
32+
import { getTokenRatesControllerMessenger } from './assets';
3233

3334
export const CONTROLLER_MESSENGERS = {
3435
AuthenticationController: {
@@ -94,4 +95,8 @@ export const CONTROLLER_MESSENGERS = {
9495
getMessenger: getUserStorageControllerMessenger,
9596
getInitMessenger: noop,
9697
},
98+
TokenRatesController: {
99+
getMessenger: getTokenRatesControllerMessenger,
100+
getInitMessenger: noop,
101+
},
97102
} as const;

app/scripts/metamask-controller.js

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ import {
77
NftDetectionController,
88
TokenDetectionController,
99
TokenListController,
10-
TokenRatesController,
1110
TokensController,
12-
CodefiTokenPricesServiceV2,
1311
RatesController,
1412
fetchMultiExchangeRate,
1513
TokenBalancesController,
@@ -381,6 +379,7 @@ import {
381379
///: END:ONLY_INCLUDE_IF
382380
MultichainNetworkControllerInit,
383381
} from './controller-init/multichain';
382+
import { TokenRatesControllerInit } from './controller-init/assets';
384383
import { TransactionControllerInit } from './controller-init/confirmations/transaction-controller-init';
385384
import { PPOMControllerInit } from './controller-init/confirmations/ppom-controller-init';
386385
import { initControllers } from './controller-init/utils';
@@ -1041,31 +1040,6 @@ export default class MetamaskController extends EventEmitter {
10411040
fetchMultiExchangeRate,
10421041
});
10431042

1044-
const tokenRatesMessenger = this.controllerMessenger.getRestricted({
1045-
name: 'TokenRatesController',
1046-
allowedActions: [
1047-
'TokensController:getState',
1048-
'NetworkController:getNetworkClientById',
1049-
'NetworkController:getState',
1050-
'AccountsController:getAccount',
1051-
'AccountsController:getSelectedAccount',
1052-
],
1053-
allowedEvents: [
1054-
'NetworkController:stateChange',
1055-
'AccountsController:selectedEvmAccountChange',
1056-
'PreferencesController:stateChange',
1057-
'TokensController:stateChange',
1058-
],
1059-
});
1060-
1061-
// token exchange rate tracker
1062-
this.tokenRatesController = new TokenRatesController({
1063-
state: initState.TokenRatesController,
1064-
messenger: tokenRatesMessenger,
1065-
tokenPricesService: new CodefiTokenPricesServiceV2(),
1066-
disabled: !this.preferencesController.state.useCurrencyRateCheck,
1067-
});
1068-
10691043
this.controllerMessenger.subscribe(
10701044
'PreferencesController:stateChange',
10711045
previousValueComparator((prevState, currState) => {
@@ -2015,6 +1989,7 @@ export default class MetamaskController extends EventEmitter {
20151989
MultichainTransactionsController: MultichainTransactionsControllerInit,
20161990
///: END:ONLY_INCLUDE_IF
20171991
MultichainNetworkController: MultichainNetworkControllerInit,
1992+
TokenRatesController: TokenRatesControllerInit,
20181993
AuthenticationController: AuthenticationControllerInit,
20191994
UserStorageController: UserStorageControllerInit,
20201995
};
@@ -2054,6 +2029,7 @@ export default class MetamaskController extends EventEmitter {
20542029
this.multichainAssetsRatesController =
20552030
controllersByName.MultichainAssetsRatesController;
20562031
///: END:ONLY_INCLUDE_IF
2032+
this.tokenRatesController = controllersByName.TokenRatesController;
20572033
this.multichainNetworkController =
20582034
controllersByName.MultichainNetworkController;
20592035
this.authenticationController = controllersByName.AuthenticationController;
@@ -2260,6 +2236,7 @@ export default class MetamaskController extends EventEmitter {
22602236
MultichainTransactionsController: this.multichainTransactionsController,
22612237
MultichainAssetsRatesController: this.multichainAssetsRatesController,
22622238
///: END:ONLY_INCLUDE_IF
2239+
TokenRatesController: this.tokenRatesController,
22632240
MultichainNetworkController: this.multichainNetworkController,
22642241
NetworkController: this.networkController,
22652242
KeyringController: this.keyringController,

0 commit comments

Comments
 (0)