Skip to content

fix: remove ws balance freshness guard#9273

Open
salimtb wants to merge 22 commits into
mainfrom
refactor/remove-ws-balance-freshness-guard
Open

fix: remove ws balance freshness guard#9273
salimtb wants to merge 22 commits into
mainfrom
refactor/remove-ws-balance-freshness-guard

Conversation

@salimtb

@salimtb salimtb commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Explanation

UI PR: MetaMask/metamask-extension#43829

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

Token balances in @metamask/assets-controller could stay stale after transactions, account switches, or WebSocket reconnects. Several independent issues contributed:

  1. WebSocket notifications were not reaching BackendWebsocketDataSource — Clients subscribe on wildcard channels (account-activity.v1.eip155:0:0x…) but the server sends notifications on specific chains (…eip155:42161:0x…). BackendWebSocketService matched channels exactly, so post-confirm balance pushes were silently dropped even though frames appeared in the Network tab.

  2. Stale subscriptionId after reconnect/resubscribe — Notifications could arrive with a server subscription id that no longer matched the local map. The subscription callback was skipped and channel fallback was unreliable.

  3. Race conditions on account switch — Overlapping subscribe/unsubscribe and fetch work could interleave, dropping notifications or applying responses out of order.

  4. Stale balances from cached/partial fetchesAccountsApiDataSource used TanStack Query’s 60s balance cache even on forceUpdate, and force-refresh pipelines used merge semantics that never removed tokens absent from partial API responses (e.g. USDC still shown after a swap when the API only returned ETH).

  5. Websocket freshness guard blocked corrections — A 120s guard prevented polling/API updates from overwriting recent WS balances. That helped in some send scenarios but also blocked legitimate corrections (e.g. receiver account showing wrong balance after account switch).

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

@metamask/core-backendBackendWebSocketService

  • Wildcard channel matchingeip155:0:0xaddr matches eip155:42161:0xaddr for both subscription callbacks and channel callbacks.
  • Subscription fallback — If subscriptionId lookup fails, resolve the handler by matching the notification channel against registered subscription channels.
  • Nested payload normalization — Promote channel / subscriptionId from nested data when the server wraps notifications.
  • No-callback fallthrough — If a subscription entry exists but has no callback, fall through to channel routing instead of swallowing the message.

@metamask/assets-controllerBackendWebsocketDataSource

  • Serializes subscribe/unsubscribe via a lock to prevent account-switch races.
  • Registers subscription state and handlers before awaiting the server subscribe handshake.
  • Registers addChannelCallback per channel as a fallback when subscription-id routing fails.
  • Case-insensitive EVM address matching for notifications.
  • Resolves onAssetsUpdate from stored subscription state when notifications arrive with stale ids.

@metamask/assets-controllerAssetsController

  • Fetches before re-subscribing on account switch; #accountRefreshMutex serializes overlapping refresh work.
  • Deduplicates account-tree refresh when selected accounts have not changed.
  • Removes the 120s websocket balance freshness guard so force-refresh and polling can correct stale WS values.

@metamask/assets-controller — balance update modes

  • Adds update mode: patches balance amounts only; does not remove tokens or overwrite metadata/prices. Used for getAssets({ forceUpdate: true }) and Accounts API / Snap fetch responses when the API returns a partial snapshot (e.g. only ETH after a swap).
  • merge remains the default for event-driven updates (WS, polling).
  • full remains for responses that should be authoritative for a chain scope.

AccountsApiDataSource

  • Passes { staleTime: 0, gcTime: 0 } to the API client when request.forceUpdate is true.

End-to-end flow after a confirmed swap:


Note

Medium Risk
Touches live balance state, WebSocket routing, and a breaking messenger event requirement; incorrect merge or routing could show wrong balances but changes are well-tested.

Overview
Fixes stale token balances after transactions, account/network switches, and WebSocket reconnects by improving how real-time and polled balance updates reach unified assetsBalance state.

AssetsController removes the 120-second websocket freshness guard and sourceId-based filtering so API/RPC/polling can overwrite recent WS values again. It subscribes to AccountActivityService:balanceUpdated (breaking: messenger must allow this event) and TransactionController:transactionConfirmed for force-refreshes, handles NetworkController:networkDidChange by refreshing data-source activeChains, re-subscribing, and force-fetching the selected EVM chain, and migrates several subscriptions to *:stateChanged events. Force-update pipelines use merge without sourceId; the slow Snap/RPC path runs only for chains the fast Accounts API path did not already handle successfully.

BackendWebSocketService adds account-activity wildcard channel matching (eip155:0 ↔ specific chain), subscription lookup by channel when subscriptionId is stale, nested notification normalization, and safer routing when subscriptions lack callbacks.

BackendWebsocketDataSource registers handlers before the subscribe handshake, cleans up on subscribe failure, and shares processAccountActivityBalanceUpdates with the controller path. AccountsApiDataSource / RpcDataSource expose refreshActiveChains for network switches.

Reviewed by Cursor Bugbot for commit 5332676. Bugbot is set up for automated code reviews on this repo. Configure here.

