Skip to content

Conversation

@sahar-fehri
Copy link
Contributor

@sahar-fehri sahar-fehri commented Nov 20, 2025

Explanation

On mobile and extension, when AccountAPI is enabled, the token balances state ended up storing native+stake in a different area from erc-20.

Example:

{
  "tokenBalances": {
    // lowercase address contains ERC-20 token balances
    "0xd5018bd3d94e23e71a2575206a1176d5c8637bec": {
      "0x1": {
        "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48": "0x5337e0",
        "0xacA92E438df0B2401fF60dA7E4337B687a2435DA": "0x286e37",
        // ...
      },
    },
    // CheckSum address contains Native + Staked balances 💀
    "0xd5018bD3d94e23e71A2575206a1176D5c8637BeC": {
      "0x1": {
        "0x0000000000000000000000000000000000000000": "0x445931076e034",
        "0x4FEF9D741011476750A243aC70b9789a63dd47Df": "0x0"
      },
    }
}

Our aggregated balance calculations rely on the lowercase addresses for the token values, so this was why native and staked balances were missing.

The fix normalises the state data so that we merge both fields into the lowercase addresses.

  • Since this is done inside the controller no state migrations are needed 🤞

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

@salimtb
Copy link
Contributor

salimtb commented Nov 21, 2025

@metamaskbot publish-preview

@github-actions
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": "3.0.0-preview-fa19a4d3",
  "@metamask-previews/accounts-controller": "34.0.0-preview-fa19a4d3",
  "@metamask-previews/address-book-controller": "7.0.0-preview-fa19a4d3",
  "@metamask-previews/analytics-controller": "0.0.0-preview-fa19a4d3",
  "@metamask-previews/announcement-controller": "8.0.0-preview-fa19a4d3",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-fa19a4d3",
  "@metamask-previews/approval-controller": "8.0.0-preview-fa19a4d3",
  "@metamask-previews/assets-controllers": "89.0.1-preview-fa19a4d3",
  "@metamask-previews/base-controller": "9.0.0-preview-fa19a4d3",
  "@metamask-previews/bridge-controller": "61.0.0-preview-fa19a4d3",
  "@metamask-previews/bridge-status-controller": "61.0.0-preview-fa19a4d3",
  "@metamask-previews/build-utils": "3.0.4-preview-fa19a4d3",
  "@metamask-previews/chain-agnostic-permission": "1.2.2-preview-fa19a4d3",
  "@metamask-previews/claims-controller": "0.2.0-preview-fa19a4d3",
  "@metamask-previews/composable-controller": "12.0.0-preview-fa19a4d3",
  "@metamask-previews/controller-utils": "11.15.0-preview-fa19a4d3",
  "@metamask-previews/core-backend": "4.1.0-preview-fa19a4d3",
  "@metamask-previews/delegation-controller": "1.0.0-preview-fa19a4d3",
  "@metamask-previews/earn-controller": "10.0.0-preview-fa19a4d3",
  "@metamask-previews/eip-5792-middleware": "2.0.0-preview-fa19a4d3",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-fa19a4d3",
  "@metamask-previews/eip1193-permission-middleware": "1.0.2-preview-fa19a4d3",
  "@metamask-previews/ens-controller": "18.0.0-preview-fa19a4d3",
  "@metamask-previews/error-reporting-service": "3.0.0-preview-fa19a4d3",
  "@metamask-previews/eth-block-tracker": "14.0.0-preview-fa19a4d3",
  "@metamask-previews/eth-json-rpc-middleware": "21.0.0-preview-fa19a4d3",
  "@metamask-previews/eth-json-rpc-provider": "5.0.1-preview-fa19a4d3",
  "@metamask-previews/foundryup": "1.0.1-preview-fa19a4d3",
  "@metamask-previews/gas-fee-controller": "25.0.0-preview-fa19a4d3",
  "@metamask-previews/gator-permissions-controller": "0.5.0-preview-fa19a4d3",
  "@metamask-previews/json-rpc-engine": "10.1.1-preview-fa19a4d3",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-fa19a4d3",
  "@metamask-previews/keyring-controller": "24.0.0-preview-fa19a4d3",
  "@metamask-previews/logging-controller": "7.0.0-preview-fa19a4d3",
  "@metamask-previews/message-manager": "14.0.0-preview-fa19a4d3",
  "@metamask-previews/messenger": "0.3.0-preview-fa19a4d3",
  "@metamask-previews/multichain-account-service": "3.0.0-preview-fa19a4d3",
  "@metamask-previews/multichain-api-middleware": "1.2.4-preview-fa19a4d3",
  "@metamask-previews/multichain-network-controller": "2.0.0-preview-fa19a4d3",
  "@metamask-previews/multichain-transactions-controller": "6.0.0-preview-fa19a4d3",
  "@metamask-previews/name-controller": "9.0.0-preview-fa19a4d3",
  "@metamask-previews/network-controller": "25.0.0-preview-fa19a4d3",
  "@metamask-previews/network-enablement-controller": "3.1.0-preview-fa19a4d3",
  "@metamask-previews/notification-services-controller": "20.0.0-preview-fa19a4d3",
  "@metamask-previews/permission-controller": "12.1.0-preview-fa19a4d3",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-fa19a4d3",
  "@metamask-previews/phishing-controller": "15.0.1-preview-fa19a4d3",
  "@metamask-previews/polling-controller": "15.0.0-preview-fa19a4d3",
  "@metamask-previews/preferences-controller": "21.0.0-preview-fa19a4d3",
  "@metamask-previews/profile-sync-controller": "26.0.0-preview-fa19a4d3",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-fa19a4d3",
  "@metamask-previews/remote-feature-flag-controller": "2.0.0-preview-fa19a4d3",
  "@metamask-previews/sample-controllers": "3.0.0-preview-fa19a4d3",
  "@metamask-previews/seedless-onboarding-controller": "6.1.0-preview-fa19a4d3",
  "@metamask-previews/selected-network-controller": "25.0.0-preview-fa19a4d3",
  "@metamask-previews/shield-controller": "2.1.1-preview-fa19a4d3",
  "@metamask-previews/signature-controller": "36.0.0-preview-fa19a4d3",
  "@metamask-previews/subscription-controller": "4.2.2-preview-fa19a4d3",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-fa19a4d3",
  "@metamask-previews/transaction-controller": "61.3.0-preview-fa19a4d3",
  "@metamask-previews/transaction-pay-controller": "8.0.0-preview-fa19a4d3",
  "@metamask-previews/user-operation-controller": "40.0.0-preview-fa19a4d3"
}

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