Skip to content

Conversation

sahar-fehri
Copy link
Contributor

@sahar-fehri sahar-fehri commented Oct 14, 2025

Explanation

When we first call the function addTokens with an array of tokens to import, and then call it again with the exact same token, we notice that state.allTokens is updated with duplicate entries of the same token.

state.allTokens are stored in checksum format.
When initially state already has USDC token for a user address; and a call to addTokens is made with a lowercase USDC address. The newTokensMap in this line

is computed without checking if the value already exists in state.

The fix converts the tokensToImport received in the call to the checksum format.

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, highlighting breaking changes as necessary
  • I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes

Note

Normalize token addresses to checksum in TokensController.addTokens to dedupe and avoid duplicate entries when the same token is added multiple times.

  • Assets Controllers:
    • TokensController: Normalize tokensToImport addresses to checksum and use checksummed list for deduping/updates in addTokens, preventing duplicate entries in state.allTokens.
  • Tests:
    • Add unit test ensuring duplicate tokens are not re-added when the same token is imported twice (case-insensitive).
  • Changelog:
    • Add Unreleased fix entry documenting duplicate token prevention in state.allTokens.

Written by Cursor Bugbot for commit 6df8521. This will update automatically on new commits. Configure here.

);
});

it('should not add duplicate tokens to state', async () => {
Copy link
Contributor Author

@sahar-fehri sahar-fehri Oct 14, 2025

Choose a reason for hiding this comment

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

This test fails on main and state.allTokens ends up with duplicate entries of the same token

@sahar-fehri
Copy link
Contributor Author

@metamaskbot publish-preview

Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "1.4.2-preview-6df8521",
  "@metamask-previews/accounts-controller": "33.1.1-preview-6df8521",
  "@metamask-previews/address-book-controller": "6.2.0-preview-6df8521",
  "@metamask-previews/announcement-controller": "7.1.0-preview-6df8521",
  "@metamask-previews/app-metadata-controller": "1.1.0-preview-6df8521",
  "@metamask-previews/approval-controller": "7.2.0-preview-6df8521",
  "@metamask-previews/assets-controllers": "80.0.0-preview-6df8521",
  "@metamask-previews/base-controller": "8.4.1-preview-6df8521",
  "@metamask-previews/bridge-controller": "51.0.0-preview-6df8521",
  "@metamask-previews/bridge-status-controller": "50.1.0-preview-6df8521",
  "@metamask-previews/build-utils": "3.0.4-preview-6df8521",
  "@metamask-previews/chain-agnostic-permission": "1.2.0-preview-6df8521",
  "@metamask-previews/composable-controller": "11.1.0-preview-6df8521",
  "@metamask-previews/controller-utils": "11.14.1-preview-6df8521",
  "@metamask-previews/core-backend": "1.0.1-preview-6df8521",
  "@metamask-previews/delegation-controller": "0.8.0-preview-6df8521",
  "@metamask-previews/earn-controller": "8.0.1-preview-6df8521",
  "@metamask-previews/eip-5792-middleware": "1.2.2-preview-6df8521",
  "@metamask-previews/eip1193-permission-middleware": "1.0.1-preview-6df8521",
  "@metamask-previews/ens-controller": "17.1.0-preview-6df8521",
  "@metamask-previews/error-reporting-service": "2.2.1-preview-6df8521",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-6df8521",
  "@metamask-previews/foundryup": "1.0.1-preview-6df8521",
  "@metamask-previews/gas-fee-controller": "24.1.0-preview-6df8521",
  "@metamask-previews/gator-permissions-controller": "0.2.1-preview-6df8521",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-6df8521",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-6df8521",
  "@metamask-previews/keyring-controller": "23.1.1-preview-6df8521",
  "@metamask-previews/logging-controller": "6.1.0-preview-6df8521",
  "@metamask-previews/message-manager": "13.0.1-preview-6df8521",
  "@metamask-previews/messenger": "0.3.0-preview-6df8521",
  "@metamask-previews/multichain-account-service": "1.6.1-preview-6df8521",
  "@metamask-previews/multichain-api-middleware": "1.2.1-preview-6df8521",
  "@metamask-previews/multichain-network-controller": "1.0.1-preview-6df8521",
  "@metamask-previews/multichain-transactions-controller": "5.1.0-preview-6df8521",
  "@metamask-previews/name-controller": "8.1.0-preview-6df8521",
  "@metamask-previews/network-controller": "24.2.1-preview-6df8521",
  "@metamask-previews/network-enablement-controller": "2.1.1-preview-6df8521",
  "@metamask-previews/notification-services-controller": "18.3.0-preview-6df8521",
  "@metamask-previews/permission-controller": "11.1.0-preview-6df8521",
  "@metamask-previews/permission-log-controller": "4.1.0-preview-6df8521",
  "@metamask-previews/phishing-controller": "14.1.2-preview-6df8521",
  "@metamask-previews/polling-controller": "14.0.1-preview-6df8521",
  "@metamask-previews/preferences-controller": "20.0.2-preview-6df8521",
  "@metamask-previews/profile-sync-controller": "25.1.1-preview-6df8521",
  "@metamask-previews/rate-limit-controller": "6.1.0-preview-6df8521",
  "@metamask-previews/remote-feature-flag-controller": "1.8.0-preview-6df8521",
  "@metamask-previews/sample-controllers": "2.0.1-preview-6df8521",
  "@metamask-previews/seedless-onboarding-controller": "4.1.0-preview-6df8521",
  "@metamask-previews/selected-network-controller": "24.0.1-preview-6df8521",
  "@metamask-previews/shield-controller": "0.3.2-preview-6df8521",
  "@metamask-previews/signature-controller": "34.0.1-preview-6df8521",
  "@metamask-previews/subscription-controller": "1.0.1-preview-6df8521",
  "@metamask-previews/token-search-discovery-controller": "3.4.0-preview-6df8521",
  "@metamask-previews/transaction-controller": "60.6.1-preview-6df8521",
  "@metamask-previews/user-operation-controller": "39.1.0-preview-6df8521"
}

@sahar-fehri sahar-fehri marked this pull request as ready for review October 14, 2025 13:41
@sahar-fehri sahar-fehri requested review from a team as code owners October 14, 2025 13:41
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