salimtb added 6 commits June 25, 2026 23:26
The polling-source freshness lock is unnecessary alongside fetch-then-subscribe
and Accounts API cache bypass on forceUpdate.
…iably

Improve BackendWebSocketService routing for wildcard channels and stale
subscription IDs, harden BackendWebsocketDataSource subscribe/notify flow,
and use update-mode force refresh so partial API snapshots do not leave
stale token balances in state.
@salimtb salimtb changed the title Refactor/remove ws balance freshness guard fix: remove ws balance freshness guard Jun 25, 2026
@salimtb salimtb marked this pull request as ready for review June 25, 2026 22:19
@salimtb salimtb requested review from a team as code owners June 25, 2026 22:19
@salimtb salimtb temporarily deployed to default-branch June 25, 2026 22:19 — with GitHub Actions Inactive
@salimtb

salimtb commented Jun 25, 2026

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.5.3-preview-12040e2d0
@metamask-previews/accounts-controller@39.0.3-preview-12040e2d0
@metamask-previews/address-book-controller@7.1.2-preview-12040e2d0
@metamask-previews/ai-controllers@0.7.0-preview-12040e2d0
@metamask-previews/analytics-controller@1.2.0-preview-12040e2d0
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-12040e2d0
@metamask-previews/announcement-controller@8.1.0-preview-12040e2d0
@metamask-previews/app-metadata-controller@2.0.1-preview-12040e2d0
@metamask-previews/approval-controller@9.0.2-preview-12040e2d0
@metamask-previews/assets-controller@9.1.0-preview-12040e2d0
@metamask-previews/assets-controllers@109.2.2-preview-12040e2d0
@metamask-previews/authenticated-user-storage@2.1.0-preview-12040e2d0
@metamask-previews/base-controller@9.1.0-preview-12040e2d0
@metamask-previews/base-data-service@0.1.3-preview-12040e2d0
@metamask-previews/bitcoin-regtest-up@0.0.0-preview-12040e2d0
@metamask-previews/bridge-controller@77.0.0-preview-12040e2d0
@metamask-previews/bridge-status-controller@73.0.0-preview-12040e2d0
@metamask-previews/build-utils@3.0.4-preview-12040e2d0
@metamask-previews/chain-agnostic-permission@1.6.2-preview-12040e2d0
@metamask-previews/chomp-api-service@3.1.0-preview-12040e2d0
@metamask-previews/claims-controller@0.5.3-preview-12040e2d0
@metamask-previews/client-controller@1.0.1-preview-12040e2d0
@metamask-previews/compliance-controller@2.1.0-preview-12040e2d0
@metamask-previews/composable-controller@12.0.1-preview-12040e2d0
@metamask-previews/config-registry-controller@0.4.1-preview-12040e2d0
@metamask-previews/connectivity-controller@0.2.0-preview-12040e2d0
@metamask-previews/controller-utils@12.3.0-preview-12040e2d0
@metamask-previews/core-backend@6.3.3-preview-12040e2d0
@metamask-previews/delegation-controller@3.0.2-preview-12040e2d0
@metamask-previews/earn-controller@12.2.1-preview-12040e2d0
@metamask-previews/eip-5792-middleware@3.0.4-preview-12040e2d0
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-12040e2d0
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-12040e2d0
@metamask-previews/ens-controller@19.1.4-preview-12040e2d0
@metamask-previews/eth-block-tracker@15.0.1-preview-12040e2d0
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-12040e2d0
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-12040e2d0
@metamask-previews/foundryup@1.0.1-preview-12040e2d0
@metamask-previews/gas-fee-controller@26.2.3-preview-12040e2d0
@metamask-previews/gator-permissions-controller@4.2.1-preview-12040e2d0
@metamask-previews/geolocation-controller@0.1.3-preview-12040e2d0
@metamask-previews/java-tron-up@0.0.0-preview-12040e2d0
@metamask-previews/json-rpc-engine@10.5.0-preview-12040e2d0
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-12040e2d0
@metamask-previews/keyring-controller@27.1.0-preview-12040e2d0
@metamask-previews/local-node-utils@0.0.0-preview-12040e2d0
@metamask-previews/logging-controller@8.0.2-preview-12040e2d0
@metamask-previews/message-manager@14.1.2-preview-12040e2d0
@metamask-previews/messenger@1.2.0-preview-12040e2d0
@metamask-previews/messenger-cli@0.2.0-preview-12040e2d0
@metamask-previews/money-account-balance-service@2.1.1-preview-12040e2d0
@metamask-previews/money-account-controller@0.3.3-preview-12040e2d0
@metamask-previews/money-account-upgrade-controller@2.1.0-preview-12040e2d0
@metamask-previews/multichain-account-service@11.1.0-preview-12040e2d0
@metamask-previews/multichain-api-middleware@3.1.5-preview-12040e2d0
@metamask-previews/multichain-network-controller@3.2.0-preview-12040e2d0
@metamask-previews/multichain-transactions-controller@7.1.1-preview-12040e2d0
@metamask-previews/name-controller@9.1.2-preview-12040e2d0
@metamask-previews/network-controller@33.0.0-preview-12040e2d0
@metamask-previews/network-enablement-controller@5.4.0-preview-12040e2d0
@metamask-previews/notification-services-controller@24.2.0-preview-12040e2d0
@metamask-previews/passkey-controller@2.0.1-preview-12040e2d0
@metamask-previews/permission-controller@13.1.1-preview-12040e2d0
@metamask-previews/permission-log-controller@5.1.0-preview-12040e2d0
@metamask-previews/perps-controller@9.0.0-preview-12040e2d0
@metamask-previews/phishing-controller@17.2.0-preview-12040e2d0
@metamask-previews/polling-controller@16.0.7-preview-12040e2d0
@metamask-previews/preferences-controller@23.1.0-preview-12040e2d0
@metamask-previews/profile-metrics-controller@4.0.0-preview-12040e2d0
@metamask-previews/profile-sync-controller@28.2.0-preview-12040e2d0
@metamask-previews/ramps-controller@15.0.0-preview-12040e2d0
@metamask-previews/rate-limit-controller@7.0.1-preview-12040e2d0
@metamask-previews/react-data-query@0.2.1-preview-12040e2d0
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-12040e2d0
@metamask-previews/sample-controllers@5.0.2-preview-12040e2d0
@metamask-previews/seedless-onboarding-controller@10.0.3-preview-12040e2d0
@metamask-previews/selected-network-controller@26.1.4-preview-12040e2d0
@metamask-previews/shield-controller@5.1.2-preview-12040e2d0
@metamask-previews/signature-controller@39.2.6-preview-12040e2d0
@metamask-previews/smart-transactions-controller@24.2.3-preview-12040e2d0
@metamask-previews/snap-account-service@1.0.0-preview-12040e2d0
@metamask-previews/social-controllers@2.3.1-preview-12040e2d0
@metamask-previews/solana-test-validator-up@0.0.0-preview-12040e2d0
@metamask-previews/storage-service@1.0.2-preview-12040e2d0
@metamask-previews/subscription-controller@6.2.0-preview-12040e2d0
@metamask-previews/transaction-controller@68.2.0-preview-12040e2d0
@metamask-previews/transaction-pay-controller@23.16.1-preview-12040e2d0
@metamask-previews/user-operation-controller@41.2.5-preview-12040e2d0
@metamask-previews/wallet@5.0.0-preview-12040e2d0
@metamask-previews/wallet-cli@0.0.0-preview-12040e2d0

