arctools for Arc

Research

Read the docs. Then ask the chain.

Everything below was taken from Arc's own documentation and then checked against https://rpc.testnet.arc.io. Where the two disagreed, the chain won and the note says so.

Network facts

Chain ID5042002 (eth_chainId0x4cef52)
RPChttps://rpc.testnet.arc.io
Explorertestnet.arcscan.app
Faucetfaucet.circle.com
Gas price observed21 Gwei (protocol floor 20, ceiling 20,000)
Base fee target~$0.01 per transaction, EIP-1559 + EWMA smoothing
Throughput30M gas/block, ~0.5 s blocks
eth_getLogs range capDiffers 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 limitingCloudflare fronts the RPC and returns 429 on bursts, even at concurrency 4
MainnetAnnounced 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:

InterfaceAddressDecimalsUsed for
Native18Gas accounting, native sends, msg.value, address.balance
ERC-200x3600…00006transfer, approve, allowance, balanceOf

Verified on chain: decimals()6, symbol()USDC.

Protocol divergences from Ethereum

Compared against Ethereum at the Osaka hard fork, Arc's baseline.

BehaviourEthereumArc
PREVRANDAO / block.difficultyRANDAO mixAlways 0 — no onchain randomness
SELFDESTRUCTEIP-6780EIP-6780 + native value rules; emits a Transfer log
Value CALL to a destructed accountSucceedsReverts (forbidden burn)
Native transfer to address(0)SucceedsReverts — USDC cannot be burned this way
EIP-4788 beacon rootsFunctionalContract omitted; reads return 0x
Blob txs (EIP-4844)SupportedRejected; BLOBHASH→0, BLOBBASEFEE→1
EIP-2935 block-hash historyFunctionalFunctional — unlike 4788
EIP-7708 native Transfer logsNot yetShipped ahead of upstream
None of this reproduces locally

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:

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.

ContractAddress
USDC (ERC-20 view)0x3600000000000000000000000000000000000000
Native system emitter (EIP-7708)0xfffffffffffffffffffffffffffffffffffffffe
EURC0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a
USYC0xe9185F0c5F296Ed1797AaE4238D26CCaBEadb86C
CCTP TokenMessengerV2 (domain 26)0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA
Gateway Wallet0x0077777d7EBA4688BDeF3E311b846F25870A19B9
StableFX FxEscrow0xd68256f4D69C6BbEcB873D8588AE0Dc6B8E22E10
Memo0x5294E9927c3306DcBaDb03fe70b92e01cCede505
Multicall3From0x522fAf9A91c41c443c66765030741e4AaCe147D0
ERC-8004 IdentityRegistry0x8004A818BFB912233c491871b3d84c89A494BD9e
ERC-8004 ReputationRegistry0x8004B663056A597Dffe9eCcC1965A193B7388713
ERC-8004 ValidationRegistry0x8004Cb1BF31DAf7788923b405b754f57acEB4272
ERC-8183 AgenticCommerce0x0747EEf0706327138c69792bF28Cd525089e4583

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:

  1. The eth_getLogs range 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.
  2. Cloudflare rate limiting on the public RPC is not mentioned.
  3. The ERC-8004 registry read ABI is absent — the tutorials cover writes only.
  4. readFeedback's return tuple has no published layout.
  5. AgentIdentity has no totalSupply(), and nothing documents how to enumerate.

Sources