Skip to content

fix(assets-controller): implement spam asset cleanup functionality - #9973

Open
Prithpal-Sooriya wants to merge 22 commits into
mainfrom
fix(assets-controller)/add-asset-cleanup-process-on-unlock
Open

fix(assets-controller): implement spam asset cleanup functionality#9973
Prithpal-Sooriya wants to merge 22 commits into
mainfrom
fix(assets-controller)/add-asset-cleanup-process-on-unlock

Conversation

@Prithpal-Sooriya

@Prithpal-Sooriya Prithpal-Sooriya commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Explanation

Adds spam cleanup for users. This is additional filtering to ensure we are protected if any external system adds in spam (WS, API, Migration).

This is because our external sources can fail and add in spam:

  • API filters can loosen, and add in spam tokens.
  • WS has no filtering right now, so airdrops are added to the wallet.

This safeguards ourselves by adding additional cleanup on startup/unlock. We need a longer term discussion & decision with Assets team to highlight this cleanup issue and building a trustless system.

Builds:

References

https://consensyssoftware.atlassian.net/browse/ASSETS-3905

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
Unlock now mutates persisted asset state using Token API occurrence heuristics, which can remove legitimate thinly-listed tokens and depends on API availability at unlock time.

Overview
Runs a Token API–backed spam sweep when the wallet unlocks, so airdrop junk that slipped in via websocket, loosened API filters, or migrations is dropped from persisted assetsInfo and assetsBalance without waiting for the next balance fetch.

On KeyringController:unlock, AssetsController now calls cleanSpamAssets (only when the keyring is unlocked and basic functionality is on). That helper picks sweepable ERC-20s on Accounts-API chains (skipping default-tracked tokens, user-imported customAssets, native/non-EVM assets), loads suggested occurrence floors and /v3/assets occurrence counts in batches of 50, and removes tokens below the per-chain floor. API failures are fail-closed (state unchanged, optional captureException); successful sweeps apply via a single update patch. Prices, preferences, and imported tokens are left alone.

Adds nock-based unit/integration coverage (AssetsController.spam-cleanup.test.ts, expanded healAssetsInfoMetadata tests) plus shared test fixtures and mock-messenger helpers for unlock-driven flows.

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

Adds spam cleanup for users. This is because our external sources can fail and add in spam:
- API filters can loosen, and add in spam tokens.
- WS has no filtering right now, so airdrops are added to the wallet.

