Skip to main content
このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
Raydium は任意の Token-2022 ミントを受け入れません。CPMM と CLMM の両方は厳密な許可リストモードで動作します。デフォルトでは限定的な拡張機能セットのみが通過し、その他はすべてプール作成時に拒否されます。各プログラムは 1 つのメカニズム(管理者が管理するミント単位のレジストリ PDA)を通じて個別のミントを認めます。両プログラムは過去のさまざまなポイントでハードコードされた回避方法を持っていましたが、それらはすべて削除されました。このページは、何が実施されているか、どこで実施されているかについての単一ページのリファレンスで、プログラムソースへの引用が含まれています。

プログラムレベルのサポート

許可リストチェックは以下の場所にあります: CPMM または CLMM にはスワップ時のミントチェックはありません — ゲートはプール作成時にのみ発火します。プールが存在すると、スワップは単にミントが変更されていないことを信頼します。これは Token-2022 ミント状態の不変部分に対して正しいです。

CLMM ポジション NFT 制限発行者のフリーズ

ポジション NFT アカウントはデフォルトではフリーズされません。CLMM は、ポジションが V2 オープンパスを使用し、かつ少なくとも 1 つのボールトミントの現在の freeze_authority がハードコードされた frozen_position_nft_authorities::IDS リストに表示される場合にのみフリーズします。このリストは CLMM の以前の Superstate トークン検出に置き換わったもので、古いヒューリスティックが一致した発行者権限と同じものを持ちます。プール PDA をポジション NFT ミントのフリーズ権限として設定することは、それ自体はフリーズではありません。これはプール作成許可リストではなく、ポジション保管ルールです:
  • プールは既に存在でき、スワップ可能なままです。
  • ポジション NFT ミントは CLMM プール PDA をそれ自身のフリーズ権限として使用します。基礎となる発行者はポジション NFT を制御しません。
  • OpenPositionV2 は Token-2022 プール資産上の従来の SPL ポジション NFT をカバーします。OpenPositionWithToken22Nft は Token-2022 ポジション NFT をカバーします。
  • OpenPosition V1 はボールトミントを検査せず、配布されたリストが対象とする Token-2022 制限資産に対応できません。
  • 既存のポジションは変更されません。
フリーズされたポジションは所有者によって管理可能なままですが、転送できません。ClosePosition はクライアントがプールを最初の残りアカウントとして渡すときに、アトミックにフリーズを解除して焼却します。products/clmm/ticks-and-positions を参照してください。

LaunchLab クォートミント

LaunchLab の 2 つのミントは非常に異なる方法でゲートされており、非対称性は見落としやすいです。
  • ベースミント — 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 です — ローンチパッドプログラム自体には引き出し保留命令がありません。products/launchlab/platform-config を参照してください。
  • クォートミント — LaunchLab は作成せず、スクリーニングもしません。CreateConfig はミントアカウントをそのまま受け入れるため、クォート側に is_supported_mint 相当のものはありません。唯一のゲートは、管理者が GlobalConfig にバインドすることを選択するミントです。
これにより、Token-2022 クォートミントをバインドすることは高信頼アクションになります。理由は以下のミント登録と同じです:TransferHook クォートミントはそれが引用されるすべてのプール内のすべての買い、売り、手数料請求でそのフックを実行し、PermanentDelegate クォートミントはデリゲートがそれらのプールのクォートボールトをスイープできるようにします。どちらもプログラムによってブロックされません。 LaunchLab がクォートミントがバインドされると正しく処理するもの:
  • クォートボールト、両方の手数料ボールト、およびシェア手数料受信者のトークンアカウントはクォートミント自身のプログラムで作成されます。
  • クォート側の TransferFeeConfig はすべての 4 つのトレード命令に価格設定され、スリッページ境界はボールトの総移動ではなく支払者の純額に対してチェックされます。products/launchlab/instructions を参照してください。
  • PoolState.token_program_flag は両方のミントのプログラムを記録します — ベースミント用の bit0、クォートミント用の bit1。ビットごとにデコードします。バイトはブール値ではありません。products/launchlab/accounts を参照してください。
非推奨の Initialize 命令は依然としてレガシーのみのクォートプログラムを受け取るため、Token-2022 クォートミントを持つ設定は InitializeV2 と InitializeWithToken2022 を通じてのみ到達可能です。

CPMM と CLMM 拡張機能許可リスト

下記でカバーされた 2 つのショートサーキットの後、プログラムはミントの拡張機能を反復処理し、これら 5 つ以外の拡張機能を持つミントを拒否します: このリストにない何か — TransferHook、NonTransferable、ConfidentialTransferMint、PermanentDelegate、MintCloseAuthority、DefaultAccountState、GroupPointer、GroupMemberPointer、MemberPointer、Pausable など — は is_supported_mint が false を返し、プール作成がリバートします。 関連する行(CPMM、CLMM で同じ形状):
— cp-swap/src/utils/token.rs

回避パス

許可リストに適合しない Token-2022 ミントは、各プログラムの 1 つのメカニズムを通じて認められることができます。両プログラムは過去にハードコードされた回避方法も持っていました。それらのどれも生き残っていません。 is_supported_mint は現在、両プログラムで完全に同じ関数です:レガシー SPL Token ミントは通過し、ミントがレジストリ PDA を持つと通過し、その他はすべて許可リストに登録された拡張機能のみを持つ必要があります。

