Skip to main content
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 →
Raydium không chấp nhận các mint Token-2022 tùy ý. Cả CPMM và CLMM đều chạy ở chế độ danh sách cho phép nghiêm ngặt: chỉ một tập hợp nhỏ các extension được phép theo mặc định; mọi thứ khác bị từ chối khi tạo pool. Mỗi chương trình chấp nhận một mint riêng lẻ thông qua một cơ chế — một PDA registry theo mint do admin quản lý. Cả hai chương trình cũng từng có các bypass được mã hóa cứng tại nhiều điểm; tất cả những cái đó đã bị xóa. Trang này là tài liệu tham khảo duy nhất cho những gì được thực thi và ở đâu, kèm theo trích dẫn từ mã nguồn chương trình.

Hỗ trợ ở cấp chương trình

Các kiểm tra danh sách cho phép nằm trong: Không có kiểm tra mint lúc swap trên CPMM hoặc CLMM — cổng chỉ kích hoạt khi tạo pool. Khi một pool tồn tại, các swap chỉ tin tưởng rằng các mint không thay đổi, điều này là đúng đối với các phần bất biến của trạng thái mint Token-2022.

Đóng băng NFT vị trí CLMM cho các nhà phát hành bị hạn chế

Các tài khoản NFT vị trí vẫn không bị đóng băng theo mặc định. CLMM chỉ đóng băng một cái khi vị trí sử dụng đường dẫn mở V2 và ít nhất một freeze_authority hiện tại của mint vault xuất hiện trong danh sách frozen_position_nft_authorities::IDS được mã hóa cứng. Danh sách đó là những gì thay thế phát hiện token Superstate trước đó của CLMM, và nó mang cùng quyền hạn nhà phát hành mà heuristic cũ khớp với. Đặt pool PDA làm freeze authority của mint NFT vị trí không phải là một sự đóng băng. Đây là một quy tắc quản lý vị trí, không phải danh sách cho phép tạo pool:
  • Pool có thể đã tồn tại và vẫn có thể swap.
  • Mint NFT vị trí sử dụng CLMM pool PDA làm freeze authority của riêng nó; nhà phát hành cơ bản không kiểm soát NFT vị trí.
  • OpenPositionV2 bao gồm các NFT vị trí SPL Token cổ điển trên các tài sản pool Token-2022. OpenPositionWithToken22Nft bao gồm các NFT vị trí Token-2022.
  • OpenPosition V1 không kiểm tra mint vault và không thể phục vụ các tài sản Token-2022 bị hạn chế được nhắm mục tiêu bởi danh sách được gửi.
  • Các vị trí hiện có không thay đổi.
Các vị trí bị đóng băng vẫn có thể được quản lý bởi chủ sở hữu của chúng nhưng không thể được chuyển. ClosePosition làm tan băng và đốt nguyên tử khi client chuyển pool làm tài khoản còn lại đầu tiên. Xem products/clmm/ticks-and-positions.

Mint quote LaunchLab

Hai mint của LaunchLab được kiểm soát rất khác nhau, và sự bất đối xứng rất dễ bỏ sót.
  • Mint base — LaunchLab tạo nó. Một mint base Token-2022 chỉ có thể được truy cập thông qua initialize_with_token_2022, và chương trình sẽ chỉ đính kèm MetadataPointer và (tùy chọn) TransferFeeConfig. Bất cứ thứ gì khác sẽ trả về NoSupportExtension. Một mint Token-2022 đã tồn tại không thể được cung cấp làm base. Khi TransferFeeConfig được đính kèm, transfer_fee_config_authority của mint là launch authority PDA cho đến khi hoàn thành, trong khi withdraw_withheld_authority của nó là transfer_fee_extension_auth được cấu hình của nền tảng từ khi tạo mint trở đi — chương trình launchpad tự nó không có lệnh withdraw-withheld. Xem products/launchlab/platform-config.
  • Mint quote — LaunchLab không tạo nó và không sàng lọc nó. CreateConfig chấp nhận tài khoản mint như được cung cấp, vì vậy không có tương đương is_supported_mint ở phía quote. Cổng duy nhất là những mint nào mà admin chọn liên kết với GlobalConfig.