This safeguards ourselves by adding additional cleanup on startup/unlock. We need a longer term discussion & decision with Assets team to highlight this cleanup issue and building a trustless system.
@Prithpal-Sooriya

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@8.0.0-preview-4165cebcf
@metamask-previews/accounts-controller@39.1.0-preview-4165cebcf
@metamask-previews/address-book-controller@7.1.2-preview-4165cebcf
@metamask-previews/ai-controllers@0.8.0-preview-4165cebcf
@metamask-previews/analytics-controller@2.0.0-preview-4165cebcf
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-4165cebcf
@metamask-previews/announcement-controller@8.1.0-preview-4165cebcf
@metamask-previews/app-metadata-controller@2.0.1-preview-4165cebcf
@metamask-previews/approval-controller@9.0.2-preview-4165cebcf
@metamask-previews/assets-controller@14.0.1-preview-4165cebcf
@metamask-previews/assets-controllers@111.1.2-preview-4165cebcf
@metamask-previews/authenticated-user-storage@3.0.1-preview-4165cebcf
@metamask-previews/base-controller@9.1.0-preview-4165cebcf
@metamask-previews/base-data-service@0.1.3-preview-4165cebcf
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-4165cebcf
@metamask-previews/bridge-controller@79.3.0-preview-4165cebcf
@metamask-previews/bridge-status-controller@75.2.0-preview-4165cebcf
@metamask-previews/build-utils@3.0.4-preview-4165cebcf
@metamask-previews/chain-agnostic-permission@1.7.0-preview-4165cebcf
@metamask-previews/chomp-api-service@4.0.0-preview-4165cebcf
@metamask-previews/claims-controller@0.6.0-preview-4165cebcf
@metamask-previews/client-controller@1.0.1-preview-4165cebcf
@metamask-previews/client-utils@2.1.1-preview-4165cebcf
@metamask-previews/compliance-controller@2.1.0-preview-4165cebcf
@metamask-previews/composable-controller@12.0.1-preview-4165cebcf
@metamask-previews/config-registry-controller@3.0.0-preview-4165cebcf
@metamask-previews/connectivity-controller@0.3.0-preview-4165cebcf
@metamask-previews/controller-utils@12.3.0-preview-4165cebcf
@metamask-previews/core-backend@9.0.0-preview-4165cebcf
@metamask-previews/delegation-controller@3.0.2-preview-4165cebcf
@metamask-previews/earn-controller@12.2.5-preview-4165cebcf
@metamask-previews/eip-5792-middleware@3.0.5-preview-4165cebcf
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-4165cebcf
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-4165cebcf
@metamask-previews/eth-block-tracker@15.0.1-preview-4165cebcf
@metamask-previews/eth-json-rpc-middleware@24.0.0-preview-4165cebcf
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-4165cebcf
@metamask-previews/foundryup@1.0.1-preview-4165cebcf
@metamask-previews/gas-fee-controller@26.3.1-preview-4165cebcf
@metamask-previews/gator-permissions-controller@5.0.1-preview-4165cebcf
@metamask-previews/geolocation-controller@1.0.0-preview-4165cebcf
@metamask-previews/java-tron-up@1.0.0-preview-4165cebcf
@metamask-previews/json-rpc-engine@10.5.0-preview-4165cebcf
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-4165cebcf
@metamask-previews/keyring-controller@27.1.1-preview-4165cebcf
@metamask-previews/kyc-controller@0.0.0-preview-4165cebcf
@metamask-previews/local-node-utils@1.0.0-preview-4165cebcf
@metamask-previews/logging-controller@9.0.0-preview-4165cebcf
@metamask-previews/message-manager@14.1.2-preview-4165cebcf
@metamask-previews/messenger@2.0.0-preview-4165cebcf
@metamask-previews/messenger-cli@0.2.0-preview-4165cebcf
@metamask-previews/money-account-api-data-service@0.4.0-preview-4165cebcf
@metamask-previews/money-account-balance-service@2.4.1-preview-4165cebcf
@metamask-previews/money-account-controller@1.0.0-preview-4165cebcf
@metamask-previews/money-account-upgrade-controller@3.0.1-preview-4165cebcf
@metamask-previews/money-account-utils@1.1.0-preview-4165cebcf
@metamask-previews/multichain-account-service@13.0.2-preview-4165cebcf
@metamask-previews/multichain-api-middleware@4.0.2-preview-4165cebcf
@metamask-previews/multichain-network-controller@3.2.3-preview-4165cebcf
@metamask-previews/multichain-transactions-controller@7.1.2-preview-4165cebcf
@metamask-previews/name-controller@9.1.2-preview-4165cebcf
@metamask-previews/network-connection-banner-controller@0.2.0-preview-4165cebcf
@metamask-previews/network-controller@35.0.1-preview-4165cebcf
@metamask-previews/network-enablement-controller@6.0.4-preview-4165cebcf
@metamask-previews/notification-services-controller@26.0.1-preview-4165cebcf
@metamask-previews/passkey-controller@3.1.0-preview-4165cebcf
@metamask-previews/permission-controller@13.1.1-preview-4165cebcf
@metamask-previews/permission-log-controller@5.1.0-preview-4165cebcf
@metamask-previews/perps-controller@12.2.0-preview-4165cebcf
@metamask-previews/phishing-controller@17.4.0-preview-4165cebcf
@metamask-previews/platform-api-docs@0.0.0-preview-4165cebcf
@metamask-previews/polling-controller@16.0.9-preview-4165cebcf
@metamask-previews/preferences-controller@23.1.0-preview-4165cebcf
@metamask-previews/profile-metrics-controller@4.0.3-preview-4165cebcf
@metamask-previews/profile-sync-controller@29.0.0-preview-4165cebcf
@metamask-previews/ramps-controller@20.0.0-preview-4165cebcf
@metamask-previews/rate-limit-controller@7.0.1-preview-4165cebcf
@metamask-previews/react-data-query@0.2.2-preview-4165cebcf
@metamask-previews/remote-feature-flag-controller@6.0.0-preview-4165cebcf
@metamask-previews/sample-controllers@5.0.4-preview-4165cebcf
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-4165cebcf
@metamask-previews/selected-network-controller@26.1.6-preview-4165cebcf
@metamask-previews/sentinel-api-service@1.0.0-preview-4165cebcf
@metamask-previews/shield-controller@6.0.0-preview-4165cebcf
@metamask-previews/signature-controller@39.2.9-preview-4165cebcf
@metamask-previews/smart-transactions-controller@25.1.0-preview-4165cebcf
@metamask-previews/snap-account-service@2.1.2-preview-4165cebcf
@metamask-previews/social-controllers@2.7.1-preview-4165cebcf
@metamask-previews/solana-test-validator-up@1.0.0-preview-4165cebcf
@metamask-previews/stellar-quickstart-up@0.0.0-preview-4165cebcf
@metamask-previews/storage-service@1.0.2-preview-4165cebcf
@metamask-previews/subscription-controller@8.0.0-preview-4165cebcf
@metamask-previews/transaction-controller@69.6.0-preview-4165cebcf
@metamask-previews/transaction-pay-controller@26.4.1-preview-4165cebcf
@metamask-previews/user-operation-controller@41.2.8-preview-4165cebcf
@metamask-previews/wallet@12.0.1-preview-4165cebcf
@metamask-previews/wallet-cli@0.0.0-preview-4165cebcf

