> ## 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-30 — CLMM: Anchor 1.0, Rückgewinnung überschüssiger Lamports und feste Gebühreninhaber

> CLMM wechselt zu Anchor 1.0.2 auf Agave 3.1.10 und fügt eine Admin-Anweisung CollectExcessLamports für Miete hinzu, die durch SIMD-0437 freigegeben wird. Die Anweisung verarbeitet einen Pool pro Aufruf mit dem Pool-PDA als Unterzeichner. CreateAmmConfig schreibt jetzt hardcodierte Protokoll- und Fondsgebühreninhaber statt des Unterzeichners. Fehler 6052 wird hinzugefügt. Keine benutzergerichtete Anweisung oder Kontolayout hat sich geändert.

<Info>
  **Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.**

  [Englische Version ansehen →](/reference/changelog/2026-09-30-clmm-anchor-1-and-excess-lamports)
</Info>

CLMM erhält dieselbe Framework-Aktualisierung, die CPMM und LaunchLab am [2026-09-09](/de/reference/changelog/2026-09-09-cpmm-anchor-1-and-excess-lamports) erhalten haben. Anchor wechselt von `0.32.1` zu `=1.0.2`, und die Build-Toolchain wechselt von Agave 2.3.0 zu 3.1.10. Zwei administratorische Änderungen kommen hinzu: eine neue `CollectExcessLamports`-Anweisung und feste Gebühreninhaber in `CreateAmmConfig`.

Jede Anweisung, die ein Trader, ein LP, ein Limit-Order-Benutzer oder ein Pool-Ersteller aufruft, behält seine Kontoliste, Argumente und Mathematik.

## TL;DR für Integratoren

