Single-sided liquidity
zk-pad follows the Clanker v4 launch model, ported from Uniswap v4 to PancakeSwap Infinity concentrated-liquidity (CL) pools.
No curve, no migration
Many launchpads sell a coin on a bonding curve first and then "graduate" it to a DEX. That migration step has been the source of several real exploits on BSC (pre-initialized pools, broken migration state). zk-pad has no curve and no migration: the coin trades on its final PancakeSwap Infinity pool from the first second.
Single-sided positions
At launch, the pool is initialized at a starting price chosen by the creator. The locker places the whole 1,000,000,000-token supply in one to seven concentrated positions that sit entirely above that price. Because the price starts at the bottom of every range, the positions hold only the new token and no quote token. That is what "single-sided" means: nobody has to supply quote-token liquidity at launch.
As people buy, the price moves up through the ranges and the positions fill with the quote token. As people sell, the price moves back down.
Presets
The SDK and the launch wizard offer two presets (from docs/research/launchpads.md §9.3):
| Preset | Positions (tick offsets from t0, share of supply) | Character |
|---|---|---|
| Fair (default; recommended for donation and social-escrow launches) | [0, 16400] 10% · [16400, 75400] 50% · [28400, 75400] 15% · [75400, 110400] 20% · [89400, 110400] 5% | A thin launch band: an early sniper gets far less supply per BNB and pays a much higher average price. |
| Standard | [0, 110400] 100% | One position. Simple, but buying half the supply costs roughly one starting market cap, so it is easier to snipe. |
Custom shapes are allowed on-chain: up to 7 positions, ticks multiples of the tick spacing (200), every range at or above the starting tick, and position shares summing to 10,000 bps.
Starting price
The starting price is expressed as a tick (tickIfToken0IsToken). Each quote token has an
allowed tick window (roughly $2k to $250k of fully diluted value at the time the bounds were
set). The default target is about $7.5k FDV, for example 10 WBNB or 7,500 USDT. See
quote tokens for the table.
Only the locker can add liquidity
The hook's beforeAddLiquidity callback rejects every liquidity add that does not come from the
pool's locker. This matters for the fee: on a pool with a 1% to 5% fee, an outsider could
otherwise add "just-in-time" liquidity around a large trade and capture most of its fee. With the
guard, all LP fees go to the locked positions, and therefore to the beneficiary.
Locked forever
The locker holds positions directly in the Infinity CLPoolManager. They are keyed by the
locker's address and a salt, so there is no position NFT that could be transferred. The locker
contract has no code path that removes liquidity: its only modifyLiquidity calls are the
initial mint (positive delta) and fee "pokes" (zero delta). See
no-rug guarantees.
Dev buy
The creator may buy tokens in the launch transaction, at the starting price, before anyone else
can trade. For WBNB-paired coins the dev buy is paid with msg.value; for other quote tokens it
is pulled from the creator's balance. It has a minAmountOut slippage guard. The dev buy is
public on-chain, like any other trade. It pays the normal fee F and runs before the anti-sniper
fee is armed.