The hook that rewards
loyal LPs
Retention scoring, partial IL compensation, tier badges, and Aave-compounded rewards. Live on Base Sepolia.
Mercenary capital leaves when you need it most
In volatile pools, LPs withdraw exactly when liquidity matters most. Impermanent loss drives them out, depth collapses, and slippage spikes for everyone left behind.
IL drives exits
When price moves, LPs realize impermanent loss. The rational response is to flee high-volatility pools, the very pools that need depth.
Depth collapses
As liquidity leaves, the remaining LPs face wider spreads and worse fills. Volatility and thin books feed each other.
Incentives are external
Liquidity mining and ve-tokenomics patch this with emitted tokens and lockups. They bolt incentives on from outside the AMM.
Holdfast moves the incentive into the hook itself. No external token, no lockup. Loyalty is scored and rewarded natively at the protocol level.
Four mechanisms, one loyalty loop
Retention scoring
Every position accrues a score from liquidity share, tenure (blocks active), and pool volatility. Loyalty and stability are rewarded, not just position size.
score = liquidity share × tenure (blocks) × pool volatility
Partial IL compensation
Realized impermanent loss is computed at claim time with log-return math (Solady lnWad), and a portion is compensated from a shared bonus pool. This is honest: the compensation is partial and bounded by the pool. It is not a full hedge.
Tier badges
Reaching Bronze, Silver, or Gold requires both a score threshold and a minimum tenure in blocks. The dual criterion filters mercenary capital that arrives and leaves quickly. Each tier is an on-chain ERC-721 badge with real IPFS art.
Aave V3 yield compounding
Idle bonus pool USDC is supplied to Aave V3, held as aUSDC. The reward pool earns yield while it waits to be claimed, so it grows on its own.
Subscriber-native by design
One contract implements both a Uniswap v4 BaseHook and an ISubscriber. Position ownership and liquidity come from the canonical PositionManager through subscriber callbacks, keyed by tokenId. There is no caller-asserted identity.
capture 15% of USDC delta
aUSDC
mint, modify, burn
keyed by tokenId
score, tier, claim
Fee capture redirects a fixed portion (default 15%) of the existing pool fee into the bonus pool. Swappers pay no extra fee; the share is taken as USDC and supplied to Aave.
One loyalty cycle, on-chain
A live cycle on Base Sepolia: accrue score, reach a tier, let real swaps fund the pool, then claim a share. The pool refills from swap flow, with no manual seeding.
-
01 · Accrue
Score builds on every swap
A subscribed position accrues score from liquidity share, tenure, and volatility as swaps move through the pool.
-
02 · Reach tier
Silver badge is minted
Once the score threshold and the minimum tenure are both met, the hook mints a tier badge. In the live demo, position #24915 reached Silver.
-
03 · Capture
Swaps fund the bonus pool
WETH to USDC swaps redirect 15% of the USDC delta, scaled 1.0x to 1.5x by volatility, into the YieldRouter and on to Aave. In the demo the router aUSDC grew from 0 to ~0.20 USDC, purely from capture.
-
04 · Claim
The loyal LP gets paid
The bonus pool splits into a 70% tier arm (Bronze 25 / Silver 35 / Gold 40, pro-rata by score within a tier) and a 30% realized-IL arm. As the sole Silver member, the position claims about 24.5% of the pool.
Accrue, reach tier, capture funds the pool, claim pays out. The cycle is self-funding from real swap flow.