Skip to content

Conversation

@salimtb
Copy link
Contributor

@salimtb salimtb commented Nov 15, 2025

Explanation

This PR removes the fallback to CryptoCompare API in both CurrencyRatesController and TokenRatesController.

Current State

Previously, when the primary price data source failed, both controllers would fall back to the CryptoCompare API to fetch currency and token rates. This added complexity to the codebase and introduced a dependency on an additional external service.

Solution

This change removes the CryptoCompare fallback logic from both controllers, simplifying the rate fetching flow and reducing external dependencies. The controllers will now rely solely on the primary price data source without attempting to fall back to CryptoCompare when the primary source fails.

Rationale

  • Reduces maintenance overhead by removing redundant API integration
  • Simplifies error handling and rate fetching logic
  • Aligns with the deprecation/removal of CryptoCompare as a fallback service
  • The primary price data source has proven reliable enough that the fallback is no longer necessary

extension PR: MetaMask/metamask-extension#37884
mobile PR: MetaMask/metamask-mobile#22772

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

Eliminates CryptoCompare fallbacks in currency and token rate controllers, replacing them with a token-prices service–based fallback and updating tests/behaviors accordingly.

  • BREAKING:
    • Remove CryptoCompare fallback from CurrencyRateController and TokenRatesController.
  • CurrencyRateController:
    • Drop fetchMultiExchangeRate; primary source remains fetchExchangeRates from token-prices service.
    • Add fallback using fetchTokenPrices mapped via NetworkController:getState to chain IDs and getNativeTokenAddress.
    • On failures, update state with null values instead of throwing; skip empty/undefined native currencies.
    • Allow includeUsdRate; maintain polling behavior; add NetworkController:getState to allowed actions.
  • TokenRatesController:
    • Replace unsupported-native-currency path: fetch native+tokens in usd, then convert to native using native token USD price.
    • Use getNativeTokenAddress; return empty when native USD price unavailable; keep batch fetching and consolidate state updates.
  • Tests:
    • Remove nock/CryptoCompare stubs; update expectations to new fallback and failure semantics; add network state helpers.
  • Docs/Changelog:
    • Update CHANGELOG.md noting breaking removal of CryptoCompare fallback; bump @metamask/core-backend.

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

@salimtb salimtb changed the title Fix/remove crypto compare fallback fix: remove crypto compare fallback Nov 15, 2025
@salimtb
Copy link
Contributor Author

salimtb commented Nov 15, 2025

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

@salimtb salimtb marked this pull request as ready for review November 17, 2025 14:35
@salimtb salimtb requested review from a team as code owners November 17, 2025 14:35
@Prithpal-Sooriya
Copy link
Contributor

Tested extension - confirmed that I do not see any crypto-compare API calls

@salimtb
Copy link
Contributor Author

salimtb commented Nov 17, 2025

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

@salimtb
Copy link
Contributor Author

salimtb commented Nov 17, 2025

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

@salimtb salimtb added this pull request to the merge queue Nov 18, 2025
@salimtb salimtb removed this pull request from the merge queue due to a manual request Nov 18, 2025
@salimtb salimtb enabled auto-merge November 18, 2025 10:07
@salimtb salimtb added this pull request to the merge queue Nov 18, 2025
Merged via the queue into main with commit 8c2125e Nov 18, 2025
273 checks passed
@salimtb salimtb deleted the fix/remove-crypto-compare-fallback branch November 18, 2025 10:12
github-merge-queue bot pushed a commit that referenced this pull request Nov 18, 2025
…st (#7181)

## Explanation

**What is the current state of things and why does it need to change?**

The `CurrencyRateController` has a fallback mechanism that uses spot
prices from the token prices service when the primary exchange rates API
fails. However, this fallback was sending duplicate native token
addresses (the 0x0000...0000 address) to the API endpoint, causing
requests to fail with the error: `"All tokenAddresses's elements must be
unique"`.

**What is the solution your changes offer and how does it work?**

The issue occurred because:
1. The `CurrencyRateController` was explicitly passing the native token
address in the `tokenAddresses` array: `tokenAddresses:
[nativeTokenAddress]`
2. The `fetchTokenPrices` method in `CodefiTokenPricesServiceV2`
automatically prepends the native token address to any token addresses
passed to it (line 496 in `codefi-v2.ts`)
3. This resulted in the native token address appearing twice in the API
URL

The fix changes `tokenAddresses: [nativeTokenAddress]` to
`tokenAddresses: []` since the service already handles including the
native token address automatically. This ensures each address appears
only once in the final API request.

**Are there any changes whose purpose might not be obvious to those
unfamiliar with the domain?**

The empty array `[]` might seem counterintuitive, but it's the correct
approach because the `fetchTokenPrices` method is designed to always
include the native token address by default for any chain.

## References

Fixes the duplicate token address validation error in the spot price
fallback mechanism introduced after removing the CryptoCompare fallback
in #7167.

## Checklist

- [ ] I've updated the test suite for new or updated code as appropriate
- [x] I've updated documentation (JSDoc, Markdown, etc.) for new or
updated code as appropriate
- [x] I've communicated my changes to consumers by [updating changelogs
for packages I've
changed](https://github.com/MetaMask/core/tree/main/docs/contributing.md#updating-changelogs),
highlighting breaking changes as necessary
- [ ] I've prepared draft pull requests for clients and consumer
packages to resolve any breaking changes

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Stops sending the native token address explicitly to
`fetchTokenPrices` (pass `tokenAddresses: []`) to avoid duplicates in
spot price fallback requests.
> 
> - **CurrencyRateController**:
> - Update fallback spot price logic to call `fetchTokenPrices({
chainId, tokenAddresses: [], currency })`, relying on the service to
include the native token automatically.
> - **Tests**:
> - Adjust expectations in `CurrencyRateController.test.ts` to assert
`tokenAddresses: []` for ETH/BNB/POL scenarios and related calls.
> - **Changelog**:
> - Add Unreleased fix entry describing duplicate native token address
issue in spot price fallback.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
64c9a6b. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
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