Arc-native data
The data plane Arc actually needs.
USDC is the gas token and the product. These four APIs exist because the movement of that token on Arc does not look like an ERC-20 transfer on Ethereum, and the difference lands in somebody's ledger.
Decimal-safe balances
One balance, both interfaces, no truncation
Native USDC is 18 decimals and the ERC-20 interface is 6. They are the same balance. A single response carries both plus the display string, and a truncation flag when the ERC-20 view is lossy for that account.
POST /v1/$KEY
{"method":"arcrpc_getUsdcBalance","params":["0xa1b2…","latest"]}
{
"native18": "1250000000000000000",
"erc20_6": "1250000",
"display": "1.25 USDC",
"truncated": false
}Settlement proofs
The commit certificate, cached and verifiable offline
Arc finalises on commit. arc_getCertificate returns the signed BFT certificate that proves it. We cache every certificate, index it by transaction hash as well as height, and ship a verifier that needs no network access, which is the artefact an auditor actually asks for.
GET /v1/$KEY/proof/0x91c4…7fe
{
"height": 5185952,
"round": 0,
"blockHash": "0x4f21…a0c",
"signatures": [{ "validator": "0x…", "sig": "0x…" }],
"quorum": "9/11 voting power"
}
npx @arcrpc/verify proof.json # offline, no networkTransfer feed
Every USDC movement once, not twice
An ERC-20 transfer emits a 6 decimal log from the token contract and an 18 decimal EIP-7708 log from the system emitter. A native send emits only the second. The feed merges both, de-duplicates, and attaches the Memo reference, blocklist changes and the matching CCTP leg.
wss://stream.arcrpc.com/v1/$KEY?feed=usdc.transfers
{
"block": 5185952,
"logIndex": 3,
"from": "0x8f…",
"to": "0x2c…",
"native18": "250000000000000000000",
"display": "250.00 USDC",
"path": "erc20",
"memo": "INV-40192",
"cctp": null,
"final": true
}Compliance pre-flight
Ask before you burn the gas
On Arc a transfer reverts on a blocklisted counterparty, the zero address, a burn, a destructed account or a precompile target, and the revert still consumes gas. Pre-flight answers whether it will revert and which rule fires, against live blocklist state.
POST {"method":"arcrpc_simulateTransfer","params":[{
"from":"0x8f…","to":"0x2c…","value":"250000000" }]}
{
"willRevert": true,
"reason": "recipient blocklisted",
"rule": "usdc.blocklist",
"gasWouldBurn": "21000"
}Event sources
The contracts the feed reads.
Published so you can verify the feed against the chain yourself, or index the same addresses directly.
| Source | Address | Decimals |
|---|---|---|
| Native USDC, EIP-7708 system emitter | 0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE | 18 |
| USDC ERC-20 interface | 0x3600000000000000000000000000000000000000 | 6 |
| EURC | 0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a | 6 |
| Memo | 0x5294E9927c3306DcBaDb03fe70b92e01cCede505 | n/a |
| CCTP TokenMessengerV2 | 0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA | n/a |
| CCTP MessageTransmitterV2 | 0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275 | n/a |
Reconcile a day of Arc USDC against your ledger.
Backfill the feed over any range and compare it with what you have. The gap report tells you whether anything is missing.