Skip to content
Contracts

Separated
on purpose.

Configuration, inventory, randomness and settlement are four different contracts with four different role sets. That separation is what makes the system auditable.

Deployed addressesArc Mainnet
Architecture

Five contracts.

ArcadeMachineManager

Machines, versioned reward tables, and the spin lifecycle.

Freezes price, machine, version and player into each spin. Enforces maximum-liability before accepting one. Settlement is permissionless.

PrizeVault

Custodies reward inventory and enforces solvency.

Holds the invariant balance >= reserved for every token. The treasurer can only withdraw unreserved surplus, so a won prize cannot be withdrawn by an administrator.

RewardRegistry

The allowlist of tokens that may be awarded.

Asserts symbol and decimals against the token contract at registration. Decimals are immutable afterwards. Guardians can pause a token; only the registry admin can unpause.

CommitRevealRandomness

Verifiable randomness without a VRF.

Commitments are published in advance and consumed in strict order. Implements IRandomnessSource so a VRF adapter can replace it without redeploying anything else.

FeeRouter

Splits spin revenue between reward funding and treasury.

Accumulates rather than forwarding on receipt, so a failing destination can never make a spin settlement revert. Cannot touch the prize vault.

Revenue and prize inventory are separate pools with separate rules.
Roles
MACHINE_ADMIN
Creates and versions machines, sets reward tables. Cannot settle spins.
REGISTRY_ADMIN
Curates the token allowlist. Cannot move funds.
TREASURER
Deposits inventory and withdraws only unreserved surplus.
RANDOMNESS_OPERATOR
Publishes commitments and reveals seeds. Cannot choose outcomes.
GUARDIAN
Emergency pause only. Cannot unpause, configure, or move funds.

No role can alter a settled outcome. Pausing stops new spins and never strands one in flight. A production deployment should hold the top-level admin role in a multisig and split the others across separate signers.

Arc network parameters
Mainnet chain ID
5042
Mainnet RPC
https://rpc.mainnet.arc.io
Testnet chain ID
5042002
Testnet RPC
https://rpc.testnet.arc.io
Native asset
USDC — 18 decimals
USDC ERC-20
0x3600000000000000000000000000000000000000 — 6 decimals
Multicall3
0xcA11bde05977b3631167028862bE2a173976CA11
Decimals hazard

Native USDC on Arc uses 18 decimals; the USDC ERC-20 interface uses 6. Arcade prices spins in the native asset, so every spin price in this codebase is an 18-decimal value. Mixing the two is a documented Arc footgun.

Audit status

Not audited.

These contracts have not been reviewed by an independent security firm. They ship with 61 unit, fuzz and invariant tests, including a solvency invariant driven through thousands of randomised call sequences covering concurrent spins, abandoned randomness, hostile tokens and adversarial treasury withdrawals.

That is meaningful evidence and it is not an audit. Anyone considering a production deployment should commission one, and should read the security assumptions section of the repository README first.

What the randomness design does and does not guarantee

The ribbed white interior vault of the Oculus transit hall, its thin curved ribs converging toward a long skylight.
Repetition with no hidden joins: the structure is the proof.Oculus Interior 252 · Kidfly182 · CC BY 4.0 · source
Photography credits

Photographs used as editorial accents. Licences and author credits are read from the source API at download time rather than transcribed, and recorded in public/media/media-attribution.json.

Oculus Interior 252
Kidfly182 · CC BY 4.0 · Wikimedia Commons
Air intake, fan and compressor of sectioned Rolls-Royce Turboméca Adour turbofan 01
Olivier Cleynen · CC BY-SA 3.0 · Wikimedia Commons