TodayUniswap's VolatilePair Hook is set to launch on Ethereum mainnet, starting with ETH/USDC. See Uniswap's blog postMore details
Live$VOL is live on Ethereum.CA: pendingWhat $VOL does

Launch Volatile hooks for any volatile pair.

VolatileFi is a launchpad for Uniswap's newest Volatile Pair hooks. Pick a template, set how buy and sell fees react to the market, and deploy the hook to Ethereum from the dashboard or the API.

ETH / USDC
Pricereading chain
Buy fee0.00%
Sell fee0.00%
Market...
connecting
Buy fee, drawn above priceSell fee, drawn below priceLive Uniswap swaps on Ethereum, priced with the VolatilePair template. Band width is scaled up to be visible.

Start from a template.

Each template is a ready-made fee strategy you tune with parameters. Deploying one gives you your own hook contract, owned by your wallet.

Why two fees beat one.

A single static fee charges everyone the same, so the fastest traders profit from stale prices while LPs pay for it.

Chasers pay more

When the price runs, the side trading with the move is usually informed flow. Its fee rises, and LPs are paid for the risk they take.

Rebalancers pay less

The side trading against the move helps pull the pool back to fair value. Its fee drops, so that flow keeps coming.

Quiet markets stay cheap

When nothing is moving, both fees settle at your floor, so normal swaps cost what they would on a standard pool.

01Choose a templateVolatilePair, Range Guard, Launch Shield or Flow Tilt.
02Set parametersFloor, ceiling, reaction window and how far fees can tilt.
03DeployOne transaction mines the hook address and deploys it.
04Attach poolsCreate v4 pools with the hook, or point the API at it.

Built for developers

Everything in the dashboard is also in the REST API. Create hooks, attach pools and read live fees with an API key tied to your wallet.

# current buy and sell fee for a pool
curl https://api.volatile.finance/v1/pools/{poolId}/fees \
  -H "Authorization: Bearer $VOLATILEFI_KEY"

{
  "buyFee": 4120,   // hundredths of a bip
  "sellFee": 2210,
  "move": 0.41,
  "tilt": 0.30,
  "block": 26193248
}

Build a hook

Configure a fee strategy, preview it against live ETH/USDC swaps, then deploy it as your own Uniswap v4 hook on Ethereum.

Hook

Name and owner are written into the contract.

Can tune parameters within the bounds below

Fee curve

Fees are per side. Values are percentages of the trade.

Lowest fee either side can pay
Highest fee, reached in fast markets
Blocks the hook looks back over. Shorter reacts faster.
How far buy and sell fees can split apart

Signal and fees

Where the hook reads the market, and where fees go.

API keys

Keys let your apps and bots create hooks, attach pools and read fees through the VolatileFi API. Each key is issued to the wallet that signs for it.

New key

You'll sign a message to prove you own the wallet. Nothing is sent on chain.

Your keys

Connect a wallet to see its keys.

NameKeyPermissionsCreated
No keys yet.

VolatileFi documentation

VolatileFi deploys Uniswap v4 hooks that charge a separate fee to each side of a swap and move both fees with the market. This guide covers how the fees work, how to deploy a hook from the dashboard or the API, how to attach pools, and the full API reference.

Base URL for every API call: https://api.volatile.finance/v1. All examples use Ethereum mainnet (chain id 1).

Getting started

What VolatileFi is

A Uniswap v4 pool can name a hook contract that runs code around each swap. A dynamic fee hook uses that to set the LP fee for every swap instead of using one fixed fee tier. VolatileFi is a launchpad for these hooks. You choose a fee strategy from a template, set its parameters, and deploy your own copy of the hook. You own it, and any pool you create with it uses your fee rules.

On the same day Uniswap brings its own VolatilePair Hook to ETH/USDC, VolatileFi lets anyone deploy the same kind of two-sided fee for any pair.

Quickstart

  1. Open Build and connect a wallet on Ethereum mainnet.
  2. Pick a template. VolatilePair is the right choice for most pairs.
  3. Set a floor and ceiling fee, a reaction window and a max tilt. The preview replays your settings on the last hour of live ETH/USDC swaps.
  4. Click Deploy hook and confirm the transaction. The factory mines a valid hook address and deploys your hook in the same transaction.
  5. Create a pool with the hook (see Attaching pools) or call POST /hooks/{id}/pools.

Key terms

