Skip to content

feat: replace viem with manual ABI encoding#7839

Merged
salimtb merged 6 commits intomainfrom
remove-viem-dependency-from-assets-controller
Feb 4, 2026
Merged

feat: replace viem with manual ABI encoding#7839
salimtb merged 6 commits intomainfrom
remove-viem-dependency-from-assets-controller

Conversation

@salimtb
Copy link
Contributor

@salimtb salimtb commented Feb 4, 2026

Explanation

The MulticallClient in @metamask/assets-controller previously used viem for ABI encoding and decoding of Multicall3 contract calls. This introduced a heavy dependency (~500KB+ bundled) for functionality that could be implemented with minimal code.

This PR replaces viem with manual ABI encoding/decoding:

  • Added low-level hex manipulation helpers (leftPad32, encodeUint256, encodeAddress, etc.)
  • Implemented manual encoding for balanceOf(address), getEthBalance(address), and aggregate3((address,bool,bytes)[]) function calls
  • Implemented manual decoding for aggregate3 responses ((bool,bytes)[]) and uint256 return values
  • Updated test helpers to also use manual encoding instead of viem

This significantly reduces the package's dependency footprint while maintaining the same functionality.

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 the ABI encoding/decoding used for Multicall3 batching and balance parsing, which can impact token/native balance fetching if calldata or return-data handling differs. Test coverage was updated/expanded, but this still touches core RPC interaction paths.

Overview
Replaces viem with @ethersproject/abi for Multicall3 ABI work. MulticallClient now uses ethers Interface/defaultAbiCoder to encode balanceOf, getEthBalance, and aggregate3, and to decode aggregate3 responses.

Updates uint256 decoding to treat empty/short return data as zero, adjusts tests to build mock responses via ethers encoding, and adds a round-trip test that encodeAggregate3 calldata can be decoded. Removes viem from @metamask/assets-controller dependencies (and lockfile transitive deps) and notes the change in the changelog.

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

@salimtb salimtb marked this pull request as ready for review February 4, 2026 14:59
@salimtb salimtb requested review from a team as code owners February 4, 2026 14:59
@salimtb
Copy link
Contributor Author

salimtb commented Feb 4, 2026

@metamaskbot publish-preview

Copy link

@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.

@github-actions
Copy link
Contributor

