Skip to main content

LP Fees

Angstrom’s Uniswap-V4 pools support two distinct fee-collection modes.

Locked (batch) state

All swap fees and auction proceeds are captured in our hook and attributed **across every tick range** crossed during the batch. These “batch” fees live in the hook until any LP calls modifyLiquidity (even with zero delta), at which point they’re swept into the PoolManager via the beforeRemoveLiquidity hook and credited to the LP—exactly as V4’s own fees are only settled on modifyLiquidity calls.

Unlocked (normal) state

We set dynamic LP fees via our beforeSwap hook but then let Uniswap V4’s native fee-growth machinery accumulate them in the PoolManager. LPs collect these exactly as in vanilla V4 pool.

Why Collect Fees in the Hook?

When the pool is locked for Angstrom’s on-chain batch, Uniswap’s built-in LP fee is turned off. Instead, we aggregate all swap fees and the auction bid for the given batch and donate them to LPs via our multi-tick donate on the hook. This is necessary

because Uniswap V4’s native donate(amount) credits only the currently active tick. An arbitrage swap crossing ticks A→B→C would mis-allocate all rewards to tick C. This multi tick donate ensures LPs earn pro-rata rewards across all ticks a swap crosses, not just the final one.

Additionally, given we have to donate the auction proceeds each batch, its' more gas efficient to donate the trading fees & auction proceeds once rather than collecting them on each swap.

Collecting Your Fees

You never need bespoke tooling—Angstrom is fully compatible with Uniswap V4’s existing fee-collection flow. See Uniswap V4’s documentation for details.

Tip: you can “poke” with zero delta to harvest without actually changing your liquidity.