> ## 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, excess-lamports recovery, và kết thúc các cơ chế chuyển tiếp

> LaunchLab chuyển sang Anchor 1.0.2 trên Agave 3.1.10 và thêm lệnh admin CollectExcessLamports để thu hồi rent được giải phóng bởi SIMD-0437. Ba cơ chế chuyển tiếp bị loại bỏ: Initialize không dùng nữa giờ luôn thất bại, MigrateToAmm mất ba tham số và chín tài khoản OpenBook, và cổng get_upgrade_timestamp dựa trên clock bị xóa. Lỗi 6031 được thêm vào.

<Info>
  **Trang này được dịch tự động bằng AI. Phiên bản tiếng Anh là bản chính thức.**

  [Xem bản tiếng Anh →](/reference/changelog/2026-09-09-launchlab-anchor-1-and-excess-lamports)
</Info>

<Info>
  Mục này bao gồm một bản cập nhật chương trình LaunchLab sắp tới. Nó đã được xác minh so với nhánh phát hành cục bộ trước khi triển khai. Hãy xác nhận chương trình được triển khai trước khi dựa vào lệnh mới hoặc bố cục `MigrateToAmm` đã thay đổi.
</Info>

Đây là bản phát hành nơi LaunchLab dừng mang theo các giàn giáo chuyển tiếp của nó.

Ba cơ chế riêng biệt tồn tại để làm cho các bản nâng cấp trước đó hạ cánh mềm mại: `get_upgrade_timestamp`, một ngày cắt ngang được mã hóa cứng mà một số kiểm tra so sánh clock với; một `Initialize` không dùng nữa giữ hoạt động trong ba ngày sau ngày đó; và đường ống OpenBook của `MigrateToAmm`, không có gì để nói chuyện sau khi AMM v4 [loại bỏ phụ thuộc OpenBook của riêng nó](/vi/reference/changelog/2026-07-22-amm-v4-openbook-removal) vào tháng 7. Cả ba đều biến mất. Trên mainnet, ngày cắt ngang đã qua nhiều tháng, vì vậy hiệu ứng hành vi là không có — nhưng các *chế độ lỗi* đã thay đổi, và một danh sách tài khoản đã thay đổi rất nhiều.

Framework cũng chuyển động cùng lúc: Anchor `0.32.1` sang `=1.0.2`, Agave 2.3.0 sang 3.1.10. Và, giống như trên AMM v4 và CPMM, có một lệnh admin mới để thu hồi rent.

Giao dịch, phí, vesting, quy tắc đường cong và cấu hình nền tảng không thay đổi.

## TL;DR cho các nhà tích hợp

