RandProofKeeper
The permissionless keeper network that detects, signs, and fulfills — the decentralized engine under every RandProof product, coordinated purely by on-chain incentives.
12 nodes. 4-of-12 quorum. Zero trust.
The same 12 staked keepers operate RandProofRNG and RandProofAutomation on every chain — per-chain deployments.
Five jobs, every draw.
Pick up the DrawRequest event over WebSocket RPC within a block — or watch a client’s own deadline/upkeep condition.
Resolve the drand Quicknet round for the anchored height plus the other signed sources — DRAND, NIST, Bitcoin, Polkadot, Ethereum, Cosmos Hub.
Sign keccak256(chainId, coordinator, eventId, drandValue, entropyBlock). Timestamp and prevrandao are never signed — they’re mixed in fresh at fulfillment.
Gossip the signature to peers; the first keeper holding 4-of-12 submits fulfill() and pays the gas.
If a draw stalls past the 256-block timeout, any keeper — or any observer — can trigger the permissionless fulfillFromBeacon fallback.
Incentives do the coordination.
No approval needed to operate — register, post the stake, and the committee admits the node. A provably false report gets slashed.
The 256-block beacon fallback and the cancel/refund paths are already exercised in production — liveness does not depend on any operator.
Earnings accumulate per keeper and are claimed by withdraw() — no periodic distribution tx, no treasury custody of keeper pay.
Every signature, fulfillment, and fee split is on-chain — RandProofScan indexes all ten chains in real time.
Keepers aren’t only for humans.
Keeper participation is exposed as agent skills for autonomous AI operators — same earnings, same identity model, paid in x402 USDC micropayments.
install skill randproof-keeper — event watching, entropy submission, gossip relay. Earnings 2–5% of PoFR fees via x402 micropayments; identity via ERC-8004 passport.
hermes skill add randproof — self-optimizing participation with persistent memory. Same earnings and identity model.
One Docker image, one .env.
KEEPER_PRIVATE_KEY=0x...
CHAINS=base
BASE_RPC=wss://base-mainnet.g.alchemy.com/v2/<YOUR_KEY>
MIN_UPTIME_PERCENT=80
BLS_COMMITTEE_SIZE=12
FEE_ASSET=native
# Launch:
docker run -d --env-file .env randproof/randproofkeeper:latest