Điều đó làm cho việc liên kết một mint quote Token-2022 là một hành động đòi hỏi độ tin cậy cao, vì cùng một lý do đăng ký một mint dưới đây: một mint quote TransferHook sẽ chạy hook của nó trên mỗi lần mua, bán và yêu cầu phí trong mỗi pool được trích dẫn trong nó, và một mint quote PermanentDelegate sẽ cho phép delegate quét các vault quote của những pool đó. Cả hai đều không bị chương trình chặn. Những gì LaunchLab xử lý chính xác khi một mint quote được liên kết:
  • Vault quote, cả hai vault phí và tài khoản token của người nhận phí chia sẻ được tạo trên chương trình của mint quote.
  • TransferFeeConfig ở phía quote được định giá vào tất cả bốn lệnh giao dịch, và giới hạn slippage được kiểm tra so với số tiền ròng của người trả tiền thay vì chuyển động brutto của vault. Xem products/launchlab/instructions.
  • PoolState.token_program_flag ghi lại các chương trình của cả hai mint — bit0 cho mint base, bit1 cho mint quote. Giải mã nó theo bit; byte không phải là boolean. Xem products/launchlab/accounts.
Lệnh Initialize không dùng nữa vẫn nhận một chương trình quote chỉ dành cho legacy, vì vậy một config với mint quote Token-2022 chỉ có thể được truy cập thông qua InitializeV2 và InitializeWithToken2022.

Danh sách cho phép extension CPMM và CLMM

Sau hai lối tắt được đề cập dưới đây, chương trình lặp qua các extension của mint và từ chối mint nếu nó mang bất kỳ extension nào khác ngoài năm cái này: Bất cứ thứ gì không có trong danh sách này — TransferHook, NonTransferable, ConfidentialTransferMint, PermanentDelegate, MintCloseAuthority, DefaultAccountState, GroupPointer, GroupMemberPointer, MemberPointer, Pausable, v.v. — khiến is_supported_mint trả về false và tạo pool bị hoàn nguyên. Các dòng liên quan (CPMM, hình dạng giống hệt trong CLMM):
— cp-swap/src/utils/token.rs

Đường dẫn bypass

Một mint Token-2022 không phù hợp với danh sách cho phép vẫn có thể được chấp nhận, thông qua một cơ chế trong mỗi chương trình. Cả hai chương trình cũng từng có các bypass được mã hóa cứng trong quá khứ; không có cái nào sống sót. is_supported_mint hiện là byte-for-byte cùng một hàm trong cả hai chương trình: các mint SPL Token legacy được chuyển, một mint với PDA registry được chuyển, và mọi thứ khác phải chỉ mang các extension được cho phép.

Bypass duy nhất: registry theo mint

Cả hai chương trình tham khảo một PDA SupportMintAssociated tại seed [b"support_mint", mint]. Nếu PDA đó tồn tại cho mint, mint được chấp nhận bất kể tập hợp extension của nó. Mỗi chương trình có bản sao riêng của PDA (chúng được dẫn xuất dưới các ID chương trình khác nhau), cặp CreateSupportMintAssociated / CloseSupportMintAssociated riêng của nó, và quyền hạn chuyên dụng riêng của nó cùng với admin được chia sẻ: Bốn khóa (CPMM và CLMM × mainnet và devnet) được liệt kê dưới Support-mint registry authorities. Trong cả hai chương trình, lệnh chấp nhận crate::admin::ID hoặc quyền hạn chuyên dụng của chương trình đó, và yêu cầu mint được sở hữu bởi Token-2022. Hiệu quả: một mint Token-2022 cụ thể có thể được chọn vào tạo pool mà không cần nâng cấp chương trình — đó là lý do tại sao các danh sách được mã hóa cứng có thể biến mất. Mỗi chương trình tham khảo registry từ mỗi đường dẫn tạo pool mà nó có: CPMM từ Initialize và InitializeWithPermission (cái sau là những gì các hoàn thành LaunchLab sử dụng, vì vậy một mint được đăng ký hoàn thành cũng như tạo), CLMM từ CreatePool, CreateCustomizablePool và CreateCustomizablePoolV2.

