RandProofRNG
Verifiable randomness as a public utility. One payable call, a permanent on-chain proof — no oracle token, no admin key, no trusted middleman.
Live and proven.
Per-chain coordinator addresses, deploy txs, and fee tokens on the networks page.
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.
Your contract calls requestRandomness{value: fee}(userSeed) and gets an eventId. Rate limited to 1 request per 10 blocks per address.
The keeper committee picks up the DrawRequest event over WebSocket RPC within a block.
Keepers resolve the drand Quicknet round for the anchored height and sign the event commitment.
The first keeper holding 4-of-12 committee signatures submits fulfill().
The contract verifies the drand Quicknet BLS signature itself via the EIP-2537 BLS12-381 precompile — on-chain, not attested.
Your fulfillRandomness(eventId, seed) callback fires, the fee splits 70/20/10, and the RandProof is stored permanently.
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.
League of Entropy t=9-of-25 beacon
NIST Randomness Beacon (gap-anchored)
Block header Merkle root (self-hosted nodes)
On-chain verified anchor — the seed source
Block hash at deterministic target height
Mainnet block hash at anchored height
Block hash at anchored height
Designed to keep working when things go wrong.
The fulfillment path is immutable. No privileged call can alter, delay, or redirect an outcome.
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 txcancelRequest(eventId) returns the fee to the original requester once the timeout passes unfulfilled. Funds can never be locked.
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.
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