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 ID integration for token pricing.

  • Add /v2/supportedNetworks integration in token-prices-service with caching, background refresh, and fallback; export fetchSupportedNetworks, getSupportedNetworks, resetSupportedNetworksCache
  • Update CodefiTokenPricesServiceV2 to: accept setNativeAssetIdentifiers(), build CAIP-19 for natives via provided map, validate chains via dynamic lists, and expose updateSupportedNetworks()
  • TokenRatesController now calls NetworkEnablementController:getState to pass nativeAssetIdentifiers into the token price service on init
  • Extend service interface with NativeAssetIdentifiersMap and optional setNativeAssetIdentifiers(); update exports and tests accordingly
  • Add @metamask/network-enablement-controller dependency and TypeScript project references

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"
}

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 2 potential issues.

) {
lastFetchedSupportedNetworks = response as SupportedNetworksResponse;
return lastFetchedSupportedNetworks;
}
Copy link

Choose a reason for hiding this comment

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

Incomplete API response validation causes runtime crash

Medium Severity

The validation in fetchSupportedNetworks only checks for fullSupport and partialSupport top-level properties but doesn't verify the nested structure. If the API returns { fullSupport: [], partialSupport: {} } (missing spotPricesV3), the validation passes, the malformed response gets cached, and getSupportedChainIdsV3AsHex will crash when spreading undefined from partialSupport.spotPricesV3.

Additional Locations (1)

Fix in Cursor Fix in Web

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.

2 participants