Documentation

A price for volatility, measured by the pool itself.

Every mechanism in Volatus, in the order a skeptic would want to check it: the measurement, the price, the settlement, the attack it resists, and the addresses where all of it is actually deployed.

The 30-second version

A protocol pays LPs to bear impermanent loss by emitting tokens forever. That is a premium, paid in the worst possible currency. Volatus lets a protocol buy the same risk transfer as insurance instead — priced by a market, settled in USDC, for a term that ends.

  1. A v4 hook measures how much a pool is actually moving, straight from its own swap data. No oracle.
  2. Two tokens trade against that measurement — STORM pays out when it moves, CALM pays out when it stays quiet. What they trade at is implied volatility.
  3. A treasury buys STORM for its LPs, or takes the other side itself: post USDC, mint pairs, hand STORM to LPs in place of emissions, keep CALM.
Liquidity mining is an insurance premium paid in inflation. Volatus turns it into a market.

Who’s on each side

ActorPuts inGets out
Protocol treasury (buyer)USDC premiumLPs hedged, without emissions
Token owner as underwriterUSDC collateralSTORM to distribute, CALM retained
Liquidity providerNothing, or a small premiumFee yield with the price risk stripped out
Volatility sellerBuys CALMPremium income, loss capped by design
Any protocolOne view callMarket-implied volatility

The second row matters most for bootstrapping: a protocol underwriting its own pool needs no counterparty at all. It mints both legs, keeps one, distributes the other — that path works on day one, with nobody else in the market.

The problem

EmissionsWhat insurance should be
CostPermanent dilution, paid regardlessPay for realized risk
PricingSet by governance guessworkSet by a market
DurationCompounds foreverEnds when the term ends
RetentionLiquidity leaves when emissions slowNothing to leave — risk transferred, not rented

A concentrated liquidity position is, in payoff terms, a short straddle: fees collected as premium, losses in either direction. LPs are short gamma and were never told, and nothing lets them know how much, buy protection against it, or price that protection — outside BTC/ETH, nowhere.

The mechanism

Three layers. The first two live on Uniswap; the third is a payment rail.

  1. swapthe pool

    Someone trades against the pool and the tick moves.

  2. Δticka log price

    That move is a change in a log price — a Uniswap tick already is one.

  3. Σ(Δtick)²accumulator

    Squared and added on every swap. That running sum is realized variance.

  4. STORM · CALMerc-20 pair

    At epoch end the accumulated variance splits one dollar between the two legs.

  5. impliedVol()any contract

    A view call. Any contract reads today's volatility number from it.

Layer 1 — measurement

A Uniswap tick is already a log price: tick = log₁.₀₀₀₁(price). Realized variance is a sum of squared tick deltas — no logs, no oracle, no external feed.

solidity
realizedVariance(epoch) = Σ (Δtickᵢ)² × (ln 1.0001)²

Layer 2 — settlement

Strike K and cap C normalize the accumulator into a payoff in [0, 1]. Both legs floor independently, so the pair can never redeem for more than 1 USDC combined.

solidity
V = accumulator * (ln 1.0001)^2
p = clamp(V - K, 0, C - K) / (C - K)
STORM VAR-LONGredeems for p USDC
CALM VAR-SHORTredeems for 1 − p USDC

Layer 3 — coverage as a subscription

Circle Nanopayments removes the batching floor — gas-free USDC transfers down to $0.000001, verified in under a second, batched onchain later. A treasury streams premium per second at the prevailing market IV; coverage accrues tick by tick and lapses the moment the stream stops. No term, no expiry, no lockup.

Manipulation resistance

The index settles money, so it has to resist a STORM holder wash-trading the pool to manufacture variance. Three structural defenses, and the second one is measured, not argued.

One observation per blockIntra-block round trips contribute nothing — the cheapest attack is eliminated outright, not merely made expensive.
Break-even multiple694×Ten round trips across twenty blocks cost 0.30 units of currency and moved the payoff 0.00144 — an attacker needs 694× the attack’s cost in STORM before manufacturing variance breaks even. test/fuzz/ManipulationCost.t.sol.
Per-observation clampingMAX_TICK_DELTA bounds any single observation, so a one-block dislocation cannot dominate an epoch.

The honest form of the claim is conditional: there is always some position large enough to fund an attack. The defenses put it multiple orders of magnitude above the attack’s cost, not out of reach in principle.

Architecture

Two chains, two jobs. The index, the collateral and settlement live entirely on Unichain. Arc is a payment rail for a subscription — never part of settlement.

Unichain Sepolia

