Skip to content

Conversation

@sahar-fehri
Copy link
Contributor

@sahar-fehri sahar-fehri commented Oct 30, 2025

Explanation

Price api already exposes its supported chainIds here https://price.api.cx.metamask.io/v1/supportedNetworks.
Instead of relying on the old static array; this array pulls the supported chainIds from the API directly.

This would make it possible in future to add support for new tokens without making a core relase.

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, highlighting breaking changes as necessary
  • I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes

Note

Replaces the static supported-chain list with a dynamic fetch from the Price API, adds a cached supportedChainIds state to TokenRatesController, and updates APIs/types to use it.

  • Token Prices Service (codefi-v2):
    • Add fetchSupportedChainIds() (uses GET /v1/supportedNetworks), return hex chain IDs.
    • Remove exported SUPPORTED_CHAIN_IDS and validateChainIdSupported.
    • Generalize types to Hex chain IDs; keep getNativeTokenAddress.
  • TokenRatesController:
    • Add supportedChainIds cache in state with timestamp and DEFAULT_CACHE_REFRESH_THRESHOLD (24h).
    • Validate chains against cached supportedChainIds; auto-refresh cache when stale.
    • Update default state/metadata and polling/update flows accordingly.
  • Utils (assetsUtil):
    • fetchTokenContractExchangeRates now requires supportedChainIds arg and uses it for chain validation.
  • Exports:
    • Remove SUPPORTED_CHAIN_IDS from public exports.
  • Tests/Docs:
    • Update tests across packages and changelog to reflect new API and behavior.

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

@sahar-fehri sahar-fehri changed the title Chore/fetch price api supported chain ids Chore: fetch price api supported chain ids Oct 30, 2025
@sahar-fehri
Copy link
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
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": "2.0.0-preview-1ae9d4fd",
  "@metamask-previews/accounts-controller": "34.0.0-preview-1ae9d4fd",
  "@metamask-previews/address-book-controller": "7.0.0-preview-1ae9d4fd",
  "@metamask-previews/announcement-controller": "8.0.0-preview-1ae9d4fd",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-1ae9d4fd",
  "@metamask-previews/approval-controller": "8.0.0-preview-1ae9d4fd",
  "@metamask-previews/assets-controllers": "85.0.0-preview-1ae9d4fd",
  "@metamask-previews/base-controller": "9.0.0-preview-1ae9d4fd",
  "@metamask-previews/bridge-controller": "57.0.0-preview-1ae9d4fd",
  "@metamask-previews/bridge-status-controller": "57.0.0-preview-1ae9d4fd",
  "@metamask-previews/build-utils": "3.0.4-preview-1ae9d4fd",
  "@metamask-previews/chain-agnostic-permission": "1.2.2-preview-1ae9d4fd",
  "@metamask-previews/composable-controller": "12.0.0-preview-1ae9d4fd",
  "@metamask-previews/controller-utils": "11.15.0-preview-1ae9d4fd",
  "@metamask-previews/core-backend": "4.0.0-preview-1ae9d4fd",
  "@metamask-previews/delegation-controller": "1.0.0-preview-1ae9d4fd",
  "@metamask-previews/earn-controller": "9.0.0-preview-1ae9d4fd",
  "@metamask-previews/eip-5792-middleware": "2.0.0-preview-1ae9d4fd",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-1ae9d4fd",
  "@metamask-previews/eip1193-permission-middleware": "1.0.2-preview-1ae9d4fd",
  "@metamask-previews/ens-controller": "18.0.0-preview-1ae9d4fd",
  "@metamask-previews/error-reporting-service": "3.0.0-preview-1ae9d4fd",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-1ae9d4fd",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-1ae9d4fd",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-1ae9d4fd",
  "@metamask-previews/foundryup": "1.0.1-preview-1ae9d4fd",
  "@metamask-previews/gas-fee-controller": "25.0.0-preview-1ae9d4fd",
  "@metamask-previews/gator-permissions-controller": "0.3.0-preview-1ae9d4fd",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-1ae9d4fd",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-1ae9d4fd",
  "@metamask-previews/keyring-controller": "24.0.0-preview-1ae9d4fd",
  "@metamask-previews/logging-controller": "7.0.0-preview-1ae9d4fd",
  "@metamask-previews/message-manager": "14.0.0-preview-1ae9d4fd",
  "@metamask-previews/messenger": "0.3.0-preview-1ae9d4fd",
  "@metamask-previews/multichain-account-service": "2.0.0-preview-1ae9d4fd",
  "@metamask-previews/multichain-api-middleware": "1.2.4-preview-1ae9d4fd",
  "@metamask-previews/multichain-network-controller": "2.0.0-preview-1ae9d4fd",
  "@metamask-previews/multichain-transactions-controller": "6.0.0-preview-1ae9d4fd",
  "@metamask-previews/name-controller": "9.0.0-preview-1ae9d4fd",
  "@metamask-previews/network-controller": "25.0.0-preview-1ae9d4fd",
  "@metamask-previews/network-enablement-controller": "3.1.0-preview-1ae9d4fd",
  "@metamask-previews/notification-services-controller": "19.0.0-preview-1ae9d4fd",
  "@metamask-previews/permission-controller": "12.1.0-preview-1ae9d4fd",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-1ae9d4fd",
  "@metamask-previews/phishing-controller": "15.0.0-preview-1ae9d4fd",
  "@metamask-previews/polling-controller": "15.0.0-preview-1ae9d4fd",
  "@metamask-previews/preferences-controller": "21.0.0-preview-1ae9d4fd",
  "@metamask-previews/profile-sync-controller": "26.0.0-preview-1ae9d4fd",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-1ae9d4fd",
  "@metamask-previews/remote-feature-flag-controller": "2.0.0-preview-1ae9d4fd",
  "@metamask-previews/sample-controllers": "3.0.0-preview-1ae9d4fd",
  "@metamask-previews/seedless-onboarding-controller": "5.0.0-preview-1ae9d4fd",
  "@metamask-previews/selected-network-controller": "25.0.0-preview-1ae9d4fd",
  "@metamask-previews/shield-controller": "1.1.0-preview-1ae9d4fd",
  "@metamask-previews/signature-controller": "35.0.0-preview-1ae9d4fd",
  "@metamask-previews/subscription-controller": "3.1.0-preview-1ae9d4fd",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-1ae9d4fd",
  "@metamask-previews/transaction-controller": "61.1.0-preview-1ae9d4fd",
  "@metamask-previews/transaction-pay-controller": "1.0.0-preview-1ae9d4fd",
  "@metamask-previews/user-operation-controller": "40.0.0-preview-1ae9d4fd"
}

