> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 2026-09-09 — CPMM : Anchor 1.0, récupération des lamports excédentaires et propriétaires de frais fixes

> CPMM passe à Anchor 1.0.2 sur Agave 3.1.10 et ajoute une instruction admin CollectExcessLamports pour les rentes libérées par SIMD-0437. CreateAmmConfig écrit désormais les propriétaires de frais de protocole et de fonds codés en dur au lieu du signataire, la liste blanche de mint Token-2022 à quatre adresses est supprimée, et ClosePermissionPda accepte l'autorité de subvention dédiée. L'erreur 6015 est ajoutée.

<Info>
  **Cette page est traduite automatiquement par IA. La version anglaise fait foi.**

  [Voir la version anglaise →](/reference/changelog/2026-09-09-cpmm-anchor-1-and-excess-lamports)
</Info>

<Info>
  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`.
</Info>

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`](/fr/products/cpmm/instructions#collectexcesslamports).
* **Un code d'erreur est ajouté : `6015` `LamportsCalculateError`.** Les codes `6000`–`6014` 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](/fr/solana-fundamentals/rent-and-reclaimable-rent) 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`](/fr/reference/program-addresses#excess-lamports-collection-wallets).

## `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 :

```rust theme={null}
amm_config.protocol_owner = ctx.accounts.owner.key();
amm_config.fund_owner      = ctx.accounts.owner.key();
```

Il écrit désormais les constantes du programme :

```rust theme={null}
amm_config.protocol_owner = crate::protocol_fee_owner::ID;
amm_config.fund_owner      = crate::fund_fee_owner::ID;
```

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`](/fr/reference/program-addresses#cpmm-fee-owner-wallets).

<Warning>
  **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.
</Warning>

## 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`](/fr/reference/token-2022-support#bypass-paths).

## É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 :

```rust theme={null}
constraint = (owner.key() == crate::admin::ID
           || owner.key() == crate::create_permission_pda_owner::ID) @ ErrorCode::InvalidOwner
```

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

| Élément                                                                              | Avant                             | Après                                    |
| ------------------------------------------------------------------------------------ | --------------------------------- | ---------------------------------------- |
| `anchor-lang` / `anchor-spl`                                                         | `0.32.1`                          | `=1.0.2`                                 |
| `Anchor.toml` `solana_version`                                                       | `2.3.0`                           | `3.1.10`                                 |
| `solana-sdk` / `-client` / `-account-decoder` / `-transaction-status` (crate client) | `2.3.0`                           | `3.0`                                    |
| `anchor-client` / `-lang` / `-spl` (crate client)                                    | `0.32.1`                          | `=1.0.2`                                 |
| README : `rustup default`                                                            | `1.81.0`                          | `1.91.0`                                 |
| README : Installateur Solana                                                         | `release.anza.xyz/v2.1.0`         | `release.anza.xyz/v3.1.10`               |
| README : `avm install`                                                               | `0.31.0`                          | `1.0.2` (plus `avm use 1.0.2`)           |
| README : Dépôt Anchor                                                                | `coral-xyz/anchor`                | `solana-foundation/anchor`               |
| Image Docker                                                                         | `solanafoundation/anchor:v0.32.1` | `solanafoundation/anchor:v1.0.2`         |
| `@coral-xyz/anchor`                                                                  | `0.32.1`                          | remplacé par `@anchor-lang/core` `1.0.2` |
| `@solana/spl-token`                                                                  | `^0.4.8`                          | `^0.4.14`                                |
| `typescript`                                                                         | `^4.3.5`                          | `^5.6.3`                                 |

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`](/fr/sdk-api/rust-cpi#cargo-dependencies).

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 `6000`–`6014`.**
* **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/instructions` — `CollectExcessLamports` 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-codes` — `6015` 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é ».
