Skip to main content
Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Banneau de version. Tous les démonstrations TypeScript ciblent @raydium-io/raydium-sdk-v2@0.2.64-alpha ; elles ont été exécutées pour la dernière fois contre 0.2.42-alpha (2026-04) et leurs signatures d’appel ont été revérifiées contre la source 0.2.64-alpha le 2026-09-09, sur Solana mainnet-beta. Le squelette CPI Rust cible raydium-cp-swap sur la branche chore/upgrade-anchor, Anchor 1.0.2 — master épingle toujours 0.32.1. Les ID de programme sont extraits via des constantes de reference/program-addresses.

Prérequis

Chaque démonstration sur cette page correspond à un fichier dans raydium-sdk-V2-demo/src/cpmm ; le lien GitHub se trouve à côté de chaque section. L’initialisation suit le fichier config.ts.template du dépôt de démonstration (source) :
L’instance Raydium est la façade du SDK — chaque démonstration ci-dessous l’utilise. Raydium.load est asynchrone car elle charge la liste des tokens par défaut ; passez disableLoadToken: true pour ignorer cette récupération. La vérification de disponibilité des fonctionnalités est déjà ignorée sauf si vous passez disableFeatureCheck: false. Les configurations de frais sont récupérées paresseusement à la première utilisation via raydium.api.getCpmmConfigs().

Créer un pool CPMM

Source : src/cpmm/createCpmmPool.ts
Quelques éléments que le SDK gère silencieusement :
  • Trier les mints dans l’ordre token0/token1 avant de dériver la PDA.
  • Payer les frais uniques create_pool_fee à poolFeeAccount.
  • Créer les comptes de tokens associés de l’appelant s’ils manquent.
  • Choisir le bon programme de tokens (SPL Token vs Token-2022) par côté.
Après confirmation, vous pouvez récupérer l’état du pool en direct avec :

Swap (entrée de base)

Source : src/cpmm/swap.ts
Remarque : le SDK récupère toujours l’état du pool depuis un RPC à l’intérieur de getPoolInfoFromRpc. Ne cotez pas depuis api-v3.raydium.io pour une transaction que vous êtes sur le point de signer — une cotation qui a un bloc de retard peut glisser dans ExceededSlippage au moment de l’exécution.

Swap (sortie de base)

Source : src/cpmm/swapBaseOut.ts

Déposer de la liquidité

Source : src/cpmm/deposit.ts
Le SDK dérive le montant appairé à partir des réserves actuelles du pool, augmente chaque côté par le slippage pour les arguments maximum_* de l’instruction, et construit les créations d’ATA si nécessaire. raydium.cpmm.computePairAmount({ ... }) retourne les mêmes nombres si vous les voulez pour un aperçu d’interface utilisateur.

Retirer de la liquidité

Source : src/cpmm/withdraw.ts

Collecter les frais de protocole/fonds/créateur

Source : src/cpmm/collectCreatorFee.ts, src/cpmm/collectAllCreatorFee.ts La collecte de protocole et de fonds reste contrôlée par l’autorité. Les frais de créateur ont deux chemins : le CollectCreatorFee signé par le créateur, et le CollectCreatorFeePermissionless additif, que n’importe quel payeur peut invoquer mais qui ne peut transférer que vers les ATA canoniques du créateur. 0.2.64-alpha expédie des constructeurs au niveau du module pour les deux chemins de créateur :
Les deux instructions de créateur ont changé leurs listes de comptes lors de la mise à niveau du programme du 2026-09-19. Chacune prend maintenant une PDA creator_fee_share à ["creator_fee_share", creator, ammConfig], et celle sans permission prend également amm_config — tous deux ajoutés après system_program plutôt qu’insérés, donc les comptes déjà présents conservent leurs positions. Un constructeur épinglé à une version du SDK antérieure à la mise à niveau émet la liste plus courte et la transaction est rejetée pour comptes manquants. Vérifiez que la version que vous installez porte les nouveaux comptes avant d’utiliser ces assistants contre le programme mis à niveau, et actualisez l’IDL si vous générez des clients à partir de celui-ci.Passer la PDA est obligatoire même quand elle n’a jamais été créée — dérivez-la et passez-la ; le programme revient à AmmConfig.creator_fee_share_rate quand le compte est vide.
Les deux instructions de créateur ont des discriminateurs et des dispositions de comptes différents — celle sans permission remplace le signataire du créateur par un payer séparé et un creator non signataire. Utilisez le constructeur correspondant plutôt que de permuter manuellement les comptes sur l’autre.Il n’y a pas de constructeur de frais de protocole ou de fonds dans le SDK (makeCollectProtocolFeeInstruction et makeCollectFundFeeInstruction n’existent sous aucun nom) — ce sont des chemins d’administration, tout comme CreateCreatorFeeShare / CloseCreatorFeeShare, qui n’ont pas non plus de constructeur. Les constructeurs d’instructions de bas niveau qui existent sont collectCpFeeInstruction, makeCollectCreatorFeeInstruction et collectCreatorFeePermissionlessInInstruction.
Hors chaîne, vous pouvez lire les frais accumulés directement depuis PoolState :

Squelette CPI Rust

Si vous voulez invoquer CPMM depuis votre propre programme Anchor — par exemple, un vault qui swaps au nom de ses déposants — le contexte CPI ressemble à ceci. L’ordre des comptes suit products/cpmm/instructions.
Si votre CPI signe en tant que PDA (par exemple, vous gérez un vault au nom des déposants), remplacez CpiContext::new par CpiContext::new_with_signer et passez vos graines.

Pièges courants

Une courte liste de contrôle avant d’ouvrir un ticket d’assistance :
  • Mints triés. Si votre PDA poolState dérivée ne correspond pas au pool on-chain, vous avez probablement oublié de trier les mints.
  • Cotation API obsolète. Ne passez jamais une valeur de réserve de api-v3.raydium.io dans CurveCalculator.swap. Récupérez depuis un RPC.
  • Mauvais programme de tokens. Le vault d’un mint Token-2022 est détenu par le programme Token-2022, pas par SPL Token. Utilisez toujours les champs token_0_program / token_1_program du pool.
  • Slippage sous-dénominé pour les mints avec frais de transfert. Si l’un ou l’autre côté du pool est un mint Token-2022 avec frais de transfert, votre minimum_amount_out doit être libellé en ce que l’utilisateur reçoit réellement, pas en ce que le vault envoie.
  • NotApproved sur un swap. Vérifiez PoolState.status — l’administrateur peut avoir mis en pause les swaps sur ce pool. Voir products/cpmm/instructions pour le masque de statut.

Où aller ensuite

Sources :