@sahar-fehri
Copy link
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
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": "2.0.0-preview-eee46d4b",
  "@metamask-previews/accounts-controller": "34.0.0-preview-eee46d4b",
  "@metamask-previews/address-book-controller": "7.0.0-preview-eee46d4b",
  "@metamask-previews/announcement-controller": "8.0.0-preview-eee46d4b",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-eee46d4b",
  "@metamask-previews/approval-controller": "8.0.0-preview-eee46d4b",
  "@metamask-previews/assets-controllers": "86.0.0-preview-eee46d4b",
  "@metamask-previews/base-controller": "9.0.0-preview-eee46d4b",
  "@metamask-previews/bridge-controller": "58.0.0-preview-eee46d4b",
  "@metamask-previews/bridge-status-controller": "58.0.0-preview-eee46d4b",
  "@metamask-previews/build-utils": "3.0.4-preview-eee46d4b",
  "@metamask-previews/chain-agnostic-permission": "1.2.2-preview-eee46d4b",
  "@metamask-previews/composable-controller": "12.0.0-preview-eee46d4b",
  "@metamask-previews/controller-utils": "11.15.0-preview-eee46d4b",
  "@metamask-previews/core-backend": "4.0.0-preview-eee46d4b",
  "@metamask-previews/delegation-controller": "1.0.0-preview-eee46d4b",
  "@metamask-previews/earn-controller": "9.0.0-preview-eee46d4b",
  "@metamask-previews/eip-5792-middleware": "2.0.0-preview-eee46d4b",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-eee46d4b",
  "@metamask-previews/eip1193-permission-middleware": "1.0.2-preview-eee46d4b",
  "@metamask-previews/ens-controller": "18.0.0-preview-eee46d4b",
  "@metamask-previews/error-reporting-service": "3.0.0-preview-eee46d4b",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-eee46d4b",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-eee46d4b",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-eee46d4b",
  "@metamask-previews/foundryup": "1.0.1-preview-eee46d4b",
  "@metamask-previews/gas-fee-controller": "25.0.0-preview-eee46d4b",
  "@metamask-previews/gator-permissions-controller": "0.3.0-preview-eee46d4b",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-eee46d4b",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-eee46d4b",
  "@metamask-previews/keyring-controller": "24.0.0-preview-eee46d4b",
  "@metamask-previews/logging-controller": "7.0.0-preview-eee46d4b",
  "@metamask-previews/message-manager": "14.0.0-preview-eee46d4b",
  "@metamask-previews/messenger": "0.3.0-preview-eee46d4b",
  "@metamask-previews/multichain-account-service": "2.0.0-preview-eee46d4b",
  "@metamask-previews/multichain-api-middleware": "1.2.4-preview-eee46d4b",
  "@metamask-previews/multichain-network-controller": "2.0.0-preview-eee46d4b",
  "@metamask-previews/multichain-transactions-controller": "6.0.0-preview-eee46d4b",
  "@metamask-previews/name-controller": "9.0.0-preview-eee46d4b",
  "@metamask-previews/network-controller": "25.0.0-preview-eee46d4b",
  "@metamask-previews/network-enablement-controller": "3.1.0-preview-eee46d4b",
  "@metamask-previews/notification-services-controller": "19.0.0-preview-eee46d4b",
  "@metamask-previews/permission-controller": "12.1.0-preview-eee46d4b",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-eee46d4b",
  "@metamask-previews/phishing-controller": "15.0.0-preview-eee46d4b",
  "@metamask-previews/polling-controller": "15.0.0-preview-eee46d4b",
  "@metamask-previews/preferences-controller": "21.0.0-preview-eee46d4b",
  "@metamask-previews/profile-sync-controller": "26.0.0-preview-eee46d4b",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-eee46d4b",
  "@metamask-previews/remote-feature-flag-controller": "2.0.0-preview-eee46d4b",
  "@metamask-previews/sample-controllers": "3.0.0-preview-eee46d4b",
  "@metamask-previews/seedless-onboarding-controller": "6.0.0-preview-eee46d4b",
  "@metamask-previews/selected-network-controller": "25.0.0-preview-eee46d4b",
  "@metamask-previews/shield-controller": "1.1.0-preview-eee46d4b",
  "@metamask-previews/signature-controller": "35.0.0-preview-eee46d4b",
  "@metamask-previews/subscription-controller": "3.1.0-preview-eee46d4b",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-eee46d4b",
  "@metamask-previews/transaction-controller": "61.1.0-preview-eee46d4b",
  "@metamask-previews/transaction-pay-controller": "2.0.0-preview-eee46d4b",
  "@metamask-previews/user-operation-controller": "40.0.0-preview-eee46d4b"
}

