Live

About Hypergamble

Hypergamble is the first zk mega-appchain built for non-custodial transparent and scalable gaming. In a market where trust is often betrayed by operators, Hypergamble is built on the pillars of what once crypto was: “Not your keys, not your coins” & “Don’t trust, verify”

Platform at a glance

1% → 0.31%
House Edge (base → top VIP)
100%
On-Chain Components
10k TPS
Settlement Throughput
<1s
Block Time
<100ms
Game Latency
Celestia
Data Availability

Join The Playground

Hypergamble. Where the smart retards play.

Discord Twitter / X Documentation
Season 1 Live

Genesis Points

Genesis Points are a stake early players build in a token that doesn't exist yet. Real on-chain activity earns them: bets settled, rounds played. Once that token launches (sometimes called TGE, short for Token Generation Event; nothing's live yet), points convert straight into an allocation. No claim form. No task list. Just your wallet's own history.

Season 1

Active Season
Season 1

Season 1 is live now, and it's the one to be in. Points earned here convert into the largest tranche of the eventual allocation. Earlier participation compounds: the earliest seasons get the biggest share.

How to earn

Most of it comes from real gameplay: bets settled on the protocol, scaling with rounds played and volume wagered. Smaller sources add a bit more, referring players who genuinely play, community contributions. Show up once to farm an airdrop, though, and you get nothing.

Notice
Points scale with real play, so farming them with sybil wallets doesn't pay off. On-chain analysis flags coordinated wallet clusters anyway, and any wallet caught farming forfeits every point it's earned. Playing for real means none of this touches you.

FAQ

Where can I see my points?

Connect your wallet, and your dashboard shows your points in real time, right alongside where you rank against everyone else.

Can I transfer points?

No. They stay bound to the wallet that earned them. Once the token launches, that same wallet gets the allocation directly. No separate claim step.

What if I miss Season 1?

You can still earn later. Remaining seasons split what's left of the allocation, though the earliest seasons keep the biggest cut.

The Provably Fair Protocol

Every bet settles through a four-step commit-reveal protocol. It makes outcome manipulation cryptographically impossible, for the player and the house alike. An ECVRF house seed combines with a player-supplied secret, binding both parties before any randomness gets revealed.

The four-step protocol

1

Player commits

The player publishes the Poseidon commitment C_player = H(player_nonce ∥ player_address ∥ round_counter) on-chain. The nonce stays private. The player is now bound to a seed contribution they cannot change.

2

House reveals VRF

The house publishes a VRF output computed over inputs that include C_player. Because the input is fixed the moment the player committed, the house cannot grind seeds for a favorable result.

3

Player reveals nonce

The player publishes player_nonce; the contract checks it against the commitment. A player who tried to peek at the VRF and pick a favorable nonce would fail this check. Non-reveal within the timeout forfeits the bet.

4

Settlement proof

The final seed is H(vrf_output ∥ player_nonce), determined by inputs neither party controlled alone. A single Plonky2 proof then establishes VRF correctness, payout computation, and balance transition in one verification, settled on-chain.

Why it can't be gamed
Both parties commit before either reveals. The house can't grind because the player's commitment is already fixed in the VRF input; the player can't grind because their nonce is committed before the VRF appears. The sequencer can't quietly suppress losing-for-the-house bets either. Bets sit in a threshold ElGamal encrypted mempool and get included before anyone can read them, so the sequencer can't tell which bets to censor or stall. Every artifact is on-chain, so any external observer can replay and verify the outcome. No off-chain "trust us" step exists.

Timeout rules

House non-reveal
If the house fails to publish the VRF output in time, the bet is fully refunded. House liveness is enforced by the protocol.
Player non-reveal
If the player fails to reveal in time, the bet is forfeited. This protects against griefing after an unfavorable seed.

What the settlement proof establishes

A single ~600-byte Plonky2 proof per bet establishes three sub-claims at once:

  • VRF correctness: in-circuit ECVRF verification proves the output is a valid evaluation of the house key (ECVRF construction over BLS12-381 G1, adapted from the RFC 9381 / draft-irtf-cfrg-vrf-15 design for a pairing-friendly curve).
  • Payout computation: outcome = final_seed mod N. The multiplier gets looked up via Merkle membership against the committed payout table.
  • Balance transition: new_balance = prev_balance − bet_amount + payout_amount, checked against the state tree, with prev_balance ≥ bet_amount asserted.

Every bet emits a full artifact set: commitment, VRF output and proof, outcome, payout, settlement proof, and state roots before and after. All of it gets published on-chain. Any external party with the public verifier keys can re-verify any bet. The protocol depends on the math, not on the operator's good behavior.

House Edge & RTP

The house edge gets locked in cryptographically before anyone plays a round. Verify the claimed Return To Player percentage yourself, against a Groth16 proof generated once per game version. No hidden edge. No per-bet adjustment. No operator discretion to lean on.

One percent, and as low as 0.31%

Base house edge
1.0%

Roughly half the crypto-casino category average. A lower edge means bankrolls last longer and players stick around. The model makes money on volume and growth, not by squeezing more out of each bet.

1% is the base. It drops from there. The VIP System pays rakeback that climbs with status, up to 69% at the top tier, and that's what pulls the effective edge down to roughly 0.31%, about as low as you'll find anywhere. The full rakeback ladder lives on the VIP System page.

1%
Base Edge
0.31%
Effective · Top VIP
69%
Max Rakeback

How RTP is committed and verified

Every game has a payout table, outcomes mapped to multipliers, and that table is what its RTP comes down to. It's public*, too: pull it straight from GET /games/:gameId/rtp, nothing hidden about it. The table being visible isn't what protects you, though. The protocol also locks in a cryptographic fingerprint of it at deployment (the RTP commitment, backed by a Groth16 proof and an on-chain verifier address). This commitment protects you: even though the table is public, nobody, Hypergamble included, can swap it out later without everyone noticing.

* This is expected to change. The plan is for the payout table itself to become private, with only the claimed RTP provable via cryptography, rather than the full table being fetchable as it is today. Not yet implemented.

Verification takes three steps. First, pull the claimed RTP and commitment data from GET /games/:gameId/rtp. Next, verify the Groth16 proof either locally or on-chain. Finally, the settlement circuit exposes a per-bet Merkle commitment. Confirm your bet's settlement proof binds directly to it. There's no way to settle against a different table than the one committed to.

Immutability
A deployed game version's payout table is locked for good. Changing it means shipping an entirely new version: new circuit, new on-chain verifier, while the old one stays reachable forever, commitment intact. There's no lever to move the edge between bets, work against a player who's winning, or shave payouts mid-session.

RTP by game

