Anyone may take the seat at this figure, at any moment, without asking. The holder receives it, plus whatever is left of their deposit and everything they collected.
Cumulative, since the seat was first claimed. It does not accrue to a treasury and there is no address that can take it.
What it costs to take, what it has paid out, and on what terms
NEXT_PUBLIC_HOOK_ADDRESS points at; the model below works without one.Cumulative. It does not accrue to a treasury; there is no address that can take it.
What keepers have taken from swappers since the seat was first claimed.
Nothing on the wire yet.
Every event the contract has emitted, raw and unindexed
Every event the contract has ever emitted, newest first, read straight from the chain. Nothing here is indexed by a server — it is one pass of getLogs, folded in the browser.
No station on EthereumThe wire opens when a seat is commissioned here.
The same log, folded into one row per tenure
One row per tenure, folded out of the event log. Every hand that has held the seat, what it cost them, and how it ended.
No station on EthereumThe register opens the moment a seat is commissioned here, and every hand that holds it after that writes itself in.
Tax paid went to the pool’s liquidity providers. Collected came out of swappers. A tenure with a negative net was paying for the privilege of holding the seat.
See the raw wire →The contract's own arithmetic, run locally against terms you choose
The same arithmetic the contract runs, in the browser. Nothing here touches the chain — it reads the live terms if a seat exists and falls back to the deployment defaults otherwise.
Assuming you withdraw what you collect rather than recycling it into the deposit. Anyone — including a trader who likes your fee — may top it up at any time.
What the keeper can do, and what nobody can do
No station on Ethereum.
Every swap pays the pool — bps whatever you do. Your surcharge rides on top and is paid by the swapper — it never comes out of the LP fee.
Raising takes one hour to come into force. Lowering is immediate. Until a raise matures the seat still sells at the old price — that is what stops a keeper outrunning a buyer.
The deposit pays the tax second by second. When it empties the lamp goes out and anyone may claim the seat. Anyone may top it up — including a trader who likes the fee you post.
Surcharge you collected, proceeds from being bought out, and any deposit refunded to you. Past keepers can withdraw forever — there is no window to miss.
There is no admin. If your deposit runs out the seat goes to whoever claims it next, and anyone can call poke to settle the tax and put the lamp out. Everything on this screen is also a command: type help in the prompt below.
How the seat works, what it guarantees, and where it is weak
A Uniswap v4 hook in which the right to levy a surcharge on every swap of one pool is a single seat, held under a Harberger tax.
Its holder sets the surcharge inside a hardcoded cap and collects it. They declare the price at which the seat may be taken from them. They pay a continuous tax on that self-declared price out of a deposit. And they can be bought out by anyone, without permission, at the price they declared.
Post the price too low and you are relieved immediately. Post it too high and the tax eats your deposit. The only comfortable price is an honest one — that is the whole mechanism, and it is the reason there is no auction and no governance.
claimSeat(price, deposit, surcharge)The seat starts extinguished. Anyone may take it by posting a price and funding at least seven days of tax on that price. No auction, no whitelist, no queue.
beforeSwapEvery swap pays the pool its base fee, and the keeper takes their surcharge on top. The surcharge comes out of the swapper, never out of the LP fee.
poke()The tax runs continuously against the posted price and is drawn from the deposit. It is donated to the pool's liquidity providers — not to a treasury, not to a deployer.
buyout(price, deposit, surcharge)Anyone may take the seat at the price its holder posted, at any moment. The outgoing keeper is credited the price, the rest of their deposit, and everything they collected.
SeatLapsedIf the deposit empties, the lamp goes out. The surcharge drops to zero, the remainder goes to the LPs, and the seat is claimable by anyone again.
Docked at the bottom of the screen. Every control on this page is also a command, and both call exactly the same contract function.
Everything on this page is derived in your browser from a single getLogs pass over the contract’s whole history, plus a handful of view calls. There is no indexer, no database, no backend, and nothing is cached anywhere you cannot inspect.
The simulator runs the contract’s own arithmetic locally and never touches the chain at all.