Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions app/scripts/controller-init/assets/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { TokenRatesControllerInit } from './token-rates-controller-init';
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import {
TokenRatesController,
TokenRatesControllerMessenger,
} from '@metamask/assets-controllers';
import { Messenger } from '@metamask/base-controller';
import { buildControllerInitRequestMock } from '../test/utils';
import { ControllerInitRequest } from '../types';
import { getTokenRatesControllerMessenger } from '../messengers/assets';
import { TokenRatesControllerInit } from './token-rates-controller-init';

jest.mock('@metamask/assets-controllers');

function buildInitRequestMock(): jest.Mocked<
ControllerInitRequest<TokenRatesControllerMessenger>
> {
const baseControllerMessenger = new Messenger();

return {
...buildControllerInitRequestMock(),
controllerMessenger: getTokenRatesControllerMessenger(
baseControllerMessenger,
),
initMessenger: undefined,
};
}

describe('TokenRatesControllerInit', () => {
const tokenRatesControllerClassMock = jest.mocked(TokenRatesController);

beforeEach(() => {
jest.resetAllMocks();
});

it('returns controller instance', () => {
const requestMock = buildInitRequestMock();
expect(TokenRatesControllerInit(requestMock).controller).toBeInstanceOf(
TokenRatesController,
);
});

it('initializes with correct messenger and state', () => {
const requestMock = buildInitRequestMock();
TokenRatesControllerInit(requestMock);

expect(tokenRatesControllerClassMock).toHaveBeenCalled();
});
});
30 changes: 30 additions & 0 deletions app/scripts/controller-init/assets/token-rates-controller-init.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import {
CodefiTokenPricesServiceV2,
TokenRatesController,
} from '@metamask/assets-controllers';
import { ControllerInitFunction } from '../types';
import { TokenRatesControllerMessenger } from '../messengers/assets';

/**
* Initialize the Token Rates controller.
*
* @param request - The request object.
* @param request.controllerMessenger - The messenger to use for the controller.
* @param request.persistedState - The persisted state of the extension.
* @returns The initialized controller.
*/
export const TokenRatesControllerInit: ControllerInitFunction<
TokenRatesController,
TokenRatesControllerMessenger
> = ({ controllerMessenger, persistedState }) => {
const controller = new TokenRatesController({
messenger: controllerMessenger,
state: persistedState.TokenRatesController,
tokenPricesService: new CodefiTokenPricesServiceV2(),
disabled: !persistedState.PreferencesController?.useCurrencyRateCheck,
});

return {
controller,
};
};
7 changes: 5 additions & 2 deletions app/scripts/controller-init/controller-list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
MultichainAssetsController,
MultichainAssetsRatesController,
MultichainBalancesController,
TokenRatesController,
} from '@metamask/assets-controllers';
import { MultichainNetworkController } from '@metamask/multichain-network-controller';
import { MultichainTransactionsController } from '@metamask/multichain-transactions-controller';
Expand Down Expand Up @@ -73,7 +74,8 @@ export type Controller =
name: 'TransactionUpdateController';
state: Record<string, unknown>;
})
| UserStorageController;
| UserStorageController
| TokenRatesController;

