Skip to content

Commit 6cd7757

Browse files
committed
feat: integrate multichain assets rates controller to extension UI
1 parent 91f130a commit 6cd7757

File tree

6 files changed

+91
-0
lines changed

6 files changed

+91
-0
lines changed

app/scripts/constants/sentry-state.ts

+3
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ export const SENTRY_BACKGROUND_STATE = {
105105
accountsAssets: false,
106106
assetsMetadata: false,
107107
},
108+
MultichainAssetsRatesController: {
109+
assetsRates: false,
110+
},
108111
BridgeController: {
109112
bridgeState: {
110113
bridgeFeatureFlags: {

app/scripts/metamask-controller.js

+37
Original file line numberDiff line numberDiff line change
@@ -1075,6 +1075,32 @@ export default class MetamaskController extends EventEmitter {
10751075
disabled: !this.preferencesController.state.useCurrencyRateCheck,
10761076
});
10771077

1078+
///: BEGIN:ONLY_INCLUDE_IF(build-flask)
1079+
const multichainAssetsRatesControllerMessenger =
1080+
this.controllerMessenger.getRestricted({
1081+
name: 'MultiChainAssetsRatesController',
1082+
allowedActions: [
1083+
'AccountsController:listMultichainAccounts',
1084+
'SnapController:handleRequest',
1085+
'CurrencyRateController:getState',
1086+
'MultichainAssetsController:getState',
1087+
'MultichainBalancesController:getState',
1088+
],
1089+
allowedEvents: [
1090+
'AccountsController:accountAdded',
1091+
'KeyringController:lock',
1092+
'KeyringController:unlock',
1093+
'CurrencyRateController:stateChange',
1094+
'MultichainAssetsController:stateChange',
1095+
],
1096+
});
1097+
1098+
this.multichainAssetsRatesController = new MultiChainAssetsRatesController({
1099+
messenger: multichainAssetsRatesControllerMessenger,
1100+
state: initState.MultiChainAssetsRatesController,
1101+
});
1102+
///: END:ONLY_INCLUDE_IF
1103+
10781104
this.controllerMessenger.subscribe(
10791105
'PreferencesController:stateChange',
10801106
previousValueComparator((prevState, currState) => {
@@ -2265,6 +2291,7 @@ export default class MetamaskController extends EventEmitter {
22652291
MultichainAssetsController: this.multichainAssetsController,
22662292
///: BEGIN:ONLY_INCLUDE_IF(build-flask)
22672293
MultichainTransactionsController: this.multichainTransactionsController,
2294+
MultiChainAssetsRatesController: this.multichainAssetsRatesController,
22682295
///: END:ONLY_INCLUDE_IF
22692296
KeyringController: this.keyringController,
22702297
PreferencesController: this.preferencesController,
@@ -2319,6 +2346,7 @@ export default class MetamaskController extends EventEmitter {
23192346
MultichainAssetsController: this.multichainAssetsController,
23202347
///: BEGIN:ONLY_INCLUDE_IF(build-flask)
23212348
MultichainTransactionsController: this.multichainTransactionsController,
2349+
MultiChainAssetsRatesController: this.multichainAssetsRatesController,
23222350
///: END:ONLY_INCLUDE_IF
23232351
NetworkController: this.networkController,
23242352
KeyringController: this.keyringController,
@@ -3009,6 +3037,9 @@ export default class MetamaskController extends EventEmitter {
30093037
)
30103038
) {
30113039
this.multichainRatesController.start();
3040+
///: BEGIN:ONLY_INCLUDE_IF(build-flask)
3041+
this.multichainAssetsRatesController.startPolling();
3042+
///: END:ONLY_INCLUDE_IF
30123043
}
30133044

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

4156+
///: BEGIN:ONLY_INCLUDE_IF(build-flask)
4157+
// MultichainAssetsRatesController
4158+
multichainUpdateRates: () =>
4159+
this.multichainAssetsRatesController.updateAssetsRates(),
4160+
///: END:ONLY_INCLUDE_IF
4161+
41254162
// Transaction Decode
41264163
decodeTransactionData: (request) =>
41274164
decodeTransactionData({

test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-background-state.json

+3
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@
147147
"accountsAssets": "object",
148148
"assetsMetadata": "object"
149149
},
150+
"MultichainAssetsRatesController": {
151+
"assetsRates": "object"
152+
},
150153
"MultichainBalancesController": { "balances": "object" },
151154
"MultichainRatesController": {
152155
"fiatCurrency": "usd",

test/e2e/tests/metrics/state-snapshots/errors-after-init-opt-in-ui-state.json

+1
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@
294294
"accountsByChainId": "object",
295295
"accountsAssets": "object",
296296
"assetsMetadata": "object",
297+
"assetsRates": "object",
297298
"marketData": "object",
298299
"unapprovedDecryptMsgs": "object",
299300
"unapprovedDecryptMsgCount": 0,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { getAssetsRates, AssetsState } from './multichain-assets-rates';
2+
3+
// Mock state for testing
4+
const mockState = {
5+
metamask: {
6+
assetsRates: {
7+
'token-1': { rate: 1.5, currency: 'USD' },
8+
'token-2': { rate: 0.8, currency: 'EUR' },
9+
},
10+
},
11+
};
12+
describe('getAssetsRates', () => {
13+
it('should return the assetsRates from the state', () => {
14+
const result = getAssetsRates(mockState);
15+
expect(result).toEqual(mockState.metamask.assetsRates);
16+
});
17+
18+
it('should return an empty object if assetsRates is empty', () => {
19+
const emptyState: AssetsState = {
20+
metamask: {
21+
assetsRates: {},
22+
},
23+
};
24+
const result = getAssetsRates(emptyState);
25+
expect(result).toEqual({});
26+
});
27+
28+
it('should return undefined if state does not have metamask property', () => {
29+
const invalidState = {} as AssetsState;
30+
expect(() => getAssetsRates(invalidState)).toThrow();
31+
});
32+
});
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { MultichainAssetsRatesControllerState } from '@metamask/assets-controllers';
2+
3+
export type AssetsState = {
4+
metamask: MultichainAssetsRatesControllerState;
5+
};
6+
7+
/**
8+
* Gets non-EVM accounts assets.
9+
*
10+
* @param state - Redux state object.
11+
* @returns An object containing non-EVM assets per accounts.
12+
*/
13+
export function getAssetsRates(state: AssetsState) {
14+
return state.metamask.assetsRates;
15+
}

0 commit comments

Comments
 (0)