Các cơ chế bypass đã bị xóa

Cả hai cơ chế hardcoded đều đã bị loại bỏ khỏi các chương trình được triển khai. Chúng được ghi lại ở đây chỉ vì các tích hợp được viết dựa trên hành vi cũ hơn có thể vẫn giả định chúng.

Static MINT_WHITELIST — đã bị xóa

Một mảng hằng số các địa chỉ mint base58 được sử dụng để bỏ qua is_supported_mint trước khi lặp qua các extension. CLMM từng chứa sáu địa chỉ và đã bị xóa vào ngày 2026-07-24; CPMM chứa bốn địa chỉ đầu tiên trong cùng một tập hợp và đã bị xóa trong bản nâng cấp 2026-09-09. Một pool đã tồn tại cho một trong những mint này sẽ tiếp tục giao dịch — kiểm tra mint chỉ chạy khi tạo pool. Tạo một pool mới cho một trong những mint này hiện yêu cầu một registry PDA cho nó thay thế.

Phát hiện hình dạng quyền hạn Superstate — đã bị xóa

CLMM từng xác định các tài sản được tokenize của Superstate bằng hình dạng quyền hạn của chúng thay vì theo địa chỉ: một mint Token-2022 có freeze_authority và permanent delegate đều bằng superstate_allowlist::ID, với DefaultAccountState được đặt thành Frozen, đã được chấp nhận. Đó là một heuristic, vì vậy bất kỳ mint tương lai nào có cùng hình dạng sẽ được chấp nhận tự động. Nó đã bị xóa vào ngày 2026-07-31, cùng với mô-đun superstate_allowlist. Cái thay thế nó hẹp hơn và phục vụ một mục đích khác: frozen_position_nft_authorities::IDS, không chấp nhận bất cứ điều gì — nó quyết định xem một position NFT có bị đóng băng hay không, và được mô tả ở trên. Quyền hạn phát hành duy nhất mà heuristic cũ khớp là mục nhập duy nhất trong danh sách đó.

Những gì các bypass không miễn trừ

Các bypass bỏ qua danh sách cho phép extension, nhưng chương trình vẫn thực thi:
  • Mint được sở hữu bởi Token hoặc Token-2022. Một chương trình token tùy chỉnh bị từ chối ở thượng nguồn.
  • Các vault pool được tạo với các extension ATA phù hợp cho các pool Token-2022 (ImmutableOwner, v.v.).
  • Tất cả các chuyển giao đều đi qua transfer_checked — các mint có phí hạ cánh với số tiền chính xác trong vault.
Một mint được whitelisted hoặc đăng ký PDA mà, ví dụ, sau đó thêm TransferHook không nhận được kiểm tra thời gian swap; hook sẽ chạy trên mọi chuyển giao và có thể làm hỏng các swap. Do đó, đăng ký một mint là một hành động đòi hỏi độ tin cậy cao.

Ngữ nghĩa “Blocked”

Khi is_supported_mint trả về false, việc tạo pool sẽ hoàn nguyên với ErrorCode::NotSupportMint (CPMM) / ErrorCode::NotSupportMint (CLMM). Xem reference/error-codes để biết các mã số. Các pool hiện có không thể retroactively thất bại kiểm tra này — cổng chỉ chạy khi tạo. Các extension mint là bất biến đối với các danh mục mà Raydium từ chối (transfer hook, non-transferable, confidential transfer không thể được thêm sau khi tạo), vì vậy kiểm tra tĩnh là đủ.

