Skip to main content
Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Bannière de version.Épinglez la version du SDK dans votre package.json. L’interface de la courbe de liaison a évolué entre les versions mineures.

Configuration

Les démonstrations ici reflètent les fichiers dans raydium-sdk-V2-demo/src/launchpad. L’amorçage suit le config.ts.template du dépôt de démonstration :

Créer un lancement

Source : src/launchpad/createMint.ts (et createBonkMintApi.ts pour la variante Bonk pilotée par l’API) La plupart des paramètres économiques du lancement ne sont pas des arguments — ils proviennent de la GlobalConfig que vous liez via configId, et le SDK remplit le reste à partir des paramètres par défaut de l’API. Vous transmettez l’identité du mint, la configuration à lier et (optionnellement) un premier achat :
Notes :
  • Il n’y a pas d’argument curveType, graduationFractionBps, initialK, quoteMint, openTime, fees ou postGraduationLpPolicy. La forme de la courbe et le mint de cotation sont des propriétés de la GlobalConfig que vous liez ; les taux de frais vivent sur GlobalConfig et PlatformConfig ; l’élimination des LP à la graduation est un paramètre PlatformConfig. Voir products/launchlab/instructions pour savoir exactement ce que InitializeV2 accepte.
  • Un symbol plus long que 10 caractères et un uri vide sont tous deux rejetés côté client avant tout RPC.
  • Passer transferFeeExtensionParams bascule le générateur vers InitializeWithToken2022 et force migrateType à "cpmm".
  • Le générateur retourne un tableau transactions ; createOnly: false ajoute la transaction du premier achat. Toujours execute({ sequentially: true }) — le mint doit exister avant que l’achat ne soit enregistré.

Récupérer l’état du lancement

Source : src/launchpad/poolInfo.ts Il n’y a pas de getLaunchById. L’ID du pool est un PDA de (programId, mintA, mintB), et getRpcPoolInfo retourne le PoolState décodé avec sa configInfo liée attachée :
getRpcPoolsInfo({ poolIdList }) est la forme par lot et retourne une poolInfoMap indexée par ID de pool — utilisez-la pour les vues de portefeuille au lieu de boucler. Si vous voulez décoder les comptes bruts vous-même, LaunchpadPool.decode et LaunchpadConfig.decode sont exportés.

Acheter — cotation exacte en entrée

Source : src/launchpad/buy.ts L’assistant de cotation hors chaîne est Curve.buyExactIn, une méthode statique sur la classe Curve exportée — pas une méthode sur raydium.launchpad. Le générateur de transactions est buyToken. Les deux ont besoin des taux de frais de la plateforme, qui vivent sur un compte PlatformConfig séparé :
Vous pouvez passer minMintAAmount explicitement au lieu de slippage ; omettez les deux et le SDK calcule la limite à partir des données RPC en direct. shareFeeRate ne doit pas dépasser poolInfo.configInfo.maxShareFeeRate, et il ne s’applique que si vous passez également un shareFeeReceiver.

Acheter — sortie de base exacte

Le générateur est buyTokenExactOut, et les arguments de montant sont outAmount (base que vous voulez) et maxBuyAmount (cotation que vous dépenserez au maximum). Curve.buyExactOut({ poolInfo, amountA, ... }) est l’aperçu hors chaîne correspondant.
Utile pour les interfaces « acheter exactement X jetons ». Le générateur rejette un outAmount de zéro côté client, et le programme revient si la courbe a bougé suffisamment pour que l’exigence de cotation dépasse maxBuyAmount.

Vendre

Source : src/launchpad/sell.ts Le générateur est sellToken (sellTokenExactOut pour la variante de sortie de cotation exacte), avec sellAmount et un minAmountB optionnel. Curve.sellExactIn({ poolInfo, amountA, ... }) l’aperçoit.
Le chemin de vente de la courbe est symétrique au chemin d’achat : réduire real_a par sellAmount retourne quote_out égal à la zone intégrée sous la courbe entre real_a − sellAmount et real_a, moins les frais de vente. sellAmount doit être supérieur à zéro — le générateur rejette zéro avant tout RPC.

Graduation

La graduation n’est pas quelque chose qu’un intégrateur peut déclencher. Il n’y a pas de raydium.launchpad.graduate, pas de drapeau autoGraduate sur les générateurs d’achat, et pas de champ willGraduate sur leur valeur de retour. Sur chaîne, la graduation est MigrateToCpswap (ou le MigrateToAmm hérité), et les deux instructions limitent leur signataire à un portefeuille enregistré sur la GlobalConfig de liaison — migrate_to_cpswap_wallet et migrate_to_amm_wallet respectivement. Un appel d’un autre signataire échoue avec InvalidOwner. Ce n’est pas sans permission, et aucun bot MEV ne peut le devancer.
Ces portefeuilles sont exploités par le crank de graduation de Raydium, donc en pratique la migration se produit quelques secondes après le franchissement du seuil, quel que soit celui qui a effectué l’achat final. Du côté d’un intégrateur, la seule chose à faire est de traiter la transition d’état comme un événement rapide : interroger getRpcPoolInfo (ou s’abonner via gRPC, ci-dessous) et basculer votre interface de la courbe au pool CPMM résultant quand status change. Voir products/launchlab/instructions pour les listes de comptes, les frais de migration et la façon dont les LP sont divisés à la graduation.

Collecter les frais du créateur

