Know each contract.
Verify every binding.
Contract responsibilities, callable interfaces, and immutable launch terms.
LaunchFactory
Source: contracts/src/LaunchFactory.sol. Validates launch inputs and upstream modules, coordinates activation, and stores the final receipt.
predict(actor, userSalt): obtain namespace/component predictions.manifestHash(actor, config): bind the reviewed configuration and observed dependencies.launch(config, expectedManifestHash): activate the collection.launches(launchId(actor, userSalt)): read the persisted final receipt.
Minter, collection and vault clone predictions remain fixed. The factory itself receives and settles the launch allocation. FLOOR and pool can finalize differently if upstream token addresses are occupied. A bounded 256-candidate search preserves currency ordering and reverts on exhaustion; never adopt a foreign deployment or assume a simulated FLOOR address is final.
Minter
Source: contracts/src/Minter.sol. mintPublic(quantity, recipient) issues sequential public IDs while skipping team reservations. After the configured opening delay, it collects one FLOOR of backing plus the creator fee (mintFeeAmount(quantity), paid in FLOOR) per NFT, sells the fee for quote through the collection’s Uniswap V4 pool, pays recipients in quote and funds backing in the same transaction. If the sale cannot complete, unsold fee FLOOR remains pending for a later mint or a permissionless sellMintFees() call. claimTeam(ids) delivers pre-backed reserved rights without a primary fee.
Read publicRemaining(), teamRemaining(), mintEconomics(), pendingMintFee(), totalMintFeeFloor(), totalMintRevenueQuote(), and mintRevenueQuotePaid(recipient) for v5. Deployed v4 collections retain the FLOOR-denominated totalMintRevenue() and mintRevenuePaid(recipient) reads.
NFTVault
Source: contracts/src/NFTVault.sol. deposit(tokenIds, recipient) releases one accounted FLOOR per deposited NFT after conversionOpensAt. redeem(tokenIds, recipient) consumes one FLOOR per selected accounted inventory NFT.
Read inventory(id) and verify ownership before selection. An unsolicited transfer is not a supported deposit. reserve is an accounting value, not simply the token balance; donations create no credit. The timer directly gates deposits. Redemption requires active state and inventory, with no independent timer check.
CollectionRouter
Source: contracts/src/CollectionRouter.sol. One shared router serves collections registered by its immutable launch factory. Every route takes the selected minter as its first argument, authenticates the persisted launch receipt, and uses that collection’s canonical v4 pool. Its methods include buyFloorWithQuote, sellFloorForQuote, mintWithQuote, redeemWithQuote, sellForQuote, mintWithFloor, redeemWithFloor, depositForFloor, and exchangeNFTs. Use the compiled ABI for complete argument types.
Standalone FLOOR buys and sales accept exact raw token amounts, including fractions, and emit FloorPurchased or FloorSold. They have no primary mint fee and do not wait for the conversion delay. Quote-funded mint limits include both pool cost and primary fee. Vault redemption has no primary fee. Deadlines and min/max amounts are explicit; canonical operations revert atomically.
Token approvals
Clients use ordinary ERC-20 approvals to the verified router. Quote-funded routes require the maximum paired-token input; direct FLOOR routes require the exact FLOOR input and any primary mint fee in paired tokens. Clients set the allowance to the exact requested amount, resetting a differing nonzero allowance first. NFT transfers use individual token approvals.
The router pulls funds from the transaction caller during the selected route. It has no administrator or privileged collection rights. Routes pull the caller’s required input, refund unused quote funding and clear downstream approvals. Ordinary supported routes starting empty finish without token leftovers. The router does not track ownership or guarantee preservation of unsolicited pre-existing funds; those funds can remain stuck. Router deployments are immutable; use a verified deployment and its matching ABI on the selected chain.
Immutable economics
MintEconomics.Config(uint16 feeBps, uint32 conversionDelay, Share[] shares). feeBps is 0–1000 (MAX_FEE_BPS, default 1000): collectors pay the creator fee as feeBps / 10000 of one FLOOR per NFT. The v5 minter sells collected fee FLOOR for quote through the collection’s Uniswap V4 pool and distributes quote to recipients by share. Unsold fee FLOOR remains pending if a sale cannot complete, and is sold on a later mint or by anyone calling sellMintFees(). Zero fee requires empty shares. Positive fees require 1–8 unique nonzero recipients, sorted numerically, positive bps totaling 10,000; the minter, vault, and collection cannot receive creator fees. Collections launched before v5 continue paying mint fees in FLOOR.
conversionDelay is 0–31,536,000 seconds from actual successful activation. It gates public minting and NFT deposits; sellout does not open either early. The top-level pool fee is separate from economics.feeBps.
JPEGNFT
JPEGNFT is the capped ERC-721. Only its minter can issue NFTs. Read ownerOf(tokenId), totalSupply(), maxSupply(), metadataRoot(), revealed(tokenId), and tokenURI(tokenId).
reveal(uint256 tokenId, string uri, bytes32 contentHash, bytes32 salt, bytes32[] proof) is permissionless: anyone with a valid commitment proof can publish a minted token’s artwork once. The leaf binds the JPEG_MARKETS_METADATA_V1 domain, chain ID, collection address, token ID, URI hash, content hash, and salt. Before reveal, tokenURI returns the placeholder; nonexistent IDs revert. Reveal emits MetadataRevealed and ERC-4906 MetadataUpdate.
Deployment and allocation
LaunchMinterDeployer creates fixed-implementation clones at predicted minter, collection, and converter addresses. Each clone has separate storage and is initialized atomically; implementation contracts and initialized clones reject initialization. There is no upgrade administrator or implementation setter. The shared LaunchFactory settles the launch allocation within the launch transaction: it funds team backing first and transfers attributable leftover FLOOR to the configured creator recipient. Preexisting donations are excluded.
The router is deployed once per factory version on each chain and verified against that factory. Each route verifies the selected collection receipt and canonical pool. The current testnet release uses fresh deployment addresses, fresh collection state, and the minter-first ABI. Prior deployment records describe historical testnet contracts. Use compiled ABIs from the deployed source revision. Base and Robinhood Chain require their own verified module bundle, contract addresses, and runtime hashes; addresses from one network are not deployment evidence for the other.