Measurement · price discovery · settlement

  • Underlying v4 pool — every swap moves the tick
  • VolatusHook — accumulates variance in afterSwap
  • VolatusVault — mint / burn / settle, holds USDC collateral
  • Variance v4 pool — STORM / USDC, where IV is discovered
  • VolatusOracleimpliedVol(), the public feed
Arc Testnet

Streaming premium — the payment rail only

  • VolatusStream — subscription registry, coverage accrual
  • Underwriter capacity, posted in USDC
  • USDC is simultaneously native gas and an ERC-20 — same funds, two views
  • A permissionless sync keeper, gated on gas-vs-premium economics
  • If Arc is unavailable, streams stop and coverage lapses — nothing is stuck

Epoch lifecycle

OpenMint / trade / accrueFrozenSettledRedeemed

Contract surface

The integration point for any other protocol is one view call. Everything else is the vault a treasury actually calls.

solidity
interface IVolatusOracle {
    /// Market-implied volatility for a pool, annualized, 1e18 fixed point.
    function impliedVol(PoolId id) external view returns (uint256);

    /// Realized variance accumulated so far in the current epoch.
    function realizedVariance(PoolId id) external view returns (uint256);

    function epoch(PoolId id)
        external view returns (uint64 endBlock, uint256 strike, uint256 cap);
}
solidity
interface IVolatusVault {
    /// Deposit `amount` USDC, receive `amount` of each leg.
    function mintPair(PoolId id, uint256 amount) external;

    /// Return one of each leg before settlement, receive USDC back.
    function burnPair(PoolId id, uint256 amount) external;

    /// Freeze the payoff from the accumulator. Permissionless after endBlock.
    function settle(PoolId id) external returns (uint256 payoffX18);

    /// Redeem a settled leg for its share of collateral.
    function redeem(PoolId id, bool long, uint256 amount) external;
}

One line reads the whole feed: uint256 iv = volatusOracle.impliedVol(poolId);

Deployments

Live, testnet only. These are the same constants the app and the backend services read — one source of truth, so this list cannot drift from what is actually deployed.

Unichain Sepolia · 1301
VolatusOracleintegration point
0x51f7D166FE0C040F9e9Ee7236Bc3dC3E2183B33a
VolatusHook
0x9215C247Ec3C0082A4bfC26515427c2737D1d040
VolatusVault
0xF45894c8384c440FC63Da67Bc6050e77FcaF4e83
VarianceToken impl.cloned per leg
0xBE28c060b7F6Cb8C055430eA1CE75d8C577b2d21
PoolManagerUniswap v4
0x00B036B58a818B1BC34d502D3fE730Db729e62AC
Arc Testnet · 5042002
VolatusStreamlive epoch 2
0xE44b6a47b29b097CE5c20BF17830cfb5df734354
USDC (ERC-20 view)also native gas, 18dp
0x3600000000000000000000000000000000000000

Read the number yourself: cast call 0x51f7D166FE0C040F9e9Ee7236Bc3dC3E2183B33a "impliedVol(bytes32)(uint256)" <poolId> --rpc-url https://sepolia.unichain.org

Agents & delegation

Two agents hold Circle Wallets and act on signals read from the contracts above, not from prompts. A continuously-priced market only exists if both sides reprice every tick — no human requotes a volatility surface every second.

AgentSignalAction
Hedger (treasury side)Gamma exposure × live accumulator; IV from the vol poolAdjusts streamed rate and coverage notional within the mandate
Underwriter (seller side)Realized vs implied spread; inventory concentrationRequotes offered rate; withdraws capacity as risk concentrates

Privy secures the delegation. The agent signs with a session signer under a TEE-enforced policy — a compromised backend cannot move a treasury’s funds anywhere except into premium payments on the pool it authorized, and cannot exceed the mandate.

policy
Policy: volatus-hedger-v1
  |- allow  method: streamPremium | adjustCoverage
  |- allow  target: VolatusStream only
  |- deny   all ERC20 transfers to other recipients
  |- cap    cumulative spend <= declared mandate

Limitations

Stated plainly, because a judge will find them anyway.

  • Testnet only, on Unichain Sepolia and Arc Testnet. Nothing here moves real funds.
  • Liquidity in the vol pool is seeded by the team and the demo counterparty is a script — the mechanism of price discovery is demonstrated, its depth is not.
  • The reporter that mirrors settlement onto Arc is a single held key today, not a multisig — the one privileged role in the system.
  • Manipulation resistance is measured against a specific attack shape, not proven against every conceivable one — see ManipulationCost.t.sol.