Skip to main content

Session — launchpad core

Closed. The protocol contracts. See notes/STATUS.md for project state and notes/ARCHITECTURE.md for the shape.

Done

Six contracts — LaunchFactory, BondingCurve, LaunchToken, PoolMigrator, FeeVault, BasketWrapper — with 120 local tests and 7 against live Arbitrum One. The concept also runs: make dev-anvildev-deploydev-smoke, with no RPC anywhere.

All three things v1 had to prove are proved: a token launches on a curve and migrates to Uniswap v4, it can be paired against essentially any ERC20, and it can be paired against a basket of them.

Decided in passing, worth not relitigating

  • A beacon per version, and no parameter setters in the curve. D12. The second half is the consequence people forget: without it, an emergency upgrade is also a way to move c mid-raise.
  • Parameters are derived, not supplied. The forced relation is the only value the curve can hold, so a launch cannot ship a curve that closes where its pool does not open.
  • The migrator is replaced, never upgraded, and the pool is opened at launch rather than at graduation. D16. Both follow from PoolManager.initialize being permissionless.
  • Fees are zero by default. Deliberate, so the mechanism could be watched without them.
  • Baskets redeem pro rata rather than by fixed units. D14, amended before anything was built.
  • forge lint's reentrancy-events and screaming-snake-case-immutable are excluded repo-wide, with the reasoning in foundry.toml. Every hit was a false positive.

Open in this thread

All carried in notes/DECISIONS.md: O17 blocks the first fee strategy, O15 the token's observer, O13 basket identity, O12 anti-snipe. The hook's shape is settled (D15) but it is not written, and nothing but a script can reach the launchpad.

What went wrong in how we worked

The session drifted twice, both times the same way: after finishing a piece I proposed the next one unprompted, and the proposals accumulated into a backlog the developer had not asked for. It cost a full reset to untangle what was v1 from what was suggestion. Recorded against O7.