BaseLaunchGraduationGuard
A stateless check the factory created in its own constructor: it replays the Uniswap v4 mint rules so a curve can only graduate into a pool seed v4 will accept.
Stateless preflight for a graduation's Uniswap V4 seed. It keeps the tick and liquidity math outside BaseLaunchFactory's runtime bytecode while modelling the rejections of the real mint, so a launch can never drain its curve into a seed the PositionManager or V4 core would reject. The preflight has to mirror the whole downstream call graph rather than the PositionManager's ABI field widths alone. Phase one is irreversible: it marks the curve graduated and moves its reserves to the factory, so a seed that passes here and reverts in V4 leaves the launch permanently unseedable and recoverable only through the owner's delayed rescue path.
Part of the contract reference.
Deployed at
Created by each factory in its own constructor. Read its address from graduationGuard() on the factory.
Read functions (2)
| Function | What it does |
|---|---|
assertSeedableassertSeedable(address token, address pairToken, int24 tickSpacing, uint256 quoteAmount, uint256 tokenAmount) pureselector 0xbcebea9fAnyone | Verifies a launch can initialize and mint a nonzero, full-range V4 position without lossy amount narrowing. |
assertSeedableEitherOrderingassertSeedableEitherOrdering(int24 tickSpacing, uint256 quoteAmount, uint256 tokenAmount) pureselector 0x6de06dc9Anyone | Verifies a seed of these proportions mints under either currency ordering. Launch terms are checked before the launch token exists, so the ordering the PoolKey will use is not yet known. Requiring both is the conservative reading, and the two agree in practice: the sqrt price range is symmetric about 1 and the liquidity formula is invariant under inverting the price and swapping the amounts with it. |
Addresses are listed for launcher 2.1.0, where new coins launch, and for launcher 2.0, which keeps serving the coins launched before the cutover. A coin stays on the set that launched it. The functions and events are the 2.1.0 contracts'; the 2.0 contracts are an earlier version of the same code and have no interface registry, so check a 2.0 contract's verified source on Basescan before relying on a detail listed here.