TermMeaning
Buy feeFee on swaps that buy the pool's base token (price goes up).
Sell feeFee on swaps that sell the base token (price goes down).
MoveAverage size of recent per-block price changes, in basis points.
TrendAverage direction of recent price changes.
TiltHow far the two fees are pushed apart, from -1 to 1, scaled by max tilt.
Fee unitsUniswap v4 fees are in hundredths of a basis point. 3000 is 0.30%. The maximum is 1000000 (100%).

How fees move

The fee model

On every swap the hook updates two exponential averages over the reaction window W blocks, then derives the two fees.

alpha = 2 / (W + 1)
r     = ln(price_now / price_prev) * 10_000          // bps
move  = alpha * |r| + (1 - alpha) * move
trend = alpha * r   + (1 - alpha) * trend
base  = floor + (ceiling - floor) * min(1, move / scale)
tilt  = clamp(trend / move, -1, 1) * maxTilt
buy   = max(floor, base * (1 + tilt))
sell  = max(floor, base * (1 - tilt))

When the price is rising, trend is positive, the buy fee goes up and the sell fee goes down. Buyers chasing the move pay more. Sellers who bring the price back pay less.

Why LPs earn more

With a fixed fee, a trader who sees a price change on another venue first can trade against the pool's stale price. The LP loses the difference, often called loss-versus-rebalancing. A higher fee on the side that is chasing a move takes part of that difference back for LPs. A lower fee on the other side keeps ordinary flow coming and helps the pool reach fair value faster.

Templates

TemplateUse it forExtra parameter
VolatilePairMost volatile pairs. Fees rise with volatility and split with the trend.volScaleBps: per-block move that reaches the ceiling
Range GuardPairs that usually trade near a fair value. Cheap inside a band, expensive on a breakout.bandBps: distance from the slow average before fees climb
Launch ShieldNew tokens. Starts near the ceiling to absorb sniping, then eases into a normal curve.shieldBlocks: blocks until the launch premium is gone
Flow TiltPairs where order flow leads price. Tilts by the buy and sell volume imbalance.flowWeightPct: share of tilt from flow instead of price

Parameters and limits

FieldTypeRangeNotes
floorFeeuint24100 to 100000.01% to 1%
ceilingFeeuint24floor + 1000 to 100000Up to 10%
windowBlocksuint163 to 60About 36 seconds to 12 minutes
maxTiltBpsuint160 to 90000 makes both fees equal
lpShareBpsuint168000 to 10000The rest goes to the hook owner

Deploying

From the dashboard

The Build page encodes a single call to the VolatileFi factory, deployHook(...). The factory searches for a CREATE2 salt whose resulting address carries the right v4 permission bits for the template, then deploys. The hook address is returned in the HookDeployed event.

Hook address bits

Uniswap v4 reads a hook's permissions from the lowest 14 bits of its address. VolatileFi templates use:

TemplateFlags
VolatilePair, Range GuardBEFORE_SWAP, AFTER_INITIALIZE
Launch ShieldBEFORE_SWAP, AFTER_INITIALIZE
Flow TiltBEFORE_SWAP, AFTER_SWAP, AFTER_INITIALIZE

Ownership and changes

The owner can change parameters only inside the template's limits, and every change waits 24 hours before it applies. Pending changes are public, so LPs can see them coming. Ownership can be transferred or renounced. A renounced hook keeps its last parameters forever.

Attaching pools

Pool key

A pool uses your hook when its PoolKey names the hook and sets the dynamic fee flag in the fee field:

PoolKey({
  currency0:   0x0000000000000000000000000000000000000000, // ETH
  currency1:   TOKEN,
  fee:         0x800000,   // LPFeeLibrary.DYNAMIC_FEE_FLAG
  tickSpacing: 60,
  hooks:       YOUR_HOOK
})

Initialize it through the v4 PoolManager at 0x000000000004444c5dc75cB358380D2e3dE08A90 on Ethereum, then add liquidity through the v4 position manager as usual.

Reading fees on chain

interface IVolatileFiHook {
    /// Fees the next swap would pay, in hundredths of a bip.
    function currentFees(PoolId id) external view returns (uint24 buyFee, uint24 sellFee);
    /// Running averages behind those fees.
    function state(PoolId id) external view returns (int256 trend, uint256 move, uint64 lastBlock);
    function params() external view returns (Params memory);
    function owner() external view returns (address);
}

Inside beforeSwap the hook returns the side's fee with LPFeeLibrary.OVERRIDE_FEE_FLAG set, so each swap pays exactly the fee shown by currentFees for its direction.