/**
* Flat state object for all controllers supporting or required by modular initialization.
Expand Down Expand Up @@ -104,4 +106,5 @@ export type ControllerFlatState = AccountsController['state'] &
SnapInterfaceController['state'] &
TransactionController['state'] &
SwapsController['state'] &
UserStorageController['state'];
UserStorageController['state'] &
TokenRatesController['state'];
3 changes: 3 additions & 0 deletions app/scripts/controller-init/messengers/assets/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export { getTokenRatesControllerMessenger } from './token-rates-controller-messenger';

export type { TokenRatesControllerMessenger } from './token-rates-controller-messenger';
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { Messenger, RestrictedMessenger } from '@metamask/base-controller';
import { getTokenRatesControllerMessenger } from './token-rates-controller-messenger';

describe('getTokenRatesControllerMessenger', () => {
it('returns a restricted messenger', () => {
const messenger = new Messenger<never, never>();
const tokenRatesControllerMessenger =
getTokenRatesControllerMessenger(messenger);

expect(tokenRatesControllerMessenger).toBeInstanceOf(RestrictedMessenger);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { Messenger } from '@metamask/base-controller';
import {
NetworkControllerGetStateAction,
NetworkControllerGetNetworkClientByIdAction,
NetworkControllerStateChangeEvent,
} from '@metamask/network-controller';
import {
AccountsControllerGetSelectedAccountAction,
AccountsControllerGetAccountAction,
AccountsControllerSelectedEvmAccountChangeEvent,
} from '@metamask/accounts-controller';
import { PreferencesControllerStateChangeEvent } from '@metamask/preferences-controller';
import {
TokensControllerGetStateAction,
TokensControllerStateChangeEvent,
} from '@metamask/assets-controllers';

type Actions =
| TokensControllerGetStateAction
| NetworkControllerGetNetworkClientByIdAction
| NetworkControllerGetStateAction
| AccountsControllerGetAccountAction
| AccountsControllerGetSelectedAccountAction;

type Events =
| NetworkControllerStateChangeEvent
| AccountsControllerSelectedEvmAccountChangeEvent
| PreferencesControllerStateChangeEvent
| TokensControllerStateChangeEvent;

export type TokenRatesControllerMessenger = ReturnType<
typeof getTokenRatesControllerMessenger
>;

/**
* Get a restricted messenger for the Token Rates controller. This is scoped to the
* actions and events that the Token Rates controller is allowed to handle.
*
* @param messenger - The controller messenger to restrict.
* @returns The restricted controller messenger.
*/
export function getTokenRatesControllerMessenger(
messenger: Messenger<Actions, Events>,
) {
return messenger.getRestricted({
name: 'TokenRatesController',
allowedActions: [
'TokensController:getState',
'NetworkController:getNetworkClientById',
'NetworkController:getState',
'AccountsController:getAccount',
'AccountsController:getSelectedAccount',
],
allowedEvents: [
'NetworkController:stateChange',
'AccountsController:selectedEvmAccountChange',
'PreferencesController:stateChange',
'TokensController:stateChange',
],
});
}
5 changes: 5 additions & 0 deletions app/scripts/controller-init/messengers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import {
getAuthenticationControllerMessenger,
getUserStorageControllerMessenger,
} from './identity';
import { getTokenRatesControllerMessenger } from './assets';
import {
getNotificationServicesControllerMessenger,
getNotificationServicesPushControllerMessenger,
Expand Down Expand Up @@ -107,4 +108,8 @@ export const CONTROLLER_MESSENGERS = {
getMessenger: getUserStorageControllerMessenger,
getInitMessenger: noop,
},
TokenRatesController: {
getMessenger: getTokenRatesControllerMessenger,
getInitMessenger: noop,
},
} as const;
31 changes: 4 additions & 27 deletions app/scripts/metamask-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@ import {
NftDetectionController,
TokenDetectionController,
TokenListController,
TokenRatesController,
TokensController,
CodefiTokenPricesServiceV2,
RatesController,
fetchMultiExchangeRate,
TokenBalancesController,
Expand Down Expand Up @@ -374,6 +372,7 @@ import {
///: END:ONLY_INCLUDE_IF
MultichainNetworkControllerInit,
} from './controller-init/multichain';
import { TokenRatesControllerInit } from './controller-init/assets';
import { TransactionControllerInit } from './controller-init/confirmations/transaction-controller-init';
import { PPOMControllerInit } from './controller-init/confirmations/ppom-controller-init';
import { initControllers } from './controller-init/utils';
Expand Down Expand Up @@ -1036,31 +1035,6 @@ export default class MetamaskController extends EventEmitter {
fetchMultiExchangeRate,
});

const tokenRatesMessenger = this.controllerMessenger.getRestricted({
name: 'TokenRatesController',
allowedActions: [
'TokensController:getState',
'NetworkController:getNetworkClientById',
'NetworkController:getState',
'AccountsController:getAccount',
'AccountsController:getSelectedAccount',
],
allowedEvents: [
'NetworkController:stateChange',
'AccountsController:selectedEvmAccountChange',
'PreferencesController:stateChange',
'TokensController:stateChange',
],
});

// token exchange rate tracker
this.tokenRatesController = new TokenRatesController({
state: initState.TokenRatesController,
messenger: tokenRatesMessenger,
tokenPricesService: new CodefiTokenPricesServiceV2(),
disabled: !this.preferencesController.state.useCurrencyRateCheck,
});

this.controllerMessenger.subscribe(
'PreferencesController:stateChange',
previousValueComparator((prevState, currState) => {
Expand Down Expand Up @@ -1916,6 +1890,7 @@ export default class MetamaskController extends EventEmitter {
MultichainTransactionsController: MultichainTransactionsControllerInit,
///: END:ONLY_INCLUDE_IF
MultichainNetworkController: MultichainNetworkControllerInit,
TokenRatesController: TokenRatesControllerInit,
AuthenticationController: AuthenticationControllerInit,
UserStorageController: UserStorageControllerInit,
NotificationServicesController: NotificationServicesControllerInit,
Expand Down Expand Up @@ -1958,6 +1933,7 @@ export default class MetamaskController extends EventEmitter {
this.multichainAssetsRatesController =
controllersByName.MultichainAssetsRatesController;
///: END:ONLY_INCLUDE_IF
this.tokenRatesController = controllersByName.TokenRatesController;
this.multichainNetworkController =
controllersByName.MultichainNetworkController;
this.authenticationController = controllersByName.AuthenticationController;
Expand Down Expand Up @@ -2208,6 +2184,7 @@ export default class MetamaskController extends EventEmitter {
MultichainTransactionsController: this.multichainTransactionsController,
MultichainAssetsRatesController: this.multichainAssetsRatesController,
///: END:ONLY_INCLUDE_IF
TokenRatesController: this.tokenRatesController,
MultichainNetworkController: this.multichainNetworkController,
NetworkController: this.networkController,
KeyringController: this.keyringController,
Expand Down
Loading