…)/add-asset-cleanup-process-on-unlock

Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	packages/assets-controller/CHANGELOG.md
@Prithpal-Sooriya

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@Prithpal-Sooriya

Copy link
Copy Markdown
Contributor Author

@cursor /babysit fix CI

@cursor

cursor Bot commented Aug 26, 2026

Copy link
Copy Markdown

Taking a look!

Open in Web Open in Cursor 

- Add unit tests for cleanSpamAssets covering candidate filtering,
  spam removal, API failures, and occurrence floor fallback
- Add AssetsController integration tests for unlock-triggered cleanup
- Fix import order in healAssetsInfoMetadata.ts for lint:misc:check

Co-authored-by: Prithpal Sooriya <prithpal.sooriya@gmail.com>
@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@8.0.0-preview-f8cb83dcd
@metamask-previews/accounts-controller@39.1.1-preview-f8cb83dcd
@metamask-previews/address-book-controller@7.1.2-preview-f8cb83dcd
@metamask-previews/ai-controllers@0.8.0-preview-f8cb83dcd
@metamask-previews/analytics-controller@2.0.0-preview-f8cb83dcd
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-f8cb83dcd
@metamask-previews/announcement-controller@8.1.0-preview-f8cb83dcd
@metamask-previews/app-metadata-controller@2.0.1-preview-f8cb83dcd
@metamask-previews/approval-controller@9.0.2-preview-f8cb83dcd
@metamask-previews/assets-controller@14.0.2-preview-f8cb83dcd
@metamask-previews/assets-controllers@111.1.3-preview-f8cb83dcd
@metamask-previews/authenticated-user-storage@3.0.2-preview-f8cb83dcd
@metamask-previews/base-controller@9.1.0-preview-f8cb83dcd
@metamask-previews/base-data-service@1.0.0-preview-f8cb83dcd
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-f8cb83dcd
@metamask-previews/bridge-controller@79.3.1-preview-f8cb83dcd
@metamask-previews/bridge-status-controller@75.2.1-preview-f8cb83dcd
@metamask-previews/build-utils@3.0.4-preview-f8cb83dcd
@metamask-previews/chain-agnostic-permission@1.7.0-preview-f8cb83dcd
@metamask-previews/chomp-api-service@4.0.1-preview-f8cb83dcd
@metamask-previews/claims-controller@0.6.1-preview-f8cb83dcd
@metamask-previews/client-controller@1.0.1-preview-f8cb83dcd
@metamask-previews/client-utils@2.1.1-preview-f8cb83dcd
@metamask-previews/compliance-controller@2.1.0-preview-f8cb83dcd
@metamask-previews/composable-controller@12.0.1-preview-f8cb83dcd
@metamask-previews/config-registry-controller@3.1.0-preview-f8cb83dcd
@metamask-previews/connectivity-controller@0.3.0-preview-f8cb83dcd
@metamask-previews/controller-utils@12.3.0-preview-f8cb83dcd
@metamask-previews/core-backend@9.0.0-preview-f8cb83dcd
@metamask-previews/delegation-controller@3.0.2-preview-f8cb83dcd
@metamask-previews/earn-controller@12.2.6-preview-f8cb83dcd
@metamask-previews/eip-5792-middleware@3.0.5-preview-f8cb83dcd
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-f8cb83dcd
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-f8cb83dcd
@metamask-previews/eth-block-tracker@15.0.1-preview-f8cb83dcd
@metamask-previews/eth-json-rpc-middleware@24.0.1-preview-f8cb83dcd
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-f8cb83dcd
@metamask-previews/foundryup@1.0.1-preview-f8cb83dcd
@metamask-previews/gas-fee-controller@26.3.2-preview-f8cb83dcd
@metamask-previews/gator-permissions-controller@5.0.2-preview-f8cb83dcd
@metamask-previews/geolocation-controller@1.0.0-preview-f8cb83dcd
@metamask-previews/java-tron-up@1.0.0-preview-f8cb83dcd
@metamask-previews/json-rpc-engine@10.5.0-preview-f8cb83dcd
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-f8cb83dcd
@metamask-previews/keyring-controller@27.1.1-preview-f8cb83dcd
@metamask-previews/kyc-controller@0.0.0-preview-f8cb83dcd
@metamask-previews/local-node-utils@1.0.0-preview-f8cb83dcd
@metamask-previews/logging-controller@9.0.0-preview-f8cb83dcd
@metamask-previews/message-manager@14.1.2-preview-f8cb83dcd
@metamask-previews/messenger@2.0.0-preview-f8cb83dcd
@metamask-previews/messenger-cli@0.2.0-preview-f8cb83dcd
@metamask-previews/money-account-api-data-service@0.4.1-preview-f8cb83dcd
@metamask-previews/money-account-balance-service@2.4.3-preview-f8cb83dcd
@metamask-previews/money-account-controller@1.0.0-preview-f8cb83dcd
@metamask-previews/money-account-upgrade-controller@3.0.2-preview-f8cb83dcd
@metamask-previews/money-account-utils@1.1.0-preview-f8cb83dcd
@metamask-previews/multichain-account-service@13.0.2-preview-f8cb83dcd
@metamask-previews/multichain-api-middleware@4.0.3-preview-f8cb83dcd
@metamask-previews/multichain-network-controller@3.2.4-preview-f8cb83dcd
@metamask-previews/multichain-transactions-controller@7.1.2-preview-f8cb83dcd
@metamask-previews/name-controller@9.1.2-preview-f8cb83dcd
@metamask-previews/network-connection-banner-controller@0.2.1-preview-f8cb83dcd
@metamask-previews/network-controller@36.0.0-preview-f8cb83dcd
@metamask-previews/network-enablement-controller@6.0.5-preview-f8cb83dcd
@metamask-previews/notification-services-controller@26.0.1-preview-f8cb83dcd
@metamask-previews/passkey-controller@3.1.0-preview-f8cb83dcd
@metamask-previews/permission-controller@13.1.1-preview-f8cb83dcd
@metamask-previews/permission-log-controller@5.1.0-preview-f8cb83dcd
@metamask-previews/perps-controller@12.2.0-preview-f8cb83dcd
@metamask-previews/phishing-controller@17.4.0-preview-f8cb83dcd
@metamask-previews/platform-api-docs@0.0.0-preview-f8cb83dcd
@metamask-previews/polling-controller@16.0.9-preview-f8cb83dcd
@metamask-previews/preferences-controller@23.1.0-preview-f8cb83dcd
@metamask-previews/profile-metrics-controller@4.0.3-preview-f8cb83dcd
@metamask-previews/profile-sync-controller@29.0.0-preview-f8cb83dcd
@metamask-previews/ramps-controller@20.0.0-preview-f8cb83dcd
@metamask-previews/rate-limit-controller@7.0.1-preview-f8cb83dcd
@metamask-previews/react-data-query@1.0.0-preview-f8cb83dcd
@metamask-previews/remote-feature-flag-controller@6.0.0-preview-f8cb83dcd
@metamask-previews/sample-controllers@5.0.6-preview-f8cb83dcd
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-f8cb83dcd
@metamask-previews/selected-network-controller@26.1.7-preview-f8cb83dcd
@metamask-previews/sentinel-api-service@1.0.1-preview-f8cb83dcd
@metamask-previews/shield-controller@6.0.1-preview-f8cb83dcd
@metamask-previews/signature-controller@39.2.10-preview-f8cb83dcd
@metamask-previews/smart-transactions-controller@25.1.1-preview-f8cb83dcd
@metamask-previews/snap-account-service@2.1.2-preview-f8cb83dcd
@metamask-previews/social-controllers@2.7.2-preview-f8cb83dcd
@metamask-previews/solana-test-validator-up@1.0.0-preview-f8cb83dcd
@metamask-previews/stellar-quickstart-up@0.0.0-preview-f8cb83dcd
@metamask-previews/storage-service@1.0.2-preview-f8cb83dcd
@metamask-previews/subscription-controller@8.0.1-preview-f8cb83dcd
@metamask-previews/transaction-controller@69.6.1-preview-f8cb83dcd
@metamask-previews/transaction-pay-controller@27.0.0-preview-f8cb83dcd
@metamask-previews/user-operation-controller@41.2.9-preview-f8cb83dcd
@metamask-previews/wallet@12.0.2-preview-f8cb83dcd
@metamask-previews/wallet-cli@0.0.0-preview-f8cb83dcd

