Skip to content

fix: improve assets controller snap accounts subscription and websocket#8430

Draft
salimtb wants to merge 14 commits intomainfrom
fix/assets-controller-snap-accounts-subscription
Draft

fix: improve assets controller snap accounts subscription and websocket#8430
salimtb wants to merge 14 commits intomainfrom
fix/assets-controller-snap-accounts-subscription

Conversation

@salimtb
Copy link
Copy Markdown
Contributor

@salimtb salimtb commented Apr 12, 2026

Explanation

Current state

AssetsController had three related issues that prevented balances from loading correctly in certain scenarios:

  1. Snap accounts not subscribed after startup: On app launch, #start() was called before AccountTreeController.init() had finished building the account tree, so snap accounts weren't yet in the selected account group. Because #start() is idempotent (it returns early when subscriptions already exist), snap accounts were never picked up when they became available, leaving Solana, Tron, and Bitcoin balances missing.

  2. Custom assets filtered by spam heuristics: TokenDataSource applied the MIN_TOKEN_OCCURRENCES threshold (EVM ERC-20) and Blockaid bulk scan (non-EVM fungible tokens) to all tokens uniformly. This meant tokens manually imported by the user and stored in customAssets state were incorrectly filtered out as potential spam.

  3. No polling fallback when WebSocket is disabled: BackendWebsocketDataSource and AccountsApiDataSource both call the same fetchV2SupportedNetworks API to determine which chains they support. Because BackendWebsocketDataSource has higher priority in the chain-claiming loop, it would claim all supported chains at initialization — even when the WebSocket never connected. This left AccountsApiDataSource with no chains to poll, so users with the WebSocket disabled or with a broken connection received no balance updates.

Solution

  1. Re-subscribe on AccountTree state change: Added #handleAccountTreeStateChange() which subscribes to AccountTreeController:stateChange. When the account tree updates (e.g. after snap accounts are hydrated), the method forces a full re-subscription and re-fetch with the complete account list. Added AccountsController:getSelectedAccount as a fallback in #getSelectedAccounts() for cases where the account tree is not yet initialized.

  2. Custom assets bypass spam filters: TokenDataSource now reads customAssets from state and builds a customAssetIds set. Tokens in that set skip the occurrences >= 3 EVM filter and are excluded from the non-EVM Blockaid scan input, ensuring user-imported assets always appear.

  3. Connection-aware chain claiming in BackendWebsocketDataSource: Added an #isConnected flag (initially false). #initializeActiveChains and #refreshActiveChains now store supported chains in #supportedChains but only call updateActiveChains when connected. On disconnect, activeChains is cleared so the chain-claiming loop re-assigns those chains to AccountsApiDataSource for polling. On reconnect, chains are restored from #supportedChains before pending WebSocket subscriptions are reprocessed.

References

  • Related to MetaMask/metamask-extension (assets multichain rollout)

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
Changes asset subscription/chain-claiming behavior and adds onboarding-based RPC suppression, which can affect when and how balances update across multiple chains and account types.

Overview
Fixes multi-chain balance tracking edge cases by making AssetsController re-subscribe/re-fetch when the account tree later gains accounts (e.g. snap accounts), using AccountsController:getSelectedAccount as a startup fallback and tracking #lastKnownAccountIds to avoid redundant work.

Improves data-source coordination: BackendWebsocketDataSource now only claims chains while connected, releases them on disconnect so AccountsApiDataSource can poll as fallback, and reclaims on reconnect (dropping stale pending subscriptions). TokenDataSource now exempts user-imported customAssets from occurrence/Blockaid spam filtering.

Adds an optional isOnboarded hook plumbed into RpcDataSource so fetch/subscribe become no-ops before onboarding completes, preventing premature on-chain RPC calls; tests, changelog, and dependency graph are updated accordingly.

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

salimtb added 3 commits April 13, 2026 00:11
…ountTree initializes late

