TREMOR

TREMOR

Station bulletin
tremorevm.xyzx.com/tremorEVM Not deployed

A Uniswap v4 hook is present for every single swap. It is the only thing in the world that sees exactly how violently its own pool moves — and almost every hook ever written throws that away.

TREMOR keeps the record. Every sixty seconds it writes down where the price stands and squares the distance travelled. Summed over a week that is realized variance: a hard number for how much this market shook, produced by the only party present for all of it. Then it makes that number tradeable.

Station TRM-01 Grid 60 s Reading 0 Σ variance 0 tick² Simulated — this is what the instrument does, drawn live
the red ticks are readings — one per grid interval

The trace above is a simulation running in your browser, not chain data. It draws the same quantity the contract accumulates: squared tick changes, sampled on a fixed grid.

Three things that are true of this and of nothing else

01 · The instrument

Nobody else can measure this

An outside oracle sees prices when it samples them. The hook is called on every swap, before and after. It cannot miss an event, cannot be fed a stale price, and has no incentive to misreport — there is nothing it could gain.

02 · The strike

Nobody sets it

An epoch settles against the last fully measured epoch's reading. No committee, no oracle subscription, no governance vote, no admin key. The pool is bet against its own past.

03 · The risk

Nobody can be liquidated

Both sides post ETH into one pot and the pot is divided by where the reading landed. No leverage, no margin, no funding rate, no liquidation engine — there is nothing in the design capable of producing bad debt.

What the swap fee does

Half of every fee is paid straight back out to whoever took a side that week — win or lose. That is the subsidy, and it is why the market is worth starting at all: taking either side is positive expectancy before any view on volatility is expressed.

The other half stands under the token as a redemption floor, claimed by burning. Neither half reaches a person. There is no withdraw function, no treasury address and no owner — not withheld, absent.

The reading is sampled, capped, and manipulable at a price. A sixty-second grid means everything between two readings is invisible. A single reading is truncated at 1,000 ticks, which makes the index hard to spike and, in the same breath, makes it understate a genuine crash. And a large enough actor can move a week's number — it costs fees, price impact and arbitrage on every leg, all of it paid into the pot they are trying to win. That is a tax on the attack, not a wall against it.

The station, as configured
Sampling grid60 s
Epoch7 days
Reading cap1,000 ticks
Payoff band⅓× .. 3×
Opening skim4.00%
Resting skim1.25%
Subsidy share50%
Settle bounty0.25%
Minimum stake0.002 ETH
Supply1,000,000,000

Every one of these is a constructor argument or a constant, fixed at deployment. The constructors revert on anything outside their ceilings.

How a pool is measured

A tick is the logarithm of the price, with the logarithm already taken. That is the whole trick: squaring tick changes gives realized variance with no exponent, no logarithm and no fixed-point price arithmetic anywhere in the contract.

The grid, and why a burst is worthless

The instrument takes at most one reading every sixty seconds. A swap that arrives sooner moves the price and moves the instrument not at all.

So a burst of round-trip swaps inside one interval contributes exactly nothing. To add variance you have to move the price and leave it moved across a boundary, then move it back across another — paying the fee, the spread and the arbitrage on every leg.

This is measured, not asserted. On a mainnet fork, sixteen swaps inside one interval added zero readings and zero variance, while the price moved the whole time.

Measured on a fork — sim_tremor.js section 2
EventReadingsVariance added
16 swaps inside one interval00
1 swap, one interval later1the whole move
And the cap, section 3
The tick actually moved1,483
The cap1,000
Recorded1,000,000 tick²
Not2,199,289 tick²

What a reading costs the trader who happens to take it

Most swaps arrive inside an interval and pay for nothing but a comparison. The unlucky one that opens the grid pays for a reading; the once-a-week unluckier one pays to roll the epoch too. Both land on a different trader every time, so both are recurring rather than one-off — which is exactly why they are bounded and published.

