A Uniswap v4 pool earns fees forever. TENOR sells those fees before they arrive — and spends what it raises buying its own supply back and burning it.
Every swap fee goes into a sinking fund. Nothing else touches it: no treasury, no owner, no withdrawal. There is no function anywhere in the structure that could send that ETH to a person.
Against that future income the protocol sells zero-coupon claims. Pay ETH now, receive a fixed face later, paid in strict issuance order as fees arrive. A continuous Dutch auction discovers the yield.
The proceeds buy TENOR off the pool and burn it. So the protocol borrows against income it has not earned and retires equity with the loan. That is leverage, and Schedule C says who carries it.
The term structure, drawn to the contract's own arithmetic: price = face ÷ (1 + r·t), with r walking from 8.00% at a zero wait to 120.00% at the two-year issuance rail.
Every figure on this page is taken from tenor/*.sol,
econ_tenor.js, or a measurement written by gas_tenor.js on an Ethereum
mainnet fork. Nothing is deployed; no address here is live.
The preamble those contracts open with is worth reading before any of this —
it is at the top of Tenor.sol.
The security
- A.1
- One billion TENOR, minted once in the constructor. No mint function exists to be called, guarded or renounced.
- A.2
- Ordinary ERC-20. No transfer fee, no rebase, no blacklist, no maximum holding, no pause.
- A.3
burnis permissionless and irreversible, and the protocol burns on every buyback — so supply is a monotonically non-increasing series.- A.4
- No administration after
openTrading. The launcher role exists so the pool can be seeded before anyone trades against it, and it deletes itself in the same transaction that opens trading. - A.5
- TENOR is the equity of this structure. It has no claim on the sinking fund. The instrument with a claim on the fund is the CLAIM, and it ranks ahead of TENOR in every respect.
Source: tenor/Tenor.sol, Schedule A.
The sinking fund, and the buyback
- B.1
- A skim in ETH on both sides of every swap, opening at 4.00% and decaying once to 1.25% over a day. The clock starts at the first swap, not at deployment, so an idle pool cannot be used to wait the opening rate out.
- B.2
- It goes to the register, and nowhere else — taken from the PoolManager straight to the register's own address. The hook never holds it, so there is no balance a withdrawal function could have been written against.
- B.3
- Permissions are
0x20CC. The six liquidity bits are clear: anyone may add or remove liquidity and the hook is never consulted, so no exit can be blocked, taxed or delayed. Measured at +240 gas on an LP add against a hookless control. - B.4
- Everything the offering prices depends on how fast the fund fills, so that rate is measured across a rolling window of at least seven days using two anchors rolled one into the other. A burst of wash trading has to be sustained for a real fraction of a week before it moves anything.
- B.5
- Proceeds from selling claims buy TENOR off the pool and burn it.
- B.6
- Anyone may run the buyback.
sweepis permissionless and the caller names the minimum they will accept, so a sandwich costs the sandwicher rather than the fund. A 0.50% bounty pays for the gas and the attention.
Source: tenor/TenorHook.sol, Schedule B.
The claim
- C.1
- A zero-coupon right to receive a fixed FACE of ETH out of the sinking fund. No coupon and no maturity date. It is paid when the fund reaches it.
- C.2
- Strictly by issuance. Every claim records a watermark — the cumulative face issued up to and including itself — and becomes payable the moment cumulative funding reaches that mark. Claim 1 is paid before claim 2 whatever either holder does, and no fee, bribe or transaction ordering changes it.
- C.3
- Because it is a watermark and not a list, there is no loop. Redemption is one comparison and one transfer. Measured from a single fork snapshot: claim #1 costs 52,779 gas, claim #500 costs 52,788 — a difference of nine gas.
- C.4
- ERC-721, transferable from the moment it is issued, with its terms written on
chain in
tokenURI. The secondary market prices the wait continuously. - C.5
- NO RECOURSE. A claim is not a deposit, not a loan against collateral, and not insured. If trading stops the fund stops filling and the claim waits. It cannot be accelerated and cannot be called, and there is no liquidation to trigger because there is nothing to liquidate.
- C.6
- One invariant, enforced on the way in rather than audited afterwards: the register refuses to book money it is not already holding.
The protocol has already spent the money. It borrowed against fees it has not earned and burned supply with the proceeds. If volume falls, nothing defaults — the queue simply moves more slowly, and the holder is the one carrying that. A claim bought behind 0.25 ETH of queue at 20 ETH/day waits 60 days; at a tenth of that volume it waits 600; at zero it waits forever.
Source: tenor/Register.sol, Schedule C.
Measurements: gas_tenor.js and econ_tenor.js section 4.
The offering
- D.1
- A continuous Dutch auction in yield. Always open, always quoted. What moves is the yield: it widens on its own while nobody buys and snaps back to the reference the moment somebody does.
- D.2
- The reference yield is set by the wait, not by anyone's opinion — the unfunded face ahead of a new claim divided by the observed rate at which the fund fills. 8.00% at a zero wait, 120.00% at the rail.
- D.3
- On top of that, a tension of 3.00% per day since the last sale, capped at 40.00%. That is the Dutch part: if the reference is too tight for the market, the price falls until it is not. Every sale resets it.
- D.4
- Price is face ÷ (1 + r·t), simple interest. No exponent and no logarithm, because neither is worth the gas or the rounding at these tenors.
- D.5
- The rail. Outstanding face may never exceed two years of fee income at the observed rate. The rate is measured, so the rail tightens by itself when volume falls, and an offering that would breach it reverts.
- D.6
- Nothing sells first. No allocation, no whitelist, no private round and no discount for size. The queue is the order the claims were bought in, and there is no other queue.
The rail binds at issuance and nowhere else. It cannot un-sell a claim. If
the observed rate falls after issuance, outstanding face ends up above what the rail would
permit today — measured at 1.43× in econ_tenor.js for a pool
whose volume never recovers from its opening week. Nothing in the contract can prevent that,
and a circular that implied otherwise would be lying.
Price a claim
- Your wait
- —
- Yield on offer
- —
- Price per 1.0000 face
- —
- You pay
- —
- Discount to face
- —
- Against the rail
- —
The contract's own arithmetic, run in your browser. It is a model of the offering,
not a quote: the live quote comes from Offering.quote(face) once deployed, and the
observed rate it uses is measured on chain rather than typed into a box.
What it costs
Against the real PoolManager on a mainnet fork, beside a hookless control pool — same token, same fee, same spacing, same band, same depth, same opening tick. Both branches run from the same snapshot, so the difference is the hook and nothing else.
| Path | Gas | The hook's share | Note |
|---|---|---|---|
| Buy | 127,739 | +39,027 | skim taken in beforeSwap |
| Sell | 132,403 | +38,821 | ETH is unspecified, so afterSwap |
| The first swap ever | 232,396 | — | one-time; opens the rate accumulator |
| Buy a claim | 165,401 | — | quote, rail check, mint, forward |
| Redeem a claim | 52,779 | — | at any queue depth |
| Transfer a claim | 59,205 | — | ordinary ERC-721 |
| Sweep the buyback | 132,374 | — | anyone; swaps and burns |
| Sync the fund | 28,358 | — | anyone; credits stray ETH |
There is one loop in the whole surface, and it is the digit conversion inside
tokenURI — a view, bounded by the 78 digits of a uint256, never on a path anybody
pays for. Everything a user pays for is straight-line code. The benchmark asserts that by
scanning the sources rather than asking to be believed.
The launch, one time
| Step | Gas | At 10 gwei |
|---|---|---|
| Deploy Tenor | 500,215 | 0.00500 ETH |
| Deploy Register | 1,406,667 | 0.01407 ETH |
| Deploy HookDeployer | 205,020 | 0.00205 ETH |
| Deploy TenorHook | 1,706,402 | 0.01706 ETH |
| Deploy Offering | 1,009,606 | 0.01010 ETH |
| Wire the register | 51,310 | 0.00051 ETH |
| Wire the hook | 45,962 | 0.00046 ETH |
| Initialize the pool | 56,598 | 0.00057 ETH |
| Seed the liquidity | 216,117 | 0.00216 ETH |
| Total | 5,197,897 | 0.05198 ETH |
Measured by gas_tenor.js. The pool opens single-sided at tick 175000 —
a valuation of 25.13 ETH — seeded with 800,000,000 TENOR and zero ETH, which
sim_tenor.js proves by checking what the position actually pulled.
Plainly
A claim can wait forever
It is paid out of trading that has not happened. If the pool goes quiet the queue stops moving and there is no mechanism — none — that makes it move again. No default is declared because none can be; the claim just sits there.
The money is already spent
Proceeds are burned into supply the moment they are raised. There is no reserve behind a claim, no collateral to seize and nothing to claw back. That is the leverage, stated as a term rather than buried.
The rail cannot un-sell
It refuses new issuance beyond two years of observed income, but it cannot retire face already sold. A pool whose volume collapses after issuing ends up over-issued relative to what the rail would allow that day — measured at 1.43×.
The buyback is sandwichable
It is a swap on a public pool, so it can be front-run like any other. The caller names a minimum, which moves the cost of a sandwich onto whoever calls it — but it does not make the sandwich impossible.
Liquidity can leave
The hook deliberately cannot block or tax a removal. That protects an exit; it also means depth is nobody's promise, and a thinner pool earns fewer fees and fills the queue more slowly.
What TENOR is not
Not a security offering, not a fund, not a deposit. No revenue share, no governance right, no promise from anyone. Nothing here is financial advice or an offer. These are new contracts and carry the risk new contracts carry.
Nothing is deployed, and there has been no third-party audit
At the time of writing there is no TENOR token, no register, no hook and no pool on Ethereum mainnet. Every address on this page is empty. The contracts are tested hard against a mainnet fork — that testing has already caught a real pricing bug in which claims redeemable on arrival were sold at a discount, which is free money taken out of the fund — but a fork simulation written by the same hand that wrote the contract is not an audit, and should not be read as one.
The book
Read directly from Offering.book() and Register.books()
over plain JSON-RPC. This page holds no numbers of its own for this section: while the addresses
are empty every line reports that it is not deployed, and it will not show a figure it has not
read.
| Priceable | Not yet deployed | false until a full window of fee history exists |
|---|---|---|
| Outstanding face | Not yet deployed | what a new claim queues behind |
| The rail | Not yet deployed | two years of observed fee income |
| Room left | Not yet deployed | face that could still be sold |
| Tension | Not yet deployed | added to the reference while nobody buys |
| Fund held | Not yet deployed | ETH in the register right now |
| Books tie | Not yet deployed | balance ≥ funded − redeemed |
- Tenor
- Not yet deployed
- Register
- Not yet deployed
- TenorHook
- Not yet deployed
- Offering
- Not yet deployed
Nothing has been read yet.