- Convert `#selectedAccounts` getter to `#getSelectedAccounts()` method with
  a fallback to `AccountsController:getSelectedAccount` when the AccountTree
  returns empty (covers the window before the tree is initialized)
- Add `#handleAccountTreeStateChange()`: when `AccountTreeController:stateChange`
  fires and subscriptions already exist (created before snap accounts arrived),
  re-subscribe and re-fetch so snap/BTC/SOL accounts are included
- Add `AccountsControllerGetSelectedAccountAction` to `AllowedActions` and
  `@metamask/accounts-controller` as a dependency to support the fallback
- Add mock for `AccountsController:getSelectedAccount` in test helper

Previously, data sources reported their active chains before the AccountTree
was initialized, causing subscriptions to be created with only the fallback
EVM account. When the tree later fired `stateChange` with 4 accounts (EVM +
snap accounts), `#start()` returned early due to its idempotency guard, so
snap accounts were never subscribed or fetched.
…okenDataSource

Custom assets (user-imported tokens in `customAssets` state) now bypass
both the EVM occurrence-count filter and the non-EVM Blockaid bulk scan.
Only auto-detected tokens are subject to spam filtering.
…n websocket is disconnected or disabled

BackendWebsocketDataSource now only claims chains when the websocket is
actually connected. On disconnect, chains are released so the
chain-claiming loop assigns them to AccountsApiDataSource for polling.
On reconnect, chains are reclaimed from the stored supportedChains list.
@salimtb salimtb changed the title Fix/assets controller snap accounts subscription Fix: improve assets controller snap accounts subscription and websocket Apr 12, 2026
@salimtb salimtb marked this pull request as ready for review April 13, 2026 07:09
@salimtb salimtb requested review from a team as code owners April 13, 2026 07:09
@salimtb salimtb changed the title Fix: improve assets controller snap accounts subscription and websocket fix: improve assets controller snap accounts subscription and websocket Apr 13, 2026
@salimtb
Copy link
Copy Markdown
Contributor Author

salimtb commented Apr 13, 2026

