Skip to content

Feat/add config registry controller#7668

Merged
wantedsystem merged 62 commits intomainfrom
feat/add-config-registry-controller
Mar 3, 2026
Merged

Feat/add config registry controller#7668
wantedsystem merged 62 commits intomainfrom
feat/add-config-registry-controller

Conversation

@wantedsystem
Copy link
Copy Markdown
Contributor

@wantedsystem wantedsystem commented Jan 20, 2026

Explanation

Core Package (@metamask/config-registry-controller)

What was delivered:

  • New controller that fetches network configurations from a remote API
  • Automatic updates every 24 hours
  • Filters to show only featured, active, non-testnet networks
  • Feature flag control to enable/disable the feature
  • Fallback to static network list when disabled (in client side extension and mobile)

Business value:

  • Networks can be updated remotely without extension releases
  • Users get the additional network configurations automatically

References

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

Note

Medium Risk
Mostly additive, but introduces new network-fetching + polling logic (feature-flag gated, keyring-event driven) and hooks it into the monorepo build/test config, so failures could surface at runtime or CI if misconfigured.

Overview
Adds a new workspace package, @metamask/config-registry-controller, including a ConfigRegistryController that polls a remote config registry API (with ETag caching), is gated by the configRegistryApiEnabled remote feature flag, and starts/stops based on keyring lock/unlock and flag state changes.

Also introduces the underlying ConfigRegistryApiService with retry/circuit-break policy support, plus network filters and selectors, and wires the new package into monorepo metadata/build tooling (root tsconfig refs, yarn.lock, README package list/graph, CODEOWNERS, teams.json, and a small lavamoat allowlist tweak).

Written by Cursor Bugbot for commit 42e3e71. This will update automatically on new commits. Configure here.

cursor[bot]

This comment was marked as outdated.

cursor[bot]

This comment was marked as outdated.

@socket-security
Copy link
Copy Markdown

socket-security Bot commented Jan 20, 2026

No dependency changes detected. Learn more about Socket for GitHub.

👍 No dependency changes detected in pull request

cursor[bot]

This comment was marked as outdated.

cursor[bot]

This comment was marked as outdated.

@mikesposito

This comment was marked as outdated.

@mikesposito

This comment was marked as outdated.

@mikesposito
Copy link
Copy Markdown
Member