API reference

Authentication

Create a key on the API keys page. Send it as a bearer token:

Authorization: Bearer vf_live_...

Keys carry permissions. read is always included. deploy allows preparing hook and pool transactions. params allows proposing parameter changes on hooks your wallet owns. The API never holds your private key. Endpoints that change chain state return an unsigned transaction for you to sign.

Rate limits

PermissionRequests per minute
read600
deploy, params60

Holding $VOL raises these limits. See The $VOL token.

Responses include X-RateLimit-Remaining and X-RateLimit-Reset.

Hooks

POST/hooks

Validates a hook config and returns the deploy transaction. Needs deploy.

{
  "template": "volatilepair",
  "name": "PEPE/ETH VolatilePair",
  "owner": "0x...",
  "params": { "floorFee": 500, "ceilingFee": 30000, "windowBlocks": 20, "maxTiltBps": 6000, "volScaleBps": 12 },
  "signal": { "type": "pool" },
  "lpShareBps": 10000
}

Response:

{
  "id": "hk_7Qm2...",
  "predictedAddress": "0x...1080",
  "tx": { "to": "0xFactory...", "data": "0x...", "value": "0x0", "chainId": 1 }
}
GET/hooks

Hooks owned by the key's wallet. Supports ?template= and ?cursor=.

GET/hooks/{id}

Config, deployed address, owner, pending changes and attached pools.

PATCH/hooks/{id}/params

Returns a transaction that proposes new parameters. They apply 24 hours after it confirms. Needs params.

Pools

POST/hooks/{id}/pools

Returns the transactions to create and seed a pool that uses the hook.

{ "currency0": "ETH", "currency1": "0xToken...", "tickSpacing": 60, "sqrtPriceX96": "79228162514264337593543950336" }
GET/pools/{poolId}

Pool key, hook, liquidity and 24 hour volume.

GET/pools/{poolId}/fees
{ "buyFee": 4120, "sellFee": 2210, "move": 0.41, "tilt": 0.30, "block": 26193248 }
GET/pools/{poolId}/history

Per-block fees and price. Query with ?from= and ?to= block numbers, up to 10,000 blocks per call.

Webhooks

POST/webhooks

Register a URL for events: hook.deployed, pool.created, params.proposed, params.applied and fee.crossed (fires when a side's fee crosses a threshold you set). Each delivery is signed with an X-VolatileFi-Signature header, an HMAC-SHA256 of the body using your webhook secret.

DELETE/webhooks/{id}

Stops deliveries for that webhook.

Errors

StatusCodeMeaning
400invalid_paramsA value is outside the template's limits. The response names the field.
401bad_keyMissing, revoked or unknown key.
403missing_scopeThe key lacks the permission this call needs.
403not_ownerThe key's wallet does not own this hook.
404not_foundNo hook or pool with that id.
429rate_limitedWait until X-RateLimit-Reset.

JavaScript example

const res = await fetch("https://api.volatile.finance/v1/hooks", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.VOLATILEFI_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify(config)
});
const { tx, predictedAddress } = await res.json();
const sent = await wallet.sendTransaction(tx);   // ethers v6 signer
await sent.wait();
console.log("hook live at", predictedAddress);

The $VOL token

$VOL is the token of VolatileFi. It is live on Ethereum mainnet with a fixed supply of 1,000,000,000.

Paying for deployments

Deploying a hook through the VolatileFi factory can be paid in ETH or in $VOL. Paying in $VOL costs less, and the $VOL used is burned.

Higher API limits

Keys issued to a wallet that holds $VOL get higher rate limits. The limit is read from the wallet's balance when the key is used, so moving tokens out lowers it again.

$VOL heldread per minutedeploy, params per minute
None60060
100,0003,000300
1,000,00012,0001,200

Choosing new templates

New fee strategies are added to the factory by $VOL holder vote. Holders also vote on the limits each template allows, such as the highest ceiling fee and the shortest reaction window. A vote runs for five days and a passed change waits two more days before it applies.

Safety

What to know

  • Fees are capped by the ceiling you set. A swap can never pay more than that.
  • The hook cannot move funds out of a pool. It only sets the fee.
  • Parameter changes are delayed 24 hours and are visible on chain while pending.
  • A pool's hook cannot be swapped later. To change templates, create a new pool.
  • Pool price signals can be pushed within a block. Templates average across blocks to blunt this, and the Chainlink signal option avoids it entirely.