High Stakes

Maximum security for high-value outcomes

Security
9.5
1
Commit
Hash your secret
2
Wait
VEO fulfills
3
Reveal
Show your secret
4
Use
Get bond back
Secret
#
Commit
VEO
Fulfill
R
Reveal
+
E
Combined

Your secret + VEO entropy = nobody can cheat

Cost
10K
PLS
Bond
10M
PLS (returned)
Reveal
~1m
window
Difficulty
Expert
integration

Why It's Secure

Commit-Reveal
No last-mover cheating
Bonded
Can't quit if losing
Dual Source
You + VEO combined
MEV Proof
Secret hidden upfront
Great For
Casinos
Real money games
Big Lotteries
Prizes over $10,000
DeFi
Financial outcomes
Premium NFTs
High-value drops
Overkill For
Small Games
Use Medium tier
Quick Actions
Reveal adds delay
Low Value
Bond too expensive
Simple Apps
Too complex

Bond Required

You must post a 10M PLS bond (~$167) when committing. If you reveal your secret on time, you get it all back. If you don't reveal (trying to avoid a bad result), you lose the bond. This stops people from cheating.

Note: Bond amount (10M-1B PLS) and reveal window (42s-5min) can be adjusted by protocol governance as PLS price changes.

For Developers

Integration Guide

Commit-reveal pattern for maximum security

1Contracts

VE
VEO
Main contract
View →
VE
VEOKeeper
Helper queries
View →
VE
VEOViews
View functions
View →

2Quick Start

Solidity
// PHASE 1: Generate secret and commit
bytes32 secret = keccak256(abi.encodePacked(
    msg.sender, block.timestamp, someUniqueData
));
bytes32 commitment = keccak256(abi.encodePacked(secret));

// Store secret somewhere safe! You need it later.
storedSecrets[requestId] = secret;

// Request with bond (10M PLS returned on reveal)
uint256 price = veo.getSecurePrice();  // 10,010,000 PLS
bytes32 requestId = veo.requestEntropySecure{value: price}(
    consumer, actionId, commitment
);

// PHASE 2: Wait for VEO to fulfill (keepers do this)
require(veo.isReadyForReveal(requestId), "Not ready");

// PHASE 3: Reveal your secret (bond returned)
veo.revealSecretAndComplete(requestId, secret);

// PHASE 4: Consume the combined entropy
bytes32 entropy = veo.consumeEntropy(requestId, salt);

3Frontend Secret Generation

JavaScript
import { ethers } from 'ethers';

// Generate a cryptographically secure secret
const secret = ethers.utils.randomBytes(32);
const commitment = ethers.utils.keccak256(secret);

// IMPORTANT: Store secret safely until reveal!
localStorage.setItem('veo_secret_' + requestId,
    ethers.utils.hexlify(secret));

// Later, retrieve and reveal
const storedSecret = localStorage.getItem('veo_secret_' + requestId);
await veo.revealSecretAndComplete(requestId, storedSecret);

4Secure Functions

Request (Secure)
getSecurePrice() → uint256secureBond() → uint256revealWindow() → uint256requestEntropySecure(consumer, actionId, commitment)
Reveal
isReadyForReveal(id) → boolrevealSecretAndComplete(id, secret)getSecureRequestDetails(id)
Consume
consumeEntropy(id, salt) → bytes32canConsume(id) → (bool, string)
Slash (Penalty)
slashExpiredSecure(id)

Anyone can call this after reveal deadline passes

5Secure ABI

VEO.sol (Secure Functions)
[
  "function getSecurePrice() view returns (uint256)",
  "function secureBond() view returns (uint256)",
  "function revealWindow() view returns (uint256)",
  "function requestEntropySecure(address, bytes32, bytes32) payable returns (bytes32)",
  "function revealSecretAndComplete(bytes32, bytes32)",
  "function slashExpiredSecure(bytes32)",
  "function isReadyForReveal(bytes32) view returns (bool)",
  "function getSecureRequestDetails(bytes32) view returns (bool, bytes32, uint256, uint256, uint8)",
  "function consumeEntropy(bytes32, bytes32) returns (bytes32)",
  "function canConsume(bytes32) view returns (bool, string)",
  "event SecureEntropyRequested(bytes32, address, address, bytes32, uint256, uint256)",
  "event SecretRevealed(bytes32, bytes32)",
  "event BondSlashed(bytes32, address, uint256)"
]

For lower stakes, check out Low or Medium Stakes tiers.