Arcveil
Network

Arc. Where the receipts settle, and what answers when you read them.

Arc is Circle's EVM layer 1 for stablecoin finance, where USDC is the gas token. Arcveil's registries are deployed to mainnet, and the verifier reads them straight from the browser over plain JSON-RPC.

Network

Arc network parameters the verifier uses.
MainnetArc, chain ID 5042
Testnetchain ID 5042002
RPChttps://rpc.mainnet.arc.io
Explorerhttps://explorer.arc.io
GasUSDC — the native balance, at 18 decimals
CORSThe RPC endpoint allows cross-origin requests, which is why the verifier needs no backend

Deployed

On Arc mainnet. The registry bytecode was checked byte-identical to the local build, so what answers at these addresses is what the test suite ran against.

Arcveil contracts deployed to Arc mainnet.
MandateRegistry0xcd48ede31bd45d8fda65d5d24f8a6a317fd131f5
AnchorRegistry0xb2af157f269b31e315099e9da693096833ab8289
ArcveilAccount0xb1c0983a7b84f38fbaf5f3af92f0fecaa62ce25d
USDC (ERC-20)0x3600000000000000000000000000000000000000

MandateRegistry

Holds one commitment per account per epoch, and whether it has been revoked. It never holds terms — only their hash.

Public functions of MandateRegistry.
FunctionWhat it does
register(uint64 epoch, bytes32 commitment)Publishes a commitment for an epoch. Reverts if that epoch already has one.
revoke(uint64 epoch)Retires it. The epoch stays registered and stays revoked — it can never be reused.
mandateOf(address, uint64) viewThe record: commitment, epoch, revoked flag.
isLive(address, uint64, bytes32) viewOne call for the question the verifier actually asks.

AnchorRegistry

Anchors the budget chain so a bundle that starts mid-sequence can still be placed.

Public functions of AnchorRegistry.
FunctionWhat it does
anchor(bytes32 commitment)Anchors a budget commitment for the caller. Anchoring the same one twice reverts.
isAnchored(address, bytes32) viewWhether a starting commitment is on chain — the linkage check for a receipt with no predecessor.
anchoredAt(address, bytes32) viewWhen it was anchored.
head(address) viewThe latest commitment anchored by that account.

The account

How the 2-of-3 account authorises an action.
StandardERC-4337, EntryPoint v0.7
Quorum2 of 3 — device shard, policy co-signer, passkey recovery
Gateexecute reverts unless the mandate named in the intent is registered and live
BindingThe EIP-712 domain is this account on this chain, and the payload covers the epoch and commitment
RelayingPermissionless — any funded wallet can submit an intent that already carries two signatures
shell
# Prepare an intent, sign it with a keystore, then relay it.pnpm intent prepare transfer 0x<to> <usdc>pnpm intent send 0x<sig1> 0x<sig2>

Pointing the reader elsewhere

The reader takes the endpoint and the registry addresses, so testnet or a fork is a matter of configuration. Leave an address null and the checks that need it report unknown instead of failing — a fail would read as an accusation the evidence does not support.

reader.ts
import { createRpcChainReader, arc, arcTestnet, ARC_REGISTRIES } from "@arcveildev/sdk"; // Mainnet — the registries below are deployed and answering.createRpcChainReader({  endpoint: arc.rpcUrls.default.http[0],  chainId: arc.id,  ...ARC_REGISTRIES[arc.id],}); // Testnet — nothing of ours is deployed there, so pass null and let those// checks report unknown instead of pretending.createRpcChainReader({  endpoint: arcTestnet.rpcUrls.default.http[0],  chainId: arcTestnet.id,  mandateRegistry: null,  anchorRegistry: null,});