* **Không có lệnh giao dịch nào thay đổi tài khoản, tham số hoặc toán học của nó.** `BuyExactIn`, `BuyExactOut`, `SellExactIn`, `SellExactOut` giống hệt nhau từng byte. Không có bố cục tài khoản nào thay đổi.
* **`Initialize` (cái không dùng nữa) giờ luôn thất bại với `NotApproved` (`6000`),** trước khi đọc bất kỳ tài khoản nào. Sử dụng `InitializeV2`. Các lần phát hành đã được tạo thông qua nó giao dịch và tốt nghiệp bình thường.
* **`MigrateToAmm` là sự phá vỡ cứng cho ví di chuyển.** Nó mất cả ba tham số (`base_lot_size`, `quote_lot_size`, `market_vault_signer_nonce`) và chín tài khoản. Xem bên dưới.
* **Ba `remaining_accounts` giao dịch giờ được yêu cầu vô điều kiện,** và slot `system_program` được xác thực. Một trình xây dựng bỏ qua chúng giờ luôn thất bại với `NotEnoughRemainingAccounts` (`6018`) thay vì chỉ sau ngày cắt ngang.
* **Một lệnh được thêm: `CollectExcessLamports`.** Chỉ dành cho admin. Xem [`products/launchlab/instructions`](/vi/products/launchlab/instructions#collectexcesslamports).
* **Một mã lỗi được thêm: `6031` `LamportsCalculateError`.** Các mã `6000`–`6030` không thay đổi.
* **Ba ràng buộc địa chỉ `MigrateToCpswap` được chuyển vào phần thân lệnh,** thay đổi lỗi của chúng từ `ConstraintAddress` (`2012`) thành `RequireKeysEqViolated` (`2502`).
* **Cần làm mới IDL.** Một lệnh mới, một bộ tham số bị xóa, chín tài khoản bị xóa, một biến thể lỗi mới.

## `MigrateToAmm` mất nửa OpenBook của nó

Đây là thay đổi có khả năng phá vỡ điều gì đó nhất. Dữ liệu lệnh cũ mang 17 byte tham số sau discriminator; dữ liệu mới là discriminator trần. Danh sách tài khoản cũ mang chín tài khoản không còn tồn tại trong struct, vì vậy mọi thứ sau lần loại bỏ đầu tiên không được căn chỉnh.

**Tham số bị xóa:** `base_lot_size: u64`, `quote_lot_size: u64`, `market_vault_signer_nonce: u8`. Cả ba chỉ tồn tại để cấu hình thị trường OpenBook mà chương trình từng khởi tạo bằng CPI. CPI đó — `initialize_openbook_market` — đã biến mất, cùng với kiểm tra `gen_vault_signer_key` xác thực nonce.

**Tài khoản bị xóa:** `openbook_program`, `request_queue`, `event_queue`, `bids`, `asks`, `market_vault_signer`, `market_base_vault`, `market_quote_vault`, và `amm_open_orders`. Cái cuối cùng biến mất vì `Initialize2` của AMM v4 không còn lấy nó.

**Tài khoản `market` vẫn ở lại**, ở vị trí ban đầu của nó. AMM v4 vẫn ghi lại thị trường dưới dạng trường tham chiếu trên `AmmInfo`, vì vậy LaunchLab vẫn chuyển tiếp nó. Hai điều về nó đã thay đổi: chương trình không còn khởi tạo nó, và nó giờ **hoàn toàn không được xác thực** — khai báo của nó là một `#[account(mut)]` trần không có ràng buộc chủ sở hữu, địa chỉ hoặc seed, vì `owner = openbook_program.key()` đã được loại bỏ cùng với tài khoản `openbook_program` và không có gì thay thế nó. Bất kỳ tài khoản nào mà ví di chuyển chuyển tiếp đó được chuyển tiếp trực tiếp vào CPI `Initialize2` của AMM v4 và được ghi lại trên pool mới. Một người gọi muốn một thị trường được khởi tạo thực sự đằng sau trường đó phải tạo nó trước đó, và chương trình sẽ không cho nó biết ngược lại.

Danh sách 23 tài khoản kết quả được ghi lại đầy đủ trên [`products/launchlab/instructions`](/vi/products/launchlab/instructions#migratetoamm-/-migratetocpswap).

`MigrateToCpswap` không bị ảnh hưởng — nó không bao giờ có tham số, và danh sách tài khoản của nó không thay đổi.

## `Initialize` không dùng nữa luôn thất bại

`initialize` trước đây chạy một khấu hao mềm: nó hoạt động cho đến `get_upgrade_timestamp() + 3 days`, sau đó trả về `NotApproved`. Với trình trợ giúp timestamp bị xóa, lỗi là vô điều kiện — trình xử lý giờ là một `msg!` và `err!(NotApproved)` và không có gì khác.

Một chi tiết nếu bạn đang đọc nhật ký: struct `Accounts` không thay đổi và vẫn mang bốn ràng buộc `init`, vì vậy phần mở đầu xác thực tài khoản do Anchor tạo ra chạy — và tạo những tài khoản đó — trước khi trình xử lý trả về. Giao dịch hoàn nguyên dù sao, vì vậy không có gì thực sự được tạo, nhưng lỗi xuất hiện sau xác thực tài khoản thay vì trước nó.

Lệnh được giữ lại thay vì bị xóa để discriminator của nó vẫn bị chiếm dụng và IDL giữ một hình dạng ổn định. Các định nghĩa tham số và tài khoản của nó vẫn đáng có để ghi lại để giải mã các giao dịch lịch sử, và trang giữ chúng phía sau một cảnh báo.

## Cổng `get_upgrade_timestamp` đã biến mất

Trình trợ giúp trả về `0` dưới các tính năng `local` và `devnet` và timestamp mainnet được mã hóa cứng `1755522000` (2025-08-18 13:00 UTC) ngoài ra. Bốn lệnh so sánh clock với nó, trên năm tham chiếu trong nguồn. Mỗi cái trở thành nhánh sau cắt ngang vô điều kiện:

| Trang web gọi                                       | Trước                                                                                                                                                       | Sau                                                                                                                               |
| --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `distribute_trade_fee` (tất cả bốn đường giao dịch) | Đọc `system_program`, `platform_fee_vault`, `creator_fee_vault` từ `remaining_accounts` chỉ sau cắt ngang; bỏ qua phân chia phí nền tảng/người tạo trước nó | Luôn đọc cả ba, **và** yêu cầu slot `system_program` bằng `System::id()` hoặc trả về `InvalidInput` (`6002`)                      |
| `migrate_to_cpswap`                                 | Chọn `InitializeCpSwap` trước, `InitializeCpSwapWithPermission` sau                                                                                         | Luôn là CPI được phép; trình trợ giúp `initialize_cpswap` kế thừa bị xóa, và mức tối thiểu mười tài khoản còn lại là vô điều kiện |
| `initialize_with_token_2022`                        | Yêu cầu `amm_fee_on == BothToken` trước cắt ngang; chạy kiểm tra quy tắc đường cong nền tảng chỉ sau nó                                                     | Không có hạn chế `amm_fee_on`; kiểm tra quy tắc đường cong chạy bất cứ khi nào `restrict_curve_param` được đặt                    |
| `initialize` (không dùng nữa)                       | Thất bại chỉ sau cắt ngang cộng ba ngày                                                                                                                     | Luôn thất bại                                                                                                                     |

Timestamp mainnet đã qua hơn một năm, vì vậy một trình xây dựng chính xác, cập nhật thấy không có thay đổi hành vi. Những gì đã thay đổi là một trình xây dựng **lỗi thời** giờ thất bại một cách xác định thay vì dường như hoạt động chống lại bản dựng devnet. Xác thực `system_program` mới là thực sự mới: slot đó trước đây chấp nhận bất kỳ tài khoản nào.

## `CollectExcessLamports`

Bước 1 của [SIMD-0437](/vi/solana-fundamentals/rent-and-reclaimable-rent) hạ cánh trên mainnet vào ngày 3 tháng 9 năm 2026, cắt mức tối thiểu miễn phí rent xuống 9% với bốn bước nữa sắp tới. Mỗi vault pool LaunchLab, vault phí và PDA sở hữu chương trình được tạo trước một bước giờ được tài trợ quá mức.

Lệnh lấy bốn tài khoản cố định — ví người ký/đích, **một** PDA quyền vault, và cả hai chương trình token — sau đó bất kỳ số lượng tài khoản nguồn nào trong `remaining_accounts`.

Slot `authority` là phần đáng đọc cẩn thận. LaunchLab có ba PDA quyền vault (`vault_auth_seed`, `platform_fee_vault_auth_seed`, `creator_fee_vault_auth_seed`), và lệnh giải quyết cái bạn chuyển bằng cách lấy lại tất cả ba và khớp; một khóa không khớp bất kỳ cái nào thất bại với `InvalidOwner` (`6001`). Vì một lệnh mang một quyền và chương trình token yêu cầu chủ sở hữu thực tế của mỗi tài khoản ký, **tài khoản nguồn phải được nhóm theo quyền** — vault pool, vault phí nền tảng và vault phí người tạo quét trong các giao dịch riêng biệt. PDA sở hữu chương trình được ghi nợ trực tiếp và có thể đi cùng với bất kỳ quyền nào.

Wrapped SOL theo cùng một chuỗi `SyncNative` → `UnwrapLamports` có kích thước delta → assert-unchanged mà CPMM và AMM v4 sử dụng, với `LamportsCalculateError` (`6031`) nếu vòng lặp không lưới bằng không. Một lần phát hành được trích dẫn SOL giữ toàn bộ dự trữ trích dẫn của nó.

**Các mint cơ sở không thể được quét.** `InitializeV2` và `InitializeWithToken2022` thu hồi `MintTokens` trong cùng một lệnh khởi tạo cung cấp, vì vậy không có khóa nào có thể ký `WithdrawExcessLamports` cho một mint cơ sở. Rent của nó bị mắc kẹt bằng thiết kế.

Người ký có thể là admin chương trình được chia sẻ hoặc ví thu thập lamports chuyên dụng; địa chỉ nằm trong [`reference/program-addresses`](/vi/reference/program-addresses#excess-lamports-collection-wallets).

## Chuyển vị trí ràng buộc `MigrateToCpswap`

Ba ràng buộc tài khoản được chuyển ra khỏi struct `Accounts` và vào phần thân lệnh:

```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);
```

Yêu cầu là giống hệt — cả ba phải vẫn khớp với các giá trị được lưu trữ trên `PoolState`. Chỉ bề mặt lỗi khác: `RequireKeysEqViolated` (`2502`) chung của Anchor, được báo cáo mà không có tên tài khoản, thay vì `ConstraintAddress` (`2012`) đặt tên tài khoản vi phạm. Cập nhật bất kỳ xử lý lỗi nào khớp với `2012` cho ba tài khoản này.

## Thay đổi toolchain và phụ thuộc

| Mục                            | Trước                     | Sau                                       |
| ------------------------------ | ------------------------- | ----------------------------------------- |
| `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 installer       | `release.anza.xyz/v2.1.0` | `release.anza.xyz/v3.1.10`                |
| README: `avm install`          | `0.31.0`                  | `1.0.2` (cộng `avm use 1.0.2`)            |
| README: Anchor repo            | `coral-xyz/anchor`        | `solana-foundation/anchor`                |
| `@coral-xyz/anchor`            | `^0.32.1`                 | thay thế bằng `@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`       |

Hai thay đổi trang web gọi của Anchor 1.0 cũng áp dụng ở đây: `Context` sụp đổ từ bốn tham số vòng đời thành một, và `CpiContext::new` lấy `Pubkey` của chương trình thay vì `AccountInfo` của nó. Xem [`sdk-api/rust-cpi`](/vi/sdk-api/rust-cpi#cargo-dependencies).

Hai chi tiết hệ thống xây dựng không có hiệu ứng trên chuỗi: tính năng `local` được thay thế bằng `localnet`, biên dịch ví cục bộ như `admin` từ biến môi trường `LAUNCHPAD_LOCALNET_ADMIN` (`yarn test:local-admin` kết nối nó), và khối `[profile.release]` trùng lặp trong `programs/launchpad/Cargo.toml` đã bị xóa — Cargo bỏ qua `[profile]` bên ngoài gốc không gian làm việc, vì vậy khối gốc đã là cái đang có hiệu lực, bao gồm cả thực tế là `panic = "abort"` của khối cấp chương trình không bao giờ được áp dụng.

## Những gì không thay đổi

* **Mọi bố cục tài khoản.** `PoolState`, `GlobalConfig`, `PlatformConfig`, `PlatformCurveRule`, `PlatformAllowConfig`, bản ghi vesting — cùng kích thước, cùng offset.
* **Mã lỗi `6000`–`6030`,** bao gồm `6020` được giữ lại cố ý.
* **Toán học đường cong, tỷ lệ phí, tích lũy phí, lịch trình vesting, và phân chia LP tốt nghiệp.**
* **Quy tắc đường cong nền tảng và danh sách cho phép `GlobalConfig`.** Cùng lệnh, cùng tài khoản, cùng ngữ nghĩa; chỉ cổng clock xung quanh kiểm tra quy tắc đường cong đã biến mất.
* **Danh sách tài khoản `MigrateToCpswap` và chỉ số `remaining_accounts`.**
* **Bàn giao quyền chuyển Token-2022 tại tốt nghiệp.**
* **ID chương trình.** Không thay đổi.

## Trang được cập nhật

* `products/launchlab/instructions` — `CollectExcessLamports` được thêm với danh sách tài khoản, bảng giải quyết quyền và cảnh báo nhóm; loại bỏ tham số và tài khoản của `MigrateToAmm` được ghi lại với danh sách mới đầy đủ; `Initialize` được đặt trước với cảnh báo luôn thất bại; phần "Trade remaining accounts" mới bao gồm ba tài khoản giờ vô điều kiện và kiểm tra `system_program`; ghi chú `MigrateToCpswap` trên đường dẫn chỉ được phép và các ràng buộc được chuyển vị trí; hàng danh mục và ma trận thay đổi trạng thái.
* `products/launchlab/overview` — biểu ngữ phát hành; các bất biến "chỉ CPMM" và mint cơ sở được sửa chữa.
* `products/launchlab/accounts` — thời gian thu hồi quyền mint được sửa chữa để tạo lần phát hành (nó được ghi lại tại tốt nghiệp); hàng `CollectExcessLamports` được thêm.
* `reference/error-codes` — `6031` được ghi lại.
* `reference/program-addresses` — phần "Excess-lamports collection wallets" mới.
* `solana-fundamentals/rent-and-reclaimable-rent` — phần "What the Raydium programs sweep on their own side" mới.
* `sdk-api/rust-cpi`, `solana-fundamentals/toolchain` — Anchor 1.0 pins và ghi chú di chuyển CPI.
