Skip to content

Conversation

@sahar-fehri
Copy link
Contributor

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

Explanation

PR to update the CurrencyRatesController so it uses the Price API for exchange rates, with CryptoCompare as a fallback.

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

CurrencyRateController now uses the Price API (with CryptoCompare fallback) via a new required tokenPricesService, and CodefiTokenPricesServiceV2 adds fetchExchangeRates.

  • Controllers:
    • CurrencyRateController: Fetches exchange rates from Price API via tokenPricesService.fetchExchangeRates, with fallback to CryptoCompare; updates polling and state mapping; requires new constructor arg tokenPricesService (BREAKING).
  • Token Prices Service:
    • Abstract API: Adds ExchangeRate/ExchangeRatesByCurrency types and new fetchExchangeRates(args).
    • CodefiTokenPricesServiceV2: Implements fetchExchangeRates using /v1/exchange-rates, supports optional USD rate merging, retries/circuit-breaker hooks, and filtering.
  • Tests:
    • Update CurrencyRateController.test.ts to assert Price API path, fallback behavior, USD inclusion, and polling; adjust mocks across related tests to include fetchExchangeRates.
  • Docs/Meta:
    • Update CHANGELOG.md with breaking change and new functionality.
    • Minor lint threshold updates.

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

@sahar-fehri sahar-fehri changed the title chore: use price-api to fetch exchange rates and fallback to crypto-c… chore: use price-api to fetch exchange rates in currencyRatesController Oct 16, 2025
@sahar-fehri sahar-fehri force-pushed the fix/use-price-api-exchange-rates-instead-of-cryptocompare-in-currencyRatesController branch from 748a952 to a7ce511 Compare October 16, 2025 16:06
@sahar-fehri
Copy link
Contributor Author

@metamaskbot publish-preview

@sahar-fehri
Copy link
Contributor Author

@metamaskbot publish-preview

2 similar comments
@sahar-fehri
Copy link
Contributor Author

@metamaskbot publish-preview

@sahar-fehri
Copy link
Contributor Author

@metamaskbot publish-preview

