Skip to content

Commit d8aa775

Browse files
committed
fix: integrate multichainAssetsRatesController
1 parent 51c7df5 commit d8aa775

9 files changed

+155
-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/controller-init/messengers/index.ts

+4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
getMultichainBalancesControllerMessenger,
2222
getMultichainTransactionsControllerMessenger,
2323
getMultichainAssetsControllerMessenger,
24+
getMultichainAssetsRatesControllerMessenger,
2425
} from './multichain';
2526

2627
export const CONTROLLER_MESSENGERS = {
@@ -64,4 +65,7 @@ export const CONTROLLER_MESSENGERS = {
6465
getMessenger: getTransactionControllerMessenger,
6566
getInitMessenger: getTransactionControllerInitMessenger,
6667
},
68+
MultichainAssetsRatesController: {
69+
getMessenger: getMultichainAssetsRatesControllerMessenger,
70+
},
6771
} as const;

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

+1
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ export { getMultichainTransactionsControllerMessenger } from './multichain-trans
55
export type { MultichainAssetsControllerMessenger } from './multichain-assets-controller-messenger';
66
export type { MultichainBalancesControllerMessenger } from './multichain-balances-controller-messenger';
77
export type { MultichainTransactionsControllerMessenger } from './multichain-transactions-controller-messenger';
8+
export type { MultichainAssetsRatesControllerMessenger } from './multichain-assets-rates-controller-messenger';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Messenger, RestrictedMessenger } from '@metamask/base-controller';
2+
import { getMultichainAssetsRatesControllerMessenger } from './multichain-assets-rates-controller-messenger';
3+
4+
describe('getMultichainAssetsRatesControllerMessenger', () => {
5+
it('returns a restricted messenger', () => {
6+
const messenger = new Messenger<never, never>();
7+
const multichainAssetsRatesControllerMessenger =
8+
getMultichainAssetsRatesControllerMessenger(messenger);
9+
10+
expect(multichainAssetsRatesControllerMessenger).toBeInstanceOf(
11+
RestrictedMessenger,
12+
);
13+
});
14+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { Messenger } from '@metamask/base-controller';
2+
import {
3+
AccountsControllerAccountAddedEvent,
4+
AccountsControllerListMultichainAccountsAction,
5+
} from '@metamask/accounts-controller';
6+
import {
7+
CurrencyRateStateChange,
8+
GetCurrencyRateState,
9+
MultichainAssetsControllerStateChangeEvent,
10+
} from '@metamask/assets-controllers';
11+
import { MultichainAssetsControllerGetStateAction } from '@metamask/assets-controllers';
12+
import { KeyringControllerLockEvent } from '@metamask/keyring-controller';
13+
import { KeyringControllerUnlockEvent } from '@metamask/keyring-controller';
14+
import { HandleSnapRequest } from '@metamask/snaps-controllers';
15+
16+
type Actions =
17+
| HandleSnapRequest
18+
| AccountsControllerListMultichainAccountsAction
19+
| GetCurrencyRateState
20+
| MultichainAssetsControllerGetStateAction;
21+
22+
type Events =
23+
| KeyringControllerLockEvent
24+
| KeyringControllerUnlockEvent
25+
| AccountsControllerAccountAddedEvent
26+
| CurrencyRateStateChange
27+
| MultichainAssetsControllerStateChangeEvent;
28+
29+
export type MultichainAssetsRatesControllerMessenger = ReturnType<
30+
typeof getMultichainAssetsRatesControllerMessenger
31+
>;
32+
33+
/**
34+
* Get a restricted messenger for the Multichain Assets controller. This is scoped to the
35+
* actions and events that the multichain Assets controller is allowed to handle.
36+
*
37+
* @param messenger - The controller messenger to restrict.
38+
* @returns The restricted controller messenger.
39+
*/
40+
export function getMultichainAssetsRatesControllerMessenger(
41+
messenger: Messenger<Actions, Events>,
42+
) {
43+
return messenger.getRestricted({
44+
name: 'MultiChainAssetsRatesController',
45+
allowedEvents: [
46+
'AccountsController:accountAdded',
47+
'KeyringController:lock',
48+
'KeyringController:unlock',
49+
'CurrencyRateController:stateChange',
50+
'MultichainAssetsController:stateChange',
51+
],
52+
allowedActions: [
53+
'AccountsController:listMultichainAccounts',
54+
'SnapController:handleRequest',
55+
'CurrencyRateController:getState',
56+
'MultichainAssetsController:getState',
57+
],
58+
});
59+
}
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export { MultichainAssetsControllerInit } from './multichain-assets-controller-init';
22
export { MultichainBalancesControllerInit } from './multichain-balances-controller-init';
33
export { MultichainTransactionsControllerInit } from './multichain-transactions-controller-init';
4+
export { MultichainAssetsRatesControllerInit } from './multichain-assets-rates-controller-init';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { MultichainAssetsRatesController } from '@metamask/assets-controllers';
2+
import { ControllerInitFunction } from '../types';
3+
import { MultichainAssetsRatesControllerMessenger } from '../messengers/multichain';
4+
5+
/**
6+
* Initialize the Multichain Assets controller.
7+
*
8+
* @param request - The request object.
9+
* @param request.controllerMessenger - The messenger to use for the controller.
10+
* @param request.persistedState - The persisted state of the extension.
11+
* @returns The initialized controller.
12+
*/
13+
export const MultichainAssetsRatesControllerInit: ControllerInitFunction<
14+
MultichainAssetsRatesController,
15+
MultichainAssetsRatesControllerMessenger
16+
> = ({ controllerMessenger, persistedState }) => {
17+
const controller = new MultichainAssetsRatesController({
18+
// @ts-expect-error TODO: Resolve mismatch between base-controller versions.
19+
messenger: controllerMessenger,
20+
state: persistedState.MultichainAssetsRatesController,
21+
});
22+
23+
return {
24+
controller,
25+
};
26+
};
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)