> For the complete documentation index, see [llms.txt](https://docs.overtime.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.overtime.io/overtime-casino/games/quick-games/keno.md).

# Keno

Pick up to 10 numbers from a pool of 80, watch 20 get drawn, and get paid on how many you matched. An ancient lottery game with a fully onchain, verifiable draw.

***

### How it works

1. You pick between **1 and 10 numbers** from the pool of 80, and place your bet
2. The contract reserves the worst-case payout and requests one random word from Chainlink VRF
3. On fulfillment, the contract draws **20 unique numbers** from the 80 using a partial Fisher-Yates shuffle seeded entirely by that one random word
4. Your payout is `bet × paytable[picks][hits]`, where `hits` is how many of your picked numbers appeared in the 20 drawn

A single 256-bit random word carries enough entropy to perform all 20 draws — the contract slices the word into chunks (16 bits per swap) and re-hashes once partway through to complete the shuffle. The draw is uniform and unbiased; the bias on any individual swap is under 0.04%.

Your picks and the drawn numbers are both stored as compact bitmasks, so the entire game state — what you picked, what came up, how many you hit - is on-chain and verifiable.

***

### Payouts

Keno's payout depends on **how many numbers you picked** and **how many you hit**. More picks means each individual hit is rarer, so the multipliers climb steeply. Each pick count has its own paytable.

Default top-end payouts (multiplier on bet) by pick count:

| Picks | Hit all? | Top multiplier | Approx. RTP |
| ----- | -------- | -------------- | ----------- |
| 1     | 1/1      | 3.92×          | 98.0%       |
| 2     | 2/2      | 10×            | 98.1%       |
| 3     | 3/3      | 50×            | 97.1%       |
| 4     | 4/4      | 80×            | 97.7%       |
| 5     | 5/5      | 80×            | 97.3%       |
| 6     | 6/6      | 100×           | 97.9%       |
| 7     | 7/7      | 250×           | \~97%       |
| 8     | 8/8      | 300×           | \~97.8%     |
| 9     | 9/9      | 300×           | \~97.6%     |
| 10    | 10/10    | 300×           | \~97%       |

Lower hit counts on higher pick selections pay smaller multiples, and the very lowest hit counts pay nothing - the paytables are calibrated so most of the return comes from the middle of the range (3–6 hits), where the probability actually lives.

All multipliers are hard-capped at **300×**. Hitting all 10 of a Pick-10 is astronomically rare (probability ≈ 1.12 × 10⁻⁷), so the cap barely affects the real RTP - the bulk of expected value sits in the common outcomes.

Every paytable is calibrated to a house edge in the **1.9% to 3.1%** range per pick count, and you can read each one off-chain (`getPaytable(picks)`) to verify it yourself.

***

### Limits

| Parameter          | Value                                  |
| ------------------ | -------------------------------------- |
| Minimum bet        | 3 USD (configurable per game via core) |
| Pool size          | 80 numbers                             |
| Numbers drawn      | 20                                     |
| Picks per bet      | 1 to 10                                |
| Maximum multiplier | 300× (hard cap)                        |
| House edge         | \~1.9%–3.1% per pick count             |
| Cancellation       | Admin/resolver only                    |

Supported collaterals: **USDC**, **WETH**, **$OVER**. Free bets supported via the `isFreeBet` flag on `placeBet`.

***

### User guide

#### 1. Open Keno

Select **Keno** from the casino lobby. You'll see the 80-number grid.

#### 2. Pick your numbers

Tap between 1 and 10 numbers. The interface shows the live paytable for your current pick count, so you can see exactly what each hit count pays before you commit.

#### 3. Set your stake and play

Enter your stake, choose your collateral, and confirm. The bet enters pending while the draw is generated.

#### 4. The draw

When the VRF callback arrives, 20 numbers light up across the grid. Your matched numbers are highlighted, and your hit count and payout are computed instantly.

#### 5. Payout

Winnings are transferred in the same transaction that resolves the draw. The full result — your picks, the 20 drawn numbers, your hit count, and the multiplier — is recorded on-chain.

***

### Why this matters

Keno is the highest-house-edge game in most physical casinos, often running 25–35% against the player - precisely because the draw is opaque and the paytables are tuned in the operator's favor without disclosure. Overtime inverts both problems. The 20-number draw comes from a single verifiable Chainlink VRF word using a transparent shuffle, and the paytables are published on-chain and capped to a house edge under \~3%. You can compute the exact expected value of any pick count from public data. A Keno game you can actually verify is, historically, a genuinely unusual thing.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.overtime.io/overtime-casino/games/quick-games/keno.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
