Live on 10 Chains

RandProofRNG

Verifiable randomness as a public utility. One payable call, a permanent on-chain proof — no oracle token, no admin key, no trusted middleman.

Deployment

Live and proven.

Contract
KeeperCoordinatorV8
Deployed
2026-09-28
Deployments
10 chains — Base (hub), Optimism, Arbitrum One, Avalanche C-Chain, Polygon, Linea, BNB Chain, HyperEVM, Robinhood Chain, Arc
Threshold
4-of-12 keepers (BFT-safe)
Parameters
minStake 0.001 ETH · minFee 0.00003 ETH · split 70% keepers / 20% treasury / 10% gas pool
Verification
Source verified on Blockscout + Sourcify (exact match)
Live deployments — every chain, same committee

Per-chain coordinator addresses, deploy txs, and fee tokens on the networks page.

Request Lifecycle

Six steps, zero trust.

The seed derives solely from the drand Quicknet anchor the contract verifies itself — mixed with the fulfillment block's timestamp and prevrandao, which no keeper could predict or pre-sign.

01
Request

Your contract calls requestRandomness{value: fee}(userSeed) and gets an eventId. Rate limited to 1 request per 10 blocks per address.

02
Detect

The keeper committee picks up the DrawRequest event over WebSocket RPC within a block.

03
Anchor

Keepers resolve the drand Quicknet round for the anchored height and sign the event commitment.

04
Quorum

The first keeper holding 4-of-12 committee signatures submits fulfill().

05
Verify

The contract verifies the drand Quicknet BLS signature itself via the EIP-2537 BLS12-381 precompile — on-chain, not attested.

06
Prove

Your fulfillRandomness(eventId, seed) callback fires, the fee splits 70/20/10, and the RandProof is stored permanently.

Entropy Aggregation

11 entropy sources — 7 cryptographically signed.

Signed sources are deterministic — all keepers derive the same values. Supplemental attestations are recorded in each proof for provenance, but the seed never depends on them.

Signed Sources (7)
DRAND

League of Entropy t=9-of-25 beacon

NIST

NIST Randomness Beacon (gap-anchored)

Bitcoin

Block header Merkle root (self-hosted nodes)

drand Quicknet

On-chain verified anchor — the seed source

Polkadot

Block hash at deterministic target height

Ethereum

Mainnet block hash at anchored height

Cosmos Hub

Block hash at anchored height

Supplemental Attestations (4)
Entropy BlockActive
ANU QRNGStaged
Multi-Chain HashIn Progress
Block-derivedStaged
Safety

Designed to keep working when things go wrong.

No admin key on fulfill()

The fulfillment path is immutable. No privileged call can alter, delay, or redirect an outcome.

Self-healing liveness

If keepers stall past the 256-block timeout, anyone can settle the draw via the permissionless fulfillFromBeacon path — already exercised in production.

View the self-heal tx
Requester refunds

cancelRequest(eventId) returns the fee to the original requester once the timeout passes unfulfilled. Funds can never be locked.

Battle-tested

181 unit tests plus a live soak suite, a live failure-path suite, and a live adversarial suite (10/10) run against the deployed contract.

0Keeper Nodes
0-of-12Threshold (BFT-safe)
0Entropy Sources
0Fulfillment Errors (mainnet)
For Developers

One payable call.

// Request randomness — fee >= 0.00003 ETH
bytes32 eventId = coordinator.requestRandomness{value: msg.value}(userSeed);

// Receive the result (called by the coordinator)
function fulfillRandomness(bytes32 eventId, bytes32 seed) external {
    require(msg.sender == address(coordinator), "Only coordinator");
    // ... settle your draw
}

// Audit any past draw — permanent, public, verifiable
coordinator.getRandProof(eventId); // seed, signatures, signers, block