Contest
A contest opens every 10 minutes on a fixed grid.
| Slot | 10 minutes |
| Entry window | 8 minutes |
| Run | 90 seconds |
| Hotdogs | 30, one every 3 seconds |
| Minimum field | 4 |
| Maximum field | 100 |
| Entries per address | 1 |
Below 4 entrants the contest is voided and all entry fees are refunded.
Every 12th contest is a Main Event. Main Events additionally receive the daily Reserve release and the accumulated carry.
Bands
Entry requires choosing one of three bands. The band determines the range your number is drawn from.
| Band | Range | Share of winners’ slice | Survival |
|---|---|---|---|
| Nibble | 1–10 | 10% | 99.3% |
| Eat | 11–20 | 30% | 87.4% |
| Feast | 21–30 | 60% | 43.3% |
Survival is the probability that a number drawn from that range does not exceed the hidden number.
Your number
Drawn at entry from the band’s range. Not chosen by the player.
call = keccak256(link, playerValue, contestId, player, "call") % 10
+ band * 10 + 1
Scoring
score = call <= hidden ? call : 0
A player whose number exceeds their hidden number scores zero and receives nothing.
Winners
Three per contest: the highest non-zero score in each band.
If a band has no non-zero score, its share is not paid. It accumulates in bandRollover[band] and is added to the same band in the next contest. It accumulates indefinitely until won.
Ties
Resolved by a rank derived from the same chain link.
rank = keccak256(link, contestId, "tiebreak", player)
Lowest rank among tied top scorers wins. Independent of transaction ordering.
Odds
One player wins each band. Before the draw all entrants in a band are exchangeable.
P(win) = [1 − (1−p)ⁿ] / n, where p is the band’s survival rate and n the number of entrants in it.
| Entrants in band | Nibble | Eat | Feast |
|---|---|---|---|
| 4 | 0.2500 | 0.2499 | 0.2241 |
| 8 | 0.1250 | 0.1250 | 0.1237 |
| 12 | 0.0833 | 0.0833 | 0.0832 |
Above roughly 8 entrants, 1/n dominates and survival rate is negligible. Feast pays 6× nibble for approximately equal probability of winning.
Live band counts are published before entry closes. Simulated over 200 players each entering the highest-expected-value band, the field converges to 10/30/60 with 0.0% spread in expected value across the three.
Rules and strategies
Everything on this page is derived from the contract. No part of it is advice.
The hidden number
Three independent draws of 1–30, highest kept. One draw would average 15.5. Best of three averages 23.0, with a median of 24.
| hidden is at least 15 | 89.8% |
| hidden is at least 21 | 70.4% |
| hidden is at least 25 | 48.8% |
| hidden is 30 | 9.7% |
A number drawn from the top of the range is the one most likely to exceed it.
Survival
| Band | Range | Share | Survival |
|---|---|---|---|
| Nibble | 1–10 | 10% | 99.3% |
| Eat | 11–20 | 30% | 87.4% |
| Feast | 21–30 | 60% | 43.3% |
Odds
One player wins each band. P(win) = [1 − (1−p)ⁿ] / n.
| Entrants in band | Nibble | Eat | Feast |
|---|---|---|---|
| 4 | 0.2500 | 0.2499 | 0.2241 |
| 8 | 0.1250 | 0.1250 | 0.1237 |
| 12 | 0.0833 | 0.0833 | 0.0832 |
Past roughly 8 entrants in a band, 1/n dominates and survival rate stops mattering: every band is within 1% of every other. Feast pays 6× nibble for those odds.
Where the field settles
Expected value is a band’s share divided by the number of entrants in it. Equal value across the three requires entrants in the same proportion as the shares, which is 10/30/60. Simulated over 200 players each entering the highest-value band, the field converges there with 0.0% spread.
A band’s value rises as its count falls, and the counts are published before entry closes.
Rollovers
A band with no survivor pays nobody. Its share accumulates and is added to the same band in the next contest, and keeps accumulating until it is won. The next winner of that band takes their share of the new pot plus everything stacked behind it.
Main Events
Every 12th contest. The same 90 seconds and the same 30 hotdogs. It additionally receives the accumulated carry — 10% of every pot since the last one — and that day’s Reserve release, which is 1% of the Reserve split across the day’s 12 Main Events.
Short fields
Below 4 entrants the contest is voided and every entry fee is refunded.
The stake
100,000 $GLIZZY, live one hour after it is staked. It is a credential: it is not consumed by entry and not lost on a loss, and it can be taken back at any time except while an entered contest is unsettled.
House seats
Twenty wallets run by the creator enter contests to keep fields above the minimum. They pay the same fee and get the same numbers, and they cannot read the fairness chain. The addresses are listed under house seats.
Split
Of every pot:
| Winners | 80% |
| Carry to next Main Event | 10% |
| Burned | 5% |
| Reserve | 2.5% |
| Creator | 2.5% |
The winners’ 80% divides:
share[uint8(Band.Feast)] = (winnerSlice * PCT_FEAST) / 100; share[uint8(Band.Eat)] = (winnerSlice * PCT_EAT) / 100; share[uint8(Band.Nibble)] = winnerSlice - share[uint8(Band.Feast)] - share[uint8(Band.Eat)];
Nibble takes the remainder, so no value is lost to integer division.
Burn, carry, Reserve and creator are taken on any contest that runs, including one where no band produces a winner.
All five percentages are contract constants. No function exists to modify them.
Reserve
60,000,000 $GLIZZY, transferred to the game contract at deploy in a single public transaction.
| Release | 1% of remaining balance per day |
| Distribution | split across that day’s 12 Main Events |
| Inflow | 2.5% of every pot |
No withdrawal function. No rescue path. Tokens leave only as payouts.
Equilibrium balance = daily pot volume × 2.5.
Staking
| Minimum stake | 100,000 $GLIZZY |
| Eligibility age | 1 hour |
| Lockup | none |
Staking is a credential. It is not consumed by entry and not lost on a loss.
Unstaking is immediate and unconditional, except while the address is entered in a contest that has not settled.
The eligibility age prevents one holding from qualifying multiple addresses in sequence. Ten entries requires 1,000,000 staked across ten addresses, each held one hour.
Hash chain
Generated before deploy.
link[n] = keccak256(link[n+1])
| Depth | 250,000 |
| Head | published at deploy |
| Consumption | one link per contest, backwards |
| Publication | at the bell, when entry closes |
if (keccak256(abi.encodePacked(link)) != head) revert BadLink();
Any published link hashes to the previous one. This proves the link was fixed before the contest and was not selected after entries were known.
At 144 contests per day the chain lasts 4.76 years.
Publication timing
Both derived values depend only on the link and the player value committed at entry. After entry closes no party can act on knowledge of either. The link is therefore published at the bell rather than after the run.
The 90-second run renders a result already determined on chain.
Settlement
finishContest(contestId) is public. The caller receives a reward from the carry slice.
Settlement does not depend on any party being online. No operator function exists to withhold a result.
Measured gas at 0.0343 gwei:
| Field | Roller | Main Event |
|---|---|---|
| 6 | 201k | — |
| 11 | 226k | 300k |
| 19 | 300k | — |
Verification
Every result is recomputable from published data: the link, the contest ID, each player’s address and committed value.
The verifier at verify.glizzy.wtf is a static page with no dependency on this site. It reads the contract directly.
House seats
Twenty wallets, run by the creator, enter contests to keep the field above the minimum of four. Below four a contest is voided and every entry fee is refunded, which is correct and is a poor first contest for the one person who turned up.
They have no advantage. They pay the same entry fee, their number and their hidden number come off the same link by the same arithmetic, and the value they bring is 32 bytes of platform randomness like anybody else's. They cannot read the fairness chain: the daemon that runs them is started without the path to it, and a check in the build fails if that changes or if the daemon so much as names the file.
They stand down when real entrants alone would carry a contest, and each one sits some contests out, so the field is not the same size every time.
The twenty, in full:
0xe297fd0b2efb60a73620beaecc3ac1c9bd4f7a1f0x2d9a14c9aa3ae91f6f4f15ed417f57ca5cb9c8e10x15e02b408cf0492c8d47cc3fb9a1a8b9126e2d160x6cc2169433943cbafbb051fef8d0e21671be7acd0x508be84cf037a207bb779a3e9d7d0aaf22ae906e0x9a62fe68cf5c4eaa9dcfa3a0bff44b09bde09ca10xea3cdb9093edda39206d339a95f08f2a3066660c0xdbcc36ad3700dbcf8d29259b5875ca338350dd340x77ddc73babbdac068a43a41e337fd564a20dbd7b0x2354ca4ae574e743f0f871324573325e0c2cfdfe0xd645dbb4d8f71e86fec5849cadfbf567fc4e2c990x9ba54bf4cf715727e0f42d63d3c661c06157c6010xf7cb2fadd219e769ef1258491998a3213836864a0x6f3fcebc83a40a4819eab7a25e9d95f6d59396ca0xb36408ffd2cd3c6c5cbf0e456e6dcc1d0b34021e0x0e7a883f0b8f2c0afb74e297f6548dd52a6333240xb60dad7532425977d0ffa05d401622ad58fd51ca0x60e9fd90c79972c72cc09628a856eaee6234ce160xddcc59c3ad006c80eb31afae13c9f5dd0c63ff260x469d6c5136575ab5d2df468f1b409dca98b9bb2f
Operator constraints
Cannot: modify the split, modify any player’s numbers, select which link a contest receives, select a winner, withdraw from a pot, prevent settlement.
Can: withhold a link. A contest with no published link cannot settle. If the link is not published within 60 minutes of the bell, any address may void the contest, which refunds all entry fees. The count of voided contests is published below.
Knows every number in advance, by virtue of holding the chain. This is inherent to the construction. The creator address is barred from entering in the contract. This constraint does not extend to any other address the creator may control.
- contests voided
- reading the chain
Read from totalVoided() when this page loads. Nobody types this number in.