このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
プログラムレベルのサポート
許可リストチェックは以下の場所にあります:
- CPMM:
raydium-cp-swap/programs/cp-swap/src/utils/token.rs:178のis_supported_mint、Initializeから呼び出し。 - CLMM:
raydium-clmm/programs/amm/src/util/token.rs:280のis_supported_mint、CreatePoolから呼び出し。 - LaunchLab:
raydium-launchpad/programs/launchpad/src/instructions/initialize_with_token_2022.rsのinitialize_with_token_2022(ソースは公開されていません)。
Token-2022 ポジション NFT 制限発行者のフリーズ
ポジション NFT アカウントはデフォルトではフリーズされません。CLMM は、ポジションが V2 オープンパスを使用し、かつ少なくとも 1 つのボルトミントの現在のfreeze_authority がハードコードされた制限発行者リストと一致する場合にのみ、1 つをフリーズします。初期リストには、下記の 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は両方のミントのプログラムを記録します — ベースミント用のビット 0、クォートミント用のビット 1。ビットごとにデコードします。バイトはブール値ではありません。products/launchlab/accountsを参照してください。
Initialize 命令は依然としてレガシーのみのクォートプログラムを取得するため、Token-2022 クォートミントを持つ設定は InitializeV2 と InitializeWithToken2022 を通じてのみ到達可能です。
CPMM と CLMM 拡張機能許可リスト
静的許可リストショートサーキット(下記で説明)の後、プログラムはミントの拡張機能を反復処理し、これら 5 つ以外の任意の拡張機能を持つ場合、ミントを拒否します:
このリストにない何か —
TransferHook、NonTransferable、ConfidentialTransferMint、PermanentDelegate、MintCloseAuthority、DefaultAccountState、GroupPointer、GroupMemberPointer、MemberPointer、Pausable など — は is_supported_mint が false を返し、プール作成が復帰する原因になります。
関連する行(CPMM、CLMM で同じ形状):
cp-swap/src/utils/token.rs:190–200
バイパスパス
許可リストに適合しない Token-2022 ミントは、3 つの明示的なバイパスの 1 つを通じて依然として許可できます。拡張機能反復が実行される前に、順番に試行されます。1. 静的ミント許可リスト
定数MINT_WHITELIST 配列の base58 文字列は各プログラムにハードコードされています。ミントのアドレスが一致する場合、関数は直ちに true を返し、拡張機能チェックは実行されません。
これらのアドレスはプログラムに焼き込まれています。リストを更新するには、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(デブネット)。
3. Superstate 検出 — CLMM のみ
CLMM には、Superstate のトークン化資産専用の 3 番目のパスがあります。これは、CLMM プログラムにリンクされたspl-token-2022 のバージョンがアンパックできない ScaledUiConfig 拡張機能を使用します。依存関係をアップグレードするのではなく、CLMM は権限形状で Superstate トークンを検出します:
raydium-clmm/programs/amm/src/util/token.rs:485
ミントは、4 つすべてが成立する場合、このブランチを通過します:
- その所有プログラムは Token-2022 プログラムです。
- そのフリーズ権限は
superstate_allowlist::IDと等しい。メインネット-ベータとデブネット値については、reference/program-addressesを参照してください。 - その
DefaultAccountState拡張機能はFrozenに設定されています。 - その永続デリゲートも
superstate_allowlist::IDです。
バイパスが放棄しないもの
バイパスは拡張機能許可リストをスキップしますが、プログラムは依然として実施します:- ミントは
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状態で着地し、アカウントごとにフリーズを解除する必要があります。Superstate 検出を通じてのみ許可されます。これは発行者が登録時に機関アカウントをフリーズ解除することを前提としています。 - グループ/メンバーポインター — 積極的に有害ではありませんが、未レビュー。表面を狭く保つためにデフォルトで許可されません。
転送手数料会計
TransferFeeConfig を持つミントの場合、すべてのスワップ、デポジット、および引き出しは名目額より少なく移動します。SDK は計算の両方の半分を表示します:
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 つの設定(older、newer)がミント上に同時に存在し、TransferChecked は現在のエポックで選択します。CPMM SwapV2 と CLMM SwapV2 の両方は accounts で完全なミントアカウントを渡すため、プログラムは追加ルックアップなしで正しい設定を読み取ります。
Trade API または SDK を通じて 1 エポック以上先に引用する場合、実行手数料は引用手数料と異なる可能性があります — 古い設定の maximum_fee_basis_points によって制限されます。
利息ベアリングと ScaledUiAmount
プールは元本を保有します。「UI 額」は元本に時間依存または管理者設定のスケール係数を乗じたものです。スワップ数学は元本で動作します:pool.token0Vault.amount を元本として扱うべきです。
「Token-2022 プール」定義
プールは、いずれかのミントがprogramId == TokenzQdB... を持つ場合、Token-2022 プールです。API はこれを表示します:
programId を使用してディスパッチし、hasTransferFee を使用して UI 警告を表示します。
SDK ヘルパー
一般的な統合ミス
- プログラム 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 とのパリティ)。
- Superstate ヒューリスティックなしで CLMM の
ScaledUiConfigデコーディングが機能するように依存関係をアップグレード。
ポインター
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—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 ベースミント作成。raydium-launchpad/programs/launchpad/src/instructions/admin/create_config.rs— LaunchLab クォートミントバインディング(拡張機能チェックなし)。

