> ## 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 — LaunchLab：Anchor 1.0、超額 lamports 回收及過渡閘道終止

> LaunchLab 升級至 Anchor 1.0.2 on Agave 3.1.10，並新增管理員 CollectExcessLamports 指令以回收 SIMD-0437 釋放的租金。三個過渡機制已停用：已棄用的 Initialize 現在總是失敗、MigrateToAmm 移除三個參數和九個 OpenBook 帳戶，時鐘型 get_upgrade_timestamp 閘道已刪除。錯誤代碼 6031 已新增。

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

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

<Info>
  本項目涵蓋即將推出的 LaunchLab 程式更新。在部署前已針對本地發佈分支進行驗證。在依賴新指令或變更的 `MigrateToAmm` 配置前，請確認已部署的程式。
</Info>

這是 LaunchLab 停止攜帶過渡架構的發佈版本。

三個獨立機制曾用於使早期升級順利進行：`get_upgrade_timestamp`（一個硬編碼的截止日期，多個檢查會將時鐘與其比較）、一個已棄用的 `Initialize`（在該日期後三天內仍可運作）以及 `MigrateToAmm` 的 OpenBook 管道（在 AMM v4 於七月[移除其自身 OpenBook 依賴](/zh-Hant/reference/changelog/2026-07-22-amm-v4-openbook-removal)後無法使用）。這三個機制現已全部移除。在主網上截止日期已過去數月，因此行為影響為零——但**失敗模式**已改變，且一個帳戶列表已大幅改變。

框架同時升級：Anchor `0.32.1` 升至 `=1.0.2`，Agave 2.3.0 升至 3.1.10。如同 AMM v4 和 CPMM，新增了一個管理員指令用於回收租金。

交易、費用、質押、曲線規則和平台設定保持不變。

## 整合者速覽