* **Keine benutzergerichtete Anweisung hat sich geändert.** `CreatePool`, `CreateCustomizablePool`, `CreatePermissionedPool`, alle `OpenPosition*` / `IncreaseLiquidity*` / `DecreaseLiquidity*`-Pfade, `ClosePosition`, `Swap` / `SwapV2` / `SwapRouterBaseIn`, die fünf Limit-Order-Anweisungen und die Reward-Anweisungen sind auf dem Draht identisch. Kein Kontolayout hat sich geändert.
* **Eine Anweisung wird hinzugefügt: `CollectExcessLamports`.** Sie ist nur für Administratoren und nimmt keine Argumente. Sie verarbeitet **einen Pool pro Aufruf**: Der `PoolState` des Pools wird immer verarbeitet, und der Pool-PDA unterzeichnet seine Vaults, die Sie in `remaining_accounts` übergeben. Jedes andere CLMM-eigene Konto in `remaining_accounts` wird ebenfalls verarbeitet. Siehe [`products/clmm/instructions`](/de/products/clmm/instructions#collectexcesslamports).
* **Ein Fehlercode wird hinzugefügt: `6052` `LamportsCalculateError`.** Codes `6000`–`6051` sind unverändert.
* **`CreateAmmConfig` kopiert den Unterzeichner nicht mehr in `owner` / `fund_owner`.** Neue Konfigurationen erhalten hardcodierte `protocol_fee_owner`- und `fund_fee_owner`-Schlüssel. Im Mainnet sind dies dieselben zwei Schlüssel, die bereits auf allen 21 bestehenden Konfigurationen gespeichert sind. **Bestehende `AmmConfig`-Konten bleiben unverändert**, lesen Sie also die Felder aus dem Konto.
* **Aktualisieren Sie Ihre IDL.** Sie fügt eine Anweisung und eine Fehler-Variante hinzu, insgesamt 39 Anweisungen und 53 Fehler.
* **Sie können jetzt CPMM und CLMM in einer Crate zusammenfassen.** Beide Repos pinnen `anchor-lang` / `anchor-spl` `=1.0.2` auf ihren `chore/upgrade-anchor`-Branches, sodass ein einzelnes Programm in beide CPIs durchführen kann. Siehe [`sdk-api/rust-cpi`](/de/sdk-api/rust-cpi#cargo-dependencies).
* **Das TypeScript-Client-Paket wird umbenannt.** Die Test-Suite wechselt von `@coral-xyz/anchor` `0.32.1` zu `@anchor-lang/core` `1.0.2`.

## `CollectExcessLamports`

Stufe 1 von [SIMD-0437](/de/solana-fundamentals/rent-and-reclaimable-rent) wurde am 3. September 2026 im Mainnet aktiviert. Jedes CLMM-Konto, das vor einer Stufe erstellt wurde, ist jetzt überfinanziert, und nur das CLMM-Programm kann Lamports aus einem Konto verschieben, das es besitzt. Das umfasst Pool-Vaults, Reward-Vaults, `PoolState`, `AmmConfig`, `ObservationState`, `TickArrayBitmapExtension` und den Rest.

Die Anweisung nimmt vier feste Konten, dann eine beliebige Anzahl von Quellkonten in `remaining_accounts`:

| # | Konto                            | Rolle                                                                                                                                                                                  |
| - | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1 | `collect_lamports_wallet` (W, S) | Unterzeichner und Ziel. Es muss der gemeinsame Programm-Administrator oder die dedizierte CLMM-Collect-Lamports-Wallet sein, sonst schlägt der Aufruf mit `NotApproved` (`6000`) fehl. |
| 2 | `pool_state` (W)                 | Unterzeichnet die Token-Programm-CPIs durch seine PDA-Seeds und wird immer selbst verarbeitet.                                                                                         |
| 3 | `token_program`                  | SPL Token.                                                                                                                                                                             |
| 4 | `token_program_2022`             | Token-2022. Beide sind erforderlich; das Programm wählt eines pro Quellkonto.                                                                                                          |

**Der Pool ist die Unterzeichnungsbehörde, nicht eine programmweite PDA.** CPMM unterzeichnet mit einer globalen `vault_and_lp_mint_auth_seed`-Behörde. CLMM-Token-Vaults gehören ihrem `PoolState`, sodass ein einzelner Aufruf nur für den in Slot 2 übergebenen Pool unterzeichnen kann. Jedes Token-Programm-Quellkonto muss diesen Pool als seine Behörde haben: `token_vault_0`, `token_vault_1` oder einen der Pool-Reward-Vaults. Ein Token-Konto aus einem anderen Pool oder ein Benutzer-Token-Konto schlägt die Eigentümerprüfung des Token-Programms fehl und setzt die gesamte Anweisung zurück. Das Programm überspringt es nicht. Position-NFT-Mints können nicht verarbeitet werden, da ihre Mint-Behörde widerrufen wird, wenn die Position geöffnet wird. Verarbeiten Sie Pool für Pool.

Die Anweisung macht zwei Durchläufe, und diese Reihenfolge ist festgelegt:

1. **Token-Programm-CPIs zuerst.** Für jede Quelle, die SPL Token oder Token-2022 gehört, erhält ein nicht-natives Konto `WithdrawExcessLamports` (Diskriminant `38`). Ein natives wSOL-Vault erhält die `SyncNative` → `UnwrapLamports` (Diskriminant `45`)-Rundreise, die mit einer Prüfung endet, dass der umhüllte Saldo seinem Wert vor der Synchronisierung entspricht. Wenn nicht, schlägt der Aufruf mit `LamportsCalculateError` fehl. **Ein SOL-seitiger Vault behält seine volle Liquidität**, und kein Swap-Angebot ändert sich über eine Verarbeitung hinweg.
2. **Direkte Belastungen zweite.** Durchlauf 2 belastet `pool_state` zuerst, dann jedes Quellkonto, das dem CLMM-Programm gehört, bis zu `rent.minimum_balance(data_len)`.

Quellkonten, die einem anderen Programm gehören, werden stillschweigend übersprungen. Diese Zwei-Durchlauf-Reihenfolge ist die, die CPMM am [2026-09-19](/de/reference/changelog/2026-09-19-cpmm-creator-fee-protocol-share) übernommen hat. CLMM hat sie seit seiner ersten Veröffentlichung. Wenn ein PDA vor einem CPI belastet wird, bricht die Laufzeit mit `UnbalancedInstruction` ab, sodass Aufrufer Quellen in beliebiger Reihenfolge übergeben können.

<Warning>
  **Der programmgeführte Durchlauf prüft nicht, welchem Pool oder Benutzer ein Konto gehört.** Jedes Konto, das dem CLMM-Programm gehört, ist berechtigt, einschließlich einiger, deren Miete ein Benutzer bezahlt hat: `PersonalPositionState`, `LimitOrderState` und `TickArrayState`. Nur der Überschuss über das Miete-Minimum wird verschoben. Das Konto behält seine Daten und bleibt mietbefreit. Wenn eine Position oder Bestellung später geschlossen wird, erstattet das Programm den Saldo zurück, den das Konto zu diesem Zeitpunkt hält. Nach einer Verarbeitung ist dieser Saldo das aktuelle Miete-Minimum.
</Warning>

Die Wallet-Adressen sind in [`reference/program-addresses`](/de/reference/program-addresses#excess-lamports-collection-wallets) aufgelistet.

## `CreateAmmConfig` schreibt feste Gebühreninhaber

Vor dieser Veröffentlichung setzte `create_amm_config` beide Gebühreninhaber-Felder vom aufrufenden Unterzeichner:

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

Es schreibt jetzt die eigenen Konstanten des Programms:

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

`CreateAmmConfig` ist immer noch auf `crate::admin::ID` beschränkt. Vor dieser Veröffentlichung startete jede neue Gebührenebene mit dem Administrator in beiden Feldern und musste mit `UpdateAmmConfig`-Parameter `3` / `4` rotiert werden. Jetzt startet sie mit den operativen Wallets. Im Mainnet sind die Konstanten dieselben Schlüssel, die bereits als `owner` / `fund_owner` auf allen 21 bestehenden Konfigurationen gespeichert sind. Das Programm schreibt jetzt einen Wert, den Operationen früher von Hand setzen mussten.

Collection-Unterzeichner ändern sich nicht. `CollectProtocolFee` akzeptiert `amm_config.owner` **oder** `crate::admin::ID`, und `CollectFundFee` akzeptiert `amm_config.fund_owner` **oder** `crate::admin::ID`, sowohl vor als auch nach dieser Veröffentlichung.

Im Devnet werden beide Konstanten auf denselben Schlüssel aufgelöst. Siehe [`reference/program-addresses`](/de/reference/program-addresses#clmm-fee-owner-wallets).

<Warning>
  **Dies ist keine Migration.** Jedes bestehende `AmmConfig` behält den `owner` und `fund_owner`, den es bereits hat. Lesen Sie die Felder, anstatt entweder die Konstanten oder den Administrator-Schlüssel hardcodiert zu verwenden.
</Warning>

## Toolchain- und Abhängigkeitsänderungen

| Element                                                                              | Vorher                                     | Nachher                                                                                                |
| ------------------------------------------------------------------------------------ | ------------------------------------------ | ------------------------------------------------------------------------------------------------------ |
| `anchor-lang` / `anchor-spl` (Programm)                                              | `=0.32.1`                                  | `=1.0.2`                                                                                               |
| `Anchor.toml` Toolchain                                                              | `[tool-chain]`, `solana-version = "2.3.0"` | `[toolchain]`, `solana_version = "3.1.10"`                                                             |
| Workspace `Cargo.toml`                                                               | —                                          | `[workspace.metadata.cli] solana = "3.1.10"`                                                           |
| `anchor-client` / `anchor-lang` (Client-Crate)                                       | `0.32.1`                                   | `1.0.2`                                                                                                |
| `solana-sdk` / `-client` / `-account-decoder` / `-transaction-status` (Client-Crate) | `2.3.0`                                    | `3`                                                                                                    |
| `spl-token` / `spl-token-2022` (Client-Crate)                                        | `7.0.0` / `7.0.0`                          | `9.0` / `11.0`                                                                                         |
| `spl-associated-token-account` / `spl-memo` / `spl-token-client` (Client-Crate)      | `6.0.0` / `6.0.0` / `0.14.0`               | `8.0` / `7.0` / `0.19`                                                                                 |
| `mpl-token-metadata` (Client-Crate)                                                  | `5.1.0`                                    | `=5.1.2-alpha.2`                                                                                       |
| Neue Client-Crates                                                                   | —                                          | `solana-system-interface` `3.2`, `solana-commitment-config` `3`, `solana-compute-budget-interface` `3` |
| Docker-Image                                                                         | `solanafoundation/anchor:v0.32.1`          | `solanafoundation/anchor:v1.0.2`                                                                       |
| `@coral-xyz/anchor`                                                                  | `0.32.1`                                   | ersetzt durch `@anchor-lang/core` `1.0.2`                                                              |
| `typescript`                                                                         | `^4.3.5`                                   | `^5.6.3`                                                                                               |

Die Anchor-1.0-Änderungen an CPI-Aufrufstellen sind dieselben, die CPMM-Integratoren bereits bearbeitet haben. `CpiContext::new` nimmt den `Pubkey` des Programms statt seines `AccountInfo`, und `Context` hat einen Lifetime-Parameter statt vier. In der Client-Crate gibt `RequestBuilder::instructions()` jetzt `Vec<Instruction>` ohne `Result` zurück, und `system_program` wurde zu `solana-system-interface` verschoben. Siehe [`sdk-api/rust-cpi`](/de/sdk-api/rust-cpi#cargo-dependencies).

Build-System-Details ohne On-Chain-Effekt:

* **Localnet-Administrator.** Das `localnet`-Feature kompiliert nicht mehr einen festen Test-Schlüssel, der durch eine committed Fixture gestützt wird. Stattdessen liest es den Administrator aus der `CLMM_LOCALNET_ADMIN`-Umgebungsvariable zur Build-Zeit, die `yarn test:local-admin` aus Ihrer lokalen Wallet setzt. Die `.gitignore`-Ausnahme der Fixture ist weg.
* **Release-Profil.** Der doppelte `[profile.release]`-Block in `programs/amm/Cargo.toml` wurde gelöscht. Cargo ignoriert `[profile]` außerhalb des Workspace-Roots, sodass der Root-Block bereits der gültige war, und das Programm-Level `panic = "abort"` wurde nie angewendet.
* **Anchor.toml.** `seeds = false` wird zu `resolution = true` plus `skip-lint = false`, und die veraltete `[registry]`-URL wird entfernt.
* **Lints.** `programs/amm/Cargo.toml` fügt eine `[lints.rust] unexpected_cfgs`-Allowlist für die Feature-Cfgs hinzu, die die Anchor- und Solana-Makros ausgeben.
* **README.** Auf diesem Branch sagt Ihnen das README immer noch, `rustup default 1.86.0` und `avm install 0.32.1` von `coral-xyz/anchor` auszuführen. Folgen Sie stattdessen `Anchor.toml` und [`solana-fundamentals/toolchain`](/de/solana-fundamentals/toolchain).

## Was sich nicht geändert hat

* **Jedes Kontolayout.** `PoolState`, `AmmConfig`, `TickArrayState`, `TickArrayBitmapExtension`, `PersonalPositionState`, `ObservationState`, `LimitOrderState`, `DynamicFeeConfig`, `Permission` und `SupportMintAssociated` behalten dieselben Größen und Offsets.
* **Fehlercodes `6000`–`6051`.**
* **Swap-, Liquiditäts-, Gebühren-, dynamische Gebühren- und Limit-Order-Mathematik.** `CollectExcessLamports` verschiebt Lamports, die nie Teil der Reserven eines Pools waren.
* **Position-NFT-Einfrieren** von [2026-08-17](/de/reference/changelog/2026-08-17-clmm-restricted-position-nft-freeze), einschließlich der Pool-als-Freeze-Authority-Regel und des `ClosePosition`-Auftau-Pfads.
* **`spl_memo`.** Die Memo-Programm-Einschränkung von `DecreaseLiquidityV2` wurde von `spl_memo::id()` zu `anchor_spl::memo::ID` verschoben. Beide benennen dieselbe Adresse; `anchor-spl` hat nur den Export umbenannt.
* **Programm-ID.**

## Aktualisierte Seiten

* `products/clmm/instructions`: Upgrade-Banner; `CollectExcessLamports`-Abschnitt mit seiner Kontoliste, Zwei-Durchlauf-Dispatch-Tabelle und Pro-Pool-Scoping; Inventar-, Admin-Gating- und State-Change-Matrix-Zeilen; Gebühreninhaber-Notiz auf `CollectProtocolFee` / `CollectFundFee`.
* `products/clmm/accounts`: `AmmConfig`-Eigentümer-Kommentare und eine Notiz darüber, was `CreateAmmConfig` schreibt.
* `products/clmm/code-demos`: Versions-Banner und Rust-CPI-Skelett zu Anchor 1.0 verschoben.
* `products/cpmm/code-demos`: Die Notiz „kann eine Crate nicht mit CLMM teilen" entfernt.
* `reference/error-codes`: `6052` dokumentiert.
* `reference/program-addresses`: neuer Abschnitt „CLMM-Gebühreninhaber-Wallets"; CLMM zu „Excess-Lamports-Collection-Wallets" hinzugefügt.
* `sdk-api/rust-cpi`, `sdk-api/anchor-idl`, `solana-fundamentals/toolchain`: Anchor-1.0-Pins für `raydium-clmm`, und die Crate-Split-Warnung in den Ruhestand versetzt.
* `solana-fundamentals/rent-and-reclaimable-rent`: CLMM zu „Was die Raydium-Programme auf ihrer eigenen Seite verarbeiten" hinzugefügt.
* `security/admin-and-multisig`: CLMM-Excess-Lamports-Collector-Rolle.
* `protocol-overview/versions-and-migration`: CLMM-Upgrade-Verlauf-Punkt.