@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": "1.5.0-preview-870f4d81",
  "@metamask-previews/accounts-controller": "33.1.1-preview-870f4d81",
  "@metamask-previews/address-book-controller": "6.2.0-preview-870f4d81",
  "@metamask-previews/announcement-controller": "7.1.0-preview-870f4d81",
  "@metamask-previews/app-metadata-controller": "1.1.0-preview-870f4d81",
  "@metamask-previews/approval-controller": "7.2.0-preview-870f4d81",
  "@metamask-previews/assets-controllers": "81.0.1-preview-870f4d81",
  "@metamask-previews/base-controller": "8.4.1-preview-870f4d81",
  "@metamask-previews/bridge-controller": "52.0.0-preview-870f4d81",
  "@metamask-previews/bridge-status-controller": "51.0.0-preview-870f4d81",
  "@metamask-previews/build-utils": "3.0.4-preview-870f4d81",
  "@metamask-previews/chain-agnostic-permission": "1.2.0-preview-870f4d81",
  "@metamask-previews/composable-controller": "11.1.0-preview-870f4d81",
  "@metamask-previews/controller-utils": "11.14.1-preview-870f4d81",
  "@metamask-previews/core-backend": "2.1.0-preview-870f4d81",
  "@metamask-previews/delegation-controller": "0.8.0-preview-870f4d81",
  "@metamask-previews/earn-controller": "8.0.1-preview-870f4d81",
  "@metamask-previews/eip-5792-middleware": "1.2.3-preview-870f4d81",
  "@metamask-previews/eip1193-permission-middleware": "1.0.1-preview-870f4d81",
  "@metamask-previews/ens-controller": "17.1.0-preview-870f4d81",
  "@metamask-previews/error-reporting-service": "2.2.1-preview-870f4d81",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-870f4d81",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-870f4d81",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-870f4d81",
  "@metamask-previews/foundryup": "1.0.1-preview-870f4d81",
  "@metamask-previews/gas-fee-controller": "24.1.0-preview-870f4d81",
  "@metamask-previews/gator-permissions-controller": "0.2.1-preview-870f4d81",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-870f4d81",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-870f4d81",
  "@metamask-previews/keyring-controller": "23.1.1-preview-870f4d81",
  "@metamask-previews/logging-controller": "6.1.0-preview-870f4d81",
  "@metamask-previews/message-manager": "13.0.1-preview-870f4d81",
  "@metamask-previews/messenger": "0.3.0-preview-870f4d81",
  "@metamask-previews/multichain-account-service": "1.6.1-preview-870f4d81",
  "@metamask-previews/multichain-api-middleware": "1.2.1-preview-870f4d81",
  "@metamask-previews/multichain-network-controller": "1.0.1-preview-870f4d81",
  "@metamask-previews/multichain-transactions-controller": "5.1.0-preview-870f4d81",
  "@metamask-previews/name-controller": "8.1.0-preview-870f4d81",
  "@metamask-previews/network-controller": "24.3.0-preview-870f4d81",
  "@metamask-previews/network-enablement-controller": "2.1.1-preview-870f4d81",
  "@metamask-previews/notification-services-controller": "18.3.0-preview-870f4d81",
  "@metamask-previews/permission-controller": "11.1.0-preview-870f4d81",
  "@metamask-previews/permission-log-controller": "4.1.0-preview-870f4d81",
  "@metamask-previews/phishing-controller": "14.1.2-preview-870f4d81",
  "@metamask-previews/polling-controller": "14.0.1-preview-870f4d81",
  "@metamask-previews/preferences-controller": "20.0.2-preview-870f4d81",
  "@metamask-previews/profile-sync-controller": "25.1.1-preview-870f4d81",
  "@metamask-previews/rate-limit-controller": "6.1.0-preview-870f4d81",
  "@metamask-previews/remote-feature-flag-controller": "1.9.0-preview-870f4d81",
  "@metamask-previews/sample-controllers": "2.0.1-preview-870f4d81",
  "@metamask-previews/seedless-onboarding-controller": "4.1.0-preview-870f4d81",
  "@metamask-previews/selected-network-controller": "24.0.1-preview-870f4d81",
  "@metamask-previews/shield-controller": "0.3.2-preview-870f4d81",
  "@metamask-previews/signature-controller": "34.0.1-preview-870f4d81",
  "@metamask-previews/subscription-controller": "2.0.0-preview-870f4d81",
  "@metamask-previews/token-search-discovery-controller": "3.5.0-preview-870f4d81",
  "@metamask-previews/transaction-controller": "60.9.0-preview-870f4d81",
  "@metamask-previews/user-operation-controller": "39.2.0-preview-870f4d81"
}