@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.0.0-preview-61580fcee
@metamask-previews/accounts-controller@37.2.0-preview-61580fcee
@metamask-previews/address-book-controller@7.1.1-preview-61580fcee
@metamask-previews/ai-controllers@0.6.3-preview-61580fcee
@metamask-previews/analytics-controller@1.0.1-preview-61580fcee
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-61580fcee
@metamask-previews/announcement-controller@8.1.0-preview-61580fcee
@metamask-previews/app-metadata-controller@2.0.1-preview-61580fcee
@metamask-previews/approval-controller@9.0.1-preview-61580fcee
@metamask-previews/assets-controller@5.0.0-preview-61580fcee
@metamask-previews/assets-controllers@103.1.1-preview-61580fcee
@metamask-previews/base-controller@9.0.1-preview-61580fcee
@metamask-previews/base-data-service@0.1.1-preview-61580fcee
@metamask-previews/bridge-controller@70.0.1-preview-61580fcee
@metamask-previews/bridge-status-controller@70.0.5-preview-61580fcee
@metamask-previews/build-utils@3.0.4-preview-61580fcee
@metamask-previews/chain-agnostic-permission@1.5.0-preview-61580fcee
@metamask-previews/claims-controller@0.5.0-preview-61580fcee
@metamask-previews/client-controller@1.0.1-preview-61580fcee
@metamask-previews/compliance-controller@2.0.0-preview-61580fcee
@metamask-previews/composable-controller@12.0.1-preview-61580fcee
@metamask-previews/config-registry-controller@0.2.0-preview-61580fcee
@metamask-previews/connectivity-controller@0.2.0-preview-61580fcee
@metamask-previews/controller-utils@11.20.0-preview-61580fcee
@metamask-previews/core-backend@6.2.1-preview-61580fcee
@metamask-previews/delegation-controller@2.1.0-preview-61580fcee
@metamask-previews/earn-controller@11.2.1-preview-61580fcee
@metamask-previews/eip-5792-middleware@3.0.3-preview-61580fcee
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-61580fcee
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-61580fcee
@metamask-previews/ens-controller@19.1.1-preview-61580fcee
@metamask-previews/eth-block-tracker@15.0.1-preview-61580fcee
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-61580fcee
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-61580fcee
@metamask-previews/foundryup@1.0.1-preview-61580fcee
@metamask-previews/gas-fee-controller@26.1.1-preview-61580fcee
@metamask-previews/gator-permissions-controller@3.0.1-preview-61580fcee
@metamask-previews/geolocation-controller@0.1.2-preview-61580fcee
@metamask-previews/json-rpc-engine@10.2.4-preview-61580fcee
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-61580fcee
@metamask-previews/keyring-controller@25.2.0-preview-61580fcee
@metamask-previews/logging-controller@8.0.1-preview-61580fcee
@metamask-previews/message-manager@14.1.1-preview-61580fcee
@metamask-previews/messenger@1.1.1-preview-61580fcee
@metamask-previews/messenger-cli@0.1.0-preview-61580fcee
@metamask-previews/money-account-controller@0.1.0-preview-61580fcee
@metamask-previews/multichain-account-service@8.0.1-preview-61580fcee
@metamask-previews/multichain-api-middleware@2.0.0-preview-61580fcee
@metamask-previews/multichain-network-controller@3.0.6-preview-61580fcee
@metamask-previews/multichain-transactions-controller@7.0.4-preview-61580fcee
@metamask-previews/name-controller@9.1.1-preview-61580fcee
@metamask-previews/network-controller@30.0.1-preview-61580fcee
@metamask-previews/network-enablement-controller@5.0.2-preview-61580fcee
@metamask-previews/notification-services-controller@23.0.1-preview-61580fcee
@metamask-previews/permission-controller@12.3.0-preview-61580fcee
@metamask-previews/permission-log-controller@5.1.0-preview-61580fcee
@metamask-previews/perps-controller@2.0.0-preview-61580fcee
@metamask-previews/phishing-controller@17.1.1-preview-61580fcee
@metamask-previews/polling-controller@16.0.4-preview-61580fcee
@metamask-previews/preferences-controller@23.1.0-preview-61580fcee
@metamask-previews/profile-metrics-controller@3.1.3-preview-61580fcee
@metamask-previews/profile-sync-controller@28.0.2-preview-61580fcee
@metamask-previews/ramps-controller@13.1.0-preview-61580fcee
@metamask-previews/rate-limit-controller@7.0.1-preview-61580fcee
@metamask-previews/react-data-query@0.2.0-preview-61580fcee
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-61580fcee
@metamask-previews/sample-controllers@4.0.4-preview-61580fcee
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-61580fcee
@metamask-previews/selected-network-controller@26.1.0-preview-61580fcee
@metamask-previews/shield-controller@5.1.1-preview-61580fcee
@metamask-previews/signature-controller@39.1.2-preview-61580fcee
@metamask-previews/social-controllers@0.1.0-preview-61580fcee
@metamask-previews/storage-service@1.0.1-preview-61580fcee
@metamask-previews/subscription-controller@6.1.2-preview-61580fcee
@metamask-previews/transaction-controller@64.0.0-preview-61580fcee
@metamask-previews/transaction-pay-controller@19.1.0-preview-61580fcee
@metamask-previews/user-operation-controller@41.2.0-preview-61580fcee

@salimtb
Copy link
Copy Markdown
Contributor Author

salimtb commented Apr 13, 2026

