ArcadeHook on Ethereum

Uniswap v4 Hook Contract 0x01ed412dd11ea0a1a8ff6db0fff52bcf33924a40 on Ethereum · Launchpad · Verified contract

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

What it does

ArcadeHook runs a single ETH/$UNIMODE pool where only the studio can add or remove liquidity, and traders swap at the pool's static fee with no hook pricing or fee changes, while the hook just tallies swaps, buys, sells and volume levels.

This read was written for the hook 0x2f61…8a40 on Ethereum and reused here: the two run the same code.

How it works step by step

  • Manages a single ETH/$UNIMODE pool inside the Uniswap v4 PoolManager, opened once by the studio address via insertCoin
  • insertCoin initializes the pool and seeds all of the hook's token balance as single-sided token liquidity over a fixed tick range above the current price
  • beforeAddLiquidity and beforeRemoveLiquidity revert with GameLocked unless the sender is the hook itself, so external LPs cannot add or remove liquidity
  • ejectCartridge lets the studio remove liquidity and send the withdrawn ETH and tokens to a chosen recipient address
  • afterSwap counts swaps, buys and sells, tracks consecutive same-direction streaks (combo), accumulates ETH volume and emits LevelUp events at doubling volume thresholds up to level 20
  • Hook takes no return deltas and does not alter swap pricing or fees; it only records statistics after each swap
Swap behaviour
Swaps are not gated or priced by the hook; beforeSwap is not enabled. After each swap afterSwap updates counters (swaps, buys, sells, ethVolume, combo, level) and emits events. Buys are swaps with zeroForOne set, sells are the reverse; the counters do not change trade pricing.
Liquidity behaviour
Only the hook itself may add liquidity, via insertCoin, which is a one-time action restricted to the studio. Only the hook may remove liquidity, via ejectCartridge, which is restricted to the studio. External liquidity provision and removal reverts.
Fee behaviour
Uses the pool's static fee set in the PoolKey at insertCoin; the hook does not set, take or share fees.
Owner & admin controls
The studio address (set as an immutable constructor argument) alone can call insertCoin once and ejectCartridge at any time, choosing the recipient and amount of liquidity to withdraw. There is no owner, pause, upgrade proxy or parameter-change function found in the source.

Enabled Uniswap v4 callbacks

beforeAddLiquidity, beforeRemoveLiquidity, afterSwap

beforeAddLiquidity: restricts liquidity addition to the hook itself. beforeRemoveLiquidity: restricts liquidity removal to the hook itself. afterSwap: updates swap statistics, combo streaks and level progression, and emits events.

Security & trust assessment

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

Who controls it: A single immutable studio key controls the only liquidity in the pool: it can open the pool once and remove all liquidity to any recipient at any time, which would leave traders with no liquidity and move the pool's ETH and tokens to that key.

Risk to user funds: The hook itself holds no user funds, but while the pool is live the ETH and tokens deposited as liquidity sit in the PoolManager under the hook's position and can be withdrawn by the studio via ejectCartridge at any time; traders' ETH swapped in is also exposed to that same withdrawal path.

Security findings

  • [high] Studio can withdraw all pool liquidity at will: ejectCartridge removes the entire position (power of 0 means all positionLiquidity) and sends the ETH and tokens to any address the studio chooses, so the studio can drain the pool at any time with no timelock or cap.
  • [medium] External liquidity provision is blocked: beforeAddLiquidity and beforeRemoveLiquidity revert with GameLocked for any sender other than the hook, so users cannot provide or withdraw liquidity and depend entirely on the studio.
  • [info] Pool seeded from hook token balance: insertCoin uses the hook's full $UNIMODE balance as liquidity; the hook must hold the tokens beforehand, and the initial price is set by the studio-supplied sqrtPriceX96 and tick range.
  • [low] Token transfer uses unchecked return value: unlockCallback calls IERC20.transfer without checking its return value; a non-reverting token returning false would not be detected during settlement, though the token is a fixed project token.
  • [info] No hook fee or delta manipulation: The hook returns zero deltas from afterSwap and does not alter swap pricing, so it does not itself skim trades; the level and combo logic is informational only.

Contract details

Verified source
Yes (ArcadeHook)
Compiler
solc 0.8.26+commit.8a97fa7a
Bytecode size
8,421 bytes
Upgradeable proxy
No
Detected patterns
launchpad, moves-currency, self-unlock

Pools using ArcadeHook