Measured against a hookless control pool · at 10 gwei
Which swap you happen to beGasOver the common caseHow often
Inside the interval — nothing due140,963almost always
Takes a reading151,099+10,136at most once a minute
Takes a reading and rolls the epoch225,177+84,214once a week

There is not one loop in the entire suite. Not in the token, the seismograph, the fund, the market or the hook. The epoch roll closes exactly one epoch per call — the thing that would otherwise be a loop over however long the pool went quiet. The benchmark asserts this by reading the sources, rather than asking to be believed.

Two sides, one pot

CALM says the coming epoch will be quieter than the strike. SHAKE says louder. Both post ETH into one pot, and the pot is divided by where the reading actually landed — saturating at a third of, and triple, the strike.

Settle an epoch

50%50%
CalmShake
Pot
Shake share
Calm returns
Shake returns
Per 1 ETH on calm
Per 1 ETH on shake

The contract's own arithmetic, run in your browser. Both sides must be non-empty — an epoch with one side is voided and everyone is refunded.

The timing, and why the strike is always known

Subscription for epoch N runs while epoch N−1 is being measured. So the last epoch whose variance was final when that window opened is N−2, and that is the strike. Using N−1 would mean staking against a number nobody could see yet — which is not a strike, it is a raffle.

epoch N−2   measured ──▶ finalised ─┐
epoch N−1              measured     ├──▶ this is the strike for N
                 subscription for N ─┘   and it is public the whole window
epoch N                             measured ──▶ settle

Why the band is three, and not a half

A band too narrow saturates constantly and the instrument degenerates into a coin flip. Too wide and every epoch settles near 50/50 and nobody bothers. This was settled by simulation before a line of Solidity existed — and the first attempt was wrong.

How often each band saturates, against realistic volatility regimes
BandSaturation, calm regimeSaturation, wild regimeMean distance from 50/50
⅓× .. 1.5×52.88%68.92%37.17%
½× .. 2×28.57%47.12%28.64%
⅓× .. 3× — chosen7.52%26.32%18.25%
¼× .. 4×3.26%13.78%12.97%
⅙× .. 6×0.75%5.26%8.09%

Source: econ_tremor.js section 3. The first design interpolated linearly on ±50% of the strike and saturated 61.65% of epochs. Variance ratios are log-distributed, so the band had to be symmetric in ratio rather than in difference.

Under constant volatility this instrument would be worthless, and that is worth saying out loud. With 10,080 samples an epoch, sampling error is 1.41% — every epoch would settle within a hair of 50/50. What TREMOR trades is regime change: the fact that real volatility clusters, so quiet weeks and violent ones arrive in clumps. If this pool's volatility were somehow stable, there would be nothing here to disagree about.

Documentation

The bulletin, as it is written in the contracts. Each reading below is the comment block at the top of the file it names.

Architecture

Five contracts, and what each one may do

ContractHoldsMayRuntime
Tremornothingbe transferred and burned1,902 B
Seismographnothingrecord readings, close epochs2,635 B
Fundthe skimpay the subsidy and the floor, and nothing else2,917 B
Marketthe stakestake stakes, settle, pay claims4,995 B
TremorHooknothingskim to the fund, hand readings to the seismograph5,050 B

The hook never holds ETH — the skim goes from the PoolManager straight to the fund's address, so there is no balance a withdrawal could have been written against even by accident. Both wiring roles delete themselves in the transaction that uses them.

Tremor.sol

The token

Why this exists
A v4 hook is called on every swap and sees the price at both moments — a complete record of how violently a market moved, held by something that cannot lie about it. Almost every hook throws that away.
What this contract is
The token, and nothing else. One billion, minted once, eighteen decimals. No transfer fee, no rebase, no blacklist, no maximum holding, no pause.
What it cannot do
Mint — there is no function. Not disabled, not guarded, not renounced: never written. Be administered — the launcher role deletes itself in the same transaction that uses it.
Where TREMOR stands
Behind everything. It is not a claim on the epoch pots — money staked in the market belongs to whoever staked it. What TREMOR has is the floor, claimed by burning, and that is the whole of it.
How it fails
The floor is only as large as the fees collected, and fees are only as large as the volume. Nothing here creates value; it refuses to let fee income leave, which is a smaller claim. And the whole structure is unaudited by anyone but its author.
Seismograph.sol

