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

> CPMM berpindah ke Anchor 1.0.2 pada Agave 3.1.10 dan menambahkan instruksi admin CollectExcessLamports untuk rent yang dibebaskan oleh SIMD-0437. CreateAmmConfig sekarang menulis protocol dan fund fee owners yang hardcoded alih-alih penandatangan, whitelist mint Token-2022 empat alamat dihapus, dan ClosePermissionPda menerima dedicated grant authority. Error 6015 ditambahkan.

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

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

<Info>
  Entri ini mencakup pembaruan program CPMM yang akan datang. Telah diverifikasi terhadap cabang rilis lokal sebelum deployment. Konfirmasi program yang di-deploy sebelum mengandalkan instruksi baru atau perilaku `CreateAmmConfig` yang berubah.
</Info>

Perubahan utama CPMM adalah perpindahan framework: Anchor `0.32.1` ke `=1.0.2`, dan toolchain build dari Agave 2.3.0 ke 3.1.10. Bersama dengan itu ada empat perubahan perilaku, tiga di antaranya hanya penting untuk admin tooling dan satu — penghapusan whitelist mint — yang mengubah mint Token-2022 mana yang dapat digunakan untuk pool **baru**.

Semua yang dipanggil trader, LP, atau pool creator tetap memiliki account list, argument, dan math yang sama.

## TL;DR untuk integrator