唯一の回避方法:ミント単位レジストリ

両プログラムは、シード [b"support_mint", mint] で SupportMintAssociated PDA を参照します。そのミント用の PDA が存在する場合、ミントは拡張機能セットに関係なく認められます。 各プログラムは PDA の独自のコピー(異なるプログラム ID の下で派生)、独自の CreateSupportMintAssociated / CloseSupportMintAssociated ペア、および共有管理者と並んで独自の専用権限を持ちます: 4 つのキー(CPMM と CLMM × メインネットとデブネット)は サポートミントレジストリ権限 の下に一覧されています。 両プログラムで命令は crate::admin::ID またはそのプログラムの専用権限のいずれかを受け入れ、ミントが Token-2022 によって所有されていることを要求します。効果:特定の Token-2022 ミントはプログラムアップグレードなしでプール作成にオプトインできます — これが、ハードコードされたリストが削除できた理由です。 各プログラムは、それが持つすべてのプール作成パスからレジストリを参照します:CPMM は Initialize と InitializeWithPermission から(後者は LaunchLab 卒業が使用するため、登録されたミントは卒業と同様に作成されます)、CLMM は CreatePool、CreateCustomizablePool および CreatePermissionedPool から。

削除された回避方法

両方のハードコードされたメカニズムは配布されたプログラムから削除されました。古い動作に対して書かれた統合が依然としてそれらを想定しているかもしれないため、ここでのみ文書化されています。

静的 MINT_WHITELIST — 削除

base58 ミントアドレスの定数配列は、拡張機能反復の前に is_supported_mint をショートサーキットするために使用されていました。CLMM の 6 つのアドレスは 2026-07-24 に削除されました。CPMM の同じセットの最初の 4 つは 2026-09-09 アップグレードで削除されました。 これらのミントの 1 つに対して既に存在するプールは取引を続けます — ミントチェックはプール作成時にのみ実行されます。現在、これらの 1 つに対して新しいプールを作成するには、代わりにそれのレジストリ PDA が必要です。

Superstate 権限形状検出 — 削除

CLMM は、アドレスではなく権限形状によって Superstate のトークン化資産を簡潔に識別しました:freeze_authority と 永続デリゲートの両方が superstate_allowlist::ID に等しく、DefaultAccountState が Frozen に設定された Token-2022 ミントは認められました。これはヒューリスティックだったため、同じ形状を持つ将来のミントは自動的に認められていたでしょう。 2026-07-31 に superstate_allowlist モジュールと共に削除されました。それに置き換わったものはより狭く、異なる目的に役立ちます:frozen_position_nft_authorities::IDS は何も認めません — ポジション NFT がフリーズされるかどうかを決定し、上記で説明されています。古いヒューリスティックが一致した 1 つの発行者権限がそのリストの 1 つのエントリです。

回避方法が放棄しないもの

回避方法は拡張機能許可リストをスキップしますが、プログラムは依然として実施します:
  • ミントは 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 状態で着地し、アカウントごとにフリーズを解除する必要があります。ミント登録によってのみ認可可能です。これは発行者が登録時に機関アカウントをフリーズ解除することを想定しています。
  • Group/Member ポインター — 積極的に有害ではありませんが、未レビューです。デフォルトで許可されず、表面を狭く保ちます。

転送手数料会計

TransferFeeConfig を持つミントの場合、すべてのスワップ、デポジット、および引き出しは名目額より少なく移動します。 2 つの別個の数値が関係し、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 を渡します。キャッシュしないでください。エポックはミントの older と newer 手数料設定の間で選択するものです。

maximumFee キャップ

Token-2022 転送手数料は転送ごとにキャップされます。1% ミントで 10,000 トークンキャップの場合、100,000,000 トークン転送は手数料で 10,000 のみを支払います。SDK の computeSwapAmount はキャップを適用します。直接プログラム呼び出し元はそれを複製する必要があります。

エポック遷移

ミント権限は、次のエポックで有効になる手数料レート変更をスケジュールできます。遷移ウィンドウ中、 2 つの設定(older、newer)がミント上に同時に存在し、TransferChecked は現在のエポックで選択します。CPMM SwapV2 と CLMM SwapV2 の両方は accounts で完全なミントアカウントを渡すため、プログラムは追加のルックアップなしで正しい設定を読み取ります。 Trade API または SDK を通じて 1 エポック以上先に引用する場合、実行手数料は引用手数料と異なる可能性があります — 古い設定の maximum_fee_basis_points によってバウンドされます。

利息ベアリングと ScaledUiAmount

プールは元本を保有します。「UI 金額」は元本に時間依存またはアドミン設定スケール係数を掛けたものです。スワップ数学は元本で動作します:
SDK は自動的に変換します。直接 RPC リーダーは pool.token0Vault.amount を元本として扱うべきです。

「Token-2022 プール」定義

プールは、いずれかのミントが programId == TokenzQdB... を持つ場合、Token-2022 プールです。API はこれを表示します:
ディスパッチするには programId を使用し、UI 警告を表示するには hasTransferFee を使用します。

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 クォートミント バインディング(拡張機能チェックなし)。