@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.0.0-preview-6a6b9109a
@metamask-previews/accounts-controller@37.2.0-preview-6a6b9109a
@metamask-previews/address-book-controller@7.1.1-preview-6a6b9109a
@metamask-previews/ai-controllers@0.6.3-preview-6a6b9109a
@metamask-previews/analytics-controller@1.0.1-preview-6a6b9109a
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-6a6b9109a
@metamask-previews/announcement-controller@8.1.0-preview-6a6b9109a
@metamask-previews/app-metadata-controller@2.0.1-preview-6a6b9109a
@metamask-previews/approval-controller@9.0.1-preview-6a6b9109a
@metamask-previews/assets-controller@5.0.0-preview-6a6b9109a
@metamask-previews/assets-controllers@103.1.1-preview-6a6b9109a
@metamask-previews/base-controller@9.0.1-preview-6a6b9109a
@metamask-previews/base-data-service@0.1.1-preview-6a6b9109a
@metamask-previews/bridge-controller@70.0.1-preview-6a6b9109a
@metamask-previews/bridge-status-controller@70.0.5-preview-6a6b9109a
@metamask-previews/build-utils@3.0.4-preview-6a6b9109a
@metamask-previews/chain-agnostic-permission@1.5.0-preview-6a6b9109a
@metamask-previews/claims-controller@0.5.0-preview-6a6b9109a
@metamask-previews/client-controller@1.0.1-preview-6a6b9109a
@metamask-previews/compliance-controller@2.0.0-preview-6a6b9109a
@metamask-previews/composable-controller@12.0.1-preview-6a6b9109a
@metamask-previews/config-registry-controller@0.2.0-preview-6a6b9109a
@metamask-previews/connectivity-controller@0.2.0-preview-6a6b9109a
@metamask-previews/controller-utils@11.20.0-preview-6a6b9109a
@metamask-previews/core-backend@6.2.1-preview-6a6b9109a
@metamask-previews/delegation-controller@2.1.0-preview-6a6b9109a
@metamask-previews/earn-controller@11.2.1-preview-6a6b9109a
@metamask-previews/eip-5792-middleware@3.0.3-preview-6a6b9109a
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-6a6b9109a
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-6a6b9109a
@metamask-previews/ens-controller@19.1.1-preview-6a6b9109a
@metamask-previews/eth-block-tracker@15.0.1-preview-6a6b9109a
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-6a6b9109a
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-6a6b9109a
@metamask-previews/foundryup@1.0.1-preview-6a6b9109a
@metamask-previews/gas-fee-controller@26.1.1-preview-6a6b9109a
@metamask-previews/gator-permissions-controller@3.0.1-preview-6a6b9109a
@metamask-previews/geolocation-controller@0.1.2-preview-6a6b9109a
@metamask-previews/json-rpc-engine@10.2.4-preview-6a6b9109a
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-6a6b9109a
@metamask-previews/keyring-controller@25.2.0-preview-6a6b9109a
@metamask-previews/logging-controller@8.0.1-preview-6a6b9109a
@metamask-previews/message-manager@14.1.1-preview-6a6b9109a
@metamask-previews/messenger@1.1.1-preview-6a6b9109a
@metamask-previews/messenger-cli@0.1.0-preview-6a6b9109a
@metamask-previews/money-account-controller@0.1.0-preview-6a6b9109a
@metamask-previews/multichain-account-service@8.0.1-preview-6a6b9109a
@metamask-previews/multichain-api-middleware@2.0.0-preview-6a6b9109a
@metamask-previews/multichain-network-controller@3.0.6-preview-6a6b9109a
@metamask-previews/multichain-transactions-controller@7.0.4-preview-6a6b9109a
@metamask-previews/name-controller@9.1.1-preview-6a6b9109a
@metamask-previews/network-controller@30.0.1-preview-6a6b9109a
@metamask-previews/network-enablement-controller@5.0.2-preview-6a6b9109a
@metamask-previews/notification-services-controller@23.0.1-preview-6a6b9109a
@metamask-previews/permission-controller@12.3.0-preview-6a6b9109a
@metamask-previews/permission-log-controller@5.1.0-preview-6a6b9109a
@metamask-previews/perps-controller@3.0.0-preview-6a6b9109a
@metamask-previews/phishing-controller@17.1.1-preview-6a6b9109a
@metamask-previews/polling-controller@16.0.4-preview-6a6b9109a
@metamask-previews/preferences-controller@23.1.0-preview-6a6b9109a
@metamask-previews/profile-metrics-controller@3.1.3-preview-6a6b9109a
@metamask-previews/profile-sync-controller@28.0.2-preview-6a6b9109a
@metamask-previews/ramps-controller@13.1.0-preview-6a6b9109a
@metamask-previews/rate-limit-controller@7.0.1-preview-6a6b9109a
@metamask-previews/react-data-query@0.2.0-preview-6a6b9109a
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-6a6b9109a
@metamask-previews/sample-controllers@4.0.4-preview-6a6b9109a
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-6a6b9109a
@metamask-previews/selected-network-controller@26.1.0-preview-6a6b9109a
@metamask-previews/shield-controller@5.1.1-preview-6a6b9109a
@metamask-previews/signature-controller@39.1.2-preview-6a6b9109a
@metamask-previews/social-controllers@0.1.0-preview-6a6b9109a
@metamask-previews/storage-service@1.0.1-preview-6a6b9109a
@metamask-previews/subscription-controller@6.1.2-preview-6a6b9109a
@metamask-previews/transaction-controller@64.1.0-preview-6a6b9109a
@metamask-previews/transaction-pay-controller@19.1.0-preview-6a6b9109a
@metamask-previews/user-operation-controller@41.2.0-preview-6a6b9109a

