Mechanism · 07 / 19Preview · not deployed
Seat rights
Fee-free swaps, fee setting inside capped bounds, fee collection and the bell window.
The regent pays the rent upfront. In exchange the seat carries four rights, and only four, for the length of one session. This page describes each right, how the planned SeatHook contract would enforce it, and where the rights stop.
The four rights at a glance#
| Right | What it means | Limit |
|---|---|---|
| Fee-free swaps | The regent swaps at 0% LP fee | Only through one registered executor contract |
| Fee setting | The regent sets the swap fee for everyone else | Inside capped bounds per session type |
| Fee collection | The regent collects the swap fees paid by everyone else | Only for the session he paid for |
| Bell window | For the first 20 seconds only the regent can swap | Only at the start of OPEN and at a halt resumption |
The rights belong to the session, not to the person. When the session ends they pass to whoever won the next auction, or to nobody if the seat went unsold (see Fail-safe behavior).
Right one: fee-free swaps through an executor#
The regent swaps at 0% LP fee. Gas is still paid, and the price impact of the swap is still real. What disappears is the fee that every other trader pays.
The right attaches to a contract address, called the executor, and not to a wallet. The reason is how Uniswap v4 works. A hook's beforeSwap callback receives a sender argument, and that sender is the contract that called the PoolManager, typically a router. It is not the wallet that signed the transaction. A hook cannot reliably know who the end user is, but it always knows which contract is swapping.
So the regent registers one executor contract for the session. The executor is a small contract the regent controls: it calls the PoolManager, settles the swap, and lets nobody else use it. When a swap arrives, SeatHook would compare sender to the executor registered for the current session:
beforeSwap(sender, key, params):
session = SessionClock.current(key)
if sender == executorOf(session):
return fee override = REGENT_FEE
if inBellWindow(session):
revert
return fee override = feeSetByRegent(session)
Regent pools are dynamic-fee pools, which is what allows the hook to return a different fee per swap. The draft interfaces are on the architecture page.
Two consequences follow. A regent who swaps from any other address pays the public fee like everyone else. And a regent who writes a careless executor, one that lets third parties route through it, gives his own right away. That is the regent's problem, not the pool's.
Right two: setting the fee inside capped bounds#
The regent chooses the swap fee that everyone else pays. He can change it during the session, but never outside the bounds for that session type.
| Session | Hours (ET) | Minimum fee | Maximum fee |
|---|---|---|---|
| OPEN | 09:30 to 10:00 | 0.05% | 1.00% |
| DAY | 10:00 to 16:00 | 0.05% | 0.50% |
| NIGHT | 20:00 to 09:30 | 0.05% | 2.00% |
| WEEKEND | Fri 20:00 to Mon 09:30 | 0.05% | 2.00% |
The caps are wider when the market is closed because the risk is larger. At night and over the weekend there is no reference price, so whoever quotes is quoting blind. During DAY the cap is the tightest, and it interacts with the duty band: a higher fee means a wider band, but also more work for the regent. That trade-off is explained in Seat duties and slashing.
The bounds themselves are governable by stakers once the token exists. See The $RGNT token.
Right three: collecting the swap fees#
During a sold session, the swap fees paid by other traders go to the regent. They do not go to the LPs.
This is deliberate, and it should be said plainly: the LPs were already paid. The regent escrowed the full bid before the session started, and 90% of it streams to in-range LPs second by second, whatever happens to volume. The LPs swapped an uncertain fee income for a known rent. The regent took the other side of that trade. If volume is high he does well. If volume is thin he overpaid. Either way the LPs' income for the session was fixed at the close of the auction. See Rent streaming and anti-JIT.
Competition is what keeps this fair. A bidder who expects large fee income will bid more for the seat, and that expectation reaches the LPs through the rent.
Right four: the bell window#
For the first 20 seconds of every OPEN session, and the first 20 seconds after any halt resumption, only the regent can swap. A swap from any other sender reverts.
These are the moments when the pool price is known to be stale. At 09:30 ET the stock opens at a new price and the pool is still at the old one. On a first-come-first-served sequencer with ~100 ms blocks, whoever lands the first transaction takes the gap. That is a latency race, and its prize goes to the fastest bot while the LPs who fund it receive nothing.
The bell window removes the race. There is nothing to be fast for, because only one address can trade, and that address was decided minutes earlier in an open auction. The value of the gap has not gone away. It has been turned into a priced right, sold to the highest bidder, with the proceeds paid to the LPs. The arithmetic of the gap is on The problem.
What the regent cannot do#
- He cannot set a fee above the cap or below the floor for the session. The hook would reject it.
- He cannot block anyone's swaps outside the bell window. After 20 seconds, the pool is open to every trader at the posted fee.
- He cannot touch LP funds. The seat gives no access to positions, no ability to pause withdrawals, and no custody of anything except the fees he collects.
- He cannot swap fee-free from any address other than the registered executor.
- He cannot carry rights past the end of the session. At the boundary the hook reads the next session's regent, or none.
- He cannot get the bid back by doing nothing. The rent is escrowed upfront and streams regardless. The one exception is sequencer downtime, where unstreamed rent is refunded pro rata.
- During DAY he cannot ignore the oracle band without his bond being slashed.
Why rent for rights is fair#
To LPs. In a plain pool the opening gap is taken from LPs for free. Here the same gap is sold in a competitive auction and the proceeds are paid to LPs before the session begins. They give up swap fees for that session and receive a fixed, known amount instead. If no one bids, they keep a default fee and lose nothing relative to a normal pool.
To traders. Traders face a fee that is capped by session, a pool that is closed to them for 20 seconds at moments when its price is stale anyway, and, during DAY, a price the regent is bonded to keep near the oracle. Outside the bell window nobody can be refused a swap.
To bidders. The auction is open and permissionless for anyone with a bond. No one holds the seat by default. See The seat auction and For market makers.