cursoragent and others added 3 commits August 26, 2026 12:42
Co-authored-by: Prithpal Sooriya <prithpal.sooriya@gmail.com>
- Unit test via healAssetsInfoMetadata.test.ts
- More ingrained integration test via AssetsController.spam-cleanup.test.ts

Also created some test mocks and utils via __fixtures__
There were small changes made to mocks... meh not a big deal.
@Prithpal-Sooriya
Prithpal-Sooriya marked this pull request as ready for review August 26, 2026 14:35
@Prithpal-Sooriya
Prithpal-Sooriya requested review from a team as code owners August 26, 2026 14:35
Comment thread packages/assets-controller/src/AssetsController.ts
@cursor
cursor Bot requested review from Kriys94 and salimtb August 26, 2026 14:38
cursoragent and others added 3 commits August 26, 2026 14:43
Co-authored-by: Prithpal Sooriya <prithpal.sooriya@gmail.com>
… cleanup

The previous implementation of #runSpamCleanup would replace the assetsInfo and assetsBalance state wholesale with a snapshot taken before awaiting the Token API. This caused any legitimate updates to those state slices that occurred concurrently to be dropped.

This commit updates the logic to compute the set of removed spam assets and delete only those specific assets from the current state, preserving any concurrent additions or modifications.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ock' of github.com:MetaMask/core into fix(assets-controller)/add-asset-cleanup-process-on-unlock
Comment thread packages/assets-controller/src/AssetsController.ts Outdated
Prithpal-Sooriya and others added 6 commits August 26, 2026 16:42
- Re-apply selective spam deletion in #runSpamCleanup so concurrent
  state updates during the Token API await are not overwritten
