Weather
σ and the fee it sets, last 2 hours
Storm insurance for Uniswap v4 LPs
A Chainlink CRE risk desk reads ETH on Coinbase, Kraken, Binance and Hyperliquid every 30 seconds. A Uniswap v4 hook turns that volatility into the fee of every swap: 5 bp in calm markets, more as the storm builds, never above 150 bp.
Weather
σ and the fee it sets, last 2 hours
Fee now · pool V
… bp
vs … bp in pool S · … mode
CL-1 · risk desk
#…Chainlink CRE simulator · 1 node
Measured on four venues (Deribit DVOL logged alongside) · their median taken by a Chainlink CRE workflow · charged in a Uniswap v4 hook on Ethereum
The problem
A static pool charges the same fee in a calm and in a storm. When ETH lurches, arbitrageurs trade against the stale price, and the LPs pay for it. clim lets the fee read the weather.
The cost has a name: loss-versus-rebalancing (Milionis, Moallemi, Roughgarden & Zhang, 2022). How clim prices it →
How it works
Coinbase · Kraken · Binance · Hyperliquid · Deribit DVOL
Every 30 seconds a Chainlink CRE workflow reads one-minute ETH candles from four exchanges and computes the 15-minute realized volatility, σ. Deribit's DVOL is logged alongside, for comparison; it does not enter σ.
A venue whose last candle is older than 120 s is dropped; with fewer than three, there is no report.
Chainlink CRE workflow → RiskDesk on Ethereum Sepolia
The workflow takes the median of each field with CRE's consensus API and writes one report to RiskDesk, which keeps the latest one for the hook.
Today it runs in CRE's simulator, on one node: our operator key sends each report through MockKeystoneForwarder, which checks no signature. It is written with CRE's consensus API for a DON, whose nodes would sign the report, but it has not run on one: DON deploy access, requested on 6 October, was not granted during the hackathon.
No function sets σ or the fee. In this build the owner key is also the simulation operator, so until it disables simulation and renounces ownership it can post reports itself (through the mock forwarder, or later through a forwarder it sets), inside the same bounds as any report: σ ×2 up or ×0.8 down per report, 10% to 1000% a year, a fee of 5 to 150 bp.
Coinbase
1-min ETH candles
Kraken
1-min ETH candles
Binance
1-min ETH candles
Hyperliquid
1-min ETH candles
Deribit DVOL
logged alongside, not in σ
Chainlink CRE
simulator · 1 node · median of each field
σ …… bp apart · …/4 venues
RiskDesk
report #…
Ethereum Sepolia
ClimHook
quoteFee()
…
Pool V
…
Pool S
…
ClimHook.quoteFee() inside every swap
When prices move, the fastest traders, arbitrageurs racing to the pool's stale price, profit at the LPs' expense. clim makes that speed cost more in a storm and charges the market's usual fee when it is calm.
Nobody sends a transaction to change the fee. On every swap the PoolManager calls the hook, which reads the latest report and returns η · σ · √(Δt/2), between 5 and 150 bp.
The same fee in both directions, for any size. Try it: drag σ and read the fee.
σ 40 %/yr → pool V's fee, normal mode5.00bp
The hook's formula with the lab's parameters: at the desk's 1000 %/yr ceiling and k = 1 it charges 109.46 bp, so the 150 bp cap binds only when a report raises k (up to 2: from about 685 %/yr at k = 2). The pink dot is the desk's σ now.
When the desk cannot be trusted, the fee does not guess
Degraded: the venues disagree by more than 25 bp, so the fee holds at 30 bp or more.
Blind: the desk is silent for 180 s, so the hook quotes at 30 bp or more until a fresh report lands.
Desk checks
As the hook sees the desk now
Pools
Same pair. Our retail bot sends every order to both pools, and the same arbitrage bot trades both. One fee reads the weather; the other never moves.
The window's weather
σ and the fee it set, last hours
Waiting for reports…
Waiting for swaps on both pools…