Tại sao mỗi extension bị loại trừ lại bị loại trừ

  • TransferHook — gọi một chương trình tùy chỉnh trên mọi chuyển giao, với tiêu thụ CU tùy ý, điều kiện thất bại tùy ý và khả năng nhập lại chương trình gọi. Không có sandbox an toàn nào tồn tại. Một số DEX duy trì danh sách cho phép hook; Raydium không.
  • NonTransferable — Transfer luôn thất bại. Một pool không thể giữ quyền sở hữu.
  • ConfidentialTransfer — số tiền chuyển giao được mã hóa; đường cong không thể định giá swap.
  • PermanentDelegate — một người giữ delegate có thể quét bất kỳ tài khoản token nào, bao gồm vault pool. Chỉ có thể chấp nhận được bằng cách đăng ký mint, đó là cách một nhà phát hành đáng tin cậy (ví dụ: một stablecoin được quy định) được onboarded từng trường hợp một.
  • MintCloseAuthority — mint có thể bị đóng; các pool hiện có trở nên không sử dụng được. Bị cấm theo mặc định.
  • DefaultAccountState (Frozen) — các ATA pool sẽ hạ cánh ở trạng thái Frozen và yêu cầu thawing cho mỗi tài khoản. Chỉ có thể chấp nhận được bằng cách đăng ký mint, giả định rằng nhà phát hành thaw các tài khoản tổ chức khi đăng ký.
  • Group/Member pointers — không gây hại tích cực, nhưng chưa được xem xét. Bị cấm theo mặc định để giữ bề mặt hẹp.

Kế toán phí chuyển giao

Đối với các mint mang TransferFeeConfig, mỗi swap, deposit và withdraw di chuyển ít hơn số tiền danh nghĩa. Hai số riêng biệt liên quan, và SDK giữ chúng riêng biệt:
  • Pool fee (LP + protocol + fund + creator) đến từ đường cong. raydium.cpmm.computeSwapAmount({ ... }) trả về nó dưới dạng fee, cùng với amountIn, amountOut, minAmountOut, executionPrice, priceImpact và swapResult thô.
  • Token-2022 transfer fee đến từ mint, không phải pool. Nó được tính toán bởi các trợ giúp getTransferAmountFee trong @raydium-io/raydium-sdk-v2, trả về một GetTransferAmountFee:
Deposit và withdraw hiển thị nó trực tiếp: computePairAmount trả về inputAmountFee và anotherAmount dưới dạng các giá trị GetTransferAmountFee. Một UI chính xác hiển thị:
  • số tiền đầu vào cộng với transfer fee của nó dưới dạng “bạn gửi”
  • số tiền đầu ra trừ transfer fee của nó dưới dạng “bạn nhận”
  • pool fee dưới dạng một dòng riêng biệt — nó không phải là Token-2022 fee
Một UI ngây thơ chỉ hiển thị amountIn → amountOut sẽ giảm thiểu chi phí. Chuyển epochInfo từ cluster vào các trợ giúp này thay vì lưu trữ nó; epoch là cái chọn giữa cấu hình phí older và newer của mint.

Giới hạn maximumFee

Token-2022 transfer fees được giới hạn cho mỗi chuyển giao. Đối với một mint 1% với giới hạn 10,000 token, một chuyển giao 100,000,000 token chỉ trả 10,000 phí. SDK’s computeSwapAmount áp dụng giới hạn; những người gọi chương trình trực tiếp phải sao chép nó.

Chuyển đổi epoch