Game Claimed RTP House Edge Variance
Heads or Tails99.0%*1.0%*Low
Mines99.0%*1.0%*Configurable
Slots99.0%*1.0%*High
Keno99.0%*1.0%*High
Limbo99.0%*1.0%*Configurable
Blackjack99.0%*1.0%*Low
Baccarat99.0%*1.0%*Low
Dice97.5%2.5%Configurable
Plinko101.0%None: pays back slightly more than wageredConfigurable
Roulette (European)97.3%2.7%Low
Towers100.0%None: a fair bet by designConfigurable (by difficulty tier)
Wheel77.8% – 88.9%11.1% – 22.2%Varies by bet
Memecoin promotions≥100%Issuer-fundedPromotion-specific

* Platform baseline (see above), not yet a game-specific committed figure.

Memecoin promotions work differently: a token issuer funds a positive-EV experience as a marketing campaign, so RTP can exceed 100% for as long as the promotion runs. Each one still gets its own separately committed game version.

Architecture Overview

Here's the short version: you deposit funds on Ethereum, play games that settle almost instantly, and withdraw back to Ethereum whenever you want. Three systems work together to make that happen, and there's a fourth one you can run yourself if you ever want to double-check any of it.

The three services

The backend

What you actually talk to. It's the game server: accepts bets, walks through the commit-reveal steps, settles outcomes, keeps track of every player's balance, handles deposits and withdrawals. Every endpoint in the API integration guide lives here. You never need to talk to the proving service or the on-chain contracts directly. The backend does that for you.

The proving service