* **沒有交易指令改變其帳戶、參數或數學運算。** `BuyExactIn`、`BuyExactOut`、`SellExactIn`、`SellExactOut` 位元組相同。沒有帳戶配置改變。
* **`Initialize`（已棄用版本）現在總是以 `NotApproved`（`6000`）失敗，** 在讀取任何帳戶前。請使用 `InitializeV2`。已透過它建立的啟動項目可正常交易和畢業。
* **`MigrateToAmm` 對遷移錢包造成硬性破壞。** 它失去了全部三個參數（`base_lot_size`、`quote_lot_size`、`market_vault_signer_nonce`）和九個帳戶。詳見下文。
* **三個交易 `remaining_accounts` 現在無條件必需，** 且 `system_program` 插槽已驗證。省略它們的建構者現在總是以 `NotEnoughRemainingAccounts`（`6018`）失敗，而不是僅在截止日期後失敗。
* **新增一個指令：`CollectExcessLamports`。** 僅限管理員。詳見 [`products/launchlab/instructions`](/zh-Hant/products/launchlab/instructions#collectexcesslamports)。
* **新增一個錯誤代碼：`6031` `LamportsCalculateError`。** 代碼 `6000`–`6030` 保持不變。
* **三個 `MigrateToCpswap` 位址約束移至指令主體，** 將其錯誤從 `ConstraintAddress`（`2012`）改為 `RequireKeysEqViolated`（`2502`）。
* **需要 IDL 刷新。** 一個新指令、一組移除的參數、九個移除的帳戶、一個新的錯誤變體。

## `MigrateToAmm` 失去了 OpenBook 部分

這是最可能造成破壞的改變。舊指令資料在判別器後攜帶 17 位元組的參數；新資料是裸判別器。舊帳戶列表攜帶九個不再存在於結構中的帳戶，因此第一次移除後的所有內容都錯位了。

**移除的參數：** `base_lot_size: u64`、`quote_lot_size: u64`、`market_vault_signer_nonce: u8`。這三個參數僅用於設定程式曾透過 CPI 初始化的 OpenBook 市場。該 CPI——`initialize_openbook_market`——已消失，驗證 nonce 的 `gen_vault_signer_key` 檢查也一併消失。

**移除的帳戶：** `openbook_program`、`request_queue`、`event_queue`、`bids`、`asks`、`market_vault_signer`、`market_base_vault`、`market_quote_vault` 和 `amm_open_orders`。最後一個被移除是因為 AMM v4 的 `Initialize2` 不再接受它。

**`market` 帳戶保留，** 在其原始位置。AMM v4 仍將市場記錄為 `AmmInfo` 上的參考欄位，因此 LaunchLab 仍轉發它。關於它的兩件事改變了：程式不再初始化它，且它現在**完全未驗證**——其宣告是裸 `#[account(mut)]`，沒有所有者、位址或種子約束，因為 `owner = openbook_program.key()` 與 `openbook_program` 帳戶一起移除，沒有任何東西取代它。遷移錢包傳遞的任何內容都直接轉發至 AMM v4 的 `Initialize2` CPI 並記錄在新池上。想要該欄位後面有真正初始化市場的呼叫者必須事先建立它，程式不會告知否則。

產生的 23 帳戶列表完整記錄在 [`products/launchlab/instructions`](/zh-Hant/products/launchlab/instructions#migratetoamm-/-migratetocpswap)。

`MigrateToCpswap` 不受影響——它從未有參數，其帳戶列表保持不變。

## 已棄用的 `Initialize` 總是失敗

`initialize` 先前執行軟棄用：它在 `get_upgrade_timestamp() + 3 days` 前運作，然後返回 `NotApproved`。隨著時間戳幫助器被刪除，失敗現在無條件——處理器現在只是 `msg!` 和 `err!(NotApproved)`。

如果你在讀取日誌，有一個細節值得注意：`Accounts` 結構保持不變，仍攜帶四個 `init` 約束，因此 Anchor 生成的帳戶驗證序言在處理器返回前執行——並建立那些帳戶。無論如何交易都會還原，所以實際上沒有建立任何東西，但失敗出現在帳戶驗證之後而不是之前。

該指令被保留而不是移除，以便其判別器保持佔用且 IDL 保持穩定形狀。其參數和帳戶定義仍值得記錄以解碼歷史交易，頁面將它們保留在警告後面。

## `get_upgrade_timestamp` 閘道已消失

該幫助器在 `local` 和 `devnet` 功能下返回 `0`，否則返回硬編碼的主網時間戳 `1755522000`（2025-08-18 13:00 UTC）。四個指令將時鐘與其比較，跨越源中的五個參考。每個都無條件變成截止日期後分支：

| 呼叫位置                             | 之前                                                                                                          | 之後                                                                               |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| `distribute_trade_fee`（全部四個交易路徑） | 僅在截止日期後從 `remaining_accounts` 讀取 `system_program`、`platform_fee_vault`、`creator_fee_vault`；在此之前跳過平台/建立者費用分割 | 總是讀取全部三個，**且**要求 `system_program` 插槽等於 `System::id()` 或返回 `InvalidInput`（`6002`） |
| `migrate_to_cpswap`              | 之前選擇 `InitializeCpSwap`，之後選擇 `InitializeCpSwapWithPermission`                                               | 總是許可 CPI；舊版 `initialize_cpswap` 幫助器已刪除，十個剩餘帳戶最小值無條件                              |
| `initialize_with_token_2022`     | 截止日期前要求 `amm_fee_on == BothToken`；僅在之後執行平台曲線規則檢查                                                            | 無 `amm_fee_on` 限制；曲線規則檢查在設定 `restrict_curve_param` 時執行                           |
| `initialize`（已棄用）                | 僅在截止日期加三天後失敗                                                                                                | 總是失敗                                                                             |

主網時間戳已過去一年多，因此正確、最新的建構者看不到行為改變。改變的是**過時的**建構者現在確定性失敗，而不是看起來對 devnet 建構有效。新的 `system_program` 驗證是真正新的：該插槽先前接受任何帳戶。

## `CollectExcessLamports`

[SIMD-0437](/zh-Hant/solana-fundamentals/rent-and-reclaimable-rent) 的第 1 步於 2026 年 9 月 3 日在主網上線，將租金豁免最小值減少 9%，還有四個步驟待進行。每個在步驟前建立的 LaunchLab 池金庫、費用金庫和程式擁有的 PDA 現在都過度資金化。

該指令接受四個固定帳戶——簽署者/目標錢包、**一個**金庫授權 PDA 和兩個代幣程式——然後 `remaining_accounts` 中任意數量的源帳戶。

`authority` 插槽是值得仔細閱讀的部分。LaunchLab 有三個金庫授權 PDA（`vault_auth_seed`、`platform_fee_vault_auth_seed`、`creator_fee_vault_auth_seed`），指令透過重新推導全部三個並匹配來解析你傳遞的任何一個；不匹配任何一個的鑰匙以 `InvalidOwner`（`6001`）失敗。因為一個呼叫攜帶一個授權，且代幣程式要求每個帳戶的實際所有者簽署，**源帳戶必須按授權分組**——池金庫、平台費用金庫和建立者費用金庫在單獨的交易中清掃。程式擁有的 PDA 直接扣除，可與任何授權一起進行。

包裝的 SOL 遵循 CPMM 和 AMM v4 使用的相同 `SyncNative` → 增量大小 `UnwrapLamports` → 斷言不變序列，如果往返不淨為零則返回 `LamportsCalculateError`（`6031`）。SOL 報價的啟動項目保持其完整報價儲備。

**基礎鑄幣無法清掃。** `InitializeV2` 和 `InitializeWithToken2022` 在鑄造供應的同一指令中撤銷 `MintTokens`，因此沒有鑰匙可以簽署基礎鑄幣的 `WithdrawExcessLamports`。其租金被設計為擱置。

簽署者可以是共享程式管理員或專用收集 lamports 錢包；位址在 [`reference/program-addresses`](/zh-Hant/reference/program-addresses#excess-lamports-collection-wallets)。

## `MigrateToCpswap` 約束重定位

三個帳戶約束從 `Accounts` 結構移至指令主體：

```rust theme={null}
require_keys_eq!(ctx.accounts.platform_config.key(), ctx.accounts.pool_state.platform_config);
require_keys_eq!(ctx.accounts.base_vault.key(),      ctx.accounts.pool_state.base_vault);
require_keys_eq!(ctx.accounts.quote_vault.key(),     ctx.accounts.pool_state.quote_vault);
```

要求相同——全部三個仍必須匹配儲存在 `PoolState` 上的值。只有錯誤表面不同：Anchor 的通用 `RequireKeysEqViolated`（`2502`），報告時不帶帳戶名稱，而不是 `ConstraintAddress`（`2012`）命名違規帳戶。更新任何匹配這三個帳戶的 `2012` 的錯誤處理。

## 工具鏈和依賴變更

| 項目                             | 之前                        | 之後                                 |
| ------------------------------ | ------------------------- | ---------------------------------- |
| `anchor-lang` / `anchor-spl`   | `0.32.1`                  | `=1.0.2`                           |
| `Anchor.toml` `solana_version` | `2.3.0`                   | `3.1.10`                           |
| README：`rustup default`        | `1.81.0`                  | `1.91.0`                           |
| README：Solana 安裝程式             | `release.anza.xyz/v2.1.0` | `release.anza.xyz/v3.1.10`         |
| README：`avm install`           | `0.31.0`                  | `1.0.2`（加上 `avm use 1.0.2`）        |
| README：Anchor 儲存庫              | `coral-xyz/anchor`        | `solana-foundation/anchor`         |
| `@coral-xyz/anchor`            | `^0.32.1`                 | 由 `@anchor-lang/core` `1.0.2` 取代   |
| `@solana/spl-token`            | `^0.4.0`                  | `^0.4.14`                          |
| `typescript`                   | `^4.3.5`                  | `^5.6.3`                           |
| `tsconfig` target / lib        | `es6` / `es2015`          | `ES2020` / `es2020`、`skipLibCheck` |

Anchor 1.0 的兩個呼叫位置變更也適用於此：`Context` 從四個生命週期參數縮減為一個，`CpiContext::new` 接受程式的 `Pubkey` 而不是其 `AccountInfo`。詳見 [`sdk-api/rust-cpi`](/zh-Hant/sdk-api/rust-cpi#cargo-dependencies)。

兩個構建系統細節沒有鏈上效果：`local` 功能被 `localnet` 取代，它從 `LAUNCHPAD_LOCALNET_ADMIN` 環境變數編譯本地錢包作為 `admin`（`yarn test:local-admin` 連接它），`programs/launchpad/Cargo.toml` 中的重複 `[profile.release]` 區塊被刪除——Cargo 忽略工作區根外的 `[profile]`，因此根區塊已是有效的，包括程式級區塊的 `panic = "abort"` 從未應用的事實。

## 未改變的內容

* **每個帳戶配置。** `PoolState`、`GlobalConfig`、`PlatformConfig`、`PlatformCurveRule`、`PlatformAllowConfig`、質押記錄——相同大小、相同偏移。
* **錯誤代碼 `6000`–`6030`，** 包括故意保留的 `6020`。
* **曲線數學、費率、費用累積、質押時間表和畢業 LP 分割。**
* **平台曲線規則和 `GlobalConfig` 允許列表。** 相同指令、相同帳戶、相同語義；只有曲線規則檢查周圍的時鐘閘道消失。
* **`MigrateToCpswap` 的帳戶列表和 `remaining_accounts` 索引。**
* **Token-2022 轉移費用授權在畢業時的交接。**
* **程式 ID。** 保持不變。

## 更新的頁面

* `products/launchlab/instructions` — 新增 `CollectExcessLamports` 及其帳戶列表、授權解析表和分組警告；記錄 `MigrateToAmm` 的參數和帳戶移除及完整新列表；`Initialize` 前置總是失敗警告；新的「交易剩餘帳戶」部分涵蓋現在無條件的三個帳戶和 `system_program` 檢查；清單和狀態變更矩陣行。
* `products/launchlab/overview` — 發佈橫幅；「僅 CPMM」和基礎鑄幣不變量已更正。
* `products/launchlab/accounts` — 鑄幣授權撤銷時機已更正為啟動項目建立（之前記錄在畢業時）；新增 `CollectExcessLamports` 行。
* `reference/error-codes` — 記錄 `6031`。
* `reference/program-addresses` — 新的「超額 lamports 收集錢包」部分。
* `solana-fundamentals/rent-and-reclaimable-rent` — 新的「Raydium 程式在其自身側清掃的內容」部分。
* `sdk-api/rust-cpi`、`solana-fundamentals/toolchain` — Anchor 1.0 釘選和 CPI 遷移說明。