@metamaskbot publish-previews

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "4.0.0-preview-ab102d86",
  "@metamask-previews/accounts-controller": "35.0.2-preview-ab102d86",
  "@metamask-previews/address-book-controller": "7.0.1-preview-ab102d86",
  "@metamask-previews/analytics-controller": "1.0.0-preview-ab102d86",
  "@metamask-previews/announcement-controller": "8.0.0-preview-ab102d86",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-ab102d86",
  "@metamask-previews/approval-controller": "8.0.0-preview-ab102d86",
  "@metamask-previews/assets-controller": "0.0.0-preview-ab102d86",
  "@metamask-previews/assets-controllers": "95.3.0-preview-ab102d86",
  "@metamask-previews/base-controller": "9.0.0-preview-ab102d86",
  "@metamask-previews/bridge-controller": "64.6.1-preview-ab102d86",
  "@metamask-previews/bridge-status-controller": "64.4.3-preview-ab102d86",
  "@metamask-previews/build-utils": "3.0.4-preview-ab102d86",
  "@metamask-previews/chain-agnostic-permission": "1.4.0-preview-ab102d86",
  "@metamask-previews/claims-controller": "0.4.1-preview-ab102d86",
  "@metamask-previews/composable-controller": "12.0.0-preview-ab102d86",
  "@metamask-previews/config-registry-controller": "0.0.1-preview-ab102d86",
  "@metamask-previews/connectivity-controller": "0.1.0-preview-ab102d86",
  "@metamask-previews/controller-utils": "11.18.0-preview-ab102d86",
  "@metamask-previews/core-backend": "5.0.0-preview-ab102d86",
  "@metamask-previews/delegation-controller": "2.0.0-preview-ab102d86",
  "@metamask-previews/earn-controller": "11.1.0-preview-ab102d86",
  "@metamask-previews/eip-5792-middleware": "2.1.0-preview-ab102d86",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-ab102d86",
  "@metamask-previews/eip1193-permission-middleware": "1.0.3-preview-ab102d86",
  "@metamask-previews/ens-controller": "19.0.2-preview-ab102d86",
  "@metamask-previews/error-reporting-service": "3.0.1-preview-ab102d86",
  "@metamask-previews/eth-block-tracker": "15.0.1-preview-ab102d86",
  "@metamask-previews/eth-json-rpc-middleware": "23.0.0-preview-ab102d86",
  "@metamask-previews/eth-json-rpc-provider": "6.0.0-preview-ab102d86",
  "@metamask-previews/foundryup": "1.0.1-preview-ab102d86",
  "@metamask-previews/gas-fee-controller": "26.0.2-preview-ab102d86",
  "@metamask-previews/gator-permissions-controller": "1.1.0-preview-ab102d86",
  "@metamask-previews/json-rpc-engine": "10.2.1-preview-ab102d86",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-ab102d86",
  "@metamask-previews/keyring-controller": "25.0.0-preview-ab102d86",
  "@metamask-previews/logging-controller": "7.0.1-preview-ab102d86",
  "@metamask-previews/message-manager": "14.1.0-preview-ab102d86",
  "@metamask-previews/messenger": "0.3.0-preview-ab102d86",
  "@metamask-previews/multichain-account-service": "5.1.0-preview-ab102d86",
  "@metamask-previews/multichain-api-middleware": "1.2.6-preview-ab102d86",
  "@metamask-previews/multichain-network-controller": "3.0.2-preview-ab102d86",
  "@metamask-previews/multichain-transactions-controller": "7.0.0-preview-ab102d86",
  "@metamask-previews/name-controller": "9.0.0-preview-ab102d86",
  "@metamask-previews/network-controller": "29.0.0-preview-ab102d86",
  "@metamask-previews/network-enablement-controller": "4.1.0-preview-ab102d86",
  "@metamask-previews/notification-services-controller": "21.0.0-preview-ab102d86",
  "@metamask-previews/permission-controller": "12.2.0-preview-ab102d86",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-ab102d86",
  "@metamask-previews/perps-controller": "0.0.0-preview-ab102d86",
  "@metamask-previews/phishing-controller": "16.1.0-preview-ab102d86",
  "@metamask-previews/polling-controller": "16.0.2-preview-ab102d86",
  "@metamask-previews/preferences-controller": "22.0.0-preview-ab102d86",
  "@metamask-previews/profile-metrics-controller": "3.0.0-preview-ab102d86",
  "@metamask-previews/profile-sync-controller": "27.0.0-preview-ab102d86",
  "@metamask-previews/ramps-controller": "4.1.0-preview-ab102d86",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-ab102d86",
  "@metamask-previews/remote-feature-flag-controller": "4.0.0-preview-ab102d86",
  "@metamask-previews/sample-controllers": "4.0.2-preview-ab102d86",
  "@metamask-previews/seedless-onboarding-controller": "7.1.0-preview-ab102d86",
  "@metamask-previews/selected-network-controller": "26.0.2-preview-ab102d86",
  "@metamask-previews/shield-controller": "5.0.0-preview-ab102d86",
  "@metamask-previews/signature-controller": "39.0.1-preview-ab102d86",
  "@metamask-previews/storage-service": "0.0.1-preview-ab102d86",
  "@metamask-previews/subscription-controller": "5.4.0-preview-ab102d86",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-ab102d86",
  "@metamask-previews/transaction-controller": "62.9.2-preview-ab102d86",
  "@metamask-previews/transaction-pay-controller": "11.0.2-preview-ab102d86",
  "@metamask-previews/user-operation-controller": "41.0.2-preview-ab102d86"
}

Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts Outdated
Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts Outdated
Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts Outdated
Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts Outdated
Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts Outdated
Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts Outdated
Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts Outdated
Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts Outdated
Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts Outdated
Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts Outdated
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts Outdated
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts Outdated
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts
Copy link
Copy Markdown
Contributor

@mcmire mcmire left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks a lot better! The only thing I really noticed was the extra export in index.ts but everything else is minor.