Works behind the scenes; you never call it yourself. It holds the house's secret randomness key, draws each bet's outcome using a verifiable random function (a way of generating randomness that can't be secretly rigged), and builds the cryptographic proofs that let anyone check a settled bet's outcome instead of just taking Hypergamble's word for it. Here's the part that matters most: your bet settles and your balance updates the moment you reveal. The proof backing it up attaches a little afterward, in the background.

The on-chain contracts

Where the actual money lives. A bridge contract on Ethereum (Sepolia today) holds your deposit and is what releases your withdrawal. On the appchain side, a game contract and a treasury contract mint chips once your deposit is confirmed and keep track of how much each game has in reserve. You won't touch any of these yourself. Every call to them, deposit, bet, or withdrawal, goes through the backend.

What "provably fair" actually means here

Two separate things both have to be true for a bet to be trustworthy, and each one is checked in its own way:

The outcome wasn't picked after the fact
You commit to a secret value before the house reveals its random draw, and the final result comes from combining both. Neither side can see the other's part in advance, so neither side can steer the result their way.
The payout is what was actually published
Every game's payout table is locked in with a cryptographic fingerprint before you ever place a bet. That fingerprint gets checked against your actual payout, so there's no way to quietly swap in worse odds after you've already bet.

The fairness verification how-to walks you through checking both of these yourself, using nothing but public information. You don't have to take Hypergamble's word for any of it.

Where trust still sits today

Everything above removes the need to trust that any one bet's outcome or payout was fair. It doesn't mean you never have to trust the operator about anything. A few things today are still promises rather than mathematical guarantees, and a couple of contracts can still be upgraded rather than being permanently locked in place. The trust assumption registry is the honest, itemized list of exactly what those are, and which ones already have a fix shipped or in progress versus which ones don't yet.

Cryptographic Stack

Two proof systems, Poseidon as the in-circuit hash, and an ECVRF over BLS12-381. Each one is chosen for a specific performance and security profile. The stack handles per-bet proofs at high frequency while compressing to ~200 bytes for L1 verification at epoch close.

Proof systems

Plonky2 (STARK-based)

The per-bet settlement proof. Sub-second proving on commodity hardware. No trusted setup. Native recursive aggregation lets individual bet proofs combine into a single block validity proof. Operates over the Goldilocks field for native compatibility with Poseidon hashing.

Groth16 over BLS12-381

The static RTP commitment proof, deployed once per game version. Smallest possible proof size (~200 bytes). Cheapest possible on-chain verification (~250k gas equivalent). Trusted setup is acceptable here because the circuit is deploy-once and the ceremony is public MPC.

For L1 consumption, the recursive Plonky2 block proof is wrapped in Groth16 (STARK-to-SNARK) to compress it from ~kilobytes to 200 bytes. This is the only place a trusted setup applies to runtime proving, and it's done once per epoch, not per bet.

Hash function

In-circuit commitments
Poseidon

Poseidon is used in two flavors, one per proof system: Poseidon over the Goldilocks field (p = 2^64 − 2^32 + 1) for Plonky2 settlement proofs and Merkle tree construction, and Poseidon over the BLS12-381 scalar field for the Groth16 RTP commitment. Each flavor is native to its proof system, which keeps in-circuit hashing close to free.

Commitments that must be verified on Ethereum L1 use Keccak256 externally and bridge to the appropriate Poseidon variant internally via a Merkle representation. Goldilocks is chosen for native Plonky2 efficiency, enabling sub-millisecond Poseidon evaluation in-circuit.

Verifiable random function

RNG construction
ECVRF · BLS12-381

Elliptic-curve VRF over the BLS12-381 G1 group, derived from the construction described in RFC 9381 / draft-irtf-cfrg-vrf-15 and adapted to a pairing-friendly curve so the VRF check can run inside the settlement circuit. The house commits to a long-term keypair at deployment; the public key is stored in appchain genesis state. Each bet's outcome is derived from a VRF evaluation that is publicly verifiable against the public key without revealing the secret.

BLS12-381 is chosen for pairing-friendliness (enabling efficient in-circuit VRF verification within the settlement proof) and for its production-grade security level (~128 bits). The curve is also the foundation of Ethereum's BLS signature scheme, making bridge-side verification straightforward.

Primitive performance

The cryptographic primitives are fast enough to run on commodity hardware: Poseidon hashing in under a microsecond, ECVRF generation and verification well under a millisecond each. In practice, this is what lets the games feel instant. Settlement happens in milliseconds, not the multi-second waits typical of on-chain systems.

Settlement circuit constraint budget

The per-bet Plonky2 settlement circuit comprises three sub-claims combined into a single proof. Constraint distribution:

Sub-claim Constraint Count Share
A: In-circuit ECVRF verification~15,000–20,000~50%
B: Payout computation + Merkle membership~8,000–15,000~30%
C: Balance transition~2,000–5,000~10%
Glue + Fiat-Shamir + public-input encoding~3,000~10%
Total~25,000–45,000100%

Proving time on commodity hardware: 150–400 ms per bet. With GPU acceleration: 15–50 ms per bet. The VRF split optimization moves sub-claim A to a shared batch proof, reducing the per-bet circuit to ~6,000 constraints.

Trusted setup

Two trusted-setup ceremonies are required, both for Groth16 circuits only (Plonky2 needs no setup):

  • Per-game RTP setup. One Groth16 trusted setup per game version. Public MPC ceremony with multiple independent participants. Once a single participant burns their toxic waste, the setup is secure. The ceremony is version-locked to the specific circuit hash.
  • Block-proof wrapper setup. One Groth16 trusted setup for the STARK-to-SNARK wrapper circuit. Universal across all games and epochs.

Both ceremonies are conducted as public Powers-of-Tau extensions, with the contribution transcripts published for permanent auditability.

State & Settlement

Global state on Hypergamble lives in a Poseidon sparse Merkle tree whose root is included in every block. Per-bet settlement proofs are recursively aggregated into a block validity proof. The block proof is wrapped in Groth16 and posted to Ethereum L1, where it serves as the source of truth for withdrawals. Data availability is provided by Celestia.

The state tree

A single Poseidon sparse Merkle tree holds four leaf types, each keyed by a deterministic value:

Leaf Type Key Value
Player balanceplayer_addressCurrent chip balance
Bet commitment(player_address, round_counter)C_player
VRF outputbet_idvrf_output
Game contract statecontract_addressRTP commitment, settlement-table Merkle root, verifier key, treasury address, circuit version

The Merkle root is the appchain's canonical state commitment. It is included as a public input in every block validity proof and posted alongside the block on Celestia.

Per-bet on-chain artifacts

For each settled bet, a fixed set of artifacts is published. Every bet is independently auditable by any external party from these artifacts alone:

C_player
The player's Poseidon commitment to their nonce, published at step 1 of the commit-reveal
vrf_output
The house's verifiable random output
vrf_proof
ECVRF proof of correctness against the house public key
player_nonce
The player nonce, revealed at step 3 and checked against C_player
bet_outcome
The derived outcome (a single field element)
payout_amount
The computed payout (u256)
settlement_zk_proof
The Plonky2 per-bet proof
prev_state_root
State tree root before the bet
new_state_root
State tree root after the bet

Block validity

Each block contains a single Plonky2 recursive proof that aggregates all per-bet settlement proofs in that block. The block validity proof establishes three properties:

1

Every bet has a valid settlement proof

Each individual settlement proof is verified within the aggregation circuit. The block proof is only valid if all per-bet proofs are valid.

2

State root transitions correctly

prev_state_root → new_state_root is the correct cumulative result of all bet transitions in the block, applied in transaction order.

3

DA commitment matches the transaction list

The transaction list matches the Celestia DA commitment included as a public input. The block proof binds the appchain state to the data published on DA.

L1 settlement

At each epoch boundary, the recursive Plonky2 block proof is wrapped to Groth16 (STARK-to-SNARK) and submitted to the L1 bridge contract. The wrapped proof is ~200 bytes; verification costs ~250k gas. The bridge contract maintains the verified appchain state root on Ethereum, and withdrawals are processed against this root.

Data availability

All per-bet artifacts and state-diff data get posted to a dedicated Celestia namespace at each block close. The Celestia data root is a public input in the block validity proof, cryptographically binding the chain's state to the published data. The compact per-bet summary record runs roughly 600 bytes: transaction core, VRF output and proof, outcome and payout, settlement public inputs, and state roots. The full Plonky2 proof itself is larger, and re-derivable from the aggregate.

Withdrawal flow

Withdrawals are processed against the L1-verified state root via Merkle inclusion proofs:

1

Player initiates

The player calls the withdrawal endpoint with their wallet signature and the requested amount. Their appchain chips are burned, removing the obligation from the state tree.

2

Merkle proof generation

A Merkle inclusion proof is generated against the most recent L1-verified state root, proving the player's balance was burned at the recorded amount.

3

L1 bridge claim

The player submits the Merkle proof to the L1 bridge contract. The bridge verifies the proof against the stored state root and releases the corresponding deposit asset to the player's address.

Withdrawal is a cryptographic operation, not a customer-service request. The operator cannot block, delay, or partially process a valid withdrawal claim. The bridge contract is the only party with custody.

Exit Hatch

The Exit Hatch is the guarantee that you can always get your funds out. Even if the operator disappears, the sequencer halts, or the team vanishes entirely, withdrawals still process against the L1-verified state root, so your balance stays recoverable directly from Ethereum. No permission needed.

Why it exists

The single hardest question to answer for any on-chain gaming platform is: what happens to my money if you shut down? On a custodial platform, the answer is "you lose it." On Hypergamble, the answer is "you withdraw it from Ethereum yourself." Because the appchain's state root is verified on L1 by the block validity proof, the record of your balance lives on Ethereum independently of Hypergamble's own infrastructure.

The Guarantee
Your balance is part of a state root that has been cryptographically verified on Ethereum L1. As long as Ethereum is running, you can prove ownership of your balance and withdraw it through the L1 bridge contract. No API. No website. No operator approval required.

How a normal withdrawal works

1

Initiate

You request a withdrawal with your wallet signature. Your appchain chips are burned, removing the obligation from the state tree.

2

Prove

A Merkle inclusion proof is generated against the latest L1-verified state root, proving your balance was burned at the recorded amount.

3

Claim

The proof is submitted to the L1 bridge contract, which verifies it against the stored root and releases your funds to your Ethereum address.

The escape path

The Exit Hatch is the same machinery, available even when Hypergamble's own services are offline. If the front-end is down, the sequencer stops producing blocks, or the team is gone, you can interact with the L1 bridge contract directly:

  • Your balance is already on L1. The most recent verified state root committed to Ethereum contains your balance. No new cooperation from the operator is needed to establish what you are owed.
  • The proof is permissionless. Anyone can generate the Merkle inclusion proof from public on-chain and DA data. Hypergamble does not gatekeep it.
  • The bridge contract is autonomous. It verifies proofs and releases funds based purely on the math. It has no "pause withdrawals" admin switch that can trap player funds.
Honest Note
The Exit Hatch recovers any balance reflected in the most recent state root verified on L1. Funds committed in a bet that hasn't settled yet, or activity more recent than the last L1-verified epoch, settle first under the protocol's timeout rules. The guarantee is strongest for settled balances, and that's the vast majority of what a player holds at any given moment.

Security Model

A clear account of what is cryptographically guaranteed, what the system relies on, and how those reliances are being removed over time. Naming the trust boundaries plainly is part of being verifiable rather than merely trusted.

What is cryptographically guaranteed

These properties hold by math. They don't depend on the operator behaving honestly. A dishonest operator simply cannot violate them, because the on-chain verifier rejects any state change that lacks a valid proof.

Outcome integrity

Outcomes derive from the commit-reveal protocol and an ECVRF seed, so neither the house nor the player can grind a result. Proven per bet.

Payout integrity

Payouts follow the committed payout table, verified by the RTP proof. The house cannot pay out less than the committed odds.

Balance integrity

Every balance transition is proven and checked against the on-chain state tree. Balances cannot be silently altered.

Fund custody

Funds live in the bridge contract, not an operator account. Withdrawal is enforced by the Exit Hatch against the L1-verified root.

What the system relies on

Two reliances remain, both explicitly bounded and both on a clear path to removal. Neither one lets anyone steal funds or rig an outcome. What they concern is liveness, whether your bet gets included and proven, not correctness.

Sequencer inclusion
The sequencer decides which bets enter each block. A threshold ElGamal encrypted mempool keeps bets sealed until after they're committed, so the sequencer can't see which ones are large or about-to-win and therefore can't selectively censor, delay, or time-out the bets that would lose the house money. It cannot alter outcomes or balances; those are proven.
Proving liveness
Proofs must be produced for the chain to advance. The proving layer is a performance convenience, not a trusted party. Anyone can run a prover and produce the same proofs. An idle or failed prover cannot forge state. It can only delay, and the Exit Hatch protects funds in that case.

Failure modes, and what protects you

If this failsWhat happensYour funds
Front-end / websiteYou can interact with contracts directlySafe: withdraw via Exit Hatch
Sequencer haltsNo new blocks; settled state already on L1Safe, same path: Exit Hatch
Proving layer haltsChain pauses; no invalid state can be producedSafe. Settled balances stay recoverable
Operator disappearsBridge contract remains autonomous on L1Safe, no permission needed to withdraw
Invalid proof submittedOn-chain verifier rejects itSafe. The state simply can't change

Audits

No independent security audit has taken place yet. Hypergamble is currently in beta, and you're responsible for any loss of funds. Only play with what you can afford to lose. Audit reports will be published here once any are completed.

VIP System

A fully transparent rewards system, built to end the opaque VIP programs of the gambling industry. Climb through 28 VIP statuses, and you unlock a larger rakeback share, higher reward multipliers, and a stack of bonuses along the way. Everything runs on-chain and verifiable. No hidden host discretion. No secret thresholds.

How you earn

Play any game in the ecosystem, or stake in the VIP Vault, to earn three things:

$HYPE

The native token of Hyperliquid, rewarded via Instant Rakeback and the Daily, Weekly, and Monthly bonuses.

gHYPE

Hypergamble's bet-only reward token, claimable as the Rankup Bonus and redeemable for $HYPE. See the gHYPE page.

XP

Non-transferable experience points that raise your VIP status. Earned by playing games or staking in the VIP Vault.

Effective house edge

The base house edge is 1%. VIP status returns a share of that edge to you as rakeback, rising from 5% at the bottom all the way to 69% at Red Diamond. At the highest status, the effective edge falls to approximately 0.31%, among the lowest in the entire industry.

1%
Base House Edge
0.31%
Effective Edge · Red Diamond
69%
Max Rakeback

Rule of thumb: total rakeback is roughly the VIP Multiplier divided by 10. A 5x multiplier gets you about 50% rakeback. The 6.9x top tier gets you 69%.

VIP levels

Higher XP unlocks higher reward multipliers, which accelerate how quickly you earn rewards. One thing worth flagging: brackets are lower-inclusive, upper-exclusive, so 75 – 200 means 75 ≤ XP < 200. Here's the full ladder, all 28 statuses:

VIP LevelXP BracketMultiplier
Bronze I0 – 750.5x
Bronze II75 – 2000.55x
Bronze III200 – 4000.6x
Bronze IV400 – 7500.65x
Bronze V750 – 1,5000.7x
Silver I1,500 – 2,2500.75x
Silver II2,250 – 3,7500.8x
Silver III3,750 – 6,0000.85x
Silver IV6,000 – 10,0000.9x
Silver V10,000 – 20,0000.95x
Gold I20,000 – 30,0001x
Gold II30,000 – 45,0001.1x
Gold III45,000 – 65,0001.2x
Gold IV65,000 – 100,0001.3x
Gold V100,000 – 200,0001.4x
Platinum I200,000 – 300,0001.5x
Platinum II300,000 – 500,0001.75x
Platinum III500,000 – 750,0002x
Platinum IV750,000 – 1,250,0002.25x
Platinum V1,250,000 – 2,500,0002.5x
Diamond I2,500,000 – 5,000,0003x
Diamond II5,000,000 – 10,000,0003.5x
Diamond III10,000,000 – 25,000,0004x
Diamond IV25,000,000 – 50,000,0004.5x
Diamond V50,000,000 – 100,000,0005x
Green Diamond100,000,000 – 250,000,0005.5x
Blue Diamond250,000,000 – 1,000,000,0006x
Red Diamond1,000,000,000+6.9x

XP calculation

XP is a function of the rake you generate, scaled by your VIP multiplier and any temporary boost:

rake = (1 - RTP / 100) * volume_wagered
XP   = rake * VIP_multiplier * 2500 * temporary_boost
( 2,500 XP = 1 $HYPE of rake )

Rake is measured in $HYPE; the VIP multiplier corresponds to your current level; the temporary boost is an occasional multiplier earned randomly in certain games.

Rewards distribution

Rewards are computed as rake × VIP_multiplier / 10 and split across seven streams:

StreamShareDetails
Instant Claim35%$HYPE, immediately claimable
Rankup Bonus20%gHYPE, claimable on reaching a new VIP rank
Daily Bonus18%$HYPE, claimable at 00:00 UTC daily
Weekly Bonus5%$HYPE, claimable Mondays 00:00 UTC
Monthly Bonus2%$HYPE, claimable on the 1st of each month
Lottery Tickets10%Claimable Mondays 00:00 UTC
Emergency Fund10%$HYPE for players running under EV
Emergency Fund
The Emergency Fund rewards players who run under expected value. To prevent exploitation, it has a 0.5% probability of becoming claimable each hour rather than being available on demand.

Temporary boosts

Some games award temporary boosts that multiply XP earned for a limited window. Each qualifying bet has a small chance to trigger one.

Wheel: 0.5% per spin

Short (15 min, 3x, 20%) · Medium (30 min, 2x, 30%) · Long (45 min, 1.5x, 50%)

Plinko: 0.05% per ball

Short (5 min, 3x, 20%) · Medium (10 min, 2x, 30%) · Long (15 min, 1.5x, 50%)

gHYPE

gHYPE is a non-transferable, bet-only reward token: the on-chain equivalent of a Web2 no-deposit bonus. It lets players bet and win risk-free, and converts to $HYPE once a betting-volume requirement is met. You never buy gHYPE. You receive it.

How you receive gHYPE

Airdrops

gHYPE is distributed as part of promotional campaigns and through the VIP rewards system (the Rankup Bonus). It arrives directly in your account.

gHYPE Vault

Stake $HYPE in the gHYPE Vault to farm gHYPE over time, on top of any promotional airdrops.

Redeeming gHYPE for $HYPE

gHYPE becomes redeemable once you meet a wagering requirement tied to the amount you received:

1

Generate 20× betting volume

You must wager 20 times the gHYPE you were given. Receive 100 gHYPE → place 2,000 gHYPE in bets to unlock it. Each airdrop chunk clears its requirement independently.

2

gHYPE is burned

When the requirement is met, your gHYPE is burned and an equivalent amount of $HYPE is credited to your wallet.

3

Capped at 15× your airdrop

Redeemed $HYPE is capped at 15× the original airdropped amount. You keep your winnings up to that ceiling.

What you can do with gHYPE

  • Bet in games. Every gHYPE bet counts toward your volume requirement and reduces your gHYPE balance.
  • Earn VIP progress. gHYPE bets contribute to the VIP System progress bar and earn VIP points just like $HYPE bets.
  • Redeem for $HYPE. Once the volume requirement is cleared, convert via the redemption feature.

Why gHYPE is non-transferable

gHYPE cannot be sent between wallets. This is deliberate: it prevents players from shuffling tokens across accounts to artificially satisfy the betting-volume requirement. The token only has meaning in the hands of the player who received it.

Security & Limits
Only authorized games can mint or burn gHYPE, and only the official distribution channels can hand it out. A daily redemption stop-loss limits how much gHYPE can convert to $HYPE in any 24-hour window, protecting the platform against black-swan events.

FAQ

How do I get gHYPE?

Through promotional campaigns and the VIP rewards system, and by staking $HYPE in the gHYPE Vault.

Can I sell or transfer it?

No. gHYPE is non-transferable and cannot be sold or sent to another wallet.

What if I don't meet the volume requirement?

You keep playing with it, but it won't convert to $HYPE until the 20× wagering requirement is cleared.

Referral System

Affiliates earn $HYPE based on the activity of the players they bring in. Grab a code from the "Refer & Earn" menu, share it, and earn a transparent share of your referred players' net revenue. Bring in real volume, and a monthly boost stacks on top.

How affiliate earnings are calculated

Affiliates are paid in $HYPE, on the net revenue (rake minus rewards) their players produce:

Affiliate $HYPE = (Rake - Rewards) × (Affiliate Tier % + Affiliate Boost %)

Rake and Rewards are the same figures defined on the VIP System page. The percentage you earn is the sum of your tier rate and any active monthly boost.

Affiliate tiers

Your tier rate scales with the net revenue (Rake − Rewards) your active players generate. One thing worth flagging: brackets are lower-inclusive, upper-exclusive, so 200 – 400 means 200 ≤ x < 400.

Active Player Net Revenue (Rake − Rewards)Tier Rate
0 – 200 $HYPE10%
200 – 400 $HYPE15%
400 – 800 $HYPE20%
800 – 2,000 $HYPE30%
2,000 $HYPE+40%

Monthly boosts

There's a boost on top of your tier rate, too, tied to how many new active players you bring in during a calendar month. It resets every month and recalculates fresh off that month's count:

New Active Players Referred / MonthBoost
20 – 5010%
50 – 10020%
100+25%
Worked Example
Say you're at the 20% tier and refer 60 new active players in a month. That earns a 20% boost, so you'd take home 40% combined of your players' net revenue (Rake − Rewards) for the month. Come next month, the boost resets and gets recalculated from scratch.

API Integration Guide

The full spec lives in openapi.json. It's generated straight from the backend's own live routes and never hand-edited. This page is the plain-English tour: getting started, how auth works, a full worked example. It only covers the player and betting API. A separate, internal API exists for the proving service to talk to the backend, but that's not one you'll ever call directly.

Base URL

https://api.hypergamble.bet

Authentication

Every call to the Player API needs two things:

Authorization
Bearer <token>
x-player-address
0x..., the player address the request acts on behalf of

In sandbox, the token is shared. We issue it to you along with your sandbox credentials, and it has to be paired with the x-player-address header naming the address you're acting as. Production works differently: the token is a JWT tied to one specific player address, and the team handles how that gets issued for your integration. Here's the part that trips people up. The server trusts the address baked into the JWT itself, not the header, so your header still has to match it exactly.

Every response comes back as JSON. Errors all share one shape, and status codes stay boring on purpose: 400 for validation problems, 401 for missing or bad auth, 402 for insufficient funds, 403 for forbidden (an address mismatch, say), 404 for not found, 409 for a conflict, 412 for a failed precondition, 429 when you're rate limited.

Two ways to place a bet

There are two completely separate ways to place a bet today, and they're not interchangeable. A bet placed one way gives you nothing the other way can use.

The round flow

POST /games/{gameId}/rounds → reveal. Described below. This is the path that actually produces an outcome, a payout, and the randomness data behind it. It's authenticated through your session (the token and address above) plus a commit-reveal secret, not a signed message.

The signed bet-intent flow

POST /games/{gameId}/intents. A cryptographically signed message that debits your balance and relays a transaction on-chain on your behalf. Handy if you'd rather hand over a signed, self-contained bet object than keep a live authenticated call open. This one skips the round, randomness, and settlement flow entirely, so a bet placed this way produces no outcome or payout today. Covered in the EIP-712 signing guide.

The round flow is what you want for an actual outcome and payout. The bet-intent flow suits a different case: backing a bet with an offline signature instead of keeping a live session open. See How to Verify a Bet to check any round's outcome and payout yourself, independently, using nothing but public data.

Worked example: round flow, start to finish

Every request below assumes the headers from Authentication above. They're left out here just to keep things short.

1

Get play-money chips (sandbox only)

POST /faucet/claim

Mints your address a batch of play-money chips, once per address. It needs a separate claim credential from the platform, not your regular session token. That's deliberate: it keeps the faucet from being farmed automatically. Ask the team for a sandbox claim credential if you're integrating against a test environment.

2

Get your next round counter

GET /players/{address}/next-counter

Returns the next roundCounter value for your address. A running counter is kept per player as part of the commit-reveal setup, and every new round has to use the next value in that sequence.

3

Compute your commitment hash

POST /commitment/hash
{
  "playerNonce": ["<your secret nonce, as one or more numeric strings>"],
  "betParams": ["<bet-type-specific parameters, numeric strings>"],
  "roundCounter": <the value from step 2>
}

Returns cPlayer: a hash that locks in your secret nonce, bet parameters, and round counter without revealing any of them. Keep the nonce secret. You reveal it in step 5.

4

Place the round

POST /games/{gameId}/rounds
{
  "betId": "<a unique id you generate, 8-128 chars>",
  "roundCounter": <same value as step 2/3>,
  "cPlayer": "<from step 3>",
  "betAmount": "<stake, as a numeric string, in base chip units>",
  "betParams": ["<same values as step 3's betParams>"],
  "stakeProvenance": "play" | "withdrawable",
  "betTypeId": "<from GET /games/{gameId}/rtp>"
}

The randomness input for this round gets worked out on our side, from fields already in this request. You don't supply it yourself. Try sending an alphaHex field, and the request gets rejected outright.

This returns the newly created round, sitting in awaiting_vrf state. It moves to awaiting_reveal once the house's randomness draw lands, which happens automatically and fast. You don't need to poll for it before moving on to reveal.

5

Reveal

POST /games/{gameId}/rounds/{betId}/reveal
{
  "playerNonce": ["<the secret nonce from step 3, now revealed>"]
}

This is the step where the outcome resolves and your balance gets credited. Both happen together, in the same response. You get your result and your updated balance right away. The cryptographic proof backing it up attaches a little later, in the background.

6

Check the bet

GET /bet/{betId}

Pulls the round's full status: outcome, cTable (the published payout-table fingerprint), vrfOutputHex, and the proof's status once it's attached.

Stake provenance
stakeProvenance has no default, on purpose. You always have to say explicitly whether the stake comes out of your play-money (faucet) balance or your withdrawable (deposit-backed) balance. That's a deliberate safety rule: play-money chips can never accidentally end up funding something a real withdrawal could later pay out.

Other useful endpoints

EndpointDescription
GET /games / GET /games/{gameId}/rtpPublic, no login needed. Lists every game and its published payout tables.
GET /accounts/{address}/balance / GET /players/{address}/balanceYour current balance, broken down by lifecycle bucket (available/pending/locked) and by source (play or withdrawable).
GET /players/{address}/roundsYour betting history.
POST /player/withdrawals / GET /player/withdrawals/{withdrawalId}The withdrawal flow for your withdrawable balance.
GET /deposits/intent / GET /deposits/statusDeposit instructions and live status while you're waiting on one.
GET /leaderboard / GET /leaderboard/meThe weekly money-based leaderboard.

EIP-712 Signing Guide

This is one of two ways to place a bet on Hypergamble. See the API integration guide for how it compares to the round flow, and read that comparison first if you haven't. A bet placed this way skips the round flow entirely, so it produces no outcome and no payout. What it's for instead: backing a bet with a portable, offline signature rather than keeping a live authenticated session open. Relaying on a player's behalf without them needing gas or switching networks is the clearest example.

The typed data

{
  "domain": {
    "name": "HyperL2BetIntent",
    "version": "1",
    "chainId": "<runtime: appchain chainId, e.g. 4287>",
    "verifyingContract": "<runtime: deployed verifier address>"
  },
  "primaryType": "BetIntent",
  "types": {
    "BetIntent": [
      { "name": "player", "type": "address" },
      { "name": "gameId", "type": "string" },
      { "name": "betTypeId", "type": "string" },
      { "name": "numOutcomes", "type": "uint32" },
      { "name": "choice", "type": "uint32" },
      { "name": "stake", "type": "uint256" },
      { "name": "bucket", "type": "string" },
      { "name": "provenance", "type": "string" },
      { "name": "nonce", "type": "uint64" },
      { "name": "deadline", "type": "uint64" },
      { "name": "chainId", "type": "uint64" }
    ]
  }
}
Note
chainId and verifyingContract in the domain are just placeholders in the generated file. Real values get filled in per environment. Ask the team for the actual appchain chainId and deployed verifier address for whichever environment you're integrating against, and don't hardcode the example values on this page into anything real.

Field notes

player
Has to be the address that signs the message. The backend rejects a valid signature if it comes from a different address than whoever's actually logged in. You can't sign on someone else's behalf through this endpoint.
bucket
Must be "available". Signing an intent against pending or locked funds gets rejected before it ever reaches the part of the system that actually debits your balance.
provenance
"play" or "withdrawable", same meaning as stakeProvenance in the round flow: which balance the stake is drawn from.
nonce
Your own per-player counter for these intents. Reusing an already-used nonce, or sending a mismatched signature for one that's already gone through, gets rejected. A genuine retry of the exact same signed intent is safe, though. You'll just get the original result back instead of it being processed twice.
deadline
A unix timestamp; the intent is rejected once it's expired.
numOutcomes / choice
Checked against the game's actual published bet type at the moment you submit, not just trusted from what you signed. A signed intent against a bet type that's since changed shape gets rejected.

Worked example

The fixture below is a real signed message, produced from the exact values it contains. Use it to check that your own signing code reproduces the same signature before you wire it into anything unattended.

{
  "domain": {
    "name": "HyperL2BetIntent",
    "version": "1",
    "chainId": 4287,
    "verifyingContract": "0x0000000000000000000000000000000000000000"
  },
  "primaryType": "BetIntent",
  "message": {
    "player": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
    "gameId": "dice",
    "betTypeId": "over",
    "numOutcomes": 6,
    "choice": 3,
    "stake": "1000000000000000000",
    "bucket": "available",
    "provenance": "play",
    "nonce": 1,
    "deadline": 9999999999,
    "chainId": 4287
  },
  "expectedSigner": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
  "signature": "0x38f3f431299a911428cbf60e5348ddc7db27b41dd4ca02ab7f12f5f0a89e6afe185b79043f1a9550ecf3637be68b3407c51312fc169ce1465acb4c4928a5e1eb1c"
}

verifyingContract here is the zero address. That's a test-fixture value, not a real deployed contract. Swap in the real one for your environment, per Field notes above.

Submitting the signed intent

POST /games/{gameId}/intents
Authorization: Bearer <token>
x-player-address: 0x...   (must equal message.player)

{
  "intent": { ...the message object above... },
  "signature": "0x..."
}

A successful response looks like this:

{
  "betId": "<internal record id>",
  "relayTxHash": "<the on-chain transaction hash the relay submitted>",
  "idempotent": false
}
Idempotency
idempotent: true means this exact signed intent already went through once before. You're getting the original result back, not a second processing of it. That makes it safe to retry after a network timeout: resend the same signed payload, and either it goes through once, or you find out it already did.
Not the round flow's betId
One thing worth flagging: the betId in this response is just an internal identifier for this bet-intent record. It's not the same kind of betId the round flow uses, and GET /bet/{betId} won't resolve it to a round with an outcome. Need a bet you can independently verify? Use the round flow from the API integration guide instead.

How to Verify a Bet Was Fair

How to independently confirm a bet's outcome and payout, using nothing but public artifacts and open-source code you can read and run yourself. Not by trusting Hypergamble's own claim about what happened.

This applies to bets placed through the round flow (POST /games/{gameId}/rounds → reveal), described in the API integration guide. It does not apply to bets placed through the EIP-712 signed bet-intent flow. That flow doesn't produce the VRF, outcome, and payout artifacts this page verifies. See the API guide's comparison of the two flows if you're not sure which one you used.

What's actually being checked

Three independent things, all reproducible from public data:

1. Outcome matches the VRF

The drawn outcome is a deterministic function of the house's published VRF output for your bet. You recompute that function yourself and compare.

2. Payout matches the table

Every bet type publishes a Merkle root (cTable) over its full payout table. You reconstruct the root from the table and confirm your payout is the leaf for the outcome that was drawn, not a table that was quietly different at settlement time.

3. Signature authenticity

Only relevant if you're separately checking a signed bet-intent's authenticity rather than a round's outcome. See signature-only verification below.

You don't have to trust a Hypergamble API response as ground truth for any of this. The verification logic recomputes each of the three from primitives (the published RTP table, a VRF beta, an EIP-712 message), using the same open-source package regardless of where the bet came from.

Verification is source-agnostic; artifact-fetching isn't

The actual math doesn't care whose bet it is: recompute the outcome, check the payout leaf against the root, verify a signature. What differs between checking your own bet and checking someone else's comes down entirely to how you get the artifacts that feed it:

Your own bet
Fetch it via your own authenticated session (GET /bet/{betId}). Walked through below.
Someone else's bet
Fetch it via the public explorer instead. No login needed. See "Verifying any bet" at the bottom of this page.

The tool: hyperl2-verifier

hyperl2-verifier is a standalone package that does the recomputation above. It makes zero network calls and imports nothing from the Hypergamble backend. Pure functions in, a verdict out, so you can audit exactly what it does.

Install
The package isn't published to a registry yet. Install it directly from GitHub's main branch instead. The repository itself is the source of truth if anything here ever looks out of date:
pnpm add github:Chainreels/HyperL2Verifier#main

Self-verification, step by step

This is the path that works today: verifying a bet you placed yourself.

1

Place and reveal a bet

Follow the API integration guide's round-flow walkthrough through reveal. You now have a betId for a settled round.

2

Fetch your bet's artifacts

const roundJson = await fetch(`https://api.hypergamble.bet/bet/${betId}`, {
  headers: {
    authorization: `Bearer ${yourSessionToken}`,
    'x-player-address': yourAddress,
  },
}).then((r) => r.json());

Only the player who placed the bet can fetch it this way. That's the authenticated part.

3

Fetch the game's published payout table

const rtp = await fetch(`https://api.hypergamble.bet/games/${roundJson.gameId}/rtp`)
  .then((r) => r.json());

This one is public. No session needed. It's the same registry the bet's cTable was drawn from at bet-placement time.

4

Verify

import { verifyOutcomeAndPayout, type SettledBetArtifacts, type BetTypeAuditDetail } from 'hyperl2-verifier';

const round: SettledBetArtifacts = {
  betId: roundJson.betId,
  gameId: roundJson.gameId,
  betTypeId: roundJson.betTypeId,
  numOutcomes: roundJson.numOutcomes,
  cTable: roundJson.cTable,
  betAmount: roundJson.betAmount,
  vrfOutputHex: roundJson.vrfOutputHex,
  outcome: { result: roundJson.outcome.result, payout: roundJson.outcome.payout },
};

const betType: BetTypeAuditDetail | undefined = rtp.betTypes.find(
  (bt) => bt.betTypeId === round.betTypeId,
);
if (!betType) throw new Error(`bet type ${round.betTypeId} not found`);

const result = verifyOutcomeAndPayout(round, betType);
if (result.ok) {
  console.log(`Verified: outcome=${result.outcome} payout=${result.payout}`);
} else {
  // reason is one of: OUTCOME_MISMATCH, PAYOUT_MISMATCH, ROOT_MISMATCH,
  // BET_TYPE_ROOT_MISMATCH, LEAF_NOT_FOUND, BET_TYPE_MISMATCH
  console.error(`Verification failed: ${result.reason}`, result.expected, result.actual);
}

If result.ok is true, you've independently confirmed it: using only public data and open-source code, without trusting the API response as an assertion, that the outcome you were told matches the VRF, and the payout you received matches the published table for that outcome.

Bonus: checking a game's advertised RTP

Separately from any one bet, you can check whether a game's payout table actually pays out what it claims to, across the whole table. It's a registry-level check, not a per-bet one, and it's fully public too:

import { verifyClaimedRtp, type BetTypeAuditDetail } from 'hyperl2-verifier';

const rtp = await fetch('https://api.hypergamble.bet/games/dice/rtp').then((r) => r.json());
const betType = rtp.betTypes.find((bt) => bt.betTypeId === 'over');
if (!betType) throw new Error('bet type not found');

const result = verifyClaimedRtp(betType);
if (result.ok) {
  console.log(`Claimed ${result.claimedBps} bps, table actually pays ${result.computedBps} bps.`);
} else {
  console.error(`RTP claim rejected: claimed=${result.claimedBps} computed=${result.computedBps} tolerance=${result.toleranceBps}`);
}

Signature-only bet-intent verification

If you're checking a signed bet intent rather than a settled round's outcome (for example, confirming a relay is genuinely relaying what a player signed, before it's submitted), that's a separate, narrower check. It confirms authenticity of the message, not fairness of an outcome, since the bet-intent flow doesn't produce outcome artifacts at all (see the EIP-712 guide):

import { verifyBetIntentSignature } from 'hyperl2-verifier';

const result = await verifyBetIntentSignature({
  message: { /* the signed intent's message object */ },
  signature: '0x...',
  expectedChainId: 4287,
  verifyingContract: '0x...', // the deployed bet-intent verifier for your environment
});

if (result.ok) {
  console.log(`Signed by ${result.recoveredSigner}`);
} else {
  // reason is one of: CHAIN_ID_MISMATCH, INVALID_SIGNATURE, SIGNER_MISMATCH, EXPIRED
  console.error(`Signature verification failed: ${result.reason}`);
}

Verifying any bet

Everything above works because you're logged in as yourself, fetching your own bet. Checking a bet you didn't place, an auditor spot-checking random bets, a public explorer widget, anyone who isn't the player themselves, uses the exact same verifyOutcomeAndPayout call. It's just fed from a different, public source: the bet explorer.

1

Fetch the bet from the explorer

const explorerBet = await fetch(`https://api.hypergamble.bet/explorer/bets/${betId}`)
  .then((r) => r.json());

No login, no session token. This is a public, read-only endpoint. It only ever returns a bet once it's fully settled and proven; an unknown or not-yet-settled betId returns a 404, same as a nonexistent one, so a 404 here doesn't tell you which case you're in.

2

Fetch the game's published payout table

Same as the self-verification path above:

const rtp = await fetch(`https://api.hypergamble.bet/games/${explorerBet.gameId}/rtp`)
  .then((r) => r.json());
3

Map the explorer's shape onto the verifier's, and verify

The explorer's response nests fields differently than the authenticated GET /bet/{betId} shape used above. Same underlying data, different envelope, so the field names need mapping:

import { verifyOutcomeAndPayout, type SettledBetArtifacts, type BetTypeAuditDetail } from 'hyperl2-verifier';

const round: SettledBetArtifacts = {
  betId: explorerBet.betId,
  gameId: explorerBet.gameId,
  betTypeId: explorerBet.betTypeId,
  numOutcomes: explorerBet.bet.numOutcomes,
  cTable: explorerBet.commitments.payoutTableCommitment,
  betAmount: explorerBet.bet.amount,
  vrfOutputHex: explorerBet.vrf.output,
  outcome: { result: explorerBet.bet.outcome, payout: explorerBet.bet.payoutAmount },
};

const betType: BetTypeAuditDetail | undefined = rtp.betTypes.find(
  (bt) => bt.betTypeId === round.betTypeId,
);
if (!betType) throw new Error(`bet type ${round.betTypeId} not found`);

const result = verifyOutcomeAndPayout(round, betType);
if (result.ok) {
  console.log(`Verified: outcome=${result.outcome} payout=${result.payout}`);
} else {
  console.error(`Verification failed: ${result.reason}`, result.expected, result.actual);
}
Same verdict, same guarantees as checking your own bet. The only thing that changed is where the artifacts came from. The explorer also has GET /explorer/bets (a paginated feed of every recently settled bet across all players), GET /explorer/transactions/{txHash}, GET /explorer/rounds/{roundSeq}, and GET /explorer/players/{playerAddress}/bets for looking a bet up by transaction, round, or player history instead of by betId directly. Each returns the same artifact shape used above, just keyed differently.

Trust Assumption Registry

This is the honest list of what you still have to trust to use Hypergamble, and what you can check for yourself instead.

Contracts get one of four labels: Immutable (deployed with no way to ever change it), Upgradeable (admin) (an admin key can swap out its logic), Upgradeable (timelock) (same, but any change has to sit publicly visible for a delay before it takes effect, so nobody gets surprised by it), or Not yet deployed (built and merged, but not running anywhere live yet).

Every contract, at a glance

ContractWhat it doesTrust classification
L1Bridge (Ethereum)Holds your deposit and releases your withdrawalImmutable
GameContract (appchain)Mints chips only against a real, confirmed depositImmutable
Treasury (appchain)Tracks how much each game holds in reserveImmutable
GHypeA reward token you earn just from playing, can't be sent to anyone elseUpgradeable (admin)
PHGThe token used for leaderboard and Genesis-season reward claimsUpgradeable (admin)
RewardsDistributorPays out every reward stream (VIP/XP, referrals, leaderboard, and more)Upgradeable (timelock)
HyperEvmEscrowA future bridge for rewards coming from a second chainNot yet deployed
The three upgradeable contracts above were fixed to close a real gap found before they shipped: without the fix, anyone could have taken over the raw contract and used its upgrade path to run their own code in its place. That's closed now.

Everything else you're trusting

A few things aren't contracts at all, so the table above doesn't cover them. Here's what's actually going on with each, in plain terms:

Your bet's outcome wasn't picked after the fact
You lock in a secret value before the house reveals its random draw, so the house's draw is fixed before it could possibly know what you committed to. You can check this yourself; the fairness how-to walks you through recomputing the outcome and comparing it.
Your payout wasn't quietly changed after you bet
Every payout table is fingerprinted before your bet is ever placed. You can check this yourself too. The fairness how-to shows you how to confirm your payout really matches that fingerprint.
The house's randomness key hasn't been misused
It's kept in a secure vault and never handled as plain, readable text. This is a promise about how the key is handled, not something you can check yourself yet.
One random draw isn't secretly reused across many bets
Today, every round gets its own draw. A way to lock a whole batch of rounds to one shared draw already exists and has been tested, but it isn't switched on for real bets yet.
A settled bet's proof will actually show up
Your bet pays out the instant you reveal. The proof behind it attaches a little afterward. If it ever fails to generate, the team is automatically alerted, so it can't just quietly go missing.
The proof really matches what you were paid
It's a real cryptographic proof. There isn't a public tool yet for checking one against your own bet.
A withdrawal's proof is checked against the right balance
This uses a simpler proof format for now, not the full version. It's real and checked on-chain, but there's no public tool yet for rebuilding your own withdrawal proof the way there is for a payout.

If Hypergamble ever disappears

This is the backstop for "what if Hypergamble stops responding, or won't process my withdrawal." You can exit entirely on your own, against a balance snapshot the team already published, and nobody has to approve it in the moment.

The math behind it is solid
A real proof, checked directly by the contract. Nothing to trust here.
The published balance snapshot itself is a promise, not a proof
A dishonest team could under-report the numbers. The safety net: anyone can submit real proof of a wrong number and force the contract to correct it, and there's a 12-hour window before a snapshot can be used at all, giving time for someone to catch a bad one. That safety net only works if someone is actually watching during that window, though.
You can't get paid twice
Not once through this emergency exit and again through a normal withdrawal. Two separate checks enforce this today. One gap: Hypergamble's own withdrawal process doesn't check for this ahead of time. It currently relies on the contract itself blocking the attempt.
The team can't quietly keep this shut while looking fine from the outside
Blocking a snapshot costs something every time, so it can't be done forever just to stall. This is enforced on-chain today.

Who holds which keys

House randomness key
Generates the house's side of every bet's random draw. Kept in a secure vault, only ever loaded at startup, never stored as plain readable text.
Appchain wallet key
Signs appchain transactions (minting/burning chips). Held by the Hypergamble backend.
Ethereum withdrawal key
Signs withdrawal releases on Ethereum. A completely separate key from the appchain one, so one being compromised doesn't put the other at risk too.
VRF oracle key
Runs the randomness oracle. Held by the proving service.