The instrument

What it measures
The tick, which is log price with the logarithm already taken. Squaring tick changes gives realized variance with no exponent, no logarithm and no fixed-point price arithmetic.
How a reading is taken
The hook hands over the tick after every swap. If 60 seconds have passed, the distance travelled is squared, truncated, and added to a running total. If they have not, nothing happens at all.
Why the grid
Because of that last line. A burst inside one interval moves the price and moves the instrument not at all. Measured on a fork: sixteen swaps inside one interval added zero readings and zero variance.
Why the cap
One violent minute would drown out a week. So a reading contributes at most 1,000². The second edge is real: the same truncation makes the instrument understate a genuine crash, and it costs whoever holds SHAKE. A 1,483-tick move was recorded as 1,000².
How an epoch closes
One at a time, never in a loop. roll() is permissionless. What is compared between epochs is variance per second, so an epoch that ran long is not credited for lasting longer.
What it refuses to do
Hold ETH. Own a token. Accept a second writer. Be re-wired. It is a pen and a roll of paper.
How it fails
The reading is sampled, not continuous, so it is not true quadratic variation and is not claimed to be. And a large enough actor can move a week’s reading — it costs fees, impact and arbitrage on every leg, all paid into the pot they are trying to win, but that is a tax on the attack, not a wall against it.
Fund.sol

The fund

What comes in
The swap skim, taken from the PoolManager straight to this address. Nothing else, ever. The credit is refused unless the ETH is already here.
Where it goes
Two places, the only two that exist. The subsidy, paid out to everyone who took a side that epoch, win or lose. The floor, claimed pro-rata by burning.
What cannot happen
A withdrawal. A sweep to a treasury. An owner. An upgrade. Not withheld — absent.
The one invariant
balance >= subsidyPool + floorPool, enforced on the way in rather than audited afterwards.
Why the floor is neutral
Burning n for n × floor ÷ supply leaves floor ÷ supply exactly where it was. An exit never dilutes the holders who stay.
How it fails
It starts at zero and grows only with volume. A pool nobody trades has no subsidy to pay and no floor to stand on, and this contract cannot manufacture either.
Market.sol

The market

The trade
CALM says quieter than the strike, SHAKE says louder. Both post ETH into one pot. Nobody is levered — no margin, no liquidation, no funding rate, no bad debt, because nothing here can produce any.
When you can take it
Subscription for epoch N runs while N−1 is measured, so the strike is N−2 — final before the window opened. Using N−1 would be staking against a number nobody can see, which is a raffle.
How it settles
Symmetric in ratio, so triple and a third sit the same distance from the strike.
Why the band is three
The first design used a linear ±50% band and saturated 61.65% of epochs against realistic dispersion. A band of three saturates 7.52%. Settled by simulation before a line of Solidity was written.
What voids an epoch
One empty side. Everyone is refunded exactly what they posted and no subsidy is drawn — an epoch with one side is not a market, it is a gift to whoever showed up.
How it fails
Integer division leaves at most a few wei per epoch unclaimed — measured at 0 wei on the fork run. And the whole instrument rests on volatility clustering: if this pool’s variance were stable week to week, every epoch would settle near 50/50 and there would be nothing to trade.
R >= K :  shake = 50% + 50% · min(1, (R/K − 1) / 2)
R <  K :  shake = 50% − 50% · min(1, (K/R − 1) / 2)

           K = strike, the variance rate of epoch N−2
           R = realized, the variance rate of epoch N
TremorHook.sol

The hook