@sahar-fehri
Copy link
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

github-actions bot commented Nov 4, 2025

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": "2.0.0-preview-8315c2ec",
  "@metamask-previews/accounts-controller": "34.0.0-preview-8315c2ec",
  "@metamask-previews/address-book-controller": "7.0.0-preview-8315c2ec",
  "@metamask-previews/announcement-controller": "8.0.0-preview-8315c2ec",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-8315c2ec",
  "@metamask-previews/approval-controller": "8.0.0-preview-8315c2ec",
  "@metamask-previews/assets-controllers": "87.0.0-preview-8315c2ec",
  "@metamask-previews/base-controller": "9.0.0-preview-8315c2ec",
  "@metamask-previews/bridge-controller": "59.0.0-preview-8315c2ec",
  "@metamask-previews/bridge-status-controller": "59.0.0-preview-8315c2ec",
  "@metamask-previews/build-utils": "3.0.4-preview-8315c2ec",
  "@metamask-previews/chain-agnostic-permission": "1.2.2-preview-8315c2ec",
  "@metamask-previews/composable-controller": "12.0.0-preview-8315c2ec",
  "@metamask-previews/controller-utils": "11.15.0-preview-8315c2ec",
  "@metamask-previews/core-backend": "4.0.0-preview-8315c2ec",
  "@metamask-previews/delegation-controller": "1.0.0-preview-8315c2ec",
  "@metamask-previews/earn-controller": "9.0.0-preview-8315c2ec",
  "@metamask-previews/eip-5792-middleware": "2.0.0-preview-8315c2ec",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-8315c2ec",
  "@metamask-previews/eip1193-permission-middleware": "1.0.2-preview-8315c2ec",
  "@metamask-previews/ens-controller": "18.0.0-preview-8315c2ec",
  "@metamask-previews/error-reporting-service": "3.0.0-preview-8315c2ec",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-8315c2ec",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-8315c2ec",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-8315c2ec",
  "@metamask-previews/foundryup": "1.0.1-preview-8315c2ec",
  "@metamask-previews/gas-fee-controller": "25.0.0-preview-8315c2ec",
  "@metamask-previews/gator-permissions-controller": "0.3.0-preview-8315c2ec",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-8315c2ec",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-8315c2ec",
  "@metamask-previews/keyring-controller": "24.0.0-preview-8315c2ec",
  "@metamask-previews/logging-controller": "7.0.0-preview-8315c2ec",
  "@metamask-previews/message-manager": "14.0.0-preview-8315c2ec",
  "@metamask-previews/messenger": "0.3.0-preview-8315c2ec",
  "@metamask-previews/multichain-account-service": "2.1.0-preview-8315c2ec",
  "@metamask-previews/multichain-api-middleware": "1.2.4-preview-8315c2ec",
  "@metamask-previews/multichain-network-controller": "2.0.0-preview-8315c2ec",
  "@metamask-previews/multichain-transactions-controller": "6.0.0-preview-8315c2ec",
  "@metamask-previews/name-controller": "9.0.0-preview-8315c2ec",
  "@metamask-previews/network-controller": "25.0.0-preview-8315c2ec",
  "@metamask-previews/network-enablement-controller": "3.1.0-preview-8315c2ec",
  "@metamask-previews/notification-services-controller": "19.0.0-preview-8315c2ec",
  "@metamask-previews/permission-controller": "12.1.0-preview-8315c2ec",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-8315c2ec",
  "@metamask-previews/phishing-controller": "15.0.0-preview-8315c2ec",
  "@metamask-previews/polling-controller": "15.0.0-preview-8315c2ec",
  "@metamask-previews/preferences-controller": "21.0.0-preview-8315c2ec",
  "@metamask-previews/profile-sync-controller": "26.0.0-preview-8315c2ec",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-8315c2ec",
  "@metamask-previews/remote-feature-flag-controller": "2.0.0-preview-8315c2ec",
  "@metamask-previews/sample-controllers": "3.0.0-preview-8315c2ec",
  "@metamask-previews/seedless-onboarding-controller": "6.1.0-preview-8315c2ec",
  "@metamask-previews/selected-network-controller": "25.0.0-preview-8315c2ec",
  "@metamask-previews/shield-controller": "1.2.0-preview-8315c2ec",
  "@metamask-previews/signature-controller": "35.0.0-preview-8315c2ec",
  "@metamask-previews/subscription-controller": "3.2.0-preview-8315c2ec",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-8315c2ec",
  "@metamask-previews/transaction-controller": "61.1.0-preview-8315c2ec",
  "@metamask-previews/transaction-pay-controller": "3.0.0-preview-8315c2ec",
  "@metamask-previews/user-operation-controller": "40.0.0-preview-8315c2ec"
}

