Part III · Chapter 21 of 43 · London

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.

Updated Jun 23, 2026 · 13 min
Assumed
  • 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.

1 step The blind auction

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.

everyone names a price · the block takes the highest 100 gwei (you) 50 gwei 45 gwei 30 gwei 12 gwei 8 gwei top bids fill the block the rest just stall you paid 100 gwei to beat 45 — overpaid; no posted price, no discovery
A first-price auction: the block fills with the highest bids. Bid too high and you overpay (you paid 100 to beat 45); bid too low and your transaction just stalls. Nobody knows the clearing price.

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.

2 step A posted 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.

Interactive

EIP-1559 base-fee simulator

Set how full each block is and watch the base fee respond — up over the half-full target, down under it, by at most ⅛ per block. It's a controller reacting to the last block, not a forecast.

demand— or click any block to change how full it is
5127gweitarget · 50%
base fee now44.87 gwei
burned / gas44.87 gwei
tip → proposer / gas2.00 gwei

The base fee isn't an auction — it's a controller. Each block, it moves ±12.5% at most, up when the previous block was over half full and down when under, steering the chain toward 50% full. And it's burned, not paid to anyone. Senders add a priority tip on top to compete for ordering.

The exact EIP-1559 base-fee formula, in integer arithmetic — unit-tested against the spec.

The whole rule is a few lines of integer math on the parent block — no auction, no oracle, just a controller:

Formula
next = base_fee 1 × (1 ± 2 × (used − target) 3 ÷ target)
  1. 1 the current per-gas price everyone in the block pays
  2. 2 the cap — at most ±12.5% change in a single block
  3. 3 how far the last block ran from the half-full target
A thermostat: over target the fee rises, under it the fee falls — never by more than ⅛ in one block.
base fee responds to how full blocks are target (½-full) full → +12.5%/block demand drops → decays blocks → · gas used per block (bars), base fee ×start (line)
The same rule, played out. Four blocks at target hold the fee flat; ten full blocks ramp it up at +12.5% per block — the 1.125ⁿ curve — then light blocks decay it back down. The controller only ever reacts to the previous block; it never forecasts.

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.

3 step Elastic blocks

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.

limit = 2× target target (½ full) base fee spike bursts to 2× · the base fee then climbs back to target
The block aims for half-full (the target) but can stretch to 2× it. A spike bursts into the elastic room now; the base fee then climbs over the next blocks to bring demand back 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.

4 step Burn it

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.

fee per gas = base fee + tip base fee (burned) tip burned — gone for good proposer base fee burned → no one to bribe, ETH gets scarcer · the tip buys ordering
Your fee splits: the base fee is burned (so no one can be bribed to inflate it, and ETH gets scarcer), and the tip goes to the proposer to buy inclusion and ordering.
04 Go Deeper Where to take it from here