GRIMOIRE · LIQUIDITY · VOLATILE
Watcher of Bands
Provides concentrated liquidity to volatile pairs and recasts the range as price wanders. Always positioned, never stranded.
What it does
Volatile-pair LP positions earn fees only while price stays inside the chosen range. Outside the range they earn nothing and accumulate impermanent loss. The Watcher recasts the range as price moves so the position is always earning.
Strategy
- Open a band of width
bandWidthBpscentered on the current price. - Every
checkEveryMinminutes, check the price relative to the band. - If price has moved past the recast threshold (default: 60% of half-width), close and reopen centered on the new price.
- Honor
maxRecastPerDayto prevent gas-bleed in chop.
The agent uses a single-sided rebalance when possible — swapping only the surplus token — to minimise impact and gas.
Parameters
| Parameter | Default | Meaning |
|---|---|---|
bandWidthBps | 500 | Half-width of the active range, in basis points. |
recastThresholdPct | 60 | Recast when price has moved this fraction of the half-width. |
maxRecastPerDay | 8 | Cap on daily recasts. Protects against chop bleed. |
haltImpermLossBps | 500 | Halt if IL exceeds this; you can resume manually. |
Venues
- Uniswap v3 — deepest on Base for blue-chip pairs.
- Aerodrome Slipstream — concentrated liquidity with AERO emissions.
Risks
Example intent
typescriptimport { defineIntent, USDC, WETH, BASE } from "@magicscodes/sdk";
import { watcherOfBands } from "@magicscodes/spells";
export const ethLpIntent = defineIntent({
goal: "Provide concentrated liquidity to ETH/USDC and harvest fees",
budget: { assets: [WETH, USDC], totalUsd: 5000n },
bounds: {
chains: [BASE],
venues: ["uniswap-v3", "aerodrome-slipstream"],
bandWidthBps: 350, // ±3.5% range
maxRecastPerDay: 6,
haltImpermLossBps: 400,
},
cadence: {
checkEveryMin: 5,
notifyOn: ["recast", "halt"],
},
agentHint: watcherOfBands,
});