> ## 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、超額 lamports 回收與固定費用所有者

> CLMM 升級至 Anchor 1.0.2（基於 Agave 3.1.10），並新增管理員 CollectExcessLamports 指令以回收 SIMD-0437 釋放的租金，每次掃描一個資金池，由資金池 PDA 簽署。CreateAmmConfig 現在寫入硬編碼的協議與基金費用所有者，而非簽署者。新增錯誤代碼 6052。未改變任何使用者面向的指令或帳戶佈局。

<Info>
  **本頁內容由 AI 自動翻譯，所有內容以英文版本為準。**

  [查看英文版 →](/reference/changelog/2026-09-30-clmm-anchor-1-and-excess-lamports)
</Info>

<Info>
  本條目涵蓋即將推出的 CLMM 程式更新。在部署前已根據 `raydium-clmm` 的 `chore/upgrade-anchor` 分支（head `a72f9e1`）進行驗證。在依賴新指令或改變的 `CreateAmmConfig` 行為前，請確認已部署的程式。
</Info>

CLMM 現在獲得與 CPMM 和 LaunchLab 在 [2026-09-09](/zh-Hant/reference/changelog/2026-09-09-cpmm-anchor-1-and-excess-lamports) 推出的相同框架升級。Anchor 從 `0.32.1` 升級至 `=1.0.2`，建置工具鏈從 Agave 2.3.0 升級至 3.1.10。隨之而來的是兩項管理員端變更：新增 `CollectExcessLamports` 指令，以及 `CreateAmmConfig` 中的固定費用所有者。

交易者、流動性提供者、限價單使用者或資金池建立者呼叫的每項指令都保持其帳戶列表、參數與數學運算不變。

## 整合者速覽