- Bump eslint suppression count for AssetsController stateChange usage
- Fix formatting in spam-cleanup test file

Co-authored-by: Prithpal Sooriya <prithpal.sooriya@gmail.com>
…date

Mutate the Immer draft in place with type assertions instead of
spreading assetsInfo/assetsBalance, matching the pattern used in
handleAssetsUpdate.

Co-authored-by: Prithpal Sooriya <prithpal.sooriya@gmail.com>
This was an edge-case caught from E2E tests on clients.
…ock' of github.com:MetaMask/core into fix(assets-controller)/add-asset-cleanup-process-on-unlock
Comment thread packages/assets-controller/src/AssetsController.ts
Trigger spam cleanup when UI, keyring, and account-tree preconditions are
first satisfied, not only on unlock. Update spam-cleanup tests to activate
the full lifecycle and relax assertions affected by concurrent tracking.

Co-authored-by: Prithpal Sooriya <prithpal.sooriya@gmail.com>
Comment thread packages/assets-controller/src/AssetsController.ts Outdated

@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 2 potential issues.

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 c2d9d46. Configure here.

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

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@8.0.0-preview-e68ab1498
@metamask-previews/accounts-controller@39.1.1-preview-e68ab1498
@metamask-previews/address-book-controller@7.1.2-preview-e68ab1498
@metamask-previews/ai-controllers@0.8.0-preview-e68ab1498
@metamask-previews/analytics-controller@2.0.0-preview-e68ab1498
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-e68ab1498
@metamask-previews/announcement-controller@8.1.0-preview-e68ab1498
@metamask-previews/app-metadata-controller@2.0.1-preview-e68ab1498
@metamask-previews/approval-controller@9.0.2-preview-e68ab1498
@metamask-previews/assets-controller@14.0.2-preview-e68ab1498
@metamask-previews/assets-controllers@111.1.3-preview-e68ab1498
@metamask-previews/authenticated-user-storage@3.0.2-preview-e68ab1498
@metamask-previews/base-controller@9.1.0-preview-e68ab1498
@metamask-previews/base-data-service@1.0.0-preview-e68ab1498
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-e68ab1498
@metamask-previews/bridge-controller@79.3.1-preview-e68ab1498
@metamask-previews/bridge-status-controller@75.2.1-preview-e68ab1498
@metamask-previews/build-utils@3.0.4-preview-e68ab1498
@metamask-previews/chain-agnostic-permission@1.7.0-preview-e68ab1498
@metamask-previews/chomp-api-service@4.0.1-preview-e68ab1498
@metamask-previews/claims-controller@0.6.1-preview-e68ab1498
@metamask-previews/client-controller@1.0.1-preview-e68ab1498
@metamask-previews/client-utils@2.1.1-preview-e68ab1498
@metamask-previews/compliance-controller@2.1.0-preview-e68ab1498
@metamask-previews/composable-controller@12.0.1-preview-e68ab1498
@metamask-previews/config-registry-controller@3.1.0-preview-e68ab1498
@metamask-previews/connectivity-controller@0.3.0-preview-e68ab1498
@metamask-previews/controller-utils@12.3.0-preview-e68ab1498
@metamask-previews/core-backend@9.0.0-preview-e68ab1498
@metamask-previews/delegation-controller@3.0.2-preview-e68ab1498
@metamask-previews/earn-controller@12.2.6-preview-e68ab1498
@metamask-previews/eip-5792-middleware@3.0.5-preview-e68ab1498
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-e68ab1498
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-e68ab1498
@metamask-previews/eth-block-tracker@15.0.1-preview-e68ab1498
@metamask-previews/eth-json-rpc-middleware@24.0.1-preview-e68ab1498
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-e68ab1498
@metamask-previews/foundryup@1.0.1-preview-e68ab1498
@metamask-previews/gas-fee-controller@26.3.2-preview-e68ab1498
@metamask-previews/gator-permissions-controller@5.0.2-preview-e68ab1498
@metamask-previews/geolocation-controller@1.0.0-preview-e68ab1498
@metamask-previews/java-tron-up@1.0.0-preview-e68ab1498
@metamask-previews/json-rpc-engine@10.5.0-preview-e68ab1498
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-e68ab1498
@metamask-previews/keyring-controller@27.1.1-preview-e68ab1498
@metamask-previews/kyc-controller@0.0.0-preview-e68ab1498
@metamask-previews/local-node-utils@1.0.0-preview-e68ab1498
@metamask-previews/logging-controller@9.0.0-preview-e68ab1498
@metamask-previews/message-manager@14.1.2-preview-e68ab1498
@metamask-previews/messenger@2.0.0-preview-e68ab1498
@metamask-previews/messenger-cli@0.2.0-preview-e68ab1498
@metamask-previews/money-account-api-data-service@0.4.1-preview-e68ab1498
@metamask-previews/money-account-balance-service@2.4.3-preview-e68ab1498
@metamask-previews/money-account-controller@1.0.0-preview-e68ab1498
@metamask-previews/money-account-upgrade-controller@3.0.2-preview-e68ab1498
@metamask-previews/money-account-utils@1.1.0-preview-e68ab1498
@metamask-previews/multichain-account-service@13.0.2-preview-e68ab1498
@metamask-previews/multichain-api-middleware@4.0.3-preview-e68ab1498
@metamask-previews/multichain-network-controller@3.2.4-preview-e68ab1498
@metamask-previews/multichain-transactions-controller@7.1.2-preview-e68ab1498
@metamask-previews/name-controller@9.1.2-preview-e68ab1498
@metamask-previews/network-connection-banner-controller@0.2.1-preview-e68ab1498
@metamask-previews/network-controller@36.0.0-preview-e68ab1498
@metamask-previews/network-enablement-controller@6.0.5-preview-e68ab1498
@metamask-previews/notification-services-controller@26.0.1-preview-e68ab1498
@metamask-previews/passkey-controller@3.1.0-preview-e68ab1498
@metamask-previews/permission-controller@13.1.1-preview-e68ab1498
@metamask-previews/permission-log-controller@5.1.0-preview-e68ab1498
@metamask-previews/perps-controller@12.2.0-preview-e68ab1498
@metamask-previews/phishing-controller@17.4.0-preview-e68ab1498
@metamask-previews/platform-api-docs@0.0.0-preview-e68ab1498
@metamask-previews/polling-controller@16.0.9-preview-e68ab1498
@metamask-previews/preferences-controller@23.1.0-preview-e68ab1498
@metamask-previews/profile-metrics-controller@4.0.3-preview-e68ab1498
@metamask-previews/profile-sync-controller@29.0.0-preview-e68ab1498
@metamask-previews/ramps-controller@20.0.0-preview-e68ab1498
@metamask-previews/rate-limit-controller@7.0.1-preview-e68ab1498
@metamask-previews/react-data-query@1.0.0-preview-e68ab1498
@metamask-previews/remote-feature-flag-controller@6.0.0-preview-e68ab1498
@metamask-previews/sample-controllers@5.0.6-preview-e68ab1498
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-e68ab1498
@metamask-previews/selected-network-controller@26.1.7-preview-e68ab1498
@metamask-previews/sentinel-api-service@1.0.1-preview-e68ab1498
@metamask-previews/shield-controller@6.0.1-preview-e68ab1498
@metamask-previews/signature-controller@39.2.10-preview-e68ab1498
@metamask-previews/smart-transactions-controller@25.1.1-preview-e68ab1498
@metamask-previews/snap-account-service@2.1.2-preview-e68ab1498
@metamask-previews/social-controllers@2.7.2-preview-e68ab1498
@metamask-previews/solana-test-validator-up@1.0.0-preview-e68ab1498
@metamask-previews/stellar-quickstart-up@0.0.0-preview-e68ab1498
@metamask-previews/storage-service@1.0.2-preview-e68ab1498
@metamask-previews/subscription-controller@8.0.1-preview-e68ab1498
@metamask-previews/transaction-controller@69.6.1-preview-e68ab1498
@metamask-previews/transaction-pay-controller@27.0.0-preview-e68ab1498
@metamask-previews/user-operation-controller@41.2.9-preview-e68ab1498
@metamask-previews/wallet@12.0.2-preview-e68ab1498
@metamask-previews/wallet-cli@0.0.0-preview-e68ab1498

return assetIds.filter((assetId) => {
const chainReference = assetId.split(':')[1]?.split('/')[0] ?? '';
const floor = floors[chainReference] ?? DEFAULT_OCCURRENCE_FLOOR;
return (occurrencesByLowerId.get(assetId.toLowerCase()) ?? 0) < floor;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Correction we are using fail closed logic.

If, for whatever reason, the token API has not returned a token, well assume that it is zero and filter it out.

A bit aggressive but this protects us for edge cases where the token API does not have this data.

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