RandProofRNG
The verifiable randomness engine — live on ten chains. Request PoFR randomness from any contract and receive a permanent on-chain RandProof artifact.
Live on 10 Chains
KeeperCoordinatorV8 deployed on Base 2026-09-28 and now runs on ten chains — V8 on Base, Optimism, Arbitrum One, Polygon, Linea, BNB Chain, Robinhood Chain, and Arc; the V8A variant on Avalanche C-Chain and HyperEVM (chains without the EIP-2537 BLS12-381 precompile — the drand anchor is committee-attested rather than verified on-chain). Immutable contract — no admin key on the fulfillment path, an on-chain verified drand anchor (EIP-2537), and multisig treasuries.
RandProofRNG is the Layer 1 randomness product: a permissionless, pay-per-use verifiable randomness engine implementing the Proof-of-Fair-Randomness (PoFR) standard. Every fulfilled request produces a RandProof — a permanent on-chain artifact containing the seed, the committee signatures, and the entropy attestation, verifiable by anyone at any time.
Live Deployment
| Deployments | 10 chains — Base (hub), Optimism, Arbitrum One, Avalanche C-Chain, Polygon, Linea, BNB Chain, HyperEVM, Robinhood Chain, Arc (USDC fees) |
| Network | Base Mainnet (chain ID 8453) |
| Coordinator | 0x4D7Ca11c363Ad5ADce9F5C9F48F65c26fdE4D006 — KeeperCoordinatorV8, verified on Blockscout + Sourcify |
| Treasury | 0x67b2eEfD66Ec831358B57DaBF319393B7f0b1b6c — Safe 3-of-5 multisig |
| Committee | 12/12 keepers registered and staked |
| Fee | 0.00003 ETH per draw (~$0.10) — no oracle token |
| Explorer | randproofscan.com — entropy sources, signatures, seeds, signer committee per request |
How a Request Flows (V8)
- Your contract calls
requestRandomness{value: fee}(userSeed)on the coordinator and receives aneventId. Fee must be>= MIN_FEE(spam protection); rate limited to 1 request per 10 blocks per address. - The keeper committee detects the
DrawRequestevent over WebSocket RPC. - Each keeper resolves the drand Quicknet round anchored to the request and signs
keccak256(chainId, coordinator, eventId, drandValue, entropyBlock). - The first keeper holding a 4-of-12 committee quorum calls
fulfill(). - The coordinator verifies the drand Quicknet BLS signature on-chain via the EIP-2537 BLS12-381 precompile and derives the seed solely from that verified anchor — plus the
block.timestamp/block.prevrandaoof the fulfillment block, which no keeper could predict or pre-sign. - The coordinator calls back
fulfillRandomness(eventId, seed)on your contract, distributes the fee 70/20/10, and stores the RandProof permanently.
Entropy Sources Today
Eleven sources are tracked per proof. The seven cryptographically signed sources are deterministic — every honest keeper derives the same values. The seed itself derives solely from the on-chain verified drand Quicknet round, so security never depends on the supplemental attestations.
Signed (7): DRAND (League of Entropy t=9-of-25), NIST Randomness Beacon (gap-anchored), Bitcoin block header Merkle root (self-hosted nodes), drand Quicknet, Polkadot block hash, Ethereum block hash, Cosmos Hub block hash.
Supplemental attestations (4): Entropy Block (active — Base block number bound into every keeper signature), ANU QRNG (staged), Multi-Chain Hash (in progress), Block-derived (staged).
Liveness Guarantees
- Fulfillment timeout:
FULFILLMENT_TIMEOUT = 256blocks (~8.5 min on Base). If keepers stall, a permissionlessfulfillFromBeaconpath settles the draw from the beacon anchor alone — already exercised in production: a stalled draw auto-settled at +256 blocks (tx). - Requester refund:
cancelRequest(eventId)returns the fee to the original requester once the timeout passes unfulfilled. - No admin key on
fulfill()— the fulfillment path is pure cryptography; there is no privileged call that can alter, delay, or redirect an outcome.
Integrate
interface IKeeperCoordinator {
function requestRandomness(bytes32 userSeed) external payable returns (bytes32 eventId);
function isFulfilled(bytes32 eventId) external view returns (bool);
function getRandProof(bytes32 eventId) external view returns (
bytes32 seed,
bytes memory aggregatedSig,
address[] memory signers,
uint256 fulfillBlock,
uint256 fulfillTimestamp
);
}Your consumer implements fulfillRandomness(bytes32 eventId, bytes32 seed) and enforces msg.sender == coordinator. See the Quickstart for a full working contract and Client Contract Integration for the complete interface including fulfill, submitEntropy, submitFraudProof, and getEntropyInputs.
Verify a Proof
Every fulfilled event is independently auditable:
- Call
getRandProof(eventId)on the coordinator directly — no trust in this site required. - Browse RandProofScan for entropy sources, signatures, seeds, and the signer committee — e.g. this live proof.
- First production draws fulfilled seeds
0xbc8f…c8f7and0xe9df…9098, with Quicknet rounds verified on-chain via EIP-2537.
Validation Status
181 unit tests plus a live soak suite, a live failure-path suite, and a live adversarial suite (10/10) run against the deployed mainnet contract.
Spec vs. Deployment
Whitepaper §7 specifies the Phase-4 design target: 15 entropy sources across 7 entropy domains with BLS threshold aggregation. The deployed V8 intentionally diverges where the audits found it safer — 4-of-12 ECDSA committee signatures instead of unaudited BN254 BLS libraries, and a seed derived solely from the EIP-2537-verified drand Quicknet anchor rather than a 15-way mix. All divergences are disclosed in §19.2.