HaloHook on Ethereum
Uniswap v4 Hook Contract 0xaea739d4a978bb4c22f2e43bd008817979a860cc on Ethereum · Dynamic fee · Verified contract
- Volume (24h)
- $0
- Value locked (TVL)
- $13.35K
- All-time volume
- $399.57K
- Pools using this hook
- 1
- Swaps (24h)
- 0 (0 traders)
- Total swaps
- 440
What it does
A Uniswap v4 hook for the Halo token that charges ETH tax on buys and sells, with a high ignition tax that decays over 30 minutes and phase-based refunds on buys near the apex or during recoil.
How it works step by step
- Charges ETH tax on every buy and sell, with an ignition tax starting at 30% and decaying by 1% per minute for 30 minutes.
- After ignition, buys pay 3% baseline tax and sells pay phase-based tax (crown 6%, mid 3%, recoil 12%).
- Accrues buy refunds of up to 3% or 6% in crown or recoil phases, claimable after 25 blocks if the buyer still holds tokens.
- Keeps all taxed ETH in the hook as a refund reservoir, with caps per claim, per block and cumulatively.
- Blocks sells from an EOA that bought earlier in the same block (sentinel).
- Allows the immutable admin to sweep ETH from the hook in an emergency.
- Swap behaviour
- Every swap is taxed in ETH. When ETH is specified, the hook takes tax in beforeSwap and returns it as a delta. When the token is specified, the hook takes tax in afterSwap and returns it as hookDelta. Buys can accrue a refund claimable after a hold window. Sells from the same EOA in the same block as a buy revert.
- Liquidity behaviour
- No liquidity callbacks. The hook does not implement afterAddLiquidity or afterRemoveLiquidity and does not hold LP positions.
- Fee behaviour
- Tax is taken in ETH on every swap by the hook, not via the pool fee. Buys: ignition tax decaying from 30% to 3% over 30 minutes, then 3% baseline; a phase-based refund (up to 3% or 6% bonus) is accrued for buys in crown/recoil zones. Sells: ignition tax if higher, otherwise phase rate (crown 6%, mid 3%, recoil 12%). Inscribed wallets pay 3% on buys and 0% on sells after ignition. Taxed ETH stays in the hook as refund budget; there is no dev fee.
- Owner & admin controls
- Admin is set once in the constructor to the deployer EOA and is immutable. Admin can only call sweep(to, amount), a break-glass withdrawal of ETH from the hook balance (the refund reservoir), with no time lock. Ignitor (immutable) can call beforeInitialize only once. Inscribed wallet set is frozen at deploy with no setter. Sentinel is a constant and cannot be toggled. No pause, no upgrade proxy, no fee setter.
Enabled Uniswap v4 callbacks
beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta
beforeInitialize: validates pool currency ordering (native ETH as currency0, token as currency1), records poolId and genesis time, and can only be called by the ignitor EOA. beforeSwap: enforces the same-block sell sentinel per tx.origin, classifies the swap and takes ETH tax via a return delta when ETH is the specified currency. afterSwap: takes ETH tax via hookDelta when the token is the specified currency, accrues buy refunds, and updates spot price and apex/recoil state. beforeSwapReturnDelta and afterSwapReturnDelta: allow the hook to take ETH from swaps and return the hookDelta to the pool manager.
Security & trust assessment
Risk level: medium (verified source, high confidence).
Who controls it: The admin key can drain the entire hook ETH balance at any time via sweep, which is the refund reservoir backing claimable buyer refunds. Admin cannot change tax rates, pause swaps, or alter refund logic, but a sweep would leave accrued refunds unfunded. The ignitor can only initialize the pool once. The token itself has a separately deployed setHook and renounce flow.
Risk to user funds: The hook holds ETH collected from taxes and is the refund budget for buyers. The admin can sweep that ETH at any time, and this would strand accrued refunds. Swaps route tax ETH into the hook via take(). Token supply and pool liquidity are not held by the hook.
Security findings
- [high] Admin can drain refund reservoir: sweep() lets the immutable admin withdraw any amount, up to the full ETH balance, which is the refund reservoir backing all pending buyer refunds. Refund claims are capped by the actual balance, so a sweep would leave buyers unpaid.
- [medium] Privileged inscribed wallets receive preferential tax treatment: Inscribed wallets pay no sell tax after ignition and pay only 3% on buys, while everyone else pays up to 30% during ignition and up to 12% on sells. The wallet list is fixed at deploy, creating an insider advantage.
- [low] Refund solvency depends on reservoir balance: Refunds are paid from ETH collected in taxes and are capped per block (5% of reservoir), per claim (0.5 ETH), and lifetime (cumulative tax collected). The structural invariant limits overpayment, but payouts depend on the reservoir remaining solvent.
- [info] Anti-flip refund hold window: Claims use a hold window of 25 blocks and a balance floor snapshot. This reduces buy-and-dump refund extraction but does not prevent wallets from holding and claiming refunds after the window.
Contract details
- Verified source
- Yes (HaloHook)
- Compiler
- solc 0.8.26+commit.8a97fa7a
- Bytecode size
- 8,202 bytes
- Upgradeable proxy
- No
- Detected patterns
- moves-currency, return-delta, tax
Pools using HaloHook
- ETH / halo (0.30% fee) — 24h volume $0, TVL $13.35K, 0 swaps today