Skip to main content
For code that signs transactions or reads the chain directly. Same on Base and Robinhood Chain against each chain’s contracts; differences are marked. Indexed data only? Use the REST API.

Trading

Pools live in the canonical Uniswap v4 PoolManager with a custom fee hook. Wallets cannot call the PoolManager directly; trade through the router.

The PoolKey

A pool’s identity includes its hook, and Base alone has ten hooks with pools on them. Assume one hook for every pool and the other launchers’ swaps never match your pool ids - those tokens chart flat while trading normally.

Three things every integration must handle

Launching programmatically

launchDirect and launchGated take the same fields with startSqrtPriceX96 in place of marketCapUsd.launchGated is how a creator-chosen pair launches: usdPerPair(token, route) verifies the route hop by hop and prices the opening. The API’s gatedroute discovers a route for any address. The basket menu: basket-assets.

The basket controller seat

Find the distributor from the token’s rewardTracker() or the API’s rewardsDistributor. Readable state: basketController, basketRenounced, basketSize(), basketSlot(i) (token, weight, holdings). Every call reverts once renounced. Value in a replaced slot drains to holders on the same maths.

Watching the chain

AdvancedLaunched has two shapes, and backfilling the full history needs both. V6, V7, B20 V6B and RhLauncher on Robinhood Chain and Arc emit the split-tax shape above, topic0 0x370377cb17f063e0544347d821ef4fb78fb513351700977cb06c7e63715d1ef0. The launchers before V6 (V2 to V5C and B20 V1) emit one taxBps in place of buyTaxBps and sellTaxBps, topic0 0x508e31622f2b7886bd54a544c43d38ad441276dd8b24f0fb37e7c793869f6997. Match on the launcher’s address as well as the topic: other projects emit launch events with common names. The pool’s key is in the PoolManager’s Initialize in the same transaction, with id equal to poolId. Same events on all three chains - Arc runs the same launcher and hook code as Robinhood Chain - so one decoder serves every chain.

Decoding reverts

HopTooThin - not your fault

The pair’s pricing route is too thin for the feed to answer honestly. Raised by a contract the launcher calls, so decode against the routed-feed ABI or match 0xb5377e60. Nothing in the tuple fixes it - retrying, lowering the buy or changing the cap all revert the same way. Check the pair first: the API reports a refusing feed, and the form blocks it. It reopens by itself when liquidity returns.

The others