github-actions bot commented Feb 4, 2026

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": "4.0.0-preview-ce3ee897a",
  "@metamask-previews/accounts-controller": "35.0.2-preview-ce3ee897a",
  "@metamask-previews/address-book-controller": "7.0.1-preview-ce3ee897a",
  "@metamask-previews/ai-controllers": "0.0.0-preview-ce3ee897a",
  "@metamask-previews/analytics-controller": "1.0.0-preview-ce3ee897a",
  "@metamask-previews/analytics-data-regulation-controller": "0.0.0-preview-ce3ee897a",
  "@metamask-previews/announcement-controller": "8.0.0-preview-ce3ee897a",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-ce3ee897a",
  "@metamask-previews/approval-controller": "8.0.0-preview-ce3ee897a",
  "@metamask-previews/assets-controller": "0.1.0-preview-ce3ee897a",
  "@metamask-previews/assets-controllers": "99.2.0-preview-ce3ee897a",
  "@metamask-previews/base-controller": "9.0.0-preview-ce3ee897a",
  "@metamask-previews/bridge-controller": "65.2.0-preview-ce3ee897a",
  "@metamask-previews/bridge-status-controller": "65.0.1-preview-ce3ee897a",
  "@metamask-previews/build-utils": "3.0.4-preview-ce3ee897a",
  "@metamask-previews/chain-agnostic-permission": "1.4.0-preview-ce3ee897a",
  "@metamask-previews/claims-controller": "0.4.2-preview-ce3ee897a",
  "@metamask-previews/composable-controller": "12.0.0-preview-ce3ee897a",
  "@metamask-previews/connectivity-controller": "0.1.0-preview-ce3ee897a",
  "@metamask-previews/controller-utils": "11.18.0-preview-ce3ee897a",
  "@metamask-previews/core-backend": "5.1.0-preview-ce3ee897a",
  "@metamask-previews/delegation-controller": "2.0.0-preview-ce3ee897a",
  "@metamask-previews/earn-controller": "11.1.0-preview-ce3ee897a",
  "@metamask-previews/eip-5792-middleware": "2.1.0-preview-ce3ee897a",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-ce3ee897a",
  "@metamask-previews/eip1193-permission-middleware": "1.0.3-preview-ce3ee897a",
  "@metamask-previews/ens-controller": "19.0.2-preview-ce3ee897a",
  "@metamask-previews/error-reporting-service": "3.0.1-preview-ce3ee897a",
  "@metamask-previews/eth-block-tracker": "15.0.1-preview-ce3ee897a",
  "@metamask-previews/eth-json-rpc-middleware": "23.1.0-preview-ce3ee897a",
  "@metamask-previews/eth-json-rpc-provider": "6.0.0-preview-ce3ee897a",
  "@metamask-previews/foundryup": "1.0.1-preview-ce3ee897a",
  "@metamask-previews/gas-fee-controller": "26.0.2-preview-ce3ee897a",
  "@metamask-previews/gator-permissions-controller": "1.1.2-preview-ce3ee897a",
  "@metamask-previews/json-rpc-engine": "10.2.1-preview-ce3ee897a",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-ce3ee897a",
  "@metamask-previews/keyring-controller": "25.1.0-preview-ce3ee897a",
  "@metamask-previews/logging-controller": "7.0.1-preview-ce3ee897a",
  "@metamask-previews/message-manager": "14.1.0-preview-ce3ee897a",
  "@metamask-previews/messenger": "0.3.0-preview-ce3ee897a",
  "@metamask-previews/multichain-account-service": "5.1.0-preview-ce3ee897a",
  "@metamask-previews/multichain-api-middleware": "1.2.6-preview-ce3ee897a",
  "@metamask-previews/multichain-network-controller": "3.0.2-preview-ce3ee897a",
  "@metamask-previews/multichain-transactions-controller": "7.0.0-preview-ce3ee897a",
  "@metamask-previews/name-controller": "9.0.0-preview-ce3ee897a",
  "@metamask-previews/network-controller": "29.0.0-preview-ce3ee897a",
  "@metamask-previews/network-enablement-controller": "4.1.0-preview-ce3ee897a",
  "@metamask-previews/notification-services-controller": "21.0.0-preview-ce3ee897a",
  "@metamask-previews/permission-controller": "12.2.0-preview-ce3ee897a",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-ce3ee897a",
  "@metamask-previews/perps-controller": "0.0.0-preview-ce3ee897a",
  "@metamask-previews/phishing-controller": "16.1.0-preview-ce3ee897a",
  "@metamask-previews/polling-controller": "16.0.2-preview-ce3ee897a",
  "@metamask-previews/preferences-controller": "22.1.0-preview-ce3ee897a",
  "@metamask-previews/profile-metrics-controller": "3.0.0-preview-ce3ee897a",
  "@metamask-previews/profile-sync-controller": "27.0.0-preview-ce3ee897a",
  "@metamask-previews/ramps-controller": "6.0.0-preview-ce3ee897a",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-ce3ee897a",
  "@metamask-previews/remote-feature-flag-controller": "4.0.0-preview-ce3ee897a",
  "@metamask-previews/sample-controllers": "4.0.2-preview-ce3ee897a",
  "@metamask-previews/seedless-onboarding-controller": "7.1.0-preview-ce3ee897a",
  "@metamask-previews/selected-network-controller": "26.0.2-preview-ce3ee897a",
  "@metamask-previews/shield-controller": "5.0.1-preview-ce3ee897a",
  "@metamask-previews/signature-controller": "39.0.1-preview-ce3ee897a",
  "@metamask-previews/storage-service": "1.0.0-preview-ce3ee897a",
  "@metamask-previews/subscription-controller": "5.4.2-preview-ce3ee897a",
  "@metamask-previews/transaction-controller": "62.14.0-preview-ce3ee897a",
  "@metamask-previews/transaction-pay-controller": "12.1.0-preview-ce3ee897a",
  "@metamask-previews/user-operation-controller": "41.0.2-preview-ce3ee897a"
}

@salimtb
Copy link
Contributor Author

salimtb commented Feb 4, 2026

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

