Skip to main content
Arc is EVM-compatible, so the standard Ethereum libraries work against an Arc node without modification. The differences are in the chain configuration rather than in the code.

Chain configuration

Arc Mainnet and Arc Testnet differ only in the chain ID. Every other value below is the same on both networks.
Arc pays gas in USDC, but the native currency carries 18 decimals, not the 6 that the USDC ERC-20 token uses. Balances are wei-denominated exactly as on Ethereum, so formatEther and from_wei(..., "ether") are the correct helpers. Treating the gas balance as 6-decimal USDC puts you out by a factor of 1012.
See Arc methods for per-method availability and the API reference for interactive examples.

MetaMask

Add Arc as a custom network. On Chainstack, get your Arc endpoint, then in MetaMask select Add a custom network and fill in:
  • Network name — Arc Mainnet or Arc Testnet
  • Default RPC URL — your Chainstack Arc endpoint
  • Chain ID — 5042 for mainnet, 5042002 for testnet
  • Currency symbol — USDC
The block explorer field is optional in MetaMask. For Arc Mainnet, use explorer.arc.io. For Arc Testnet, use explorer.testnet.arc.io.

ethers.js

Install ethers.js:
Arc’s custom methods have no ethers helper, so call them with send:

viem

Arc is not in viem’s bundled chain list, so define it with defineChain:
For the arc_* methods, use client.request:

web3.py

Install web3.py:
web3.py rejects lowercase addresses with InvalidAddress. Wrap any address you did not get from the library itself in Web3.to_checksum_address(), as above.
The arc_* methods are not in the web3.eth namespace, so send them through the provider:

Two Arc behaviors that affect tooling

Only replay-protected transactions are accepted. Arc rejects pre-EIP-155 transactions on the RPC submission path with -32000 only replay-protected (EIP-155) transactions allowed over RPC. Every current library signs with the chain ID by default, so this only bites if you construct raw transactions by hand or use a very old signer. Pending state is not readable. Subscribing to pending transactions fails, and eth_getBlockByNumber("pending") returns null rather than an error. Code that polls the pending block to estimate the next state will silently receive nothing. See What gives you mempool access.
Last modified on September 16, 2026