Skip to content

fix(assets-controller): skip known assets in DetectionMiddleware to prevent redundant token/price fetches#9215

Open
salimtb wants to merge 3 commits into
mainfrom
fix/detection-middleware-skip-known-assets
Open

fix(assets-controller): skip known assets in DetectionMiddleware to prevent redundant token/price fetches#9215
salimtb wants to merge 3 commits into
mainfrom
fix/detection-middleware-skip-known-assets

Conversation

@salimtb

@salimtb salimtb commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

Previously DetectionMiddleware populated detectedAssets with every asset from assetsBalance and every custom asset on every balance poll cycle. This caused TokenDataSource and PriceDataSource to be invoked on every RPC poll even for assets that were already fully tracked in state, resulting in unnecessary multicall and price API requests.

detectedAssets now only includes assets that are genuinely new — absent from both state.assetsBalance and state.assetsInfo. Custom assets follow the same rule. The PriceDataSource subscription already handles periodic price refreshes for all known assets, so excluding them here is correct.

Explanation

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
Changes asset detection and merge-vs-full state semantics during polling; wrong filtering could skip needed metadata fetches, while incorrect merge behavior could leave stale balances visible on partial network coverage.

Overview
Cuts redundant token metadata and price work on every balance poll by narrowing what DetectionMiddleware puts in detectedAssets: balance and custom assets are included only when they are missing from both state.assetsBalance and state.assetsInfo, on the assumption that PriceDataSource already refreshes known assets.

AccountsApiDataSource and SnapDataSource now return updateMode: 'merge' instead of 'full', so partial poll responses no longer treat the payload as authoritative and wipe balances for custom or partially supported networks.

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

…revent redundant token/price fetches

Previously DetectionMiddleware populated `detectedAssets` with every asset
from `assetsBalance` and every custom asset on every balance poll cycle.
This caused TokenDataSource and PriceDataSource to be invoked on every RPC
poll even for assets that were already fully tracked in state, resulting in
unnecessary multicall and price API requests.

`detectedAssets` now only includes assets that are genuinely new — absent
from both `state.assetsBalance` and `state.assetsInfo`. Custom assets follow
the same rule. The PriceDataSource subscription already handles periodic
price refreshes for all known assets, so excluding them here is correct.
@salimtb salimtb marked this pull request as ready for review June 21, 2026 12:24
@salimtb salimtb requested a review from a team as a code owner June 21, 2026 12:24
@salimtb salimtb temporarily deployed to default-branch June 21, 2026 12:24 — with GitHub Actions Inactive

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

Comment thread packages/assets-controller/src/middlewares/DetectionMiddleware.ts
salimtb added 2 commits June 21, 2026 16:24
… and SnapDataSource

Using 'full' updateMode caused assets to be wiped on custom networks
whenever the API returned an empty or partial response for a chain it
didn't fully support. Switching to 'merge' prevents false deletions
while still overlaying fresh balance data from each poll.
@salimtb salimtb requested a review from a team as a code owner June 21, 2026 14:28
@salimtb