@salimtb

salimtb commented Jun 25, 2026

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.5.3-preview-aabb3f2e3
@metamask-previews/accounts-controller@39.0.3-preview-aabb3f2e3
@metamask-previews/address-book-controller@7.1.2-preview-aabb3f2e3
@metamask-previews/ai-controllers@0.7.0-preview-aabb3f2e3
@metamask-previews/analytics-controller@1.2.0-preview-aabb3f2e3
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-aabb3f2e3
@metamask-previews/announcement-controller@8.1.0-preview-aabb3f2e3
@metamask-previews/app-metadata-controller@2.0.1-preview-aabb3f2e3
@metamask-previews/approval-controller@9.0.2-preview-aabb3f2e3
@metamask-previews/assets-controller@9.1.0-preview-aabb3f2e3
@metamask-previews/assets-controllers@109.2.2-preview-aabb3f2e3
@metamask-previews/authenticated-user-storage@2.1.0-preview-aabb3f2e3
@metamask-previews/base-controller@9.1.0-preview-aabb3f2e3
@metamask-previews/base-data-service@0.1.3-preview-aabb3f2e3
@metamask-previews/bitcoin-regtest-up@0.0.0-preview-aabb3f2e3
@metamask-previews/bridge-controller@77.0.0-preview-aabb3f2e3
@metamask-previews/bridge-status-controller@73.0.0-preview-aabb3f2e3
@metamask-previews/build-utils@3.0.4-preview-aabb3f2e3
@metamask-previews/chain-agnostic-permission@1.6.2-preview-aabb3f2e3
@metamask-previews/chomp-api-service@3.1.0-preview-aabb3f2e3
@metamask-previews/claims-controller@0.5.3-preview-aabb3f2e3
@metamask-previews/client-controller@1.0.1-preview-aabb3f2e3
@metamask-previews/compliance-controller@2.1.0-preview-aabb3f2e3
@metamask-previews/composable-controller@12.0.1-preview-aabb3f2e3
@metamask-previews/config-registry-controller@0.4.1-preview-aabb3f2e3
@metamask-previews/connectivity-controller@0.2.0-preview-aabb3f2e3
@metamask-previews/controller-utils@12.3.0-preview-aabb3f2e3
@metamask-previews/core-backend@6.3.3-preview-aabb3f2e3
@metamask-previews/delegation-controller@3.0.2-preview-aabb3f2e3
@metamask-previews/earn-controller@12.2.1-preview-aabb3f2e3
@metamask-previews/eip-5792-middleware@3.0.4-preview-aabb3f2e3
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-aabb3f2e3
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-aabb3f2e3
@metamask-previews/ens-controller@19.1.4-preview-aabb3f2e3
@metamask-previews/eth-block-tracker@15.0.1-preview-aabb3f2e3
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-aabb3f2e3
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-aabb3f2e3
@metamask-previews/foundryup@1.0.1-preview-aabb3f2e3
@metamask-previews/gas-fee-controller@26.2.3-preview-aabb3f2e3
@metamask-previews/gator-permissions-controller@4.2.1-preview-aabb3f2e3
@metamask-previews/geolocation-controller@0.1.3-preview-aabb3f2e3
@metamask-previews/java-tron-up@0.0.0-preview-aabb3f2e3
@metamask-previews/json-rpc-engine@10.5.0-preview-aabb3f2e3
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-aabb3f2e3
@metamask-previews/keyring-controller@27.1.0-preview-aabb3f2e3
@metamask-previews/local-node-utils@0.0.0-preview-aabb3f2e3
@metamask-previews/logging-controller@8.0.2-preview-aabb3f2e3
@metamask-previews/message-manager@14.1.2-preview-aabb3f2e3
@metamask-previews/messenger@1.2.0-preview-aabb3f2e3
@metamask-previews/messenger-cli@0.2.0-preview-aabb3f2e3
@metamask-previews/money-account-balance-service@2.1.1-preview-aabb3f2e3
@metamask-previews/money-account-controller@0.3.3-preview-aabb3f2e3
@metamask-previews/money-account-upgrade-controller@2.1.0-preview-aabb3f2e3
@metamask-previews/multichain-account-service@11.1.0-preview-aabb3f2e3
@metamask-previews/multichain-api-middleware@3.1.5-preview-aabb3f2e3
@metamask-previews/multichain-network-controller@3.2.0-preview-aabb3f2e3
@metamask-previews/multichain-transactions-controller@7.1.1-preview-aabb3f2e3
@metamask-previews/name-controller@9.1.2-preview-aabb3f2e3
@metamask-previews/network-controller@33.0.0-preview-aabb3f2e3
@metamask-previews/network-enablement-controller@5.4.0-preview-aabb3f2e3
@metamask-previews/notification-services-controller@24.2.0-preview-aabb3f2e3
@metamask-previews/passkey-controller@2.0.1-preview-aabb3f2e3
@metamask-previews/permission-controller@13.1.1-preview-aabb3f2e3
@metamask-previews/permission-log-controller@5.1.0-preview-aabb3f2e3
@metamask-previews/perps-controller@9.0.0-preview-aabb3f2e3
@metamask-previews/phishing-controller@17.2.0-preview-aabb3f2e3
@metamask-previews/polling-controller@16.0.7-preview-aabb3f2e3
@metamask-previews/preferences-controller@23.1.0-preview-aabb3f2e3
@metamask-previews/profile-metrics-controller@4.0.0-preview-aabb3f2e3
@metamask-previews/profile-sync-controller@28.2.0-preview-aabb3f2e3
@metamask-previews/ramps-controller@15.0.0-preview-aabb3f2e3
@metamask-previews/rate-limit-controller@7.0.1-preview-aabb3f2e3
@metamask-previews/react-data-query@0.2.1-preview-aabb3f2e3
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-aabb3f2e3
@metamask-previews/sample-controllers@5.0.2-preview-aabb3f2e3
@metamask-previews/seedless-onboarding-controller@10.0.3-preview-aabb3f2e3
@metamask-previews/selected-network-controller@26.1.4-preview-aabb3f2e3
@metamask-previews/shield-controller@5.1.2-preview-aabb3f2e3
@metamask-previews/signature-controller@39.2.6-preview-aabb3f2e3
@metamask-previews/smart-transactions-controller@24.2.3-preview-aabb3f2e3
@metamask-previews/snap-account-service@1.0.0-preview-aabb3f2e3
@metamask-previews/social-controllers@2.3.1-preview-aabb3f2e3
@metamask-previews/solana-test-validator-up@0.0.0-preview-aabb3f2e3
@metamask-previews/storage-service@1.0.2-preview-aabb3f2e3
@metamask-previews/subscription-controller@6.2.0-preview-aabb3f2e3
@metamask-previews/transaction-controller@68.2.0-preview-aabb3f2e3
@metamask-previews/transaction-pay-controller@23.16.1-preview-aabb3f2e3
@metamask-previews/user-operation-controller@41.2.5-preview-aabb3f2e3
@metamask-previews/wallet@5.0.0-preview-aabb3f2e3
@metamask-previews/wallet-cli@0.0.0-preview-aabb3f2e3

