Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Une entrée du journal des modifications de la documentation. Pour l’index de toutes les mises à jour, consultez
reference/changelog. Pour la chronologie historique du protocole, consultez introduction/history-and-milestones.TL;DR pour les intégrateurs
- Les ordres à cours limité sont désormais des primitives CLMM de première classe. Les LP peuvent ouvrir un ordre sur un seul tick sur un pool qui les supporte ; l’ordre est exécuté FIFO quand un swap traverse le tick, et un gardien hors chaîne (
limit_order_admin) peut régler la sortie remplie sans que le propriétaire soit en ligne. Sept nouvelles méthodes SDK (openLimitOrder,increaseLimitOrder,decreaseLimitOrder,settleLimitOrder,closeLimitOrder,closeAllLimitOrder,settleAllLimitOrder) et trois nouveaux points de terminaison Temp API sous/limit-order/(ordres actifs, historique par utilisateur, journal des événements par PDA) couvrent le flux complet. - Les frais unilatéraux (
CollectFeeOn) permettent à un pool de collecter les frais de swap du côté d’entrée (hérité, mode0), ou toujours detoken_0(mode1), ou toujours detoken_1(mode2). Utile quand un côté de la paire est le jeton comptable canonique. - Les frais dynamiques permettent à un pool d’opter pour une surcharge suivant la volatilité qui augmente avec les mouvements rapides de tick et décroît au fil du temps, calibrée par une
DynamicFeeConfigpar niveau et uneDynamicFeeInfopar pool. Le nouveau point de terminaison/main/clmm-dynamic-configexpose la liste des niveaux. - Une nouvelle instruction,
CreateCustomizablePool, expose les trois paramètres au moment de la création du pool. L’instruction classiqueCreatePoolcontinue de fonctionner pour les pools sans ordres à cours limité et avec frais par défaut. - Changement cassant pour l’indexeur : les compteurs de volume par direction (
swap_in_amount_token_{0,1},swap_out_amount_token_{0,1}) et les compteurs de frais à vie (total_fees_token_{0,1},total_fees_claimed_token_{0,1}) surPoolStateont été retirés dans le remplissage pour faire de la place àfee_onetdynamic_fee_info. Les indexeurs qui lisent ces champs directement doivent migrer vers le ringObservationon-chain ou l’API.
Pourquoi cela importe (pour les traders, LP et intégrateurs)
- Les traders obtiennent des devis plus serrés sur les paires de queue longue et événementielles : les frais dynamiques permettent au pool d’absorber les surcharges de volatilité du preneur sans que les LP doivent activement élargir les plages, et les échelles d’ordres à cours limité approfondissent la liquidité on-chain à des prix spécifiques sans engager le capital sur toute la plage.
- Les LP obtiennent une troisième stratégie aux côtés des plages concentrées et des positions sur toute la plage : garez des ordres à prix exact, soyez remplis quand le prix visite, réglez dans le jeton de cotation. Aucun rééquilibrage actif requis pour la portion remplie.
- Les intégrateurs peuvent modéliser les pools à frais dynamiques de manière déterministe — l’algorithme et les paramètres sont entièrement on-chain, les niveaux de calibrage sont interrogeables, et le chemin de swap est inchangé en forme (seuls les frais par étape varient).
Ce qui a changé dans le programme
Nouveaux comptes
DynamicFeeConfig— enregistrement de calibrage par niveau (période de filtre, période de décroissance, facteur de réduction, contrôle des frais dynamiques, accumulateur de volatilité max). Créé parCreateDynamicFeeConfig(admin), référencé parCreateCustomizablePoolquand les frais dynamiques sont activés.LimitOrderState— compte par ordre (graines PDA :[owner, limit_order_nonce, order_nonce]) contenant le pool, le tick, le côté, le montant d’entrée, le ratio non rempli, la phase de cohort FIFO, et les instantanés de tenue de livres. Le cycle de vie est implicite (filled_amountvstotal_amount, plus l’existence du compte) :Open → Filled → Settled → Closed.LimitOrderNonce— compteur monotone croissant par (propriétaire, index_nonce) qui obtient les graines PDA de l’ordre à cours limité. Lenonce_index: u8permet au même propriétaire de partitionner les ordres en jusqu’à 256 flux de nonce indépendants.
Restructuration de PoolState
| Groupe de champs | Ancienne disposition | Nouvelle disposition |
|---|---|---|
| Compteurs de volume par direction | swap_in_amount_token_0, swap_out_amount_token_0, swap_in_amount_token_1, swap_out_amount_token_1 | Repliés dans padding5: [u128; 4] |
| Compteurs de frais à vie | total_fees_token_0, total_fees_claimed_token_0, total_fees_token_1, total_fees_claimed_token_1 | Repliés dans padding6: [u64; 4] |
| Frais unilatéraux | — | fee_on: u8 (0 = FromInput, 1 = Token0Only, 2 = Token1Only) |
| Frais dynamiques | — | dynamic_fee_info: DynamicFeeInfo (intégré) |
PoolState vers le ring Observation ou l’API. Les compteurs retirés ne sont pas mis à zéro sur les pools existants (ils contiennent ce qu’ils ont porté en dernier), donc les relire après la mise à niveau retournera des données obsolètes.
Ajouts à TickState (pas de changement cassant)
Quatre nouveaux champs sont ajoutés à la fin de TickState, remplaçant une partie de son remplissage de queue :
order_phase: u64— compteur qui désambiguïse les cohortes d’ordres à cours limité à ce tick.orders_amount: u64— total d’entrée engagé par tous les ordres ouverts à ce tick (pas tous entièrement non remplis).part_filled_orders_remaining: u64— entrée toujours non remplie dans la cohorte actuellement consommée par les swaps.unfilled_ratio_x64: u128— ratio Q64.64 utilisé pour calculer la part de remplissage de chaque ordre.
Nouvelles instructions
CreateDynamicFeeConfig(admin) — créer un niveauDynamicFeeConfigcalibré. Autorité : même multisig de trésorerie queCreateAmmConfig.UpdateDynamicFeeConfig(admin) — mettre à jour les paramètres d’un niveau existant.CreateCustomizablePool— point d’entrée de création de pool qui exposecollect_fee_on,enable_dynamic_fee, etdynamic_fee_config. Coexiste avecCreatePool; nous recommandonsCreateCustomizablePoolpour tout nouveau pool qui a besoin des nouveaux paramètres.OpenLimitOrder— ouvrir un ordre à cours limité sur un seul tick. IncrémenteLimitOrderNonce, alloueLimitOrderState, place l’ordre dans la cohorte FIFO au tick.IncreaseLimitOrder/DecreaseLimitOrder— ajuster la portion non remplie d’un ordre. Revient en arrière sur un ordre entièrement rempli avecInvalidOrderPhase.SettleLimitOrder— balayer la sortie remplie vers l’ATA du propriétaire. L’appelant peut être le propriétaire ou le gardienlimit_order_admindu pool.CloseLimitOrder— fermer un ordre entièrement réglé pour récupérer le loyer.
Changements de comportement de SwapV2
Le chemin de swap lui-même est inchangé en forme, mais trois choses se produisent maintenant en cours de route :
- Frais dynamiques (quand activés) : la
DynamicFeeInfodu pool est mise à jour à chaque étape (décroissance → accumulation → plafond), et la surcharge résultante est ajoutée au-dessus des frais de base pour cette étape. - Correspondance d’ordres à cours limité (quand l’étape traverse un tick initialisé qui a des ordres ouverts) : une partie de l’entrée de swap est consommée FIFO pour remplir la cohorte à ce tick, avec
unfilled_ratio_x64mise à jour atomiquement. - Routage des frais unilatéraux (quand
fee_on != 0) : les frais sont prélevés surtoken_0outoken_1indépendamment de la direction du swap, au lieu de toujours être prélevés du côté d’entrée.
Nouveaux codes d’erreur
L’énumérationErrorCode a été renumérotée dans cette version : cinq variantes héritées (LOK, ZeroMintAmount, InvalidLiquidity, TransactionTooOld, InvalidRewardDesiredAmount) ont été supprimées, et onze nouvelles variantes ont été ajoutées. Parce qu’Anchor numérote les erreurs par ordre d’énumération à partir de 6000, chaque code d’erreur à ou après les positions supprimées a décalé — les clients qui ont codé en dur les codes numériques doivent remapper.
Les nouveaux codes sont :
6040OrderAlreadyFilled6041InvalidOrderPhase6042InvalidLimitOrderAmount6043OrderPhaseSaturated6044InvalidDynamicFeeConfigParams6045InvalidFeeOn6046ZeroSqrtPrice6047ZeroLiquidity6048MissingBaseFlag6049MissingMintAccount6050MissingTokenProgram2022
Ce qui a changé dans le SDK (@raydium-io/raydium-sdk-v2)
- Nouvelles méthodes sur
raydium.clmm:createCustomizablePool,openLimitOrder,increaseLimitOrder,decreaseLimitOrder,settleLimitOrder,settleAllLimitOrder,closeLimitOrder,closeAllLimitOrder. - Nouveaux assistants REST sur
raydium.api:getClmmDynamicConfigs,getClmmLimitOrderConfigs. - Nouveaux types : énumération
CollectFeeOn,DynamicFeeConfig,DynamicFeeInfo,LimitOrderState,LimitOrderConfig. - Réorganisation interne :
utils/déplacé verslibraries/. Le barrel du package est inchangé ; seules les importations profondes sous@raydium-io/raydium-sdk-v2/utils/...doivent être mises à jour vers…/libraries/....
products/clmm/code-demos.
Ce qui a changé dans les API
api-v3— deux nouveaux points de terminaison sous/main/:GET /main/clmm-dynamic-config— liste des niveauxDynamicFeeConfig.GET /main/clmm-limit-order-config— configuration des ordres à cours limité par pool.
temp-api-v1— trois nouveaux points de terminaison sous/limit-order/:GET /limit-order/order/list?wallet=…— ordres actuellement garés d’un portefeuille (ouverts et partiellement remplis, servis depuis le cache Redis de l’indexeur ; la même charge utile couvre les deux phases viatotalAmount/filledAmount/pendingSettle).GET /limit-order/history/order/list-by-user?wallet=…— ordres à cours limité historiques d’un portefeuille. Filtres optionnels :poolId,mint1,mint2,hideCancel. Pagination par curseur vianextPageId/size(max 100).GET /limit-order/history/event/list-by-pda?pda=…— journal des événements par PDA (open/increase/decrease/settle/close) pour un ou plusieurs PDA d’ordres à cours limité séparés par des virgules. Pagination par curseur vianextPageId/size(max 100).
Surface d’autorité
Lelimit_order_admin est un gardien opérationnel hors chaîne, pas un multisig. Il ne peut appeler que SettleLimitOrder et CloseLimitOrder sur les ordres existants, et la sortie d’un règlement atterrit toujours dans l’ATA du propriétaire. Il ne peut pas muter les champs du pool, ouvrir ou modifier les ordres, ou signer pour autre chose. Consultez Admin keys and multisig → CLMM.
Pages mises à jour
products/clmm/overview— nouvelle section « What’s new » et pointeurs de prochaines étapes mis à jour.products/clmm/accounts— trois nouveaux comptes, restructuration dePoolStateavec avertissement de migration, ajouts àTickState, nouveaux assistants PDA.products/clmm/instructions— sept nouvelles instructions, addendum de comportement deSwapV2, matrice de changement d’état mise à jour.products/clmm/fees— section des frais unilatéraux, section des frais dynamiques avec tableau de paramètres.products/clmm/math— pseudo-code de correspondance d’ordres à cours limité, dérivation des frais dynamiques.products/clmm/code-demos— démo decreateCustomizablePool, procédure pas à pas complète des ordres à cours limité, nouveaux pièges.algorithms/clmm-math— référence croisée à la correspondance d’ordres à cours limité et aux frais dynamiques dans la boucle de swap multi-tick.sdk-api/typescript-sdk— section des ajouts du module CLMM, note de migrationutils/→libraries/.api-reference/openapi/api-v3.yaml— deux nouveaux points de terminaison avec schémas de réponse.api-reference/openapi/temp-api-v1.yaml— trois nouveaux points de terminaison d’ordres à cours limité (/limit-order/order/list,/limit-order/history/order/list-by-user,/limit-order/history/event/list-by-pda) avec leurs schémas de requête et de réponse.api-reference/api-v3/overview— note sur les nouveaux points de terminaison de configuration CLMM.api-reference/temp-api-v1/overview— note sur les nouveaux points de terminaison d’ordres actifs, d’historique par utilisateur et d’événement par PDA.reference/error-codes— onze nouveaux codes d’erreur CLMM (6040–6050) plus cinq codes hérités supprimés ; les codes numériques après les points de suppression ont décalé.security/admin-and-multisig— nouvelle ligne d’adminDynamicFeeConfiget ligne de gardienlimit_order_admin, avec explication d’autorité bornée.
- source de
raydium-clmm. - source de
@raydium-io/raydium-sdk-v2. - source de
api-v3ettemp-api-v1.

