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.
Objects to resolve
Section titled “Objects to resolve”| 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.
Lifecycle and display values
Section titled “Lifecycle and display values”[OpeningRound ->] Live -> MigrationReady -> MigratedOnly 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.
Event identity
Section titled “Event identity”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.
Index migration and vault balances
Section titled “Index migration and vault balances”- Resolve the launch’s Meme type through
LaunchCreated.ticket_idandLaunchTicketCreated. Match the wrappedMigratedevent to the directVaultCreatedevent in the same transaction by that type. Store the resulting launch, vault, and pool IDs. - Interpret
VaultCreated.position_idby venue. On Cetus it identifies theCetusLPBurnProof, not the destroyed migration position; laterAutoLpPositionOpened.position_ididentifies 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. - Start principal accounting with the
Migratedhandoff minusVaultCreated.residual_memeandresidual_quote. Residuals are protocol-owned vault balances, not additional liquidity or user refunds. - Replay
FeesCollectedinto creator, auto-LP, rewards, and burn-quote balances. A missingprotocol_destinationmeans 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. - Apply later events in execution order:
AutoLiquidityAddedgives pending auto-LP balances;BuybackBurnedgives pending burn quote;RoundPublishedmoves reward funds into its round;RewardPaidupdates 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.
Common aborts
Section titled “Common aborts”| 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.