@salimtb

salimtb commented Jun 25, 2026

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.5.3-preview-ba933fc1b
@metamask-previews/accounts-controller@39.0.3-preview-ba933fc1b
@metamask-previews/address-book-controller@7.1.2-preview-ba933fc1b
@metamask-previews/ai-controllers@0.7.0-preview-ba933fc1b
@metamask-previews/analytics-controller@1.2.0-preview-ba933fc1b
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-ba933fc1b
@metamask-previews/announcement-controller@8.1.0-preview-ba933fc1b
@metamask-previews/app-metadata-controller@2.0.1-preview-ba933fc1b
@metamask-previews/approval-controller@9.0.2-preview-ba933fc1b
@metamask-previews/assets-controller@9.1.0-preview-ba933fc1b
@metamask-previews/assets-controllers@109.2.2-preview-ba933fc1b
@metamask-previews/authenticated-user-storage@2.1.0-preview-ba933fc1b
@metamask-previews/base-controller@9.1.0-preview-ba933fc1b
@metamask-previews/base-data-service@0.1.3-preview-ba933fc1b
@metamask-previews/bitcoin-regtest-up@0.0.0-preview-ba933fc1b
@metamask-previews/bridge-controller@77.0.0-preview-ba933fc1b
@metamask-previews/bridge-status-controller@73.0.0-preview-ba933fc1b
@metamask-previews/build-utils@3.0.4-preview-ba933fc1b
@metamask-previews/chain-agnostic-permission@1.6.2-preview-ba933fc1b
@metamask-previews/chomp-api-service@3.1.0-preview-ba933fc1b
@metamask-previews/claims-controller@0.5.3-preview-ba933fc1b
@metamask-previews/client-controller@1.0.1-preview-ba933fc1b
@metamask-previews/compliance-controller@2.1.0-preview-ba933fc1b
@metamask-previews/composable-controller@12.0.1-preview-ba933fc1b
@metamask-previews/config-registry-controller@0.4.1-preview-ba933fc1b
@metamask-previews/connectivity-controller@0.2.0-preview-ba933fc1b
@metamask-previews/controller-utils@12.3.0-preview-ba933fc1b
@metamask-previews/core-backend@6.3.3-preview-ba933fc1b
@metamask-previews/delegation-controller@3.0.2-preview-ba933fc1b
@metamask-previews/earn-controller@12.2.1-preview-ba933fc1b
@metamask-previews/eip-5792-middleware@3.0.4-preview-ba933fc1b
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-ba933fc1b
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-ba933fc1b
@metamask-previews/ens-controller@19.1.4-preview-ba933fc1b
@metamask-previews/eth-block-tracker@15.0.1-preview-ba933fc1b
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-ba933fc1b
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-ba933fc1b
@metamask-previews/foundryup@1.0.1-preview-ba933fc1b
@metamask-previews/gas-fee-controller@26.2.3-preview-ba933fc1b
@metamask-previews/gator-permissions-controller@4.2.1-preview-ba933fc1b
@metamask-previews/geolocation-controller@0.1.3-preview-ba933fc1b
@metamask-previews/java-tron-up@0.0.0-preview-ba933fc1b
@metamask-previews/json-rpc-engine@10.5.0-preview-ba933fc1b
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-ba933fc1b
@metamask-previews/keyring-controller@27.1.0-preview-ba933fc1b
@metamask-previews/local-node-utils@0.0.0-preview-ba933fc1b
@metamask-previews/logging-controller@8.0.2-preview-ba933fc1b
@metamask-previews/message-manager@14.1.2-preview-ba933fc1b
@metamask-previews/messenger@1.2.0-preview-ba933fc1b
@metamask-previews/messenger-cli@0.2.0-preview-ba933fc1b
@metamask-previews/money-account-balance-service@2.1.1-preview-ba933fc1b
@metamask-previews/money-account-controller@0.3.3-preview-ba933fc1b
@metamask-previews/money-account-upgrade-controller@2.1.0-preview-ba933fc1b
@metamask-previews/multichain-account-service@11.1.0-preview-ba933fc1b
@metamask-previews/multichain-api-middleware@3.1.5-preview-ba933fc1b
@metamask-previews/multichain-network-controller@3.2.0-preview-ba933fc1b
@metamask-previews/multichain-transactions-controller@7.1.1-preview-ba933fc1b
@metamask-previews/name-controller@9.1.2-preview-ba933fc1b
@metamask-previews/network-controller@33.0.0-preview-ba933fc1b
@metamask-previews/network-enablement-controller@5.4.0-preview-ba933fc1b
@metamask-previews/notification-services-controller@24.2.0-preview-ba933fc1b
@metamask-previews/passkey-controller@2.0.1-preview-ba933fc1b
@metamask-previews/permission-controller@13.1.1-preview-ba933fc1b
@metamask-previews/permission-log-controller@5.1.0-preview-ba933fc1b
@metamask-previews/perps-controller@9.0.0-preview-ba933fc1b
@metamask-previews/phishing-controller@17.2.0-preview-ba933fc1b
@metamask-previews/polling-controller@16.0.7-preview-ba933fc1b
@metamask-previews/preferences-controller@23.1.0-preview-ba933fc1b
@metamask-previews/profile-metrics-controller@4.0.0-preview-ba933fc1b
@metamask-previews/profile-sync-controller@28.2.0-preview-ba933fc1b
@metamask-previews/ramps-controller@15.0.0-preview-ba933fc1b
@metamask-previews/rate-limit-controller@7.0.1-preview-ba933fc1b
@metamask-previews/react-data-query@0.2.1-preview-ba933fc1b
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-ba933fc1b
@metamask-previews/sample-controllers@5.0.2-preview-ba933fc1b
@metamask-previews/seedless-onboarding-controller@10.0.3-preview-ba933fc1b
@metamask-previews/selected-network-controller@26.1.4-preview-ba933fc1b
@metamask-previews/shield-controller@5.1.2-preview-ba933fc1b
@metamask-previews/signature-controller@39.2.6-preview-ba933fc1b
@metamask-previews/smart-transactions-controller@24.2.3-preview-ba933fc1b
@metamask-previews/snap-account-service@1.0.0-preview-ba933fc1b
@metamask-previews/social-controllers@2.3.1-preview-ba933fc1b
@metamask-previews/solana-test-validator-up@0.0.0-preview-ba933fc1b
@metamask-previews/storage-service@1.0.2-preview-ba933fc1b
@metamask-previews/subscription-controller@6.2.0-preview-ba933fc1b
@metamask-previews/transaction-controller@68.2.0-preview-ba933fc1b
@metamask-previews/transaction-pay-controller@23.16.1-preview-ba933fc1b
@metamask-previews/user-operation-controller@41.2.5-preview-ba933fc1b
@metamask-previews/wallet@5.0.0-preview-ba933fc1b
@metamask-previews/wallet-cli@0.0.0-preview-ba933fc1b

