> ## 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-07-30 — CLMM: permissioned multi-pools và limit-order frozen-account guard

> Hai cập nhật chương trình CLMM: CreatePermissionedPool cho phép một authority được phép tạo nhiều pool cho cùng một cặp token thông qua seed_index được gộp vào pool PDA, và OpenLimitOrder giờ đây nhận các account phía output để từ chối các order có input hoặc output token account bị frozen.

<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-07-30-clmm-permissioned-pools)
</Info>

Bản phát hành này ghi lại hai thay đổi chương trình CLMM. Cả hai đều là bổ sung và tương thích ngược: các pool, position và open order hiện tại không bị ảnh hưởng, và các đường dẫn `CreatePool` / `CreateCustomizablePool` cổ điển vẫn không thay đổi.

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

* **Pool ID giờ đây có thể không phải là canonical, đằng sau một cổng quyền hạn.** Trước đây chỉ có đúng một địa chỉ CLMM pool cho mỗi `(amm_config, token_mint_0, token_mint_1)` — các seed PDA đã ghim nó. Một instruction mới, **`CreatePermissionedPool`**, gộp một `seed_index: u16` khác không do client cung cấp vào các seed pool PDA, vì vậy một operator được phép có thể thiết lập **nhiều pool cho cùng một cặp và fee tier**, mỗi cái ở địa chỉ riêng của nó. Vì các địa chỉ pool tùy ý là một khả năng có quyền hạn, người trả phí phải giữ một **`Permission`** PDA được cấp bởi admin. Hai instruction admin, **`CreatePermissionPda`** và **`ClosePermissionPda`**, quản lý các cấp phép đó.
* **`OpenLimitOrder` giờ đây xác thực phía output.** Instruction nhận ba account bổ sung — `output_token_account`, `output_vault`, `output_vault_mint` — và từ chối order với `NotApproved` nếu token account **input hoặc output** của chủ sở hữu bị frozen. Điều này đảm bảo rằng fill cuối cùng có thể được giao, điều này quan trọng đối với các mint Token-2022 có allow-list / default-frozen (token được phép). Các client được xây dựng dựa trên danh sách account một phía cũ phải thêm ba account output.

## Những gì đã thay đổi trong chương trình

### Instruction mới: `CreatePermissionedPool`

Cùng hình dạng và tham số với `CreateCustomizablePool` (nó nhận cùng `CreateCustomizableParams`, vì vậy single-sided fee và dynamic-fee opt-in đều có sẵn), cộng với:

* Một tham số `seed_index: u16`, **phải khác không**. Nó được nối thêm (little-endian) vào các seed pool PDA:
  `["pool", amm_config, token_mint_0, token_mint_1, seed_index.to_le_bytes()]`.
* Một account `permission`: PDA `["permission", payer]`. Anchor từ chối lệnh gọi nếu nó không tồn tại hoặc không được sở hữu bởi chương trình — sự tồn tại của nó chính là sự ủy quyền.
* Một account `pool_creator` được ghi lại là `pool_state.owner`, có thể khác với `payer` trả phí.

`seed_index = 0` vẫn được dành riêng cho các pool cũ: đối với những cái đó, thành phần seed sụp đổ thành rỗng, tái tạo địa chỉ bốn seed cổ điển, vì vậy không có địa chỉ pool hiện tại nào thay đổi.

Xem [Instructions → CreatePermissionedPool](/vi/products/clmm/instructions).

### Account mới: `Permission`

Một account khả năng mà sự tồn tại của nó **chính là** cấp phép. Nó chỉ lưu trữ `authority` mà nó được tạo cho (cộng với padding). Seed PDA: `["permission", authority]`. Nó cấp quyền gọi `CreatePermissionedPool` và không gì khác — nó không thể di chuyển quỹ, thay đổi phí hoặc thay đổi bất kỳ pool nào. Xem [Accounts → Permission](/vi/products/clmm/accounts).

### Instruction admin mới: `CreatePermissionPda` / `ClosePermissionPda`

* `CreatePermissionPda` khởi tạo một `Permission` PDA cho một `permission_authority` nhất định.
* `ClosePermissionPda` đóng nó và hoàn lại tiền thuê cho người gọi, thu hồi cấp phép. Các pool đã được tạo theo cấp phép đó không bị ảnh hưởng.

