The Launch a token tab on /launch creates a new ERC-20 together with its own Levee pool in one transaction, so no one can hold or trade the token before its market exists. If you would rather gather buyers first, a launch vault collects ETH ahead of time and buys at launch for everyone at one price. The Pons tokens tab covers tokens that started on the Pons launchpad and lets anyone open a Levee pool next to them.
What one launch does
You choose a name, a symbol, a supply, a start price and a fee schedule, and can attach ETH to buy at launch. LaunchPools.launch(p) then does all of this in one transaction:
- 01CheckThe parameters must pass
preview(p)(see Reference). The form runs the same checks before you sign. - 02Deploy the tokenA
LaunchToken: a plain 18-decimal ERC-20 whose whole supply is minted once. No owner, no further minting, no fee or limit on transfers, no address treated differently. - 03Create and seed the poolA DAMM pool of native ETH against the token, tick spacing 60, opened at your start price. The seed is one range from the lowest usable tick up to that price, so it holds only the token and sells it to buyers at every higher price.
- 04Buy, if you sent ETHThe ETH buys the token as the pool's first swap, in the same transaction, so nobody can trade ahead of it.
- 05Hand out the restTokens bought and any ETH paid back go to you. The supply the pool did not take goes to the creator you named.
The token's address, and with it the pool id, is unknown until the launch lands: it is deployed with CREATE2 under a salt of the caller, the launch count and the block number. The pool manager accepts any address as a currency, so a predictable address would let someone create the pool first and block the launch. If a same-block front-run still takes it, the launch reverts LaunchPools__PoolTaken and works from the next block. A launch cannot go through while the venue is paused, because the pool's hook refuses new liquidity and swaps until it resumes.
The pool's tick counts tokens per ETH; the form works in ETH per token. You type a start price or a starting market cap in ETH, and the form rounds it to the nearest multiple of 60 ticks.
| Field | Form default | Decides |
|---|---|---|
| Supply | 1,000,000,000 tokens | the whole supply, minted once |
| Seed | 100 % of supply | how much the pool can sell; the rest goes to the creator |
| Start | 10 ETH market cap | the price of the first token sold |
| Base fee | 100 bps | the fee after the anti-snipe window |
| Anti-snipe | 2,500 bps over 600 s | the fee at the first second, and how long it takes to fall to the base |
| Volatility control | 10,000 | the size of the volatility surcharge; 0 turns it off |
The anti-snipe fee and a launch buy
A DAMM fee is a schedule plus a surcharge. During the anti-snipe window the schedule falls in a straight line from the start fee to the base fee. The surcharge grows with recent tick movement and fades over 10 min; outside the window the total is capped at 500 bps. Levee pools covers DAMM pricing in full.
Each swap fee has two parts. The protocol share, protocolFeeShareBps of the fee (20 % at deploy, at most 50 %), comes off the input and goes to the fee collector, which funds buyback and burn. The LP part goes to the liquidity the swap trades against.
A buy inside the launch transaction pays the full start fee, because no time has passed. But the launch position is then the pool's only liquidity, so the whole LP part is its own: LaunchPools collects it right after the swap and pays it back to the buyer with the tokens. Only the protocol share stays charged. With the form's defaults that is 500 bps of the buy. The form quotes your buy this way before you sign.
Fees from the launch position
LaunchPools itself holds the seeded position and has no function that removes it, no owner and no upgrade path. It can only collect the position's LP fees:
collectFees(id)is open to anyone and pays both currencies straight to the launch's fee recipient, even while the venue is paused.setFeeRecipient(id, to)lets the current recipient, and only them, hand the fees to another address.pendingFees(id)shows what a collect would pay now.
The recipient starts as the creator. The tab lists, among the latest 200 launches, those whose fees go to your wallet, with a collect button.
Pooled buying with a launch vault
A launch vault lets a group buy at launch without racing each other: everyone's ETH goes into one first buy, so every depositor pays the same average price.
- 01Open
LaunchVault.open(p, depositEnd)checks the launch parameters aspreviewdoes and stores them for good.depositEndmust be in the future and at most 7 days away; the form defaults to 24 h. - 02DepositUntil
depositEndanyone can deposit ETH and withdraw any part of their own deposit. - 03LaunchFrom
depositEnduntil 3 days after, anyone can calllaunch(id), which launches with the vault's whole balance as the first buy. - 04Claim, or refundAfter a launch, each depositor claims a share of the tokens and of the ETH paid back, in proportion to their deposit and rounded down. If nobody launched in time, for example because the venue stayed paused, each depositor refunds the whole deposit.
The vault takes nothing. The unseeded supply and the launch position's fees go to the creator named in the parameters, which the opener chooses. A depositor's one cost is the protocol share of the start fee on the vault's buy, which the vault drawer prints before you deposit. The buy has no price limit, so the more ETH the vault holds, the higher up the curve it buys.
Pons tokens
Pons is a third-party launchpad on Robinhood Chain. A Pons token trades on a bonding curve until it graduates, and then in a Uniswap v4 pool keyed by its pair token and the Pons hook. The Pons tokens tab lists graduated and new launches from the indexer (GET /pons) and looks up any other token through the Pons factory. Prices, graduation progress and charts are read on chain.
Levee adds two things:
- Trading. The router takes a Pons hop on the curve before graduation and in the v4 pool after. A curve hop sets no minimum of its own; the router enforces your minimum output and deadline over the whole route. A token page's Buy and Sell open
/swapwith the token and amount filled in (Swaps and routing). - A Levee pool. Open a Levee pool calls
DammHook.createPoolfor the token against its pair token, at a start price prefilled from the live Pons price. Defaults: 100 bps base fee, 2,000 bps anti-snipe fee falling over 600 s, volatility control 10,000, tick spacing 200. The pool starts empty and you add liquidity separately. Anyone can open one, and only one per tick spacing can exist.
Reference
Launch checks
| Name | Allowed | Default | Effect |
|---|---|---|---|
name / symbol | 1 to 64 / 1 to 16 bytes | - | LaunchPools__BadName |
supply | 1 wei to 1e33 wei | - | at most 10^15 whole tokens; LaunchPools__BadSupply |
seedAmount | 1 wei to supply | - | LaunchPools__BadSeed, also when it rounds to zero liquidity |
creator | non-zero | - | gets the unseeded supply and the fee right |
startTick | above −887,220, up to 887,220 | - | a multiple of 60; LaunchPools__BadTick |
baseFeeBps | 5 to 100 bps | - | LaunchPools__BadFees for any fee field |
snipeStartFeeBps | above base, up to 5,000 bps | - | the anti-snipe window is required |
snipeSeconds | 1 to 3,600 s | - | linear decay to the base fee |
variableFeeControl | 0 to 2^32 − 1 | - | 0 turns the surcharge off |
Reverts
| Error | When |
|---|---|
LaunchPools__Bad*, __ZeroAddress | a parameter out of range, in preview, launch or LaunchVault.open |
LaunchPools__PoolTaken | the pool was created earlier in the same block; retry |
LaunchPools__NotFeeRecipient | setFeeRecipient from anyone but the current recipient |
LaunchVault__BadWindow | depositEnd in the past or more than 7 days ahead |
LaunchVault__DepositsClosed / DepositsOpen | a deposit or withdrawal after depositEnd; a launch before it |
LaunchVault__LaunchExpired / AlreadyLaunched | a launch after the 3-day window, or a second one |
LaunchVault__NotLaunched / NotRefundable | a claim before the launch; a refund before expiry or after a launch |
LaunchVault__NothingToClaim | no deposit, or already claimed or refunded |
Launched records each launch (token, creator, amounts seeded and bought, ETH spent after the payback); FeesCollected and FeeRecipientSet track the fee right. The vault emits VaultOpened, Deposited, Withdrawn, VaultLaunched, Claimed and Refunded. The app finds launches through getLaunches and these events, never in the deployment manifest, since a launch token's address is not known in advance.
contracts/src/venue/launch/LaunchPools.sollaunch, preview, the launch position and its feescontracts/src/venue/launch/LaunchToken.solthe fixed-supply tokencontracts/src/venue/launch/LaunchVault.solopen, deposit, withdraw, launch, claim, refundcontracts/src/venue/hooks/DammHook.solthe fee schedule, its bounds and createPoolcontracts/src/venue/periphery/PonsAdapter.solthe Pons curve hopapps/web/lib/amm/launch.tsstartTickFor, quoteFirstBuy, launchProblem, vaultStatusapps/web/lib/launch/pons.tsthe Pons list, live state and price history