Files
metamask-integration/provider

MetaMask Multi-Chain Provider

Connect MetaMask and other Web3 providers to ChainID 138 (DeFi Oracle Meta Mainnet), Ethereum Mainnet (1), and ALL Mainnet (651940). Includes chain configs, combined token list, and oracle helpers so tokens and price feeds work across chains.

Features

  • Multi-chain: Add and switch between Chain 138, Ethereum Mainnet, and ALL Mainnet in one flow.
  • Token list: All tokens from all three chains (Chain 138: WETH, WETH10, cUSDT, cUSDC, ETH/USD oracle; Mainnet: WETH, USDT, USDC, DAI, ETH/USD oracle; ALL Mainnet: USDC).
  • Oracles: Read ETH/USD from Chain 138 oracle and from Chainlink on Mainnet so dApps can display USD values.

Installation

Use as a local module (no publish required):

# From your app (e.g. metamask-integration/examples/react-example)
npm install ethers   # peer dependency for getEthUsdPrice

Import from the provider path:

import { addChainsToWallet, switchChain, getEthUsdPrice, getTokensByChain } from '../provider/index.js'

Or copy the provider/ folder into your project and import from ./provider.

Quick Start

1. Add both chains to MetaMask

import { addChainsToWallet } from './provider/index.js'

const ethereum = window.ethereum
if (ethereum) {
  const result = await addChainsToWallet(ethereum)
  console.log('Added:', result.added, 'Skipped:', result.skipped, 'Errors:', result.errors)
}

2. Switch chain

import { switchChain, ensureChain } from './provider/index.js'

await switchChain(window.ethereum, 138)   // DeFi Oracle Meta Mainnet
await switchChain(window.ethereum, 1)     // Ethereum Mainnet

// Or ensure current chain (switch if needed, add if missing)
await ensureChain(window.ethereum, 138)

3. Add a token to the wallet

import { addTokenToWallet, getToken, getTokensByChain } from './provider/index.js'

const tokens138 = getTokensByChain(138)
for (const token of tokens138) {
  if (token.tags?.includes('oracle')) continue
  await addTokenToWallet(window.ethereum, token)
}

// Or a single token by address
const weth = getToken(138, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2')
if (weth) await addTokenToWallet(window.ethereum, weth)

4. Read oracle price (ETH/USD)

Requires ethers v6. Works on both Chain 138 and Mainnet.

import { ethers } from 'ethers'
import { getEthUsdPrice } from './provider/index.js'

const provider = new ethers.BrowserProvider(window.ethereum)
const chainId = (await provider.getNetwork()).chainId

const result = await getEthUsdPrice(provider, Number(chainId))
if (result) {
  console.log('ETH/USD:', result.price, 'Updated:', result.updatedAt)
}

API

Export Description
CHAINS, CHAIN_138, CHAIN_MAINNET Chain params for wallet_addEthereumChain
getChainById(chainIdDecimal), getChainByHex(chainIdHex) Look up chain config
addChainsToWallet(ethereum, options?) Add Chain 138 and/or Mainnet
switchChain(ethereum, chainIdDecimal) Switch to chain (adds if missing)
ensureChain(ethereum, chainIdDecimal) Switch to chain if not already on it
addTokenToWallet(ethereum, token) Add token via wallet_watchAsset
TOKEN_LIST, getTokensByChain(chainId), getToken(chainId, address) Token list for both chains
TOKEN_LIST_URL URL/path to host the combined token list JSON
getEthUsdPrice(provider, chainId) Read ETH/USD from oracle (needs ethers)
ORACLES_CHAIN_138, ORACLES_MAINNET, getOracleConfig(chainId) Oracle addresses and config

Config files

  • Networks: docs/04-configuration/metamask/DUAL_CHAIN_NETWORKS.json — both chain params.
  • Token list: docs/04-configuration/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json — tokens for Chain 138 and Mainnet.

Host the token list at a public URL and set your apps token list URL to it so MetaMask can fetch the list (or use the inline TOKEN_LIST / getTokensByChain in your UI).

Downloads

Asset In-repo path Use
Multi-chain networks docs/04-configuration/metamask/DUAL_CHAIN_NETWORKS.json wallet_addEthereumChain params for Chain 138, Ethereum Mainnet, and ALL Mainnet. If bundled: config/DUAL_CHAIN_NETWORKS.json.
Dual-chain token list docs/04-configuration/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json MetaMask token list URL; Uniswap token list format. If bundled: config/DUAL_CHAIN_TOKEN_LIST.tokenlist.json. Hosted: https://explorer.d-bis.org/api/config/token-list (explorer API). TOKEN_LIST_URL in code points to this by default.
Feature parity and recommendations docs/04-configuration/metamask/METAMASK_CHAIN138_FEATURE_PARITY_ANALYSIS.md Plugin/snap requirements, gaps, and build/integration options.
Oracle and pricing docs/04-configuration/metamask/ORACLE_PRICE_FEED_SETUP.md, WETH_ORACLE_QUICK_REFERENCE.md Oracle addresses and Oracle Publisher setup.
Token-aggregation REST API smom-dbis-138/services/token-aggregation/docs/REST_API_REFERENCE.md Tokens, pools, prices, volume, OHLCV for Chain 138 and ALL Mainnet (discovery without CMC/CoinGecko).
Optional next steps docs/04-configuration/metamask/METAMASK_CHAIN138_FEATURE_PARITY_ANALYSIS.md §7, SNAP_IMPLEMENTATION_ROADMAP.md Custom Snap roadmap, CoinGecko submission, Consensys outreach.

Oracles

  • Chain 138: ETH/USD at 0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6 (8 decimals). Keep the Oracle Publisher service running so the feed stays updated.
  • Ethereum Mainnet: Chainlink ETH/USD at 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419.

MetaMask does not read these oracles by default; use getEthUsdPrice(provider, chainId) in your dApp to show USD values.

License

MIT