Skip to content

Commit

Permalink
feat: integrate multichain assets rates controller to extension UI
Browse files Browse the repository at this point in the history
  • Loading branch information
salimtb committed Feb 13, 2025
1 parent 91f130a commit 6cd7757
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 0 deletions.
3 changes: 3 additions & 0 deletions app/scripts/constants/sentry-state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ export const SENTRY_BACKGROUND_STATE = {
accountsAssets: false,
assetsMetadata: false,
},
MultichainAssetsRatesController: {
assetsRates: false,
},

Check failure on line 110 in app/scripts/constants/sentry-state.ts

View workflow job for this annotation

GitHub Actions / Test lint / Test lint

Insert `··`
BridgeController: {
bridgeState: {
bridgeFeatureFlags: {
Expand Down
37 changes: 37 additions & 0 deletions app/scripts/metamask-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -1075,6 +1075,32 @@ export default class MetamaskController extends EventEmitter {
disabled: !this.preferencesController.state.useCurrencyRateCheck,
});

///: BEGIN:ONLY_INCLUDE_IF(build-flask)
const multichainAssetsRatesControllerMessenger =
this.controllerMessenger.getRestricted({
name: 'MultiChainAssetsRatesController',
allowedActions: [
'AccountsController:listMultichainAccounts',
'SnapController:handleRequest',
'CurrencyRateController:getState',
'MultichainAssetsController:getState',
'MultichainBalancesController:getState',
],
allowedEvents: [
'AccountsController:accountAdded',
'KeyringController:lock',
'KeyringController:unlock',
'CurrencyRateController:stateChange',
'MultichainAssetsController:stateChange',
],
});

this.multichainAssetsRatesController = new MultiChainAssetsRatesController({

Check failure on line 1098 in app/scripts/metamask-controller.js

View workflow job for this annotation

GitHub Actions / Test lint / Test lint

'MultiChainAssetsRatesController' is not defined
messenger: multichainAssetsRatesControllerMessenger,
state: initState.MultiChainAssetsRatesController,
});
///: END:ONLY_INCLUDE_IF

this.controllerMessenger.subscribe(
'PreferencesController:stateChange',
previousValueComparator((prevState, currState) => {
Expand Down Expand Up @@ -2265,6 +2291,7 @@ export default class MetamaskController extends EventEmitter {
MultichainAssetsController: this.multichainAssetsController,
///: BEGIN:ONLY_INCLUDE_IF(build-flask)
MultichainTransactionsController: this.multichainTransactionsController,
MultiChainAssetsRatesController: this.multichainAssetsRatesController,
///: END:ONLY_INCLUDE_IF
KeyringController: this.keyringController,
PreferencesController: this.preferencesController,
Expand Down Expand Up @@ -2319,6 +2346,7 @@ export default class MetamaskController extends EventEmitter {
MultichainAssetsController: this.multichainAssetsController,
///: BEGIN:ONLY_INCLUDE_IF(build-flask)
MultichainTransactionsController: this.multichainTransactionsController,
MultiChainAssetsRatesController: this.multichainAssetsRatesController,
///: END:ONLY_INCLUDE_IF
NetworkController: this.networkController,
KeyringController: this.keyringController,
Expand Down Expand Up @@ -3009,6 +3037,9 @@ export default class MetamaskController extends EventEmitter {
)
) {
this.multichainRatesController.start();
///: BEGIN:ONLY_INCLUDE_IF(build-flask)
this.multichainAssetsRatesController.startPolling();
///: END:ONLY_INCLUDE_IF
}

this.controllerMessenger.subscribe(
Expand Down Expand Up @@ -4122,6 +4153,12 @@ export default class MetamaskController extends EventEmitter {
multichainUpdateBalance: (accountId) =>
this.multichainBalancesController.updateBalance(accountId),

///: BEGIN:ONLY_INCLUDE_IF(build-flask)
// MultichainAssetsRatesController
multichainUpdateRates: () =>
this.multichainAssetsRatesController.updateAssetsRates(),
///: END:ONLY_INCLUDE_IF

// Transaction Decode
decodeTransactionData: (request) =>
decodeTransactionData({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,9 @@
"accountsAssets": "object",
"assetsMetadata": "object"
},
"MultichainAssetsRatesController": {
"assetsRates": "object"
},
"MultichainBalancesController": { "balances": "object" },
"MultichainRatesController": {
"fiatCurrency": "usd",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,7 @@
"accountsByChainId": "object",
"accountsAssets": "object",
"assetsMetadata": "object",
"assetsRates": "object",
"marketData": "object",
"unapprovedDecryptMsgs": "object",
"unapprovedDecryptMsgCount": 0,
Expand Down
32 changes: 32 additions & 0 deletions ui/selectors/multichain-assets-rates.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { getAssetsRates, AssetsState } from './multichain-assets-rates';

// Mock state for testing
const mockState = {
metamask: {
assetsRates: {
'token-1': { rate: 1.5, currency: 'USD' },
'token-2': { rate: 0.8, currency: 'EUR' },
},
},
};
describe('getAssetsRates', () => {
it('should return the assetsRates from the state', () => {
const result = getAssetsRates(mockState);
expect(result).toEqual(mockState.metamask.assetsRates);
});

it('should return an empty object if assetsRates is empty', () => {
const emptyState: AssetsState = {
metamask: {
assetsRates: {},
},
};
const result = getAssetsRates(emptyState);
expect(result).toEqual({});
});

it('should return undefined if state does not have metamask property', () => {
const invalidState = {} as AssetsState;
expect(() => getAssetsRates(invalidState)).toThrow();
});
});
15 changes: 15 additions & 0 deletions ui/selectors/multichain-assets-rates.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { MultichainAssetsRatesControllerState } from '@metamask/assets-controllers';

export type AssetsState = {
metamask: MultichainAssetsRatesControllerState;
};

/**
* Gets non-EVM accounts assets.
*
* @param state - Redux state object.
* @returns An object containing non-EVM assets per accounts.
*/
export function getAssetsRates(state: AssetsState) {
return state.metamask.assetsRates;
}

0 comments on commit 6cd7757

Please sign in to comment.