Một mint authority có thể lên lịch thay đổi tỷ lệ phí kích hoạt ở epoch tiếp theo. Trong cửa sổ chuyển đổi, hai cấu hình (older, newer) tồn tại trên mint cùng một lúc và TransferChecked chọn theo epoch hiện tại. Cả CPMM SwapV2 và CLMM SwapV2 đều chuyển toàn bộ tài khoản mint trong accounts, vì vậy chương trình đọc cấu hình chính xác mà không cần tra cứu thêm. Nếu bạn báo giá nhiều hơn một epoch trước qua Trade API hoặc SDK, phí được thực thi có thể khác với phí được báo giá — được giới hạn bởi maximum_fee_basis_points của cấu hình cũ hơn.

Interest-bearing và ScaledUiAmount

Pool giữ số tiền gốc; “UI amount” là số tiền gốc nhân với một hệ số tỷ lệ phụ thuộc vào thời gian hoặc được đặt bởi admin. Toán học swap hoạt động trên gốc:
SDK chuyển đổi tự động. Những người đọc RPC trực tiếp nên coi pool.token0Vault.amount là gốc.

Định nghĩa “Token-2022 pool”

Một pool là Token-2022 pool nếu bất kỳ mint nào có programId == TokenzQdB.... API hiển thị điều này:
Sử dụng programId để dispatch, và hasTransferFee để hiển thị cảnh báo UI.

Trợ giúp SDK

Những sai lầm tích hợp phổ biến

  • Pre-flighting chỉ program ID. Một mint có thể là Token-2022 và không được hỗ trợ. Đi qua danh sách extension so với danh sách cho phép, và kiểm tra registry PDA của mint, trước khi cho phép tạo pool.
  • Tin tưởng vào SDK’s quote khi mint không được chấp nhận hoàn toàn. Quote API không từ chối báo giá — việc tạo pool là cái hoàn nguyên. Xác nhận ngữ nghĩa is_supported_mint ngoài chuỗi trước khi hiển thị tạo pool trong UI của bạn.
  • Báo giá mà không có transfer-fee haircut. Một mint transfer-fee 1% ở cả hai bên của một CPMM pool 0.25% có phí hiệu quả khoảng 2.25%, không phải 0.25%. Sử dụng SDK quote hoặc Trade API quote — không bao giờ tính toán phí thủ công chỉ từ fee tier của pool.
  • Gọi lệnh Swap kế thừa trên một Token-2022 pool. Swap trước Token-2022. Sử dụng SwapV2 bất cứ khi nào bất kỳ mint nào là Token-2022.
  • Auto-listing Token-2022 mints mới. Ví dụ và aggregators nên kiểm tra TransferHook và NonTransferable trước khi hiển thị một mint cho người dùng; cả hai đều không thân thiện với Raydium.

Công việc trong tương lai

Các mục lộ trình hệ sinh thái Solana và giao thức sẽ thay đổi ma trận này:
  • Allow-listed transfer-hook programs ở cấp độ Solana (quy ước hệ sinh thái đang phát triển).
  • Confidential-transfer-compatible AMMs (giai đoạn nghiên cứu).
  • Broader CPMM per-mint registry (parity với CLMM).
  • Một đường dẫn đọc công khai cho registry, vì vậy một UI có thể nói “unsupported” từ “unsupported nhưng registered” mà không cần phải tự mình derive PDA.
Trang này sẽ được cập nhật khi bất kỳ cái nào hạ cánh.

Con trỏ

Nguồn:
  • raydium-cp-swap/programs/cp-swap/src/utils/token.rs — is_supported_mint, support_mint_associated_is_initialized.
  • raydium-clmm/programs/amm/src/util/token.rs — is_supported_mint, support_mint_associated_is_initialized, frozen_position_nft_authorities, position_nft_must_freeze.
  • raydium-clmm/programs/amm/src/instructions/admin/create_support_mint_associated.rs — per-mint registry instruction.
  • raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs — LaunchLab Token-2022 base-mint creation.
  • raydium-launchpad/programs/launchpad/src/instructions/admin/create_config.rs — LaunchLab quote-mint binding (no extension check).