Fair by construction
Block hashes can be influenced and timed. A VRF can't — every number comes with proof that it was derived honestly.
Unforgeable
Every random number ships with an ECVRF proof tied to our public key. A number we didn't honestly derive simply fails verification — not even we can pick the outcome.
Verified on-chain
The coordinator contract checks each proof before your contract ever sees the number. You don't have to trust the oracle, the sequencer, or us.
Pay in DOGE
A flat fee per request in native DOGE, gas for delivery included. No tokens to buy, no subscriptions, no accounts.
Battle-tested math
Proof verification uses Chainlink's open-source (MIT) secp256k1 VRF verifier, unmodified — the same cryptography securing randomness across EVM chains.
Request, prove, verify, done
Your contract requests
Call requestRandomness(seed) with the fee. You get a request id.
Oracle proves
Our oracle derives the random number from your request with its secret key and builds a proof.
Contract verifies
The coordinator checks the proof on-chain. Invalid proofs are rejected.
You get called back
rawFulfillRandomness(id, randomness) lands in your contract. Done.
Two functions. That's the integration.
Request with one call, receive the number in a callback. The docs walk through a complete, tested dice-roller contract and a JavaScript client you can run today.
function roll() external payable returns (uint256 requestId) {
requestId = coordinator.requestRandomness{value: msg.value}(
keccak256(abi.encode(msg.sender, block.number))
);
}
// called back once the proof is verified on-chain
function rawFulfillRandomness(uint256 requestId, uint256 randomness) external {
require(msg.sender == address(coordinator));
uint256 dice = (randomness % 6) + 1;
}Already powering Doge Raffle
Every monthly jackpot draw on Doge Raffle is decided by DogeOS VRF, with the winning ticket recorded on-chain for anyone to check.