salimtb commented Jun 21, 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.2-preview-6da9f2b
@metamask-previews/accounts-controller@39.0.1-preview-6da9f2b
@metamask-previews/address-book-controller@7.1.2-preview-6da9f2b
@metamask-previews/ai-controllers@0.7.0-preview-6da9f2b
@metamask-previews/analytics-controller@1.1.1-preview-6da9f2b
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-6da9f2b
@metamask-previews/announcement-controller@8.1.0-preview-6da9f2b
@metamask-previews/app-metadata-controller@2.0.1-preview-6da9f2b
@metamask-previews/approval-controller@9.0.2-preview-6da9f2b
@metamask-previews/assets-controller@9.0.1-preview-6da9f2b
@metamask-previews/assets-controllers@109.2.0-preview-6da9f2b
@metamask-previews/authenticated-user-storage@2.0.0-preview-6da9f2b
@metamask-previews/base-controller@9.1.0-preview-6da9f2b
@metamask-previews/base-data-service@0.1.3-preview-6da9f2b
@metamask-previews/bridge-controller@75.2.0-preview-6da9f2b
@metamask-previews/bridge-status-controller@72.1.0-preview-6da9f2b
@metamask-previews/build-utils@3.0.4-preview-6da9f2b
@metamask-previews/chain-agnostic-permission@1.6.2-preview-6da9f2b
@metamask-previews/chomp-api-service@3.1.0-preview-6da9f2b
@metamask-previews/claims-controller@0.5.3-preview-6da9f2b
@metamask-previews/client-controller@1.0.1-preview-6da9f2b
@metamask-previews/compliance-controller@2.1.0-preview-6da9f2b
@metamask-previews/composable-controller@12.0.1-preview-6da9f2b
@metamask-previews/config-registry-controller@0.4.1-preview-6da9f2b
@metamask-previews/connectivity-controller@0.2.0-preview-6da9f2b
@metamask-previews/controller-utils@12.2.0-preview-6da9f2b
@metamask-previews/core-backend@6.3.3-preview-6da9f2b
@metamask-previews/delegation-controller@3.0.2-preview-6da9f2b
@metamask-previews/earn-controller@12.2.0-preview-6da9f2b
@metamask-previews/eip-5792-middleware@3.0.4-preview-6da9f2b
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-6da9f2b
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-6da9f2b
@metamask-previews/ens-controller@19.1.3-preview-6da9f2b
@metamask-previews/eth-block-tracker@15.0.1-preview-6da9f2b
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-6da9f2b
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-6da9f2b
@metamask-previews/foundryup@1.0.1-preview-6da9f2b
@metamask-previews/gas-fee-controller@26.2.2-preview-6da9f2b
@metamask-previews/gator-permissions-controller@4.2.0-preview-6da9f2b
@metamask-previews/geolocation-controller@0.1.3-preview-6da9f2b
@metamask-previews/json-rpc-engine@10.5.0-preview-6da9f2b
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-6da9f2b
@metamask-previews/keyring-controller@27.1.0-preview-6da9f2b
@metamask-previews/logging-controller@8.0.2-preview-6da9f2b
@metamask-previews/message-manager@14.1.2-preview-6da9f2b
@metamask-previews/messenger@1.2.0-preview-6da9f2b
@metamask-previews/messenger-cli@0.2.0-preview-6da9f2b
@metamask-previews/money-account-balance-service@2.1.0-preview-6da9f2b
@metamask-previews/money-account-controller@0.3.3-preview-6da9f2b
@metamask-previews/money-account-upgrade-controller@2.0.5-preview-6da9f2b
@metamask-previews/multichain-account-service@10.0.3-preview-6da9f2b
@metamask-previews/multichain-api-middleware@3.1.4-preview-6da9f2b
@metamask-previews/multichain-network-controller@3.1.3-preview-6da9f2b
@metamask-previews/multichain-transactions-controller@7.1.1-preview-6da9f2b
@metamask-previews/name-controller@9.1.2-preview-6da9f2b
@metamask-previews/network-controller@32.0.0-preview-6da9f2b
@metamask-previews/network-enablement-controller@5.3.0-preview-6da9f2b
@metamask-previews/notification-services-controller@24.1.3-preview-6da9f2b
@metamask-previews/passkey-controller@2.0.1-preview-6da9f2b
@metamask-previews/permission-controller@13.1.1-preview-6da9f2b
@metamask-previews/permission-log-controller@5.1.0-preview-6da9f2b
@metamask-previews/perps-controller@8.2.0-preview-6da9f2b
@metamask-previews/phishing-controller@17.2.0-preview-6da9f2b
@metamask-previews/polling-controller@16.0.6-preview-6da9f2b
@metamask-previews/preferences-controller@23.1.0-preview-6da9f2b
@metamask-previews/profile-metrics-controller@3.2.0-preview-6da9f2b
@metamask-previews/profile-sync-controller@28.2.0-preview-6da9f2b
@metamask-previews/ramps-controller@14.3.0-preview-6da9f2b
@metamask-previews/rate-limit-controller@7.0.1-preview-6da9f2b
@metamask-previews/react-data-query@0.2.1-preview-6da9f2b
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-6da9f2b
@metamask-previews/sample-controllers@5.0.1-preview-6da9f2b
@metamask-previews/seedless-onboarding-controller@10.0.2-preview-6da9f2b
@metamask-previews/selected-network-controller@26.1.3-preview-6da9f2b
@metamask-previews/shield-controller@5.1.2-preview-6da9f2b
@metamask-previews/signature-controller@39.2.5-preview-6da9f2b
@metamask-previews/smart-transactions-controller@24.2.2-preview-6da9f2b
@metamask-previews/snap-account-service@0.3.1-preview-6da9f2b
@metamask-previews/social-controllers@2.3.1-preview-6da9f2b
@metamask-previews/storage-service@1.0.2-preview-6da9f2b
@metamask-previews/subscription-controller@6.2.0-preview-6da9f2b
@metamask-previews/transaction-controller@68.1.0-preview-6da9f2b
@metamask-previews/transaction-pay-controller@23.13.0-preview-6da9f2b
@metamask-previews/user-operation-controller@41.2.4-preview-6da9f2b
@metamask-previews/wallet@3.0.0-preview-6da9f2b
@metamask-previews/wallet-cli@0.0.0-preview-6da9f2b

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