From 7f23e33d1daa598e41dc76a74a042881aba49107 Mon Sep 17 00:00:00 2001 From: mikesposito Date: Wed, 12 Aug 2026 10:24:14 +0200 Subject: [PATCH] feat: wire `PreferencesController` to `ConfigRegistryController` --- .../src/config-registry-api-service/types.ts | 1 + .../preferences-controller/jest.config.js | 2 +- packages/preferences-controller/package.json | 1 + .../src/PreferencesController.test.ts | 45 +++++++++++++++++-- .../src/PreferencesController.ts | 29 +++++++++--- .../tsconfig.build.json | 3 ++ packages/preferences-controller/tsconfig.json | 3 ++ yarn.lock | 1 + 8 files changed, 75 insertions(+), 10 deletions(-) diff --git a/packages/config-registry-controller/src/config-registry-api-service/types.ts b/packages/config-registry-controller/src/config-registry-api-service/types.ts index d1604ff8554..a7f5aa5f812 100644 --- a/packages/config-registry-controller/src/config-registry-api-service/types.ts +++ b/packages/config-registry-controller/src/config-registry-api-service/types.ts @@ -70,6 +70,7 @@ export const RegistryNetworkConfigSchema = type({ blockExplorerUrls: BlockExplorerUrlsSchema, config: ChainConfigSchema, contracts: optional(NetworkContractsSchema), + supportsEtherscanApi: optional(boolean()), }); /** diff --git a/packages/preferences-controller/jest.config.js b/packages/preferences-controller/jest.config.js index 0929655a0d7..532e19787e2 100644 --- a/packages/preferences-controller/jest.config.js +++ b/packages/preferences-controller/jest.config.js @@ -17,7 +17,7 @@ module.exports = merge(baseConfig, { // An object that configures minimum threshold enforcement for coverage results coverageThreshold: { global: { - branches: 90, + branches: 91.66, functions: 100, lines: 100, statements: 100, diff --git a/packages/preferences-controller/package.json b/packages/preferences-controller/package.json index 44d33a4df4a..3efba43ed50 100644 --- a/packages/preferences-controller/package.json +++ b/packages/preferences-controller/package.json @@ -56,6 +56,7 @@ }, "dependencies": { "@metamask/base-controller": "^9.1.0", + "@metamask/config-registry-controller": "^2.0.1", "@metamask/messenger": "^2.0.0" }, "devDependencies": { diff --git a/packages/preferences-controller/src/PreferencesController.test.ts b/packages/preferences-controller/src/PreferencesController.test.ts index f0518046e21..81a11babe4b 100644 --- a/packages/preferences-controller/src/PreferencesController.test.ts +++ b/packages/preferences-controller/src/PreferencesController.test.ts @@ -161,6 +161,28 @@ describe('PreferencesController', () => { expect(controller.state.showIncomingTransactions['0x1']).toBe(false); }); + it('should set showIncomingTransactions to true when the chain supports Etherscan API (via config-registry)', () => { + const { + controller, + rootMessenger, + mockConfigRegistryControllerGetNetworkConfigByCaip2ChainId, + } = setupPreferencesController(); + mockConfigRegistryControllerGetNetworkConfigByCaip2ChainId.mockReturnValue({ + supportsEtherscanApi: true, + }); + + rootMessenger.call( + 'PreferencesController:setEnableNetworkIncomingTransactions', + '0x9999', + true, + ); + + expect(controller.state.showIncomingTransactions['0x9999']).toBe(true); + expect( + mockConfigRegistryControllerGetNetworkConfigByCaip2ChainId, + ).toHaveBeenCalledWith('eip155:0x9999'); + }); + it('should set smartTransactionsOptInStatus', () => { const { controller, rootMessenger } = setupPreferencesController(); rootMessenger.call( @@ -528,7 +550,20 @@ function setupPreferencesController({ }: { options?: Partial[0]>; messenger?: RootMessenger; -} = {}): { controller: PreferencesController; rootMessenger: RootMessenger } { +} = {}): { + controller: PreferencesController; + rootMessenger: RootMessenger; + mockConfigRegistryControllerGetNetworkConfigByCaip2ChainId: jest.Mock; +} { + const mockConfigRegistryControllerGetNetworkConfigByCaip2ChainId = jest + .fn() + .mockReturnValue({}); + + messenger.registerActionHandler( + 'ConfigRegistryController:getNetworkConfigByCaip2ChainId', + mockConfigRegistryControllerGetNetworkConfigByCaip2ChainId, + ); + const preferencesControllerMessenger = new Messenger< 'PreferencesController', AllPreferencesControllerActions, @@ -541,7 +576,7 @@ function setupPreferencesController({ messenger.delegate({ messenger: preferencesControllerMessenger, - actions: [], + actions: ['ConfigRegistryController:getNetworkConfigByCaip2ChainId'], }); const controller = new PreferencesController({ @@ -549,5 +584,9 @@ function setupPreferencesController({ ...options, }); - return { controller, rootMessenger: messenger }; + return { + controller, + rootMessenger: messenger, + mockConfigRegistryControllerGetNetworkConfigByCaip2ChainId, + }; } diff --git a/packages/preferences-controller/src/PreferencesController.ts b/packages/preferences-controller/src/PreferencesController.ts index 665daf83b61..d971e517896 100644 --- a/packages/preferences-controller/src/PreferencesController.ts +++ b/packages/preferences-controller/src/PreferencesController.ts @@ -3,10 +3,17 @@ import type { ControllerStateChangeEvent, ControllerGetStateAction, } from '@metamask/base-controller'; +import type { ConfigRegistryControllerGetNetworkConfigByCaip2ChainIdAction } from '@metamask/config-registry-controller'; import type { Messenger } from '@metamask/messenger'; import { ETHERSCAN_SUPPORTED_CHAIN_IDS } from './constants.js'; import type { PreferencesControllerMethodActions } from './PreferencesController-method-action-types.js'; +import { + Hex, + KnownCaipNamespace, + parseCaipChainId, + toCaipChainId, +} from '@metamask/utils'; /** * A type union of the name for each chain that is supported by Etherscan or @@ -59,9 +66,7 @@ export type PreferencesState = { /** * Controls whether incoming transactions are enabled, per-chain (for Etherscan-supported chains) */ - showIncomingTransactions: { - [chainId in EtherscanSupportedHexChainId]: boolean; - }; + showIncomingTransactions: Record; /** * Controls whether test networks are shown in the wallet */ @@ -267,11 +272,14 @@ export type PreferencesControllerActions = | PreferencesControllerGetStateAction | PreferencesControllerMethodActions; +export type AllowedActions = + ConfigRegistryControllerGetNetworkConfigByCaip2ChainIdAction; + export type PreferencesControllerEvents = PreferencesControllerStateChangeEvent; export type PreferencesControllerMessenger = Messenger< typeof name, - PreferencesControllerActions, + PreferencesControllerActions | AllowedActions, PreferencesControllerEvents >; @@ -487,10 +495,19 @@ export class PreferencesController extends BaseController< * @param isIncomingTransactionNetworkEnable - true to enable incoming transactions */ setEnableNetworkIncomingTransactions( - chainId: EtherscanSupportedHexChainId, + chainId: Hex, isIncomingTransactionNetworkEnable: boolean, ): void { - if (Object.values(ETHERSCAN_SUPPORTED_CHAIN_IDS).includes(chainId)) { + const isEtherscanSupportedChain = + this.messenger.call( + 'ConfigRegistryController:getNetworkConfigByCaip2ChainId', + toCaipChainId(KnownCaipNamespace.Eip155, chainId), + )?.supportsEtherscanApi ?? + Object.values(ETHERSCAN_SUPPORTED_CHAIN_IDS).includes( + chainId as EtherscanSupportedHexChainId, + ); + + if (isEtherscanSupportedChain) { this.update((state) => { state.showIncomingTransactions = { ...this.state.showIncomingTransactions, diff --git a/packages/preferences-controller/tsconfig.build.json b/packages/preferences-controller/tsconfig.build.json index 249f327913d..5d566a8f972 100644 --- a/packages/preferences-controller/tsconfig.build.json +++ b/packages/preferences-controller/tsconfig.build.json @@ -9,6 +9,9 @@ { "path": "../base-controller/tsconfig.build.json" }, + { + "path": "../config-registry-controller/tsconfig.build.json" + }, { "path": "../messenger/tsconfig.build.json" } diff --git a/packages/preferences-controller/tsconfig.json b/packages/preferences-controller/tsconfig.json index cb296895b28..86d51cf6ac5 100644 --- a/packages/preferences-controller/tsconfig.json +++ b/packages/preferences-controller/tsconfig.json @@ -7,6 +7,9 @@ { "path": "../base-controller" }, + { + "path": "../config-registry-controller" + }, { "path": "../messenger" } diff --git a/yarn.lock b/yarn.lock index fbead227c86..0a942a7009b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8551,6 +8551,7 @@ __metadata: dependencies: "@metamask/auto-changelog": "npm:^6.1.0" "@metamask/base-controller": "npm:^9.1.0" + "@metamask/config-registry-controller": "npm:^2.0.1" "@metamask/messenger": "npm:^2.0.0" "@metamask/utils": "npm:^11.11.0" "@ts-bridge/cli": "npm:^0.6.4"