Docs / Protocol
Security
What the owner can do, what nobody can do, and what is tested.
What the owner can and cannot do
| Can | Cannot |
|---|---|
| Move fee parameters within hard ceilings | Pause trading or launches |
| Change the curve shape for future launches, within bounds | Change a live curve |
| Change the treasury address | Withdraw curve ETH or user funds |
| Claim the treasury’s own fee share | Remove or move a pool position |
| Mint tokens, blacklist, tax |
Invariants under test
- Solvency.
balance(launchpad) ≥ totalCurveEth + totalClaimable: the contract can always pay every curve sell and every claim. - Supply conservation. Before graduation, tokens outside the contract equal tokens sold; after, only rounding dust remains inside.
- Reserve reconciliation. The sum of every curve's reserve equals the running total the solvency check relies on.
- No ETH created. Across random buys, sells, claims and collections, ETH out never exceeds ETH in.
Other guards
- Reentrancy guard on every function that moves ETH or tokens.
- The PoolManager callback accepts only the PoolManager; so does
receive(), so no ETH can sit outside the accounting. - Swap amounts bounded to
uint128, as Uniswap v4 requires; a silent truncation would have swapped a fraction of the intent. - Slippage checked on measured balance changes, never on a return value.
- Full-range liquidity shaved by a millionth so the pool's round-up can never overdraw the deposit.
- Graduation adopts a pre-initialised pool's price instead of reverting.
Test coverage
Unit and fuzz tests for the curve, fees, quotes, slippage, refunds, admin bounds, clones and the icon cap; a gas ceiling test that keeps a launch with an icon under 700,000 gas; an invariant suite; and two fork tests against the real PoolManager on Robinhood Chain proving the pool the launchpad opens is the one Uniswap's StateView reports, that swaps clear both ways, and that pool fees collect and split.