ArcLaunchHook on Arc

Uniswap v4 Hook Contract 0xe92f7b4362eded62ed7a10ac90262b0bf4552840 on Arc · Launchpad · Verified contract

Volume (24h)
$543
Value locked (TVL)
$10.37K
All-time volume
$935.55K
Pools using this hook
28
Swaps (24h)
9 (7 traders)
Total swaps
10,210

What it does

A launchpad hook that puts a token's full supply into one hook-owned, single-sided Uniswap v4 position that cannot be withdrawn, lets buys walk the price up through it, and routes trading fees to a protocol treasury and to the token's reward mode on every swap.

How it works step by step

  • launch() is callable only by the bound factory. It creates the pool with the hook as its hook address and seeds a single-sided position of the full 1e27 token supply from the start tick up to the maximum usable tick.
  • The position has no withdraw path in this contract. Liquidity is never removed, only fee-harvested via zero-delta modifyLiquidity calls.
  • afterSwap runs _latch, a one-way bonding check. Once the price reaches the bonding tick the pool is marked graduated, which lets outside liquidity be added. Liquidity is not moved at graduation.
  • afterSwap then self-calls harvest with a 1.2M gas cap inside try/catch, so a harvest failure does not revert the trader's swap. Harvest pulls accrued LP fees and either takes them from the pool manager or parks them as ERC-6909 claims for redemption later.
  • Harvested quote fees are split 20 percent to the treasury and 80 percent to the reward mode: creator payout, buyback swap to 0xdead, or dividend distribution to token holders via ArcRewardToken.
Swap behaviour
afterSwap only. It attempts to latch graduation (first time the price crosses the bonding tick) and then attempts a fee harvest. Swaps are never reverted by the hook's own logic beyond the manager-only check.
Liquidity behaviour
beforeAddLiquidity reverts unless the pool is graduated or the sender is the hook itself. Before graduation only the hook's own position exists. After graduation outside LPs may add liquidity. Removal of the hook's position is not exposed.
Fee behaviour
The pool LP fee is set per launch (1000 to 100000 pips, static after init). The hook harvests the LP fees accrued on its own position and splits them 20 percent protocol / 80 percent reward mode. Protocol share is pushed to the treasury and is claimable by the treasury through claimProtocol. Creator share, buyback or holder dividends depend on the launch mode (0, 1 or 2).
Owner & admin controls
admin and deployer can call bindFactory once to set the factory. The factory is the only address that can call launch. There is no pause, upgrade proxy or parameter setter on the hook. treasury can call claimProtocol and convertTokenFees. The launch creator can call claimCreator, convertTokenFees and executeBuyback. Anyone can call collect and distributePending, which only route fees to predefined recipients.

Enabled Uniswap v4 callbacks

beforeInitialize, beforeAddLiquidity, afterSwap

beforeInitialize: restricts pool initialization to the hook's own launch flow. beforeAddLiquidity: blocks outside liquidity until graduation. afterSwap: runs the graduation latch and the automatic fee harvest.

Security & trust assessment

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

Who controls it: No pause or upgrade path exists in the hook. The treasury controls protocol fee claims and conversion timing; the creator controls their share and can set slippage on conversions and buybacks. The factory, which is set once, is the only launch entry point.

Risk to user funds: The hook holds launch token and quote fees transiently and parks unpaid amounts as ERC-6909 claims or pending balances. It moves funds through pool manager take and settle, and sends protocol, creator and holder shares to fixed recipients. It does not hold the main liquidity position, which the pool manager owns through the hook address.

Security findings

  • [medium] Operator-chosen slippage on fee conversions: convertTokenFees and executeBuyback accept a caller-supplied minimum output that only needs to be greater than zero. The creator or treasury can set it to 1 wei, so the swap of accumulated fees can be sandwiched or executed at a poor price, reducing amounts routed to holders and the treasury.
  • [low] Dividend routing depends on the reward token and its transfer hooks: Holder rewards are paid in the quote token via ArcRewardToken, which performs automatic pushes on every transfer with fixed gas caps. A non-standard quote token or a blocklisting recipient causes amounts to stay pending or claimable rather than paid, and the code relies on exact balance checks.
  • [medium] Launch pricing relies on an owner-configured USD feed: ArcUsdPolicy is owned by an Ownable2Step owner who sets the price feed used to derive starting and graduation ticks from USD bounds. A misconfigured or changed feed sets the launch price for pools created afterward; the hook itself does not hold this owner role.
  • [info] Locked single-sided position and graduation latch: The hook's position has no withdrawal function and the graduation latch is one-way. Liquidity cannot be pulled by the admin, but the pool behaviour after graduation is controlled by outside LPs rather than the hook.
  • [low] One-time factory binding by admin or deployer: bindFactory can be called by admin or deployer while factory is unset. If the bootstrap is not completed atomically, the first caller chooses the factory that can launch pools.

Contract details

Verified source
Yes (ArcLaunchHook)
Compiler
solc 0.8.30+commit.73712a01
Bytecode size
20,489 bytes
Upgradeable proxy
No
Detected patterns
erc6909-claims, launchpad, moves-currency, self-unlock

Pools using ArcLaunchHook