Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Cette page est complémentaire de
products/clmm/accounts (description des comptes) et de products/clmm/math (description des calculs). Elle fait autorité pour les arguments et l’ordre des comptes ; les dispositions d’octets précises proviennent de l’IDL.Inventaire des instructions
La plupart des instructions réservées à l’admin (
CreateAmmConfig, UpdateAmmConfig, UpdatePoolStatus, CreateSupportMintAssociated, CreateOperationAccount, UpdateOperationAccount, CloseProtocolPosition) sont contrôlées par la clé publique admin codée en dur dans le programme. Les instructions d’administration des flux de récompenses (TransferRewardOwner, CollectRemainingRewards) sont contrôlées par le financeur de la récompense, et non par l’admin du programme.
Le suffixe V2 signifie « prend en charge Token-2022 sur les coffres / NFT, nécessite l’emplacement d’extension bitmap ». Le SDK sélectionne V2 par défaut pour les nouveaux pools.
CreatePool
Arguments
Préconditions
token_mint_0 < token_mint_1par ordre d’octets.amm_config.disable_create_pool == false.- Les mints ne sont pas rejetés par la liste blanche d’extensions Token-2022.
pool_state.sqrt_price_x64 = sqrt_price_x64,tick_current = floor(log_{1.0001}(price)).pool_state.liquidity = 0(aucune position pour l’instant).pool_state.fee_on = FromInput(valeur par défaut héritée).pool_state.dynamic_fee_infoest mis à zéro (frais dynamiques désactivés).
CreateCustomizablePool
Recommandé pour les nouveaux pools. Même effet que CreatePool, avec en plus un mode de collecte de frais par pool et une activation optionnelle des frais dynamiques.
Arguments
CreatePool, avec en plus, lorsque enable_dynamic_fee = true :
Préconditions — identiques à
CreatePool. Si enable_dynamic_fee = false, dynamic_fee_config est ignoré.
Postconditions
pool_state.fee_onest défini sur la varianteCollectFeeOnchoisie.- Si les frais dynamiques sont activés :
pool_state.dynamic_fee_infoest initialisé à partir duDynamicFeeConfigfourni (cinq paramètres de calibration copiés ; champs d’état mis à zéro). - Sinon :
pool_state.dynamic_fee_infoest mis à zéro (= frais dynamiques inactifs de façon permanente pour ce pool).
fee_on et le bit d’activation des frais dynamiques sont définis uniquement à la création du pool. Il n’existe pas de mise à niveau en place — les pools créés via CreatePool hérité ne peuvent pas bénéficier rétroactivement des frais dynamiques ni des frais unilatéraux. Les nouveaux déploiements doivent utiliser cette instruction par défaut.
OpenPositionV2 / OpenPositionWithToken22Nft
Créer une nouvelle position dans un pool existant.
Arguments
Calcul — voir
products/clmm/math. En fonction de base_flag, le programme résout soit liquidity, soit (amount_0_max, amount_1_max) pour obtenir le L réel et les montants de tokens effectivement consommés.
Préconditions
tick_lower < tick_upper, tous deux multiples depool.tick_spacing, dans[MIN_TICK, MAX_TICK].- Les tableaux de ticks requis sont passés et initialisés (ou créés ici via un CPI
InitTickArraydans la transaction). - L’utilisateur dispose d’au moins
amount_0_maxetamount_1_maxdans les ATAs sources.
personal_positionexiste,liquidityest défini,fee_growth_inside_lastest capturé en instantané.- Les entrées du tableau de ticks à
tick_lowerettick_uppersont mises à jour (liquidity_gross += L,liquidity_net ± L, instantanés de croissance des frais maintenus). pool_state.liquidity += Lsi la position est dans la plage (tick_lower ≤ tick_current < tick_upper).
InvalidTickIndex, NotApproved, ZeroAmountSpecified, TransactionTooLarge (si trop de tableaux de ticks).
IncreaseLiquidityV2
Ajouter de la liquidité à une position déjà ouverte.
Arguments
OpenPosition sans le mint NFT (la position existe déjà ; le NFT est passé en tant qu’ATA du propriétaire détenant 1 token).
Effet
- Transfère
amount_0_actual/amount_1_actualde l’utilisateur vers les coffres. - Incrémente
personal_position.liquidityetpool_state.liquidity(si dans la plage), ainsi queliquidity_gross/liquidity_netdes ticks limites en conséquence. - Collecte les frais et récompenses dus depuis le dernier accès et les crédite sur
tokens_fees_owed_{0,1}/reward_amount_owed. Ces montants ne sont versés que lors d’unDecreaseLiquidityou d’unCollectReward, pas lors d’une augmentation.
DecreaseLiquidityV2
Retirer de la liquidité d’une position.
Arguments
IncreaseLiquidity.
Effet
- Calcule
(amount_0, amount_1)pour leLretiré en fonction dusqrt_price_x64actuel. - Règle les frais et récompenses accumulés depuis le dernier accès, de la même façon qu’
IncreaseLiquidity. - Transfère
amount_0 + fees_owed_0etamount_1 + fees_owed_1hors des coffres vers l’utilisateur. - Décrémente les compteurs de liquidité ; si le nouveau
personal_position.liquidity == 0, la position est éligible àClosePosition.
amount_0_min et amount_1_min représentent les minimums acceptés par l’utilisateur, nets des frais de transfert Token-2022 côté sortie.
ClosePosition
Brûler le NFT de position et fermer le PersonalPositionState.
Préconditions
personal_position.liquidity == 0.tokens_fees_owed_{0,1} == 0.- Tous les compteurs de récompenses
reward_amount_owed == 0.
- Brûle le NFT.
- Ferme le compte de mint du NFT et le compte
personal_position, en restituant le loyer aupayer.
SwapV2
Parcourir la courbe de liquidité ; entrée exacte ou sortie exacte selon is_base_input.
Arguments
Les appelants passent une liste ordonnée de tableaux de ticks couvrant le parcours de swap attendu ; le programme en utilise autant que nécessaire. Le SDK calcule cette liste via
PoolUtils.computeAmountOutFormat ou l’endpoint de devis de l’API.
Préconditions
pool_state.statusautorise le swap.now >= open_time.sqrt_price_limit_x64se trouve du bon côté desqrt_price_x64pour la direction choisie.
ExceededSlippage, SqrtPriceLimitOverflow, TickArrayNotFound, LiquidityInsufficient.
Ce que SwapV2 fait en interne et que les appelants doivent savoir (version post-2025) :
- Surcharge de frais dynamiques — si
pool.dynamic_fee_infoest non nul, le programme met à jour l’accumulateur de volatilité en utilisant la distance en ticks parcourue depuis le dernier swap (selon les règles de filtre/décroissance décrites dansproducts/clmm/fees) et ajoute undynamic_fee_componentau-dessus deAmmConfig.trade_fee_rate. Les frais totaux sont plafonnés à 10 % (MAX_FEE_RATE_NUMERATOR / 1_000_000). - Correspondance des ordres limités — lorsque le parcours de prix franchit un tick contenant des ordres limités ouverts, le programme remplit d’abord la liquidité des ordres limités disponibles à ce tick (FIFO par
order_phase), puis continue le long de la courbe de liquidité LP. Les montants exécutés mettent à jourtick.unfilled_ratio_x64ettick.part_filled_orders_remainingpour le règlement ultérieur ; les ordres eux-mêmes restent non dépensés jusqu’à ce que leur propriétaire appelleSettleLimitOrder. - Routage des frais unilatéral — lorsque
pool.fee_on = Token0OnlyouToken1Only, l’étape de swap calcule toujours le même échange entrée-sortie ; les frais sont ensuite acheminés vers le côté configuré. Pour les directions où le côté de frais configuré est la sortie, les frais sont déduits de la sortie du swap (l’utilisateur reçoitout − fee) ; pour les directions où il s’agit de l’entrée, le comportement correspond àFromInput. Voiris_fee_on_input(zero_for_one)etis_fee_on_token0(zero_for_one)surPoolState.
Swap (V1) implémente les mêmes frais dynamiques, le même routage de frais unilatéral et la même correspondance d’ordres limités que SwapV2 ; la seule fonctionnalité qui lui manque est la prise en charge de Token-2022 — les deux coffres doivent être des SPL Token classiques. Les pools comportant un mint Token-2022 doivent être swappés via SwapV2. L’agrégateur et le SDK préfèrent déjà V2 pour chaque segment CLMM, de sorte que les appelants n’ont pas à distinguer selon le type de mint.
OpenLimitOrder
Placer un ordre de vente à un tick spécifique. L’ordre s’inscrit dans une cohorte FIFO par tick et s’exécute au fur et à mesure que le prix la franchit.
Arguments
Préconditions
tick_index % pool.tick_spacing == 0et dans[MIN_TICK, MAX_TICK].tick_indexse trouve du bon côté depool.tick_currentpour la direction choisie (vendre token0 → le tick doit être au-dessus du tick actuel, et inversement). Vendre à un tick déjà franchi entraînerait une exécution immédiate et est rejeté.pool_state.statusautorise l’opération d’ordre limité (bit 5).
limit_orderexiste, avec un instantané detick.order_phaseettick.unfilled_ratio_x64à l’ouverture.tick.orders_amount += amount(dans la cohorte actuelle).limit_order_nonce.order_nonce += 1.- Événement
OpenLimitOrderEventémis.
InvalidLimitOrderAmount (nul ou inférieur au minimum du pool), InvalidTickIndex (hors de [MIN_TICK, MAX_TICK], ou du mauvais côté de tick_current pour la direction choisie), TickAndSpacingNotMatch (tick_index % pool.tick_spacing != 0), OrderPhaseSaturated.
IncreaseLimitOrder
Augmenter un ordre ouvert existant. Uniquement appelable par le owner de l’ordre.
Arguments
OpenLimitOrder sans le compte nonce ; le PDA limit_order est passé directement.
Préconditions
limit_order.owner == signer.- L’ordre est toujours dans la même cohorte (
tick.order_phase == limit_order.order_phase). Si la cohorte a déjà commencé à s’exécuter, l’ordre est partiellement réglé — l’appelant devrait d’abord appelerDecreaseLimitOrderouSettleLimitOrderpour avancer.
- Transfère
amountde l’ATA du propriétaire versinput_vault. limit_order.total_amount += amount;tick.orders_amount += amount.
DecreaseLimitOrder
Réduire ou annuler entièrement un ordre ouvert. Rembourse le reliquat non exécuté au propriétaire, ainsi que toute sortie déjà réglée lors de remplissages partiels passés.
Arguments
Effet
- Recalcule le montant exécuté de l’ordre à partir du
unfilled_ratio_x64de la cohorte depuis l’ouverture. - Envoie la sortie exécutée vers
output_token_account. - Renvoie
amountd’entrée non exécutée versinput_token_account. - Met à jour
limit_orderen conséquence. Si le nouveau reliquat non exécuté est nul, le programme ferme le compte et rembourse le loyer auowner.
SettleLimitOrder
Transférer les tokens de sortie exécutés vers le propriétaire sans modifier le reliquat non exécuté de l’ordre. Utile lorsque des keepers auto_withdraw souhaitent verser progressivement des remplissages partiels de longue durée.
Appelant — soit le owner de l’ordre, soit le limit_order_admin du programme (un portefeuille chaud opérationnel hors chaîne qui exécute une boucle de keeper automatisée). Le keeper ne dispose d’aucune autre autorité — il ne peut pas déplacer les fonds des utilisateurs en dehors du transfert de la sortie exécutée vers l’ATA de sortie du owner de l’ordre.
Comptes
Effet
- Calcule la sortie cumulée due en utilisant
(limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64). - Transfère le delta vers
output_token_account. - Met à jour
limit_order.settled_output. - Ne ferme pas l’ordre ; il reste ouvert sur toute entrée restante.
CloseLimitOrder
Fermer un compte d’ordre entièrement consommé. Le loyer est toujours restitué à limit_order.owner, quel que soit le signataire.
Appelant — soit owner, soit limit_order_admin.
Préconditions
- L’ordre a un reliquat non exécuté nul (soit
amount == total_amounta été exécuté et réglé, soit le propriétaire avait précédemment réduit l’ordre à zéro sans le fermer).
- Ferme
limit_order; le loyer est envoyé àlimit_order.owner.
CreateDynamicFeeConfig (admin)
Créer un jeu de paramètres réutilisable sous un index u16.
Arguments
Erreurs courantes —
InvalidDynamicFeeConfigParams si decay_period <= filter_period ou si un champ à valeur nulle est hors limites.
UpdateDynamicFeeConfig (admin)
Modifier un DynamicFeeConfig existant. Les pools ayant déjà pris un instantané de la config au moment de leur création ne sont pas mis à jour rétroactivement ; seuls les pools nouvellement créés référençant cette config adopteront les nouvelles valeurs.
Arguments — les cinq mêmes champs de calibration que CreateDynamicFeeConfig (filter_period, decay_period, reduction_factor, dynamic_fee_control, max_volatility_accumulator) ; index est fixé à la création et n’est pas repassé ici.
CollectProtocolFee / CollectFundFee
Structure identique à celle du CPMM pour CollectProtocolFee / CollectFundFee. Le signataire doit correspondre à AmmConfig.owner / AmmConfig.fund_owner. Collecte les frais de protocole/fonds accumulés depuis les coffres du pool vers un destinataire, puis remet à zéro les champs PoolState.protocol_fees_* / fund_fees_* correspondants.
InitializeReward
Ajouter un nouveau flux de récompenses à un pool. Au maximum 3 flux peuvent être actifs simultanément.
Arguments
Préconditions
- Moins de 3 flux actuellement actifs sur le pool.
- Le financeur dépose
total_emission = emissions_per_second × (end_time − open_time)de tokens de récompense dans le coffre dans le cadre de cette instruction. - Mint de récompense autorisé par
operation_state.
SetRewardParams
Prolonger, alimenter ou modifier le taux d’émission d’un flux de récompenses existant. Généralement appelé par le créateur du pool ou le multisig Raydium. Les contraintes sont définies on-chain : il est généralement possible d’étendre end_time ou d’augmenter les émissions, mais pas de les réduire rétroactivement. Vérifiez la liste des propriétaires de operation_state.
UpdateRewardInfos
Comptabilité pure — règle reward_growth_global_x64 jusqu’à l’heure actuelle en multipliant emissions_per_second × Δt / liquidity. Appelée en interne par chaque instruction touchant à la liquidité. Exposée en tant qu’instruction autonome car des acteurs externes (interfaces, cranks) souhaitent parfois la déclencher directement.
CollectReward
Le propriétaire d’une position réclame les tokens de récompense dus.
Comptes
Effet
- Règle la croissance des récompenses (même mécanisme que pour les frais).
- Transfère le montant dû vers l’ATA destinataire, remet à zéro
reward_amount_owed[i].
Matrice des changements d’état
Pour aller plus loin
products/clmm/code-demos— exemples TypeScript exécutables.products/clmm/fees— détails sur l’accumulation des frais et des récompenses.reference/error-codes— tableau complet des erreurs Anchor CLMM.
raydium-io/raydium-clmm—programs/amm/src/instructions- Raydium SDK v2 —
@raydium-io/raydium-sdk-v2

