Planchet on Robinhood Chain

Uniswap v4 Hook Contract 0x383056f1f186a7f22cb5ff42546a95c0aac320cc on Robinhood Chain · Custom pricing · Verified contract

Volume (24h)
$396
Value locked (TVL)
$0.14
All-time volume
$396
Pools using this hook
1
Swaps (24h)
27 (7 traders)
Total swaps
27

What it does

Every swap in this coin's ETH pool pays a flat 0.5% levy on the ETH side, the same on buys and sells, and that levy goes to the creator's till.

How it works step by step

  • Acts as the ERC-20 token itself (Farthing-style coin, fixed 1,000,000,000 supply minted once to the Moneyer in the constructor) and as the Uniswap v4 hook of its own ETH/coin pool, which is pinned by beforeInitialize to a single home pool with fee 0 and tick spacing 1.
  • Takes a flat LEVY_BPS = 50 (0.5%) levy on every swap's ETH side, on both buys and sells, computed with ceiling rounding via Math.mulDiv.
  • Books the whole levy into an ERC-6909 claim minted to the hook inside the PoolManager (poolManager.mint) and tracks it in the till variable, so the levy is never released as loose ETH during the swap.
  • Lets only the striker (creator) draw the accumulated till: draw() unlocks the PoolManager, burns the claim and takes the ETH to the striker's address.
  • Sets metadataURI at construction for contractURI() listing purposes; the URI is not updatable afterwards.
  • Does not implement liquidity callbacks; every liquidity-related hook selector reverts with NotWired().
Swap behaviour
Every swap in the home pool pays a 0.5% levy on the ETH side. For exact-input ETH-in swaps the levy is taken in beforeSwap from the ETH sent. For exact-output ETH-out swaps the pool is asked for a grossed-up ETH amount and the difference is the levy. For coin-named legs the levy is computed in afterSwap from the ETH actually moved (buys exact-out gross up the ETH paid; sells exact-in take a slice of the ETH produced). Buy and sell rates are identical; the levy does not change over time. Swaps on any other pool revert with ForeignPool.
Liquidity behaviour
No liquidity callbacks. Liquidity can be added and removed through the PoolManager without hook involvement, because the hook does not implement beforeAddLiquidity or beforeRemoveLiquidity; the hook's liquidity callback selectors all revert with NotWired.
Fee behaviour
The pool itself uses a static fee of 0; the 0.5% levy is a separate return-delta charge in beforeSwap/afterSwap. Levy is booked to the striker's till and can only be drawn by the striker via draw().
Owner & admin controls
Ownable is used only to make owner() answer; ownership is renounced in the constructor so owner() is the zero address from the first block. No pause, no fee-rate setter, no blocklist, no upgradeability, no owner-only functions beyond the inherited renounce/transfer which are now unusable. Only the immutable striker can call draw(). The Moneyer has no privileged post-deployment role except that it initializes the home pool once.

Enabled Uniswap v4 callbacks

beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta

beforeInitialize: restricts the one-time initialization of the home pool to the Moneyer with the exact canonical PoolKey. beforeSwap: computes the levy on ETH-named legs and returns it as a before-swap delta, and enforces home-pool-only swaps. afterSwap: computes the levy on coin-named legs from the ETH actually moved, reverts if an ETH-named leg did not fill completely, and returns the levy as an after-swap delta. beforeSwapReturnDelta and afterSwapReturnDelta: allow the hook to take the levy amounts from swap settlement.

Security & trust assessment

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

Who controls it: Ownership is renounced in the constructor, so no key can change fees, pause trading, blocklist addresses or upgrade the contract. The only privileged party is the immutable striker, who can draw the ETH levy from the till at any time; nothing else in the contract can be altered by a key.

Risk to user funds: The hook can take 0.5% of every ETH-side swap via return deltas and holds the levy as an ERC-6909 claim inside the PoolManager until the striker draws it. It cannot move liquidity, pause swaps or change the levy rate. Users in the home pool pay the levy on every trade in both directions.

Security findings

  • [info] Hook takes a fixed levy via return deltas: beforeSwapReturnDelta and afterSwapReturnDelta let the hook take 0.5% of every ETH-side swap amount; this is hard-coded (LEVY_BPS constant) and cannot be changed.
  • [info] Levy accumulates to a single striker till: All levy is minted as an ERC-6909 claim owned by the hook and can only be drawn by the immutable striker address via draw(); if the striker key is lost the accumulated till is stuck, and if compromised the till can be drawn by the attacker.
  • [low] Coin-named legs settle after swap: ETH-named legs compute the levy before the swap and revert in afterSwap if the swap does not fill exactly, so partially filled ETH-named swaps are refused; coin-named legs depend on the actual delta, which is verified by the hook's arithmetic.

Contract details

Verified source
Yes (Planchet)
Compiler
solc 0.8.26+commit.8a97fa7a
Bytecode size
8,078 bytes
Upgradeable proxy
No
Detected patterns
erc20, erc6909-claims, moves-currency, ownable, return-delta, self-unlock

Pools using Planchet