Skip to content
Open
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
6 changes: 4 additions & 2 deletions app/scripts/messenger-client-init/messengers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,12 @@ import {
getAccountActivityServiceMessenger,
} from './core-backend';
import {
getMultichainBalancesControllerInitMessenger,
getMultichainBalancesControllerMessenger,
getMultichainTransactionsControllerMessenger,
getMultichainAssetsControllerMessenger,
getMultichainNetworkControllerMessenger,
getMultichainAssetsRatesControllerInitMessenger,
getMultichainAssetsRatesControllerMessenger,
} from './multichain';
import { getInstitutionalSnapControllerMessenger } from './accounts/institutional-snap-controller-messenger';
Expand Down Expand Up @@ -508,11 +510,11 @@ export const MESSENGER_FACTORIES = {
},
MultichainAssetsRatesController: {
getMessenger: getMultichainAssetsRatesControllerMessenger,
getInitMessenger: noop,
getInitMessenger: getMultichainAssetsRatesControllerInitMessenger,
},
MultichainBalancesController: {
getMessenger: getMultichainBalancesControllerMessenger,
getInitMessenger: noop,
getInitMessenger: getMultichainBalancesControllerInitMessenger,
},
MultichainTransactionsController: {
getMessenger: getMultichainTransactionsControllerMessenger,
Expand Down
12 changes: 10 additions & 2 deletions app/scripts/messenger-client-init/messengers/multichain/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
export { getMultichainAssetsControllerMessenger } from './multichain-assets-controller-messenger';
export { getMultichainAssetsRatesControllerMessenger } from './multichain-assets-rates-controller-messenger';
export { getMultichainBalancesControllerMessenger } from './multichain-balances-controller-messenger';
export {
getMultichainAssetsRatesControllerInitMessenger,
getMultichainAssetsRatesControllerMessenger,
} from './multichain-assets-rates-controller-messenger';
export type { MultichainAssetsRatesControllerInitMessenger } from './multichain-assets-rates-controller-messenger';
export {
getMultichainBalancesControllerInitMessenger,
getMultichainBalancesControllerMessenger,
} from './multichain-balances-controller-messenger';
export type { MultichainBalancesControllerInitMessenger } from './multichain-balances-controller-messenger';
export { getMultichainTransactionsControllerMessenger } from './multichain-transactions-controller-messenger';
export { getMultichainNetworkControllerMessenger } from './multichain-network-controller-messenger';
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
type MessengerEvents,
} from '@metamask/messenger';
import { MultichainAssetsRatesControllerMessenger } from '@metamask/assets-controllers';
import { RemoteFeatureFlagControllerGetStateAction } from '@metamask/remote-feature-flag-controller';
import { RootMessenger } from '../../../lib/messenger';

/**
Expand Down Expand Up @@ -43,3 +44,35 @@ export function getMultichainAssetsRatesControllerMessenger(
});
return controllerMessenger;
}

type AllowedInitializationActions = RemoteFeatureFlagControllerGetStateAction;

export type MultichainAssetsRatesControllerInitMessenger = ReturnType<
typeof getMultichainAssetsRatesControllerInitMessenger
>;

/**
* Create a messenger restricted to the allowed actions needed during
* initialization of the Multichain Assets Rates controller.
*
* @param messenger - The base messenger used to create the restricted messenger.
*/
export function getMultichainAssetsRatesControllerInitMessenger(
messenger: RootMessenger<AllowedInitializationActions, never>,
) {
const controllerInitMessenger = new Messenger<
'MultichainAssetsRatesControllerInit',
AllowedInitializationActions,
never,
typeof messenger
>({
namespace: 'MultichainAssetsRatesControllerInit',
parent: messenger,
});
messenger.delegate({
messenger: controllerInitMessenger,
actions: ['RemoteFeatureFlagController:getState'],
events: [],
});
return controllerInitMessenger;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
type MessengerEvents,
} from '@metamask/messenger';
import { MultichainBalancesControllerMessenger } from '@metamask/assets-controllers';
import { RemoteFeatureFlagControllerGetStateAction } from '@metamask/remote-feature-flag-controller';
import { RootMessenger } from '../../../lib/messenger';

