BurnerHook
EthereumBurnerHook is a Uniswap v4 hook on Ethereum. Runs code on every swap. Can take tokens from swaps. Can block LP withdrawals. Gates who can add liquidity. Runs at pool creation. Handles donations to LPs.
- Contract name
- BurnerHook
How this hook works
Trading taxA trading tax hook. It takes a cut of every trade, manages its own liquidity and burns tokens.
Takes a cut of every trade
On top of the normal pool fee, it keeps a share of each trade. The fee is paid out in the same trade.
The code that does this (beforeSwap):function beforeSwap(address, PoolKey calldata, SwapParams calldata params, bytes calldata) external onlyPoolManager returns (bytes4, BeforeSwapDelta, uint24) { bool exactIn = params.amountSpecified < 0; uint256 fee; if (exactIn && !params.zeroForOne) fee = ofGross(uint256(-params.amountSpecified)); else if (!exactIn && params.zeroForOne) fee = ofNet(uint256(params.amountSpecified)); burn(fee); return (IHooks.beforeSwap.selector, toBeforeSwapDelta(fee.toInt128(), 0), 0); }Manages its own liquidity
It adds and removes liquidity itself, so it can own part or all of the pool.
The code that does this (unlockCallback):function unlockCallback(bytes calldata data) external onlyPoolManager returns (bytes memory) { (address from, uint256 eth, uint256 bits, uint128 minLiquidity) = abi.decode(data, (address, uint256, uint256, uint128)); PoolKey memory key = poolKey(); (uint160 price,,,) = POOL_MANAGER.getSlot0(key.toId()); uint128 liquidity = LiquidityAmounts.getLiquidityForAmounts( price, TickMath.getSqrtPriceAtTick(TICK_LOWER), TickMath.getSqrtPriceAtTick(TICK_UPPER), eth, bits ); if (liquidity == 0 || liquidity < minLiquidity) revert TooLittleLiquidity(); (BalanceDelta delta,) = POOL_MANAGER.modifyLiquidity( key, ModifyLiquidityParams({ tickLower: TICK_LOWER, tickUpper: TICK_UPPER, liquidityDelta: int256(uint256(liquidity)), salt: 0 }), "" ); eth = (-delta.amount0()).toUint128(); bits = (-delta.amount1()).toUint128(); POOL_MANAGER.settle{value: eth}(); POOL_MANAGER.sync(key.currency1); BITS.safeTransferFrom(from, address(POOL_MANAGER), bits); POOL_MANAGER.settle(); return abi.encode(eth, bits, liquidity); }Burns tokens
It destroys some tokens (or sends them to an address nobody controls), so there are fewer of them.
The code that does this (beforeSwap):function beforeSwap(address, PoolKey calldata, SwapParams calldata params, bytes calldata) external onlyPoolManager returns (bytes4, BeforeSwapDelta, uint24) { bool exactIn = params.amountSpecified < 0; uint256 fee; if (exactIn && !params.zeroForOne) fee = ofGross(uint256(-params.amountSpecified)); else if (!exactIn && params.zeroForOne) fee = ofNet(uint256(params.amountSpecified)); burn(fee); return (IHooks.beforeSwap.selector, toBeforeSwapDelta(fee.toInt128(), 0), 0); }Liquidity can’t be added or removed directly
Nobody can add or remove liquidity through Uniswap directly. Liquidity only moves through the hook’s own code.
Only the hook creates its pools
Nobody can create a pool with this hook directly. Pools are only created through the hook’s own code.
Who controls it: Nobody. The hook has no admin functions, and the code cannot be changed.
What do these labels mean? Based on the hook’s published code.
What it can do
Its code executes inside each trade in pools that use it.
It can take or add tokens during a swap. Fees, burns and custom curves work this way, and so do scams.
It runs before liquidity is removed, so it can delay or refuse LP exits.
It checks every deposit before it goes in.
It runs when a pool is created, often to lock in that pool’s settings.
It runs when someone donates tokens to the pool’s LPs.
Hook history
- Added 5 times
Latest transactions
- 0x13c19a60…ae1d8f block 26,397,037
- 0x25b69924…9c3255 block 26,396,949
- 0xe0a6a52c…926d6c block 26,396,852
- 0x7cf42bb7…b1b1c6 block 26,396,770
- 0x0b52800a…ce886b block 26,396,664
Counted from what the hook recorded on-chain across all its pools, for every action in its published code, plus token transfers in and out of it.