diff --git a/package.json b/package.json index 90ee447f..8bd663be 100644 --- a/package.json +++ b/package.json @@ -73,9 +73,10 @@ "dependencies": { "@ethersproject/contracts": "^5.7.0", "@ethersproject/providers": "^5.7.0", - "@metamask/base-controller": "^8.0.3", + "@metamask/base-controller": "^8.0.4", "@metamask/controller-utils": "^11.3.0", "@metamask/eth-query": "^4.0.0", + "@metamask/messenger": "^0.3.0", "@metamask/utils": "^10.0.0", "async-mutex": "^0.5.0", "bignumber.js": "^9.0.1", diff --git a/src/SwapsController.test.ts b/src/SwapsController.test.ts index 7bcea356..e0d85dbf 100644 --- a/src/SwapsController.test.ts +++ b/src/SwapsController.test.ts @@ -10,20 +10,29 @@ import { SwapsControllerState, } from './types'; import * as swapsUtil from './swapsUtil'; -import { - NetworkClientId, - NetworkControllerGetNetworkClientByIdAction, - NetworkControllerNetworkDidChangeEvent, -} from '@metamask/network-controller'; +import { NetworkClientId } from '@metamask/network-controller'; import { FakeProvider } from './fake-provider.test'; import { Hex } from '@metamask/utils'; -import { deriveStateFromMetadata, Messenger } from '@metamask/base-controller'; +import { deriveStateFromMetadata } from '@metamask/base-controller/next'; import * as ethQueryModule from '@metamask/eth-query'; +import { + Messenger, + MessengerActions, + MessengerEvents, + MOCK_ANY_NAMESPACE, + MockAnyNamespace, +} from '@metamask/messenger'; import * as ethersContracts from '@ethersproject/contracts'; import * as ethersProviders from '@ethersproject/providers'; import { Interface } from '@ethersproject/abi'; import abiERC20 from 'human-standard-token-abi'; +type AllActions = MessengerActions; + +type AllEvents = MessengerEvents; + +type RootMessenger = Messenger; + // Override this module so that its members can be spied on jest.mock('@metamask/eth-query', () => { return { @@ -524,10 +533,9 @@ describe('SwapsController', () => { topAssetsLastFetched: 2, tokensLastFetched: 3, }; - const rootMessenger = new Messenger< - NetworkControllerGetNetworkClientByIdAction, - NetworkControllerNetworkDidChangeEvent - >(); + const rootMessenger: RootMessenger = new Messenger({ + namespace: MOCK_ANY_NAMESPACE, + }); rootMessenger.registerActionHandler( 'NetworkController:getNetworkClientById', // @ts-expect-error Intentionally not providing a full @@ -545,10 +553,19 @@ describe('SwapsController', () => { ); }, ); - const swapsControllerMessenger = rootMessenger.getRestricted({ - name: 'SwapsController', - allowedActions: ['NetworkController:getNetworkClientById'], - allowedEvents: ['NetworkController:networkDidChange'], + const swapsControllerMessenger = new Messenger< + 'SwapsController', + AllActions, + AllEvents, + RootMessenger + >({ + namespace: 'SwapsController', + parent: rootMessenger, + }); + rootMessenger.delegate({ + messenger: swapsControllerMessenger, + actions: ['NetworkController:getNetworkClientById'], + events: ['NetworkController:networkDidChange'], }); const controller = getSwapsController({ options: { @@ -575,10 +592,9 @@ describe('SwapsController', () => { it('clears the main part of state and initializes the cached data for the new chain ID if none previously existed', async () => { const networkClientId = 'AAAA-BBBB-CCCC-DDDD'; const chainId = BSC_CHAIN_ID; - const rootMessenger = new Messenger< - NetworkControllerGetNetworkClientByIdAction, - NetworkControllerNetworkDidChangeEvent - >(); + const rootMessenger: RootMessenger = new Messenger({ + namespace: MOCK_ANY_NAMESPACE, + }); rootMessenger.registerActionHandler( 'NetworkController:getNetworkClientById', // @ts-expect-error Intentionally not providing a full @@ -596,10 +612,19 @@ describe('SwapsController', () => { ); }, ); - const swapsControllerMessenger = rootMessenger.getRestricted({ - name: 'SwapsController', - allowedActions: ['NetworkController:getNetworkClientById'], - allowedEvents: ['NetworkController:networkDidChange'], + const swapsControllerMessenger = new Messenger< + 'SwapsController', + AllActions, + AllEvents, + RootMessenger + >({ + namespace: 'SwapsController', + parent: rootMessenger, + }); + rootMessenger.delegate({ + messenger: swapsControllerMessenger, + actions: ['NetworkController:getNetworkClientById'], + events: ['NetworkController:networkDidChange'], }); const controller = getSwapsController({ options: { @@ -637,10 +662,9 @@ describe('SwapsController', () => { it('does not change state if the new chain ID is not among the list of supported chain IDs', async () => { const networkClientId = 'AAAA-BBBB-CCCC-DDDD'; const chainId = '0x99999999'; - const rootMessenger = new Messenger< - NetworkControllerGetNetworkClientByIdAction, - NetworkControllerNetworkDidChangeEvent - >(); + const rootMessenger: RootMessenger = new Messenger({ + namespace: MOCK_ANY_NAMESPACE, + }); rootMessenger.registerActionHandler( 'NetworkController:getNetworkClientById', // @ts-expect-error Intentionally not providing a full @@ -658,10 +682,19 @@ describe('SwapsController', () => { ); }, ); - const swapsControllerMessenger = rootMessenger.getRestricted({ - name: 'SwapsController', - allowedActions: ['NetworkController:getNetworkClientById'], - allowedEvents: ['NetworkController:networkDidChange'], + const swapsControllerMessenger = new Messenger< + 'SwapsController', + AllActions, + AllEvents, + RootMessenger + >({ + namespace: 'SwapsController', + parent: rootMessenger, + }); + rootMessenger.delegate({ + messenger: swapsControllerMessenger, + actions: ['NetworkController:getNetworkClientById'], + events: ['NetworkController:networkDidChange'], }); const controller = getSwapsController({ options: { @@ -5307,7 +5340,7 @@ describe('SwapsController', () => { deriveStateFromMetadata( controller.state, controller.metadata, - 'anonymous', + 'includeInDebugSnapshot', ), ).toMatchInlineSnapshot(` { diff --git a/src/SwapsController.ts b/src/SwapsController.ts index 27e9fe65..c6cdcc35 100644 --- a/src/SwapsController.ts +++ b/src/SwapsController.ts @@ -1,7 +1,9 @@ import { Contract } from '@ethersproject/contracts'; import { Web3Provider } from '@ethersproject/providers'; -import type { StateMetadata } from '@metamask/base-controller'; -import { BaseController } from '@metamask/base-controller'; +import { + BaseController, + type StateMetadata, +} from '@metamask/base-controller/next'; import { gweiDecToWEIBN, query, @@ -75,121 +77,121 @@ const metadata: StateMetadata = { quotes: { includeInStateLogs: true, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, quoteValues: { includeInStateLogs: true, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, fetchParams: { includeInStateLogs: true, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, fetchParamsMetaData: { includeInStateLogs: true, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, topAggSavings: { includeInStateLogs: true, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, aggregatorMetadata: { includeInStateLogs: false, persist: false, - anonymous: true, + includeInDebugSnapshot: true, usedInUi: true, }, tokens: { includeInStateLogs: false, persist: false, - anonymous: true, + includeInDebugSnapshot: true, usedInUi: true, }, topAssets: { includeInStateLogs: false, persist: false, - anonymous: true, + includeInDebugSnapshot: true, usedInUi: true, }, approvalTransaction: { includeInStateLogs: true, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, aggregatorMetadataLastFetched: { includeInStateLogs: true, persist: false, - anonymous: true, + includeInDebugSnapshot: true, usedInUi: true, }, quotesLastFetched: { includeInStateLogs: true, persist: false, - anonymous: true, + includeInDebugSnapshot: true, usedInUi: true, }, error: { includeInStateLogs: true, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, topAggId: { includeInStateLogs: true, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, tokensLastFetched: { includeInStateLogs: true, persist: false, - anonymous: true, + includeInDebugSnapshot: true, usedInUi: true, }, isInPolling: { includeInStateLogs: true, persist: false, - anonymous: true, + includeInDebugSnapshot: true, usedInUi: true, }, pollingCyclesLeft: { includeInStateLogs: true, persist: false, - anonymous: true, + includeInDebugSnapshot: true, usedInUi: true, }, quoteRefreshSeconds: { includeInStateLogs: true, persist: false, - anonymous: true, + includeInDebugSnapshot: true, usedInUi: true, }, usedGasEstimate: { includeInStateLogs: true, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, usedCustomGas: { includeInStateLogs: true, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, chainCache: { includeInStateLogs: false, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: true, }, }; @@ -670,42 +672,42 @@ export default class SwapsController extends BaseController< this.#pollCountLimit = pollCountLimit; this.#supportedChainIds = supportedChainIds; - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `SwapsController:updateQuotesWithGasPrice`, this.updateQuotesWithGasPrice.bind(this), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `SwapsController:updateSelectedQuoteWithGasLimit`, this.updateSelectedQuoteWithGasLimit.bind(this), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `SwapsController:startFetchAndSetQuotes`, this.startFetchAndSetQuotes.bind(this), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `SwapsController:fetchTokenWithCache`, this.fetchTokenWithCache.bind(this), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `SwapsController:fetchTopAssetsWithCache`, this.fetchTopAssetsWithCache.bind(this), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `SwapsController:fetchAggregatorMetadataWithCache`, this.fetchAggregatorMetadataWithCache.bind(this), ); - this.messagingSystem.registerActionHandler( + this.messenger.registerActionHandler( `SwapsController:stopPollingAndResetState`, this.stopPollingAndResetState.bind(this), ); - this.messagingSystem.subscribe( + this.messenger.subscribe( 'NetworkController:networkDidChange', (networkControllerState) => { const chainId = this.#getChainId( @@ -1328,7 +1330,7 @@ export default class SwapsController extends BaseController< }; #setNetwork(networkClientId: NetworkClientId) { - const networkClient = this.messagingSystem.call( + const networkClient = this.messenger.call( 'NetworkController:getNetworkClientById', networkClientId, ); @@ -1351,7 +1353,7 @@ export default class SwapsController extends BaseController< } #getChainId(networkClientId: NetworkClientId) { - const networkClient = this.messagingSystem.call( + const networkClient = this.messenger.call( 'NetworkController:getNetworkClientById', networkClientId, ); diff --git a/src/types.ts b/src/types.ts index 37758fda..a7fdc68e 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,7 +1,6 @@ import type { AccessList } from '@ethereumjs/tx'; import type { Web3Provider } from '@ethersproject/providers'; import type { - RestrictedMessenger, ControllerStateChangeEvent, ControllerGetStateAction, } from '@metamask/base-controller'; @@ -11,6 +10,7 @@ import type { GasFeeController, GasFeeEstimates, } from '@metamask/gas-fee-controller'; +import type { Messenger } from '@metamask/messenger'; import type { NetworkClient, NetworkClientId, @@ -365,12 +365,10 @@ export type AllowedEvents = NetworkControllerNetworkDidChangeEvent; /** * The messenger for the SwapsController. */ -export type SwapsControllerMessenger = RestrictedMessenger< +export type SwapsControllerMessenger = Messenger< typeof controllerName, SwapsControllerActions | AllowedActions, - SwapsControllerEvents | AllowedEvents, - AllowedActions['type'], - AllowedEvents['type'] + SwapsControllerEvents | AllowedEvents >; export type SwapsControllerOptions = { diff --git a/yarn.lock b/yarn.lock index 52e71a2b..34d089f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1184,7 +1184,7 @@ __metadata: languageName: node linkType: hard -"@metamask/base-controller@npm:^8.0.1, @metamask/base-controller@npm:^8.1.0": +"@metamask/base-controller@npm:^8.0.1, @metamask/base-controller@npm:^8.0.4, @metamask/base-controller@npm:^8.1.0": version: 8.4.0 resolution: "@metamask/base-controller@npm:8.4.0" dependencies: @@ -1195,17 +1195,6 @@ __metadata: languageName: node linkType: hard -"@metamask/base-controller@npm:^8.0.3": - version: 8.3.0 - resolution: "@metamask/base-controller@npm:8.3.0" - dependencies: - "@metamask/messenger": "npm:^0.2.0" - "@metamask/utils": "npm:^11.4.2" - immer: "npm:^9.0.6" - checksum: 10/f4dec29cbf984e38c8dab331a7b98ad3ebb81d1e64d25f28e01025a0e7b4b4f6ead9e5b830852b7eabd8ad971753868a932dc2d0076f4bd3eec415d8604eb7a4 - languageName: node - linkType: hard - "@metamask/controller-utils@npm:^11.10.0, @metamask/controller-utils@npm:^11.12.0": version: 11.14.0 resolution: "@metamask/controller-utils@npm:11.14.0" @@ -1457,13 +1446,6 @@ __metadata: languageName: node linkType: hard -"@metamask/messenger@npm:^0.2.0": - version: 0.2.0 - resolution: "@metamask/messenger@npm:0.2.0" - checksum: 10/48f682d9cde1208fbda0936022dea37acc3828cc221203b5f917df25c131d9a250dc5e86e9263f5dba8ee7c05adc6752a68dfb57da7d297f95f38b052f4fe5c1 - languageName: node - linkType: hard - "@metamask/messenger@npm:^0.3.0": version: 0.3.0 resolution: "@metamask/messenger@npm:0.3.0" @@ -1576,7 +1558,7 @@ __metadata: "@ethersproject/providers": "npm:^5.7.0" "@lavamoat/allow-scripts": "npm:^3.0.0" "@metamask/auto-changelog": "npm:^3.4.4" - "@metamask/base-controller": "npm:^8.0.3" + "@metamask/base-controller": "npm:^8.0.4" "@metamask/controller-utils": "npm:^11.3.0" "@metamask/error-reporting-service": "npm:^2.0.0" "@metamask/eslint-config": "npm:^12.2.0" @@ -1587,6 +1569,7 @@ __metadata: "@metamask/eth-query": "npm:^4.0.0" "@metamask/gas-fee-controller": "npm:^24.0.0" "@metamask/json-rpc-engine": "npm:^10.0.1" + "@metamask/messenger": "npm:^0.3.0" "@metamask/network-controller": "npm:^24.1.0" "@metamask/utils": "npm:^10.0.0" "@types/jest": "npm:^29.5.14"