Skip to main content
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
Raydium 不接受任意的 Token-2022 代幣。CPMM 和 CLMM 都執行嚴格的允許清單模式:預設只有一小組擴充功能通過;其他所有功能在建立流動性池時都會被拒絕。少數受信任的代幣透過硬編碼位址被允許;CLMM 另外支援管理員管理的按代幣登記和執行時 Superstate 代幣偵測。本頁是關於強制執行內容和位置的單頁參考,包含程式原始碼的檔案和行號引用。

程式級支援

允許清單檢查位於: CPMM 或 CLMM 上沒有交換時代幣檢查 — 限制只在流動性池建立時觸發。一旦流動性池存在,交換只是信任代幣沒有改變,這對 Token-2022 代幣狀態的不可變部分是正確的。

CLMM 位置 NFT 凍結受限發行者

位置 NFT 帳戶預設保持未凍結。CLMM 只在位置使用 V2 開放路徑至少一個金庫代幣的目前 freeze_authority 符合硬編碼受限發行者清單時凍結一個。初始清單包含 Superstate 偵測路徑下方使用的相同授權。將流動性池 PDA 設定為位置 NFT 代幣的凍結授權本身不是凍結。這是位置保管規則,不是另一個流動性池建立允許清單:
  • 流動性池已經可以存在並保持可交換。
  • 位置 NFT 代幣使用 CLMM 流動性池 PDA 作為其自己的凍結授權;基礎發行者不控制位置 NFT。
  • OpenPositionV2 涵蓋經典 SPL 位置 NFT 超過 Token-2022 流動性池資產。OpenPositionWithToken22Nft 涵蓋 Token-2022 位置 NFT。
  • OpenPosition V1 不檢查金庫代幣,無法服務由已發送清單針對的 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 的代幣。
這使得綁定 Token-2022 報價代幣成為高信任行為,理由與下方 CPMM 和 CLMM 靜態白名單相同:TransferHook 報價代幣會在每次買入、賣出和費用索取時在每個以其報價的流動性池中執行其鉤子,PermanentDelegate 報價代幣會讓委託人掃過這些流動性池的報價金庫。兩者都不被程式阻止。 LaunchLab 一旦報價代幣被綁定就正確處理的內容:
  • 報價金庫、兩個費用金庫和分享費用接收者的代幣帳戶都在報價代幣自己的程式上建立。
  • 報價端的 TransferFeeConfig 被計入所有四個交易指令,滑點界限針對支付者的淨額而不是金庫的總移動進行檢查。見 products/launchlab/instructions
  • PoolState.token_program_flag 記錄兩個代幣的程式 — bit0 用於基礎代幣,bit1 用於報價代幣。按位解碼;位元組不是布林值。見 products/launchlab/accounts
已棄用的 Initialize 指令仍然採用僅限舊版的報價程式,所以具有 Token-2022 報價代幣的配置只能透過 InitializeV2InitializeWithToken2022 到達。

CPMM 和 CLMM 擴充功能允許清單

在靜態白名單短路(下方涵蓋)之後,程式迭代代幣的擴充功能,如果它攜帶任何不在這五個之外的擴充功能,則拒絕代幣: 不在此清單中的任何內容 — TransferHookNonTransferableConfidentialTransferMintPermanentDelegateMintCloseAuthorityDefaultAccountStateGroupPointerGroupMemberPointerMemberPointerPausable 等 — 導致 is_supported_mint 返回 false 並且流動性池建立還原。 相關行(CPMM,CLMM 中形狀相同):
cp-swap/src/utils/token.rs:190–200

繞過路徑

不符合允許清單的 Token-2022 代幣仍然可以透過三個明確繞過之一被允許。它們按順序嘗試,在擴充功能迭代執行之前。

1. 靜態代幣白名單

常數 MINT_WHITELIST 陣列的 base58 字串在每個程式中硬編碼。如果代幣的位址符合,函式立即返回 true 並且不執行擴充功能檢查。 這些位址被烤入程式;更新清單需要透過 3/4 升級多簽進行程式升級。

