fomopad
Docs / Protocol

Security

What the owner can do, what nobody can do, and what is tested.

What the owner can and cannot do

CanCannot
Move fee parameters within hard ceilingsPause trading or launches
Change the curve shape for future launches, within boundsChange a live curve
Change the treasury addressWithdraw curve ETH or user funds
Claim the treasury’s own fee shareRemove 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.