Why a hook at all
It is the only thing present for every swap. Nothing outside the pool can see the tick at the moment it changes, and nothing inside has reason to misreport. That is the only reason this is a hook rather than an indexer.
What it takes
ETH on both sides, opening at 4.00% and decaying once to 1.25% over a day. The clock starts at the first swap, not at deployment.
Where it sends it
The fund, and nowhere else — straight from the PoolManager to the fund’s own address. This contract never holds the money.
What it never touches
Liquidity. Permissions are 0x20CC and the six liquidity bits are clear. Measured at +240 gas on an LP add against a hookless control.
What cannot be changed
Everything. No setter for the fee, the fund, the seismograph or anything else.
How it fails
It adds gas to every swap in the pool — measured, bounded and published. The unluckiest trade of the week pays +84,214 to roll an epoch.
Measured

Gas

On a mainnet fork, beside a hookless control · at 10 gwei
PathGasNote
Swap, nothing due140,963the common case; hook adds 51,316
Swap that takes a reading151,099+10,136
Swap that also rolls the epoch225,177+84,214, once a week
Stake, first in an epoch81,850
Stake, adding to a side47,650
Settle an epoch161,888anyone; draws the subsidy
Claim70,362
Roll standalone85,886anyone, when the pool is idle
Redeem the floor86,675burns TREMOR, pays ETH
Transfer TREMOR53,496
Deployment

The order is forced

Tremor → Seismograph → Fund → HookDeployer → MINE → TremorHook
       → Market → Seismograph.wire(hook) → Fund.wire(hook, market)
       → initialize → openTrading → seed

The hook's constructor takes the token, the fund and the seismograph, so all three must exist before a CREATE2 salt means anything. The salt is bound to the exact init-code bytes: a single changed comment moves the metadata hash, which moves the address, which loses the permission bits.

Launch cost · at 10 gwei
StepGas
Deploy Tremor536,532
Deploy Seismograph647,603
Deploy Fund710,425
Deploy HookDeployer205,020
Deploy TremorHook (CREATE2)1,160,367
Deploy Market1,157,762
Wire the seismograph45,498
Wire the fund73,064
Initialize the pool56,367
Seed the liquidity216,139
Total4,808,777

The pool opens single-sided at tick 175000 — a valuation of 25.13 ETH — seeded with TREMOR and no ETH. Tick spacing is pinned to 200; the Uniswap app defaults to 60 and reverts unless the URL parameter is edited by hand.

Plainly

Risk

The reading is sampled

Sixty-second grid. Everything between two readings is invisible to the instrument. That is what makes wash trading worthless and it also means the number is not true quadratic variation, and is not claimed to be.

The cap understates a crash

1,000 ticks per reading. A real collapse is recorded as smaller than it was, and the person that costs is whoever holds SHAKE that epoch.

Manipulation is priced, not prevented

A large enough actor can move a week's number. It costs fees, impact and arbitrage on every leg, and all of it is paid into the pot they are trying to win — but it is a tax, not a wall.

Volatility may not cluster

If this pool's variance turned out stable week to week, every epoch would settle near 50/50 and the market would be pointless. The whole product rests on regime change being real.

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 less fee and a smaller subsidy.

Nothing has been audited

By anyone but the author. The contracts are tested hard against a mainnet fork — that testing already reshaped the payoff and caught a pricing error — but a simulation written by the same hand is not an audit.

The station, live

Read directly from Seismograph.current(), Market.quote() and Fund.books() over plain JSON-RPC. This page holds no numbers of its own here: while the addresses are empty every line reports that it is not deployed, and it will not show a figure it has not read.

NetworkNot checked
Block
The instrument
Epoch being measuredNot yet deployed
Variance so farNot yet deployed
Readings takenNot yet deployed
Open for subscriptionNot yet deployed
Its strikeNot yet deployed
Staked on calmNot yet deployed
Staked on shakeNot yet deployed
Subsidy waitingNot yet deployed
Floor per TREMORNot yet deployed

Addresses

Tremor
Not yet deployed
Seismograph
Not yet deployed
Fund
Not yet deployed
TremorHook
Not yet deployed
Market
Not yet deployed

Nothing has been read yet.