The Weather — the dynamic fee
The buzz
Flies don't fly the same in a storm. Neither does the pool.
When the market is calm the LP fee is cheap. When it is violent the LP fee is expensive. And — this is the bit other "dynamic fee" pools get wrong, few understand — if your trade is the one that causes the violence, YOU pay for it, in that same trade, not the poor fly who trades after you. The whale pays the whale tax. The minnow pays minnow prices. Justice, in pips.
The dashboard shows this as weather:
| Weather | Score | LP fee | Mood |
|---|---|---|---|
| 0–19 | 0.20 – 0.30 % | nothing happening, fee near the floor | |
| 20–39 | 0.31 – 0.41 % | getting busy | |
| 40–59 | 0.42 – 0.52 % | hard to see the price from here | |
| 60–79 | 0.53 – 0.63 % | hold on to something | |
| 80–100 | 0.64 – 0.75 % | fee at the ceiling, for everyone's protection |
The labels are just labels — vibes for the screen. The fee underneath is continuous, and it does not care what the label says.

The boring part
The LP fee for a swap is:
fee = 0.20% + 0.55% × intensity / 100
so it lives between 0.20% (2,000 pips) and 0.75% (7,500 pips). Those two ends are constants in the code; no key can move them. Not the controller, not the creator, not a "community vote" at 3am. Bytecode does not take votes.

intensity (0–100) blends two scores:
- Regime — an exponentially weighted average of how far the price has moved between swaps, which halves every 15 minutes of quiet. This describes the market. It is inherently one swap behind, and that is fine for what it measures — it is the forecast, not the lightning.
- Impact — how far this swap is projected to move the price, computed from the swap's own size against the pool's current liquidity, before it executes. Zero lag. The causer pays. You ARE the weather, anon.
They blend 60% regime / 40% impact. Both scores saturate at a price move of 100 / k
percent; k (turbulenceK, impactK) is 15, so a move of about 6.7% scores 100.
Translation: a trade that moves the price 6.7% is a CHAOS-tier trade and pays like one. The
blend and k are set once, in the hook's constructor, and cannot be changed — by anyone.
Who gets the LP fee
Every liquidity provider in the pool, pro rata: the creator's seed position, the protocol's own locked bids, and anyone else who adds liquidity. The hook does not touch it. The storm pays the people who stood in it.
What can be tuned
Nothing. The 0.20% floor, the 0.75% ceiling, the 15-minute half-life, the 60/40 blend and
k are all fixed — the first three as constants in the library, the last two in the hook's
constructor with no setter. The LP fee can never be 0%, and it can never be "oops 99% for a
block". Those numbers are not settings; they are the contract.
Reading it on the dashboard
marketState() on the hook reports the ambient weather — the regime decayed to right now,
with no trade folded in. A specific trade's fee is always at least that, and more if the trade
is large. The television quotes the real thing through Uniswap's Quoter, which runs the hook
for real, so the quote you see includes your own impact. What you see is what you pay. No
surprise weather at confirm. ⛈️🪰