diff --git a/packages/ens-controller/src/EnsController.test.ts b/packages/ens-controller/src/EnsController.test.ts index 9a49dfe2ca..622d370e47 100644 --- a/packages/ens-controller/src/EnsController.test.ts +++ b/packages/ens-controller/src/EnsController.test.ts @@ -1,14 +1,25 @@ import * as providersModule from '@ethersproject/providers'; import { ControllerMessenger } from '@metamask/base-controller'; import { - NetworkType, - NetworksTicker, toChecksumHexAddress, toHex, + InfuraNetworkType, } from '@metamask/controller-utils'; +import { defaultState as defaultNetworkState } from '@metamask/network-controller'; +import type { + ExtractAvailableAction, + ExtractAvailableEvent, +} from '../../base-controller/tests/helpers'; +import { + buildMockGetNetworkClientById, + buildCustomNetworkClientConfiguration, +} from '../../network-controller/tests/helpers'; import { EnsController, DEFAULT_ENS_NETWORK_MAP } from './EnsController'; -import type { EnsControllerState } from './EnsController'; +import type { + EnsControllerState, + EnsControllerMessenger, +} from './EnsController'; const defaultState: EnsControllerState = { ensEntries: {}, @@ -36,6 +47,11 @@ jest.mock('@ethersproject/providers', () => { }; }); +type RootMessenger = ControllerMessenger< + ExtractAvailableAction, + ExtractAvailableEvent +>; + const ZERO_X_ERROR_ADDRESS = '0x'; const address1 = '0x32Be343B94f860124dC4fEe278FDCBD38C102D88'; @@ -51,14 +67,28 @@ const address3Checksum = toChecksumHexAddress(address3); const name = 'EnsController'; /** - * Constructs a restricted controller messenger. + * Constructs the root messenger. + * + * @returns A restricted controller messenger. + */ +function getRootMessenger(): RootMessenger { + return new ControllerMessenger(); +} + +/** + * Constructs the messenger restricted to EnsController actions and events. * + * @param rootMessenger - The root messenger to base the restricted messenger + * off of. * @returns A restricted controller messenger. */ -function getMessenger() { - return new ControllerMessenger().getRestricted({ +function getRestrictedMessenger(rootMessenger: RootMessenger) { + return rootMessenger.getRestricted< + 'EnsController', + 'NetworkController:getNetworkClientById' + >({ name, - allowedActions: [], + allowedActions: ['NetworkController:getNetworkClientById'], allowedEvents: [], }); } @@ -74,17 +104,19 @@ function getProvider() { describe('EnsController', () => { it('should set default state', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.state).toStrictEqual(defaultState); }); it('should return registry address for `.`', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.get('0x1', '.')).toStrictEqual({ ensName: '.', @@ -94,17 +126,19 @@ describe('EnsController', () => { }); it('should not return registry address for unrecognized chains', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.get('0x666', '.')).toBeNull(); }); it('should add a new ENS entry and return true', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, address1)).toBe(true); expect(controller.state.ensEntries['0x1'][name1]).toStrictEqual({ @@ -115,9 +149,10 @@ describe('EnsController', () => { }); it('should clear ensResolutionsByAddress state propery when resetState is called', async () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, state: { ensResolutionsByAddress: { [address1Checksum]: 'peaksignal.eth', @@ -135,9 +170,15 @@ describe('EnsController', () => { }); it('should clear ensResolutionsByAddress state propery on networkDidChange', async () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); + const getNetworkClientById = buildMockGetNetworkClientById(); + rootMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + getNetworkClientById, + ); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, state: { ensResolutionsByAddress: { [address1Checksum]: 'peaksignal.eth', @@ -146,11 +187,8 @@ describe('EnsController', () => { provider: getProvider(), onNetworkDidChange: (listener) => { listener({ - providerConfig: { - chainId: '0x1', - type: NetworkType.mainnet, - ticker: NetworksTicker.mainnet, - }, + ...defaultNetworkState, + selectedNetworkClientId: InfuraNetworkType.mainnet, }); }, }); @@ -159,9 +197,10 @@ describe('EnsController', () => { }); it('should add a new ENS entry with null address and return true', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, null)).toBe(true); expect(controller.state.ensEntries['0x1'][name1]).toStrictEqual({ @@ -172,9 +211,10 @@ describe('EnsController', () => { }); it('should update an ENS entry and return true', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, address1)).toBe(true); expect(controller.set('0x1', name1, address2)).toBe(true); @@ -186,9 +226,10 @@ describe('EnsController', () => { }); it('should update an ENS entry with null address and return true', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, address1)).toBe(true); expect(controller.set('0x1', name1, null)).toBe(true); @@ -200,9 +241,10 @@ describe('EnsController', () => { }); it('should not update an ENS entry if the address is the same (valid address) and return false', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, address1)).toBe(true); expect(controller.set('0x1', name1, address1)).toBe(false); @@ -214,9 +256,10 @@ describe('EnsController', () => { }); it('should not update an ENS entry if the address is the same (null) and return false', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, null)).toBe(true); expect(controller.set('0x1', name1, null)).toBe(false); @@ -228,9 +271,10 @@ describe('EnsController', () => { }); it('should add multiple ENS entries and update without side effects', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, address1)).toBe(true); expect(controller.set('0x1', name2, address2)).toBe(true); @@ -254,9 +298,10 @@ describe('EnsController', () => { }); it('should get ENS default registry by chainId when asking for `.`', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, address1)).toBe(true); expect(controller.get('0x1', name1)).toStrictEqual({ @@ -267,9 +312,10 @@ describe('EnsController', () => { }); it('should get ENS entry by chainId and ensName', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, address1)).toBe(true); expect(controller.get('0x1', name1)).toStrictEqual({ @@ -280,27 +326,30 @@ describe('EnsController', () => { }); it('should return null when getting nonexistent name', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, address1)).toBe(true); expect(controller.get('0x1', name2)).toBeNull(); }); it('should return null when getting nonexistent chainId', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, address1)).toBe(true); expect(controller.get(toHex(2), name1)).toBeNull(); }); it('should throw on attempt to set invalid ENS entry: chainId', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(() => { // @ts-expect-error Intentionally invalid chain ID @@ -312,9 +361,10 @@ describe('EnsController', () => { }); it('should throw on attempt to set invalid ENS entry: ENS name', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(() => { controller.set('0x1', 'foo.eth', address1); @@ -323,9 +373,10 @@ describe('EnsController', () => { }); it('should throw on attempt to set invalid ENS entry: address', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(() => { controller.set('0x1', name1, 'foo'); @@ -336,9 +387,10 @@ describe('EnsController', () => { }); it('should remove an ENS entry and return true', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, address1)).toBe(true); expect(controller.delete('0x1', name1)).toBe(true); @@ -346,9 +398,10 @@ describe('EnsController', () => { }); it('should remove chain entries completely when all entries are removed', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, address1)).toBe(true); expect(controller.delete('0x1', '.')).toBe(true); @@ -360,9 +413,10 @@ describe('EnsController', () => { }); it('should return false if an ENS entry was NOT deleted due to unsafe input', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); // @ts-expect-error Suppressing error to test runtime behavior expect(controller.delete('__proto__', 'bar')).toBe(false); @@ -370,9 +424,10 @@ describe('EnsController', () => { }); it('should return false if an ENS entry was NOT deleted', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); controller.set('0x1', name1, address1); expect(controller.delete('0x1', 'bar')).toBe(false); @@ -385,9 +440,10 @@ describe('EnsController', () => { }); it('should add multiple ENS entries and remove without side effects', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, address1)).toBe(true); expect(controller.set('0x1', name2, address2)).toBe(true); @@ -406,9 +462,10 @@ describe('EnsController', () => { }); it('should clear all ENS entries', () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const controller = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(controller.set('0x1', name1, address1)).toBe(true); expect(controller.set('0x1', name2, address2)).toBe(true); @@ -422,25 +479,29 @@ describe('EnsController', () => { describe('reverseResolveName', () => { it('should return undefined when eth provider is not defined', async () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const ens = new EnsController({ - messenger, + messenger: ensControllerMessenger, }); expect(await ens.reverseResolveAddress(address1)).toBeUndefined(); }); it('should return undefined when network is loading', async function () { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); + const getNetworkClientById = buildMockGetNetworkClientById(); + rootMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + getNetworkClientById, + ); const ens = new EnsController({ - messenger, + messenger: ensControllerMessenger, provider: getProvider(), onNetworkDidChange: (listener) => { listener({ - providerConfig: { - chainId: '0x1', - type: NetworkType.mainnet, - ticker: NetworksTicker.mainnet, - }, + ...defaultNetworkState, + selectedNetworkClientId: InfuraNetworkType.mainnet, }); }, }); @@ -448,17 +509,24 @@ describe('EnsController', () => { }); it('should return undefined when network is not ens supported', async function () { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); + const getNetworkClientById = buildMockGetNetworkClientById({ + 'AAAA-AAAA-AAAA-AAAA': buildCustomNetworkClientConfiguration({ + chainId: '0x9999999', + }), + }); + rootMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + getNetworkClientById, + ); const ens = new EnsController({ - messenger, + messenger: ensControllerMessenger, provider: getProvider(), onNetworkDidChange: (listener) => { listener({ - providerConfig: { - chainId: toHex(0), - type: NetworkType.mainnet, - ticker: NetworksTicker.mainnet, - }, + ...defaultNetworkState, + selectedNetworkClientId: 'AAAA-AAAA-AAAA-AAAA', }); }, }); @@ -466,7 +534,13 @@ describe('EnsController', () => { }); it('should only resolve an ENS name once', async () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const getNetworkClientById = buildMockGetNetworkClientById(); + rootMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + getNetworkClientById, + ); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const ethProvider = new providersModule.Web3Provider(getProvider()); jest.spyOn(ethProvider, 'resolveName').mockResolvedValue(address1); jest @@ -475,15 +549,12 @@ describe('EnsController', () => { jest.spyOn(providersModule, 'Web3Provider').mockReturnValue(ethProvider); const ens = new EnsController({ - messenger, + messenger: ensControllerMessenger, provider: getProvider(), onNetworkDidChange: (listener) => { listener({ - providerConfig: { - chainId: '0x1', - type: NetworkType.mainnet, - ticker: NetworksTicker.mainnet, - }, + ...defaultNetworkState, + selectedNetworkClientId: InfuraNetworkType.mainnet, }); }, }); @@ -493,20 +564,23 @@ describe('EnsController', () => { }); it('should fail if lookupAddress through an error', async () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const getNetworkClientById = buildMockGetNetworkClientById(); + rootMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + getNetworkClientById, + ); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const ethProvider = new providersModule.Web3Provider(getProvider()); jest.spyOn(ethProvider, 'lookupAddress').mockRejectedValue('error'); jest.spyOn(providersModule, 'Web3Provider').mockReturnValue(ethProvider); const ens = new EnsController({ - messenger, + messenger: ensControllerMessenger, provider: getProvider(), onNetworkDidChange: (listener) => { listener({ - providerConfig: { - chainId: '0x1', - type: NetworkType.mainnet, - ticker: NetworksTicker.mainnet, - }, + ...defaultNetworkState, + selectedNetworkClientId: InfuraNetworkType.mainnet, }); }, }); @@ -515,20 +589,23 @@ describe('EnsController', () => { }); it('should fail if lookupAddress returns a null value', async () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const getNetworkClientById = buildMockGetNetworkClientById(); + rootMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + getNetworkClientById, + ); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const ethProvider = new providersModule.Web3Provider(getProvider()); jest.spyOn(ethProvider, 'lookupAddress').mockResolvedValue(null); jest.spyOn(providersModule, 'Web3Provider').mockReturnValue(ethProvider); const ens = new EnsController({ - messenger, + messenger: ensControllerMessenger, provider: getProvider(), onNetworkDidChange: (listener) => { listener({ - providerConfig: { - chainId: '0x1', - type: NetworkType.mainnet, - ticker: NetworksTicker.mainnet, - }, + ...defaultNetworkState, + selectedNetworkClientId: InfuraNetworkType.mainnet, }); }, }); @@ -537,7 +614,13 @@ describe('EnsController', () => { }); it('should fail if resolveName through an error', async () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const getNetworkClientById = buildMockGetNetworkClientById(); + rootMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + getNetworkClientById, + ); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const ethProvider = new providersModule.Web3Provider(getProvider()); jest .spyOn(ethProvider, 'lookupAddress') @@ -545,15 +628,12 @@ describe('EnsController', () => { jest.spyOn(ethProvider, 'resolveName').mockRejectedValue('error'); jest.spyOn(providersModule, 'Web3Provider').mockReturnValue(ethProvider); const ens = new EnsController({ - messenger, + messenger: ensControllerMessenger, provider: getProvider(), onNetworkDidChange: (listener) => { listener({ - providerConfig: { - chainId: '0x1', - type: NetworkType.mainnet, - ticker: NetworksTicker.mainnet, - }, + ...defaultNetworkState, + selectedNetworkClientId: InfuraNetworkType.mainnet, }); }, }); @@ -562,7 +642,13 @@ describe('EnsController', () => { }); it('should fail if resolveName returns a null value', async () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const getNetworkClientById = buildMockGetNetworkClientById(); + rootMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + getNetworkClientById, + ); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const ethProvider = new providersModule.Web3Provider(getProvider()); jest.spyOn(ethProvider, 'resolveName').mockResolvedValue(null); jest @@ -570,15 +656,12 @@ describe('EnsController', () => { .mockResolvedValue('peaksignal.eth'); jest.spyOn(providersModule, 'Web3Provider').mockReturnValue(ethProvider); const ens = new EnsController({ - messenger, + messenger: ensControllerMessenger, provider: getProvider(), onNetworkDidChange: (listener) => { listener({ - providerConfig: { - chainId: '0x1', - type: NetworkType.mainnet, - ticker: NetworksTicker.mainnet, - }, + ...defaultNetworkState, + selectedNetworkClientId: InfuraNetworkType.mainnet, }); }, }); @@ -587,7 +670,13 @@ describe('EnsController', () => { }); it('should fail if registred address is zero x error address', async () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const getNetworkClientById = buildMockGetNetworkClientById(); + rootMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + getNetworkClientById, + ); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const ethProvider = new providersModule.Web3Provider(getProvider()); jest .spyOn(ethProvider, 'resolveName') @@ -597,15 +686,12 @@ describe('EnsController', () => { .mockResolvedValue('peaksignal.eth'); jest.spyOn(providersModule, 'Web3Provider').mockReturnValue(ethProvider); const ens = new EnsController({ - messenger, + messenger: ensControllerMessenger, provider: getProvider(), onNetworkDidChange: (listener) => { listener({ - providerConfig: { - chainId: '0x1', - type: NetworkType.mainnet, - ticker: NetworksTicker.mainnet, - }, + ...defaultNetworkState, + selectedNetworkClientId: InfuraNetworkType.mainnet, }); }, }); @@ -614,7 +700,13 @@ describe('EnsController', () => { }); it('should fail if the name is registered to a different address than the reverse resolved', async () => { - const messenger = getMessenger(); + const rootMessenger = getRootMessenger(); + const getNetworkClientById = buildMockGetNetworkClientById(); + rootMessenger.registerActionHandler( + 'NetworkController:getNetworkClientById', + getNetworkClientById, + ); + const ensControllerMessenger = getRestrictedMessenger(rootMessenger); const ethProvider = new providersModule.Web3Provider(getProvider()); jest.spyOn(ethProvider, 'resolveName').mockResolvedValue(address2); @@ -623,15 +715,12 @@ describe('EnsController', () => { .mockResolvedValue('peaksignal.eth'); jest.spyOn(providersModule, 'Web3Provider').mockReturnValue(ethProvider); const ens = new EnsController({ - messenger, + messenger: ensControllerMessenger, provider: getProvider(), onNetworkDidChange: (listener) => { listener({ - providerConfig: { - chainId: '0x1', - type: NetworkType.mainnet, - ticker: NetworksTicker.mainnet, - }, + ...defaultNetworkState, + selectedNetworkClientId: InfuraNetworkType.mainnet, }); }, }); diff --git a/packages/ens-controller/src/EnsController.ts b/packages/ens-controller/src/EnsController.ts index 898c1697c9..7398d81018 100644 --- a/packages/ens-controller/src/EnsController.ts +++ b/packages/ens-controller/src/EnsController.ts @@ -15,7 +15,10 @@ import { convertHexToDecimal, toHex, } from '@metamask/controller-utils'; -import type { NetworkState } from '@metamask/network-controller'; +import type { + NetworkControllerGetNetworkClientByIdAction, + NetworkState, +} from '@metamask/network-controller'; import type { Hex } from '@metamask/utils'; import { createProjectLogger } from '@metamask/utils'; import { toASCII } from 'punycode/'; @@ -69,11 +72,13 @@ export type EnsControllerState = { ensResolutionsByAddress: { [key: string]: string }; }; +type AllowedActions = NetworkControllerGetNetworkClientByIdAction; + export type EnsControllerMessenger = RestrictedControllerMessenger< typeof name, + AllowedActions, never, - never, - never, + AllowedActions['type'], never >; @@ -123,7 +128,7 @@ export class EnsController extends BaseController< state?: Partial; provider?: ExternalProvider | JsonRpcFetchFunc; onNetworkDidChange?: ( - listener: (networkState: Pick) => void, + listener: (networkState: NetworkState) => void, ) => void; }) { super({ @@ -149,9 +154,14 @@ export class EnsController extends BaseController< }); if (provider && onNetworkDidChange) { - onNetworkDidChange((networkState) => { + onNetworkDidChange(({ selectedNetworkClientId }) => { this.resetState(); - const currentChainId = networkState.providerConfig.chainId; + const selectedNetworkClient = this.messagingSystem.call( + 'NetworkController:getNetworkClientById', + selectedNetworkClientId, + ); + const currentChainId = selectedNetworkClient.configuration.chainId; + if (this.#getChainEnsSupport(currentChainId)) { this.#ethProvider = new Web3Provider(provider, { chainId: convertHexToDecimal(currentChainId),