StashHook on Robinhood Chain

Uniswap v4 Hook Contract 0x1a30e2592ce7b74c66ba55679c08fd2133dea0cc on Robinhood Chain · Launchpad · Verified contract

Volume (24h)
$0
Value locked (TVL)
$0
All-time volume
$0
Pools using this hook
1
Swaps (24h)
36 (18 traders)
Total swaps
36

What it does

Every buy and every sell of the Stash token pays a fixed ETH fee set at deployment, and the fees are held until anyone calls claim() to send them to the fee wallet.

This read was written for the hook 0x3080…e0cc on Robinhood Chain and reused here: the two share a code shape, so constants such as fees, owners and addresses can differ.

How it works step by step

  • Pays a fee in ETH on every buy and sell of a single Stash token pool, with separate buy and sell rates fixed at deployment (capped at 20%)
  • Takes the fee as a PoolManager ERC6909 claim by minting claims to the hook in beforeSwap or afterSwap, using return deltas so the swap is adjusted by the fee amount
  • Keeps the accrued fees in a stash counter and lets anyone call claim() to burn the claims and send the full ETH stash to the fee wallet
  • Only accepts pool initialization from the launcher, with fixed currency pair (native ETH and the token), zero static fee and fixed tick spacing, and only once
  • Validates partial fills so that an upfront fee on exact-input buys or exact-output sells cannot be left unbalanced
Swap behaviour
On buys with exact ETH in (zeroForOne and negative amountSpecified), beforeSwap takes buyBps of the gross ETH input as the fee. On sells with exact ETH out (not zeroForOne and positive amountSpecified), beforeSwap grosses the requested ETH up so the pool pays the fee on top. On buys with exact tokens out, afterSwap takes buyBps of the total ETH paid, grossing up the ETH leg. On sells with exact tokens in, afterSwap takes sellBps of the ETH produced. Partial fills of the upfront-fee cases revert with PartialFill. Buys pay buyBps and sells pay sellBps; both are capped at 2000 bps.
Liquidity behaviour
No liquidity callbacks.
Fee behaviour
Fees are charged in ETH at fixed buy and sell rates (buyBps and sellBps, each at most 20%) set in the constructor and immutable afterwards. The fee is accrued as claims in the PoolManager and tracked in stashed and totalFees, then sent to feeWallet when claim() is called. The pool's own static fee is zero.
Owner & admin controls
No owner, no setters, no pause and no upgrade path were found. The fee rates, token, fee wallet and launcher are immutable. Only the launcher can open the pool, and only once.

Enabled Uniswap v4 callbacks

beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta

beforeInitialize restricts and records the single pool. beforeSwap takes the buy or sell fee up front via return delta on the specified amount. afterSwap takes the fee off the ETH leg via return delta, and enforces the partial-fill check. beforeSwapReturnDelta and afterSwapReturnDelta allow the hook to take a share of swap amounts.

Security & trust assessment

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

Who controls it: No privileged key can change fees, pause swaps or move funds after deployment. The only privileged actor is the launcher, which can open the single pool once. The fee wallet receives claimed fees but has no control over the hook.

Risk to user funds: The hook holds no ERC20 or ETH balance itself; fees exist only as ERC6909 claims in the PoolManager until claim() sends them to feeWallet. The hook can reduce the amount a swapper receives or pays by the fee via return deltas, and reverts on certain partial fills, but cannot move pool liquidity.

Security findings

  • [info] Hook takes a share of every swap via return deltas: beforeSwap and afterSwap return non-zero deltas that reduce the amounts traders receive or pay, equal to buyBps or sellBps of ETH. This is the intended fee mechanism but does mean the hook takes user value on every trade.
  • [low] Pool initialization gated to launcher: beforeInitialize only accepts the launcher as sender and only once. If the launcher address is compromised or misconfigured before the pool opens, the single pool could be set up incorrectly, though the constructor parameters limit what can be set.
  • [info] Anyone can trigger fee payout: claim() is public and sends the whole stash to the immutable feeWallet, so no caller can redirect funds. Payout timing is set by callers, not by the hook.
  • [info] Fee rates bounded and immutable: buyBps and sellBps are capped at MAX_FEE_BPS (2000) in the constructor and cannot be changed later, which limits the fee a user can be charged.
  • [low] Partial fill handling reverts swaps: For exact-input buys and exact-output sells where the fee is charged up front, a partial fill makes afterSwap revert with PartialFill, so such swaps fail rather than settling with an incorrect fee.

Contract details

Verified source
Yes (StashHook)
Compiler
solc 0.8.28+commit.7893614a
Bytecode size
5,637 bytes
Upgradeable proxy
No
Detected patterns
launchpad, moves-currency, return-delta, self-unlock

Pools using StashHook