> ## 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 — AMM v4: Solana 3.0 dependencies and excess-lamports recovery

> AMM v4 rebuilds against solana-program 3.0, spl-token 9.0 and the new solana-system-interface crate, and adds an admin-only WithdrawExcessLamports instruction (tag 18) that returns rent freed by SIMD-0437. CreateConfigAccount stops reading its trailing rent sysvar, compatibly. Nothing breaks and no account layout changed.

<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-amm-v4-solana-3-and-excess-lamports)
</Info>

<Info>
  Mục này bao gồm một bản cập nhật chương trình AMM v4 sắp tới. Nó đã được xác minh 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 hướng dẫn mới.
</Info>

Hai điều không liên quan đến nhau được phát hành cùng một lần trong một bản dựng lại.

Điều đầu tiên là công việc bảo trì: AMM v4 đã được ghim vào `solana-program` `=2.1.0` kể từ bản nâng cấp 2.1, và ghim đó đang gây cản trở. Các trợ giúp của chương trình hệ thống đã được chuyển vào crate `solana-system-interface` riêng của chúng trong Solana 3.0, `spl-token` đạt 9.0, và `spl-associated-token-account` đạt 8.0. Bản phát hành này lấy cả ba.

Điều thứ hai là tiền mà giao thức được nợ. [SIMD-0437](/vi/solana-fundamentals/rent-and-reclaimable-rent) đang cắt giảm mức tối thiểu miễn phí thuê bao 90% trong năm bước, và bước 1 đã được triển khai trên mainnet vào ngày 3 tháng 9 năm 2026. Mọi tài khoản mà AMM v4 tạo trước đó — hàng trăm vault pool, LP mint, tài khoản `AmmInfo` và `TargetOrders` — hiện đang được tài trợ quá mức, và lamport trong tài khoản do chương trình sở hữu chỉ có thể được di chuyển bởi chương trình đó. Do đó, một hướng dẫn mới.

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

