Raydium 不會接受任意 Token-2022 代幣。CPMM 和 CLMM 都運行嚴格的許可清單模式:只有一小部分擴展預設通過;其他所有擴展在建立流動性池時都會被拒絕。一些信任的代幣透過硬編碼位址被認可;CLMM 另外支援管理員管理的每個代幣登記表以及執行時 Superstate 代幣偵測。本頁是單一參考頁面,說明執行的內容以及位置,並附上程式原始碼的檔案和行號引用。
程式級別支援
| 程式 | Token-2022 基礎/報價代幣? | 模式 |
|---|
| CPMM | 可以 — 受限 | 嚴格的擴展許可清單 + 4 個代幣靜態白名單。 |
| CLMM | 可以 — 受限 | 嚴格的擴展許可清單 + 6 個代幣靜態白名單 + 管理員每個代幣登記表 + Superstate 偵測。 |
| AMM v4 | 否 | 程式發佈於 Token-2022 之前;兩個代幣都必須是經典 SPL Token。 |
| Stable AMM | 否 | 與 AMM v4 相同的限制。 |
| Farm v6 | 是,部分 | 獎勵代幣可以是 Token-2022(受相同許可清單限制,當農場包裝 CPMM/CLMM LP 時);使用者質押的 LP 代幣繼承自包裝的池。 |
| LaunchLab | 是,由程式管理 | 基礎代幣可以是 Token-2022,但只能透過專用的 initialize_with_token_2022 指令;程式本身建立具有 MetadataPointer(總是)和可選 TransferFeeConfig(速率 ≤ 5%)的代幣。具有任意擴展的預先存在的 Token-2022 代幣無法用作基礎。 |
| Burn & Earn | 鏡像池程式 | 繼承 CPMM / CLMM 門控。 |
許可清單檢查位於:
CPMM 或 CLMM 上沒有交換時間的代幣檢查 — 門控僅在建立池時啟動。建立池後,交換只信任代幣沒有變化,這對於 Token-2022 代幣狀態的不可變部分是正確的。
CPMM 和 CLMM 擴展許可清單
在靜態白名單短路後(下面涵蓋),程式會遍歷代幣的擴展,如果它帶有除了這五個以外的任何擴展,就會拒絕該代幣:
| 擴展 | 允許的原因 |
|---|
TransferFeeConfig | 池數學會減去入站費用;Token-2022 程式處理出站費用。見 algorithms/token-2022-transfer-fees。 |
MetadataPointer | 裝飾性 — 指向鏈上中繼資料。 |
TokenMetadata | 裝飾性 — 內聯中繼資料。 |
InterestBearingConfig | 池看到本金數額;UI 乘數只是裝飾品,底層餘額保持不變。 |
ScaledUiAmount | 與計息相同形狀 — 比例因數僅適用於 UI 顯示。 |
任何不在此列表中的內容 — TransferHook、NonTransferable、ConfidentialTransferMint、PermanentDelegate、MintCloseAuthority、DefaultAccountState、GroupPointer、GroupMemberPointer、MemberPointer、Pausable 等 — 會導致 is_supported_mint 返回 false 並且池建立還原。
相關行(CPMM,CLMM 中形狀相同):
for e in extensions {
if e != ExtensionType::TransferFeeConfig
&& e != ExtensionType::MetadataPointer
&& e != ExtensionType::TokenMetadata
&& e != ExtensionType::InterestBearingConfig
&& e != ExtensionType::ScaledUiAmount
{
return Ok(false);
}
}
Ok(true)
— cp-swap/src/utils/token.rs:190–200
繞過路徑
不符合許可清單的 Token-2022 代幣仍可透過三個明確繞過之一被認可。它們會在擴展遍歷執行前按順序嘗試。
1. 靜態代幣白名單
一個常數 MINT_WHITELIST 陣列,包含 base58 字串,在每個程式中硬編碼。如果代幣的位址匹配,函數立即返回 true,不執行任何擴展檢查。
| 程式 | 白名單代幣 |
|---|
| CPMM | HVbpJAQGNpkgBaYBZQBR1t7yFdvaYVp2vCQQfKKEN4tM、Crn4x1Y2HUKko7ox2EZMT6N2t2ZyH7eKtwkBGVnhEq1g、FrBfWJ4qE5sCzKm3k3JaAtqZcXUh4LvJygDeketsrsH4、2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo |
| CLMM | 前四個,加上 DAUcJBg4jSpVoEzASxYzdqHMUN8vuTpQyG2TvDcCHfZg、AUSD1jCcCyPLybk1YnvPWsHQSrZ46dxwoMniN4N2UEB9 |
這些位址被烤入程式中;更新清單需要透過 3/4 升級多簽進行程式升級。
2. 每個代幣登記表 — 僅 CLMM
CLMM 另外查詢種子為 [b"support_mint", mint] 的 SupportMintAssociated PDA。如果該 PDA 對代幣存在,無論其擴展集如何,它都被認可。
PDA 由 CreateSupportMintAssociated 建立(admin/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 代幣:
superstate_allowlist::ID == freeze_authority
&& *mint_account_info.owner == spl_token_2022::ID
&& default_account_state_freeze
&& maybe_permanent_delegate
— raydium-clmm/programs/amm/src/util/token.rs:485
如果所有四個都成立,代幣會通過此分支:
- 其擁有程式是 Token-2022 程式。
- 其凍結權限等於
superstate_allowlist::ID。主網:2Yq4T3mPNfjtEyTxSbRjRKqLf1pwbTasuCQrWe6QpM7x。開發網:3TRuL3MFvzHaUfQAb6EsSAbQhWdhmYrKxEiViVkdQfXu。
- 其
DefaultAccountState 擴展設定為 Frozen。
- 其永久代理人也是
superstate_allowlist::ID。
這是啟發式而不是登記表 — Superstate 發行的任何未來具有相同權限形狀的代幣都將自動被認可。
繞過不豁免的內容
繞過會跳過擴展許可清單,但程式仍然執行:
- 代幣由
Token 或 Token-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 沒有。
- NonTransferable —
Transfer 總是失敗。池無法接管保管權。
- ConfidentialTransfer — 轉帳數額是加密的;曲線無法為交換定價。
- PermanentDelegate — 代理人的持有者可以掃除任何代幣帳戶,包括池保管庫。僅允許透過靜態白名單用於信任的發行者(例如,受監管的穩定幣)。
- MintCloseAuthority — 代幣可以關閉;現有池變為不可用。預設不允許。
- DefaultAccountState (Frozen) — 池 ATA 會登陸在
Frozen 狀態中,需要按帳戶解凍。僅允許透過 Superstate 偵測,假設發行者在登記時解凍機構帳戶。
- Group/Member pointers — 不是主動有害,但未經審查。預設不允許以保持表面狹窄。
轉帳費用會計
對於帶有 TransferFeeConfig 的代幣,每次交換、存款和提款移動少於名義數額。SDK 會顯示計算的兩個部分:
const { amountIn, amountOut, feeAmount, token2022FeeIn, token2022FeeOut } =
await raydium.cpmm.computeSwapAmount({ ... });
正確的 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 會應用上限;直接程式呼叫者必須複製它。
期限過渡
代幣權限可以計劃在下一個期限激活的費率變化。在過渡窗口期間,兩個配置(older、newer)同時存在於代幣上,TransferChecked 按當前期限選擇。CPMM SwapV2 和 CLMM SwapV2 都在 accounts 中傳遞完整的代幣帳戶,所以程式讀取正確的配置而無需額外查詢。
如果您透過 Trade API 或 SDK 提前一個以上期限報價,執行費用可能與報價費用不同 — 受舊配置的 maximum_fee_basis_points 限制。
計息和 ScaledUiAmount
池持有本金數額;「UI 數額」是本金乘以時間相關或管理員設定的比例因數。交換數學在本金上運行:
principal_in = ui_amount_in / ui_multiplier(now)
SDK 自動轉換。直接 RPC 讀者應將 pool.token0Vault.amount 視為本金。
「Token-2022 池」定義
如果任一代幣的 programId == TokenzQdB...,池就是 Token-2022 池。API 會顯示這一點:
GET /pools/info/ids?ids=<POOL_ID>
{
"data": [{
"mintA": { "programId": "TokenzQdB...", "hasTransferFee": true, ... },
"mintB": { "programId": "Tokenkeg...", ... }
}]
}
使用 programId 進行分派,使用 hasTransferFee 來顯示 UI 警告。
SDK 輔助工具
import { Raydium, TOKEN_2022_PROGRAM_ID } from "@raydium-io/raydium-sdk-v2";
import { ExtensionType, getExtensionTypes, unpackMint } from "@solana/spl-token";
const raydium = await Raydium.load({ owner, connection });
const acct = await connection.getAccountInfo(mintPubkey);
if (!acct) throw new Error("mint not found");
const mint = unpackMint(mintPubkey, acct, acct.owner);
if (acct.owner.equals(TOKEN_2022_PROGRAM_ID)) {
const extensions = getExtensionTypes(mint.tlvData);
const accepted = new Set([
ExtensionType.TransferFeeConfig,
ExtensionType.MetadataPointer,
ExtensionType.TokenMetadata,
ExtensionType.InterestBearingConfig,
ExtensionType.ScaledUiAmount,
]);
const rejecting = extensions.filter(e => !accepted.has(e));
if (rejecting.length) {
console.warn("Pool creation will revert unless this mint is whitelisted:", rejecting);
}
}
常見整合錯誤
- 只預先檢查程式 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 代幣。 錢包和聚合器應在向使用者顯示代幣前檢查
TransferHook 和 NonTransferable;兩者都是 Raydium 不相容的。
未來工作
Solana 生態系統和協議路線圖項目,會改變此矩陣:
- 在 Solana 級別允許列出的轉帳掛鉤程式(生態系統慣例進化)。
- 機密轉帳相容的 AMM(研究階段)。
- 更廣泛的 CPMM 每個代幣登記表(與 CLMM 的對等)。
- 依賴升級,使 CLMM 的
ScaledUiConfig 解碼在沒有 Superstate 啟發式的情況下工作。
此頁面將在任何上線時更新。
來源:
raydium-cp-swap/programs/cp-swap/src/utils/token.rs — MINT_WHITELIST、is_supported_mint。
raydium-clmm/programs/amm/src/util/token.rs — MINT_WHITELIST、superstate_allowlist、is_superstate_token、is_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 基礎代幣建立。