file: eip-millions-lottery.md
eip: TBD
title: Ethereum Millionaire Lottery
description: Redirect 50% of EIP-1559 base fee to a perpetual jackpot with one-address-one-ticket eligibility and delayed beacon randomness.
author: wutaner.eth (@wutaner)
discussions-to: https://ethereum-magicians.org/t/eip-ethereum-millionaire-lottery/XXXX
status: Draft
type: Standards Track
category: Core
created: 2025-10-25
requires: 1559, 4788
Abstract
This EIP redirects 50% of the EIP-1559 base fee to a perpetual jackpot pool, awarding one random address up to 100 ETH per round using delayed beacon-chain randomness.
An address becomes eligible for one ticket once its cumulative base fee paid reaches a per-round threshold τ.
The payout applies a fuse rule P = min(J, N·τ) to ensure liveness and eliminate positive-EV Sybil attacks.
No tokens, no oracles — pure Ethereum math.
Motivation
EIP-1559 burns the base fee, improving ETH’s monetary policy but providing no social feedback.
Redirecting half of this burn to a jackpot introduces a continuous, fair, and permissionless wealth effect, rewarding on-chain activity while maintaining deflationary pressure.
“Half burns the rich, half blesses the brave.”
Specification
Constants and Parameters
| Symbol |
Meaning |
Default |
| J |
Jackpot cap |
100 ETH |
| τ |
Threshold per address |
0.001 ETH (auto-adjusted) |
| K |
Randomness delay |
128 slots |
| P |
Actual payout |
min(J, N·τ) |
| N |
Qualified addresses |
dynamic |
Base-Fee Allocation
Each transaction’s base fee:
- 50% → burned

- 50% → jackpot pool

Eligibility (One Address, One Ticket)
An address is qualified if its cumulative base fee paid in the round ≥ τ.
Each qualified address = 1 ticket.
τ is fixed at the start of each round.
Trigger and Payout
When the jackpot pool ≥ J:
- Snapshot the qualified addresses (publish Merkle root).
- Delay K = 128 beacon slots (≈25 min).
- Use beacon-chain RANDAO randomness via EIP-4788.
- Winner index =
hash(seed || round_id) mod N.
- Payout =
min(J, N·τ) ETH to the winner.
- If P < J, remainder rolls over to the next round.
- Reset the round.
τ Adjustment (Per-Round Optional Rule)
[
τ_{t+1} = clamp( τ_t · (N_t / H)^{0.5}, τ_{min}, τ_{max} )
]
Recommended:
H = 100,000, τ_min = 1e-5 ETH, τ_max = 0.005 ETH, initial τ_0 = 0.001 ETH.
τ is constant during a round, updated only at round start.
Rationale
- Delayed randomness prevents validator manipulation.
- Fuse rule (P = min(J, N·τ)) ensures jackpot always opens, even in low activity.
- One-address-one-ticket keeps rules simple and avoids identity assumptions.
- Auto-adjusting τ adapts to network fee dynamics.
- Half-burn retained preserves ETH scarcity.
Reference Implementation (Pseudocode)
constants:
J = 100 ETH
K_SLOTS = 128
tau = current_round_tau
state (per-round):
pool
qualified[address] = bool
acc[address] = uint128
N = 0
snapshot_root
snapshot_slot
phase = ACCUMULATING | SNAPSHOT
on_tx_executed(tx):
pool += baseFeePerGas(tx) * gasUsed(tx) * 0.5
if phase == ACCUMULATING:
acc[sender(tx)] += baseFeePerGas(tx) * gasUsed(tx)
if acc[sender(tx)] >= tau && !qualified[sender(tx)]:
qualified[sender(tx)] = true
N += 1
delete acc[sender(tx)]
if phase == ACCUMULATING && pool >= J:
snapshot_root = merkleRoot(sorted(qualified.keys()))
snapshot_slot = current_beacon_slot()
phase = SNAPSHOT
on_beacon_slot_tick():
if phase == SNAPSHOT && current_beacon_slot() >= snapshot_slot + K_SLOTS:
seed = beaconRandao(current_beacon_slot())
idx = hash(seed || round_id) mod N
winner = address_at_index(idx)
payout = min(J, N * tau)
transfer_from_pool(winner, payout)
reset_round() // carry over (J - payout)
Security Considerations
- Randomness manipulation: mitigated by 128-slot delay.
- Sybil botting: per-ticket EV ≤ τ → unprofitable.
- DoS/memory: delete accumulators once qualified.
- Reorgs: no higher risk than standard finality assumptions.
Backwards Compatibility
No transaction format changes.
Base-fee allocation is modified to redirect half into jackpot accounting.
Fully compatible with EIP-1559 semantics.
Example Scenarios
| Scenario |
N |
τ |
Payout |
Comment |
| Low activity |
12,000 |
0.005 |
60 ETH |
Partial payout, 40 ETH rolls over |
| Normal |
120,000 |
0.001 |
100 ETH |
Full jackpot |
| Bot attempt |
10,000 bots, τ=0.001 |
100,000 total |
EV ≤ cost |
No profit |
Copyright
CC0-1.0 — Public Domain