Skip to main content
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 CPMM à venir. Elle a été vérifiée par rapport à la branche de version locale avant le déploiement. Confirmez le programme déployé avant de vous fier à la nouvelle instruction ou au comportement modifié de CreateAmmConfig.
Le changement phare de CPMM est une migration de framework : Anchor 0.32.1 vers 1.0.2, et la chaîne d’outils de compilation d’Agave 2.3.0 vers 3.1.10. Quatre changements de comportement l’accompagnent, dont trois ne concernent que les outils d’administration et un — la suppression de la liste blanche de mint — qui change les mints Token-2022 pouvant être utilisés pour un nouveau pool. Tout ce qu’un trader, un LP ou un créateur de pool appelle conserve sa liste de comptes, ses arguments et ses mathématiques.

TL;DR pour les intégrateurs

  • Aucune instruction orientée utilisateur n’a changé. Initialize, InitializeWithPermission, Deposit, Withdraw, SwapBaseInput, SwapBaseOutput et les quatre chemins Collect*Fee sont identiques au byte près. Aucune disposition de compte n’a changé.
  • Une instruction est ajoutée : CollectExcessLamports. Réservée à l’admin, sans arguments, les sources sont passées en tant que remaining_accounts. Elle retourne les lamports au-dessus du minimum exempt de rente des coffres contrôlés par CPMM, des mints LP et des PDA, et ne touche à rien d’autre. Voir products/cpmm/instructions.
  • Un code d’erreur est ajouté : 6015 LamportsCalculateError. Les codes 60006014 restent inchangés.
  • CreateAmmConfig ne copie plus le signataire dans les champs propriétaire de frais. Les nouvelles configurations obtiennent les clés codées en dur protocol_fee_owner et fund_fee_owner. Les comptes AmmConfig existants restent inchangés — continuez à lire protocol_owner / fund_owner du compte plutôt que de supposer l’une ou l’autre valeur.
  • La MINT_WHITELIST Token-2022 à quatre adresses codée en dur est supprimée. Le registre PDA SupportMintAssociated est désormais le seul contournement de la liste d’autorisation des extensions de CPMM. Les pools existants ne sont pas affectés ; la vérification s’exécute uniquement à la création du pool.
  • ClosePermissionPda accepte l’autorité créatrice de PDA de permission dédiée, pas seulement l’admin partagé.
  • Une actualisation de l’IDL est requise. Une nouvelle instruction, une nouvelle variante d’erreur.
  • Le package client TypeScript est renommé. @coral-xyz/anchor est figé à 0.32.1 ; le client Anchor 1.x est publié sous @anchor-lang/core.

CollectExcessLamports

L’étape 1 de SIMD-0437 a été déployée sur mainnet le 3 septembre 2026, réduisant le minimum exempt de rente de 9 % avec quatre étapes supplémentaires à venir. Chaque coffre de pool CPMM, mint LP, compte PoolState, AmmConfig, ObservationState, Permission et SupportMintAssociated créé avant une étape est désormais surfinancé, et les lamports dans un compte appartenant au programme ne peuvent être déplacés que par ce programme. L’instruction prend quatre comptes fixes — le portefeuille signataire/destination, l’autorité PDA vault_and_lp_mint_auth_seed, et les deux programmes de token — puis n’importe quel nombre de comptes source dans remaining_accounts. Elle se distribue selon le propriétaire de chaque compte source : un CPI vers WithdrawExcessLamports du programme de token (discriminant 38) pour un compte de token ou un mint, un débit direct pour un PDA appartenant à CPMM, et ignore silencieusement tout le reste. Le SOL enveloppé est le cas qui mérite d’être compris. Le solde en lamports d’un compte de token natif est son solde de token, donc les deux programmes de token rejettent WithdrawExcessLamports sur un. CPMM appelle plutôt SyncNative (pliant l’excédent donné dans le amount enveloppé), mesure la croissance du montant, UnwrapLamports (discriminant 45) pour exactement ce delta, puis exige que le solde enveloppé soit égal à sa valeur pré-sync — LamportsCalculateError s’il ne l’est pas. Un coffre de pool côté SOL conserve sa liquidité complète via un balayage, et aucun LP ne voit de changement de prix à travers un. Le signataire peut être soit l’admin du programme partagé, soit un portefeuille de collecte de lamports dédié ; les adresses se trouvent dans reference/program-addresses.

CreateAmmConfig écrit les propriétaires de frais fixes

Avant cette version, create_amm_config définissait les deux champs propriétaire de frais à partir du signataire appelant :
Il écrit désormais les constantes du programme :
Puisque CreateAmmConfig est limité à crate::admin::ID, l’effet pratique est qu’un niveau de frais nouvellement créé est balayé par des portefeuilles opérationnels dédiés dès le départ au lieu de l’être par le multisig admin, et l’admin ne peut pas collecter à partir d’une configuration qu’il vient de créer sans d’abord faire pivoter le champ via le paramètre UpdateAmmConfig 3 ou 4. Les deux constantes suivent le même modèle cfg devnet/mainnet que le reste des adresses du programme, et sur devnet les deux se résolvent à la même clé. Voir reference/program-addresses.
Ce n’est pas une migration. Chaque AmmConfig qui existe déjà conserve les protocol_owner et fund_owner avec lesquels il a été créé. Un outil de collecte qui commence à coder en dur les nouvelles constantes échouera sur les configurations plus anciennes, et un qui suppose « la clé admin » échouera sur les nouvelles. Lisez les champs.

La liste blanche de mint Token-2022 est supprimée

is_supported_mint avait l’habitude de court-circuiter sur une MINT_WHITELIST codée en dur de quatre adresses avant d’itérer les extensions du mint. Ce tableau — et le HashSet construit à partir de celui-ci à chaque appel — est supprimé. Ce qui reste est :
  1. Les mints SPL Token hérités passent sans condition.
  2. Un mint avec un PDA SupportMintAssociated initialisé à [b"support_mint", mint] passe sans condition.
  3. Sinon, chaque extension sur le mint doit être l’une de TransferFeeConfig, MetadataPointer, TokenMetadata, InterestBearingConfig, ScaledUiAmount.
Le PDA du registre est dans le programme depuis un certain temps, avec sa propre paire CreateSupportMintAssociated / CloseSupportMintAssociated et sa propre autorité dédiée aux côtés de l’admin partagé, et il est consulté à partir de Initialize et InitializeWithPermission. Supprimer le tableau statique signifie que l’intégration d’un mint est désormais une action purement on-chain plutôt qu’une mise à niveau du programme — c’est le but. Les pools existants ne sont pas affectés, car la vérification du mint s’exécute uniquement à la création du pool. Ce qui change, c’est que créer un nouveau pool CPMM pour l’un des quatre mints anciennement sur liste blanche nécessite que ce mint ait un PDA de registre — ceux qui importent en ont déjà un sur mainnet. L’image complète, y compris ce que le registre fait et ne fait pas contourner, se trouve dans reference/token-2022-support.

Élargissement du signataire ClosePermissionPda

CreatePermissionPda acceptait déjà soit l’admin partagé, soit une autorité créatrice de PDA de permission dédiée, tandis que ClosePermissionPda était épinglé à l’admin avec une contrainte address =. Le chemin de fermeture accepte désormais la même paire :
Donc l’autorité qui émet une subvention peut aussi la révoquer, sans passer par le multisig. L’erreur sur un signataire non autorisé est InvalidOwner (6001) de toute façon — la contrainte address = ancienne portait déjà cette erreur personnalisée — donc seul l’ensemble des signataires acceptés s’est élargi.

Changements de chaîne d’outils et de dépendances

Anchor 1.0 change deux choses à chaque site d’appel CPI, ce qui importe si vous intégrez CPMM à partir de votre propre programme : 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. Côté client, RequestBuilder::instructions() retourne Vec<Instruction> plutôt que Result<...>, CommitmentConfig provient de anchor_client au lieu de solana_sdk, et spl-associated-token-account 8.0 a déplacé ses aides d’adresse sous ::address et son ID de programme vers ::program::ID. Voir sdk-api/rust-cpi. Deux détails du système de compilation, aucun avec effet on-chain : la crate du programme déclare une fonctionnalité localnet qui compile le portefeuille local en tant que admin à partir d’une variable d’environnement CPSWAP_LOCALNET_ADMIN (donc les tests gérés par l’admin peuvent réellement signer — yarn test:local-admin le câble), et le bloc [profile.release] dupliqué dans programs/cp-swap/Cargo.toml a é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 — y compris le fait que le panic = "abort" du bloc au niveau du programme n’a jamais été appliqué.

Ce qui n’a pas changé

  • Chaque disposition de compte. PoolState, AmmConfig, ObservationState, Permission, SupportMintAssociated — mêmes tailles, mêmes décalages.
  • Codes d’erreur 60006014.
  • La liste d’autorisation des extensions elle-même. Toujours les mêmes cinq extensions.
  • Taux de frais, accumulation de frais et la courbe. CollectExcessLamports déplace les lamports qui n’ont jamais fait partie des réserves d’aucun pool.
  • spl_memo. La contrainte du programme mémo de Withdraw a été déplacée de spl_memo::id() à anchor_spl::memo::ID — la même adresse sous une exportation anchor-spl renommée.
  • ID du programme. Inchangé.

Pages mises à jour

  • products/cpmm/instructionsCollectExcessLamports ajouté avec sa liste de comptes et son tableau de distribution par propriétaire ; CreateAmmConfig gagne son argument creator_fee_rate et une note sur les propriétaires de frais fixes ; lignes de résumé d’instruction ajoutées pour CollectExcessLamports, CreateSupportMintAssociated, CloseSupportMintAssociated ; signataire ClosePermissionPda corrigé ; précondition Initialize réécrite pour le contournement du registre uniquement ; ligne de matrice de changement d’état ajoutée.
  • products/cpmm/accounts — Section Token-2022 réécrite autour du PDA du registre, avec la suppression de la liste blanche appelée ; signataire ClosePermissionPda corrigé.
  • products/cpmm/overview — phrase de liste blanche réécrite.
  • products/cpmm/code-demos — Squelette Rust CPI mis à jour pour Anchor 1.0.
  • reference/token-2022-support — section chemin de contournement réécrite autour du PDA du registre, avec la MINT_WHITELIST supprimée déplacée dans une section « contournements supprimés ».
  • reference/error-codes6015 documenté.
  • reference/program-addresses — nouvelles sections « Autorité du registre de support-mint CPMM », « Portefeuilles propriétaires de frais CPMM » et « Portefeuilles de collecte de lamports excédentaires » ; note ClosePermissionPda corrigée.
  • sdk-api/rust-cpi, solana-fundamentals/toolchain, integration-guides/cpi-integration — Épingles Anchor 1.0 et notes de migration CPI.
  • solana-fundamentals/rent-and-reclaimable-rent — nouvelle section « Ce que les programmes Raydium balayent de leur côté ».