Docs

Contracts

Foundry project layout, deploy order around the Pons launch, and how a new pair goes live.

Layout

contracts/
src/SnowmanNFT.sol             ERC-721 + ERC-6551 accounts + merge
src/SnowballController.sol     harvest, per-gene index, timelock mirror
src/SnowmanFactory.sol         one call deploys NFT + controller for a pair
src/Deployers.sol              stateless creators (keeps factory under EIP-170)
src/adapters/UniswapV3*.sol    swap + liquidity venue adapters
script/DeployFactory.s.sol     once per chain
script/Deploy.s.sol            once per pair
abi/*.json                     exported for the front-end

Deploy order

  1. 1
    Factory (done)
    Deployed on Robinhood Chain at 0xD0637f5323F16E16F453cB1fCa2524DEae807c9f.
  2. 2
    Launch the token on Pons v2
    Against USDG or a tokenized stock. This produces the launch token address.
  3. 3
    Deploy the pair
    Deploy.s.sol with SNOWMAN_FACTORY, LAUNCH_TOKEN, QUOTE_TOKEN, the venue router and position manager. It creates the NFT and controller, installs adapters, and hands ownership to OWNER.
  4. 4
    Point Pons at the controller
    Set the token's creatorFeeRecipient to the new controller.
  5. 5
    Register on the site
    Add the pair to addresses.json or the SNOWPONS_ADDRESSES env. Reads, mint, merge and claim switch from simulated to live.
  6. 6
    Renounce
    renounce() on the controller once adapters are final. No withdraw path exists at any point.

Tests

73 Foundry tests run against the real ERC-6551 reference registry and account, not stubs: account derivation from the raw initcode, gene caps, supply exhaustion, burned ids unreachable, merge sweeping 6-decimal and 18-decimal ERC-20s plus a position plus ETH in one call, phantom-transfer reverts, harvest credited per gene, and every deployed contract fitting under the EIP-170 size limit.

run
cd contracts
forge build
forge test