Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
LaunchLab expose un ensemble d’instructions serré : six appels accessibles aux utilisateurs plus une poignée de primitives administrateur. Le SDK les enveloppe tous ; cette page documente la surface brute pour les agrégateurs, les outils de monitoring et les programmes qui ont besoin de CPI.La mise à niveau du programme 2026-09 a reconstruit LaunchLab sur Anchor 1.0.2 / Solana 3.1.10 et a supprimé trois mécanismes de transition : l’
Initialize dépréciée échoue maintenant toujours, MigrateToAmm a perdu ses trois arguments et chaque compte OpenBook, et la porte get_upgrade_timestamp qui rendait plusieurs vérifications conditionnelles à l’horloge a disparu. Elle ajoute également une instruction administrateur, CollectExcessLamports. Voir l’entrée du changelog 2026-09-09.Inventaire des instructions
La division « ExactIn/ExactOut » reflète celle de CPMM
SwapBaseInput / SwapBaseOutput — sur la chaîne, ce sont des discriminateurs d’instruction séparés avec un arrondi légèrement différent.
Sélection du chemin de graduation. Chaque nouvel appel InitializeV2 et InitializeWithToken2022 doit définir migrate_type = 1 (CPSWAP). Toute tentative d’initialiser un nouveau pool lié à AMM v4 retourne MigrateTypeNotMatch. amm_creator_fee_on sélectionne uniquement si les frais de créateur CPMM résultants s’appliquent au token de quote ou aux deux tokens ; il ne sélectionne pas le programme cible. L’Initialize hérité ne peut plus créer un lancement du tout (voir ci-dessous).
MigrateToAmm reste appelable pour un PoolState existant qui a été initialisé avec migrate_type = 0 avant cette restriction. La version ne réécrit pas l’état du pool existant ni ne supprime l’instruction hérité.
Programme de token côté quote. Le mint de quote peut être détenu par le programme SPL Token ou Token-2022. Chaque instruction qui le touche — CreateConfig, InitializeV2, InitializeWithToken2022, les quatre instructions d’échange, CollectFee, CollectMigrateFee, ClaimCreatorFee, ClaimPlatformFee et ClaimPlatformFeeFromVault — prend le programme propriétaire dans son emplacement de compte de programme de quote. Les positions de compte n’ont pas changé ; seule la valeur acceptée a changé. Passez le programme qui possède réellement GlobalConfig.quote_mint, que vous pouvez lire à partir du bit1 de PoolState.token_program_flag pour un lancement existant (voir accounts) ou à partir du propriétaire du compte mint sinon.
L’Initialize dépréciée est sans objet ici : son compte de programme de quote est toujours typé en SPL Token, et depuis la mise à niveau 2026-09, l’instruction échoue avant de lire un compte. Lancez via InitializeV2 ou InitializeWithToken2022.
MigrateToCpswap est l’autre exception, dans la direction opposée — elle prend les deux programmes sans condition plutôt qu’un par mint. Voir les comptes de migration ci-dessous.
Initialize
Créer un nouveau lancement. InitializeV2 n’ajoute que l’argument amm_fee_on par rapport à l’Initialize obsolète ; le nombre et l’ordre des comptes sont identiques, et la seule différence au niveau des comptes est que quote_token_program est typé Interface<TokenInterface> afin qu’un mint de quote Token-2022 soit accepté.
Arguments
Quatre arguments positionnels, et non une seule struct. (InitializeWithToken2022 en ajoute un cinquième, transfer_fee_extension_param: Option<TransferFeeExtensionParams> ; l’Initialize obsolète supprime amm_fee_on.)
global_config.curve_type, sinon l’instruction est annulée avec InputNotMatchCurveConfig (6003). Il n’y a pas d’open_time, pas d’argument quote_mint (il provient de global_config), pas de struct fees et pas de post_graduation_lp_policy — la disposition du LP est définie sur PlatformConfig, et non par lancement.
Comptes — 18 au total (16 déclarés plus les deux ajouts de #[event_cpi])
Préconditions
quote_mint ∈ launch_config.allowed_quote_mints.base_supply_graduation ≤ base_supply_max.- Les paramètres de frais passent les vérifications
launch_config.max_*_fee_rate. open_time ≥ now − slop(le SDK applique≥ now; le programme tolère un léger antidatage).curve_typeest reconnu.
base_mintasupply = curve_param.supply, tout dansbase_vault.- L’autorité de frappe est révoquée dans cette même instruction (
set_authority(MintTokens, None)) juste après la frappe de l’offre — et non à la graduation. Le mint de base est donc définitivement à offre fixe, et aucune instruction ultérieure ne peut en frapper davantage. PoolStateinitialisé avecstatus = Fund(0),real_a = 0,real_b = 0.total_fund_raising_bvient directement decurve_param.total_quote_fund_raising.- Pour
InitializeWithToken2022avec unTransferFeeConfigattaché :transfer_fee_config_authority = launch_authority, etwithdraw_withheld_authority = PlatformConfig.transfer_fee_extension_authlorsque ce champ est défini, sinonlaunch_authority. Le côté retrait est écrit à la création du mint précisément pour que la plateforme puisse balayer les frais retenus avant la graduation. Voirplatform-config.
NotApproved (6000, inconditionnellement, pour l’Initialize obsolète), InvalidInput (6002, un plancher d’offre / de taux / de lever de fonds de GlobalConfig violé), InputNotMatchCurveConfig (6003, la variante curve_param ne correspond pas à global_config.curve_type), MigrateTypeNotMatch (6007, migrate_type != 1), MathOverflow (6008), VestingRatioTooHigh (6010), NoSupportExtension (6017), NotEnoughRemainingAccounts (6018), InvalidPlatformAllowConfig (6022), CurveParamNotMatchPlatformRule (6025). Un échec de vérification Anchor address = / constraint = se manifeste par un code 2xxx, et non par l’un de ceux-ci — aucun de InvalidQuoteMint, FeeRateTooHigh ou InvalidCurveParams n’existe dans l’énumération d’erreurs du programme.
Buy (variante canonique : BuyExactIn)
L’utilisateur fournit un quote_in fixe ; la courbe calcule base_out.
Arguments
Comptes restants — la plomberie des frais, lue exactement dans cet ordre :
share_fee_receiver— uniquement lorsqueshare_fee_rate > 0.system_program— toujours ; vérifié== System::id(), sinonInvalidInput.platform_fee_vault— PDA[platform_config, quote_token_mint]; créé à la première utilisation.creator_fee_vault— PDA[creator, quote_token_mint]; créé à la première utilisation.
NotEnoughRemainingAccounts (6018). Il n’y a pas d’emplacement
associated_token_program, et system_program est un compte restant plutôt qu’un compte déclaré.
Préconditions
launch_state.status == Active.now ≥ open_time.user_quote_ata.balance ≥ quote_in.quote_in > 0.
- Diviser
quote_inenquote_in_after_feeet les parties de frais. - Résoudre Newton la courbe pour
base_outétant donné la quote post-frais. require(base_out ≥ minimum_base_out)sinon annulerExceededSlippage.- Déplacer
quote_inutilisateur → coffre. Déplacerbase_outcoffre → utilisateur. - Mettre à jour
base_sold += base_out,quote_reserve_real += quote_in_after_fee × (lp_share / total_share). - Mettre à jour les compteurs de frais (
protocol_fees_quote,creator_fees_quote). state_data.num_buys += 1.- Si
quote_reserve_real ≥ quote_reserve_targetaprès la mise à jour, le SDK enchaîne généralement une ixGraduatedans la même transaction. Le programme ne diplôme pas automatiquement à l’intérieur deBuy— unGraduateultérieur est requis.
BuyExactOut
L’utilisateur spécifie le base_out exact ; le programme calcule quote_in.
Arguments
BuyExactIn. Utilise l’intégrale quadratique de forme fermée (ou inverse CPMM, pour curve_type 1) plutôt que l’itération Newton.
Sell / SellExactIn / SellExactOut
Miroir de Buy. L’utilisateur retourne base_in à la courbe et reçoit quote_out. Les frais sont déduits de quote_out, donc l’utilisateur reçoit moins que les produits intégrés bruts.
Préconditions —
user_base_ata.balance ≥ base_in.- La vente ne peut pas pousser
base_solden dessous de 0 (redondant avec ce qui précède étant donné que la comptabilité est cohérente). - Le lancement est
Active.
Buy. base_sold diminue, quote_reserve_real diminue. Les frais s’accumulent toujours.
Frais de transfert côté quote
Lorsque le mint de quote porte unTransferFeeConfig, le montant que le coffre déplace et le montant que le payeur est débité ou crédité diffèrent, et la limite de slippage est vérifiée par rapport au côté du payeur. Sur un mint de quote sans l’extension, chaque cas ci-dessous est identique à un mint hérité simple.
Deux conséquences pour les devis :
- Une limite calculée comme si le mint était sans frais est rejetée. Passer le coût sans frais comme
maximum_amount_in, ou les produits sans frais commeminimum_amount_out, annule avecExceededSlippage. real_quoten’avance que par ce qui a atteint le coffre. UnBuyExactIndeamount_insur un mint de quote à 5% déplacereal_quotedeamount_in × 0.95.
10000 points de base) ne peut pas être inversé et annule avec CalculateOverflow sur les chemins exact-out.
Les deux mints côté échange sont également limités au programme passé dans leur emplacement correspondant, donc un base_token_program mal assorti échoue maintenant plutôt que d’être ignoré. Voir algorithms/token-2022-transfer-fees pour les mathématiques de frais sous-jacentes.
Comptes restants d’échange
Les quatre instructions d’échange prennent leur plomberie de frais viaremaining_accounts, dans cet ordre :
Modifié en 2026-09 : les trois derniers sont maintenant inconditionnels, et
system_program est validé. Avant cette version, le programme ne les lisait que lorsque unix_timestamp >= get_upgrade_timestamp(), et sautait complètement la division des frais plateforme/créateur avant ce moment. L’horodatage est bien passé, donc le comportement sur mainnet est inchangé en pratique — mais la branche a disparu du code, et un constructeur qui omet toujours les trois comptes échoue maintenant toujours avec NotEnoughRemainingAccounts (6018) au lieu de seulement après la coupure. L’emplacement system_program est en outre vérifié par rapport à System::id() et retourne InvalidInput (6002) s’il contient autre chose, où auparavant n’importe quel compte était accepté à cette position.MigrateToAmm / MigrateToCpswap
Diplômer un lancement dans un pool tradable une fois que la courbe a atteint total_quote_fund_raising. Les nouveaux lancements sont CPMM-only. MigrateToAmm est conservé pour les pools existants dont le migrate_type stocké est 0.
Qui signe
MigrateToAmm— lemigrate_to_amm_walletenregistré sur laGlobalConfigde liaison.MigrateToCpswap— lemigrate_to_cpswap_walletenregistré sur laGlobalConfigde liaison.
- Vérifier
pool_state.status == Migrate(c.-à-d.,quote_reserve_targeta été atteint). Sinon, annuler avecPoolMigrated(le statut était déjàMigrated) ouPoolFunding(toujours en financement). - Vérifier
pool_state.migrate_typecorrespond à l’instruction (0pour AMM,1pour CPMM). Sinon, annuler avecMigrateTypeNotMatch. - Calculer les réserves post-graduation :
base_amount_out = base_vault.amount − vesting_schedule.total_locked_amountquote_amount_out = quote_vault.amount − quote_protocol_fee − migrate_fee − platform_fee
- CPI dans le programme cible (
AMM v4 Initialize2ouCPMM InitializeWithPermission) avec ces réserves pour créer le pool post-graduation. - Pour les migrations CPMM exécutées après la mise à niveau 2026-08-17, combiner
platform_scale + creator_scaleen une part LP verrouillée détenue par la plateforme et frapper au maximum une NFT Fee Key versplatform_nft_wallet. Brûler le resteburn_scale. Avant la mise à niveau,creator_scaleétait verrouillé séparément et sa Fee Key allait au créateur de token. Les migrations historiques complétées ne sont pas modifiées. Pour la graduation AMM v4 hérité, la disposition LP suit le flux existant de cette instruction. - (Pas d’étape d’autorité de mint.
base_mint.mint_authorityétait déjà défini surNoneà la création du lancement — voir la note ci-dessous.) - Basculer
pool_state.status = Migrated, définirvesting_schedule.start_time = block_time + cliff_period.
TransferFeeConfig et PlatformConfig.transfer_fee_extension_auth est non-défaut, la migration réassigne également les autorités de cette extension à la clé de plateforme :
transfer_fee_config_authorityest toujours réassigné. Le PDAauthoritydu lancement le détient pendant toute la phase pré-graduation, donc il y a toujours quelque chose à déplacer.WithheldWithdrawest réassigné uniquement lorsque le PDAauthorityle détient toujours. Les lancements créés à partir du 2026-08-27 portent déjàtransfer_fee_extension_authsur cette autorité à partir de la création du mint, donc l’étape est sautée. La garde est ce qui empêche la migration d’annuler sur ces mints — le PDA ne peut pas renoncer à une autorité qu’il ne détient plus.
transfer_fee_extension_auth est Pubkey::default() au moment de la migration, aucune autorité ne se déplace et les deux restent avec le PDA authority de façon permanente. Voir platform-config.
L’approvisionnement du mint de base est fixé à partir de la création, pas à partir de la graduation.
InitializeV2 et InitializeWithToken2022 frappent l’approvisionnement entier dans le coffre de base, puis révoquent immédiatement MintTokens dans la même instruction, donc base_mint.mint_authority est None pour toute la vie du lancement. La migration ne le touche pas. (Les révisions antérieures de cette page plaçaient la révocation à la graduation ; c’était faux.) Les seules autorités que la migration peut déplacer sont celles de frais de transfert Token-2022 décrites ci-dessous.BuyExactIn, BuyExactOut, SellExactIn, SellExactOut rejetteront à partir de ce moment avec PoolMigrated. Le pool AMM résultant est canonique et échange comme n’importe quel autre pool AMM v4 / CPMM.
Erreurs courantes — PoolFunding, PoolMigrated, MigrateTypeNotMatch, InvalidCpSwapConfig, MathOverflow.
Comptes restants de migration CPMM
Les clients construisantMigrateToCpswap doivent utiliser ces indices remaining_accounts fixes :
L’instruction nécessite au moins dix comptes restants. Les comptes de support-mint sont des entrées CPI en lecture seule. Dérivez les deux adresses même lorsque le mint n’a pas d’enregistrement de support initialisé. Les anciens constructeurs qui ajoutent toujours des comptes de verrouillage de créateur ou omettent les indices 8–9 doivent être mis à jour.
Modifié en 2026-09. Deux nettoyages, dont aucun ne change un constructeur correct :
- Le chemin CPMM autorisé est maintenant le seul chemin.
MigrateToCpswapavait l’habitude de choisir entreInitializeCpSwapetInitializeCpSwapWithPermissionen fonction deunix_timestamp >= get_upgrade_timestamp(). L’assistant d’horloge et le CPI hérité ont tous deux disparu, donc le chemin autorisé — et donc le minimum de dix comptes — s’applique sans condition. - Trois contraintes d’adresse ont été déplacées de la struct de compte dans le corps de l’instruction.
platform_config,base_vaultetquote_vaultsont toujours requis pour correspondre aux valeurs stockées surPoolState, mais l’inadéquation est maintenant levée parrequire_keys_eq!plutôt que par la contrainteaddress =d’Anchor. La vérification est équivalente ; seule la surface d’erreur diffère — vous obtenez leRequireKeysEqViolatedgénérique d’Anchor (2502) au lieu deConstraintAddress(2012), et il est signalé sans nom de compte. Mettez à jour tout traitement d’erreur qui correspondait à2012pour ces trois comptes.
Programmes de token de migration CPMM
MigrateToCpswap prend les deux programmes de token sans condition et détermine lui-même quel programme possède chaque mint. Ses deux comptes de programme de token ont été renommés en conséquence :
Ils remplacent l’ancien
base_token_program (quel que soit le programme qui possédait le mint de base) et quote_token_program (toujours hérité). Les positions sont inchangées, donc c’est un changement de valeur plutôt qu’un changement de disposition — mais les deux valeurs sont proches d’être inversées, et un constructeur qui continue de passer son ancienne paire fournira Token-2022 où le programme hérité est requis dès que l’un des mints est un mint Token-2022.
Le programme hérité est requis même lorsqu’aucun mint ne l’utilise, car le mint LP CPMM et la NFT Fee Key de liquidité verrouillée vivent toujours sur lui.
Liste d’autorisation GlobalConfig de plateforme
PlatformConfig.restrict_global_config contrôle la vérification :
0: la plateforme accepte n’importe quelGlobalConfigautrement valide ; aucun compte d’autorisation n’est requis.1:Initialize,InitializeV2etInitializeWithToken2022doivent inclure lePlatformAllowConfigcorrespondant n’importe où dansremaining_accounts.
CreatePlatformAllowConfig et ClosePlatformAllowConfig. Ses graines sont [b"platform_allow_config", platform_config, global_config]. Les anciennes instructions PlatformGlobalAccess gérées par l’administrateur et le PDA sont retirés.
Règles de paramètres de lancement de plateforme
Quatre instructions gèrent un comptePlatformCurveRule. Les quatre sont signées par PlatformConfig.curve_rule_manager ou par l’administrateur de plateforme — le programme accepte l’administrateur en re-dérivant le PDA PlatformConfig à partir du signataire, donc aucun compte séparé ne le prouve. Un signataire qui n’est ni l’un ni l’autre retourne InvalidCurveRuleAuthority.
platform_curve_rule est le PDA à [b"platform_curve_rule", platform_config, global_config].
Createalloue le compte ne contenant aucun groupe. Cet état ne restreint rien.Updateupsert le groupe avec cegroup_id, le remplaçant entièrement s’il existe. Il redimensionne le compte pour l’adapter, donc le signataire complète le loyer qu’il grandit et reçoit le loyer qu’il rétrécit. Un nouveau groupe au-delà du dixième retourneCurveRuleGroupsExceeded; plus de 25 contraintes, un champ inconnu ou un opérateur, ou la même paire(field, op)deux fois dans un groupe retourneInvalidCurveRuleConstraint; les quatre champs dérivés deTotalSellAsur une config non-constant-product retournentCurveRuleFieldNotSupportedByCurve.Removesupprime un groupe par id, rétrécissant le compte et remboursant la différence. Un id inconnu retourneCurveRuleGroupNotExist.Closeretourne le loyer entier au signataire. La config est alors à nouveau non restreinte même sirestrict_curve_paramreste1.
UpdatePlatformConfig::RestrictCurveParam(0 | 1), que seul l’administrateur de plateforme peut appeler.
Sur le chemin de lancement. Tandis que restrict_curve_param est 1, InitializeV2 et InitializeWithToken2022 nécessitent le PDA de règle dans remaining_accounts — y compris lorsqu’il n’existe pas, pour que l’omission ne puisse pas ignorer la vérification. Un compte manquant est NotEnoughRemainingAccounts ; un lancement qui ne satisfait aucun groupe est CurveParamNotMatchPlatformRule. La vérification s’exécute avant les propres limites de GlobalConfig et ne peut que les réduire. Modèle et playbooks : products/launchlab/curve-rules. Les deux erreurs sont évitables côté client — le SDK reflète cette vérification comme une fonction pure, voir Vérifier avant d’envoyer.
CollectFee
Balayage administrateur des frais commerciaux accumulés du protocole sur un seul lancement.
Arguments — aucun.
Comptes
Effet — transférer
pool_state.quote_protocol_fee de quote_vault vers recipient_token_account, puis mettre à zéro le compteur. Appelable n’importe quand après le premier achat.
CollectMigrateFee
Balayage administrateur des frais de migration accumulés à la graduation. Même forme de compte que CollectFee avec migrate_fee_owner comme signataire (au lieu de protocol_fee_owner) et pool_state.migrate_fee comme compteur drainé.
ClaimCreatorFee
Balayage par créateur des frais de créateur accumulés sur chaque lancement que le créateur possède qui utilise le même mint de quote. Draine le coffre de frais par créateur, pas celui par pool.
Arguments — aucun.
Comptes
Effet — transférer le solde entier de
creator_fee_vault vers recipient_token_account. Annule avec une vérification require-greater-than-zero si le coffre est vide.
ClaimPlatformFee
Balayage par plateforme qui draine le coffre de quote d’un lancement directement. Utilisez ceci lorsqu’une plateforme veut réclamer sa part pour un lancement spécifique sans passer par le coffre de plateforme agrégé.
Arguments — aucun.
Comptes
Effet — transférer
pool_state.platform_fee de quote_vault vers recipient_token_account, mettre à zéro le compteur.
ClaimPlatformFeeFromVault
Balayage agrégé par plateforme. Draine le coffre de frais par mint de quote de la plateforme qui accumule les frais de chaque lancement acheminé via la plateforme.
Arguments — aucun.
Comptes
Effet — transférer le solde complet de
platform_fee_vault vers recipient_token_account. Annule si le coffre est vide.
CollectExcessLamports
Balayage administrateur des lamports assis au-dessus du minimum exempt de loyer sur les comptes que LaunchLab contrôle. Ajouté dans la mise à niveau 2026-09 pour que le protocole puisse récupérer le sur-financement que la réduction de loyer SIMD-0437 laisse derrière sur les comptes créés avant chaque étape.
Seul l’excédent se déplace. Les soldes de token, les données de compte, les propriétaires, l’état de la courbe et le vesting ne sont pas touchés, et l’instruction est un no-op par rapport à un compte déjà à son minimum — donc il est sûr de réexécuter après chaque étape de déploiement.
Arguments — aucun.
Comptes
Choisir
authority
Le compte est passé sans vérification et résolu par le programme, qui re-dérive les trois PDAs d’autorité de LaunchLab et correspond :
Une clé ne correspondant à aucune des trois échoue l’instruction entière avec
InvalidOwner (6001).
Comment chaque compte source est traité
Les mints de base ne peuvent pas être balayés.
InitializeV2 et InitializeWithToken2022 révoquent MintTokens sur le mint de base dans la même instruction qui frappe l’approvisionnement, donc aucune clé ne peut signer un WithdrawExcessLamports pour lui — le loyer du mint reste où il est de façon permanente.
Erreurs courantes — InvalidOwner (6001, mauvais signataire ou une authority qui n’est aucun des trois PDAs), LamportsCalculateError (6031, l’aller-retour wSOL n’a pas net à zéro), et InsufficientFunds du chemin détenu par le programme lorsqu’un compte détient moins que son propre minimum de loyer.
Pas de constructeur SDK. @raydium-io/raydium-sdk-v2 n’expédie pas de constructeur pour cette instruction, et non plus le repo raydium-sdk-V2-demo — c’est un chemin administrateur. Encodez-le à la main, de la façon que le balayage côté portefeuille dans solana-fundamentals/rent-and-reclaimable-rent le fait pour l’instruction du programme de token.
Instructions de vesting et de configuration de plateforme
Celles-ci sont documentées sur des pages dédiées car chacune a son propre modèle d’état :CreateVestingAccount,CreatePlatformVestingAccount,ClaimVestedTokenCreatePlatformConfig,UpdatePlatformConfig,CreatePlatformAllowConfig,ClosePlatformAllowConfigCreatePlatformCurveRule,UpdatePlatformCurveRule,RemovePlatformCurveRule,ClosePlatformCurveRuleCreateConfig,UpdateConfig
Matrice de changement d’état
Où aller ensuite
products/launchlab/code-demos— Exemples TypeScript pour chaque instruction.products/launchlab/accounts— forme d’état complète.reference/error-codes— Énumération d’erreur LaunchLab.
- Module
LaunchLabdu SDK Raydium v2 - Source du programme Raydium LaunchLab

