Skip to main content
Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
À partir de la mise à jour du programme 2026-07, la dépendance d’AMM v4 envers OpenBook / Serum a été supprimée. Les instructions héritées v1 SwapBaseIn / SwapBaseOut, Deposit et Withdraw conservent leurs anciens schémas de comptes pour la compatibilité rétroactive : les comptes de marché sont toujours acceptés à leurs anciennes positions, mais ils ne sont plus validés ni utilisés (aucun CPI n’est émis). Les nouvelles intégrations doivent utiliser les points d’entrée de swap V2, qui omettent entièrement les comptes de marché. Plusieurs instructions ont été supprimées et reviennent maintenant — voir l’entrée du journal des modifications. Les listes de comptes ci-dessous utilisent les noms de champs du SDK Raydium ; l’IDL sous-jacent utilise parfois des préfixes serum_*.La mise à jour du programme 2026-09 ajoute une instruction d’administration, WithdrawExcessLamports (tag 18), et supprime la sysvar de rent de CreateConfigAccount. Tout ce qu’un trader ou LP appelle reste inchangé. Voir l’entrée du journal des modifications 2026-09-09.

Inventaire des instructions

Le SDK expose des builders uniquement pour les instructions accessibles aux utilisateurs. Les instructions de maintenance sont généralement invoquées par le keeper Raydium. Supprimées / non plus appelables (leurs builders client ont été supprimés) : Initialize (tag 0, utilisez Initialize2), MonitorStep (2), MigrateToOpenBook (5), WithdrawSrm (8), PreInitialize (10, utilisez Initialize2), SimulateInfo (12), AdminCancelOrders (13). Une transaction portant l’un de ces tags échoue ; le programme n’exécute jamais l’instruction. Traitez les sept comme disparus plutôt que comme des chemins d’erreur à gérer.

Initialize2

Amorcer un nouveau pool AMM v4 lié à un marché OpenBook existant. Arguments
Comptes (modifiable W, signataire S)
Deux layouts acceptés. La liste de 19 comptes ci-dessus est celle recommandée. Pour la compatibilité descendante, le programme lit aussi un layout hérité de 21 comptes, qui insère un amm_open_orders ignoré en position 7 et un market_program ignoré en position 16 — c’est ce que le constructeur d’instruction initialize2 du dépôt émet encore. Toute autre longueur est analysée positionnellement d’après le layout hérité et échouera.
Postconditions
  • LP frappés pour le créateur = sqrt(init_coin_amount × init_pc_amount) − 10^coin_mint.decimals. Les décimales LP égalent coin_mint.decimals, donc le montant soustrait vaut exactement un token LP entier ; il n’est jamais frappé et reste définitivement hors circulation. Si sqrt(...) est inférieur à cela, l’instruction est annulée avec InitLpAmountTooLess.
  • AmmInfo.lp_amount stocke le sqrt(...) complet, et non le montant frappé — donc lp_mint.supply est définitivement inférieur d’un token LP entier à amm.lp_amount. Toute la mathématique au prorata utilise amm.lp_amount.
  • Aucun ordre OpenBook n’est posté (la grille du carnet d’ordres a été supprimée). AmmInfo.market enregistre le compte passé en position 15, mais AmmInfo.open_orders et AmmInfo.market_program sont tous deux écrits comme Pubkey::default(), et coin_lot_size / pc_lot_size / min_size sont initialisés à 0. Sur le layout hérité de 21 comptes, les comptes supplémentaires amm_open_orders et market_program sont lus puis ignorés.
Erreurs courantes — InvalidCoinMint (coin mint et pc mint identiques), InvalidConfigAccount (mauvais PDA amm_config), InvalidFee (mauvaise destination des frais de création de pool), InvalidProgramAddress (mauvais amm_authority ou mauvais nonce), RepeatCreateAmm (un pool existe déjà pour ce marché), InitLpAmountTooLess, InvalidSupply (l’un des montants d’initialisation vaut 0, ou le mint LP a déjà une offre), AlreadyInUse.

Deposit

Ajouter de la liquidité. Arguments
Comptes (abrégé)
Les nombres de comptes acceptés sont 11, 14 ou 15 — rien d’autre. Le layout hérité compte 14 comptes (ou 15 avec un compte ignoré en fin de liste) : la même liste avec un amm_open_orders ignoré en position 4, un market ignoré en position 9, et un market_event_queue ignoré ajouté en position 14. Tout autre nombre est annulé avec WrongAccountsNumber.
Mathématiques — prorata standard. En utilisant les réserves effectives du pool (coffres + en carnet), le SDK calcule la paire coin/pc qui produit le montant LP donné et la vérifie par rapport à max_*. Revient avec ExceededSlippage si l’un ou l’autre côté dépasse le plafond.

Withdraw