@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": "1.5.0-preview-b3e5b3e7",
  "@metamask-previews/accounts-controller": "33.1.1-preview-b3e5b3e7",
  "@metamask-previews/address-book-controller": "6.2.0-preview-b3e5b3e7",
  "@metamask-previews/announcement-controller": "7.1.0-preview-b3e5b3e7",
  "@metamask-previews/app-metadata-controller": "1.1.0-preview-b3e5b3e7",
  "@metamask-previews/approval-controller": "7.2.0-preview-b3e5b3e7",
  "@metamask-previews/assets-controllers": "81.0.1-preview-b3e5b3e7",
  "@metamask-previews/base-controller": "8.4.1-preview-b3e5b3e7",
  "@metamask-previews/bridge-controller": "52.0.0-preview-b3e5b3e7",
  "@metamask-previews/bridge-status-controller": "51.0.0-preview-b3e5b3e7",
  "@metamask-previews/build-utils": "3.0.4-preview-b3e5b3e7",
  "@metamask-previews/chain-agnostic-permission": "1.2.0-preview-b3e5b3e7",
  "@metamask-previews/composable-controller": "11.1.0-preview-b3e5b3e7",
  "@metamask-previews/controller-utils": "11.14.1-preview-b3e5b3e7",
  "@metamask-previews/core-backend": "2.1.0-preview-b3e5b3e7",
  "@metamask-previews/delegation-controller": "0.8.0-preview-b3e5b3e7",
  "@metamask-previews/earn-controller": "8.0.1-preview-b3e5b3e7",
  "@metamask-previews/eip-5792-middleware": "1.2.3-preview-b3e5b3e7",
  "@metamask-previews/eip1193-permission-middleware": "1.0.1-preview-b3e5b3e7",
  "@metamask-previews/ens-controller": "17.1.0-preview-b3e5b3e7",
  "@metamask-previews/error-reporting-service": "2.2.1-preview-b3e5b3e7",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-b3e5b3e7",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-b3e5b3e7",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-b3e5b3e7",
  "@metamask-previews/foundryup": "1.0.1-preview-b3e5b3e7",
  "@metamask-previews/gas-fee-controller": "24.1.0-preview-b3e5b3e7",
  "@metamask-previews/gator-permissions-controller": "0.2.1-preview-b3e5b3e7",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-b3e5b3e7",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-b3e5b3e7",
  "@metamask-previews/keyring-controller": "23.1.1-preview-b3e5b3e7",
  "@metamask-previews/logging-controller": "6.1.0-preview-b3e5b3e7",
  "@metamask-previews/message-manager": "13.0.1-preview-b3e5b3e7",
  "@metamask-previews/messenger": "0.3.0-preview-b3e5b3e7",
  "@metamask-previews/multichain-account-service": "1.6.1-preview-b3e5b3e7",
  "@metamask-previews/multichain-api-middleware": "1.2.1-preview-b3e5b3e7",
  "@metamask-previews/multichain-network-controller": "1.0.1-preview-b3e5b3e7",
  "@metamask-previews/multichain-transactions-controller": "5.1.0-preview-b3e5b3e7",
  "@metamask-previews/name-controller": "8.1.0-preview-b3e5b3e7",
  "@metamask-previews/network-controller": "24.3.0-preview-b3e5b3e7",
  "@metamask-previews/network-enablement-controller": "2.1.1-preview-b3e5b3e7",
  "@metamask-previews/notification-services-controller": "18.3.0-preview-b3e5b3e7",
  "@metamask-previews/permission-controller": "11.1.0-preview-b3e5b3e7",
  "@metamask-previews/permission-log-controller": "4.1.0-preview-b3e5b3e7",
  "@metamask-previews/phishing-controller": "14.1.2-preview-b3e5b3e7",
  "@metamask-previews/polling-controller": "14.0.1-preview-b3e5b3e7",
  "@metamask-previews/preferences-controller": "20.0.2-preview-b3e5b3e7",
  "@metamask-previews/profile-sync-controller": "25.1.1-preview-b3e5b3e7",
  "@metamask-previews/rate-limit-controller": "6.1.0-preview-b3e5b3e7",
  "@metamask-previews/remote-feature-flag-controller": "1.9.0-preview-b3e5b3e7",
  "@metamask-previews/sample-controllers": "2.0.1-preview-b3e5b3e7",
  "@metamask-previews/seedless-onboarding-controller": "4.1.0-preview-b3e5b3e7",
  "@metamask-previews/selected-network-controller": "24.0.1-preview-b3e5b3e7",
  "@metamask-previews/shield-controller": "0.3.2-preview-b3e5b3e7",
  "@metamask-previews/signature-controller": "34.0.1-preview-b3e5b3e7",
  "@metamask-previews/subscription-controller": "2.0.0-preview-b3e5b3e7",
  "@metamask-previews/token-search-discovery-controller": "3.5.0-preview-b3e5b3e7",
  "@metamask-previews/transaction-controller": "60.9.0-preview-b3e5b3e7",
  "@metamask-previews/user-operation-controller": "39.2.0-preview-b3e5b3e7"
}

