StashToken on Robinhood Chain

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

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

StashToken is a fixed-supply token whose own ETH pool charges a fixed fee on every trade: buyers pay buyBps and sellers pay sellBps in ETH (each capped at 20%), with the fee held as claims until anyone calls claim() to send it to the fee wallet.

This read was written for the hook 0x4ba2…20cc 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

  • Acts as both an ERC20 token (fixed 1B supply minted to the launcher at deployment, no later minting, no transfer tax) and the Uniswap v4 hook of its own ETH pool, with the token as currency1 and native ETH as currency0
  • Charges a fixed fee in ETH on buys (buyBps) and sells (sellBps), capped at 20% (MAX_FEE_BPS 2000), with rates set once in the constructor and immutable
  • Accrues each fee as ERC6909 claims minted to the hook on the PoolManager (poolManager.mint) and tracks it in the stashed counter instead of sending ETH mid-swap
  • Lets anyone call claim() to unlock the PoolManager, burn the claims and send the whole stash as ETH to the immutable fee wallet, so the fee wallet needs no gas
  • Only the launcher can initialize the pool, once, with exact currency pair, zero base fee and tick spacing 60, and swaps are rejected for any other pool
  • Exposes ERC-7572 contractURI metadata and charter strings (image, about, website, twitter, telegram) written once at launch and never changed
Swap behaviour
Buys (ETH in, token out) pay buyBps of the ETH; for exact-input buys the fee is taken from the specified amount in beforeSwap, for exact-output buys it is grossed up in afterSwap and the ETH paid is increased by that fee. Sells (token in, ETH out) pay sellBps of the ETH; exact-output sells gross up the ETH pool output in beforeSwap, exact-input sells take the fee off the ETH produced in afterSwap. Partial fills of exact-input buys or exact-output sells revert with PartialFill when the fee was charged upfront. Swaps on any other pool revert with BadPool.
Liquidity behaviour
No liquidity callbacks.
Fee behaviour
Fixed buy and sell fees in ETH set by immutable buyBps and sellBps (each at most 20%), with the pool's own LP fee set to zero. Buys and sells can therefore pay different rates. Fees are retained by the hook as ERC6909 claims and sent to the fee wallet only when claim() is called.
Owner & admin controls
No owner (owner() returns zero address), no setters, no pause, no proxy or upgrade mechanism, and no post-launch minting. Fee rates, fee wallet and launcher are immutable. The only privileged actor is the launcher, which can open the single pool once.

Enabled Uniswap v4 callbacks

beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta

beforeInitialize restricts pool creation to the launcher and validates the pool parameters. beforeSwap takes the fee out of the specified amount through the return delta for exact-input buys and exact-output sells. afterSwap takes the fee from the ETH leg through the return delta for exact-output buys and exact-input sells, and checks partial fills. beforeSwapReturnDelta and afterSwapReturnDelta are enabled so these deltas are honored.

Security & trust assessment

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

Who controls it: No privileged key can change fees, pause swaps, mint tokens or redirect fees. The launcher's only power was to open the one pool, which is already done or pending at launch.

Risk to user funds: The hook holds accrued fees only as ERC6909 claims on the PoolManager until claim() is called; it does not hold user token balances beyond normal pool accounting. It can take a fixed percentage of each swap's ETH via return deltas, but cannot block trades or move funds beyond those fees.

Security findings

  • [info] Fee rates are immutable and capped: buyBps and sellBps are set in the constructor, are immutable, and are capped at MAX_FEE_BPS (20%), so the fee cannot be raised after launch.
  • [low] Return-delta fee capture: The hook takes its fee through beforeSwap and afterSwap return deltas, so it can take up to 20% of ETH on each swap; users should be aware that buys and sells pay fees by design.
  • [info] Pool bound to a single launcher-opened pool: beforeInitialize accepts only the launcher, only once, and only for the exact pool shape, and swaps on other pools revert, limiting the surface for misuse.
  • [info] Permissionless claim sends fees to fixed wallet: claim() can be called by anyone but always sends the stash to the immutable feeWallet, so callers cannot redirect funds.
  • [info] Immutable behaviour without upgrade path: No owner, proxy or upgrade function exists in the decoded interface, so behaviour cannot be changed after deployment.

Contract details

Verified source
Yes (StashToken)
Compiler
solc 0.8.28+commit.7893614a
Bytecode size
10,502 bytes
Upgradeable proxy
No
Detected patterns
erc20, launchpad, moves-currency, ownable, return-delta, self-unlock

Pools using StashToken