The pool is keyed before anyone buys
The curve, the graduation threshold and the fee schedule are set at initialisation and readable from that moment. Nothing about the launch is decided while it is running.
Launchpad · Uniswap V4
Every other launchpad moves your liquidity between a curve contract and a exchange at exactly the moment everyone is watching. That window is where launches go wrong. On V4 there is no window — the curve and the market are the same pool, and graduation is a state change rather than a migration.
The curve, the graduation threshold and the fee schedule are set at initialisation and readable from that moment. Nothing about the launch is decided while it is running.
A beforeSwap hook quotes the curve and returns the delta itself, so the pool prices trades without any liquidity positions existing yet. Early buyers trade against the curve, not against each other.
On hitting the target the hook seeds a position with the reserves it has collected and stops overriding prices. Same pool, same key, same address — the venue does not change underneath anyone.
Trading fees route to their published destinations on every swap. Creating the next pool is a state write in the singleton, not a deployment.
All of these are the same thing under the hood — a beforeSwap hook refusing or clamping a trade — and all of them are readable before anyone commits money.
Trading reverts until the published start time. No private window, no warm-up round for people who knew.
beforeSwapA ceiling on how much any one address can take during the opening blocks, tracked in the hook rather than promised in a thread.
beforeSwapA limit on total inflow per block, so a single builder cannot hand the whole opening to one bundle.
beforeSwapThe cap widens over the first minutes instead of snapping open. Removes the value of being first by exactly one block.
beforeSwapOptional tx.origin check for the opening blocks. Blunt, and it costs some legitimate routing, but it prices out the cheapest sniping.
beforeSwapFor gated launches that need to know who is on the other side. Off by default; on, it is visible that it is on.
beforeSwapA pool initialised with the dynamic-fee flag hands its fee schedule to the hook, which can change it per swap. That turns the fee from a constant into a tool.
Open at a punitive fee and decay to normal over the first blocks. Snipers still get in — they just fund the pool to do it, instead of taxing it.
Dynamic feeHigher on sells than buys through the launch window, converging afterwards. Costs the flip, not the position.
Dynamic feeWiden when the pool is being run over, tighten when it is calm. LPs stop subsidising the worst minute of the day.
Dynamic feeCreator, treasury and buyback slices are taken in afterSwap and routed on the spot. No claim step, no accrual contract, no trusting anyone to forward it.
afterSwap return-deltaThe difference between a launchpad saying liquidity is locked and liquidity being locked is whether there is code that could unlock it. These are the second kind.
The position belongs to the hook. If the hook contains no code that removes liquidity, none can be removed — by the creator, by the launchpad, by anyone. You verify that by reading one contract, not by trusting a locker service.
Hook-owned positionRemoval reverts before the cliff. The schedule is a constructor argument, so it is fixed at deploy and visible from the outside.
beforeRemoveLiquidityThe threshold lives in an immutable hook. Nobody moves the goalposts after people have bought against them, because there is no function that moves them.
Immutable hookA slice of every swap is added as protocol-owned liquidity, so depth thickens with activity rather than depending on anyone's continued goodwill.
afterSwap return-deltaEvery pool living in one contract is not a detail. It changes what a launch costs and what a new token is worth on day one.
No contract deployment per pool. Running many launches stops having the gas profile of a factory, which is what makes a high-volume launchpad viable at all.
Singleton PoolManagerThe pool is identified by its key inside a single contract, so there is never a question of which pool is the real one. That ambiguity is where a lot of launch-day losses actually come from.
Singleton PoolManagerFlash accounting nets a multi-hop route into one settlement, so a brand-new token is one hop from everything else without anyone holding inventory to bridge the legs.
Flash accountingAttribution rides in hookData on the swap itself and is credited in afterSwap. No custom router in the path, no wrapper contract to trust.
hookDataValue captured at the pool can be pushed straight back to in-range liquidity instead of leaving with whoever was fastest.
donate()A features page that only lists upsides is an advert. These are the real constraints, and none of them are dealbreakers — they are just things you should know before you commit.
Permission flags are encoded in the hook's own address, so deploying means grinding a CREATE2 salt until the bits line up. It is routine, and it is a build step people forget to budget for.
Every guarantee above rests on the hook being unchangeable. Add an upgrade path and you have handed the whole thing back. That is a decision to make before launch, not after the first bug.
A malicious hook can do everything a malicious token can. The real product here is one audited hook used by every launch, with per-launch behaviour set by constructor arguments — one thing to audit, and the differences between launches are numbers you can read.
A busy afterSwap is a tax on all trading, forever. The hot path stays thin or the feature is not worth it.
Flash accounting needs EIP-1153 transient storage. Robinhood Chain is EVM-equivalent, so V4 deploys unmodified — nothing forked, nothing patched.
EVM 4663 (0x1237), EVM-equivalent, post-Cancun — so V4 deploys unmodified. Same instinct as the rest of Unipedia: publish the mechanism on the surface people actually look at.