* **Tidak ada instruksi yang menghadap pengguna yang berubah.** `Initialize`, `InitializeWithPermission`, `Deposit`, `Withdraw`, `SwapBaseInput`, `SwapBaseOutput`, dan keempat path `Collect*Fee` identik byte-for-byte. Tidak ada account layout yang berubah.
* **Satu instruksi ditambahkan: `CollectExcessLamports`.** Hanya admin, tanpa argument, sumber dilewatkan sebagai `remaining_accounts`. Mengembalikan lamports di atas minimum rent-exempt dari vault CPMM, LP mint, dan PDA, dan tidak menyentuh apa pun yang lain. Lihat [`products/cpmm/instructions`](/id/products/cpmm/instructions#collectexcesslamports).
* **Satu kode error ditambahkan: `6015` `LamportsCalculateError`.** Kode `6000`–`6014` tidak berubah.
* **`CreateAmmConfig` tidak lagi menyalin penandatangan ke dalam field fee-owner.** Config baru mendapatkan kunci `protocol_fee_owner` dan `fund_fee_owner` yang hardcoded. **Account `AmmConfig` yang sudah ada tidak tersentuh** — terus baca `protocol_owner` / `fund_owner` dari account daripada mengasumsikan nilai apa pun.
* **Hardcoded `MINT_WHITELIST` Token-2022 empat alamat sudah hilang.** Registry PDA `SupportMintAssociated` sekarang satu-satunya bypass CPMM dari extension allow-list. Pool yang sudah ada tidak terpengaruh; pemeriksaan berjalan hanya saat pembuatan pool.
* **`ClosePermissionPda` menerima dedicated permission-PDA creator authority,** bukan hanya admin bersama.
* **Refresh IDL diperlukan.** Satu instruksi baru, satu varian error baru.
* **Paket client TypeScript diubah nama.** `@coral-xyz/anchor` dibekukan di `0.32.1`; client Anchor 1.x dipublikasikan sebagai `@anchor-lang/core`.

## `CollectExcessLamports`

Langkah 1 dari [SIMD-0437](/id/solana-fundamentals/rent-and-reclaimable-rent) mendarat di mainnet pada 3 September 2026, mengurangi minimum rent-exempt sebesar 9% dengan empat langkah lagi akan datang. Setiap vault pool CPMM, LP mint, `PoolState`, `AmmConfig`, `ObservationState`, `Permission`, dan account `SupportMintAssociated` yang dibuat sebelum langkah sekarang over-funded, dan lamports dalam account yang dimiliki program hanya dapat dipindahkan oleh program itu.

Instruksi mengambil empat account tetap — wallet penandatangan/tujuan, PDA authority `vault_and_lp_mint_auth_seed`, dan **kedua** token program — kemudian sejumlah account sumber dalam `remaining_accounts`. Dispatch pada owner setiap account sumber: CPI ke `WithdrawExcessLamports` token program (discriminant `38`) untuk token account atau mint, debit langsung untuk PDA milik CPMM, dan diam-diam lewati apa pun yang lain.

Wrapped SOL adalah kasus yang perlu dipahami. Saldo lamport native token account *adalah* saldo token-nya, jadi kedua token program menolak `WithdrawExcessLamports` pada satu. CPMM malah CPI `SyncNative` (melipat excess yang disumbangkan ke wrapped `amount`), mengukur berapa banyak amount tumbuh, `UnwrapLamports` (discriminant `45`) untuk tepat delta itu, dan kemudian memerlukan wrapped balance sama dengan nilai pre-sync-nya — `LamportsCalculateError` jika tidak. **Vault pool sisi SOL mempertahankan likuiditas penuhnya melalui sweep**, dan tidak ada LP yang melihat perubahan harga di seluruhnya.

Penandatangan dapat berupa admin program bersama atau wallet collect-lamports dedicated; alamat ada di [`reference/program-addresses`](/id/reference/program-addresses#excess-lamports-collection-wallets).

## `CreateAmmConfig` menulis fixed fee owners

Sebelum rilis ini, `create_amm_config` menetapkan kedua field fee-owner dari penandatangan yang memanggil:

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

Sekarang menulis konstanta program sendiri:

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

Karena `CreateAmmConfig` di-gate ke `crate::admin::ID`, efek praktisnya adalah tier fee yang baru dibuat disapu oleh wallet operasional dedicated dari awal alih-alih oleh admin multisig, dan admin tidak dapat mengumpulkan dari config yang baru saja dibuat tanpa terlebih dahulu merotasi field melalui param `UpdateAmmConfig` `3` atau `4`.

Dua konstanta mengikuti pola `cfg` devnet/mainnet yang sama seperti alamat program lainnya, dan di devnet keduanya resolve ke kunci yang sama. Lihat [`reference/program-addresses`](/id/reference/program-addresses#cpmm-fee-owner-wallets).

<Warning>
  **Ini bukan migrasi.** Setiap `AmmConfig` yang sudah ada mempertahankan apa pun `protocol_owner` dan `fund_owner` yang dibuat dengannya. Alat koleksi yang mulai hardcoding konstanta baru akan gagal pada config yang lebih lama, dan satu yang mengasumsikan "kunci admin" akan gagal pada yang baru. Baca field-nya.
</Warning>

## Whitelist mint Token-2022 dihapus

`is_supported_mint` dulu short-circuit pada hardcoded `MINT_WHITELIST` dari empat alamat sebelum iterasi extension mint. Array itu — dan `HashSet` yang dibangun darinya pada setiap panggilan — dihapus. Yang tersisa adalah:

1. Legacy SPL Token mint lulus tanpa syarat.
2. Mint dengan initialized `SupportMintAssociated` PDA di `[b"support_mint", mint]` lulus tanpa syarat.
3. Jika tidak, setiap extension pada mint harus salah satu dari `TransferFeeConfig`, `MetadataPointer`, `TokenMetadata`, `InterestBearingConfig`, `ScaledUiAmount`.

Registry PDA telah ada di program untuk sementara, dengan pasangan `CreateSupportMintAssociated` / `CloseSupportMintAssociated` sendiri dan dedicated authority sendiri bersama admin bersama, dan dikonsultasikan dari `Initialize` dan `InitializeWithPermission`. Menghapus array statis berarti onboarding mint sekarang murni tindakan on-chain daripada upgrade program — yang merupakan intinya.

**Pool yang sudah ada tidak terpengaruh**, karena pemeriksaan mint berjalan hanya saat pembuatan pool. Yang berubah adalah membuat pool CPMM *baru* untuk salah satu dari empat mint yang dulunya di-whitelist memerlukan mint itu memiliki registry PDA — yang penting sudah ada di mainnet. Gambaran lengkap, termasuk apa yang dilakukan dan tidak dilakukan registry, ada di [`reference/token-2022-support`](/id/reference/token-2022-support#bypass-paths).

## Pelebaran penandatangan `ClosePermissionPda`

`CreatePermissionPda` sudah menerima admin bersama atau dedicated permission-PDA creator authority, sementara `ClosePermissionPda` dikunci ke admin dengan constraint `address =`. Path close sekarang mengambil pasangan yang sama:

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

Jadi authority yang mengeluarkan grant juga dapat mencabut, tanpa routing melalui multisig. Error pada penandatangan yang tidak sah adalah `InvalidOwner` (`6001`) kedua cara — constraint `address =` lama sudah membawa error kustom itu — jadi hanya set penandatangan yang diterima yang melebar.

## Perubahan toolchain dan dependency

| Item                                                                                 | Sebelum                           | Sesudah                                  |
| ------------------------------------------------------------------------------------ | --------------------------------- | ---------------------------------------- |
| `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` (client crate) | `2.3.0`                           | `3.0`                                    |
| `anchor-client` / `-lang` / `-spl` (client crate)                                    | `0.32.1`                          | `=1.0.2`                                 |
| README: `rustup default`                                                             | `1.81.0`                          | `1.91.0`                                 |
| README: Solana installer                                                             | `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: Anchor repo                                                                  | `coral-xyz/anchor`                | `solana-foundation/anchor`               |
| Docker image                                                                         | `solanafoundation/anchor:v0.32.1` | `solanafoundation/anchor:v1.0.2`         |
| `@coral-xyz/anchor`                                                                  | `0.32.1`                          | diganti oleh `@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 mengubah dua hal di setiap call site CPI, yang penting jika Anda mengintegrasikan CPMM dari program Anda sendiri: `CpiContext::new` mengambil `Pubkey` program daripada `AccountInfo`-nya, dan `Context` memiliki satu parameter lifetime alih-alih empat. Di sisi client `RequestBuilder::instructions()` mengembalikan `Vec<Instruction>` daripada `Result<...>`, `CommitmentConfig` berasal dari `anchor_client` alih-alih `solana_sdk`, dan `spl-associated-token-account` 8.0 memindahkan address helper-nya di bawah `::address` dan program ID-nya ke `::program::ID`. Lihat [`sdk-api/rust-cpi`](/id/sdk-api/rust-cpi#cargo-dependencies).

Dua detail build-system, tidak ada yang memiliki efek on-chain: crate program mendeklarasikan fitur `localnet` yang mengkompilasi wallet lokal sebagai `admin` dari variabel environment `CPSWAP_LOCALNET_ADMIN` (jadi test yang di-gate admin benar-benar dapat menandatangani — `yarn test:local-admin` menghubungkannya), dan blok `[profile.release]` duplikat di `programs/cp-swap/Cargo.toml` dihapus. Cargo mengabaikan `[profile]` di luar workspace root, jadi blok root sudah yang berlaku — termasuk fakta bahwa `panic = "abort"` blok level-program tidak pernah diterapkan.

## Apa yang tidak berubah

* **Setiap account layout.** `PoolState`, `AmmConfig`, `ObservationState`, `Permission`, `SupportMintAssociated` — ukuran sama, offset sama.
* **Error code `6000`–`6014`.**
* **Extension allow-list itu sendiri.** Masih lima extension yang sama.
* **Fee rate, fee accrual, dan curve.** `CollectExcessLamports` memindahkan lamports yang tidak pernah bagian dari reserve pool apa pun.
* **`spl_memo`.** Constraint memo-program `Withdraw` pindah dari `spl_memo::id()` ke `anchor_spl::memo::ID` — alamat yang sama di bawah export `anchor-spl` yang diubah nama.
* **Program ID.** Tidak berubah.

## Halaman yang diperbarui

* `products/cpmm/instructions` — `CollectExcessLamports` ditambahkan dengan account list dan tabel dispatch per-owner; `CreateAmmConfig` mendapat argument `creator_fee_rate` dan catatan pada fixed fee owners; baris ringkasan instruksi ditambahkan untuk `CollectExcessLamports`, `CreateSupportMintAssociated`, `CloseSupportMintAssociated`; penandatangan `ClosePermissionPda` dikoreksi; precondition `Initialize` ditulis ulang untuk bypass registry-only; baris matriks perubahan state ditambahkan.
* `products/cpmm/accounts` — bagian Token-2022 ditulis ulang di sekitar registry PDA, dengan penghapusan whitelist dipanggil; penandatangan `ClosePermissionPda` dikoreksi.
* `products/cpmm/overview` — kalimat whitelist ditulis ulang.
* `products/cpmm/code-demos` — skeleton Rust CPI diperbarui untuk Anchor 1.0.
* `reference/token-2022-support` — bagian bypass-path ditulis ulang di sekitar registry PDA, dengan `MINT_WHITELIST` yang dihapus dipindahkan ke bagian "removed bypasses".
* `reference/error-codes` — `6015` didokumentasikan.
* `reference/program-addresses` — bagian "CPMM support-mint registry authority", "CPMM fee-owner wallets", dan "Excess-lamports collection wallets" baru; catatan `ClosePermissionPda` dikoreksi.
* `sdk-api/rust-cpi`, `solana-fundamentals/toolchain`, `integration-guides/cpi-integration` — pin Anchor 1.0 dan catatan migrasi CPI.
* `solana-fundamentals/rent-and-reclaimable-rent` — bagian "What the Raydium programs sweep on their own side" baru.
