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 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.
Arc is testnet only — Circle has not launched a mainnet. See Arc methods for per-method availability and the API reference for interactive examples.

MetaMask

Add Arc Testnet as a custom network. On Chainstack, get your Arc endpoint, then in MetaMask select Add a custom network and fill in:
  • Network name — Arc Testnet
  • Default RPC URL — your Chainstack Arc endpoint
  • Chain ID — 5042002
  • Currency symbol — USDC
Leave the block explorer field empty. Arc Testnet has no public explorer yet, and MetaMask treats that field as optional.

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 August 3, 2026