Network facts
| Chain ID | 5042002 (eth_chainId → 0x4cef52) |
| RPC | https://rpc.testnet.arc.io |
| Explorer | testnet.arcscan.app |
| Faucet | faucet.circle.com |
| Gas price observed | 21 Gwei (protocol floor 20, ceiling 20,000) |
| Base fee target | ~$0.01 per transaction, EIP-1559 + EWMA smoothing |
| Throughput | 30M gas/block, ~0.5 s blocks |
eth_getLogs range cap | Differs per endpoint, none documented: 30,000 on rpc.testnet.arc.io, 10,000 on the dRPC mirror, 50,000+ on Blockdaemon. The default endpoint reports a 100,000 limit it does not enforce. |
| Rate limiting | Cloudflare fronts the RPC and returns 429 on bursts, even at concurrency 4 |
| Mainnet | Announced for 16 September 2026; testnet only today |
The decimal trap
This is the single most dangerous thing about building on Arc.
Native USDC and the ERC-20 USDC interface are one balance with two views:
| Interface | Address | Decimals | Used for |
|---|---|---|---|
| Native | — | 18 | Gas accounting, native sends, msg.value, address.balance |
| ERC-20 | 0x3600…0000 | 6 | transfer, approve, allowance, balanceOf |
Verified on chain: decimals() → 6, symbol() → USDC.
USDC.balanceOf(a)anda.balancedescribe the same money at different scales. Mixing them raw is a 1012 error.- The 6-decimal view truncates. A native balance of
0.0000001USDC reads as0— sobalanceOf(x) == 0does not mean the account is empty. - No WETH-style wrapper is needed: native USDC already satisfies
IERC20. - Solidity's
etherunit is just1e18, which on Arc means 1 USDC.
Protocol divergences from Ethereum
Compared against Ethereum at the Osaka hard fork, Arc's baseline.
| Behaviour | Ethereum | Arc |
|---|---|---|
PREVRANDAO / block.difficulty | RANDAO mix | Always 0 — no onchain randomness |
SELFDESTRUCT | EIP-6780 | EIP-6780 + native value rules; emits a Transfer log |
Value CALL to a destructed account | Succeeds | Reverts (forbidden burn) |
Native transfer to address(0) | Succeeds | Reverts — USDC cannot be burned this way |
| EIP-4788 beacon roots | Functional | Contract omitted; reads return 0x |
| Blob txs (EIP-4844) | Supported | Rejected; BLOBHASH→0, BLOBBASEFEE→1 |
| EIP-2935 block-hash history | Functional | Functional — unlike 4788 |
EIP-7708 native Transfer logs | Not yet | Shipped ahead of upstream |
anvil and hardhat node run a stock EVM. The native-coin
precompiles, EIP-7708 Transfer events, and USDC blocklist enforcement
only surface against a real Arc RPC.
Two event streams for one movement
Both emitters use topic0 0xddf252ad…3b3ef, so filtering by topic alone
picks up both. Measured over 150 recent blocks: 1,589 native logs and 1,073 ERC-20
logs for 1,589 real movements.
Rules the native emitter follows, all confirmed on chain:
- The native log is emitted first, before other logs in the transaction.
- Zero-value transfers emit no log.
- Self-transfers (
from == to) emit no log — but the ERC-20 contract still emits one, per the token standard. Seven appeared in a 150-block window. - Mint is
Transfer(0x0, to, v); burn isTransfer(from, 0x0, v). - Gas fees are not logged, so replaying logs under-counts a fee payer's outflow. That residual is the expected signature of a correct index.
Before the Zero5 hard fork, testnet emitted NativeCoin* events from
0x1800…0000 instead. Backfills crossing that boundary need both shapes.
Contract addresses
Arc Testnet. All verified deployed.
| Contract | Address |
|---|---|
| USDC (ERC-20 view) | 0x3600000000000000000000000000000000000000 |
| Native system emitter (EIP-7708) | 0xfffffffffffffffffffffffffffffffffffffffe |
| EURC | 0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a |
| USYC | 0xe9185F0c5F296Ed1797AaE4238D26CCaBEadb86C |
| CCTP TokenMessengerV2 (domain 26) | 0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA |
| Gateway Wallet | 0x0077777d7EBA4688BDeF3E311b846F25870A19B9 |
| StableFX FxEscrow | 0xd68256f4D69C6BbEcB873D8588AE0Dc6B8E22E10 |
| Memo | 0x5294E9927c3306DcBaDb03fe70b92e01cCede505 |
| Multicall3From | 0x522fAf9A91c41c443c66765030741e4AaCe147D0 |
| ERC-8004 IdentityRegistry | 0x8004A818BFB912233c491871b3d84c89A494BD9e |
| ERC-8004 ReputationRegistry | 0x8004B663056A597Dffe9eCcC1965A193B7388713 |
| ERC-8004 ValidationRegistry | 0x8004Cb1BF31DAf7788923b405b754f57acEB4272 |
| ERC-8183 AgenticCommerce | 0x0747EEf0706327138c69792bF28Cd525089e4583 |
Multicall3From is Arc-specific: it batches like Multicall3 but
preserves the original msg.sender in each subcall. Memo
and Multicall3From must be in the call path for Circle's compliance screening to see
the memo.
Gaps found in Arc's documentation
These surfaced while building against the chain, and are worth contributing back:
- The
eth_getLogsrange caps are undocumented, differ across the four endpoints the docs present as interchangeable, and the default endpoint's error message quotes a limit more than 3× what it enforces. - Cloudflare rate limiting on the public RPC is not mentioned.
- The ERC-8004 registry read ABI is absent — the tutorials cover writes only.
readFeedback's return tuple has no published layout.AgentIdentityhas nototalSupply(), and nothing documents how to enumerate.
Sources
- docs.arc.io/llms.txt — full documentation index
- EVM differences
- USDC system events
- Gas and fees
- Contract addresses
- Agentic economy