* **Không có gì mà trader hoặc LP gọi đã thay đổi.** `Initialize2`, `Deposit`, `Withdraw`, `SwapBaseIn`, `SwapBaseOut`, `SwapBaseInV2`, `SwapBaseOutV2`, `WithdrawPnl` và `SetParams` giữ nguyên danh sách tài khoản, bố cục đối số và toán học. Không có bố cục tài khoản nào thay đổi. Không có mã lỗi hiện có nào di chuyển.
* **Một hướng dẫn được thêm: `WithdrawExcessLamports`, tag `18`.** Chỉ dành cho quản trị viên, không có đối số, danh sách tài khoản có độ dài thay đổi. Nó trả lại lamport vượt quá mức tối thiểu miễn phí thuê bao từ các tài khoản được kiểm soát bởi AMM v4 và không chạm vào bất cứ điều gì khác. Xem [`products/amm-v4/instructions`](/vi/products/amm-v4/instructions#withdrawexcesslamports).
* **Một mã lỗi được thêm vào: `60` `LamportsCalculateError`.** `AmmError` không được đánh số Anchor — nó bắt đầu từ `0` — vì vậy đây là `custom program error: 0x3c`. Các mã `0`–`59` không thay đổi.
* **`CreateConfigAccount` (tag 14) đã ngừng đọc sysvar rent** và hiện được ghi chép là hướng dẫn 4 tài khoản. **Không có gì trong bản phát hành này là phá vỡ**, điều này bao gồm: tài khoản là tài khoản cuối cùng trong danh sách và trình xử lý đọc theo vị trí mà không có kiểm tra độ dài, vì vậy công cụ quản trị viên vẫn chuyển nó tiếp tục hoạt động.
* **Cần làm mới IDL** nếu bạn tạo máy khách từ một. Một hướng dẫn mới, một biến thể lỗi mới, một danh sách tài khoản đã thay đổi.

## `WithdrawExcessLamports`

Hướng dẫn lấy ví collect-lamports làm người ký duy nhất và đích đến, PDA quyền hạn AMM v4, chương trình SPL Token, và sau đó là bất kỳ số lượng tài khoản nguồn nào. Nó phân phối dựa trên chủ sở hữu của mỗi tài khoản nguồn:

| Chủ sở hữu tài khoản nguồn               | Xử lý                                                                                                                                                                         |
| ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SPL Token, 165 byte, không phải native   | CPI chương trình token `WithdrawExcessLamports` (discriminant `38`), được ký bởi PDA quyền hạn                                                                                |
| SPL Token, 165 byte, native (wSOL)       | `SyncNative`, đo lường `amount` được bao bọc tăng bao nhiêu, `UnwrapLamports` (discriminant `45`) cho chính xác delta đó, sau đó khẳng định số dư được bao bọc không thay đổi |
| SPL Token, kích thước khác (một LP mint) | CPI `WithdrawExcessLamports`                                                                                                                                                  |
| Chương trình AMM v4 chính nó             | Ghi nợ tài khoản trực tiếp thành `rent.minimum_balance(data_len)`                                                                                                             |
| Bất cứ điều gì khác                      | Bỏ qua im lặng                                                                                                                                                                |

Nhánh wSOL là nhánh thú vị. Số dư lamport của tài khoản wrapped-SOL *là* số dư token của nó, vì vậy chương trình token từ chối `WithdrawExcessLamports` trên nó hoàn toàn. Vòng lặp qua `SyncNative` và `UnwrapLamports` có kích thước delta trích xuất chỉ phần dư được tặng và để lại số dư được bao bọc chính xác nơi nó bắt đầu — được khẳng định sau đó, với `LamportsCalculateError` nếu số học không đồng ý. **Do đó, vault pool phía SOL giữ lại toàn bộ thanidity của nó thông qua một lần quét**, và không có LP nào thấy thay đổi giá trên một.

Người ký là một khóa chuyên dụng cho mỗi cụm, được mã hóa cứng dưới cùng mô-đun `config_feature` với các địa chỉ chủ sở hữu AMM hiện có và địa chỉ phí tạo pool. Không giống như CPMM và LaunchLab, AMM v4 chỉ chấp nhận ví **đó** — không có dự phòng quản trị viên. Các địa chỉ nằm trong [`reference/program-addresses`](/vi/reference/program-addresses#excess-lamports-collection-wallets).

## `CreateConfigAccount` đã ngừng đọc sysvar rent

Solana 3.0 là những gì làm cho `Rent::get()` trở thành cách tự nhiên để đọc các tham số rent, vì vậy bản phát hành đã thay thế tất cả bốn lệnh gọi `Rent::from_account_info(...)` trong chương trình. Trong ba trong số chúng — các trợ giúp tạo các tài khoản token, LP mint và tài khoản PDA của pool trong `Initialize2` — tài khoản sysvar vẫn được chuyển và vẫn được chuyển tiếp vào các CPI của chương trình token, vì vậy không có gì về danh sách tài khoản đó thay đổi. Trong `CreateConfigAccount`, sysvar không có mục đích khác và là tài khoản cuối cùng trong danh sách, vì vậy nó đã được loại khỏi danh sách được ghi chép:

|   | Trước (5 tài khoản) | Sau (4 tài khoản) |
| - | ------------------- | ----------------- |
| 1 | `admin` (W, S)      | `admin` (W, S)    |
| 2 | `amm_config` (W)    | `amm_config` (W)  |
| 3 | `pnl_owner`         | `pnl_owner`       |
| 4 | `system_program`    | `system_program`  |
| 5 | `rent`              | —                 |

**Gửi danh sách năm tài khoản cũ vẫn hoạt động.** Tài khoản bị xóa là tài khoản cuối cùng, và `process_create_config` đọc bốn tài khoản của nó theo vị trí thông qua `next_account_info` mà không có gì kiểm tra tổng số, vì vậy tài khoản rent ở cuối không bao giờ được nhìn vào. Công cụ quản trị viên nên được cập nhật để rõ ràng, không phải khẩn cấp. Không có công cụ xây dựng nào hướng tới người dùng xây dựng hướng dẫn này cả.

`Initialize2` là trường hợp không nên đọc quá mức: nó cũng đã ngừng gọi `Rent::from_account_info`, nhưng tài khoản rent của nó **vẫn** ở vị trí 3 và vẫn được sử dụng thực sự — chương trình chuyển tiếp nó vào các CPI `spl_token::initialize_account` và `initialize_mint` tạo vault và LP mint của pool. Loại bỏ nó khỏi danh sách tài khoản đó sẽ phá vỡ việc tạo pool.

## Thay đổi phụ thuộc

| Crate                          | Trước    | Sau                           |
| ------------------------------ | -------- | ----------------------------- |
| `solana-program`               | `=2.1.0` | `=3.0.0`                      |
| `solana-system-interface`      | —        | `=3.0.0`, tính năng `bincode` |
| `spl-token`                    | `=7.0.0` | `9.0.0`                       |
| `spl-associated-token-account` | `6.0.0`  | `8.0.0`                       |

Các phần của chương trình hệ thống mà chương trình sử dụng — `system_instruction::create_account`, `transfer`, `allocate`, `assign`, và ID chương trình chính nó — hiện đến từ `solana-system-interface` thay vì `solana_program::system_program` và `solana_program::system_instruction`. ID chương trình là byte-identical, vì vậy đây là một di chuyển thời gian biên dịch mà không có hậu quả trên chuỗi, bao gồm các kiểm tra `InvalidSysProgramAddress` so sánh với nó.

Hai mô-đun chết cũng bị xóa: `srm_token` và `msrm_token`, các khai báo mint Serum/MSRM còn sót lại từ [loại bỏ OpenBook](/vi/reference/changelog/2026-07-22-amm-v4-openbook-removal). Không có gì tham chiếu chúng.

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

* **Mọi bố cục tài khoản.** `AmmInfo`, `StateData`, `TargetOrders`, `AmmConfig` — cùng kích thước, cùng độ lệch trường. Không có thay đổi indexer hoặc decoder.
* **Mã lỗi `0`–`59`.** `LamportsCalculateError` được thêm vào tại `60`, vì vậy không có gì dịch chuyển.
* **PDA quyền hạn AMM.** Vẫn là một PDA cho toàn bộ chương trình, seed `["amm authority"]`, nonce `254`.
* **Phí, kế toán PnL và đường cong.** Không bị chạm vào. `WithdrawExcessLamports` di chuyển lamport không bao giờ là một phần của dự trữ của bất kỳ pool nào.
* **Token-2022.** Vẫn không được hỗ trợ. Hướng dẫn mới chỉ nói chuyện với chương trình SPL Token kế thừa.
* **ID chương trình.** Không thay đổi — xem [`reference/program-addresses`](/vi/reference/program-addresses).

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

* `products/amm-v4/instructions` — `WithdrawExcessLamports` được thêm với danh sách tài khoản và bảng phân phối theo chủ sở hữu; phần `CreateConfigAccount` / `UpdateConfigAccount` mới bao gồm loại bỏ sysvar rent; hàng bảng kho và hàng ma trận thay đổi trạng thái được thêm.
* `products/amm-v4/overview` — biểu ngữ phát hành.
* `reference/error-codes` — phần "AMM v4: `AmmError` không được đánh số Anchor" mới ghi chép mã `60` và đánh số dựa trên `0`.
* `reference/program-addresses` — phần "Ví thu thập lamport dư thừa" mới.
* `solana-fundamentals/rent-and-reclaimable-rent` — phần "Những gì các chương trình Raydium quét ở phía của chính họ" mới; ghi chú wrapped-SOL được sửa để nói cả hai chương trình token đều hiển thị `UnwrapLamports`.
* `solana-fundamentals/toolchain` — Agave 3.1.10, `release.anza.xyz`, Rust 1.91.0.