(Also, I know there are some comments that Cursor has made. I haven't taken a look at these, although I'll comment on the one you pinged me on.)

Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts
Comment thread packages/config-registry-controller/src/index.ts Outdated
Comment thread packages/config-registry-controller/src/utils/feature-flags.ts
...args: Parameters<ServicePolicy['onDegraded']>
): ReturnType<ServicePolicy['onDegraded']> {
return this.#policy.onDegraded(...args);
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see this comment, but that's a fair question. These are standard methods on data service classes. They allow consumers to respond to when the API is degraded or unavailable.

Comment thread packages/config-registry-controller/src/ConfigRegistryController.test.ts Outdated
Comment thread packages/config-registry-controller/src/ConfigRegistryController.test.ts Outdated
Comment thread packages/config-registry-controller/src/ConfigRegistryController.test.ts Outdated
Comment thread packages/config-registry-controller/LICENSE Outdated
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts
mcmire
mcmire previously approved these changes Mar 2, 2026
Copy link
Copy Markdown
Contributor

@mcmire mcmire left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

options: FetchConfigOptions = {},
): Promise<FetchConfigResult> {
const headers: HeadersInit = {
'Cache-Control': 'no-cache',
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should confirm that this works correctly on React Native. IIRC we had issues with this in the past

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @Gudahtt, thanks for flagging this. I’ve verified in MetaMask Mobile that the config registry fetch with Cache-Control: no-cache works correctly and the registry data loads and refreshes as expected.


Below a screenshot showing the Additional networks section populated from the dynamic config registry list
screenshot

Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Comment thread packages/config-registry-controller/src/ConfigRegistryController.ts
@wantedsystem
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 3, 2026

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "4.1.1-preview-42e3e713e",
  "@metamask-previews/accounts-controller": "36.0.1-preview-42e3e713e",
  "@metamask-previews/address-book-controller": "7.0.1-preview-42e3e713e",
  "@metamask-previews/ai-controllers": "0.1.0-preview-42e3e713e",
  "@metamask-previews/analytics-controller": "1.0.0-preview-42e3e713e",
  "@metamask-previews/analytics-data-regulation-controller": "0.0.0-preview-42e3e713e",
  "@metamask-previews/announcement-controller": "8.0.0-preview-42e3e713e",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-42e3e713e",
  "@metamask-previews/approval-controller": "8.0.0-preview-42e3e713e",
  "@metamask-previews/assets-controller": "2.2.0-preview-42e3e713e",
  "@metamask-previews/assets-controllers": "100.0.3-preview-42e3e713e",
  "@metamask-previews/base-controller": "9.0.0-preview-42e3e713e",
  "@metamask-previews/base-data-service": "0.0.0-preview-42e3e713e",
  "@metamask-previews/bridge-controller": "67.4.0-preview-42e3e713e",
  "@metamask-previews/bridge-status-controller": "67.0.1-preview-42e3e713e",
  "@metamask-previews/build-utils": "3.0.4-preview-42e3e713e",
  "@metamask-previews/chain-agnostic-permission": "1.4.0-preview-42e3e713e",
  "@metamask-previews/claims-controller": "0.4.2-preview-42e3e713e",
  "@metamask-previews/client-controller": "1.0.0-preview-42e3e713e",
  "@metamask-previews/compliance-controller": "1.0.1-preview-42e3e713e",
  "@metamask-previews/composable-controller": "12.0.0-preview-42e3e713e",
  "@metamask-previews/config-registry-controller": "0.0.0-preview-42e3e713e",
  "@metamask-previews/connectivity-controller": "0.1.0-preview-42e3e713e",
  "@metamask-previews/controller-utils": "11.19.0-preview-42e3e713e",
  "@metamask-previews/core-backend": "6.0.0-preview-42e3e713e",
  "@metamask-previews/delegation-controller": "2.0.1-preview-42e3e713e",
  "@metamask-previews/earn-controller": "11.1.1-preview-42e3e713e",
  "@metamask-previews/eip-5792-middleware": "3.0.0-preview-42e3e713e",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-42e3e713e",
  "@metamask-previews/eip1193-permission-middleware": "1.0.3-preview-42e3e713e",
  "@metamask-previews/ens-controller": "19.0.3-preview-42e3e713e",
  "@metamask-previews/error-reporting-service": "3.0.1-preview-42e3e713e",
  "@metamask-previews/eth-block-tracker": "15.0.1-preview-42e3e713e",
  "@metamask-previews/eth-json-rpc-middleware": "23.1.0-preview-42e3e713e",
  "@metamask-previews/eth-json-rpc-provider": "6.0.0-preview-42e3e713e",
  "@metamask-previews/foundryup": "1.0.1-preview-42e3e713e",
  "@metamask-previews/gas-fee-controller": "26.0.3-preview-42e3e713e",
  "@metamask-previews/gator-permissions-controller": "2.0.0-preview-42e3e713e",
  "@metamask-previews/geolocation-controller": "0.0.0-preview-42e3e713e",
  "@metamask-previews/json-rpc-engine": "10.2.3-preview-42e3e713e",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-42e3e713e",
  "@metamask-previews/keyring-controller": "25.1.0-preview-42e3e713e",
  "@metamask-previews/logging-controller": "7.0.1-preview-42e3e713e",
  "@metamask-previews/message-manager": "14.1.0-preview-42e3e713e",
  "@metamask-previews/messenger": "0.3.0-preview-42e3e713e",
  "@metamask-previews/multichain-account-service": "7.0.0-preview-42e3e713e",
  "@metamask-previews/multichain-api-middleware": "1.2.7-preview-42e3e713e",
  "@metamask-previews/multichain-network-controller": "3.0.4-preview-42e3e713e",
  "@metamask-previews/multichain-transactions-controller": "7.0.1-preview-42e3e713e",
  "@metamask-previews/name-controller": "9.0.0-preview-42e3e713e",
  "@metamask-previews/network-controller": "30.0.0-preview-42e3e713e",
  "@metamask-previews/network-enablement-controller": "4.1.2-preview-42e3e713e",
  "@metamask-previews/notification-services-controller": "22.0.0-preview-42e3e713e",
  "@metamask-previews/permission-controller": "12.2.0-preview-42e3e713e",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-42e3e713e",
  "@metamask-previews/perps-controller": "0.0.0-preview-42e3e713e",
  "@metamask-previews/phishing-controller": "16.3.0-preview-42e3e713e",
  "@metamask-previews/polling-controller": "16.0.3-preview-42e3e713e",
  "@metamask-previews/preferences-controller": "22.1.0-preview-42e3e713e",
  "@metamask-previews/profile-metrics-controller": "3.0.1-preview-42e3e713e",
  "@metamask-previews/profile-sync-controller": "27.1.0-preview-42e3e713e",
  "@metamask-previews/ramps-controller": "10.0.0-preview-42e3e713e",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-42e3e713e",
  "@metamask-previews/remote-feature-flag-controller": "4.1.0-preview-42e3e713e",
  "@metamask-previews/sample-controllers": "4.0.3-preview-42e3e713e",
  "@metamask-previews/seedless-onboarding-controller": "8.1.0-preview-42e3e713e",
  "@metamask-previews/selected-network-controller": "26.0.3-preview-42e3e713e",
  "@metamask-previews/shield-controller": "5.0.1-preview-42e3e713e",
  "@metamask-previews/signature-controller": "39.0.4-preview-42e3e713e",
  "@metamask-previews/storage-service": "1.0.0-preview-42e3e713e",
  "@metamask-previews/subscription-controller": "6.0.0-preview-42e3e713e",
  "@metamask-previews/transaction-controller": "62.19.0-preview-42e3e713e",
  "@metamask-previews/transaction-pay-controller": "16.1.1-preview-42e3e713e",
  "@metamask-previews/user-operation-controller": "41.0.3-preview-42e3e713e"
}

Copy link
Copy Markdown
Contributor

@mcmire mcmire left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

@wantedsystem wantedsystem added this pull request to the merge queue Mar 3, 2026
Merged via the queue into main with commit 6bfa6a7 Mar 3, 2026
328 of 334 checks passed
@wantedsystem wantedsystem deleted the feat/add-config-registry-controller branch March 3, 2026 14:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants