guide10 min read

Soneium Mainnet RPC for Wallet Builders

Soneium RPC checks for wallets: chain ID 1868 / 0x74c, ETH gas on an OP Stack L2, 2 s blocks, and the public endpoints that passed 8 probes.

By RPC Directory•
#Soneium#ETH#RPC#Wallet#Chain ID#MetaMask#Rabby#EVM#OP Stack
$soneium-mainnet-rpc.md

Soneium is an Ethereum Layer 2 built on the OP Stack, with ETH as the gas token. Blocks arrive every 2 seconds. The JSON-RPC surface is standard Ethereum, with the usual OP Stack additions: an L1 data fee on every transaction and safe and finalized tags that trail latest by minutes. Wallet builders who reuse Ethereum mainnet settings will mostly get it right, but they can mislabel the network, show the wrong fee, or credit a deposit before it is final.

This is not a ranking of providers. Use the Soneium Mainnet hub to compare endpoints and paid rows, then run the checks below on the URL you configure. The Soneium Mainnet providers page lists the keyed options side by side.

Chain ID 1868 is mainnet, 1946 is Minato testnet

  • Soneium mainnet: chain ID 1868, hex 0x74c. eth_chainId returned 0x74c on every URL that answered during our probe, and net_version on rpc.soneium.org returned "1868". Soneium's network information page lists the same chain ID, with Ethereum as the parent chain.
  • Soneium Minato testnet: chain ID 1946, hex 0x79a, with Sepolia as the parent chain, per the same docs page. Both networks use the ETH symbol, so a wallet that shows ETH without the network name can make a testnet balance look like real funds.
  • Ethereum mainnet: chain ID 1. Soneium ETH is bridged ETH on a separate chain. It needs its own network entry.

Wallet-add fields for mainnet, matching Soneium's wallet docs:

  • Network name: Soneium
  • Chain ID: 1868 (or 0x74c if the form wants hex)
  • Currency symbol: ETH
  • RPC URL: a JSON-RPC HTTPS endpoint you have already probed, such as https://rpc.soneium.org
  • Block explorer: https://soneium.blockscout.com

Native gas is ETH with 18 decimals. Call eth_chainId on the exact RPC URL you will ship and expect 0x74c. A gateway that returns 0x79a is Minato. A timeout, an HTML page, an API-key error, or a rate-limit body is not Soneium mainnet for that transport.

Public endpoints that answered eth_chainId

We probed every public Soneium mainnet URL on the hub 8 times, about 55 seconds apart, on 2026-10-13 between 02:13 and 02:19 UTC. Each round called eth_chainId, eth_getBlockByNumber("latest") and eth_getBalance on the WETH predeploy (0x4200000000000000000000000000000000000006), with a curl User-Agent on every request. Hosts ran in parallel, with one request in flight per host. The hub lists 8 HTTPS and 1 WSS transports. These passed all three calls in 8 of 8 rounds. On every one, the latest block's timestamp was within 4 seconds of our clock and at most 2 blocks behind the newest block any endpoint returned in the same round:

EndpointTransportNotes
https://rpc.soneium.orgHTTPSThe endpoint in Soneium's docs, which describe it as rate-limited and meant for end users, not indexers. Head 0.6 to 1.8 s old
https://soneium-mainnet.rpc.sentio.xyzHTTPSHead 0.4 to 1.6 s old
https://rpc.sentio.xyz/soneium-mainnetHTTPSSecond URL for the same provider. Head 0.3 to 1.5 s old
https://rpc.swiftnodes.io/rpc/soneiumHTTPSHead 0.4 to 2.3 s old, never behind the round's newest block
https://1868.rpc.thirdweb.comHTTPSHead 0.8 to 4.0 s old, up to 2 blocks behind the round's newest block

Some rows answered with caveats and stay listed:

  • https://soneium.drpc.org and wss://soneium.drpc.org returned 0x74c in 8 of 8 rounds, but each failed eth_getBlockByNumber and eth_getBalance in 4 of 8 rounds with JSON-RPC -32601 "the method ... does not exist/is not available". The rounds that passed had current heads. Retry on -32601 if you use this URL.
  • https://rpc.nodeflare.app/soneium/public passed eth_chainId and eth_getBalance in 8 of 8 rounds, but eth_getBlockByNumber returned HTTP 429 in all 8, as the third request in quick succession. A single eth_getBlockByNumber sent on its own after the probe returned a block. Treat it as low-rate only.

One row failed every read in all 8 rounds, and the directory now hides it:

  • https://lb.routeme.sh/rpc/evm/1868 returned HTTP 429, JSON-RPC -32029 "public rate limit exceeded", on every eth_getBlockByNumber and eth_getBalance call. eth_chainId returned 0x74c in 3 rounds and the same 429 in the other 5.

A row on a directory page is a starting point, not proof it serves Soneium mainnet today.

Fees: L2 gas plus an L1 data fee

On rpc.soneium.org at about 02:21 UTC:

  • The latest block's baseFeePerGas was 0x13e (318 wei), and eth_feeHistory over 5 blocks showed 316 to 317 wei.
  • eth_gasPrice returned 0xf437e (1,000,318 wei, about 0.001 gwei).
  • eth_maxPriorityFeePerGas returned 0xf4240 (1,000,000 wei). The 50th percentile tip in eth_feeHistory was 100,000 wei in each of the 5 blocks.
  • eth_estimateGas for a plain ETH transfer returned 0x5208 (21,000).
  • The block gas limit was 0x2625a00 (40,000,000), and the 5 blocks used 2 to 7 percent of it.

At that gas price, the L2 part of a plain transfer is 21,000 × 1,000,318 wei, about 0.000000021 ETH. As on other OP Stack chains, every transaction also pays an L1 data fee for posting its data to Ethereum. Receipts carry it in an l1Fee field. One type 2 contract call in the latest block at that moment showed l1Fee 0x2c393b1ec (about 0.0000000119 ETH) next to an L2 fee of about 0.0000021 ETH (414,509 gas at an effective price of 5,000,000 wei).

What that means for a wallet:

  • Show the total, not gas × price. The L1 data fee is not part of eth_estimateGas. Add it from the OP Stack gas price oracle predeploy, or show the receipt's l1Fee after the fact.
  • Do not assume the L1 fee is the big part. In the receipt above it was well under 1% of the fee. It moves with Ethereum blob prices, so read it, do not hardcode it.
  • Small numbers, normal rules. The base fee was a few hundred wei, but EIP-1559 fields work as on Ethereum. Use eth_maxPriorityFeePerGas or eth_feeHistory for the tip.

Finality: latest, safe, finalized

In a single batch request to rpc.soneium.org at 02:20 UTC, safe was 276 blocks behind latest (552 seconds of block time) and finalized was 560 blocks behind (1,120 seconds, about 19 minutes). Across the last 10,000 blocks, timestamps spanned 20,000 seconds, exactly 2 seconds per block. web3_clientVersion returned op-reth/v2.4.3-b60a1a63/x86_64-linux.

The tags follow the OP Stack meaning:

  • latest is the sequencer's newest block. It can still be reorged if the sequencer's view changes before the batch reaches Ethereum.
  • safe is a block whose data has been posted to Ethereum.
  • finalized is a block whose data is in a finalized Ethereum block.

For a wallet, latest is fine for balances on screen. For deposits, "payment received", or anything you credit, wait for safe at least, and for finalized when the amount justifies a wait of about 20 minutes.

Add Soneium to MetaMask or Rabby

These are the values we checked on 2026-10-13, not values copied from a list:

  • eth_chainId returned 0x74c (1868) on every passing URL in the table above.
  • Soneium's docs list Soneium, chain ID 1868, ETH, https://rpc.soneium.org/ and https://soneium.blockscout.com/ as the MetaMask fields.
  • https://soneium.blockscout.com returned HTTP 200 to a request with a browser User-Agent.

MetaMask: follow the MetaMask custom RPC guide. Check 'Additional networks' first. To add it by hand, open 'Networks', choose 'Add a custom network', and enter the five fields from the chain ID section with a URL from the passed table. MetaMask does not verify that a custom network is what it claims to be, so the probe is your check.

Rabby: follow the Rabby custom network guide. Check whether Soneium already appears in Rabby's network list before you add a custom entry. If you add it by hand, enter chain ID 1868 and an RPC URL that returned 0x74c in your own probe.

Dapps: for wallet_addEthereumChain, send chainId: "0x74c", chainName: "Soneium", nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 }, rpcUrls with your probed HTTPS endpoint, and blockExplorerUrls: ["https://soneium.blockscout.com"]. For wallet_switchEthereumChain, send only { chainId: "0x74c" }, and call wallet_addEthereumChain if MetaMask returns error 4902.

Wallet-add gotchas that show up in QA

  1. Minato chain ID 1946 under a "Soneium" label: balances look real but are testnet ETH.
  2. ETH symbol on several networks: show the network name next to the balance, or users mix Soneium ETH with Ethereum ETH.
  3. Fee shown as gas × price only: the L1 data fee is missing from the number.
  4. Credited at latest: wait for safe or finalized before you credit deposits.
  5. No WebSocket in the docs: Soneium's docs list the WS endpoint as not yet available. On the hub, wss://soneium.drpc.org is the only WSS row, and it failed reads in 4 of 8 rounds.
  6. Shared public URLs under load: Soneium's docs say the free endpoints are rate-limited and not for a dApp UI that constantly scrapes data or for an indexer.

Public vs dedicated for wallet traffic

Public endpoints are fine for:

  • Local development and wallet QA
  • Low-volume eth_chainId and 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, fee estimate, send, receipt polls)
  • Need wide eth_getLogs ranges or historical state
  • Depend on WebSocket subscriptions
  • Cannot absorb shared-node rate limits during a launch, airdrop, or market spike

Probe the candidate URL before you call it ready:

  1. eth_chainId returns 0x74c.
  2. The latest block advances when you poll twice 2 seconds apart, and its timestamp is within a few seconds of wall-clock time.
  3. A plain transfer eth_estimateGas returns 0x5208 (21,000).
  4. eth_getBalance on an address you care about returns a value, not a rate-limit or method error.
  5. finalized returns a block a few hundred blocks behind latest, not null or an error.
  6. A burst of 20 to 50 quick requests does not return HTTP 429 or a JSON-RPC rate-limit error at the volume you expect per client.

For production wallet traffic, compare the paid rows on the same hub for method coverage, archive access, and quota. At the time of writing the hub lists Alchemy, Chainstack and DRPC. Dwellir does not list a Soneium endpoint on the hub.

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, and the pricing calculator estimates monthly cost for a given request mix. Log-heavy indexers should also read the eth_getLogs caps guide, and the dead public endpoints guide explains why listed URLs stop answering.

Practical split for a wallet stack

  • User-facing Soneium network row: chain ID 1868 / 0x74c, ETH symbol with the network name shown, Blockscout, an RPC you probed today.
  • Testnet row, if you need it: Minato, chain ID 1946 / 0x79a, a separate config key, never reused as the mainnet RPC.
  • Fee estimation: EIP-1559 fields from the RPC plus the L1 data fee, shown as one total.
  • Confirmations: show latest right away, credit at safe or finalized.
  • Backend / indexer: a dedicated or paid endpoint with the eth_getLogs range you need. Do not share the browser wallet's public URL.

Ship the hub comparison and the probe first. A network called "Soneium" in a dropdown does not replace eth_chainId returning 0x74c.