/**
Expand Down Expand Up @@ -41,3 +42,35 @@ export function getMultichainBalancesControllerMessenger(
});
return controllerMessenger;
}

type AllowedInitializationActions = RemoteFeatureFlagControllerGetStateAction;

export type MultichainBalancesControllerInitMessenger = ReturnType<
typeof getMultichainBalancesControllerInitMessenger
>;

/**
* Create a messenger restricted to the allowed actions needed during
* initialization of the Multichain Balances controller.
*
* @param messenger - The base messenger used to create the restricted messenger.
*/
export function getMultichainBalancesControllerInitMessenger(
messenger: RootMessenger<AllowedInitializationActions, never>,
) {
const controllerInitMessenger = new Messenger<
'MultichainBalancesControllerInit',
AllowedInitializationActions,
never,
typeof messenger
>({
namespace: 'MultichainBalancesControllerInit',
parent: messenger,
});
messenger.delegate({
messenger: controllerInitMessenger,
actions: ['RemoteFeatureFlagController:getState'],
events: [],
});
return controllerInitMessenger;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,21 @@ import {
} from '@metamask/assets-controllers';
import { buildControllerInitRequestMock } from '../test/utils';
import { MessengerClientInitRequest } from '../types';
import { getMultichainBalancesControllerMessenger } from '../messengers/multichain';
import {
getMultichainBalancesControllerInitMessenger,
getMultichainBalancesControllerMessenger,
} from '../messengers/multichain';
import { getRootMessenger } from '../../lib/messenger';
import { MultichainBalancesControllerInitMessenger } from '../messengers/multichain/multichain-balances-controller-messenger';
import { MultichainBalancesControllerInit } from './multichain-balances-controller-init';

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

function buildInitRequestMock(): jest.Mocked<
MessengerClientInitRequest<MultichainBalancesControllerMessenger>
MessengerClientInitRequest<
MultichainBalancesControllerMessenger,
MultichainBalancesControllerInitMessenger
>
> {
const baseControllerMessenger = getRootMessenger();

Expand All @@ -20,7 +27,9 @@ function buildInitRequestMock(): jest.Mocked<
controllerMessenger: getMultichainBalancesControllerMessenger(
baseControllerMessenger,
),
initMessenger: undefined,
initMessenger: getMultichainBalancesControllerInitMessenger(
baseControllerMessenger,
),
};
}

