本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
Raydium 不接受任意的 Token-2022 鑄幣。CPMM 和 CLMM 都執行嚴格的允許清單模式:預設只有一小組擴充功能通過;其他所有功能在建立流動性池時都會被拒絕。每個程式透過一個機制允許個別鑄幣——一個管理員管理的按鑄幣登錄 PDA。兩個程式在各個位置都曾有硬編碼的繞過機制;所有這些現在都已刪除。本頁是關於執行內容和位置的單頁參考,並附有程式原始碼的引用。
程式級支援
允許清單檢查位於:
- CPMM:
raydium-cp-swap/programs/cp-swap/src/utils/token.rs中的is_supported_mint,從Initialize和InitializeWithPermission呼叫。 - CLMM:
raydium-clmm/programs/amm/src/util/token.rs中的is_supported_mint,從CreatePool呼叫。 - LaunchLab:
raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs中的initialize_with_token_2022(原始碼不公開)。
CLMM 位置 NFT 凍結(受限發行人)
位置 NFT 帳戶預設保持解凍。CLMM 只在位置使用 V2 開放路徑且至少一個金庫鑄幣的當前freeze_authority 出現在硬編碼的 frozen_position_nft_authorities::IDS 清單中時才凍結一個。該清單是替代 CLMM 早期 Superstate 代幣檢測的內容,它帶有舊啟發式方法匹配的相同發行人權限。將流動性池 PDA 設定為位置 NFT 鑄幣的凍結權限本身不是凍結。這是位置保管規則,不是流動性池建立允許清單:
- 流動性池已經存在並保持可交換。
- 位置 NFT 鑄幣使用 CLMM 流動性池 PDA 作為其自己的凍結權限;基礎發行人不控制位置 NFT。
OpenPositionV2涵蓋 Token-2022 流動性池資產上的經典 SPL 位置 NFT。OpenPositionWithToken22Nft涵蓋 Token-2022 位置 NFT。OpenPositionV1 不檢查金庫鑄幣,無法服務由已發布清單針對的 Token-2022 受限資產。- 現有位置保持不變。
ClosePosition 原子性地解凍並燒毀。見products/clmm/ticks-and-positions。
LaunchLab 報價鑄幣
LaunchLab 的兩個鑄幣受限方式非常不同,不對稱性很容易被忽視。- 基礎鑄幣 — LaunchLab 建立它。Token-2022 基礎鑄幣只能透過
initialize_with_token_2022到達,程式只會附加MetadataPointer和(可選)TransferFeeConfig。任何其他內容都會返回NoSupportExtension。預先存在的 Token-2022 鑄幣根本無法作為基礎提供。當附加TransferFeeConfig時,鑄幣的transfer_fee_config_authority是啟動權限 PDA 直到畢業,而其withdraw_withheld_authority是平台配置的transfer_fee_extension_auth(從鑄幣建立開始)——launchpad 程式本身沒有提取預留指令。見products/launchlab/platform-config。 - 報價鑄幣 — LaunchLab 不建立它也不篩選它。
CreateConfig接受給定的鑄幣帳戶,所以報價端沒有is_supported_mint等效項。唯一的限制是管理員選擇綁定到GlobalConfig的鑄幣。
TransferHook 報價鑄幣會在每次買入、賣出和費用領取時在每個以它報價的流動性池中執行其鉤子,而 PermanentDelegate 報價鑄幣會讓委託人掃過這些流動性池的報價金庫。程式都不會阻止這兩者。
LaunchLab 在綁定報價鑄幣後正確處理的內容:
- 報價金庫、兩個費用金庫和分享費用接收者的代幣帳戶都在報價鑄幣自己的程式上建立。
- 報價端的
TransferFeeConfig被計入所有四個交易指令中,滑點界限針對支付者的淨額而不是金庫的總移動進行檢查。見products/launchlab/instructions。 PoolState.token_program_flag記錄兩個鑄幣的程式——bit0 用於基礎鑄幣,bit1 用於報價鑄幣。按位解碼;位元組不是布林值。見products/launchlab/accounts。
Initialize 指令仍然採用僅限舊版的報價程式,因此具有 Token-2022 報價鑄幣的配置只能透過 InitializeV2 和 InitializeWithToken2022 到達。
CPMM 和 CLMM 擴充功能允許清單
在下面涵蓋的兩個短路之後,程式迭代鑄幣的擴充功能,如果它帶有任何除了這五個之外的擴充功能,則拒絕鑄幣:
不在此清單中的任何內容——
TransferHook、NonTransferable、ConfidentialTransferMint、PermanentDelegate、MintCloseAuthority、DefaultAccountState、GroupPointer、GroupMemberPointer、MemberPointer、Pausable 等——導致 is_supported_mint 返回 false 並且流動性池建立還原。
相關行(CPMM,CLMM 中的相同形狀):
cp-swap/src/utils/token.rs
繞過路徑
不符合允許清單的 Token-2022 鑄幣仍然可以被允許,透過每個程式中的一個機制。兩個程式也曾在過去帶有硬編碼的繞過機制;沒有一個存活下來。is_supported_mint 現在在兩個程式中是逐位元組相同的函數:舊版 SPL Token 鑄幣通過,具有登錄 PDA 的鑄幣通過,其他所有內容必須只帶有允許清單擴充功能。
唯一的繞過:按鑄幣登錄
兩個程式都查詢種子為[b"support_mint", mint] 的 SupportMintAssociated PDA。如果該 PDA 對鑄幣存在,無論其擴充功能集如何,鑄幣都被允許。
每個程式都有自己的 PDA 副本(它們在不同的程式 ID 下派生)、自己的 CreateSupportMintAssociated / CloseSupportMintAssociated 對,以及自己的專用權限以及共享管理員:
這四個金鑰(CPMM 和 CLMM × 主網和開發網)列於支援鑄幣註冊表授權。
在兩個程式中,指令接受 crate::admin::ID 或該程式的專用權限,並要求鑄幣由 Token-2022 擁有。效果:特定的 Token-2022 鑄幣可以選擇加入流動性池建立,無需程式升級——這就是為什麼硬編碼清單可以消失。
每個程式從每個它擁有的流動性池建立路徑查詢登錄:CPMM 從 Initialize 和 InitializeWithPermission(後者是 LaunchLab 畢業使用的,所以登錄的鑄幣也畢業並建立),CLMM 從 CreatePool、CreateCustomizablePool 和 CreatePermissionedPool。
移除的繞過
兩個硬編碼機制都已從已部署的程式中移除。它們在此處記錄只是因為針對舊行為編寫的整合可能仍然假設它們。靜態 MINT_WHITELIST — 已移除
一個基礎 58 鑄幣地址常數陣列曾經在擴充功能迭代之前短路 is_supported_mint。CLMM 的持有六個地址並在 2026-07-24 刪除;CPMM 的持有相同集合的前四個並在 2026-09-09 升級中刪除。
已為這些鑄幣之一存在的流動性池保持交易——鑄幣檢查只在流動性池建立時執行。現在為其中之一建立新流動性池需要為其登錄 PDA。
Superstate 權限形狀檢測 — 已移除
CLMM 曾短暫透過其權限形狀而不是地址識別 Superstate 的代幣化資產:Token-2022 鑄幣,其freeze_authority 和 永久委託都等於 superstate_allowlist::ID,DefaultAccountState 設定為 Frozen,被允許。這是一個啟發式方法,所以任何具有相同形狀的未來鑄幣都會被自動允許。
它在 2026-07-31 與 superstate_allowlist 模組一起刪除。替代它的更窄並服務不同的目的:frozen_position_nft_authorities::IDS,它不允許任何東西——它決定位置 NFT 是否被凍結,並在上方描述。舊啟發式方法匹配的一個發行人權限是該清單中的一個條目。
繞過不豁免的內容
繞過跳過擴充功能允許清單,但程式仍然強制執行:- 鑄幣由
Token或Token-2022擁有。自訂代幣程式在上游被拒絕。 - 流動性池金庫使用 Token-2022 流動性池的正確 ATA 擴充功能建立(
ImmutableOwner等)。 - 所有轉移都透過
transfer_checked進行——費用軸承鑄幣在金庫中登陸正確的金額。
TransferHook 不會獲得交換時間檢查;鉤子會簡單地在每次轉移時執行,可能會破壞交換。登錄鑄幣因此是高信任操作。
“被阻止”語義
當is_supported_mint 返回 false 時,流動性池建立還原為 ErrorCode::NotSupportMint(CPMM)/ ErrorCode::NotSupportMint(CLMM)。見reference/error-codes了解數值代碼。
現有流動性池無法追溯性地失敗此檢查——限制只在建立時執行。鑄幣擴充功能對於 Raydium 拒絕的類別是不可變的(轉移鉤子、不可轉移、機密轉移無法在建立後添加),所以靜態檢查是充分的。
為什麼每個被排除的擴充功能被排除
- TransferHook — 在每次轉移時調用自訂程式,具有任意 CU 消耗、任意失敗條件以及重新進入呼叫程式的能力。不存在安全沙箱。一些 DEX 維護鉤子允許清單;Raydium 不維護。
- NonTransferable —
Transfer始終失敗。流動性池無法取得保管。 - ConfidentialTransfer — 轉移金額被加密;曲線無法為交換定價。
- PermanentDelegate — 委託人的持有者可以掃過任何代幣帳戶,包括流動性池金庫。只能透過登錄鑄幣允許,這是受信任發行人(例如受監管的穩定幣)逐案登錄的方式。
- MintCloseAuthority — 鑄幣可以關閉;現有流動性池變得不可用。預設不允許。
- DefaultAccountState (Frozen) — 流動性池 ATA 會登陸
Frozen狀態並需要按帳戶解凍。只能透過登錄鑄幣允許,這假設發行人在登錄時解凍機構帳戶。 - Group/Member 指標 — 不是主動有害的,但未審查。預設不允許以保持表面狹窄。
轉移費用會計
對於帶有TransferFeeConfig 的鑄幣,每次交換、存款和提款移動的金額少於名義金額。涉及兩個單獨的數字,SDK 將它們分開:
- 流動性池費用(LP + 協議 + 基金 + 建立者)來自曲線。
raydium.cpmm.computeSwapAmount({ ... })將其作為fee返回,以及amountIn、amountOut、minAmountOut、executionPrice、priceImpact和原始swapResult。 - Token-2022 轉移費用來自鑄幣,不是流動性池。它由
@raydium-io/raydium-sdk-v2中的getTransferAmountFee幫助程式計算,它們返回GetTransferAmountFee:
computePairAmount 返回 inputAmountFee 和 anotherAmount 作為 GetTransferAmountFee 值。
正確的 UI 顯示:
- 輸入金額加上其轉移
fee作為「你發送」 - 輸出金額減去其轉移
fee作為「你接收」 - 流動性池
fee作為單獨的行——它不是 Token-2022 費用
amountIn → amountOut 的天真 UI 低估了成本。將叢集中的 epochInfo 傳遞到這些幫助程式中,而不是快取它;時代是選擇鑄幣的 older 和 newer 費用配置之間的內容。
maximumFee 上限
Token-2022 轉移費用按轉移上限。對於具有 10,000 代幣上限的 1% 鑄幣,100,000,000 代幣轉移只支付 10,000 的費用。SDK 的 computeSwapAmount 應用上限;直接程式呼叫者必須複製它。
時代轉換
鑄幣權限可以計劃在下一個時代激活的費率變更。在轉換視窗期間,兩個配置(older、newer)同時存在於鑄幣上,TransferChecked 按當前時代選擇。CPMM SwapV2 和 CLMM SwapV2 都在 accounts 中傳遞完整的鑄幣帳戶,所以程式讀取正確的配置而無需額外查詢。
如果你透過交易 API 或 SDK 提前引用多個時代,執行的費用可能與引用的費用不同——由舊配置的 maximum_fee_basis_points 限制。
利息軸承和 ScaledUiAmount
流動性池持有本金;「UI 金額」是本金乘以時間相關或管理員設定的縮放因子。交換數學在本金上運作:pool.token0Vault.amount 視為本金。
“Token-2022 流動性池”定義
如果任一鑄幣具有programId == TokenzQdB...,流動性池是 Token-2022 流動性池。API 表面這個:
programId 分派,使用 hasTransferFee 表面 UI 警告。
SDK 幫助程式
常見整合錯誤
- 僅預檢程式 ID。 鑄幣可以是 Token-2022 且不受支援。在允許流動性池建立之前,針對允許清單檢查擴充功能清單,並檢查鑄幣的登錄 PDA。
- 當鑄幣根本不被接受時信任 SDK 的報價。 報價 API 不拒絕報價——流動性池建立是還原的內容。在在 UI 中公開流動性池建立之前,確認
is_supported_mint語義離線。 - 引用時不考慮轉移費用。 具有 0.25% CPMM 流動性池兩側的 1% 轉移費用鑄幣的有效費用約為 2.25%,而不是 0.25%。使用 SDK 報價或交易 API 報價——永遠不要僅從流動性池的費用層級手動計算費用。
- 在 Token-2022 流動性池上呼叫舊版
Swap指令。Swap早於 Token-2022。每當任一鑄幣是 Token-2022 時使用SwapV2。 - 自動列出新的 Token-2022 鑄幣。 錢包和聚合器應在向使用者表面鑄幣之前檢查
TransferHook和NonTransferable;兩者都對 Raydium 不利。
未來工作
Solana 生態系統和協議路線圖項目,將改變此矩陣:- Solana 級別允許清單轉移鉤子程式(生態系統慣例演變)。
- 機密轉移相容 AMM(研究階段)。
- 更廣泛的 CPMM 按鑄幣登錄(與 CLMM 奇偶)。
- 登錄的公開讀取路徑,所以 UI 可以告訴「不受支援」與「不受支援但已登錄」,無需自己派生 PDA。
指標
algorithms/token-2022-transfer-fees— 交換中的費用數學。products/cpmm/instructions—SwapV2、Initialize。products/clmm/instructions—SwapV2、CreatePool、CreateSupportMintAssociated。reference/error-codes— 每個程式的NotSupportMint數值代碼。
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— 按鑄幣登錄指令。raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rs— LaunchLab Token-2022 基礎鑄幣建立。raydium-launchpad/programs/launchpad/src/instructions/admin/create_config.rs— LaunchLab 報價鑄幣綁定(無擴充功能檢查)。

