Skip to main content
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
Raydium 不接受任意的 Token-2022 鑄幣。CPMM 和 CLMM 都執行嚴格的允許清單模式:預設只有一小組擴充功能通過;其他所有功能在建立流動性池時都會被拒絕。每個程式透過一個機制允許個別鑄幣——一個管理員管理的按鑄幣註冊表 PDA。兩個程式在不同位置都曾有硬編碼的繞過機制;所有這些現在都已刪除。本頁是關於執行內容和位置的單頁參考,並附有程式原始碼的引用。

程式級支援

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

CLMM 位置 NFT 凍結以應對受限發行者

位置 NFT 帳戶預設保持未凍結。CLMM 只在位置使用 V2 開放路徑且至少一個金庫鑄幣的當前 freeze_authority 出現在硬編碼的 frozen_position_nft_authorities::IDS 清單中時才凍結一個。該清單是替代 CLMM 早期 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 報價鑄幣成為高信任操作,原因與下面註冊鑄幣相同: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 和 CreateCustomizablePoolV2。

已移除的繞過機制

兩種硬編碼機制都已從已部署的程式中移除。之所以在此記錄,只是因為針對舊版行為編寫的整合可能仍然假設它們存在。

靜態 MINT_WHITELIST — 已移除

一個 base58 鑄幣地址的常數陣列,用於在擴展迭代之前短路 is_supported_mint。CLMM 曾包含六個地址,於 2026-07-24 刪除;CPMM 曾包含相同集合中的前四個,於 2026-09-09 升級時刪除。 已存在於其中一個鑄幣的資金池會繼續交易 — 鑄幣檢查僅在資金池建立時執行。現在為其中一個建立新資金池需要改為為其註冊 PDA。

Superstate 權限形狀偵測 — 已移除

CLMM 曾短暫地透過權限形狀而非地址來識別 Superstate 的代幣化資產:一個 Token-2022 鑄幣,其 freeze_authority 和 permanent delegate 都等於 superstate_allowlist::ID,且 DefaultAccountState 設定為 Frozen,會被接受。這是一種啟發式方法,因此任何未來具有相同形狀的鑄幣都會自動被接受。 它於 2026-07-31 刪除,同時刪除的還有 superstate_allowlist 模組。取代它的是更狹隘的機制,用途也不同:frozen_position_nft_authorities::IDS,它不接受任何東西 — 它決定頭寸 NFT 是否被凍結,詳見上文。舊啟發式方法匹配的唯一發行人權限是該列表中的唯一條目。

繞過機制不豁免的內容

繞過機制跳過擴展允許清單,但程式仍然強制執行:
  • 鑄幣由 Token 或 Token-2022 擁有。自訂代幣程式會在上游被拒絕。
  • 資金池保管庫使用正確的 ATA 擴展建立,用於 Token-2022 資金池(ImmutableOwner 等)。
  • 所有轉帳都透過 transfer_checked 進行 — 帶費用的鑄幣會在保管庫中存入正確的金額。
列入白名單或 PDA 註冊的鑄幣,例如稍後新增 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 pointers — 不是主動有害的,但未經審查。預設不允許以保持表面狹隘。

轉帳費用會計

對於帶有 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 傳遞給這些幫助程式,而不是快取它;epoch 是選擇鑄幣 older 和 newer 費用配置之間的因素。

maximumFee 上限

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

Epoch 轉換

鑄幣權限可以排定在下一個 epoch 啟動的費率變更。在轉換視窗期間,兩個配置(older、newer)同時存在於鑄幣上,TransferChecked 按當前 epoch 選擇。CPMM SwapV2 和 CLMM SwapV2 都在 accounts 中傳遞完整的鑄幣帳戶,因此程式讀取正確的配置而無需額外查詢。 如果你透過 Trade API 或 SDK 提前引用多個 epoch,執行費用可能與引用費用不同 — 受舊配置的 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 且不受支援。針對允許清單檢查擴展列表,並檢查鑄幣的註冊 PDA,然後再允許資金池建立。
  • 當鑄幣根本不被接受時信任 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 鑄幣。 錢包和聚合器應在向使用者呈現鑄幣之前檢查 TransferHook 和 NonTransferable;兩者都對 Raydium 不利。

未來工作

Solana 生態系統和協議路線圖項目,將改變此矩陣:
  • Solana 級別允許列出的轉帳鉤子程式(生態系統慣例不斷演變)。
  • 機密轉帳相容 AMM(研究階段)。
  • 更廣泛的 CPMM 按鑄幣註冊(與 CLMM 奇偶)。
  • 註冊的公開讀取路徑,以便 UI 可以區分「不受支援」和「不受支援但已註冊」,而無需自行推導 PDA。
當任何一項落地時,此頁面將更新。

指標

來源:
  • 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 報價鑄幣綁定(無擴展檢查)。