Expand All @@ -47,6 +56,7 @@ describe('MultichainBalancesControllerInit', () => {
expect(multichainBalancesControllerClassMock).toHaveBeenCalledWith({
messenger: requestMock.controllerMessenger,
state: requestMock.persistedState.MultichainBalancesController,
isDeprecated: expect.any(Function),
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,36 @@ import {
MultichainBalancesController,
MultichainBalancesControllerMessenger,
} from '@metamask/assets-controllers';
import { getIsDeprecatedController } from '../../../../shared/lib/assets-unify-state/remote-feature-flag';
import { MessengerClientInitFunction } from '../types';
import { MultichainBalancesControllerInitMessenger } from '../messengers/multichain';

/**
* Initialize the Multichain Balances 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.
* @param request.initMessenger
* @returns The initialized controller.
*/
export const MultichainBalancesControllerInit: MessengerClientInitFunction<
MultichainBalancesController,
MultichainBalancesControllerMessenger
> = ({ controllerMessenger, persistedState }) => {
MultichainBalancesControllerMessenger,
MultichainBalancesControllerInitMessenger
> = ({ controllerMessenger, initMessenger, persistedState }) => {
const messengerClient = new MultichainBalancesController({
messenger: controllerMessenger,
state: persistedState.MultichainBalancesController,
isDeprecated: () => {
const { remoteFeatureFlags } = initMessenger.call(
'RemoteFeatureFlagController:getState',
);
return getIsDeprecatedController(
remoteFeatureFlags,
'MultichainBalancesController',
);
},
});

return { messengerClient };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,21 @@ import {
} from '@metamask/assets-controllers';
import { buildControllerInitRequestMock } from '../test/utils';
import { MessengerClientInitRequest } from '../types';
import { getMultichainAssetsRatesControllerMessenger } from '../messengers/multichain';
import {
getMultichainAssetsRatesControllerInitMessenger,
getMultichainAssetsRatesControllerMessenger,
} from '../messengers/multichain';
import { getRootMessenger } from '../../lib/messenger';
import { MultichainAssetsRatesControllerInitMessenger } from '../messengers/multichain/multichain-assets-rates-controller-messenger';
import { MultichainAssetsRatesControllerInit } from './multichain-rates-assets-controller-init';

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

function buildInitRequestMock(): jest.Mocked<
MessengerClientInitRequest<MultichainAssetsRatesControllerMessenger>
MessengerClientInitRequest<
MultichainAssetsRatesControllerMessenger,
MultichainAssetsRatesControllerInitMessenger
>
> {
const baseControllerMessenger = getRootMessenger();

Expand All @@ -20,7 +27,9 @@ function buildInitRequestMock(): jest.Mocked<
controllerMessenger: getMultichainAssetsRatesControllerMessenger(
baseControllerMessenger,
),
initMessenger: undefined,
initMessenger: getMultichainAssetsRatesControllerInitMessenger(
baseControllerMessenger,
),
};
}

Expand Down Expand Up @@ -48,6 +57,7 @@ describe('MultichainAssetsRatesControllerInit', () => {
messenger: requestMock.controllerMessenger,
state: requestMock.persistedState.MultichainAssetsRatesController,
interval: 180000,
isDeprecated: expect.any(Function),
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,37 @@ import {
MultichainAssetsRatesController,
MultichainAssetsRatesControllerMessenger,
} from '@metamask/assets-controllers';
import { getIsDeprecatedController } from '../../../../shared/lib/assets-unify-state/remote-feature-flag';
import { MessengerClientInitFunction } from '../types';
import { MultichainAssetsRatesControllerInitMessenger } from '../messengers/multichain';

/**
* Initialize the Multichain Assets Rate 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.
* @param request.initMessenger
* @returns The initialized controller.
*/
export const MultichainAssetsRatesControllerInit: MessengerClientInitFunction<
MultichainAssetsRatesController,
MultichainAssetsRatesControllerMessenger
> = ({ controllerMessenger, persistedState }) => {
MultichainAssetsRatesControllerMessenger,
MultichainAssetsRatesControllerInitMessenger
> = ({ controllerMessenger, initMessenger, persistedState }) => {
const messengerClient = new MultichainAssetsRatesController({
messenger: controllerMessenger,
state: persistedState.MultichainAssetsRatesController,
interval: 1000 * 60 * 3, // 3 mins
isDeprecated: () => {
const { remoteFeatureFlags } = initMessenger.call(
'RemoteFeatureFlagController:getState',
);
return getIsDeprecatedController(
remoteFeatureFlags,
'MultichainAssetsRatesController',
);
},
});

return {
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@
"yarn-binary:hydrate": "corepack hydrate .yarn/yarn-corepack.tgz --activate"
},
"resolutions": {
"@metamask/assets-controllers": "npm:@metamask-previews/assets-controllers@108.5.0-preview-513faa49e",
"@metamask/bridge-controller": "73.2.0",
"@metamask/messenger@npm:^0.3.0": "^1.2.0",
"@metamask/network-controller": "32.0.0",
Expand Down
63 changes: 63 additions & 0 deletions shared/lib/assets-unify-state/remote-feature-flag.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import {
ASSETS_UNIFY_STATE_FLAG,
getIsDeprecatedController,
isAssetsUnifyStateFeatureEnabled,
ASSETS_UNIFY_STATE_VERSION_1,
} from './remote-feature-flag';
Expand Down Expand Up @@ -87,3 +89,64 @@ describe('isAssetsUnifyStateFeatureEnabled', () => {
});
});
});

describe('getIsDeprecatedController', () => {
const originalInTest = process.env.IN_TEST;

afterEach(() => {
if (originalInTest === undefined) {
delete process.env.IN_TEST;
} else {
process.env.IN_TEST = originalInTest;
}
});

describe('in test environment (IN_TEST=true)', () => {
it('returns true regardless of the remote feature flags', () => {
process.env.IN_TEST = 'true';
expect(getIsDeprecatedController({}, 'TokenListController')).toBe(true);
});
});

describe('outside test environment (IN_TEST unset)', () => {
beforeEach(() => {
delete process.env.IN_TEST;
});

it('returns false when remoteFeatureFlags is empty', () => {
expect(
getIsDeprecatedController({}, 'MultichainBalancesController'),
).toBe(false);
});

it('returns false when controller is not in deprecatedControllers', () => {
expect(
getIsDeprecatedController(
{
[ASSETS_UNIFY_STATE_FLAG]: {
enabled: true,
featureVersion: ASSETS_UNIFY_STATE_VERSION_1,
deprecatedControllers: ['TokenListController'],
},
},
'MultichainAssetsRatesController',
),
).toBe(false);
});

it('returns true when controller is in deprecatedControllers', () => {
expect(
getIsDeprecatedController(
{
[ASSETS_UNIFY_STATE_FLAG]: {
enabled: true,
featureVersion: ASSETS_UNIFY_STATE_VERSION_1,
deprecatedControllers: ['MultichainBalancesController'],
},
},
'MultichainBalancesController',
),
).toBe(true);
});
});
});
Loading
Loading