跳轉到主要內容

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
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 顯示。
任何不在此列表中的內容 — TransferHookNonTransferableConfidentialTransferMintPermanentDelegateMintCloseAuthorityDefaultAccountStateGroupPointerGroupMemberPointerMemberPointerPausable 等 — 會導致 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,不執行任何擴展檢查。
程式白名單代幣
CPMMHVbpJAQGNpkgBaYBZQBR1t7yFdvaYVp2vCQQfKKEN4tMCrn4x1Y2HUKko7ox2EZMT6N2t2ZyH7eKtwkBGVnhEq1gFrBfWJ4qE5sCzKm3k3JaAtqZcXUh4LvJygDeketsrsH42b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
CLMM前四個,加上 DAUcJBg4jSpVoEzASxYzdqHMUN8vuTpQyG2TvDcCHfZgAUSD1jCcCyPLybk1YnvPWsHQSrZ46dxwoMniN4N2UEB9
這些位址被烤入程式中;更新清單需要透過 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 發行的任何未來具有相同權限形狀的代幣都將自動被認可。

繞過不豁免的內容

繞過會跳過擴展許可清單,但程式仍然執行:
  • 代幣由 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 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 會應用上限;直接程式呼叫者必須複製它。

期限過渡

代幣權限可以計劃在下一個期限激活的費率變化。在過渡窗口期間,兩個配置(oldernewer)同時存在於代幣上,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 代幣。 錢包和聚合器應在向使用者顯示代幣前檢查 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 基礎代幣建立。