@salimtb
Copy link
Copy Markdown
Contributor Author

salimtb commented Apr 13, 2026

@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.0.0-preview-d5ac72227
@metamask-previews/accounts-controller@37.2.0-preview-d5ac72227
@metamask-previews/address-book-controller@7.1.1-preview-d5ac72227
@metamask-previews/ai-controllers@0.6.3-preview-d5ac72227
@metamask-previews/analytics-controller@1.0.1-preview-d5ac72227
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-d5ac72227
@metamask-previews/announcement-controller@8.1.0-preview-d5ac72227
@metamask-previews/app-metadata-controller@2.0.1-preview-d5ac72227
@metamask-previews/approval-controller@9.0.1-preview-d5ac72227
@metamask-previews/assets-controller@5.0.0-preview-d5ac72227
@metamask-previews/assets-controllers@103.1.1-preview-d5ac72227
@metamask-previews/base-controller@9.0.1-preview-d5ac72227
@metamask-previews/base-data-service@0.1.1-preview-d5ac72227
@metamask-previews/bridge-controller@70.0.1-preview-d5ac72227
@metamask-previews/bridge-status-controller@70.0.5-preview-d5ac72227
@metamask-previews/build-utils@3.0.4-preview-d5ac72227
@metamask-previews/chain-agnostic-permission@1.5.0-preview-d5ac72227
@metamask-previews/claims-controller@0.5.0-preview-d5ac72227
@metamask-previews/client-controller@1.0.1-preview-d5ac72227
@metamask-previews/compliance-controller@2.0.0-preview-d5ac72227
@metamask-previews/composable-controller@12.0.1-preview-d5ac72227
@metamask-previews/config-registry-controller@0.2.0-preview-d5ac72227
@metamask-previews/connectivity-controller@0.2.0-preview-d5ac72227
@metamask-previews/controller-utils@11.20.0-preview-d5ac72227
@metamask-previews/core-backend@6.2.1-preview-d5ac72227
@metamask-previews/delegation-controller@2.1.0-preview-d5ac72227
@metamask-previews/earn-controller@11.2.1-preview-d5ac72227
@metamask-previews/eip-5792-middleware@3.0.3-preview-d5ac72227
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-d5ac72227
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-d5ac72227
@metamask-previews/ens-controller@19.1.1-preview-d5ac72227
@metamask-previews/eth-block-tracker@15.0.1-preview-d5ac72227
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-d5ac72227
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-d5ac72227
@metamask-previews/foundryup@1.0.1-preview-d5ac72227
@metamask-previews/gas-fee-controller@26.1.1-preview-d5ac72227
@metamask-previews/gator-permissions-controller@3.0.1-preview-d5ac72227
@metamask-previews/geolocation-controller@0.1.2-preview-d5ac72227
@metamask-previews/json-rpc-engine@10.2.4-preview-d5ac72227
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-d5ac72227
@metamask-previews/keyring-controller@25.2.0-preview-d5ac72227
@metamask-previews/logging-controller@8.0.1-preview-d5ac72227
@metamask-previews/message-manager@14.1.1-preview-d5ac72227
@metamask-previews/messenger@1.1.1-preview-d5ac72227
@metamask-previews/messenger-cli@0.1.0-preview-d5ac72227
@metamask-previews/money-account-controller@0.1.0-preview-d5ac72227
@metamask-previews/multichain-account-service@8.0.1-preview-d5ac72227
@metamask-previews/multichain-api-middleware@2.0.0-preview-d5ac72227
@metamask-previews/multichain-network-controller@3.0.6-preview-d5ac72227
@metamask-previews/multichain-transactions-controller@7.0.4-preview-d5ac72227
@metamask-previews/name-controller@9.1.1-preview-d5ac72227
@metamask-previews/network-controller@30.0.1-preview-d5ac72227
@metamask-previews/network-enablement-controller@5.0.2-preview-d5ac72227
@metamask-previews/notification-services-controller@23.0.1-preview-d5ac72227
@metamask-previews/permission-controller@12.3.0-preview-d5ac72227
@metamask-previews/permission-log-controller@5.1.0-preview-d5ac72227
@metamask-previews/perps-controller@3.0.0-preview-d5ac72227
@metamask-previews/phishing-controller@17.1.1-preview-d5ac72227
@metamask-previews/polling-controller@16.0.4-preview-d5ac72227
@metamask-previews/preferences-controller@23.1.0-preview-d5ac72227
@metamask-previews/profile-metrics-controller@3.1.3-preview-d5ac72227
@metamask-previews/profile-sync-controller@28.0.2-preview-d5ac72227
@metamask-previews/ramps-controller@13.1.0-preview-d5ac72227
@metamask-previews/rate-limit-controller@7.0.1-preview-d5ac72227
@metamask-previews/react-data-query@0.2.0-preview-d5ac72227
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-d5ac72227
@metamask-previews/sample-controllers@4.0.4-preview-d5ac72227
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-d5ac72227
@metamask-previews/selected-network-controller@26.1.0-preview-d5ac72227
@metamask-previews/shield-controller@5.1.1-preview-d5ac72227
@metamask-previews/signature-controller@39.1.2-preview-d5ac72227
@metamask-previews/social-controllers@0.1.0-preview-d5ac72227
@metamask-previews/storage-service@1.0.1-preview-d5ac72227
@metamask-previews/subscription-controller@6.1.2-preview-d5ac72227
@metamask-previews/transaction-controller@64.1.0-preview-d5ac72227
@metamask-previews/transaction-pay-controller@19.1.0-preview-d5ac72227
@metamask-previews/user-operation-controller@41.2.0-preview-d5ac72227

Copy link
Copy Markdown

@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 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 d5ac722. Configure here.

this.updateActiveChains([], (updatedChains) =>
this.#onActiveChainsUpdated(this.getName(), updatedChains, previous),
);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Disconnect handler creates subscriptions while controller is stopped

High Severity

When the WebSocket disconnects after #stop() has already been called (e.g., because the keyring is locked), #handleDisconnect calls updateActiveChains([], callback) and fires #onActiveChainsUpdated. This triggers #handleActiveChainsUpdate#subscribeAssets(), which has no shouldRun guard, creating new entries in AssetsController.#activeSubscriptions even though the controller was intentionally stopped. When the user later unlocks the wallet, #start() sees #activeSubscriptions.size > 0 and returns early — bypassing the force-refresh getAssets() call, #ensureNativeBalancesDefaultZero(), and #lastKnownAccountIds initialization. Before this PR, #handleDisconnect did not call updateActiveChains, so this code path did not exist.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit d5ac722. Configure here.

@salimtb salimtb marked this pull request as draft April 14, 2026 08:08
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.

1 participant