github-actions bot commented Feb 4, 2026

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": "4.0.0-preview-ae46ab603",
  "@metamask-previews/accounts-controller": "35.0.2-preview-ae46ab603",
  "@metamask-previews/address-book-controller": "7.0.1-preview-ae46ab603",
  "@metamask-previews/ai-controllers": "0.0.0-preview-ae46ab603",
  "@metamask-previews/analytics-controller": "1.0.0-preview-ae46ab603",
  "@metamask-previews/analytics-data-regulation-controller": "0.0.0-preview-ae46ab603",
  "@metamask-previews/announcement-controller": "8.0.0-preview-ae46ab603",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-ae46ab603",
  "@metamask-previews/approval-controller": "8.0.0-preview-ae46ab603",
  "@metamask-previews/assets-controller": "0.1.0-preview-ae46ab603",
  "@metamask-previews/assets-controllers": "99.2.0-preview-ae46ab603",
  "@metamask-previews/base-controller": "9.0.0-preview-ae46ab603",
  "@metamask-previews/bridge-controller": "65.2.0-preview-ae46ab603",
  "@metamask-previews/bridge-status-controller": "65.0.1-preview-ae46ab603",
  "@metamask-previews/build-utils": "3.0.4-preview-ae46ab603",
  "@metamask-previews/chain-agnostic-permission": "1.4.0-preview-ae46ab603",
  "@metamask-previews/claims-controller": "0.4.2-preview-ae46ab603",
  "@metamask-previews/composable-controller": "12.0.0-preview-ae46ab603",
  "@metamask-previews/connectivity-controller": "0.1.0-preview-ae46ab603",
  "@metamask-previews/controller-utils": "11.18.0-preview-ae46ab603",
  "@metamask-previews/core-backend": "5.1.0-preview-ae46ab603",
  "@metamask-previews/delegation-controller": "2.0.0-preview-ae46ab603",
  "@metamask-previews/earn-controller": "11.1.0-preview-ae46ab603",
  "@metamask-previews/eip-5792-middleware": "2.1.0-preview-ae46ab603",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-ae46ab603",
  "@metamask-previews/eip1193-permission-middleware": "1.0.3-preview-ae46ab603",
  "@metamask-previews/ens-controller": "19.0.2-preview-ae46ab603",
  "@metamask-previews/error-reporting-service": "3.0.1-preview-ae46ab603",
  "@metamask-previews/eth-block-tracker": "15.0.1-preview-ae46ab603",
  "@metamask-previews/eth-json-rpc-middleware": "23.1.0-preview-ae46ab603",
  "@metamask-previews/eth-json-rpc-provider": "6.0.0-preview-ae46ab603",
  "@metamask-previews/foundryup": "1.0.1-preview-ae46ab603",
  "@metamask-previews/gas-fee-controller": "26.0.2-preview-ae46ab603",
  "@metamask-previews/gator-permissions-controller": "1.1.2-preview-ae46ab603",
  "@metamask-previews/json-rpc-engine": "10.2.1-preview-ae46ab603",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-ae46ab603",
  "@metamask-previews/keyring-controller": "25.1.0-preview-ae46ab603",
  "@metamask-previews/logging-controller": "7.0.1-preview-ae46ab603",
  "@metamask-previews/message-manager": "14.1.0-preview-ae46ab603",
  "@metamask-previews/messenger": "0.3.0-preview-ae46ab603",
  "@metamask-previews/multichain-account-service": "5.1.0-preview-ae46ab603",
  "@metamask-previews/multichain-api-middleware": "1.2.6-preview-ae46ab603",
  "@metamask-previews/multichain-network-controller": "3.0.2-preview-ae46ab603",
  "@metamask-previews/multichain-transactions-controller": "7.0.0-preview-ae46ab603",
  "@metamask-previews/name-controller": "9.0.0-preview-ae46ab603",
  "@metamask-previews/network-controller": "29.0.0-preview-ae46ab603",
  "@metamask-previews/network-enablement-controller": "4.1.0-preview-ae46ab603",
  "@metamask-previews/notification-services-controller": "21.0.0-preview-ae46ab603",
  "@metamask-previews/permission-controller": "12.2.0-preview-ae46ab603",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-ae46ab603",
  "@metamask-previews/perps-controller": "0.0.0-preview-ae46ab603",
  "@metamask-previews/phishing-controller": "16.1.0-preview-ae46ab603",
  "@metamask-previews/polling-controller": "16.0.2-preview-ae46ab603",
  "@metamask-previews/preferences-controller": "22.1.0-preview-ae46ab603",
  "@metamask-previews/profile-metrics-controller": "3.0.0-preview-ae46ab603",
  "@metamask-previews/profile-sync-controller": "27.0.0-preview-ae46ab603",
  "@metamask-previews/ramps-controller": "6.0.0-preview-ae46ab603",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-ae46ab603",
  "@metamask-previews/remote-feature-flag-controller": "4.0.0-preview-ae46ab603",
  "@metamask-previews/sample-controllers": "4.0.2-preview-ae46ab603",
  "@metamask-previews/seedless-onboarding-controller": "7.1.0-preview-ae46ab603",
  "@metamask-previews/selected-network-controller": "26.0.2-preview-ae46ab603",
  "@metamask-previews/shield-controller": "5.0.1-preview-ae46ab603",
  "@metamask-previews/signature-controller": "39.0.1-preview-ae46ab603",
  "@metamask-previews/storage-service": "1.0.0-preview-ae46ab603",
  "@metamask-previews/subscription-controller": "5.4.2-preview-ae46ab603",
  "@metamask-previews/transaction-controller": "62.14.0-preview-ae46ab603",
  "@metamask-previews/transaction-pay-controller": "12.1.0-preview-ae46ab603",
  "@metamask-previews/user-operation-controller": "41.0.2-preview-ae46ab603"
}

Copy link
Contributor

@Kriys94 Kriys94 left a comment

Choose a reason for hiding this comment

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

LGTM

@salimtb salimtb added this pull request to the merge queue Feb 4, 2026
Merged via the queue into main with commit 281cb40 Feb 4, 2026
302 checks passed
@salimtb salimtb deleted the remove-viem-dependency-from-assets-controller branch February 4, 2026 16:18
- Add batch utilities (`divideIntoBatches`, `reduceInBatchesSerially`) for processing arrays in batches ([#7677](https://github.com/MetaMask/core/pull/7677))
- Add `TokenDetector` service for detecting ERC-20 tokens with non-zero balances on a chain ([#7683](https://github.com/MetaMask/core/pull/7683))
- Add `BalanceFetcher` service for fetching token balances for user's imported/detected tokens ([#7684](https://github.com/MetaMask/core/pull/7684))
- Add `viem` dependency for ABI encoding/decoding in MulticallClient
Copy link
Contributor

Choose a reason for hiding this comment

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

Why did we remove this changelog entry if this version is already released ?

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