salimtb added 3 commits June 26, 2026 10:50
…tyService

Wire AssetsController to AccountActivityService:balanceUpdated so unified
assetsBalance updates when AccountActivityService owns the websocket
subscription. Share account-activity payload conversion with
BackendWebsocketDataSource, skip slow RPC for Accounts API chains, and add
opt-in WS routing debug logs.
salimtb and others added 3 commits June 26, 2026 11:30
…assignment'

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Comment thread packages/assets-controller/src/data-sources/PriceDataSource.ts Outdated
@salimtb

salimtb commented Jun 26, 2026

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.5.3-preview-9298fa429
@metamask-previews/accounts-controller@39.0.3-preview-9298fa429
@metamask-previews/address-book-controller@7.1.2-preview-9298fa429
@metamask-previews/ai-controllers@0.7.0-preview-9298fa429
@metamask-previews/analytics-controller@1.2.0-preview-9298fa429
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-9298fa429
@metamask-previews/announcement-controller@8.1.0-preview-9298fa429
@metamask-previews/app-metadata-controller@2.0.1-preview-9298fa429
@metamask-previews/approval-controller@9.0.2-preview-9298fa429
@metamask-previews/assets-controller@9.1.0-preview-9298fa429
@metamask-previews/assets-controllers@109.2.2-preview-9298fa429
@metamask-previews/authenticated-user-storage@2.1.0-preview-9298fa429
@metamask-previews/base-controller@9.1.0-preview-9298fa429
@metamask-previews/base-data-service@0.1.3-preview-9298fa429
@metamask-previews/bitcoin-regtest-up@0.0.0-preview-9298fa429
@metamask-previews/bridge-controller@77.0.0-preview-9298fa429
@metamask-previews/bridge-status-controller@73.0.0-preview-9298fa429
@metamask-previews/build-utils@3.0.4-preview-9298fa429
@metamask-previews/chain-agnostic-permission@1.6.2-preview-9298fa429
@metamask-previews/chomp-api-service@3.1.0-preview-9298fa429
@metamask-previews/claims-controller@0.5.3-preview-9298fa429
@metamask-previews/client-controller@1.0.1-preview-9298fa429
@metamask-previews/compliance-controller@2.1.0-preview-9298fa429
@metamask-previews/composable-controller@12.0.1-preview-9298fa429
@metamask-previews/config-registry-controller@0.4.1-preview-9298fa429
@metamask-previews/connectivity-controller@0.2.0-preview-9298fa429
@metamask-previews/controller-utils@12.3.0-preview-9298fa429
@metamask-previews/core-backend@6.3.3-preview-9298fa429
@metamask-previews/delegation-controller@3.0.2-preview-9298fa429
@metamask-previews/earn-controller@12.2.1-preview-9298fa429
@metamask-previews/eip-5792-middleware@3.0.4-preview-9298fa429
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-9298fa429
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-9298fa429
@metamask-previews/ens-controller@19.1.4-preview-9298fa429
@metamask-previews/eth-block-tracker@15.0.1-preview-9298fa429
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-9298fa429
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-9298fa429
@metamask-previews/foundryup@1.0.1-preview-9298fa429
@metamask-previews/gas-fee-controller@26.2.3-preview-9298fa429
@metamask-previews/gator-permissions-controller@4.2.1-preview-9298fa429
@metamask-previews/geolocation-controller@0.1.3-preview-9298fa429
@metamask-previews/java-tron-up@0.0.0-preview-9298fa429
@metamask-previews/json-rpc-engine@10.5.0-preview-9298fa429
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-9298fa429
@metamask-previews/keyring-controller@27.1.0-preview-9298fa429
@metamask-previews/local-node-utils@0.0.0-preview-9298fa429
@metamask-previews/logging-controller@8.0.2-preview-9298fa429
@metamask-previews/message-manager@14.1.2-preview-9298fa429
@metamask-previews/messenger@1.2.0-preview-9298fa429
@metamask-previews/messenger-cli@0.2.0-preview-9298fa429
@metamask-previews/money-account-balance-service@2.1.1-preview-9298fa429
@metamask-previews/money-account-controller@0.3.3-preview-9298fa429
@metamask-previews/money-account-upgrade-controller@2.1.0-preview-9298fa429
@metamask-previews/multichain-account-service@11.1.0-preview-9298fa429
@metamask-previews/multichain-api-middleware@3.1.5-preview-9298fa429
@metamask-previews/multichain-network-controller@3.2.0-preview-9298fa429
@metamask-previews/multichain-transactions-controller@7.1.1-preview-9298fa429
@metamask-previews/name-controller@9.1.2-preview-9298fa429
@metamask-previews/network-controller@33.0.0-preview-9298fa429
@metamask-previews/network-enablement-controller@5.4.0-preview-9298fa429
@metamask-previews/notification-services-controller@24.2.0-preview-9298fa429
@metamask-previews/passkey-controller@2.0.1-preview-9298fa429
@metamask-previews/permission-controller@13.1.1-preview-9298fa429
@metamask-previews/permission-log-controller@5.1.0-preview-9298fa429
@metamask-previews/perps-controller@9.0.0-preview-9298fa429
@metamask-previews/phishing-controller@17.2.0-preview-9298fa429
@metamask-previews/polling-controller@16.0.7-preview-9298fa429
@metamask-previews/preferences-controller@23.1.0-preview-9298fa429
@metamask-previews/profile-metrics-controller@4.0.0-preview-9298fa429
@metamask-previews/profile-sync-controller@28.2.0-preview-9298fa429
@metamask-previews/ramps-controller@15.0.0-preview-9298fa429
@metamask-previews/rate-limit-controller@7.0.1-preview-9298fa429
@metamask-previews/react-data-query@0.2.1-preview-9298fa429
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-9298fa429
@metamask-previews/sample-controllers@5.0.2-preview-9298fa429
@metamask-previews/seedless-onboarding-controller@10.0.3-preview-9298fa429
@metamask-previews/selected-network-controller@26.1.4-preview-9298fa429
@metamask-previews/shield-controller@5.1.2-preview-9298fa429
@metamask-previews/signature-controller@39.2.6-preview-9298fa429
@metamask-previews/smart-transactions-controller@24.2.3-preview-9298fa429
@metamask-previews/snap-account-service@1.0.0-preview-9298fa429
@metamask-previews/social-controllers@2.3.1-preview-9298fa429
@metamask-previews/solana-test-validator-up@0.0.0-preview-9298fa429
@metamask-previews/storage-service@1.0.2-preview-9298fa429
@metamask-previews/subscription-controller@6.2.0-preview-9298fa429
@metamask-previews/transaction-controller@68.2.0-preview-9298fa429
@metamask-previews/transaction-pay-controller@23.16.1-preview-9298fa429
@metamask-previews/user-operation-controller@41.2.5-preview-9298fa429
@metamask-previews/wallet@5.0.0-preview-9298fa429
@metamask-previews/wallet-cli@0.0.0-preview-9298fa429

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

