eth_callsWhat 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.
| Hazard | What breaks | Caught 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 |
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.