Brûler des LP, recevoir les deux côtés. Arguments
Comptes — layout recommandé à 11 comptes
Withdraw n’est pas Deposit inversé. Les nombres de comptes acceptés sont 11, ou de 20 à 23. Le layout hérité à 20 comptes place le compte LP de l’utilisateur avant les deux ATAs récepteurs et intercale cinq comptes de marché ignorés : token_program, amm(W), amm_authority, amm_open_orders(W), amm_target_orders(W), lp_mint(W), pool_coin_token_account(W), pool_pc_token_account(W), market_program, market(W), market_coin_vault(W), market_pc_vault(W), market_vault_signer, user_lp_token_account(W), user_coin_token_account(W), user_pc_token_account(W), user_owner(S), market_event_queue(W), market_bids(W), market_asks(W). Les formes à 22 et 23 comptes insèrent deux comptes de remplissage ignorés après la position 8. Tout autre nombre est annulé avec WrongAccountsNumber.
Il n’y a plus d’étape de règlement depuis OpenBook — les mathématiques au prorata utilisent directement les soldes des coffres.

SwapBaseIn

Swap à entrée exacte. Toujours un swap par chemin AMM (ne route pas via l’appariement OpenBook).
Utilisez les variantes V2 pour le nouveau code. Puisque la dépendance d’AMM v4 envers OpenBook a été supprimée, les points d’entrée V1 (SwapBaseIn, SwapBaseOut) s’attendent toujours à la liste complète de 17 comptes (ou 18 avec le compte target-orders optionnel), mais les comptes OpenBook/marché sont maintenant acceptés positionnellement et ignorés — ils ne sont pas validés et aucun CPI n’est émis. Passer un mauvais nombre de comptes revient toujours avec WrongAccountsNumber, mais le contenu des comptes de marché n’est plus vérifié. Les nouvelles intégrations doivent utiliser SwapBaseInV2 / SwapBaseOutV2, qui prennent une liste de comptes beaucoup plus petite et représentent le chemin d’exécution canonique aujourd’hui. Les formes V1 sont documentées ici pour la complétude et pour lire les transactions existantes en chaîne.
Arguments
Comptes (abrégé) Mathématiques — voir products/amm-v4/math. Préconditions
  • AmmStatus::from_u64(amm.status).swap_permission() est vrai — c’est-à-dire que status vaut 1 (Initialized), 6 (SwapOnly) ou 7 (WaitingTrade). status est une valeur d’énumération, pas un masque de bits ; voir products/amm-v4/accounts.
  • amm.state_data.pool_open_time <= now.
  • amount_in > 0.
  • user_source_token_account détient au moins amount_in.
Postconditions
  • L’utilisateur perd amount_in du jeton source, gagne amount_out ≥ minimum_amount_out du jeton destination.
  • Les frais de swap restent dans les coffres, ce qui augmente l’invariant k. Les compteurs need_take_pnl_* ne sont pas touchés par les swaps — le PnL du protocole est recalculé à partir du delta de k lors du prochain Deposit, Withdraw ou WithdrawPnl (Processor::calc_take_pnl).
  • Remarque : les compteurs d’analyse state_data.swap_*_in_amount / swap_*_out_amount ne sont plus mis à jour — leurs valeurs sont figées. Utilisez les journaux de transactions pour l’analyse du volume.
Erreurs courantes — ExceededSlippage, InvalidInput, InvalidStatus, NotAllowed (mint coin/pc identique).

SwapBaseOut

Sortie exacte, inverse de SwapBaseIn. Mêmes comptes. Arguments

SwapBaseInV2 / SwapBaseOutV2

Points d’entrée de swap variantes (tags 16 / 17) qui omettent entièrement les comptes OpenBook. Les mathématiques sont identiques au chemin V1, mais la liste de comptes se réduit à juste le côté AMM et l’utilisateur — 8 comptes, et amm_open_orders n’est pas passé : Les réserves du pool sont maintenant les soldes des coffres (moins le PnL en attente), donc les mathématiques de cotation sont simples et identiques au chemin v1. Utilisez V2 pour économiser du calcul et éviter de passer les comptes de marché (maintenant ignorés). Le routeur Raydium utilise toujours la forme V2 lors du routage via AMM v4. Les arguments sont les mêmes que les formes V1 (amount_in / minimum_amount_out pour SwapBaseInV2 ; max_amount_in / amount_out pour SwapBaseOutV2).

MonitorStep et autres instructions supprimées

Supprimées — non plus appelables. À partir de la mise à jour 2026-07, MonitorStep (tag 2) a été supprimée du programme et revient maintenant (unimplemented!) si elle est invoquée. Son builder client a également été supprimé. Il en va de même pour MigrateToOpenBook (5), WithdrawSrm (8), SimulateInfo (12), AdminCancelOrders (13), et les points d’entrée de création de pool hérités Initialize (0) / PreInitialize (10) — utilisez Initialize2 à la place.
Historiquement, MonitorStep actionnait l’interaction OpenBook du pool : elle réglait les ordres remplis (déplaçant les produits des coffres de marché vers les coffres du pool via CPI OpenBook), annulait les ordres obsolètes et affichait de nouveaux ordres pour combler l’écart entre target_orders et amm_open_orders. Avec la dépendance OpenBook supprimée, il n’y a rien à actionner et l’instruction est partie. Tout keeper ou intégration qui l’appelle encore doit supprimer l’appel.

WithdrawPnl / TakePnl

