Aftermath (source preview)
This route creates a 50/50 Aftermath pool wrapped in a DAO-fee pool. Its vault receives DAO fees and splits them using the sale’s fee split. It is separate from the partner-specific blast_aftermath_dao_presale vendor, whose fees go directly to its partner treasury and which creates no Blast vault.
Create
Section titled “Create”Before creating the sale, publish a fresh Aftermath LP coin Lp with 9 decimals. Each sale needs its own LP coin and its CreatePoolCapV2. Check that capability and its coin type before listing the sale: finalization cannot validate the capability against Lp.
In one programmable transaction:
aftermath::new<Meme, Quote>(treasury_cap, creation_policy, fee_policy, venue_config, dao_fee_bps)returns the initializer. The DAO fee is au16from 1 to 10,000 basis points. It records aPoolTierwith tick spacing 0 and the DAO fee aspool_fee_rate.- Apply the usual sale setters, including the required fee split and any optional partner.
aftermath::finalize<Lp, Meme, Quote>(initializer, currency, create_pool_cap)returns(Presale, PresaleCap, PoolCreation<Lp, Meme, Quote>). The reservation binds the LP capability to this sale and emitsPoolCreationReservedwith their IDs.blast_presale::share(presale, start_ms, clock)shares the sale.aftermath::share(pool_creation)shares the reservation in the same transaction.- Transfer the
PresaleCapto the creator.
Calling blast_presale::finalize directly creates no Aftermath reservation. That sale cannot migrate and becomes refundable if cancelled after its liquidity deadline. Finalizing another venue’s initializer through aftermath::finalize aborts with EWrongMigrator.
Migrate
Section titled “Migrate”Anyone may settle and then migrate a funded sale:
aftermath::migrate<Lp, Meme, Quote>( sale, pool_creation, fee_policy, venue_config, pool_registry, dao_fee_version, clock)pool_registry is Aftermath’s mutable shared PoolRegistry; dao_fee_version is the DAO-fee package’s shared Version. The shared PoolCreation is consumed and deleted. A reservation from another sale aborts with EWrongPresale. The adapter orders the two coins itself.
Migration seeds the pool with all of the sale’s liquidity, wraps it in a DAO-fee pool paying the new vault, and sends the entire LP coin to 0x0. The vault holds the DAO-fee pool’s OwnerCap, with no function to borrow or remove it. DaoFeePoolCreated records the vault, base pool, DAO-fee pool, owner-cap, and LP-coin IDs. In VaultCreated, pool_id is the base pool and position_id is the owner cap.
A mismatch in the deposited balances or DAO-fee settings aborts the whole transaction. An LP capability for another coin, or a coin with other than 9 decimals, can prevent migration. The sale’s normal liquidity deadline and refund rules still apply.
Collect fees
Section titled “Collect fees”Aftermath sends DAO fees from swaps, deposits, and withdrawals as coins owned by the vault’s address. Anyone may collect them:
aftermath::collect_fees<Meme, Quote>(vault, fee_policy, meme_fees, quote_fees)Query that address’s owned coins. Build meme_fees and quote_fees as vectors of PTB Receiving<Coin<Meme>> and Receiving<Coin<Quote>> inputs. Either vector may be empty. Only listed coins are received; others wait for a later collection. A coin owned by another address aborts in sui::transfer, and another venue’s vault aborts with EWrongVault.
The normal fee split applies: recipients are paid, holder Quote stays available for rounds, and holder Meme goes to the governed treasury. Follow collection with the usual partner payment when the vault names a partner.
Source: aftermath.move. Full signatures and errors are in the generated llms/presale.txt.