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:
- CPMM:
is_supported_minttrongraydium-cp-swap/programs/cp-swap/src/utils/token.rs, được gọi từInitializevàInitializeWithPermission. - CLMM:
is_supported_minttrongraydium-clmm/programs/amm/src/util/token.rs, được gọi từCreatePool. - LaunchLab:
initialize_with_token_2022trongraydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs(mã nguồn không công khai).
Đó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ộtfreeze_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í.
OpenPositionV2bao gồm các NFT vị trí SPL Token cổ điển trên các tài sản pool Token-2022.OpenPositionWithToken22Nftbao gồm các NFT vị trí Token-2022.OpenPositionV1 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.
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èmMetadataPointervà (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. KhiTransferFeeConfigđược đính kèm,transfer_fee_config_authoritycủa mint là launch authority PDA cho đến khi hoàn thành, trong khiwithdraw_withheld_authoritycủ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. Xemproducts/launchlab/platform-config. - Mint quote — LaunchLab không tạo nó và không sàng lọc nó.
CreateConfigchấp nhận tài khoản mint như được cung cấp, vì vậy không có tương đươngis_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ớiGlobalConfig.
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. Xemproducts/launchlab/instructions.PoolState.token_program_flagghi 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. Xemproducts/launchlab/accounts.
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 PDASupportMintAssociated 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
TokenhoặcToken-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.
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”
Khiis_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 —
Transferluô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
Frozenvà 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 mangTransferFeeConfig, 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ạngfee, cùng vớiamountIn,amountOut,minAmountOut,executionPrice,priceImpactvàswapResultthô. - 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
getTransferAmountFeetrong@raydium-io/raydium-sdk-v2, trả về mộtGetTransferAmountFee:
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
feecủa nó dưới dạng “bạn gửi” - số tiền đầu ra trừ transfer
feecủa nó dưới dạng “bạn nhận” - pool
feedưới dạng một dòng riêng biệt — nó không phải là Token-2022 fee
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: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:
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_mintngoà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
Swapkế thừa trên một Token-2022 pool.Swaptrước Token-2022. Sử dụngSwapV2bấ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
TransferHookvàNonTransferabletrướ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.
Con trỏ
algorithms/token-2022-transfer-fees— fee math trong swaps.products/cpmm/instructions—SwapV2,Initialize.products/clmm/instructions—SwapV2,CreatePool,CreateSupportMintAssociated.reference/error-codes—NotSupportMintnumeric codes cho mỗi chương trình.
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).