@sahar-fehri sahar-fehri marked this pull request as ready for review November 4, 2025 15:33
@sahar-fehri sahar-fehri requested review from a team as code owners November 4, 2025 15:33

const DEFAULT_INTERVAL = 180000;

export const DEFAULT_CACHE_REFRESH_THRESHOLD = 1000 * 60 * 60 * 24; // 24 hours
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I'm caching this supported chains data because its not the kind of data that will change very often.

},
"packages/assets-controllers/src/token-prices-service/codefi-v2.ts": {
"jsdoc/tag-lines": 2
"jsdoc/tag-lines": 1
Copy link
Contributor

@Prithpal-Sooriya Prithpal-Sooriya Nov 5, 2025

Choose a reason for hiding this comment

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

Nice cleanup!
There's only 1 more warning left on this file... can we also clean it up? If it's difficult happy to leave it.

},
supportedChainIds: {
includeInStateLogs: false,
persist: true,
Copy link
Contributor

Choose a reason for hiding this comment

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

What is the benefit of making it part of the state and persisted? The client seems to just need so that it can pass it back to fetch the token rates, which is a round-trip and a synchronisation issue that we could avoid.

Couldn't we just keep it as part of the token prices service state? It can be initialised empty, fetched on the first load and then reused afterwards. That would also mean we don't need to use a cache, it will just get fetched whenever we start the client and remain there until it's restarted.

What do you think?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Could you elaborate more on "Make it as part of the token prices service state" 🙏 Are you here referencing the codefi-v2.ts service?

Copy link
Contributor

Choose a reason for hiding this comment

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

Ok, I've just seen that we actually need the list of chains because we are fetching historical prices directly from the client... Why don't we move that call to the price service then?

Seems like a bit of overkill having to orchestrate new state just for that reason.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

We fetch historical prices and exchangeRates (in some cases) directly from clients.
Again, if we move those calls to the price service; how would it solve the issue? I think the services we have do not have state; usually the controller is what saves the state correct?

Also this was not done only for clients, the polling we have on tokenRatesController (every 3mins) would use the cached value of the supported chainIds instead of making a call to the api every time

Copy link
Contributor

@bergarces bergarces Nov 5, 2025

Choose a reason for hiding this comment

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

Could you elaborate more on "Make it as part of the token prices service state" 🙏 Are you here referencing the codefi-v2.ts service?

Yes, instead of an exported constant SUPPORTED_CHAIN_IDS, make the supportedChainIds a property of CodefiTokenPricesServiceV2. Gets initialised as undefined or [] at constructor time then, when trying to access it, fetch it if empty and never fetch it again.

Whenever the wallet restarts and the service gets initialised again, it will fetch again only once.

Since it will be part of the the class state, you won't have to pass it to every single time to fetchTokenContractExchangeRates and fetchTokenExchangeRates.

Although on second look, it does look like we instantiate a new CodefiTokenPricesServiceV2 every time we call any of those methods (which is crazy, but I don't know how big a refactor it would be to change it).

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