EIP-1559: the fee market that prices itself
Before 1559, every transaction bid blind in a first-price auction — overpay or get stuck. Derive the replacement one fix at a time: a posted price, a thermostat that sets it, elastic blocks for the spikes, and a burn that removes the last bad incentive.
- gas
- the mempool
Every transaction pays for the gas it burns — but at what price per gas? For Ethereum’s first six years the answer was an auction, and it was miserable: fees that swung 10× in an hour, wallets that guessed wrong, and a quiet tax of chronic overpayment on everyone. EIP-1559 replaced it. The replacement looks clever and a little arbitrary the first time you see it — a “base fee,” a magic 12.5%, a burn — so let’s not memorize it. Let’s derive it, starting from the auction and fixing exactly what’s wrong, one step at a time.
The problem: everyone bids blind
The original design is the obvious one. Each transaction names a single number — its gasPrice — and the block proposer simply sorts all the pending transactions by that number and fills the block from the highest down. Clean to implement, and quietly terrible to use, because it’s a sealed first-price auction: you must name a price without knowing what anyone else bid or what it takes to get in.
Both failure modes hurt. Bid high to be safe and you hand over far more than you needed (the winner’s curse). Bid low to save money and you sit in the mempool for hours. And because nobody can see the clearing price, every wallet runs its own guess, fees are volatile block to block, and a demand spike becomes a stampede of panic-bidding. The auction isn’t pricing the resource — it’s taxing everyone for the privilege of guessing.
→ Step 2: let the protocol post the price.
Post one price — and let a thermostat set it
Here’s the move. Instead of an auction for the floor, the protocol posts a single price per gas that every transaction in a block pays — the base fee A per-gas price set by the protocol each block (not by bidders), the same for everyone in that block, and burned rather than paid to the proposer. EIP-1559. . No more bidding to discover the floor; you read the posted price and pay it. The whole sealed-auction guessing game for inclusion vanishes.
But that just moves the question: who sets the base fee, and how do they know the right number? Demand changes by the minute — any fixed price is wrong, and any human or oracle setting it is a target for manipulation. The trick is to not forecast demand at all, but to react to it with a simple feedback loop — a thermostat. Each block looks at how full the previous block was and nudges the base fee toward a target of half-full: over target → raise it; under → lower it; capped at ±12.5% per block so it can never lurch.
EIP-1559 base-fee simulator
The whole rule is a few lines of integer math on the parent block — no auction, no oracle, just a controller:
- 1 the current per-gas price everyone in the block pays
- 2 the cap — at most ±12.5% change in a single block
- 3 how far the last block ran from the half-full target
That ±12.5% cap is the quiet hero: a demand shock can’t 10× your fee in one block — it ramps over several, giving wallets a stable, predictable number to show you. Sustained congestion still gets expensive (1.125ⁿ compounds), but it does so visibly and gradually instead of in a panic.
→ Step 3: give blocks room to stretch.
Let blocks stretch to absorb the spike
Split “the size we aim for” from “the size we allow”. The base-fee controller targets a gas target, but a block may burst up to twice it — the gas limit is 2 × target. So when demand spikes, the extra transactions fit immediately into the elastic room above the target, instead of fighting an auction; the controller then sees that over-full block and ramps the base fee up over the next few blocks to pull demand back down to target.
So elasticity and the controller are two halves of one mechanism: elasticity handles the instant (room to absorb a burst), the controller handles the trend (re-pricing so the burst doesn’t last). Average block stays near 50% full, which is exactly the headroom that keeps the controller responsive in both directions.
→ Step 4: pay it to no one.
Burn the base fee; tip the proposer
The fix is almost shocking the first time: burn the base fee. Destroy it. The proposer receives nothing from it — so there’s no longer any reason to manipulate it upward, and the controller is safe to trust. As a bonus, burning ties the currency’s scarcity to network usage: heavy demand removes ETH from supply.
But a proposer still needs a reason to include your transaction and to order it well, so 1559 adds a small priority fee — a tip — paid directly to the proposer on top of the burned base fee. You sign two ceilings: maxFeePerGas (the most you’ll pay per gas, base + tip) and maxPriorityFeePerGas (the tip). You pay min(maxFeePerGas, baseFee + maxPriorityFeePerGas) — the base fee burned, the rest tipped.