Skip to content

Conversation

@salimtb
Copy link
Contributor

@salimtb salimtb commented Nov 2, 2025

Explanation

What is the current state and why does it need to change?

Currently, there is no centralized way to resolve SLIP-44 coin types from EVM chain IDs. SLIP-44 coin types are essential for generating CAIP-19 asset identifiers, which are used for representing native currencies across different blockchains in a standardized format.

What is the solution and how does it work?

This PR introduces a new ChainService module that provides two main functions:

  1. getSlip44ByChainId(chainId: number): Resolves the SLIP-44 coin type for a given EVM chain ID

    • Fetches chain metadata from chainid.network (with 30-minute caching)
    • Matches native currency symbols to SLIP-44 coin types using:
      • The official @metamask/slip44 dataset
      • A fallback map (COMMON_SYMBOL_DEFAULTS) for popular chains
    • Implements in-flight request deduplication to prevent duplicate fetches
    • Defaults to ETH coin type (60) for L2s and unknown chains
  2. getNativeCaip19(chainId: number): Generates CAIP-19 asset identifiers for native currencies

    • Combines chain ID with resolved SLIP-44 coin type
    • Returns format: eip155:{chainId}/slip44:{coinType}

Key implementation details:

  • Symbol-based matching: Uses native currency symbols (ETH, BNB, MATIC, etc.) to determine coin types
  • Caching: 30-minute cache for chainid.network data to reduce network requests
  • Deduplication: Concurrent requests share the same in-flight promise
  • Graceful fallbacks: Returns ETH coin type for L2s/unknown chains, null on errors
  • Type safety: Proper TypeScript types with comprehensive JSDoc

References

  • Part of ongoing work to support CAIP standards across MetaMask
  • Related to multichain asset identification

Checklist

  • I've updated the test suite for new or updated code as appropriate
    • Added 21 comprehensive unit tests with 100% line and statement coverage
    • Tests cover caching, deduplication, symbol matching, error handling, and edge cases
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
    • All exported functions have complete JSDoc with @param and @returns
    • Internal functions documented with descriptive comments
  • I've communicated my changes to consumers by updating changelogs for packages I've changed, highlighting breaking changes as necessary
    • Updated CHANGELOG.md with detailed description of new functionality
  • I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes
    • N/A - No breaking changes, this is a new additive feature

@socket-security
Copy link

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updated@​metamask/​slip44@​4.2.0 ⏵ 4.3.0100 +110099 +185 +1100

View full report

@salimtb
Copy link
Contributor Author

salimtb commented Nov 3, 2025

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

github-actions bot commented Nov 3, 2025

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

@salimtb salimtb closed this Nov 6, 2025
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