@sahar-fehri sahar-fehri marked this pull request as ready for review October 22, 2025 14:17
@sahar-fehri sahar-fehri requested review from a team as code owners October 22, 2025 14:17
@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": "1.6.0-preview-33a7c987",
  "@metamask-previews/accounts-controller": "33.1.1-preview-33a7c987",
  "@metamask-previews/address-book-controller": "6.2.0-preview-33a7c987",
  "@metamask-previews/announcement-controller": "7.1.0-preview-33a7c987",
  "@metamask-previews/app-metadata-controller": "1.1.0-preview-33a7c987",
  "@metamask-previews/approval-controller": "7.2.0-preview-33a7c987",
  "@metamask-previews/assets-controllers": "82.0.0-preview-33a7c987",
  "@metamask-previews/base-controller": "8.4.2-preview-33a7c987",
  "@metamask-previews/bridge-controller": "54.0.0-preview-33a7c987",
  "@metamask-previews/bridge-status-controller": "54.0.0-preview-33a7c987",
  "@metamask-previews/build-utils": "3.0.4-preview-33a7c987",
  "@metamask-previews/chain-agnostic-permission": "1.2.0-preview-33a7c987",
  "@metamask-previews/composable-controller": "11.1.0-preview-33a7c987",
  "@metamask-previews/controller-utils": "11.14.1-preview-33a7c987",
  "@metamask-previews/core-backend": "2.1.0-preview-33a7c987",
  "@metamask-previews/delegation-controller": "0.8.0-preview-33a7c987",
  "@metamask-previews/earn-controller": "8.0.1-preview-33a7c987",
  "@metamask-previews/eip-5792-middleware": "1.2.3-preview-33a7c987",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-33a7c987",
  "@metamask-previews/eip1193-permission-middleware": "1.0.1-preview-33a7c987",
  "@metamask-previews/ens-controller": "17.1.0-preview-33a7c987",
  "@metamask-previews/error-reporting-service": "2.2.1-preview-33a7c987",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-33a7c987",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-33a7c987",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-33a7c987",
  "@metamask-previews/foundryup": "1.0.1-preview-33a7c987",
  "@metamask-previews/gas-fee-controller": "24.1.0-preview-33a7c987",
  "@metamask-previews/gator-permissions-controller": "0.2.1-preview-33a7c987",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-33a7c987",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-33a7c987",
  "@metamask-previews/keyring-controller": "23.1.1-preview-33a7c987",
  "@metamask-previews/logging-controller": "6.1.0-preview-33a7c987",
  "@metamask-previews/message-manager": "13.0.1-preview-33a7c987",
  "@metamask-previews/messenger": "0.3.0-preview-33a7c987",
  "@metamask-previews/multichain-account-service": "1.6.1-preview-33a7c987",
  "@metamask-previews/multichain-api-middleware": "1.2.1-preview-33a7c987",
  "@metamask-previews/multichain-network-controller": "1.0.1-preview-33a7c987",
  "@metamask-previews/multichain-transactions-controller": "5.1.0-preview-33a7c987",
  "@metamask-previews/name-controller": "8.1.0-preview-33a7c987",
  "@metamask-previews/network-controller": "24.3.0-preview-33a7c987",
  "@metamask-previews/network-enablement-controller": "2.1.1-preview-33a7c987",
  "@metamask-previews/notification-services-controller": "18.3.0-preview-33a7c987",
  "@metamask-previews/permission-controller": "11.1.0-preview-33a7c987",
  "@metamask-previews/permission-log-controller": "4.1.0-preview-33a7c987",
  "@metamask-previews/phishing-controller": "14.1.2-preview-33a7c987",
  "@metamask-previews/polling-controller": "14.0.1-preview-33a7c987",
  "@metamask-previews/preferences-controller": "20.1.0-preview-33a7c987",
  "@metamask-previews/profile-sync-controller": "25.1.1-preview-33a7c987",
  "@metamask-previews/rate-limit-controller": "6.1.0-preview-33a7c987",
  "@metamask-previews/remote-feature-flag-controller": "1.9.0-preview-33a7c987",
  "@metamask-previews/sample-controllers": "2.0.1-preview-33a7c987",
  "@metamask-previews/seedless-onboarding-controller": "4.1.0-preview-33a7c987",
  "@metamask-previews/selected-network-controller": "24.0.1-preview-33a7c987",
  "@metamask-previews/shield-controller": "0.4.0-preview-33a7c987",
  "@metamask-previews/signature-controller": "34.0.1-preview-33a7c987",
  "@metamask-previews/subscription-controller": "2.0.0-preview-33a7c987",
  "@metamask-previews/token-search-discovery-controller": "3.5.0-preview-33a7c987",
  "@metamask-previews/transaction-controller": "60.9.0-preview-33a7c987",
  "@metamask-previews/user-operation-controller": "39.2.0-preview-33a7c987"
}