* **未改變任何使用者面向的指令。** `CreatePool`、`CreateCustomizablePool`、`CreatePermissionedPool`、所有 `OpenPosition*` / `IncreaseLiquidity*` / `DecreaseLiquidity*` 路徑、`ClosePosition`、`Swap` / `SwapV2` / `SwapRouterBaseIn`、五項限價單指令與獎勵指令在網路上的位元組完全相同。未改變任何帳戶佈局。
* **新增一項指令：`CollectExcessLamports`。** 此指令僅限管理員使用，不接受任何參數。每次呼叫掃描**一個資金池**：資金池自身的 `PoolState` 始終被掃描，資金池 PDA 為其金庫簽署（你在 `remaining_accounts` 中傳入）。`remaining_accounts` 中任何其他 CLMM 擁有的帳戶也會被掃描。詳見 [`products/clmm/instructions`](/zh-Hant/products/clmm/instructions#collectexcesslamports)。
* **新增一項錯誤代碼：`6052` `LamportsCalculateError`。** 代碼 `6000`–`6051` 保持不變。
* **`CreateAmmConfig` 不再將簽署者複製到 `owner` / `fund_owner`。** 新配置獲得硬編碼的 `protocol_fee_owner` 與 `fund_fee_owner` 金鑰。在主網上，這些是已儲存在所有 21 個現有配置上的相同兩個金鑰。**現有的 `AmmConfig` 帳戶保持不變**，因此請繼續從帳戶讀取這些欄位。
* **重新整理你的 IDL。** 它新增一項指令與一項錯誤變體，共 39 項指令與 53 項錯誤。
* **你現在可以在一個 crate 中放置 CPMM 與 CLMM。** 兩個儲存庫在其 `chore/upgrade-anchor` 分支上都固定 `anchor-lang` / `anchor-spl` `=1.0.2`，因此單一程式可以 CPI 到兩者。詳見 [`sdk-api/rust-cpi`](/zh-Hant/sdk-api/rust-cpi#cargo-dependencies)。
* **TypeScript 客戶端套件已重新命名。** 測試套件從 `@coral-xyz/anchor` `0.32.1` 移至 `@anchor-lang/core` `1.0.2`。

## `CollectExcessLamports`

[SIMD-0437](/zh-Hant/solana-fundamentals/rent-and-reclaimable-rent) 的第 1 步在 2026 年 9 月 3 日於主網啟動。在步驟前建立的每個 CLMM 帳戶現在都過度資金化，只有 CLMM 程式可以將 lamports 移出其擁有的帳戶。這涵蓋資金池金庫、獎勵金庫、`PoolState`、`AmmConfig`、`ObservationState`、`TickArrayBitmapExtension` 等。

該指令接受四個固定帳戶，然後在 `remaining_accounts` 中接受任意數量的來源帳戶：

| # | 帳戶                               | 角色                                                                          |
| - | -------------------------------- | --------------------------------------------------------------------------- |
| 1 | `collect_lamports_wallet` (W, S) | 簽署者與目的地。必須是共享程式管理員或專用 CLMM 收集 lamports 錢包，否則呼叫失敗並返回 `NotApproved` (`6000`)。 |
| 2 | `pool_state` (W)                 | 透過其 PDA 種子簽署代幣程式 CPI，並始終被掃描自身。                                              |
| 3 | `token_program`                  | SPL Token。                                                                  |
| 4 | `token_program_2022`             | Token-2022。兩者都是必需的；程式根據來源帳戶選擇一個。                                            |

**資金池是簽署授權，而非程式範圍的 PDA。** CPMM 使用一個全域 `vault_and_lp_mint_auth_seed` 授權簽署。CLMM 代幣金庫由其 `PoolState` 擁有，因此單次呼叫只能為第 2 個位置中傳入的資金池簽署。每個代幣程式來源必須以該資金池作為其授權：`token_vault_0`、`token_vault_1` 或資金池的獎勵金庫之一。來自另一個資金池或使用者代幣帳戶的代幣帳戶會失敗代幣程式的所有者檢查並回滾整個指令。程式不會跳過它。位置 NFT 鑄造也不可掃描，因為當位置開啟時其鑄造授權被撤銷。逐個資金池掃描。

該指令進行兩次傳遞，順序是固定的：

1. **代幣程式 CPI 優先。** 對於由 SPL Token 或 Token-2022 擁有的每個來源，非原生帳戶獲得 `WithdrawExcessLamports`（判別式 `38`）。原生 wSOL 金庫獲得 `SyncNative` → `UnwrapLamports`（判別式 `45`）往返，以檢查包裝餘額等於其同步前值結束。如果不相等，呼叫失敗並返回 `LamportsCalculateError`。**SOL 端金庫保持其完整流動性**，掃描過程中沒有交換報價改變。
2. **直接扣款其次。** 第 2 次傳遞先扣款 `pool_state`，然後扣款每個由 CLMM 程式擁有的來源，直至 `rent.minimum_balance(data_len)`。

由任何其他程式擁有的來源會被無聲跳過。這個兩次傳遞順序是 CPMM 在 [2026-09-19](/zh-Hant/reference/changelog/2026-09-19-cpmm-creator-fee-protocol-share) 採用的。CLMM 從其首次發布就有此順序。如果 PDA 在 CPI 前被扣款，執行時會以 `UnbalancedInstruction` 中止，因此呼叫者可以按任意順序傳入來源。

<Warning>
  **程式擁有的傳遞不檢查帳戶屬於哪個資金池或使用者。** 任何由 CLMM 程式擁有的帳戶都符合條件，包括某些使用者支付租金的帳戶：`PersonalPositionState`、`LimitOrderState` 與 `TickArrayState`。只有超過租金豁免最低額的超額部分會移動。帳戶保持其資料並保持租金豁免。當位置或訂單稍後關閉時，程式退款帳戶此時持有的任何餘額。掃描後，該餘額是當前租金最低額。
</Warning>

錢包地址列在 [`reference/program-addresses`](/zh-Hant/reference/program-addresses#excess-lamports-collection-wallets)。

## `CreateAmmConfig` 寫入固定費用所有者

在此版本前，`create_amm_config` 從呼叫簽署者設定兩個費用所有者欄位：

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

現在它寫入程式自身的常數：

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

`CreateAmmConfig` 仍然限制於 `crate::admin::ID`。在此版本前，每個新費用層級都以管理員開始於兩個欄位中，並必須使用 `UpdateAmmConfig` 參數 `3` / `4` 進行輪換。現在它以操作錢包開始。在主網上，常數是已儲存為 `owner` / `fund_owner` 在所有 21 個現有配置上的相同金鑰。程式現在寫入操作過去手動設定的值。

收集簽署者不變。`CollectProtocolFee` 接受 `amm_config.owner` **或** `crate::admin::ID`，`CollectFundFee` 接受 `amm_config.fund_owner` **或** `crate::admin::ID`，在此版本前後都是如此。

在 devnet 上，兩個常數解析為相同金鑰。詳見 [`reference/program-addresses`](/zh-Hant/reference/program-addresses#clmm-fee-owner-wallets)。

<Warning>
  **這不是遷移。** 每個現有 `AmmConfig` 保持其已有的 `owner` 與 `fund_owner`。讀取欄位而非硬編碼常數或管理員金鑰。
</Warning>

## 工具鏈與依賴項變更

| 項目                                                                               | 前                                         | 後                                                                                                    |
| -------------------------------------------------------------------------------- | ----------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| `anchor-lang` / `anchor-spl`（程式）                                                 | `=0.32.1`                                 | `=1.0.2`                                                                                             |
| `Anchor.toml` 工具鏈                                                                | `[tool-chain]`、`solana-version = "2.3.0"` | `[toolchain]`、`solana_version = "3.1.10"`                                                            |
| 工作區 `Cargo.toml`                                                                 | —                                         | `[workspace.metadata.cli] solana = "3.1.10"`                                                         |
| `anchor-client` / `anchor-lang`（客戶端 crate）                                       | `0.32.1`                                  | `1.0.2`                                                                                              |
| `solana-sdk` / `-client` / `-account-decoder` / `-transaction-status`（客戶端 crate） | `2.3.0`                                   | `3`                                                                                                  |
| `spl-token` / `spl-token-2022`（客戶端 crate）                                        | `7.0.0` / `7.0.0`                         | `9.0` / `11.0`                                                                                       |
| `spl-associated-token-account` / `spl-memo` / `spl-token-client`（客戶端 crate）      | `6.0.0` / `6.0.0` / `0.14.0`              | `8.0` / `7.0` / `0.19`                                                                               |
| `mpl-token-metadata`（客戶端 crate）                                                  | `5.1.0`                                   | `=5.1.2-alpha.2`                                                                                     |
| 新客戶端 crate                                                                       | —                                         | `solana-system-interface` `3.2`、`solana-commitment-config` `3`、`solana-compute-budget-interface` `3` |
| Docker 映像                                                                        | `solanafoundation/anchor:v0.32.1`         | `solanafoundation/anchor:v1.0.2`                                                                     |
| `@coral-xyz/anchor`                                                              | `0.32.1`                                  | 由 `@anchor-lang/core` `1.0.2` 取代                                                                     |
| `typescript`                                                                     | `^4.3.5`                                  | `^5.6.3`                                                                                             |

Anchor 1.0 在 CPI 呼叫位置的變更與 CPMM 整合者已處理的相同。`CpiContext::new` 接受程式的 `Pubkey` 而非其 `AccountInfo`，`Context` 有一個生命週期參數而非四個。在客戶端 crate 中，`RequestBuilder::instructions()` 現在返回 `Vec<Instruction>` 而無 `Result`，`system_program` 移至 `solana-system-interface`。詳見 [`sdk-api/rust-cpi`](/zh-Hant/sdk-api/rust-cpi#cargo-dependencies)。

無鏈上效果的建置系統細節：

* **Localnet 管理員。** `localnet` 功能不再編譯由已提交夾具支持的固定測試金鑰。相反，它在建置時從 `CLMM_LOCALNET_ADMIN` 環境變數讀取管理員，`yarn test:local-admin` 從你的本地錢包設定此變數。夾具的 `.gitignore` 例外已移除。
* **發布設定檔。** `programs/amm/Cargo.toml` 中的重複 `[profile.release]` 區塊已刪除。Cargo 忽略工作區根外的 `[profile]`，因此根區塊已是生效的，程式級 `panic = "abort"` 從未被應用。
* **Anchor.toml。** `seeds = false` 變為 `resolution = true` 加 `skip-lint = false`，陳舊的 `[registry]` URL 已移除。
* **Lints。** `programs/amm/Cargo.toml` 為 Anchor 與 Solana 巨集發出的功能 cfg 新增 `[lints.rust] unexpected_cfgs` 允許清單。
* **README。** 在此分支上 README 仍告訴你從 `coral-xyz/anchor` 執行 `rustup default 1.86.0` 與 `avm install 0.32.1`。改為遵循 `Anchor.toml` 與 [`solana-fundamentals/toolchain`](/zh-Hant/solana-fundamentals/toolchain)。

## 未改變的內容

* **每個帳戶佈局。** `PoolState`、`AmmConfig`、`TickArrayState`、`TickArrayBitmapExtension`、`PersonalPositionState`、`ObservationState`、`LimitOrderState`、`DynamicFeeConfig`、`Permission` 與 `SupportMintAssociated` 保持相同的大小與偏移。
* **錯誤代碼 `6000`–`6051`。**
* **交換、流動性、費用、動態費用與限價單數學。** `CollectExcessLamports` 移動從未是任何資金池儲備一部分的 lamports。
* **位置 NFT 凍結**來自 [2026-08-17](/zh-Hant/reference/changelog/2026-08-17-clmm-restricted-position-nft-freeze)，包括資金池作為凍結授權規則與 `ClosePosition` 解凍路徑。
* **`spl_memo`。** `DecreaseLiquidityV2` 的備忘錄程式約束從 `spl_memo::id()` 移至 `anchor_spl::memo::ID`。兩者命名相同地址；`anchor-spl` 只是重新命名了匯出。
* **程式 ID。**

## 更新的頁面

* `products/clmm/instructions`：升級橫幅；`CollectExcessLamports` 部分含其帳戶列表、兩次傳遞分派表與每個資金池範圍；清單、管理員閘控與狀態變更矩陣列；`CollectProtocolFee` / `CollectFundFee` 上的費用所有者註記。
* `products/clmm/accounts`：`AmmConfig` 所有者註釋與 `CreateAmmConfig` 寫入內容的註記。
* `products/clmm/code-demos`：版本橫幅與 Rust CPI 骨架移至 Anchor 1.0。
* `products/cpmm/code-demos`：移除「無法與 CLMM 共享 crate」註記。
* `reference/error-codes`：`6052` 已記錄。
* `reference/program-addresses`：新增「CLMM 費用所有者錢包」部分；CLMM 新增至「超額 lamports 收集錢包」。
* `sdk-api/rust-cpi`、`sdk-api/anchor-idl`、`solana-fundamentals/toolchain`：`raydium-clmm` 的 Anchor 1.0 固定，crate 分割警告已停用。
* `solana-fundamentals/rent-and-reclaimable-rent`：CLMM 新增至「Raydium 程式在其自身端掃描的內容」。
* `security/admin-and-multisig`：CLMM 超額 lamports 收集者角色。
* `protocol-overview/versions-and-migration`：CLMM 升級歷史項目符號。
