guide6 min read

Ethereum Mainnet RPC for Wallet Builders

What to check before a wallet points at Ethereum mainnet: chain ID 1 / 0x1, Sepolia and Hoodi mix-ups, L2 RPC paste mistakes, and public vs dedicated endpoints.

By RPC Directory•
#Ethereum#ETH#RPC#Wallet#Chain ID#Mainnet
$ethereum-mainnet-rpc.md

Ethereum mainnet is chain ID 1, hex 0x1, with native ETH (18 decimals) and explorer etherscan.io. Wallet builders who paste Sepolia or Hoodi IDs, or point an L2 RPC at an Ethereum mainnet network row, will ship the wrong network, the wrong explorer, or a funds bug. Before you wire MetaMask, Rabby, Rainbow, Phantom, or your own wallet_addEthereumChain flow, prove chain ID 1 and probe the URL you intend to ship.

This is not a ranking of providers. Use the Ethereum Mainnet hub to compare endpoints and paid rows, then run the checks below on the URL you configure.

Wallet-add fields for Ethereum mainnet

Wallet-add fields for mainnet:

  • Network name: Ethereum Mainnet (or Ethereum if the product already scopes the list)
  • Chain ID: 1 (or 0x1 if the form wants hex)
  • Currency symbol: ETH
  • RPC URL: a JSON-RPC HTTPS endpoint you have already probed
  • Block explorer: https://etherscan.io

Native gas is ETH with 18 decimals. Call eth_chainId on the exact RPC URL you will ship. Expect 0x1. Do this after any load balancer or fallback so you are not checking a different backend than production.

Not Sepolia, not Hoodi, not an L2

Mainnet chain ID is 1 / 0x1. Those are different networks from every common paste mistake:

  • Sepolia testnet is 11155111 / 0xaa36a7 (application-development testnet)
  • Hoodi testnet is 560048 / 0x88bb0 (validator and protocol testing)
  • Holesky (17000) is deprecated / historical; treat a Holesky ID paste as a sunset-network mistake, not an active testnet row
  • Base is 8453, Optimism is 10, Arbitrum One is 42161

A wallet that already has Base, Optimism, or Arbitrum added still needs a separate Ethereum mainnet network entry. A gateway that returns Sepolia, Hoodi, or an L2 chain ID, times out, or answers HTML is not Ethereum mainnet for that transport. eth_chainId must return 0x1 on the URL you ship.

Hard-coded contract addresses from an L2 or a testnet do not belong on a chain ID 1 path. USDC, WETH, and app deployments differ by chain ID. Copying a Base or Sepolia address into an Ethereum mainnet wallet path is a funds bug.

MetaMask, Rabby, and Rainbow expectations

When you implement wallet_addEthereumChain, send a full EIP-3085 payload: chainId: "0x1", a complete nativeCurrency object ({ name: "Ether", symbol: "ETH", decimals: 18 }), rpcUrls pointing at your probed HTTPS endpoint, and blockExplorerUrls: ["https://etherscan.io"]. Wallets that receive only symbol on add can reject the request.

For wallet_switchEthereumChain, send only { chainId: "0x1" }. Metadata fields belong on add, not switch. Prefer one primary RPC in the wallet payload; put failover in your own client, not as five public URLs the wallet may pick at random.

Wallet-add gotchas that show up in QA

Directory /add traffic and support tickets show the same config failures again and again:

  1. Wrong chain ID - Sepolia 11155111, Hoodi 560048, a leftover Holesky 17000, or an L2 ID pasted into a mainnet form.
  2. L2 or testnet RPC on an Ethereum mainnet row - eth_chainId will not return 0x1.
  3. Explorer mismatch - pointing users at a Sepolia explorer, Basescan, or another L2 explorer for mainnet tx hashes.
  4. One shared "ethereum" RPC bucket in app config - separate keys for ethereum, sepolia, and hoodi so a fallback cannot silently swap networks. Keep any Holesky key only as historical / deprecated config, not as an active testnet path.
  5. Public URL baked into the release binary - fine for a docs example, poor as the only production path for balance, nonce, send, and receipt polls.
  6. Incomplete EIP-3085 nativeCurrency - MetaMask, Rabby, and Rainbow expect the full object on add, not a bare symbol string.

Prove the payload against the same RPC URL your release will use.

Public vs dedicated for wallet traffic

Public endpoints are fine for:

  • Local development and wallet QA
  • Low-volume eth_chainId / eth_blockNumber probes
  • One-off scripts and docs examples

They are a poor primary path when you:

  • Run production wallet RPC for many users (balance, nonce, send, receipt polls)
  • Need predictable latency and a support channel when the gateway 429s
  • Depend on historical state, wide eth_getLogs, or sustained WebSocket traffic
  • Cannot absorb shared-node brownouts during a mint, airdrop, or market spike

Probe the candidate URL before you call it ready:

  1. eth_chainId returns 0x1.
  2. The latest block or head advances when you poll twice a few seconds apart. Do not use an unchanged account balance as proof the node is live.
  3. One balance or receipt read against a known Ethereum mainnet address (not a Sepolia, Hoodi, or L2 address).
  4. If you need push updates, a WebSocket path that survives a disconnect (many public sockets do not).
  5. Optional: compare safe / finalized block tags if your confirmation policy depends on them, and document which tag "confirmed" means next to the RPC URL.

Public rows on the hub are shared and rate-limited. Use them for the probe. For production wallet traffic, compare the paid rows on the same hub for method coverage, archive or historical access if you need it, and quota. Dwellir is one of those rows: a flat response-credit model that is easier to budget when the mix of reads and writes is not stable. It is not the only option. A cheaper URL that fails the probe above is not a savings. The public vs paid guide covers when a shared endpoint stops being enough. The pricing calculator is there for the rest. Log-heavy indexers should also read the eth_getLogs caps guide and the eth_getLogs range limits note before assuming a wide filter will pass on every URL.

Practical split for a wallet stack

  • User-facing Ethereum network row - chain ID 1 / 0x1, ETH symbol, Etherscan, RPC you probed today.
  • Testnet rows - Sepolia 11155111 (app development) and Hoodi 560048 (validator / protocol), separate config keys, never reused as the mainnet RPC. Treat Holesky as historical only.
  • Backend / indexer - dedicated or paid endpoint with explicit method and archive needs; do not share the browser wallet's public URL.
  • Receipt policy - decide whether "confirmed" means latest, safe, or finalized on Ethereum mainnet, and store that next to the RPC URL.

Ship the hub comparison and the probe first. Marketing copy about "Ethereum RPC" does not replace eth_chainId returning 0x1.