HooksDaoHook on Robinhood Chain

Uniswap v4 Hook Contract 0x3bb9ad3ce86378abfe4d9812408200bcc4abe0cc on Robinhood Chain · Fee sharing · Verified contract

Volume (24h)
$53.67K
Value locked (TVL)
$0
All-time volume
$53.67K
Pools using this hook
1
Swaps (24h)
170 (92 traders)
Total swaps
170

What it does

HooksDao charges a native ETH fee on every trade in its ETH and token pool, with buys and sells taxed at separately set rates that admin can change up to 99%, and it splits the proceeds between a pot used for buybacks and payouts and a team fee receiver.

How it works step by step

  • Charges a swap fee in native ETH on pool trades of a token paired against ETH (currency0 is native ETH, currency1 is the token), with separate buy and sell rates stored in one config slot and capped at 99%
  • Splits each collected fee between a pot balance (the buyback and payout pot, controlled by admin) and a team share set by teamShareBps, forwarding the team part to feeReceiver with a pending-fee fallback if the transfer fails
  • Collects fees by taking ETH from the pool manager when it holds enough balance, otherwise minting an ERC-6909 claim and parking the fee until settleParkedFees is called
  • Optionally queries an external module contract for per-swap buy and sell fee rates via staticcall with a gas cap, falling back to stored rates on failure, and notifies the module after each swap
  • Lets admin run buybacks by swapping pot ETH for the token through the pool and optionally burning the output, plus ETH and token payouts to listed recipients
  • Blacklists addresses through a mapping, though the blacklist is not checked in the swap path shown
Swap behaviour
Swaps revert while trading is disabled (tradingEnabled false). Before the swap the hook takes the configured buy or sell rate (or the module-provided rate, capped at 99%) and adjusts the specified amount for exact-input or exact-output swaps. After the swap the fee is taken from the ETH leg through return deltas, so buys and sells pay different rates, and exact-in and exact-out orders use different fee formulas. The fee is paid on the ETH side only.
Liquidity behaviour
No liquidity callbacks.
Fee behaviour
Buy and sell fee rates are stored in one slot, set by admin with updateFees (each at most 99%), and can be zeroed by disableFees. An optional module can supply per-swap rates. The pool itself uses a static LP fee of 0 and only the hook fee applies. Collected fees are split into a pot share (1 minus teamShareBps) and a team share sent to feeReceiver.
Owner & admin controls
Ownership is two-step (Ownable2Step) and the owner can set an operator, while owner or operator (isAdmin) can update fee rates up to 99%, disable fees, enable or disable trading, set team share, change the fee receiver and module, blacklist or unblacklist addresses, execute buybacks with optional token burn, make ETH and token payouts from the pot, and withdraw any ETH, ERC20 or ERC721 held by the contract. The pool manager, posm, permit2, router and token addresses are immutable. There is no proxy or upgrade mechanism in the source.

Enabled Uniswap v4 callbacks

beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta

beforeInitialize restricts pool creation to the ETH and token pair with the fixed LP fee and tick spacing. beforeSwap gates trading, reads the fee rate and applies the fee to the specified amount through return delta. afterSwap settles the fee on the unspecified leg through return delta, collects it and notifies the module. beforeSwapReturnDelta and afterSwapReturnDelta let the hook take tokens from the swap.

Security & trust assessment

Risk level: high (verified source, high confidence).

Who controls it: The owner or operator controls fee rates up to 99%, trading on/off, the team fee receiver, the external module, buybacks that spend pot ETH and burn tokens, and withdrawal of all ETH and tokens held by the contract. Ownership can be transferred or renounced, but the operator role can also administer the contract.

Risk to user funds: The hook holds ETH collected from fees and claims on the pool manager, and admin can withdraw or pay out those funds. Users who trade in this pool pay a fee taken on the ETH leg; the hook does not hold user principal beyond swap settlement, but a high fee or trading halt directly affects traders.

Security findings

  • [high] Admin can set fees to 99% and withdraw funds: updateFees accepts rates up to 9900 bps for buy and sell, and emergencyWithdrawEth, emergencyWithdrawERC20 and payout let the owner or operator remove ETH and tokens held by the hook and pot, so a privileged key can extract value or punish traders.
  • [medium] Trading can be halted at will: setTradingEnabled(false) makes every beforeSwap revert with TradingNotOpen, so the owner or operator can freeze the pool for all users.
  • [medium] Hook takes fees and moves currency via return deltas: beforeSwapReturnDelta and afterSwapReturnDelta are enabled and the hook calls poolManager.take, mint and settle, so the hook takes ETH from every swap on this pool and holds claims that depend on pool manager balance.
  • [medium] External module can influence fees and receives callbacks: The admin-set module supplies swap fee rates (capped at 99%) via staticcall and is called after each swap with fee data, so a malicious or buggy module can change fees and gas-limited calls may fail silently and fall back to stored rates.
  • [low] Blacklist is not enforced in swap path: The blacklist mapping is set by admin but the beforeSwap code shown does not check it, so the blacklist appears to have no effect on trading as written.

Contract details

Verified source
Yes (HooksDaoHook)
Compiler
solc 0.8.26+commit.8a97fa7a
Bytecode size
11,215 bytes
Upgradeable proxy
No
Detected patterns
access-control, dynamic-fee, erc20, moves-currency, ownable, return-delta, self-unlock

Pools using HooksDaoHook