bergarces
bergarces previously approved these changes Oct 23, 2025
salimtb
salimtb previously approved these changes Oct 23, 2025
Copy link
Contributor

@salimtb salimtb left a comment

Choose a reason for hiding this comment

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

build tested , works as expected

@sahar-fehri sahar-fehri dismissed stale reviews from salimtb and bergarces via 44712e5 October 27, 2025 20:00
cursor[bot]

This comment was marked as outdated.

@sahar-fehri sahar-fehri force-pushed the fix/use-price-api-exchange-rates-instead-of-cryptocompare-in-currencyRatesController branch from db7ef9d to d414925 Compare October 27, 2025 20:15
cursor[bot]

This comment was marked as outdated.

@sahar-fehri sahar-fehri enabled auto-merge October 27, 2025 20:21
auto-merge was automatically disabled October 28, 2025 07:37

Merge commits are not allowed on this repository

@sahar-fehri sahar-fehri merged commit f144990 into main Oct 28, 2025
255 checks passed
@sahar-fehri sahar-fehri deleted the fix/use-price-api-exchange-rates-instead-of-cryptocompare-in-currencyRatesController branch October 28, 2025 07:50
github-merge-queue bot pushed a commit to MetaMask/metamask-extension that referenced this pull request Oct 30, 2025
#36986)

## **Description**

PR to introduce fetching exchangeRates from price api and fallback to
crypto compare.

Do not merge until this goes in
MetaMask/core#6863

[![Open in GitHub
Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/36986?quickstart=1)

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: null

## **Related issues**

Fixes:

## **Manual testing steps**

1. Go to this page...
2.
3.

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->


https://github.com/user-attachments/assets/a8dc4ac7-9810-48a5-8fdd-19f0bc9f8b92


### **After**

<!-- [screenshots/recordings] -->


https://github.com/user-attachments/assets/dcb1c517-5b9c-464d-aa27-853c7c99a781


## **Pre-merge author checklist**

- [X] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [X] I've completed the PR template to the best of my ability
- [X] I’ve included tests if applicable
- [X] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [X] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Integrates Codefi price API into `CurrencyRateController` and includes
multichain asset state in balance calculations; wires `allIgnoredAssets`
across state/Sentry and bumps key deps.
> 
> - **Rates/Controller Init**:
> - Inject `CodefiTokenPricesServiceV2` into `CurrencyRateController`
via `tokenPricesService`; update init and tests/mocks.
> - **Selectors/Balances**:
> - Add `getAllIgnoredAssets` and include `{ accountsAssets,
assetsMetadata, allIgnoredAssets }` in balance and balance-change
selectors (`selectBalanceForAllWallets`, etc.).
> - **State/Telemetry**:
> - Add `metamask.allIgnoredAssets` to app state, Sentry background/UI
masks, mock states, and snapshots.
> - **Dependencies**:
> - Bump `@metamask/assets-controllers` to `^85.0.0` and
`@metamask/controller-utils` to `^11.15.0`; remove yarn patch for
controller-utils and lockfile updates.
> - **Misc**:
> - Update storybook test data and integration/e2e fixtures to include
`allIgnoredAssets`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
3ad4311. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Bernardo Garces Chapero <bernardo.chapero@consensys.net>
Co-authored-by: juanmigdr <juanmi.gdr@gmail.com>
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