2. 按代幣登記 — 僅 CLMM

CLMM 另外查詢種子為 [b"support_mint", mint]SupportMintAssociated PDA。如果該 PDA 對代幣存在,無論其擴充功能集如何,它都被允許。 PDA 由 CreateSupportMintAssociatedadmin/create_support_mint_associated.rs)建立。指令受限於兩個簽署者:
  • crate::admin::ID — 標準 Raydium 管理員授權。
  • crate::create_support_mint_associated_owner::ID — 為此目的的專用授權:RayVyjyJQz9vAi126A4sGexKnSU1XeZaHTRcM1mZMPY(主網)、rayf3nEbb3bnfN6RDGFpqPbjc5uUa3tRUzu6UVYrRx5(開發網)。
效果:CLMM 團隊可以選擇特定的 Token-2022 代幣進行流動性池建立,無需程式升級。CPMM 沒有等效項 — 其允許清單嚴格來自原始碼。

3. Superstate 偵測 — 僅 CLMM

CLMM 有第三條路徑專門用於 Superstate 的代幣化資產,它們使用 ScaledUiConfig 擴充功能,連結到 CLMM 程式的 spl-token-2022 版本無法解包。CLMM 不是升級依賴項,而是透過其授權形狀偵測 Superstate 代幣:
raydium-clmm/programs/amm/src/util/token.rs:485 如果所有四個都成立,代幣通過此分支:
  • 其擁有程式是 Token-2022 程式。
  • 其凍結授權等於 superstate_allowlist::ID。見 reference/program-addresses 以取得主網測試版和開發網值。
  • DefaultAccountState 擴充功能設定為 Frozen
  • 其永久委託也是 superstate_allowlist::ID
這是啟發式,不是登記 — Superstate 未來發行的任何具有相同授權形狀的代幣都將自動被允許。

繞過不豁免的內容

繞過跳過擴充功能允許清單,但程式仍然強制執行:
  • 代幣由 TokenToken-2022 擁有。自訂代幣程式在上游被拒絕。
  • 流動性池金庫使用 Token-2022 流動性池的正確 ATA 擴充功能建立(ImmutableOwner 等)。
  • 所有轉移都透過 transfer_checked — 費用承載代幣在金庫中著陸正確金額。
白名單或 PDA 登記的代幣,例如,稍後添加 TransferHook 不會獲得交換時檢查;鉤子會簡單地在每次轉移時執行,可能會破壞交換。因此白名單是高信任行為。

“被阻止”語義

is_supported_mint 返回 false 時,流動性池建立還原為 ErrorCode::NotSupportMint(CPMM)/ ErrorCode::NotSupportMint(CLMM)。見 reference/error-codes 以取得數字代碼。 現有流動性池無法追溯性地失敗此檢查 — 限制只在建立時執行。代幣擴充功能對於 Raydium 拒絕的類別是不可變的(轉移鉤子、不可轉移、機密轉移無法在建立後添加),所以靜態檢查是充分的。

為什麼排除每個擴充功能

  • TransferHook — 在每次轉移時呼叫自訂程式,具有任意 CU 消耗、任意失敗條件和重新進入呼叫程式的能力。不存在安全沙箱。某些 DEX 維護鉤子允許清單;Raydium 不維護。
  • NonTransferableTransfer 始終失敗。流動性池無法取得保管。
  • ConfidentialTransfer — 轉移金額被加密;曲線無法為交換定價。
  • PermanentDelegate — 委託人的持有者可以掃過任何代幣帳戶,包括流動性池金庫。僅透過受信任發行者的靜態白名單允許(例如,受監管的穩定幣)。
  • MintCloseAuthority — 代幣可以被關閉;現有流動性池變得不可用。預設不允許。
  • DefaultAccountState (Frozen) — 流動性池 ATA 會著陸在 Frozen 狀態並需要按帳戶解凍。僅透過 Superstate 偵測允許,假設發行者在註冊時解凍機構帳戶。
  • Group/Member 指標 — 不是主動有害,但未審查。預設不允許以保持表面狹窄。

