Skip to content

Releases: MetaMask/core

838.0.0

26 Feb 20:59
501cfdc

Choose a tag to compare

@metamask/eip-5792-middleware 3.0.0

Added

  • Pass requiredAssets from wallet_sendCalls to addTransaction and addTransactionBatch (#7819)
  • Bump @metamask/transaction-controller from 62.16.0 to 62.17.0 (#7897)

Changed

837.0.0

26 Feb 17:54
66545ab

Choose a tag to compare

@metamask/bridge-controller 67.3.0

Added

  • Added optional ab_tests property to RequiredEventContextFromClient and CrossChainSwapsEventProperties types for A/B test experiment attribution (#8007)

Changed

  • Bump @metamask/remote-feature-flag-controller from ^4.0.0 to ^4.1.0 (#8041)
  • Bump @metamask/transaction-controller from ^62.18.0 to ^62.19.0 (#8031)
  • Bump @metamask/assets-controllers from ^100.0.2 to ^100.0.3 (#8029)

836.0.0

26 Feb 09:14
e470339

Choose a tag to compare

@metamask/assets-controller 2.1.0

Added

  • Add PendingTokenMetadata type and optional pendingMetadata parameter to addCustomAsset(accountId, assetId, pendingMetadata?). When provided (e.g. from the extension's pending-tokens flow), token metadata is written to assetsInfo immediately so the UI can render the token without waiting for the pipeline (#8021)
  • Add currentCurrency state (ISO 4217 code, default 'usd') and setCurrentCurrency(currentCurrency) to AssetsController. Changing the currency updates state and triggers a one-off price refetch so displayed prices use the new currency (#7991)
  • Add support for forcibly updating prices (#7991)
  • Add parallel middlewares in ParallelMiddleware.ts: createParallelBalanceMiddleware runs balance data sources (Accounts API, Snap, RPC) in parallel with chain partitioning and a fallback round for failed chains; createParallelMiddleware runs TokenDataSource and PriceDataSource in parallel (same request, merged response). Both use mergeDataResponses and limited concurrency via p-limit (#7950)
  • Add @metamask/client-controller dependency and subscribe to ClientController:stateChange. Asset tracking runs only when the UI is open (ClientController) and the keyring is unlocked (KeyringController), and stops when either the UI closes or the keyring locks (Client + Keyring lifecycle) (#7950)
  • Add full and merge update modes: DataResponse.updateMode and type AssetsUpdateMode ('full' | 'merge'). Fetch uses 'full' (response is authoritative for scope; custom assets not in response are preserved). Subscriptions could use 'merge' or 'full' depending on data sources. Default is 'merge' when omitted (#7950)

Changed

  • Bump @metamask/transaction-controller from ^62.17.1 to ^62.19.0 (#8005, #8031)
  • Bump @metamask/assets-controllers from ^100.0.1 to ^100.0.2 (#8004)
  • Bump @metamask/assets-controllers from ^100.0.2 to ^100.0.3 (#8029)

Fixed

  • Avoid unnecessary price and token API requests when data sources report balance-only updates. The controller now forwards the optional request from the subscribe callback into handleAssetsUpdate; when a data source calls onAssetsUpdate(response, request) with request.dataTypes: ['balance'] (e.g. RpcDataSource balance polling, StakedBalanceDataSource), the controller skips Token and Price enrichment so the price API is not called. Previously every update triggered enrichment and could reset or overwrite existing state (#8043)
  • Default assetsBalance to 0 for native tokens of each account's supported chains using NetworkEnablementController.nativeAssetIdentifiers, so native entries are always present in state even before data sources respond (#8036)
  • Auto-select 'merge' update mode in getAssets when chainIds is a subset of enabled chains, preventing partial-chain fetches (e.g. after a swap, adding a custom asset, or data-source chain changes) from wiping balances of other chains (#8036)
  • Convert WebSocket balance updates in BackendWebsocketDataSource from raw smallest-units to human-readable amounts using asset decimals (same behavior as RPC/Accounts API), so assetsBalance remains consistent across data sources (#8032)
  • Include all assets from balance and each account's custom assets from state in detectedAssets, so prices and metadata are fetched for existing assets and custom tokens (previously only assets without metadata were included, so existing assets did not get prices) (#8021)
  • Request includeAggregators: true when fetching token metadata from the v3 assets API so aggregator data is returned and stored in assetsInfo (#8021)

835.0.0

25 Feb 15:32
156cdee

Choose a tag to compare

@metamask/remote-feature-flag-controller 4.1.0

Added

  • Add optional prevClientVersion constructor argument to invalidate cached flags when the client version changes (#7827)

Changed

  • Bump @metamask/controller-utils from ^11.17.0 to ^11.19.0 (#7583, #7995)

834.0.0

25 Feb 13:56
303c325

Choose a tag to compare

@metamask/transaction-pay-controller 16.1.0

Added

  • Add metaMask fee field to TransactionPayFees (#8030)
  • Add ordered strategy fallback mechanism for quote retrieval (#7868)

Changed

  • Bump @metamask/transaction-controller from ^62.18.0 to ^62.19.0 (#8031)
  • Bump @metamask/bridge-controller from ^67.1.1 to ^67.2.0 (#8024)
  • Bump @metamask/assets-controllers from ^100.0.2 to ^100.0.3 (#8029)

833.0.0

24 Feb 13:57
5ca8b43

Choose a tag to compare

@metamask/transaction-controller 62.19.0

Changed

  • Rename remote feature flag useWebsockets to useBackendWebSocketService (#8028)

832.0.0

24 Feb 09:17
b22495a

Choose a tag to compare

@metamask/assets-controllers 100.0.3

Changed

  • Bump @metamask/transaction-controller from ^62.17.1 to ^62.18.0 (#8005)

Fixed

  • Fix token search API parameter to use first instead of limit for pagination (#8019)
    • Clamp limit to a maximum of 50 results for regular queries
    • Allow up to 500 results for Ondo token queries; limits exceeding 500 are clamped to 50

831.0.0

24 Feb 03:42
8b9ad85

Choose a tag to compare

@metamask/bridge-controller 67.2.0

Changed

  • Bump @metamask/transaction-controller from ^62.17.1 to ^62.18.0 (#8005)
  • Bump @metamask/assets-controllers from ^100.0.1 to ^100.0.2 (#8004)
  • Replace PERCENT_90 with PERCENT_75 in InputAmountPreset enum (#7997)
  • Add PERCENT_90 in InputAmountPreset enum (#8008)

830.0.0

23 Feb 21:33
f6b6301

Choose a tag to compare

@metamask/ramps-controller 10.0.0

Changed

  • BREAKING: Remove state.quotes and state.widgetUrl from RampsController state. Quote and widget URL data are now managed by consuming components (#8013)
  • BREAKING: Remove fetchQuotesForSelection() and setSelectedQuote(). Components call getQuotes() directly and manage selection locally (#8013)
  • Simplify getWidgetUrl() to a pure fetch-and-return API; it no longer reads or writes controller state (#8013)
  • Improve TransakService error handling (#8010)
  • BREAKING: Replace startQuotePolling()/stopQuotePolling() with fetchQuotesForSelection() — quotes are now fetched once per call instead of polling on a 15-second interval (#7999)

Removed

  • Remove stopQuotePolling() method (no interval to stop) (#7999)
  • Remove internal polling restart logic (#restartPollingIfActive) from setSelectedProvider, setSelectedToken, and setSelectedPaymentMethod (#7999)

Fixed

  • Fix RampsController flaky test (#8018)

829.0.0

23 Feb 14:54
5d7a050

Choose a tag to compare

@metamask/compliance-controller 1.0.1

@metamask/seedless-onboarding-controller 8.1.0

Changed

  • refreshAuthTokens now coalesces concurrent calls — if a refresh is already in-flight, subsequent callers share the same promise rather than issuing duplicate HTTP requests with the same token (#7989)
  • refreshAuthTokens now uses the live state.refreshToken value when calling authenticate after a successful HTTP refresh, preventing a stale-capture bug that could overwrite a concurrently-renewed token with an older one (#7989)
  • renewRefreshToken now queues the old token for revocation only after #createNewVaultWithAuthData succeeds, ensuring tokens are not queued if vault creation fails (#7989)

Fixed

  • Fixed refreshAuthTokens throwing the generic FailedToRefreshJWTTokens error for all HTTP failures — a 401 response (permanently revoked token) now throws InvalidRefreshToken instead, giving callers a distinct signal to distinguish permanent from transient failures (#7989)