Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Cette entrée couvre une mise à jour du programme CLMM à venir. Elle a été vérifiée par rapport à la branche
chore/upgrade-anchor de raydium-clmm (head a72f9e1) avant le déploiement. Confirmez le programme déployé avant de vous fier à la nouvelle instruction ou au comportement modifié de CreateAmmConfig.0.32.1 à =1.0.2, et la chaîne d’outils de compilation passe d’Agave 2.3.0 à 3.1.10. Deux changements côté admin accompagnent cette migration : une nouvelle instruction CollectExcessLamports et des propriétaires de frais fixes dans CreateAmmConfig.
Chaque instruction qu’un trader, un LP, un utilisateur de limite d’ordre ou un créateur de pool appelle conserve sa liste de comptes, ses arguments et ses calculs.
TL;DR pour les intégrateurs
- Aucune instruction visible par l’utilisateur n’a changé.
CreatePool,CreateCustomizablePool,CreatePermissionedPool, tous les cheminsOpenPosition*/IncreaseLiquidity*/DecreaseLiquidity*,ClosePosition,Swap/SwapV2/SwapRouterBaseIn, les cinq instructions de limite d’ordre et les instructions de récompense sont identiques sur le fil. Aucune disposition de compte n’a changé. - Une instruction est ajoutée :
CollectExcessLamports. Elle est réservée à l’admin et ne prend aucun argument. Elle balaye un pool par appel : lePoolStatedu pool est toujours balayé, et le PDA du pool signe pour ses coffres, que vous passez dansremaining_accounts. Tout autre compte appartenant à CLMM dansremaining_accountsest également balayé. Voirproducts/clmm/instructions. - Un code d’erreur est ajouté :
6052LamportsCalculateError. Les codes6000–6051restent inchangés. CreateAmmConfigne copie plus le signataire dansowner/fund_owner. Les nouvelles configurations obtiennent des clésprotocol_fee_owneretfund_fee_ownercodées en dur. Sur mainnet, ce sont les deux mêmes clés déjà stockées sur les 21 configurations existantes. Les comptesAmmConfigexistants restent inchangés, continuez donc à lire les champs du compte.- Actualisez votre IDL. Il ajoute une instruction et une variante d’erreur, pour 39 instructions et 53 erreurs.
- Vous pouvez maintenant mettre CPMM et CLMM dans une seule caisse. Les deux dépôts épinglent
anchor-lang/anchor-spl=1.0.2sur leurs brancheschore/upgrade-anchor, donc un seul programme peut faire un CPI dans les deux. Voirsdk-api/rust-cpi. - Le paquet client TypeScript est renommé. La suite de tests passe de
@coral-xyz/anchor0.32.1à@anchor-lang/core1.0.2.
CollectExcessLamports
L’étape 1 de SIMD-0437 s’est activée sur mainnet le 3 septembre 2026. Chaque compte CLMM créé avant une étape est maintenant surfinancé, et seul le programme CLMM peut déplacer des lamports hors d’un compte qu’il possède. Cela couvre les coffres de pool, les coffres de récompense, PoolState, AmmConfig, ObservationState, TickArrayBitmapExtension et le reste.
L’instruction prend quatre comptes fixes, puis un nombre quelconque de comptes source dans remaining_accounts :
Le pool est l’autorité de signature, pas un PDA à l’échelle du programme. CPMM signe avec une autorité
vault_and_lp_mint_auth_seed globale unique. Les coffres de jetons CLMM sont possédés par leur PoolState, donc un seul appel ne peut signer que pour le pool passé dans l’emplacement 2. Chaque compte de programme de jetons doit avoir ce pool comme autorité : token_vault_0, token_vault_1, ou l’un des coffres de récompense du pool. Un compte de jetons d’un autre pool, ou un compte de jetons d’un utilisateur, échoue la vérification du propriétaire du programme de jetons et annule l’instruction entière. Le programme ne le saute pas. Les mints NFT de position ne sont pas balayables non plus, car leur autorité de mint est révoquée à l’ouverture de la position. Balayez pool par pool.
L’instruction fait deux passes, et cet ordre est fixe :
- Les CPI du programme de jetons en premier. Pour chaque source possédée par SPL Token ou Token-2022, un compte non natif obtient
WithdrawExcessLamports(discriminant38). Un coffre wSOL natif obtient le cycleSyncNative→UnwrapLamports(discriminant45), qui se termine par une vérification que le solde enveloppé égale sa valeur pré-synchronisation. S’il ne l’est pas, l’appel échoue avecLamportsCalculateError. Un coffre côté SOL conserve sa liquidité complète, et aucune cotation de swap ne change lors d’un balayage. - Les débits directs en second. La passe 2 débite
pool_stateen premier, puis chaque source possédée par le programme CLMM, jusqu’àrent.minimum_balance(data_len).
UnbalancedInstruction, donc les appelants peuvent passer les sources dans n’importe quel ordre.
Les adresses de portefeuille sont listées dans reference/program-addresses.
CreateAmmConfig écrit les propriétaires de frais fixes
Avant cette version, create_amm_config définissait les deux champs de propriétaire de frais à partir du signataire appelant :
CreateAmmConfig est toujours limité à crate::admin::ID. Avant cette version, chaque nouveau palier de frais commençait avec l’admin dans les deux champs et devait être pivoté avec le paramètre UpdateAmmConfig 3 / 4. Maintenant, il commence avec les portefeuilles opérationnels. Sur mainnet, les constantes sont les mêmes clés déjà stockées comme owner / fund_owner sur les 21 configurations existantes. Le programme écrit maintenant une valeur que les opérations avaient l’habitude de définir manuellement.
Les signataires de collecte ne changent pas. CollectProtocolFee accepte amm_config.owner ou crate::admin::ID, et CollectFundFee accepte amm_config.fund_owner ou crate::admin::ID, avant et après cette version.
Sur devnet, les deux constantes se résolvent à la même clé. Voir reference/program-addresses.
Changements de chaîne d’outils et de dépendances
Les changements Anchor 1.0 aux sites d’appel CPI sont les mêmes que ceux que les intégrateurs CPMM ont déjà gérés.
CpiContext::new prend le Pubkey du programme plutôt que son AccountInfo, et Context a un paramètre de durée de vie au lieu de quatre. Dans la caisse client, RequestBuilder::instructions() retourne maintenant Vec<Instruction> sans Result, et system_program a été déplacé vers solana-system-interface. Voir sdk-api/rust-cpi.
Détails du système de compilation sans effet sur la chaîne :
- Admin localnet. La fonctionnalité
localnetne compile plus une clé de test fixe sauvegardée par une fixture engagée. Au lieu de cela, elle lit l’admin à partir de la variable d’environnementCLMM_LOCALNET_ADMINau moment de la compilation, queyarn test:local-admindéfinit à partir de votre portefeuille local. L’exception.gitignorede la fixture est supprimée. - Profil de version. Le bloc
[profile.release]dupliqué dansprograms/amm/Cargo.tomla été supprimé. Cargo ignore[profile]en dehors de la racine de l’espace de travail, donc le bloc racine était déjà celui en vigueur, et lepanic = "abort"au niveau du programme n’a jamais été appliqué. - Anchor.toml.
seeds = falsedevientresolution = trueplusskip-lint = false, et l’URL[registry]obsolète est supprimée. - Lints.
programs/amm/Cargo.tomlajoute une liste d’autorisation[lints.rust] unexpected_cfgspour les cfgs de fonctionnalité que les macros Anchor et Solana émettent. - README. Sur cette branche, le README vous dit toujours d’exécuter
rustup default 1.86.0etavm install 0.32.1à partir decoral-xyz/anchor. Suivez plutôtAnchor.tomletsolana-fundamentals/toolchain.
Ce qui n’a pas changé
- Chaque disposition de compte.
PoolState,AmmConfig,TickArrayState,TickArrayBitmapExtension,PersonalPositionState,ObservationState,LimitOrderState,DynamicFeeConfig,PermissionetSupportMintAssociatedconservent les mêmes tailles et décalages. - Codes d’erreur
6000–6051. - Swap, liquidité, frais, frais dynamiques et mathématiques de limite d’ordre.
CollectExcessLamportsdéplace les lamports qui n’ont jamais fait partie des réserves d’aucun pool. - Gel NFT de position du 2026-08-17, y compris la règle du pool comme autorité de gel et le chemin de dégel
ClosePosition. spl_memo. La contrainte du programme mémo deDecreaseLiquidityV2a été déplacée despl_memo::id()àanchor_spl::memo::ID. Les deux nomment la même adresse ;anchor-spla juste renommé l’export.- ID du programme.
Pages mises à jour
products/clmm/instructions: bannière de mise à niveau ; sectionCollectExcessLamportsavec sa liste de comptes, tableau de dispatch à deux passes et portée par pool ; lignes d’inventaire, de limitation admin et de matrice de changement d’état ; note de propriétaire de frais surCollectProtocolFee/CollectFundFee.products/clmm/accounts: commentaires du propriétaireAmmConfiget note sur ce queCreateAmmConfigécrit.products/clmm/code-demos: bannière de version et squelette CPI Rust déplacés vers Anchor 1.0.products/cpmm/code-demos: note « ne peut pas partager une caisse avec CLMM » supprimée.reference/error-codes:6052documenté.reference/program-addresses: nouvelle section « Portefeuilles propriétaires de frais CLMM » ; CLMM ajouté à « Portefeuilles de collecte de lamports excédentaires ».sdk-api/rust-cpi,sdk-api/anchor-idl,solana-fundamentals/toolchain: épingles Anchor 1.0 pourraydium-clmm, et l’avertissement de division de caisse retiré.solana-fundamentals/rent-and-reclaimable-rent: CLMM ajouté à « Ce que les programmes Raydium balayent de leur côté ».security/admin-and-multisig: rôle de collecteur de lamports excédentaires CLMM.protocol-overview/versions-and-migration: puce d’historique de mise à niveau CLMM.

