The safety layer for USDC payments on Arc.
Today: pre-deploy detection, failed-payment forensics and a deploy gate for CI and AI agents, live on mainnet. Next: chain-wide attestation and a wallet guard that checks a payment before it is signed. Roadmap →
One balance. Two interfaces.
Arc's native gas asset is USDC. The same account balance is exposed as native value at 18 decimals and through the ERC-20 predeploy at 0x3600…0000 at 6 decimals. Contracts written against Ethereum semantics assume two assets. On Arc that assumption produces silent reverts, double-counted balances and broken invariants.
Lunua detects these defects from deployed or undeployed bytecode using live eth_call simulation with state overrides, and reconstructs failed transactions at their original block.
Detectors
severity is assigned only from demonstrated impact · signals never block| ID | Detector | Method | Evidence class |
|---|---|---|---|
| LUN-01 | Native receive rejected on a USDC-handling contract | Simulation · 1e18 wei, empty calldata · counterfactual | Demonstrated |
| LUN-02 | Native and ERC-20 views read together (double count) | Bytecode · BALANCE/SELFBALANCE ∧ 0x3600… | Signal |
| LUN-03 | Sub-micro dust invisible to balanceOf | Simulation · 5e11 wei send + balanceOf probe + control | Demonstrated |
| LUN-04 | SELFDESTRUCT transfers full USDC balance | Bytecode · opcode 0xff | Signal |
| LUN-05 | Randomness from PREVRANDAO (constant 0 on Arc) | Bytecode · 0x44 + live PREVRANDAO probe | Signal |
| LUN-TX | Failed-transaction root cause and correct-rail rebuild | Replay @ N−1 · counterfactual simulation | Forensic |
Observed on mainnet
public incidents, Sep–Oct 2026| Project | Defect | Effect | Ref |
|---|---|---|---|
| Breadchain / KambioX | LUN-01 · escrow without receive() | 4 USDC wallet send reverted; issue open | #48 |
| DefiLlama | LUN-02 · native + ERC-20 summed | Arc TVL ≈ $10.5M reported vs ≈ $6.3M | #21274 #21279 |
| Circle arc-node docs | 6-dp amount passed as native value | Sent 1e-12 USDC instead of 1 | #453 |
| Layerswap · Pinax | Decimals / dual Transfer logs | Integration patches | #2175 #130 |
Deploy gate
CLI · CI · AI agentsThe engine is a single dependency-free ES module. The CLI exits non-zero on any demonstrated blocking finding and writes Foundry reproductions with --repro, so it gates CI merges and AI-agent deploys. The Lunua agent skill makes a passing run a hard precondition before any Arc deploy.
$ lunua check --code build/PortedVault.json BLOCK LUN-01 [Medium] wallet deposits revert SIGNAL LUN-02 [Unconfirmed] two views pc 0x018b SIGNAL LUN-05 [Unconfirmed] PREVRANDAO pc 0x01b2 1 demonstrated blocking · exit 1 $ lunua check 0x… --repro test/ # writes LUN01.t.sol … $ arc-forge test --network arc 6 tests passed, 0 failed
Attestation
PreflightRegistryResults are written on-chain as fail/warn bitmasks keyed by attester and target, pinned to extcodehash. An attestation is invalidated automatically if the code at the address changes. Wallets can call status(attester, target) before a send.
- Registry
- 0x966Bf58DB6F257C63Edb11bF006B5eB3160721DE
- PortedVault
- 0xA8Bd8C8F580d5f00cEF41bfA524555de17E3B38F · fail 33 · warn 4
- ArcVault
- 0x8f7349Dc451DFbC6B3773b49e33fa836b89C71f3 · pass