Cả hai đều chấp nhận **hoặc** pubkey `admin` của chương trình **hoặc** một khóa `permission_pda_admin` chuyên dụng (một hằng số khác biệt trên mainnet so với devnet). Xem [Admin keys and multisig → CLMM](/vi/security/admin-and-multisig).

### `PoolState`: trường `seed_index`

Hai byte được tạo ra từ một vùng padding hiện tại (`padding: [u8; 6]` → `seed_index: [u8; 2]` + `padding: [u8; 4]`) ngay sau `fee_on`. **Tổng kích thước account không thay đổi, và không cần migration indexer.** Đối với các pool được tạo thông qua `CreatePool` / `CreateCustomizablePool`, `seed_index` là `[0, 0]`; đối với các pool được phép, nó mang chỉ số được chọn của người tạo và được yêu cầu để re-derive địa chỉ pool ngoài chuỗi.

### `OpenLimitOrder`: output-side account và frozen-account guard

Danh sách account `OpenLimitOrder` nhận `output_token_account`, `output_vault` và `output_vault_mint`. Chúng chỉ được sử dụng để xác thực — không có output nào bị debit khi mở. Handler giờ đây yêu cầu rằng **cả** input **và** output token account đều không bị frozen, nếu không sẽ trả về `NotApproved` (cùng mã đã được trả về khi pool có swap hoặc limit-order bị vô hiệu hóa). Điều này đóng một khoảng trống nơi một order có thể được mở chống lại một token account mà không bao giờ có thể nhận được fill (ví dụ: một account chưa được thaw cho một mint Token-2022 default-frozen).

Xem [Instructions → OpenLimitOrder](/vi/products/clmm/instructions).

## Mã lỗi

Không có mã lỗi mới. Mã `6000 NotApproved` hiện tại giờ đây bổ sung bao gồm các trường hợp frozen input/output token account và các trường hợp swap/limit-order-disabled trên `OpenLimitOrder`, và trường hợp "signer không phải là `admin` cũng không phải là `permission_pda_admin`" trên các instruction quyền hạn. Bảng mã lỗi và đánh số khác không thay đổi từ [bản phát hành 2026-05-18](/reference/changelog/2026-05-18-clmm-limit-orders). Xem [Error codes → CLMM](/vi/reference/error-codes).

## Ghi chú migration

* **Đọc địa chỉ pool**: không giả định một pool cho mỗi `(config, mint0, mint1)`. Một cặp giờ đây có thể có một pool canonical cộng với một hoặc nhiều pool được phép ở các địa chỉ được derive từ `seed_index`. Liệt kê các pool từ API / indexer thay vì derive một PDA duy nhất, và lưu trữ `seed_index` khi bạn cần re-derive một pool được phép.
* **Đặt limit order**: thêm ba account phía output vào giao dịch `OpenLimitOrder` của bạn, và hiển thị một thông báo rõ ràng khi `NotApproved` được trả về cho một account bị frozen.
* **Không có account-size hoặc layout break**: `PoolState` có cùng kích thước; các byte padding đã loại bỏ giờ đây giữ `seed_index`.

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

* `products/clmm/overview` — ghi chú "What's new" về permissioned multi-pools và limit-order guard.
* `products/clmm/instructions` — phần `CreatePermissionedPool` mới, `CreatePermissionPda` / `ClosePermissionPda` trong bảng instruction và ghi chú admin-gating, và danh sách account / preconditions / errors `OpenLimitOrder` được cập nhật.
* `products/clmm/accounts` — `Permission` trong danh mục và phần riêng của nó, trường `PoolState.seed_index`, trợ giúp PDA-derivation (`derivePermissionedPool`, `derivePermission`), và tham chiếu nhanh vòng đời.
* `security/admin-and-multisig` — hàng `permission_pda_admin` mới và giải thích phạm vi quyền hạn trong bảng vai trò CLMM.
* `reference/error-codes` — mô tả `NotApproved` được mở rộng.

**Xác minh dựa trên**:

* Mã nguồn `raydium-clmm` (`create_permissioned_pool.rs`, `admin/create_permission_pda.rs`, `admin/close_permission_pda.rs`, `states/permission.rs`, `states/pool.rs`, `limit_order/open_limit_order.rs`, `lib.rs`).
