In one sentence
Every buy pays a 5% tax. The tax makes the pot. At the end of the round, one winner is drawn, and your odds are proportional to the tax you paid, multiplied by a bonus if you got in early.
This is not a lottery where everyone holds one ticket. It is a parimutuel: your weight in the draw is your money. Someone putting in $1,000 has 200× the odds of someone putting in $5, because they put 200× more into the pot.
The round
| Parameter | Value | Note |
|---|---|---|
| Buy tax | 5% | buys only, taken in ETH off the input |
| Snipe tax | 7.5% | 1.5× the base rate, first 10 seconds |
| Snipe window | 10 s | no rank assigned, barred from the draw |
| Ticket minimum | 0.01 ETH | below this, no ticket (anti-spam) |
| Round close | pot target or 24 h | target published when the round opens; whichever comes first |
| Payout | winner-takes-all | the whole pot to one wallet, every round |
Your odds
One wallet gets one entry rank, on its first buy of the round. Rank sets a permanent multiplier on everything that wallet stakes:
| Entry rank | Draw weight | Effect on expected value |
|---|---|---|
| 1 to 3 | ×3.00 | +136% vs your tax |
| 4 to 10 | ×2.00 | +57% |
| 11 to 20 | ×1.50 | +18% |
| 21 and up | ×1.00 | −21% (funds the bonus above) |
Your edge is not your multiplier. It is your multiplier relative to the field average. If everyone had ×3, nobody would have anything. And buy size still dominates rank: a latecomer staking $5,000 out-odds a rank-1 buyer staking $1,500. That is deliberate, so hoarding early ranks with dust wallets buys nothing.
Zero-sum by design
With no bonus, everyone’s expected value equals their tax exactly: the pot is nothing but the sum of the taxes, and it is paid out in full. The pool’s swap fee is separate and never touches the pot.
The early-entry bonus creates no money. It moves expected value from latecomers to early buyers, to the cent: what the first 20 ranks gain, rank 21+ pays. That transfer is the product, and it is fully visible in the calculator.
The snipe window
The first 10 seconds after launch are hostile territory for bots: buys pay 7.5% instead of 5%, receive no entry rank, and are barred from the draw entirely.
Why full exclusion? Because half-measures backfire. A sniper taxed at a higher rate pays more tax per dollar, and if weight follows tax, the anti-sniper rule would hand snipers the best odds in the field. Tested on real trade data, that is exactly what happened. So they are out, completely.
Every dollar sniped is a dollar added to a pot only real buyers can win. The harder the bots try, the more your ticket is worth.
Rank 1, the ×3 seat, therefore belongs to the first genuine buyer after the window: reachable for a human with the interface open, not just for a bot.
Why your odds move
Your odds are not fixed at the moment you buy. They settle at close, across the full field: enter when the pot is at $500 on a round that closes at $5,000, and your displayed odds will have been divided by ten along the way.
That is why the interface always shows two numbers, never one: your odds now, computed on the current pot, and your odds at close, projected onto the target and labelled as an estimate. What never moves is your rank advantage: the m ÷ m̄ edge is locked the moment your rank is.
On-chain
uPOT is a Uniswap v4 hook on Ethereum. There is no separate staking contract and no custodian: the mechanism lives inside the pool.
| Piece | How |
|---|---|
| The tax | taken in beforeSwap: 5% of the ETH input, held as ERC-6909 claims inside the hook. No token transfer, minimal gas. |
| The ticket | registered in the same call: a new wallet gets the next rank, a returning one accumulates weight. |
| The draw | verifiable randomness: Chainlink VRF on Ethereum mainnet, requested when the round closes. A weighted binary search over the cumulative weights picks the winner. |
| The payout | pull pattern, always: the win is recorded, the winner calls claim(). Nothing is ever pushed from a swap callback. |
| The asset | ETH, the chain’s gas asset. The pot stays inside the PoolManager as ERC-6909 claims credited to the hook until the winner takes it. |
| Round close | permissionless: once the target or the 24 h are reached, anyone can call close(). It requests the randomness and refunds the caller’s gas from the pot, capped at 0.1% of it, so no round ever waits on the team. |
| The claim window | claim() from the winning address, any time within 90 days of the draw. The whole pot, in one transfer. |
| Unclaimed pots | after 90 days an unclaimed pot rolls into the current round. It never goes to the team. |
| Admin keys | none. No owner, no pause, no withdraw, no upgrade path: the parameters of §02 are constants in verified code, and V2 / V3 switch on volume milestones measured on-chain, not on a key. |
| Rounds | tickets, weights and the pot are keyed by round id. The next round starts empty in the block after the draw. |
| Checking a win | winnerOf(round) and claimable(address) are public reads. The $uPOT page exposes both: paste an address, or connect the wallet and claim. |
What ships, and when
| Phase | Contents | Status |
|---|---|---|
| V1 · launch | Parimutuel jackpot: 5% buy tax into the pot, one winner per round, verifiable random draw | live at launch |
| V2 · $1M volume | On-chain referral: every buy can carry a referrer, paid from the pool’s swap fee, never from the pot, claimable on-chain | code public · activates at the milestone |
| V3 · $10M volume | Progressive bid wall: swap fees redeployed as a buy wall one tick below spot, climbing with volume | roadmap · testnet first |
The hook ships deployed and verified on day one. The inactive modules are inactive by design, documented as such, with public activation milestones. Nothing is presented as working before it does.
Try it before it exists
Two simulators, both running the exact formulas above: