> ## 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, excess-lamports recovery, dan fixed fee owners

> CLMM berpindah ke Anchor 1.0.2 pada Agave 3.1.10 dan menambahkan instruksi admin CollectExcessLamports untuk rent yang dibebaskan oleh SIMD-0437, disapu satu pool sekaligus dengan pool PDA sebagai penanda tangan. CreateAmmConfig sekarang menulis protocol dan fund fee owners yang dikodekan keras alih-alih penanda tangan. Error 6052 ditambahkan. Tidak ada instruksi atau tata letak akun yang menghadap pengguna yang berubah.

<Info>
  **Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.**

  [Lihat versi bahasa Inggris →](/reference/changelog/2026-09-30-clmm-anchor-1-and-excess-lamports)
</Info>

<Info>
  Entri ini mencakup pembaruan program CLMM yang akan datang. Entri ini diverifikasi terhadap cabang `chore/upgrade-anchor` dari `raydium-clmm` (head `a72f9e1`) sebelum penerapan. Konfirmasi program yang diterapkan sebelum mengandalkan instruksi baru atau perilaku `CreateAmmConfig` yang berubah.
</Info>

CLMM sekarang mendapatkan pergerakan kerangka kerja yang sama dengan CPMM dan LaunchLab yang dikirim pada [2026-09-09](/id/reference/changelog/2026-09-09-cpmm-anchor-1-and-excess-lamports). Anchor bergerak dari `0.32.1` ke `=1.0.2`, dan rantai alat pembangunan bergerak dari Agave 2.3.0 ke 3.1.10. Dua perubahan sisi admin berjalan beriringan: instruksi `CollectExcessLamports` baru, dan fee owners tetap dalam `CreateAmmConfig`.

Setiap instruksi yang dipanggil oleh pedagang, LP, pengguna limit-order atau pembuat pool mempertahankan daftar akun, argumen, dan matematikanya.

## TL;DR untuk integrator

* **Tidak ada instruksi yang menghadap pengguna yang berubah.** `CreatePool`, `CreateCustomizablePool`, `CreatePermissionedPool`, setiap jalur `OpenPosition*` / `IncreaseLiquidity*` / `DecreaseLiquidity*`, `ClosePosition`, `Swap` / `SwapV2` / `SwapRouterBaseIn`, lima instruksi limit-order dan instruksi reward identik byte di kawat. Tidak ada tata letak akun yang berubah.
* **Satu instruksi ditambahkan: `CollectExcessLamports`.** Ini hanya untuk admin dan tidak memerlukan argumen. Ini menyapu **satu pool per panggilan**: `PoolState` pool itu sendiri selalu disapu, dan pool PDA menandatangani vault-nya, yang Anda berikan dalam `remaining_accounts`. Akun milik CLMM lainnya dalam `remaining_accounts` juga disapu. Lihat [`products/clmm/instructions`](/id/products/clmm/instructions#collectexcesslamports).
* **Satu kode error ditambahkan: `6052` `LamportsCalculateError`.** Kode `6000`–`6051` tidak berubah.
* **`CreateAmmConfig` tidak lagi menyalin penanda tangan ke dalam `owner` / `fund_owner`.** Konfigurasi baru mendapatkan kunci `protocol_fee_owner` dan `fund_fee_owner` yang dikodekan keras. Di mainnet ini adalah dua kunci yang sama yang sudah disimpan di semua 21 konfigurasi yang ada. **Akun `AmmConfig` yang ada tidak tersentuh**, jadi terus baca bidang dari akun.
* **Segarkan IDL Anda.** Ini menambahkan satu instruksi dan satu varian error, untuk 39 instruksi dan 53 error.
* **Anda sekarang dapat menempatkan CPMM dan CLMM dalam satu crate.** Kedua repo menyematkan `anchor-lang` / `anchor-spl` `=1.0.2` pada cabang `chore/upgrade-anchor` mereka, jadi satu program dapat CPI ke keduanya. Lihat [`sdk-api/rust-cpi`](/id/sdk-api/rust-cpi#cargo-dependencies).
* **Paket klien TypeScript diubah nama.** Suite pengujian bergerak dari `@coral-xyz/anchor` `0.32.1` ke `@anchor-lang/core` `1.0.2`.

## `CollectExcessLamports`

Langkah 1 dari [SIMD-0437](/id/solana-fundamentals/rent-and-reclaimable-rent) diaktifkan di mainnet pada 3 September 2026. Setiap akun CLMM yang dibuat sebelum langkah sekarang kelebihan dana, dan hanya program CLMM yang dapat memindahkan lamport keluar dari akun yang dimilikinya. Itu mencakup pool vault, reward vault, `PoolState`, `AmmConfig`, `ObservationState`, `TickArrayBitmapExtension` dan sisanya.

Instruksi mengambil empat akun tetap, kemudian sejumlah akun sumber dalam `remaining_accounts`:

| # | Akun                             | Peran                                                                                                                                                             |
| - | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1 | `collect_lamports_wallet` (W, S) | Penanda tangan dan tujuan. Harus berupa admin program bersama atau wallet collect-lamports CLMM khusus, jika tidak panggilan gagal dengan `NotApproved` (`6000`). |
| 2 | `pool_state` (W)                 | Menandatangani CPI program token melalui benih PDA-nya, dan selalu disapu sendiri.                                                                                |
| 3 | `token_program`                  | SPL Token.                                                                                                                                                        |
| 4 | `token_program_2022`             | Token-2022. Keduanya diperlukan; program memilih satu per akun sumber.                                                                                            |

**Pool adalah otoritas penanda tangan, bukan PDA seluruh program.** CPMM menandatangani dengan satu otoritas global `vault_and_lp_mint_auth_seed`. Vault token CLMM dimiliki oleh `PoolState` mereka, jadi satu panggilan hanya dapat menandatangani pool yang dilewatkan di slot 2. Setiap sumber program token harus memiliki pool itu sebagai otoritasnya: `token_vault_0`, `token_vault_1`, atau salah satu reward vault pool. Akun token dari pool lain, atau akun token pengguna, gagal pemeriksaan pemilik program token dan mengembalikan seluruh instruksi. Program tidak melewatkannya. Mint NFT posisi juga tidak dapat disapu, karena otoritas mint mereka dibatalkan saat posisi dibuka. Sapu pool demi pool.

Instruksi membuat dua lintasan, dan urutan itu tetap:

1. **CPI program token terlebih dahulu.** Untuk setiap sumber yang dimiliki oleh SPL Token atau Token-2022, akun non-native mendapatkan `WithdrawExcessLamports` (discriminant `38`). Vault wSOL asli mendapatkan putaran `SyncNative` → `UnwrapLamports` (discriminant `45`), yang berakhir dengan pemeriksaan bahwa saldo yang dibungkus sama dengan nilai pra-sinknya. Jika tidak, panggilan gagal dengan `LamportsCalculateError`. **Vault sisi SOL mempertahankan likuiditas penuhnya**, dan tidak ada kutipan swap yang berubah di seluruh sapuan.
2. **Debit langsung kedua.** Lintasan 2 mendebit `pool_state` terlebih dahulu, kemudian setiap sumber yang dimiliki oleh program CLMM, turun ke `rent.minimum_balance(data_len)`.

Sumber yang dimiliki oleh program lain dilewatkan diam-diam. Urutan dua lintasan ini adalah yang diadopsi CPMM pada [2026-09-19](/id/reference/changelog/2026-09-19-cpmm-creator-fee-protocol-share). CLMM memilikinya sejak rilis pertamanya. Jika PDA didebit sebelum CPI, runtime membatalkan dengan `UnbalancedInstruction`, jadi pemanggil dapat melewatkan sumber dalam urutan apa pun.

<Warning>
  **Lintasan milik program tidak memeriksa pool atau pengguna mana yang dimiliki akun.** Akun apa pun yang dimiliki oleh program CLMM memenuhi syarat, termasuk beberapa yang rentnya dibayar pengguna: `PersonalPositionState`, `LimitOrderState`, dan `TickArrayState`. Hanya kelebihan di atas minimum bebas sewa yang bergerak. Akun mempertahankan datanya dan tetap bebas sewa. Ketika posisi atau pesanan ditutup nanti, program mengembalikan saldo apa pun yang dipegang akun pada saat itu. Setelah sapuan, saldo itu adalah minimum sewa saat ini.
</Warning>

Alamat wallet tercantum dalam [`reference/program-addresses`](/id/reference/program-addresses#excess-lamports-collection-wallets).

## `CreateAmmConfig` menulis fixed fee owners

Sebelum rilis ini, `create_amm_config` menetapkan kedua bidang fee-owner dari penanda tangan yang memanggil:

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

Sekarang menulis konstanta program sendiri:

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

`CreateAmmConfig` masih dijaga ke `crate::admin::ID`. Sebelum rilis ini, setiap tingkat biaya baru dimulai dengan admin di kedua bidang dan harus diputar dengan param `UpdateAmmConfig` `3` / `4`. Sekarang dimulai dengan wallet operasional. Di mainnet konstanta adalah kunci yang sama yang sudah disimpan sebagai `owner` / `fund_owner` di semua 21 konfigurasi yang ada. Program sekarang menulis nilai yang operasi gunakan untuk ditetapkan dengan tangan.

Penanda tangan koleksi tidak berubah. `CollectProtocolFee` menerima `amm_config.owner` **atau** `crate::admin::ID`, dan `CollectFundFee` menerima `amm_config.fund_owner` **atau** `crate::admin::ID`, keduanya sebelum dan sesudah rilis ini.

Di devnet, kedua konstanta diselesaikan ke kunci yang sama. Lihat [`reference/program-addresses`](/id/reference/program-addresses#clmm-fee-owner-wallets).

<Warning>
  **Ini bukan migrasi.** Setiap `AmmConfig` yang ada mempertahankan `owner` dan `fund_owner` yang sudah dimilikinya. Baca bidang daripada mengkodekan keras salah satu konstanta atau kunci admin.
</Warning>

## Perubahan rantai alat dan dependensi

| Item                                                                                 | Sebelum                                    | Sesudah                                                                                                |
| ------------------------------------------------------------------------------------ | ------------------------------------------ | ------------------------------------------------------------------------------------------------------ |
| `anchor-lang` / `anchor-spl` (program)                                               | `=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`                                                                                       |
| Client crates baru                                                                   | —                                          | `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`                                   | diganti dengan `@anchor-lang/core` `1.0.2`                                                             |
| `typescript`                                                                         | `^4.3.5`                                   | `^5.6.3`                                                                                               |

Perubahan Anchor 1.0 di situs panggilan CPI adalah yang sama yang sudah ditangani integrator CPMM. `CpiContext::new` mengambil `Pubkey` program daripada `AccountInfo`-nya, dan `Context` memiliki satu parameter lifetime alih-alih empat. Dalam client crate, `RequestBuilder::instructions()` sekarang mengembalikan `Vec<Instruction>` tanpa `Result`, dan `system_program` pindah ke `solana-system-interface`. Lihat [`sdk-api/rust-cpi`](/id/sdk-api/rust-cpi#cargo-dependencies).

Detail sistem pembangunan tanpa efek on-chain:

* **Admin localnet.** Fitur `localnet` tidak lagi mengompilasi kunci pengujian tetap yang didukung oleh fixture yang berkomitmen. Sebaliknya membaca admin dari variabel lingkungan `CLMM_LOCALNET_ADMIN` pada waktu pembangunan, yang `yarn test:local-admin` atur dari dompet lokal Anda. Pengecualian `.gitignore` fixture sudah hilang.
* **Release profile.** Blok `[profile.release]` duplikat dalam `programs/amm/Cargo.toml` dihapus. Cargo mengabaikan `[profile]` di luar akar workspace, jadi blok akar sudah yang berlaku, dan `panic = "abort"` tingkat program tidak pernah diterapkan.
* **Anchor.toml.** `seeds = false` menjadi `resolution = true` ditambah `skip-lint = false`, dan URL `[registry]` basi dihapus.
* **Lints.** `programs/amm/Cargo.toml` menambahkan daftar izin `[lints.rust] unexpected_cfgs` untuk feature cfgs yang dipancarkan makro Anchor dan Solana.
* **README.** Di cabang ini README masih memberi tahu Anda untuk menjalankan `rustup default 1.86.0` dan `avm install 0.32.1` dari `coral-xyz/anchor`. Ikuti `Anchor.toml` dan [`solana-fundamentals/toolchain`](/id/solana-fundamentals/toolchain) sebagai gantinya.

## Apa yang tidak berubah

* **Setiap tata letak akun.** `PoolState`, `AmmConfig`, `TickArrayState`, `TickArrayBitmapExtension`, `PersonalPositionState`, `ObservationState`, `LimitOrderState`, `DynamicFeeConfig`, `Permission` dan `SupportMintAssociated` mempertahankan ukuran dan offset yang sama.
* **Kode error `6000`–`6051`.**
* **Swap, likuiditas, biaya, dynamic-fee dan limit-order math.** `CollectExcessLamports` memindahkan lamport yang tidak pernah menjadi bagian dari cadangan pool apa pun.
* **Pembekuan NFT posisi** dari [2026-08-17](/id/reference/changelog/2026-08-17-clmm-restricted-position-nft-freeze), termasuk aturan pool-as-freeze-authority dan jalur thaw `ClosePosition`.
* **`spl_memo`.** Batasan program memo `DecreaseLiquidityV2` pindah dari `spl_memo::id()` ke `anchor_spl::memo::ID`. Keduanya menamai alamat yang sama; `anchor-spl` hanya mengganti nama ekspor.
* **Program ID.**

## Halaman yang diperbarui

* `products/clmm/instructions`: banner upgrade; bagian `CollectExcessLamports` dengan daftar akun, tabel dispatch dua lintasan dan scoping per-pool; baris inventaris, admin-gating dan state-change-matrix; catatan fee-owner pada `CollectProtocolFee` / `CollectFundFee`.
* `products/clmm/accounts`: komentar pemilik `AmmConfig` dan catatan tentang apa yang ditulis `CreateAmmConfig`.
* `products/clmm/code-demos`: banner versi dan kerangka CPI Rust dipindahkan ke Anchor 1.0.
* `products/cpmm/code-demos`: catatan "tidak dapat berbagi crate dengan CLMM" dihapus.
* `reference/error-codes`: `6052` didokumentasikan.
* `reference/program-addresses`: bagian "CLMM fee-owner wallets" baru; CLMM ditambahkan ke "Excess-lamports collection wallets".
* `sdk-api/rust-cpi`, `sdk-api/anchor-idl`, `solana-fundamentals/toolchain`: pin Anchor 1.0 untuk `raydium-clmm`, dan peringatan split-crate pensiun.
* `solana-fundamentals/rent-and-reclaimable-rent`: CLMM ditambahkan ke "What the Raydium programs sweep on their own side".
* `security/admin-and-multisig`: peran kolektor excess-lamports CLMM.
* `protocol-overview/versions-and-migration`: poin riwayat upgrade CLMM.
