Skip to content

Conversation

@salimtb
Copy link
Contributor

@salimtb salimtb commented Jan 24, 2026

Explanation

Current State

The CodefiTokenPricesServiceV2 in assets-controllers uses a hardcoded list (SPOT_PRICES_SUPPORT_INFO) to determine which blockchain networks are supported by the Price API's /v3/spot-prices endpoint. This approach has several drawbacks:

  1. Maintenance overhead: Every time a new network is added to the Price API, a code change is required to update the hardcoded list
  2. Deployment delays: New network support requires a release cycle before users can benefit from it
  3. Potential staleness: The hardcoded list can become out of sync with the actual API capabilities

Additionally, the native asset CAIP-19 identifiers (e.g., eip155:1/slip44:60 for ETH) were also hardcoded, duplicating data that already exists in NetworkEnablementController.state.nativeAssetIdentifiers.

Solution

This PR introduces dynamic fetching of supported networks from the Price API's /v2/supportedNetworks endpoint:

  1. New API integration: Added fetchSupportedNetworks() function that fetches from /v2/supportedNetworks and caches the response
  2. Graceful fallback: If the API call fails, the existing hardcoded list is used as a fallback
  3. Background refresh: The supported networks list is refreshed in the background during each fetchTokenPrices() call
  4. Native asset integration: Added setNativeAssetIdentifiers() method to receive native asset mappings from NetworkEnablementController, eliminating duplication
  5. TokenRatesController integration: The controller now automatically retrieves and passes nativeAssetIdentifiers from NetworkEnablementController to the token prices service

Changes Summary

  • codefi-v2.ts: Added dynamic network fetching, caching, and native asset identifier support
  • abstract-token-prices-service.ts: Added NativeAssetIdentifiersMap type and optional setNativeAssetIdentifiers() method to interface
  • TokenRatesController.ts: Integrated with NetworkEnablementController to pass native asset identifiers
  • Dependencies: Added @metamask/network-enablement-controller as a dependency

References

  • Related to Price API v2 supportedNetworks endpoint: https://price.api.cx.metamask.io/v2/supportedNetworks
  • Uses NetworkEnablementController.state.nativeAssetIdentifiers for CAIP-19 native token mappings

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

Introduces dynamic network support and native asset identifier integration for token pricing.

  • Add fetchSupportedNetworks(), getSupportedNetworks(), and resetSupportedNetworksCache() in token-prices-service (fallback to hardcoded list; background refresh during fetchTokenPrices)
  • Update CodefiTokenPricesServiceV2 to:
    • accept setNativeAssetIdentifiers() and use CAIP-19 IDs for native tokens
    • validate chains against the dynamic networks list
    • expose updateSupportedNetworks()
  • TokenRatesController now calls NetworkEnablementController:getState at init to pass nativeAssetIdentifiers to the token prices service
  • Export NativeAssetIdentifiersMap; add @metamask/network-enablement-controller dependency and TS references; expand tests for new behavior

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

@salimtb salimtb marked this pull request as ready for review January 25, 2026 00:08
@salimtb salimtb requested review from a team as code owners January 25, 2026 00:08
@salimtb
Copy link
Contributor Author

salimtb commented Jan 25, 2026

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

// This ensures the list stays fresh during normal polling
// Note: fetchSupportedNetworks handles errors internally and always resolves
// eslint-disable-next-line @typescript-eslint/no-floating-promises
fetchSupportedNetworks();
Copy link
Member

Choose a reason for hiding this comment

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

I dont understand why we are calling the fetchSupportedNetworks function here. That function is not storing anything in state so why would we need to call it here if we are not making use of the response at all

Copy link
Contributor Author

Choose a reason for hiding this comment

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

fetchSupportedNetworks() updates a module-level cache (lastFetchedSupportedNetworks). The background call keeps this cache fresh so that subsequent calls to getSupportedChainIdsV3AsHex() return up-to-date data.
This is the same pattern used for fetchSupportedCurrencies() in fetchExchangeRates().

Copy link
Member

Choose a reason for hiding this comment

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

Oh missed that, thanks! Why did you change it to be blocking instead of non-blocking now?

*
* @returns The supported networks response.
*/
export async function fetchSupportedNetworks(): Promise<SupportedNetworksResponse> {
Copy link
Contributor

Choose a reason for hiding this comment

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

You could find the call in core-backend

Copy link

@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 4 potential issues.

@salimtb salimtb force-pushed the feat/dynamic-supported-networks-price-api branch from 4324802 to 863782e Compare January 26, 2026 11:20
Copy link
Contributor

Choose a reason for hiding this comment

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

Should we finally rename codefi-v2 😄

We can do this later.

@salimtb salimtb added this pull request to the merge queue Jan 26, 2026
Merged via the queue into main with commit 49c06fa Jan 26, 2026
599 checks passed
@salimtb salimtb deleted the feat/dynamic-supported-networks-price-api branch January 26, 2026 11:46
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.

5 participants