メインコンテンツへスキップ

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 拡張機能許可リスト

静的許可リストの短いサーキット後(以下で説明)、プログラムはミントの拡張機能を反復し、これらの 5 つ以外の拡張機能を持つミントを拒否します:
拡張機能許可される理由
TransferFeeConfigプール数学は受信手数料を差し引きます。Token-2022 プログラムは送信手数料を処理します。algorithms/token-2022-transfer-fees を参照。
MetadataPointer装飾的 — オンチェーンメタデータを指します。
TokenMetadata装飾的 — インラインメタデータ。
InterestBearingConfigプールは元本金額を認識します。UI 乗数は装飾のみで、基礎残高は保持されます。
ScaledUiAmount利息付きと同じ形状 — スケール係数は UI 表示にのみ適用されます。
このリストにないもの — TransferHookNonTransferableConfidentialTransferMintPermanentDelegateMintCloseAuthorityDefaultAccountStateGroupPointerGroupMemberPointerMemberPointerPausable など — は is_supported_mintfalse を返し、プール作成が戻ります。 関連する行(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 ミントは、3 つの明示的な迂回路のいずれかを通じて許可されることができます。拡張機能の反復が実行される前に、順番に試みられます。

1. 静的ミント許可リスト

定数 MINT_WHITELIST の base58 文字列の配列は各プログラムにハードコードされています。ミントのアドレスが一致する場合、関数は true を直ちに返し、拡張機能チェックは実行されません。
プログラムホワイトリストされたミント
CPMMHVbpJAQGNpkgBaYBZQBR1t7yFdvaYVp2vCQQfKKEN4tM, Crn4x1Y2HUKko7ox2EZMT6N2t2ZyH7eKtwkBGVnhEq1g, FrBfWJ4qE5sCzKm3k3JaAtqZcXUh4LvJygDeketsrsH4, 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
CLMM同じ 4 つ、加えて DAUcJBg4jSpVoEzASxYzdqHMUN8vuTpQyG2TvDcCHfZg, AUSD1jCcCyPLybk1YnvPWsHQSrZ46dxwoMniN4N2UEB9
これらのアドレスはプログラムに焼き付けられています。リストを更新するには、3/4 アップグレード マルチシグを通じたプログラムアップグレードが必要です。

2. ミント単位のレジストリ — CLMM のみ

CLMM はさらに、シード [b"support_mint", mint]SupportMintAssociated PDA に相談します。そのミントに対して PDA が存在する場合、その拡張機能セットに関係なく許可されます。 PDA は CreateSupportMintAssociated によって作成されます(admin/create_support_mint_associated.rs)。命令は 2 つの署名者にゲート制限されています:
  • crate::admin::ID — 標準 Raydium 管理者権限。
  • crate::create_support_mint_associated_owner::ID — この目的専用の権限:RayVyjyJQz9vAi126A4sGexKnSU1XeZaHTRcM1mZMPY(メインネット)、rayf3nEbb3bnfN6RDGFpqPbjc5uUa3tRUzu6UVYrRx5(デブネット)。
効果:CLMM チームはプログラムアップグレードなしで特定の Token-2022 ミントをプール作成にオプトインできます。CPMM には同等のものがありません — その許可リストは厳密にソースコード化されています。

3. Superstate検出 — CLMM のみ

CLMM には、Superstate のトークン化資産専用の 3 番目のパスがあります。これらは CLMM プログラムにリンクされた spl-token-2022 のバージョンがアンパックできない ScaledUiConfig 拡張機能を使用します。依存関係をアップグレードするのではなく、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 ミントは、すべての 4 つが成立する場合、このブランチをパスします:
  • そのプログラムの所有者は 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_mintfalse を返すと、プール作成は 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 は計算の両半分を表示します:
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 はキャップを適用します。直接プログラム呼び出し元はそれを複製する必要があります。

エポック遷移

ミント権限は、次のエポックで有効になる手数料レート変更をスケジュールできます。遷移ウィンドウ中、2 つの設定(oldernewer)がミントに同時に存在し、TransferChecked は現在のエポックによって選択されます。CPMM SwapV2 と CLMM SwapV2 の両方とも、accounts に完全なミントアカウントを渡します。したがって、プログラムは余分なルックアップなしで正しい設定を読みます。 Trade API または SDK を通じて 1 つ以上のエポック前にクォートする場合、実行される手数料はクォートされた手数料と異なる可能性があります — より古い設定の 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 を使用し、UI 警告を表示するには hasTransferFee を使用してください。

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 セマンティクスをオフチェーンで確認してください。
  • 転送手数料カットなしでクォートする。 0.25% CPMM プールの両側に 1% 転送手数料ミントがあると、実効手数料は約 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 とのパリティ)。
  • Superstate ヒューリスティックなしで CLMM の ScaledUiConfig デコーディングが機能するように依存関係をアップグレード。
何かが着陸すると、このページが更新されます。

ポインター

ソース:
  • raydium-cp-swap/programs/cp-swap/src/utils/token.rsMINT_WHITELIST, is_supported_mint.
  • raydium-clmm/programs/amm/src/util/token.rsMINT_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 ベースミント作成。