Pools
How a launch splits the supply across pools, and how the start price works.
A launch creates 1 to 5 Uniswap v4 pools. Each pool pairs the token with one quote.
Pool requests
Each pool request has three fields:
| Field | Type | Description |
|---|---|---|
quote | address | The quote asset. address(0) is the chain's native currency. |
supplyBps | uint16 | The pool's share of the supply, in basis points (10000 is 100%). |
initialTick | int24 | The start price, as a tick of raw quote per raw token. See below. |
The requests must follow these rules:
- There are 1 to 5 requests.
- The shares sum to exactly
10000, and each share is more than zero. - The shares do not increase. Each share is less than or equal to the share before it. Equal shares are allowed.
- The first request is the main pool. Its share is at least
6000(60%). - Each request has a different quote.
- Each start tick is a multiple of
200, at least-887200, and less than887200.
There is no quote allowlist. A quote can be native currency or any ERC-20. Use a standard ERC-20 with no transfer fee and no rebase.
Pool key
Each pool has this Uniswap v4 pool key:
| Field | Value |
|---|---|
currency0 | The lower address of the token and the quote |
currency1 | The higher address of the token and the quote |
fee | The LP fee of the launch's partner, in pips. It is static. |
tickSpacing | 200 |
hooks | DropHook |
Read the key with poolKey(quote, token) on the launchpad.
The position
The launchpad adds one position to each pool. The position holds only the token. It starts at the start price and goes up to the highest usable price.
- Buyers move the price up and take tokens from the position.
- Sellers can only take back the quote that buyers put in. Below the start price, the pool has no liquidity.
- The launchpad owns the position forever. Nobody can remove it, and nobody can add other liquidity.
Start price
initialTick is the start price in raw quote per raw token, whatever the order of currency0 and currency1. The
launchpad converts it to the pool's tick.
The price of one whole token in whole quote units is:
price = 1.0001 ^ initialTick × 10 ^ (18 − quoteDecimals)The start market cap is price × 1,000,000,000. The tick spacing is 200, so the start price moves in steps of about
2%.
| Quote | Start market cap | initialTick | Exact market cap |
|---|---|---|---|
| ETH (18 decimals) | 10 ETH | -184200 | 10.016 ETH |
| ETH (18 decimals) | 30 ETH | -173200 | 30.088 ETH |
| USDC (6 decimals) | $33,000 | -379600 | $32,734 |
| USDC (6 decimals) | $100,000 | -368400 | $100,321 |
See Set the start price to calculate a tick in code.
A high start price makes the position's range narrow. If the range is too
narrow for the pool's supply, PoolManager reverts the launch with
TickLiquidityOverflow.
Each pool has its own start price. The launchpad does not check that the prices of different pools agree. If they do not agree, traders can buy in the cheaper pool and sell in the other.
Dev buy
A launch can buy tokens from the main pool in the same transaction. The devBuy field has:
| Field | Type | Description |
|---|---|---|
amountIn | uint128 | The exact quote amount to spend. 0 skips the dev buy. |
recipient | address | Receives the tokens. Must not be zero if amountIn is not zero. |
The caller of launchDrop pays:
- If the main pool's quote is native, send exactly
amountInas the call value. - If the main pool's quote is an ERC-20, approve the launchpad for
amountInfirst. Send no value.
The dev buy is a normal swap. It pays the LP fee, and the fee goes to the fee recipients like any other fee. If the
pool cannot take all of amountIn, the whole launch reverts.