轉移費用會計

對於攜帶 TransferFeeConfig 的代幣,每次交換、存款和提款移動少於名義金額。SDK 表面計算的兩個部分:
正確的 UI 顯示:
  • amountIn + token2022FeeIn 作為「你發送」
  • amountOut - token2022FeeOut 作為「你接收」
  • feeAmount 作為流動性池費用(LP + 協議),與 Token-2022 轉移費用分開
只顯示 amountIn → amountOut 的天真 UI 低估成本。

maximumFee 上限

Token-2022 轉移費用按轉移上限。對於 1% 代幣,上限為 10,000 代幣,100,000,000 代幣轉移只支付 10,000 費用。SDK 的 computeSwapAmount 應用上限;直接程式呼叫者必須複製它。

紀元轉換

代幣授權可以排程在下一個紀元激活的費率變更。在轉換視窗期間,兩個配置(oldernewer)同時存在於代幣上,TransferChecked 按目前紀元選擇。CPMM SwapV2 和 CLMM SwapV2 都在 accounts 中傳遞完整代幣帳戶,所以程式讀取正確配置而無需額外查詢。 如果你透過 Trade API 或 SDK 提前超過一個紀元報價,執行費用可能與報價費用不同 — 受舊配置的 maximum_fee_basis_points 限制。

計息和 ScaledUiAmount

流動性池持有本金;「UI 金額」是本金乘以時間相關或管理員設定的縮放因子。交換數學對本金進行操作:
SDK 自動轉換。直接 RPC 讀取者應將 pool.token0Vault.amount 視為本金。

“Token-2022 流動性池”定義

如果任一代幣具有 programId == TokenzQdB...,流動性池是 Token-2022 流動性池。API 表面這個:
使用 programId 分派,使用 hasTransferFee 表面 UI 警告。

SDK 幫助程式

常見整合錯誤

  • 僅預檢程式 ID。 代幣可以是 Token-2022 不受支援。在允許流動性池建立之前,針對允許清單(和靜態白名單)檢查擴充功能清單。
  • 當代幣根本不被接受時信任 SDK 的報價。 報價 API 不拒絕報價 — 流動性池建立是還原的。在 UI 中公開流動性池建立之前,確認 is_supported_mint 語義離線。
  • 報價時沒有轉移費用減少。 流動性池兩側的 1% 轉移費用代幣在 0.25% CPMM 流動性池上的有效費用約為 2.25%,而不是 0.25%。使用 SDK 報價或 Trade API 報價 — 永遠不要僅從流動性池的費用層級手動計算費用。
  • 在 Token-2022 流動性池上呼叫舊版 Swap 指令。 Swap 早於 Token-2022。每當任一代幣是 Token-2022 時使用 SwapV2
  • 自動列出新的 Token-2022 代幣。 錢包和聚合器應在向使用者表面代幣之前檢查 TransferHookNonTransferable;兩者都對 Raydium 不利。

未來工作

Solana 生態系統和協議路線圖項目,將改變此矩陣:
  • Solana 級別允許列出的轉移鉤子程式(生態系統慣例演變)。
  • 機密轉移相容 AMM(研究階段)。
  • 更廣泛的 CPMM 按代幣登記(與 CLMM 平價)。
  • 依賴項升級,使 CLMM 的 ScaledUiConfig 解碼無需 Superstate 啟發式工作。
任何著陸時此頁面將被更新。

指標

來源:
  • raydium-cp-swap/programs/cp-swap/src/utils/token.rsMINT_WHITELISTis_supported_mint
  • raydium-clmm/programs/amm/src/util/token.rsMINT_WHITELISTsuperstate_allowlistis_superstate_tokenis_supported_mint
  • 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 報價代幣綁定(無擴充功能檢查)。