Récupération administrative des frais de protocole accumulés. Arguments
  • WithdrawPnl ne prend pas d’arguments ; elle lit need_take_pnl_* et déplace exactement ces montants.
Changement de rupture (admin uniquement). La liste de comptes est passée de 17 (+1 optionnel) à 10 — amm_open_orders et les six comptes de marché ont été supprimés — sans analyse de compatibilité. L’ancien schéma se désaligne (l’ancien #5 était amm_open_orders, maintenant pool_coin_token_account) et échoue avec des erreurs telles que InvalidCoinVault. Les outils d’administration doivent être mis à jour.
Comptes (nouveau schéma de 10 comptes) Effet
  • Transfère need_take_pnl_coin de pool_coin_token_account vers pnl_coin_token_account.
  • Identique pour pc.
  • Remet à zéro need_take_pnl_coin et need_take_pnl_pc.
  • Changement logique : si le solde du coffre est insuffisant pour couvrir le PnL accumulé, l’instruction retourne TakePnlError directement (elle ne manipule plus l’état du carnet d’ordres).
Aucun changement aux réserves puisque le PnL accumulé était déjà exclu de l’invariant.

SetParams

Modifications de paramètres d’administration, appelées par le multisig Raydium. Les arguments sont une balise param: u8 + charge utile.
Changement de rupture (admin uniquement). La liste de comptes a été réduite à juste [amm (W), admin (S)] (l’autorité, les ordres ouverts, les ordres cibles, le coffre et tous les comptes de marché ont été supprimés). L’énumération param a été renumérotée et réduite : Status = 0, State = 1, Fees = 2 (était 9), SetOpenTime = 3 (était 11). Tous les paramètres de grille de carnet d’ordres et AmmOwner, LastOrderDistance, UpdateOpenOrder ont été supprimés, et la structure SetParamsInstruction a supprimé new_pubkey et last_order_distance. Les outils d’administration doivent être mis à jour.

CreateConfigAccount / UpdateConfigAccount

Gestion administrative de la PDA AmmConfig au niveau du programme (seed ["amm_config_account_seed"]). Le compte détient exactement trois champs significatifs — pnl_owner, cancel_owner et create_pool_fee — plus deux régions de remplissage réservées ; il n’y a pas d’indicateur de création de pool. UpdateConfigAccount définit pnl_owner avec param = 0, cancel_owner avec param = 1, et create_pool_fee avec param = 2.
Modifié en 2026-09, et rétrocompatible. CreateConfigAccount ne lit plus la sysvar de rent. Sa liste de comptes est maintenant 4 comptes, en baisse par rapport à 5 :Le programme lit les paramètres de rent de Rent::get() au lieu de désérialiser un compte sysvar passé — ce que la mise à jour de dépendance Solana 3.0 a rendu naturel.Le compte supprimé était dernier dans la liste, et le gestionnaire lit ses comptes positionnellement via next_account_info sans vérification de longueur. Un outil d’administration existant qui passe toujours l’ancienne liste de 5 comptes continue donc de fonctionner : le compte de rent final n’est simplement jamais lu. Mettez-le à jour quand c’est pratique, pas d’urgence. UpdateConfigAccount est inchangé.
Initialize2 conserve la sysvar de rent à la position 3, et l’utilise toujours : le programme a arrêté d’appeler Rent::from_account_info sur elle, mais elle est toujours transmise aux CPI spl_token::initialize_account et initialize_mint qui créent les coffres du pool et le mint LP. Ne la supprimez pas de la liste de comptes.

WithdrawExcessLamports

Récupération administrative des lamports assis au-dessus du minimum exempt de rent sur les comptes que le programme contrôle. Ajouté dans la mise à jour 2026-09 pour récupérer le surfinancement que la réduction de rent SIMD-0437 laisse derrière sur les comptes créés avant chaque étape. Il ne déplace que l’excédent. Les soldes de jetons, les données de compte, les propriétaires et l’état du pool restent inchangés, et l’instruction est un no-op sur un compte déjà à son minimum — donc il est sûr de l’exécuter à plusieurs reprises et à nouveau après chaque étape de déploiement. Arguments — aucun. La charge utile est le seul octet de balise 18. Comptes Comment chaque compte source est traité Le programme se divise sur le propriétaire du compte source : Erreurs courantes — InvalidSignAccount (mauvais signataire), InvalidSplTokenProgram (mauvais programme à l’emplacement 3), InvalidProgramAddress (mauvais amm_authority), LamportsCalculateError (code personnalisé 60 ; l’aller-retour wSOL n’a pas donné zéro), et InsufficientFunds du chemin contrôlé par le programme quand un compte détient moins que son propre minimum de rent. Pas de builder SDK. @raydium-io/raydium-sdk-v2 ne fournit pas de builder pour cette instruction, pas plus que le dépôt raydium-sdk-V2-demo — c’est un chemin d’administration. Encodez-le à la main, comme le fait la récupération côté portefeuille dans solana-fundamentals/rent-and-reclaimable-rent pour l’instruction du programme de jetons.

Matrice de changement d’état

La colonne OpenBook est partie — aucune instruction ne touche plus un carnet d’ordres.

Où aller ensuite

Sources :