Likely launchpad hook on Robinhood Chain
Uniswap v4 Hook Contract 0x2e04a64881e5b388115a301adff8b3598eec20cc on Robinhood Chain · Launchpad
- Volume (24h)
- $0
- Value locked (TVL)
- $0
- All-time volume
- $0
- Pools using this hook
- 1
- Swaps (24h)
- 0 (0 traders)
- Total swaps
- 0
What it does
This launchpad hook takes a fee from swaps through return deltas and splits the accrued fees between a platform recipient, a community treasury and the creator, so traders pay the hook fee on every swap while liquidity providers are not charged by it.
This read was written for the hook 0x4010…20cc on Robinhood Chain and reused here: the two run the same code.
How it works step by step
- Acts as a Uniswap v4 hook that also functions as an ERC20-style token contract with name, symbol, decimals, totalSupply and balance/allowance mappings, and exposes creator, launcher and metadata getters (name, image, description, socials).
- Initializes on beforeInitialize, setting a one-time initialized flag and recording the pool being launched.
- Takes a fee from swaps via beforeSwapReturnDelta and afterSwapReturnDelta, accruing fees tracked in storage (pendingFees, totalFeesAccrued, feeBps, creatorCreditsBps).
- Splits accrued fees between platform recipient, community treasury and creator, with withdraw and withdrawAll functions that move funds out by recipient index.
- Tracks vault balances and total withdrawn amounts in storage slots, and gates liquidity add/remove and donate callbacks, which are present as selectors but not enabled as hook permissions.
- Calls take() on the pool manager to pull tokens out of the pool during fee settlement, and restricts some operations to the launcher address (NotLauncher error).
- Swap behaviour
- On each swap the beforeSwap and afterSwap callbacks run and can return a delta, so the hook takes a fee from the swap amount in the form of currency it settles with the pool manager; the exact fee rate is governed by feeBps and creator credit settings read from storage, and it is not clear from bytecode alone whether buys and sells are charged differently.
- Liquidity behaviour
- Liquidity add and remove callbacks exist in the bytecode (beforeAddLiquidity, afterAddLiquidity, beforeRemoveLiquidity, afterRemoveLiquidity) but are not enabled in the hook permissions, so they are not invoked by the pool manager; no liquidity callbacks run.
- Fee behaviour
- Fees are taken through return deltas on swaps, accrued into pendingFees and totalFeesAccrued, and split by feeBps and creatorCreditsBps between platform recipient, community treasury and creator; the pool itself uses its static fee in addition.
- Owner & admin controls
- Withdrawal and recipient-related functions exist and some paths are restricted to the launcher; exact owner or upgrade controls cannot be confirmed from decoded bytecode, and no pause function was identified.
Enabled Uniswap v4 callbacks
beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta
beforeInitialize records launch state; beforeSwap and afterSwap take fees and apply return deltas to settle them; beforeSwapReturnDelta and afterSwapReturnDelta allow the hook to alter swap amounts.
Security & trust assessment
Risk level: high, estimated (decoded bytecode, low confidence).
Who controls it: The launcher and any privileged recipient or creator keys can direct withdrawals and fee splits; a compromised key could redirect accrued fees.
Risk to user funds: The hook holds accrued fee balances and takes currency from swaps via return deltas, so traders pay the hook fee on swaps and LP funds are not directly moved because liquidity callbacks are disabled.
Security findings
- [medium] Return deltas on swaps: beforeSwapReturnDelta and afterSwapReturnDelta let the hook alter swap amounts and take currency from the pool, so swap economics depend entirely on the hook's fee logic.
- [medium] Withdrawal functions: withdraw(uint8,uint256) and withdrawAll() move accrued funds out of the contract by recipient index; correctness of recipient mapping cannot be verified without source.
- [info] Launcher-gated paths: A NotLauncher error and launcher() getter indicate that a privileged launcher address controls some operations.
- [info] No verified source: Without verified source, parameter changes, upgrade paths and owner privileges cannot be fully ruled out.
Contract details
- Verified source
- No
- Bytecode size
- 9,928 bytes
- Upgradeable proxy
- No
- Detected patterns
- erc20, moves-currency, return-delta