Skip to content

feat: currentCurrency added to AssetsController state#7991

Merged
bergarces merged 17 commits intomainfrom
current-currency-state-new-controller
Feb 23, 2026
Merged

feat: currentCurrency added to AssetsController state#7991
bergarces merged 17 commits intomainfrom
current-currency-state-new-controller

Conversation

@bergarces
Copy link
Contributor

@bergarces bergarces commented Feb 19, 2026

Explanation

The state for currentCurrency is currently saved in CurrencyRateController. Since that controller is being deprecated, and we need that piece of state to be stored somewhere, it's being moved to the controller that will replace it.

This PR also ensures that PriceDataSource gets updated with the existing currency instead of just being set up at constructor level.

It also forces price updates when the selected currency changes by passing an array of assetIds that need price updates.

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
  • [] I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

Note

Medium Risk
Touches price fetching and persisted controller state; incorrect wiring could lead to stale or missing fiat prices after currency changes across clients.

Overview
Adds a persisted selectedCurrency (ISO 4217, default usd) to AssetsController state and exposes setSelectedCurrency, which triggers a one-off forced price refresh for currently-held assets when the currency changes.

Refactors PriceDataSource to read currency dynamically via a getSelectedCurrency callback (instead of a constructor-time currency option) and extends DataRequest with assetsForPriceUpdate so price middleware can fetch prices for an explicit asset list (not only newly detected assets).

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

@bergarces bergarces requested a review from a team as a code owner February 19, 2026 10:13
@bergarces bergarces changed the title Current-currency-state-new-controller feat: currentCurrency added to AssetsController state Feb 19, 2026
Copy link
Contributor Author

@bergarces bergarces Feb 19, 2026

Choose a reason for hiding this comment

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

Currency is already included as part of the query key for cache purposes, so no changes needed in the client.

@bergarces bergarces requested a review from a team as a code owner February 19, 2026 12:33
dataTypes: ['price'],
assetsForPriceUpdate: Object.values(this.state.assetsBalance).flatMap(
(balances) => Object.keys(balances) as Caip19AssetId[],
),
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This array is consumed by PriceDataSource and gets merged with detectedTokens. Duplicates are checked there, so no need to worry about them here.

@bergarces
Copy link
Contributor Author

@metamaskbot publish-previews

