$GLIZZY

how it works

contents
  1. contest
  2. bands
  3. your number
  4. the hidden number
  5. scoring
  6. winners
  7. ties
  8. odds
  9. rules and strategies
  10. split
  11. reserve
  12. staking
  13. hash chain
  14. publication timing
  15. settlement
  16. verification
  17. house seats
  18. operator constraints

Contest

A contest opens every 10 minutes on a fixed grid.

Slot10 minutes
Entry window8 minutes
Run90 seconds
Hotdogs30, one every 3 seconds
Minimum field4
Maximum field100
Entries per address1

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.

BandRangeShare of winners’ sliceSurvival
Nibble1–1010%99.3%
Eat11–2030%87.4%
Feast21–3060%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

The hidden number

An integer 1–30 assigned per player per contest. Not visible to the player, not influenceable by any party.

It is the maximum of three independent draws of 1–30 taken from a single hash.

h = keccak256(link, playerValue, contestId, player, "hidden")
best = max( (h >> 0)  % 30 + 1,
            (h >> 64) % 30 + 1,
            (h >> 128)% 30 + 1 )

Distribution: P(hidden ≥ c) = 1 − ((c−1)/30)³

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 bandNibbleEatFeast
40.25000.24990.2241
80.12500.12500.1237
120.08330.08330.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 1589.8%
hidden is at least 2170.4%
hidden is at least 2548.8%
hidden is 309.7%

A number drawn from the top of the range is the one most likely to exceed it.

Survival

BandRangeShareSurvival
Nibble1–1010%99.3%
Eat11–2030%87.4%
Feast21–3060%43.3%

Odds

One player wins each band. P(win) = [1 − (1−p)ⁿ] / n.

Entrants in bandNibbleEatFeast
40.25000.24990.2241
80.12500.12500.1237
120.08330.08330.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:

Winners80%
Carry to next Main Event10%
Burned5%
Reserve2.5%
Creator2.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.

Release1% of remaining balance per day
Distributionsplit across that day’s 12 Main Events
Inflow2.5% of every pot

No withdrawal function. No rescue path. Tokens leave only as payouts.

Equilibrium balance = daily pot volume × 2.5.

Staking

Minimum stake100,000 $GLIZZY
Eligibility age1 hour
Lockupnone

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])
Depth250,000
Headpublished at deploy
Consumptionone link per contest, backwards
Publicationat 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:

FieldRollerMain Event
6201k—
11226k300k
19300k—

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:

  • 0xe297fd0b2efb60a73620beaecc3ac1c9bd4f7a1f
  • 0x2d9a14c9aa3ae91f6f4f15ed417f57ca5cb9c8e1
  • 0x15e02b408cf0492c8d47cc3fb9a1a8b9126e2d16
  • 0x6cc2169433943cbafbb051fef8d0e21671be7acd
  • 0x508be84cf037a207bb779a3e9d7d0aaf22ae906e
  • 0x9a62fe68cf5c4eaa9dcfa3a0bff44b09bde09ca1
  • 0xea3cdb9093edda39206d339a95f08f2a3066660c
  • 0xdbcc36ad3700dbcf8d29259b5875ca338350dd34
  • 0x77ddc73babbdac068a43a41e337fd564a20dbd7b
  • 0x2354ca4ae574e743f0f871324573325e0c2cfdfe
  • 0xd645dbb4d8f71e86fec5849cadfbf567fc4e2c99
  • 0x9ba54bf4cf715727e0f42d63d3c661c06157c601
  • 0xf7cb2fadd219e769ef1258491998a3213836864a
  • 0x6f3fcebc83a40a4819eab7a25e9d95f6d59396ca
  • 0xb36408ffd2cd3c6c5cbf0e456e6dcc1d0b34021e
  • 0x0e7a883f0b8f2c0afb74e297f6548dd52a633324
  • 0xb60dad7532425977d0ffa05d401622ad58fd51ca
  • 0x60e9fd90c79972c72cc09628a856eaee6234ce16
  • 0xddcc59c3ad006c80eb31afae13c9f5dd0c63ff26
  • 0x469d6c5136575ab5d2df468f1b409dca98b9bb2f

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.