3.5K Controller 💀
FUTURE - A lot of then internals can be gutted and moved into separate files (for better testability).

E.g:

  • Move pipelines/middleware construction into separate file
  • Move state update logic (merge vs update vs full) into a separate file
  • Subscription handlers can also be moved into a separate file (you can pass in messenger as inputs to functions).
  • Traversing or shape manipulation can also be decoupled.

salimtb added 3 commits June 26, 2026 16:53
Force-refresh the sender account via getAssets when a transaction confirms,
and harden RpcDataSource post-tx RPC refresh to pass the request and apply
update mode when pushing balance snapshots to the controller.
…k switch

Subscribe to NetworkController:networkDidChange so switching the selected
network re-fetches supported chains, re-subscribes data sources, and
force-fetches balances for the newly selected chain.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

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 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4c62dd9. Configure here.

Comment thread packages/assets-controller/src/AssetsController.ts
@salimtb

salimtb commented Jun 26, 2026

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.5.3-preview-53326764b
@metamask-previews/accounts-controller@39.0.3-preview-53326764b
@metamask-previews/address-book-controller@7.1.2-preview-53326764b
@metamask-previews/ai-controllers@0.7.0-preview-53326764b
@metamask-previews/analytics-controller@1.2.0-preview-53326764b
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-53326764b
@metamask-previews/announcement-controller@8.1.0-preview-53326764b
@metamask-previews/app-metadata-controller@2.0.1-preview-53326764b
@metamask-previews/approval-controller@9.0.2-preview-53326764b
@metamask-previews/assets-controller@9.1.0-preview-53326764b
@metamask-previews/assets-controllers@109.2.2-preview-53326764b
@metamask-previews/authenticated-user-storage@2.1.0-preview-53326764b
@metamask-previews/base-controller@9.1.0-preview-53326764b
@metamask-previews/base-data-service@0.1.3-preview-53326764b
@metamask-previews/bitcoin-regtest-up@0.0.0-preview-53326764b
@metamask-previews/bridge-controller@77.0.0-preview-53326764b
@metamask-previews/bridge-status-controller@73.0.0-preview-53326764b
@metamask-previews/build-utils@3.0.4-preview-53326764b
@metamask-previews/chain-agnostic-permission@1.6.2-preview-53326764b
@metamask-previews/chomp-api-service@3.1.0-preview-53326764b
@metamask-previews/claims-controller@0.5.3-preview-53326764b
@metamask-previews/client-controller@1.0.1-preview-53326764b
@metamask-previews/compliance-controller@2.1.0-preview-53326764b
@metamask-previews/composable-controller@12.0.1-preview-53326764b
@metamask-previews/config-registry-controller@0.4.1-preview-53326764b
@metamask-previews/connectivity-controller@0.2.0-preview-53326764b
@metamask-previews/controller-utils@12.3.0-preview-53326764b
@metamask-previews/core-backend@6.3.3-preview-53326764b
@metamask-previews/delegation-controller@3.0.2-preview-53326764b
@metamask-previews/earn-controller@12.2.1-preview-53326764b
@metamask-previews/eip-5792-middleware@3.0.4-preview-53326764b
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-53326764b
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-53326764b
@metamask-previews/ens-controller@19.1.4-preview-53326764b
@metamask-previews/eth-block-tracker@15.0.1-preview-53326764b
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-53326764b
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-53326764b
@metamask-previews/foundryup@1.0.1-preview-53326764b
@metamask-previews/gas-fee-controller@26.2.3-preview-53326764b
@metamask-previews/gator-permissions-controller@4.2.1-preview-53326764b
@metamask-previews/geolocation-controller@0.1.3-preview-53326764b
@metamask-previews/java-tron-up@0.0.0-preview-53326764b
@metamask-previews/json-rpc-engine@10.5.0-preview-53326764b
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-53326764b
@metamask-previews/keyring-controller@27.1.0-preview-53326764b
@metamask-previews/local-node-utils@0.0.0-preview-53326764b
@metamask-previews/logging-controller@8.0.2-preview-53326764b
@metamask-previews/message-manager@14.1.2-preview-53326764b
@metamask-previews/messenger@1.2.0-preview-53326764b
@metamask-previews/messenger-cli@0.2.0-preview-53326764b
@metamask-previews/money-account-balance-service@2.1.1-preview-53326764b
@metamask-previews/money-account-controller@0.3.3-preview-53326764b
@metamask-previews/money-account-upgrade-controller@2.1.0-preview-53326764b
@metamask-previews/multichain-account-service@11.1.0-preview-53326764b
@metamask-previews/multichain-api-middleware@3.1.5-preview-53326764b
@metamask-previews/multichain-network-controller@3.2.0-preview-53326764b
@metamask-previews/multichain-transactions-controller@7.1.1-preview-53326764b
@metamask-previews/name-controller@9.1.2-preview-53326764b
@metamask-previews/network-controller@33.0.0-preview-53326764b
@metamask-previews/network-enablement-controller@5.4.0-preview-53326764b
@metamask-previews/notification-services-controller@24.2.0-preview-53326764b
@metamask-previews/passkey-controller@2.0.1-preview-53326764b
@metamask-previews/permission-controller@13.1.1-preview-53326764b
@metamask-previews/permission-log-controller@5.1.0-preview-53326764b
@metamask-previews/perps-controller@9.0.0-preview-53326764b
@metamask-previews/phishing-controller@17.2.0-preview-53326764b
@metamask-previews/polling-controller@16.0.7-preview-53326764b
@metamask-previews/preferences-controller@23.1.0-preview-53326764b
@metamask-previews/profile-metrics-controller@4.0.0-preview-53326764b
@metamask-previews/profile-sync-controller@28.2.0-preview-53326764b
@metamask-previews/ramps-controller@15.0.0-preview-53326764b
@metamask-previews/rate-limit-controller@7.0.1-preview-53326764b
@metamask-previews/react-data-query@0.2.1-preview-53326764b
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-53326764b
@metamask-previews/sample-controllers@5.0.2-preview-53326764b
@metamask-previews/seedless-onboarding-controller@10.0.3-preview-53326764b
@metamask-previews/selected-network-controller@26.1.4-preview-53326764b
@metamask-previews/shield-controller@5.1.2-preview-53326764b
@metamask-previews/signature-controller@39.2.6-preview-53326764b
@metamask-previews/smart-transactions-controller@24.2.3-preview-53326764b
@metamask-previews/snap-account-service@1.0.0-preview-53326764b
@metamask-previews/social-controllers@2.3.1-preview-53326764b
@metamask-previews/solana-test-validator-up@0.0.0-preview-53326764b
@metamask-previews/storage-service@1.0.2-preview-53326764b
@metamask-previews/subscription-controller@6.2.0-preview-53326764b
@metamask-previews/transaction-controller@68.2.0-preview-53326764b
@metamask-previews/transaction-pay-controller@23.16.1-preview-53326764b
@metamask-previews/user-operation-controller@41.2.5-preview-53326764b
@metamask-previews/wallet@5.0.0-preview-53326764b
@metamask-previews/wallet-cli@0.0.0-preview-53326764b

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.

3 participants