@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.1.1-preview-b0e413453",
  "@metamask-previews/accounts-controller": "36.0.1-preview-b0e413453",
  "@metamask-previews/address-book-controller": "7.0.1-preview-b0e413453",
  "@metamask-previews/ai-controllers": "0.1.0-preview-b0e413453",
  "@metamask-previews/analytics-controller": "1.0.0-preview-b0e413453",
  "@metamask-previews/analytics-data-regulation-controller": "0.0.0-preview-b0e413453",
  "@metamask-previews/announcement-controller": "8.0.0-preview-b0e413453",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-b0e413453",
  "@metamask-previews/approval-controller": "8.0.0-preview-b0e413453",
  "@metamask-previews/assets-controller": "2.0.2-preview-b0e413453",
  "@metamask-previews/assets-controllers": "100.0.2-preview-b0e413453",
  "@metamask-previews/base-controller": "9.0.0-preview-b0e413453",
  "@metamask-previews/bridge-controller": "67.1.1-preview-b0e413453",
  "@metamask-previews/bridge-status-controller": "67.0.1-preview-b0e413453",
  "@metamask-previews/build-utils": "3.0.4-preview-b0e413453",
  "@metamask-previews/chain-agnostic-permission": "1.4.0-preview-b0e413453",
  "@metamask-previews/claims-controller": "0.4.2-preview-b0e413453",
  "@metamask-previews/client-controller": "1.0.0-preview-b0e413453",
  "@metamask-previews/compliance-controller": "1.0.0-preview-b0e413453",
  "@metamask-previews/composable-controller": "12.0.0-preview-b0e413453",
  "@metamask-previews/connectivity-controller": "0.1.0-preview-b0e413453",
  "@metamask-previews/controller-utils": "11.19.0-preview-b0e413453",
  "@metamask-previews/core-backend": "6.0.0-preview-b0e413453",
  "@metamask-previews/delegation-controller": "2.0.1-preview-b0e413453",
  "@metamask-previews/earn-controller": "11.1.1-preview-b0e413453",
  "@metamask-previews/eip-5792-middleware": "2.1.0-preview-b0e413453",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-b0e413453",
  "@metamask-previews/eip1193-permission-middleware": "1.0.3-preview-b0e413453",
  "@metamask-previews/ens-controller": "19.0.3-preview-b0e413453",
  "@metamask-previews/error-reporting-service": "3.0.1-preview-b0e413453",
  "@metamask-previews/eth-block-tracker": "15.0.1-preview-b0e413453",
  "@metamask-previews/eth-json-rpc-middleware": "23.1.0-preview-b0e413453",
  "@metamask-previews/eth-json-rpc-provider": "6.0.0-preview-b0e413453",
  "@metamask-previews/foundryup": "1.0.1-preview-b0e413453",
  "@metamask-previews/gas-fee-controller": "26.0.3-preview-b0e413453",
  "@metamask-previews/gator-permissions-controller": "2.0.0-preview-b0e413453",
  "@metamask-previews/json-rpc-engine": "10.2.2-preview-b0e413453",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-b0e413453",
  "@metamask-previews/keyring-controller": "25.1.0-preview-b0e413453",
  "@metamask-previews/logging-controller": "7.0.1-preview-b0e413453",
  "@metamask-previews/message-manager": "14.1.0-preview-b0e413453",
  "@metamask-previews/messenger": "0.3.0-preview-b0e413453",
  "@metamask-previews/multichain-account-service": "7.0.0-preview-b0e413453",
  "@metamask-previews/multichain-api-middleware": "1.2.7-preview-b0e413453",
  "@metamask-previews/multichain-network-controller": "3.0.4-preview-b0e413453",
  "@metamask-previews/multichain-transactions-controller": "7.0.1-preview-b0e413453",
  "@metamask-previews/name-controller": "9.0.0-preview-b0e413453",
  "@metamask-previews/network-controller": "30.0.0-preview-b0e413453",
  "@metamask-previews/network-enablement-controller": "4.1.2-preview-b0e413453",
  "@metamask-previews/notification-services-controller": "22.0.0-preview-b0e413453",
  "@metamask-previews/permission-controller": "12.2.0-preview-b0e413453",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-b0e413453",
  "@metamask-previews/perps-controller": "0.0.0-preview-b0e413453",
  "@metamask-previews/phishing-controller": "16.3.0-preview-b0e413453",
  "@metamask-previews/polling-controller": "16.0.3-preview-b0e413453",
  "@metamask-previews/preferences-controller": "22.1.0-preview-b0e413453",
  "@metamask-previews/profile-metrics-controller": "3.0.1-preview-b0e413453",
  "@metamask-previews/profile-sync-controller": "27.1.0-preview-b0e413453",
  "@metamask-previews/ramps-controller": "9.0.0-preview-b0e413453",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-b0e413453",
  "@metamask-previews/remote-feature-flag-controller": "4.0.0-preview-b0e413453",
  "@metamask-previews/sample-controllers": "4.0.3-preview-b0e413453",
  "@metamask-previews/seedless-onboarding-controller": "8.0.0-preview-b0e413453",
  "@metamask-previews/selected-network-controller": "26.0.3-preview-b0e413453",
  "@metamask-previews/shield-controller": "5.0.1-preview-b0e413453",
  "@metamask-previews/signature-controller": "39.0.4-preview-b0e413453",
  "@metamask-previews/storage-service": "1.0.0-preview-b0e413453",
  "@metamask-previews/subscription-controller": "6.0.0-preview-b0e413453",
  "@metamask-previews/transaction-controller": "62.18.0-preview-b0e413453",
  "@metamask-previews/transaction-pay-controller": "16.0.0-preview-b0e413453",
  "@metamask-previews/user-operation-controller": "41.0.3-preview-b0e413453"
}

@bergarces bergarces enabled auto-merge February 23, 2026 17:49
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.

// Only fetch prices for detected assets (assets without metadata)
// The subscription handles fetching prices for all existing assets
if (!response.detectedAssets) {
if (!response.detectedAssets && !request.assetsForPriceUpdate?.length) {
Copy link

Choose a reason for hiding this comment

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

Price-only forceUpdate may not refetch

High Severity

PriceDataSource.assetsMiddleware now returns early unless response.detectedAssets exists or request.assetsForPriceUpdate is non-empty, so any getAssets(..., { forceUpdate: true, dataTypes: ['price'] }) call that doesn’t provide assetsForPriceUpdate can silently skip fetching and return stale prices.

Additional Locations (1)

Fix in Cursor Fix in Web

),
}).catch((error) => {
log('Failed to fetch asset prices after current currency change', error);
});
Copy link

Choose a reason for hiding this comment

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

Currency switch can overwrite newer prices

Medium Severity

setSelectedCurrency fires an async getAssets price refresh without canceling or sequencing in-flight refreshes, so rapid currency changes can complete out of order and write older-currency price results after newer-currency results, leaving assetsPrice inconsistent with selectedCurrency.

Fix in Cursor Fix in Web

@bergarces bergarces added this pull request to the merge queue Feb 23, 2026
Merged via the queue into main with commit e02f920 Feb 23, 2026
310 checks passed
@bergarces bergarces deleted the current-currency-state-new-controller branch February 23, 2026 17:56
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