arctools for Arc

Unofficial developer tooling

Arc compiles your Ethereum contracts unchanged. That is the problem.

Arc is Circle's stablecoin-native Layer 1, where USDC is the gas token. It is EVM-compatible, so your contracts deploy without edits — and the handful of places where its semantics differ are invisible to the compiler, invisible to anvil, and expensive in production.

14
compatibility rules, each citing the doc page that justifies it
+67.5%
phantom rows a topic-only USDC indexer creates, measured live
885,423
ERC-8004 agents, enumerated in 41 eth_calls
106
tests, all offline — nothing to install to run them

What actually goes wrong

Every row below is a real divergence, taken from Arc's own documentation and then confirmed against a live testnet RPC. None of them produce a compiler warning.

HazardWhat breaksCaught by
Native USDC is 18 decimals, the ERC-20 view is 6 — one balance, two scales A 1e18 amount passed to transfer() is 1012× too large arc-lint
block.prevrandao is hardcoded to 0 Lotteries, shuffles, and commit-reveal schemes become fully predictable arc-lint
Native transfer to address(0) reverts Burn-by-sending patterns that pass on mainnet fail at runtime arc-lint
One transfer() emits two Transfer logs, from two emitters Indexers double-count: +67.5% phantom rows, +83.1% inflated volume arc-index
Self-transfers log on the ERC-20 side only Indexers invent balance changes for movements that moved nothing arc-index
AgentIdentity has no totalSupply(), and its logs predate any cheap window No way to enumerate the agents already registered on the chain arc-agents
Local EVMs cannot reproduce any of this

anvil, hardhat node, and ganache run a stock EVM. The native-coin precompiles, the EIP-7708 Transfer events, and USDC blocklist enforcement only surface against a real Arc RPC — so a green local test suite tells you nothing about these.

Three tools

Each solves one of the hazards above. All zero-dependency, no build step.

arc-lint →

Static analysis for the divergences the compiler cannot see. 14 rules across Solidity and deploy scripts, every finding linking to the doc page behind it.

Foundry Hardhat 3 GitHub Action

arc-index →

Dual-emitter-safe USDC indexing, and a reconcile command that proves an index against eth_getBalance rather than trusting it.

CLI Ponder Subsquid

arc-agents →

Reads the ERC-8004 identity and reputation registries — the substrate every agentic application on Arc has to read.

CLI ERC-8004

Why tooling, and not a tenth sample app

Circle already ships nine sample applications covering commerce, peer-to-peer payments, escrow, nanopayments, multichain wallets, treasury, stablecoin FX, lend/borrow, and prediction markets. Building a tenth is not where the gap is.

The gap is that correct code looks wrong and wrong code looks fine, and nothing in the toolchain tells the difference. Anyone building stablecoin FX or a lending market on Arc hits the decimal trap and the dual-emitter problem on day one. These three sit underneath those applications rather than beside them.

Verified, not assumed

Every claim on this site was read from Arc's documentation and then checked against https://rpc.testnet.arc.io. Where the docs and the chain disagreed, the chain won and the notes say so.

That process also turned up five gaps in Arc's own documentation — including an undocumented 100,000-block eth_getLogs cap and a missing ERC-8004 read ABI. They are written up, with reproduction, in the Arc notes.

Getting started

# Node 22.6+ runs the TypeScript directly — nothing to install
npm run arc-lint   -- contracts/          # catch hazards pre-deploy
npm run arc-index  -- scan --blocks 200   # index USDC without double-counting
npm run arc-agents -- count               # read the ERC-8004 registry
npm run serve                             # dev console on localhost:8787
npm test                                  # 106 tests, all offline

There is also a local dev console that puts the live chain data, a paste-and-lint box, and full-text search over 636 mirrored documentation pages behind one command.