Swap. Hold.
Get drawn.
Every swap in the bound LOTTO/ETH pool is an entry. Every ETH-out swap feeds 1% to the prize pool. Every thirty minutes anyone can be a winner.
Any swap registers you.
The afterSwap hook records the sender as an entrant for the current round. New swappers start at weight 1 — that grows the longer you hold.
1% of ETH-out feeds the pot.
When the output is ETH (someone sold LOTTO), 1% is taken via PoolManager flash-accounting and credited to the prize pool.
30 min later, draw.
A weighted-random winner is picked from the round's entrants. The pot splits 98 / 1 / 1, the round resets, the timer restarts.
Hold longer.
Weigh heavier.
The token stamps the round you first acquired LOTTO. The hook reads it on every entry. The longer you've held, the more weight your entry carries — up to a fixed ceiling.
Re-entering inside the same round refreshes the stamp rather than stacking it. Sell everything and your stamp resets when you buy back in.
Ninety-eight
to the winner.
When the timer hits zero anyone can be a winner. The pot splits in three — clean math, no dust. ETH leaves via low-level automated call.
▸ WINNER
Weighted-random pick from this round's entrants. Paid in native ETH.
▸ TRIGGERER
Bounty for whoever calls drawIfReady() on time. Pays for gas, keeps rounds moving.
▸ BURN · 0xdead
Removed from circulation each round. Keeps the math clean and prevents dust accumulation.
Two contracts.
Nothing else.
No frontend service, no governance contract, no vesting schedule, no staking module, no off-chain infrastructure. The mechanic lives in Solidity — wired once at deploy.
Lotto
Token
- Fixed supply 1,000,000 minted at construction
- Stamps each holder's first round
- Stamp resets if balance hits zero
- setHook is one-shot, non-revokable
- Round advance is hook-only
Lotto
Hook
- CREATE2-mined address encodes permission flags
- Hooks afterInitialize · afterSwap · afterSwapReturnsDelta
- Bound to a single LOTTO/ETH pool on first init
- Refuses any other pool · requires native ETH
- Owns prize pool, entrants list, round counter
The pool.
The numbers.
A single LOTTO/ETH pool using native ETH — no wrapping. Initial range brackets the starting tick by roughly 3.3× either side. A deliberate tradeoff: depth vs. resilience to price moves.