Skip to content

Launchpad state, events, and errors

Read launch.move, events.move, and the complete generated reference. Chain objects and completed events are authoritative; SDK projections are previews.

Object Reads that matter
Launch<Meme, Quote> lifecycle, public_start_ms, opening_round_ms, opening pot/delivery balances, meme_reserve, real_quote_reserve, virtual_quote, graduation_target, both trade-fee rates, sell burn, allocation plan, pool tier, LP split, creator/cap IDs, partner ID, fee ledger.
LaunchConfig Admission policy, trade-fee snapshots for new launches, protocol allocation, exact SUI creation fee; quote types are table keys with original type identity. Partner admission uses PartnerKey(ID) dynamic fields with acceptance end time.
RuntimeConfig Live protocol trade-fee share, treasury, creator-account signer.
Currency<Meme> Metadata, decimals, current supply, and burn-only/fixed supply mode.
LpVault<Meme, Quote> Pool and partner IDs, current LP split, creator/auto-LP/rewards/burn balances, protocol residuals, unpaid partnered protocol LP fees, next reward round and checkpoint. Venue position is a dynamic object field.
LpFeePolicy Live default shares and per-Meme overrides keyed by original type name, plus payout destination.
Round<Meme, Quote> Vault ID, round number, funded rewards, Merkle root, leaf count, paid bitmap. Read checkpoint intervals and manifest digest from RoundPublished.
Each package’s PackageVersion / PackageAdmin Current operational generation and upgrade custody.

Discover ticket IDs and coin types from publish effects and LaunchTicketCreated; join LaunchCreated.ticket_id to that ticket event. LaunchShared provides the public start. VaultCreated names the vault, DEX pool, and coin types, but has no launch ID. Join it to Migrated.launch_id in the same transaction using the launch’s known Meme type; do not assume a transaction contains only one migration. Resolve a canonical deployment first; never guess launchpad IDs from presale publication records.

[OpeningRound ->] Live -> MigrationReady -> Migrated

Only Live accepts ordinary buys; sells also require public sharing. Opening settlement may skip public Live trading by reaching the target immediately. Delivery works in any state after OpeningRound. Fee claims and metadata operations have their own cap/version checks and remain available after migration. There is no cancelled state.

Spot price and graduation progress use the curve formulas. Round end is public_start_ms + opening_round_ms. A bidder’s outstanding amount is a u64 dynamic field under OpeningRoundBidKey(address); delivery removes it. Do not treat virtual quote as cash, or the graduation target as accumulated volume.

Launchpad payloads use the wrapper:

<launchpad original ID>::blast_events::Event<
<launchpad original ID>::events::Name
>

Filter by the full wrapped event type. The called module is not necessarily the payload’s defining module: migration emits launchpad events while executing an adapter. Get transaction sender from the transaction, not an assumed event field. Replay in checkpoint, transaction, and event order.

Event family Use
LaunchTicketCreated, LaunchCreated, LaunchShared Join coin identity and settings to the launch and public start time.
OpeningRoundJoined, OpeningRoundSettled, OpeningRoundDelivered Track bids and delivery. Joined has no bidder field; use transaction sender.
Bought, Sold Gross/net amounts, refund or pending burn, both assets’ protocol/creator fees, post-trade reserves. Bought beside settlement belongs to the pot; before sharing it can be a creator purchase.
CreatorCapsClaimed, cap reassignment, MemeMetadataUpdated Track live creator authority and metadata. CreatorCapsClaimed identifies the Meme type rather than a launch ID.
CreatorFeesClaimed, ProtocolFeesClaimed, ProtocolFeesAccrued Separate payouts from accrual.
MigrationAllocationPaid, Migrated Recipient payouts, pool amounts, disposed tokens, resulting supply.
Config events Track listing, fees, protocol allocations, partner admission, treasury, signer, and runtime protocol share.

Migrators emits direct blast_fun_migrators::blast_events payloads, including CetusPoolReserved, VaultCreated, FeesCollected, AutoLpPositionOpened, AutoLiquidityAdded, FeeSplitChanged, CreatorFeesClaimed, ProtocolLpFeesClaimed, BuybackBurned, RoundPublished, and RewardPaid. Partner payouts separately emit blast_partners::blast_partners::PartnerPaid. Do not apply the launchpad wrapper to these packages.

  1. Resolve the launch’s Meme type through LaunchCreated.ticket_id and LaunchTicketCreated. Match the wrapped Migrated event to the direct VaultCreated event in the same transaction by that type. Store the resulting launch, vault, and pool IDs.
  2. Interpret VaultCreated.position_id by venue. On Cetus it identifies the CetusLPBurnProof, not the destroyed migration position; later AutoLpPositionOpened.position_id identifies a separate live auto-LP position. On Bluefin the original position remains in the vault. Read the vault’s dynamic object fields to resolve custody.
  3. Start principal accounting with the Migrated handoff minus VaultCreated.residual_meme and residual_quote. Residuals are protocol-owned vault balances, not additional liquidity or user refunds.
  4. Replay FeesCollected into creator, auto-LP, rewards, and burn-quote balances. A missing protocol_destination means Blast’s LP share is held for a partner payout. Named recipients and burn-side Meme have already left the vault; do not add them to its pending balances.
  5. Apply later events in execution order: AutoLiquidityAdded gives pending auto-LP balances; BuybackBurned gives pending burn quote; RoundPublished moves reward funds into its round; RewardPaid updates that round’s remaining funds and paid index. Claims empty the corresponding accrued balance. Keep launchpad and migrators claims separate by full event type.

A zero-fee collection emits no FeesCollected, but can still reinvest earlier leftovers and emit AutoLiquidityAdded. Use its recorded pending balances rather than inferring that no event means no change. The generated reference gives the full replay fields; reconcile projections against object state.

Failure What to check
Operational generation Call the current package ID with its own version object; launchpad and migrators versions are separate.
Quote, decimals, or adapter not allowed Read current admission before creation; existing launch snapshots are separate.
Invalid shares or missing initializer values Set all required values, include Blast’s allocation in both sums, and obey recipient limits.
Invalid creation fee Exact SUI amount, including a zero coin for a zero fee.
Invalid lifecycle Round joining, settlement, trading, and migration each have different state/time gates.
Slippage / zero output Re-quote with integer math and a meaningful minimum; see the terminal-buy exception.
Creator cap not live Compare the cap ID to the launch’s recorded live ID.
Partner mismatch Use the partner-specific payout only for a launch/vault with that recorded partner.
Venue mismatch Verify pair, Cetus order, pool ID, tier, and required fee/venue objects.
Invalid/paid reward proof Use vault ID in leaf, exact BCS integers, correct tree size and parity, and an unpaid index.

Abort numbers and locations are package/revision-specific. Use the generated reference and the emitting module for exact decoding; Sui collection, balance, arithmetic, option, and BCS aborts can also propagate.