Source : src/launchpad/claimCreatorFee.ts (mint unique) et collectAllCreatorFees.ts (par lot) La méthode est claimCreatorFee (et claimMultipleCreatorFee pour la forme par lot). Elle est indexée par le mint de cotation, pas par un lancement — un appel balaie les frais de créateur accumulés du signataire dans ce mint sur tous ses lancements :
Transfère le compteur de frais de créateur accumulé vers l’ATA du créateur sur le mint de cotation. Peut être appelé avant ou après la graduation ; utilisez-le périodiquement plutôt que d’attendre qu’un énorme solde s’accumule. Les opérateurs de plateforme ont les générateurs parallèles claimPlatformFee / claimAllPlatformFee / claimVaultPlatformFee.

Suivre un lancement tout au long de son cycle de vie

En mettant tout ensemble, un script de surveillance pourrait ressembler à :
Interroger getRpcPoolInfo sur un minuteur de 10 secondes est correct pour un seul lancement. Pour un indexeur, utilisez plutôt l’abonnement gRPC ci-dessous — getRpcPoolsInfo({ poolIdList }) fait des lots, mais interroger des centaines de pools brûle toujours les crédits RPC sans bénéfice.

Surveiller les configurations et les pools via gRPC

Source : src/grpc/launchpadPoolInfo.ts S’abonne au programme LaunchLab via Yellowstone gRPC et enregistre chaque mise à jour de GlobalConfig et PoolState avec le programme de jetons de chaque mint. Deux filtres datasize sur un abonnement accounts séparent les deux types de comptes, donc un seul flux couvre les deux. La démonstration est la référence la plus courte et correcte pour classer les mints d’un lancement, ce que la version Token-2022 quote-mint release rend nécessaire :
  • Les pools sont classés directement à partir de PoolState.token_program_flag, en décodant le bit0 pour le mint de base et le bit1 pour le mint de cotation sans aucune récupération de mint. Tester l’octet entier contre 0 — ce qui était suffisant tandis que les mints de cotation étaient uniquement hérités — mésinterprète un mint de base hérité comme Token-2022 chaque fois que le mint de cotation est Token-2022.
  • Les configurations ne peuvent pas être classées de cette façon : une GlobalConfig stocke l’adresse de son mint de cotation et aucun drapeau de programme, donc la démonstration lit le propriétaire du compte mint une fois et le met en cache par mint.
Elle effectue également une vérification croisée des deux l’une contre l’autre, ce qui est une assertion utile à conserver dans votre propre indexeur. Notez que « créer » par rapport à « mettre à jour » est déduit des caches propres de la démonstration, amorcés au démarrage à partir de getProgramAccounts ; avec cet amorçage désactivé, lisez « créer » comme « d’abord vu sur ce flux ». L’accès gRPC ne fait pas partie de la surface RPC publique — voir le src/grpc/README.md du dépôt de démonstration.

Rust CPI

Appeler LaunchLab à partir de votre propre programme Anchor est rare (la plupart des intégrations de lancement sont uniquement du côté TS). Si vous le faites :
  • La caisse est raydium-launchpad (nom de lib raydium_launchpad), version 0.2.0, et elle expose une fonctionnalité cpi. Il n’y a pas de raydium_launchlab.
  • Elle n’est pas publiée sur crates.io — dépendez-en par révision git, de la même manière que les autres caisses de programme Raydium.
  • Les points d’entrée CPI sont nommés d’après les instructions sur chaîne, pas d’après les méthodes TypeScript du SDK : buy_exact_in, buy_exact_out, sell_exact_in, sell_exact_out, claim_creator_fee, create_vesting_account, claim_vested_token. migrate_to_amm / migrate_to_cpswap sont limités par signataire aux portefeuilles de migration GlobalConfig et ne sont pas appelables à partir d’un programme intégrateur.
Voir sdk-api/rust-cpi pour les règles d’épinglage de caisse — en particulier la division de version Anchor, qui décide si une caisse peut faire du CPI dans LaunchLab et CLMM.

Pièges

  • Confondre les noms d’instructions sur chaîne avec les noms de méthodes du SDK. Le programme a buy_exact_in / sell_exact_in ; le SDK a buyToken / sellToken. buyExactIn et sellExactIn n’existent que comme méthodes statiques sur Curve, et ils calculent une cotation — ils ne construisent pas une transaction.
  • Oublier extraSigners. createLaunchpad crée le mint de base à partir d’une paire de clés que vous générez, donc cette paire de clés doit signer. Omettez extraSigners: [pair] et la transaction échoue la vérification de signature.
  • Ne pas choisir le mint de cotation. Vous n’en transmettez pas un. Le mint de cotation est une propriété de la GlobalConfig que vous liez via configId — getPdaLaunchpadConfigId(programId, quoteMint, curveType, index). Pour lancer contre un mint de cotation différent, liez une configuration différente ; raydium.api.fetchLaunchConfigs() répertorie les configurations disponibles avec leurs paramètres par défaut.
  • Taille des métadonnées. Les longues chaînes uri poussent le CPI Metaplex au-delà du budget. Gardez uri sous ~200 caractères — la plupart des métadonnées JSON hébergées sur CDN s’adaptent facilement. symbol est plafonné à 10 caractères.
  • Traiter la graduation comme une course dans laquelle vous pouvez entrer. Ce n’est pas le cas — voir l’avertissement ci-dessus. Votre interface devrait toujours traiter les transitions status comme des événements rapides, car le crank de Raydium enregistre la migration quelques secondes après le franchissement du seuil.

Où aller ensuite

Sources :