Contracts
Core invariants
The properties that connect launch math, custody, liveness, supply, and liquidity.
Configuration and identity
- A canonical launch was created by the pinned launch factory through
D17Factory. - A locker's rules-sensitive actions require the expected launch identity, WETH, rules hash, and canonical factory record.
- Launch configuration and its rules hash do not change after construction.
Supply
sale + LP + creator distribution + dead = max supplyexactly.- Creator distribution is at most 10%; treasury at most 20%; ordinary refund penalty at most 50%.
- Minting closes and token ownership is renounced during launch creation.
- Pre-trading transfers and ordinary holder burns are blocked; only the launch's narrow unsold-sale burn path is permitted.
Custody and refunds
- Committed WETH remains accounted in the participant's locker until refund or settlement.
- Ordinary refund policy is fixed by round: free 1–2, configured percentage 3–4, no window 5.
- Failed launches provide a permanent full-refund path.
- Withdrawal recipients are fixed to the locker owner.
Liveness and settlement
- Finalization of a successful launch is permissionless after the rounds; a permanently failed launch uses the full-refund path and cannot be finalized.
- No all-settled condition blocks pool creation;
allFinalCommitmentsSettledis only a metric. - After the fixed grace boundary, anyone may settle a known locker without redirecting its proceeds.
- Settlement does not expire and uses the same sale-token entitlement and configured WETH split before or after pool creation.
Liquidity
- Initial LP-token use is proportional to liquidity WETH already settled.
- LP tokens reserved for unsettled lockers cannot be released beyond the configured LP allocation.
- A late settlement transfers reserved tokens and liquidity WETH into the official pair atomically.
- Every protocol LP token is minted to the launch vault, which has no LP withdrawal path.
- The official pair cannot already have live supply or be preseeded with the D17 token at creation.
A metric is not a gate
allFinalCommitmentsSettled() is useful for displaying completion. It is deliberately not a liveness prerequisite: one forgotten or hostile locker cannot prevent the official pool from opening.