Skip to main content

Session — the MVP on the local stack — closed 15 Sep 2026

The launchpad core, deployed and usable on a local chain (D27). Fees on. No stocks (their own effort), no hooks, no web interface, no experiment seams, no anti-snipe. Security bar: Slither triaged plus an internal review.

Where it starts — 15 Sep 2026

make dev-deploy deploys a one-quote launchpad: PoolManager, one DevQuote, FeeVault, one PoolMigrator (no fees), the curve beacon, the factory, and PoolSwapTest. It does not deploy:

  • BasketFactory, setQuoteSource, reference units, or any stock;
  • LaunchRouter — and there is no Uniswap v3 on a bare anvil for its swap leg;
  • more than one quote asset, or any fee (curve, creator or pool).

make dev-smoke proves launch → curve → graduation → pool swap for that one quote.

Tried and rejected

  • A forked local chain, for real Uniswap v3. anvil --fork-url of Arbitrum One at block 504,491,782: code reads work, every eth_call fails Excess blob gas not set, and sends fail on fee history. --hardfork cancun and prague change nothing; anvil 1.8.1 has no Arbitrum network mode.

  • Uniswap's official @uniswap/deploy-v3. It exists and deploys the full stack from official artifacts, but it is a Node CLI and the developer wants everything in Foundry. Building from the same source with Uniswap's compiler settings (800 runs, no metadata hash) reproduces the exact pool init-code hash 0xe34f…8b54, which the deploy script checks.

  • v3 inside the protocol project. Would compile 0.7.6 and OpenZeppelin 3.4 into every make check.

Build plan — agreed 15 Sep 2026

  1. Done. Uniswap v3 from its official source, in its own Foundry project contracts/dev/uniswap-v3 (six pinned submodules: v3-core v1.0.0, v3-periphery 0682387, swap-router-contracts v1.3.0, v2-core v1.0.1, solidity-lib, OpenZeppelin v3.4.2-solc-0.7). make dev-deploy deploys WETH9, the factory, the position manager and SwapRouter02 first and writes deploy/31337-uniswap-v3.json. Proved on anvil: pool created, liquidity minted, 1 WETH swapped through SwapRouter02.
  2. Done. script/DevMarkets.s.sol deploys dUSD (6 decimals) and dARB and seeds full-range 0.05% v3 pools, WETH/dUSD at 3,000 and WETH/dARB at 7,500. Deploy.s.sol registers WETH (20), dUSD (50,000) and dARB (69,000), turns fees on (1% protocol curve fee, 1% LP fee, 50% pool creator share), deploys LaunchRouter, and writes all of it to deploy/31337.json. Proved: 1 ETH through the router → v3 → dARB → curve bought 91M tokens.
  3. Done. make dev-smoke on a fresh make dev-deploy: launch against dARB with a 1% creator fee; 1 ETH through the router onto the curve; a quarter sold back for ETH; 15 ETH crosses the threshold at the node's estimate, graduates, refunds the excess; 1 ETH buys in the pool through the same call; a pool sale routes dARB → WETH → dUSD; collectFees splits evenly. Every step checks its own outcome.
  4. Done. Slither 0.11.4: 44 findings, no High, every one triaged as intended or a false positive. CI's Slither job (fail-on: medium) had been failing on 14 Mediums since the scaffold, unnoticed. The 14 are now disabled at their lines; make lint fails on Medium too, like CI. Triage below.
  5. Dropped by the developer: nothing meaningful is deployed yet, and the contracts will change.

Slither triage

Moved to notes/references/slither-triage.md.

Next

Closed: the MVP runs locally. make dev-anvil, make dev-deploy, make dev-smoke. What follows is three separate efforts (D27) — stocks, hooks, and the modular infrastructure for experiments — and which comes first is the developer's call.