このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
プログラムレベルのサポート
許可リスト チェックは以下の場所にあります:
- CPMM:
raydium-cp-swap/programs/cp-swap/src/utils/token.rsのis_supported_mint。InitializeとInitializeWithPermissionから呼び出されます。 - CLMM:
raydium-clmm/programs/amm/src/util/token.rsのis_supported_mint。CreatePoolから呼び出されます。 - LaunchLab:
raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rsのinitialize_with_token_2022(ソースは公開されていません)。
CLMM ポジション NFT 制限付き発行者のフリーズ
ポジション NFT アカウントはデフォルトではフリーズされません。CLMM は、ポジションが V2 オープン パスを使用し、かつ少なくとも 1 つのボールト ミントの現在のfreeze_authority がハードコードされた frozen_position_nft_authorities::IDS リストに表示される場合にのみ、1 つをフリーズします。このリストは CLMM の以前の Superstate トークン検出に置き換わったもので、古いヒューリスティックが一致した発行者権限と同じものを持ちます。プール PDA をポジション NFT ミントのフリーズ権限として設定することは、それ自体はフリーズではありません。これはプール作成許可リストではなく、ポジション カストディ ルールです:
- プールは既に存在でき、スワップ可能なままです。
- ポジション NFT ミントは CLMM プール PDA を独自のフリーズ権限として使用します。基礎となる発行者はポジション NFT を制御しません。
OpenPositionV2は Token-2022 プール資産上の従来の SPL ポジション NFT をカバーします。OpenPositionWithToken22Nftは Token-2022 ポジション NFT をカバーします。OpenPositionV1 はボールト ミントを検査せず、配布されたリストが対象とする 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にバインドすることを選択するミントです。
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 × メインネットと devnet)は Support-mint レジストリ権限 の下にリストされています。
両プログラムでは、命令は crate::admin::ID またはそのプログラムの専用権限のいずれかを受け入れ、ミントが Token-2022 によって所有されることを要求します。効果:特定の Token-2022 ミントは、プログラム アップグレードなしでプール作成にオプトインできます — これがハードコードされたリストが削除できた理由です。
各プログラムは、それが持つすべてのプール作成パスからレジストリを参照します:CPMM は Initialize と InitializeWithPermission から(後者は LaunchLab 卒業が使用するため、登録されたミントは作成と同様に卒業します)、CLMM は CreatePool、CreateCustomizablePool、CreateCustomizablePoolV2 から。
削除されたバイパス
デプロイされたプログラムから両方のハードコード化されたメカニズムは削除されています。ここで文書化されているのは、古い動作に対して書かれた統合が依然としてそれらを想定している可能性があるためです。静的な MINT_WHITELIST — 削除済み
拡張機能の反復処理の前に is_supported_mint をショートサーキットするために使用されていた base58 ミントアドレスの定数配列。CLMM は 6 つのアドレスを保持していて 2026-07-24 に削除されました。CPMM は同じセットの最初の 4 つを保持していて、2026-09-09 アップグレードで削除されました。
これらのミントの 1 つに対してすでに存在するプールは取引を続けます — ミントチェックはプール作成時にのみ実行されます。現在、これらのいずれかに対して新しいプールを作成するには、代わりにレジストリ PDA が必要です。
Superstate オーソリティ形状検出 — 削除済み
CLMM は、アドレスではなくオーソリティ形状によって Superstate のトークン化資産を識別していました。freeze_authority と permanent delegate の両方が superstate_allowlist::ID に等しく、DefaultAccountState が Frozen に設定されている Token-2022 ミントが許可されていました。これはヒューリスティックだったため、同じ形状を持つ将来のミントは自動的に許可されていたでしょう。
これは 2026-07-31 に superstate_allowlist モジュールとともに削除されました。それを置き換えたのはより狭い範囲のもので、異なる目的を果たします。frozen_position_nft_authorities::IDS は何も許可しません — ポジション NFT が凍結されるかどうかを決定し、上記で説明されています。古いヒューリスティックが一致した 1 つの発行者オーソリティは、そのリストの唯一のエントリです。
バイパスが免除しないもの
バイパスは拡張機能のアロー・リストをスキップしますが、プログラムは依然として以下を強制します。- ミントは
TokenまたはToken-2022のいずれかによって所有されています。カスタムトークンプログラムはアップストリームで拒否されます。 - プールボルトは Token-2022 プール用の正しい ATA 拡張機能で作成されます(
ImmutableOwnerなど)。 - すべての転送は
transfer_checkedを通じて行われます — 手数料を含むミントは正しい金額をボルトに着地させます。
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 金額」はプリンシパルに時間依存またはアドミン設定のスケール係数を乗じたものです。スワップ数学はプリンシパルで動作します。pool.token0Vault.amount をプリンシパルとして扱うべきです。
「Token-2022 プール」定義
プールは Token-2022 プールです。いずれかのミントがprogramId == TokenzQdB... を持つ場合。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 自体を導出することなく「サポートされていない」と「サポートされていないが登録済み」を区別できるようにします。
ポインタ
algorithms/token-2022-transfer-fees— スワップの手数料数学。products/cpmm/instructions—SwapV2、Initialize。products/clmm/instructions—SwapV2、CreatePool、CreateSupportMintAssociated。reference/error-codes— プログラムごとのNotSupportMint数値コード。
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 クォートミント バインディング(拡張機能チェックなし)。

