Don't trust us. Recompute it.
There is no operator seed to trust. A draw is two public things: the hash of a close block we committed to before it was mined, and the Merkle root of every holder's balance at that block. The roll is just keccak256 of the block hash — so the winner is fixed and public the instant the block lands. This page re-runs the whole computation in your browser, the same code the contract verifies on-chain.
What we cannot do
The roll is keccak256 of a close block we committed to before it was mined — its hash didn't exist yet, so it can't be ground.
There is NO operator seed. Nothing is revealed, so there is nothing to withhold or quietly re-roll if the result is unfavorable.
The snapshot's Merkle root is published on-chain; anyone recomputes it from real balances at the close block.
settle() is permissionless and verifies a Merkle proof that the winner's weight interval covers the roll — the contract pays exactly that address.
Reference implementation
Copy-paste. Run it locally with Node ≥ 20, no dependencies — same answer as this page.
// no seed, no secret — everything is public on-chain data
import { keccak_256 } from "@noble/hashes/sha3";
// roll = keccak256(abi.encodePacked(bytes32 closeBlockHash, uint256 drawId))
// offset = roll mod totalWeight
// winner = the holder whose [cumBefore, cumBefore + weight) covers offset,
// in the snapshot sorted by address; proven on-chain by a Merkle proof
// of keccak256(keccak256(abi.encode(addr, cumBefore, weight)))
