From 3b7a1482bff089f1bb3f470910beac3b8ebda7b3 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Thu, 23 May 2024 16:12:57 -0600 Subject: [PATCH] TokenListController: providerConfig -> selectedNetworkClientId The `providerConfig` state property is being removed from NetworkController. Currently this property is used in TokenListController to get the currently selected chain, but `selectedNetworkClientId` can be used instead. This commit makes that transition so that we can fully drop `providerConfig`. --- .../src/TokenListController.test.ts | 143 +++++++++--------- .../src/TokenListController.ts | 10 +- 2 files changed, 83 insertions(+), 70 deletions(-) diff --git a/packages/assets-controllers/src/TokenListController.test.ts b/packages/assets-controllers/src/TokenListController.test.ts index f52b91a0c73..dfbcfc83d0e 100644 --- a/packages/assets-controllers/src/TokenListController.test.ts +++ b/packages/assets-controllers/src/TokenListController.test.ts @@ -2,28 +2,30 @@ import { ControllerMessenger } from '@metamask/base-controller'; import { ChainId, NetworkType, - NetworksTicker, convertHexToDecimal, toHex, + InfuraNetworkType, } from '@metamask/controller-utils'; -import type { - NetworkControllerGetNetworkClientByIdAction, - NetworkControllerStateChangeEvent, - NetworkState, - ProviderConfig, -} from '@metamask/network-controller'; -import { NetworkStatus } from '@metamask/network-controller'; +import type { NetworkState } from '@metamask/network-controller'; import type { Hex } from '@metamask/utils'; import nock from 'nock'; import * as sinon from 'sinon'; import { advanceTime } from '../../../tests/helpers'; +import type { + ExtractAvailableAction, + ExtractAvailableEvent, +} from '../../base-controller/tests/helpers'; +import { + buildCustomNetworkClientConfiguration, + buildInfuraNetworkClientConfiguration, + buildMockGetNetworkClientById, +} from '../../network-controller/tests/helpers'; import * as tokenService from './token-service'; import type { - TokenListStateChange, - GetTokenListState, TokenListMap, TokenListState, + TokenListControllerMessenger, } from './TokenListController'; import { TokenListController } from './TokenListController'; @@ -493,8 +495,8 @@ const expiredCacheExistingState: TokenListState = { }; type MainControllerMessenger = ControllerMessenger< - GetTokenListState | NetworkControllerGetNetworkClientByIdAction, - TokenListStateChange | NetworkControllerStateChangeEvent + ExtractAvailableAction, + ExtractAvailableEvent >; const getControllerMessenger = (): MainControllerMessenger => { @@ -513,31 +515,6 @@ const getRestrictedMessenger = ( return messenger; }; -/** - * Builds an object that satisfies the NetworkState shape using the given - * provider config. This can be used to return a complete value for the - * `NetworkController:stateChange` event. - * - * @param providerConfig - The provider config to use. - * @returns A complete state object for NetworkController. - */ -function buildNetworkControllerStateWithProviderConfig( - providerConfig: ProviderConfig, -): NetworkState { - const selectedNetworkClientId = providerConfig.type || 'uuid-1'; - return { - selectedNetworkClientId, - providerConfig, - networksMetadata: { - [selectedNetworkClientId]: { - EIPS: {}, - status: NetworkStatus.Available, - }, - }, - networkConfigurations: {}, - }; -} - describe('TokenListController', () => { afterEach(() => { jest.restoreAllMocks(); @@ -653,8 +630,17 @@ describe('TokenListController', () => { .get(getTokensPath(ChainId.mainnet)) .reply(200, sampleMainnetTokenList) .persist(); - + const selectedNetworkClientId = 'selectedNetworkClientId'; const controllerMessenger = getControllerMessenger(); + const getNetworkClientById = buildMockGetNetworkClientById({ + [selectedNetworkClientId]: buildCustomNetworkClientConfiguration({ + chainId: toHex(1337), + }), + }); + controllerMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + getNetworkClientById, + ); const messenger = getRestrictedMessenger(controllerMessenger); let onNetworkStateChangeCallback!: (state: NetworkState) => void; const controller = new TokenListController({ @@ -669,13 +655,11 @@ describe('TokenListController', () => { expect(controller.state.tokenList).toStrictEqual( sampleSingleChainState.tokenList, ); - onNetworkStateChangeCallback( - buildNetworkControllerStateWithProviderConfig({ - chainId: ChainId.goerli, - type: NetworkType.goerli, - ticker: NetworksTicker.goerli, - }), - ); + onNetworkStateChangeCallback({ + selectedNetworkClientId, + networkConfigurations: {}, + networksMetadata: {}, + }); await new Promise((resolve) => setTimeout(() => resolve(), 500)); expect(controller.state.tokenList).toStrictEqual({}); @@ -971,8 +955,20 @@ describe('TokenListController', () => { .get(getTokensPath(toHex(56))) .reply(200, sampleBinanceTokenList) .persist(); - + const selectedCustomNetworkClientId = 'selectedCustomNetworkClientId'; const controllerMessenger = getControllerMessenger(); + const getNetworkClientById = buildMockGetNetworkClientById({ + [InfuraNetworkType.goerli]: buildInfuraNetworkClientConfiguration( + InfuraNetworkType.goerli, + ), + [selectedCustomNetworkClientId]: buildCustomNetworkClientConfiguration({ + chainId: toHex(56), + }), + }); + controllerMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + getNetworkClientById, + ); const messenger = getRestrictedMessenger(controllerMessenger); const controller = new TokenListController({ chainId: ChainId.mainnet, @@ -995,11 +991,11 @@ describe('TokenListController', () => { controllerMessenger.publish( 'NetworkController:stateChange', - buildNetworkControllerStateWithProviderConfig({ - type: NetworkType.goerli, - chainId: ChainId.goerli, - ticker: NetworksTicker.goerli, - }), + { + selectedNetworkClientId: InfuraNetworkType.goerli, + networkConfigurations: {}, + networksMetadata: {}, + }, [], ); @@ -1014,12 +1010,11 @@ describe('TokenListController', () => { controllerMessenger.publish( 'NetworkController:stateChange', - buildNetworkControllerStateWithProviderConfig({ - type: NetworkType.rpc, - chainId: toHex(56), - rpcUrl: 'http://localhost:8545', - ticker: 'TEST', - }), + { + selectedNetworkClientId: selectedCustomNetworkClientId, + networkConfigurations: {}, + networksMetadata: {}, + }, [], ); @@ -1069,7 +1064,20 @@ describe('TokenListController', () => { .reply(200, sampleBinanceTokenList) .persist(); + const selectedCustomNetworkClientId = 'selectedCustomNetworkClientId'; const controllerMessenger = getControllerMessenger(); + const getNetworkClientById = buildMockGetNetworkClientById({ + [InfuraNetworkType.mainnet]: buildInfuraNetworkClientConfiguration( + InfuraNetworkType.mainnet, + ), + [selectedCustomNetworkClientId]: buildCustomNetworkClientConfiguration({ + chainId: toHex(56), + }), + }); + controllerMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + getNetworkClientById, + ); const messenger = getRestrictedMessenger(controllerMessenger); const controller = new TokenListController({ chainId: ChainId.goerli, @@ -1080,11 +1088,11 @@ describe('TokenListController', () => { await controller.start(); controllerMessenger.publish( 'NetworkController:stateChange', - buildNetworkControllerStateWithProviderConfig({ - type: NetworkType.mainnet, - chainId: ChainId.mainnet, - ticker: NetworksTicker.mainnet, - }), + { + selectedNetworkClientId: InfuraNetworkType.mainnet, + networkConfigurations: {}, + networksMetadata: {}, + }, [], ); @@ -1128,12 +1136,11 @@ describe('TokenListController', () => { controllerMessenger.publish( 'NetworkController:stateChange', - buildNetworkControllerStateWithProviderConfig({ - type: NetworkType.rpc, - chainId: toHex(56), - rpcUrl: 'http://localhost:8545', - ticker: 'TEST', - }), + { + selectedNetworkClientId: selectedCustomNetworkClientId, + networkConfigurations: {}, + networksMetadata: {}, + }, [], ); }); diff --git a/packages/assets-controllers/src/TokenListController.ts b/packages/assets-controllers/src/TokenListController.ts index c83c1753e29..ce88c4b5436 100644 --- a/packages/assets-controllers/src/TokenListController.ts +++ b/packages/assets-controllers/src/TokenListController.ts @@ -175,10 +175,16 @@ export class TokenListController extends StaticIntervalPollingController< * @param networkControllerState - The updated network controller state. */ async #onNetworkControllerStateChange(networkControllerState: NetworkState) { - if (this.chainId !== networkControllerState.providerConfig.chainId) { + const selectedNetworkClient = this.messagingSystem.call( + 'NetworkController:getNetworkClientById', + networkControllerState.selectedNetworkClientId, + ); + const { chainId } = selectedNetworkClient.configuration; + + if (this.chainId !== chainId) { this.abortController.abort(); this.abortController = new AbortController(); - this.chainId = networkControllerState.providerConfig.chainId; + this.chainId = chainId; if (this.state.preventPollingOnNetworkRestart) { this.clearingTokenListData(); } else {