このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
products/clmm/accounts(アカウントの説明)および products/clmm/math(数学の説明)と対になっています。引数とアカウント順序については権威的ですが、具体的なバイト レイアウトは IDL から取得されます。
インストラクション一覧
ほとんどの管理者専用インストラクション(
CreateAmmConfig、UpdateAmmConfig、UpdatePoolStatus、CreateSupportMintAssociated、CreateOperationAccount、UpdateOperationAccount、CloseProtocolPosition)は、プログラムのハードコードされた admin 公開鍵によってゲートされます。CreatePermissionPda / ClosePermissionPda は admin 公開鍵または専用の permission_pda_admin キーのいずれかを受け入れます。リワード ストリーム管理インストラクション(TransferRewardOwner、CollectRemainingRewards)は、プログラム管理者ではなくリワード ファンダーによってゲートされます。
V2 サフィックスは「ボルト/NFT で Token-2022 をサポート、ビットマップ拡張スロットが必要」を意味します。SDK は新しいプールに対してデフォルトで V2 を選択します。
CreatePool
引数
前提条件
token_mint_0 < token_mint_1(バイト順)。amm_config.disable_create_pool == false。- ミントは Token-2022 拡張ホワイトリストで拒否されていません。
pool_state.sqrt_price_x64 = sqrt_price_x64、tick_current = floor(log_{1.0001}(price))。pool_state.liquidity = 0(ポジションなし)。pool_state.fee_on = FromInput(レガシー デフォルト)。pool_state.dynamic_fee_infoはゼロ化(動的手数料無効)。
CreateCustomizablePool
新しいプールに推奨されます。CreatePool と同じ効果に加えて、プール単位の手数料回収モードとオプションの動的手数料オプトイン。
引数
CreatePool と同じに加えて、enable_dynamic_fee = true の場合:
前提条件 —
CreatePool と同じ。enable_dynamic_fee = false の場合、dynamic_fee_config は無視されます。
事後条件
pool_state.fee_onは選択されたCollectFeeOnバリアントに設定されます。- 動的手数料が有効な場合:
pool_state.dynamic_fee_infoは提供されたDynamicFeeConfigから初期化されます(5 つのキャリブレーション パラメータがコピーされ、状態フィールドはゼロ化)。 - それ以外の場合:
pool_state.dynamic_fee_infoはゼロ化(= このプールでは動的手数料は永遠に非アクティブ)。
fee_on と動的手数料有効化ビットはプール作成時のみ設定されます。インプレース アップグレードはありません。レガシー CreatePool で作成されたプールは、動的手数料または片側手数料を遡及的に取得することはできません。新しいデプロイメントはこのインストラクションをデフォルトにする必要があります。
CreatePermissionedPool
CreatePool と CreateCustomizablePool は両方とも、プール PDA を ["pool", amm_config, token_mint_0, token_mint_1] から派生させるため、(config, mint0, mint1) トリプルごとに正確に1 つの正規プール アドレスが存在します。同じシードで 2 番目の init は失敗します。CreatePermissionedPool は、クライアント提供の seed_index: u16 をプール PDA シードに折り込むことでその制限を解除し、同じペアと手数料ティアに対して複数のプールを許可します。各プールは独自のアドレスにあります。任意のプール アドレスは特権機能であるため、支払者はそれを認可する Permission PDA を保有する必要があります。
プールに関するその他すべては CreateCustomizablePool と同じです。同じ CreateCustomizableParams を取り、片側手数料と動的手数料オプトインをサポートします。
引数
CreateCustomizablePool と同じに加えて、前面に:
pool_state PDA は ["pool", amm_config, token_mint_0, token_mint_1, seed_index.to_le_bytes()] から派生します。
前提条件
seed_index != 0。seed_indexが0はレガシー プール用に予約されており、ここで拒否されます。[0, 0]シード コンポーネントは、レガシー プール アドレスを古典的な 4 シード形式に折りたたむものです。payerのpermissionPDA が存在します(管理者がCreatePermissionPdaで作成)。CreatePoolと同じミント/ホワイトリスト ルール。
- 新しい
pool_stateがseed_index派生アドレスに存在し、pool_state.seed_index = seed_index。 - その他すべての事後状態は
CreateCustomizablePoolと一致(手数料モード、オプションの動的手数料)。
このインストラクションは一般的なプール作成アクセスを拡大しません。パーミッションレス作成は
CreatePool / CreateCustomizablePool を通じて継続され、これらは 1 プール/ペアのままです。CreatePermissionedPool は、ホワイトリストに登録されたオペレーターが同じペアに対して複数のプール(例:異なる初期価格またはローンチ コホート)が必要で、管理者から付与された Permission PDA を保有する特定のケースのために存在します。OpenPositionV2 / OpenPositionWithToken22Nft
既存のプール内に新しいポジションを作成します。
引数
数学 —
products/clmm/math を参照してください。base_flag が与えられた場合、プログラムは liquidity または (amount_0_max, amount_1_max) のいずれかを実際の L と消費された実際のトークン金額に解決します。
前提条件
tick_lower < tick_upper、両方ともpool.tick_spacingの倍数、[MIN_TICK, MAX_TICK]内。- 必要なティック配列が渡され、初期化されます(またはトランザクション内で
InitTickArrayCPI を介してここで作成されます)。 - ユーザーはソース ATA に少なくとも
amount_0_maxとamount_1_maxを持っています。
personal_positionが存在し、liquidityが設定され、fee_growth_inside_lastがスナップショットされます。tick_lowerとtick_upperのティック配列エントリが更新されます(liquidity_gross += L、liquidity_net ± L、手数料成長スナップショットが保持)。- ポジションが範囲内の場合(
tick_lower ≤ tick_current < tick_upper)、pool_state.liquidity += L。 - ポジション NFT ミントは
pool_stateをフリーズ権限として記録します。ミント権限は単一の NFT がミントされた後に削除されます。フリーズ権限を記録しても、NFT トークン アカウントの状態は変わりません。 - NFT トークン アカウントは、インストラクションが
OpenPositionV2またはOpenPositionWithToken22Nftかついずれかのボルト ミントのフリーズ権限が CLMM の制限発行者リストと一致する場合を除き、フリーズされたままです。その一致する V2 パスのみがアカウントをフリーズします。OpenPositionV1 はフリーズしません。
InvalidTickIndex、NotApproved、ZeroAmountSpecified、TransactionTooLarge(ティック配列が多すぎる場合)。
ポジション フリーズは宣言されたインストラクション アカウントまたは引数を追加しません。クライアントは既存の V2 レイアウトでこれらのポジションを開くことができます。動作はオンチェーンから
vault_0_mint と vault_1_mint で選択されます。IncreaseLiquidityV2
既に開いているポジションにリクイディティを追加します。
引数
OpenPosition と同じですが、NFT ミントを除く(ポジションは既に存在。NFT は所有者の ATA として 1 トークンを保有)。
効果
- ユーザー → ボルトから
amount_0_actual/amount_1_actualを転送します。 personal_position.liquidityとpool_state.liquidity(範囲内の場合)をインクリメントし、エンドポイント ティックのliquidity_gross/liquidity_netをそれに応じて調整します。- 最後のタッチ以降に owed フィーとリワードを回収し、
tokens_fees_owed_{0,1}/reward_amount_owedにクレジットします。これらはDecreaseLiquidityまたはCollectRewardでのみ支払われ、増加時には支払われません。
DecreaseLiquidityV2
ポジションからリクイディティを削除します。
引数
IncreaseLiquidity と同じ形状。
効果
- 現在の
sqrt_price_x64が与えられた場合、削除されたLの(amount_0, amount_1)を計算します。 - 最後のタッチ以降に発生したフィー/リワードを決済します(
IncreaseLiquidityと同じ)。 amount_0 + fees_owed_0とamount_1 + fees_owed_1をボルトからユーザーに転送します。- リクイディティ カウンターをデクリメントします。新しい
personal_position.liquidity == 0の場合、ポジションはClosePositionの対象になります。
amount_0_min と amount_1_min は、出力側の Token-2022 転送手数料を差し引いた後、ユーザーが受け入れる最小値です。
ClosePosition
ポジション NFT をバーンし、PersonalPositionState を閉じます。
宣言されたアカウント
残りのアカウント
- フリーズされていない NFT:不要。追加のプール アカウントはハンドラーがそれを読み取らないため無害です。
- フリーズされた NFT:最初の残りのアカウントとして
personal_position.pool_idを追加します。プログラムはそれをPoolStateとして読み込み、その PDA シードを使用してシャーに署名します。
personal_position.liquidity == 0。tokens_fees_owed_{0,1} == 0。- すべてのリワード カウンター
reward_amount_owed == 0。
- NFT トークン アカウントがフリーズされている場合、最初の残りのアカウントが
personal_position.pool_idと等しいことを確認し、プール PDA でそれをシャーします。 - NFT をバーンします。
- NFT トークン アカウントと
personal_positionを閉じ、レント払い戻しをnft_ownerに返します。ポジション NFT が Token-2022 を使用する場合、NFT ミントも閉じます。classic SPL Token ミントは閉じることができず、供給量ゼロのままです。
AccountLack で失敗します。すべてのクローズに対してプールを渡すことが最も単純な互換性のある戦略です。
SwapV2
リクイディティ曲線を歩きます。is_base_input に応じて正確な入力または正確な出力。
引数
呼び出し元は、予想されるスワップ ウォークをカバーするランク付けされたティック配列のリストを渡します。プログラムは必要なだけ使用します。SDK は
PoolUtils.computeAmountOutFormat または API のクォート エンドポイント経由でこのリストを計算します。
前提条件
pool_state.statusはスワップを許可します。now >= open_time。sqrt_price_limit_x64は方向に対してsqrt_price_x64の正しい側にあります。
ExceededSlippage、SqrtPriceLimitOverflow、TickArrayNotFound、LiquidityInsufficient。
SwapV2 が内部で行うこと(呼び出し元が知っておくべき)(2025 年リリース後):
- 動的手数料サーチャージ —
pool.dynamic_fee_infoがゼロ以外の場合、プログラムは最後のスワップ以降に走査されたティック距離を使用して変動性アキュムレータを更新し(products/clmm/feesのフィルター/減衰ルール付き)、AmmConfig.trade_fee_rateの上にdynamic_fee_componentを追加します。総手数料は 10%(MAX_FEE_RATE_NUMERATOR / 1_000_000)でキャップされます。 - リミット オーダー マッチング — 価格ウォークがオープン リミット オーダーを保有するティックを交差するとき、プログラムはまずそのティックで利用可能なリミット オーダー リクイディティを約定させ(
order_phaseによる FIFO)、その後 LP リクイディティ曲線に沿って進みます。約定した金額はtick.unfilled_ratio_x64とtick.part_filled_orders_remainingを後の決済用に更新します。オーダー自体は所有者がSettleLimitOrderを呼び出すまで未消費のままです。 - 片側手数料ルーティング —
pool.fee_on = Token0OnlyまたはToken1Onlyの場合、スワップ ステップは同じ入力出力トレードを計算します。その後、手数料は設定された側にルーティングされます。設定された手数料側が出力である方向では、手数料はスワップ出力から差し引かれます(ユーザーはout − feeを受け取ります)。設定された手数料側が入力である方向では、動作はFromInputと一致します。PoolStateのis_fee_on_input(zero_for_one)とis_fee_on_token0(zero_for_one)を参照してください。
Swap(V1)は SwapV2 と同じ動的手数料、片側手数料ルーティング、リミット オーダー マッチングを実装します。唯一欠けている機能は Token-2022 サポートです。両方のボルトは classic SPL Token である必要があります。Token-2022 ミントを持つプールは SwapV2 経由でスワップする必要があります。アグリゲーターと SDK は既にすべての CLMM レッグに対して V2 を優先するため、呼び出し元はミント タイプで分岐する必要がありません。
OpenLimitOrder
特定のティックで売却オーダーを配置します。オーダーはティックごとの FIFO コホートに留まり、価格が通過するときに約定します。
引数
アカウント リスト変更(2026-07 リリース)。
OpenLimitOrder は入力側に加えて出力側アカウント — output_token_account、output_vault、output_vault_mint — も取得するようになりました。これらは検証にのみ使用されます。プログラムは所有者の入力または出力トークン アカウントがフリーズされている場合、オーダーを拒否します。これにより、約定が実際に所有者の出力 ATA に決済できることが保証されます。これは、アカウントがまだシャーされていない可能性があるホワイトリスト/デフォルト フリーズ Token-2022 ミント(例:許可トークン)の場合に重要です。古い片側アカウント リストに対して構築されたクライアントは、3 つの出力アカウントを追加する必要があります。input_token_accountもoutput_token_accountもフリーズされていません(そうでない場合はNotApproved)。pool_state.statusはスワップ(ビット 4)とリミット オーダー(ビット 5)操作の両方を許可します(そうでない場合はNotApproved)。tick_index % pool.tick_spacing == 0かつ[MIN_TICK, MAX_TICK]内。tick_indexは選択された方向に対してpool.tick_currentの右側にあります(token0 を売却 → ティックは現在より上である必要があり、その逆も同様)。既に交差したティックで売却することは即座に約定され、拒否されます。
limit_orderが存在し、開く時点でtick.order_phaseとtick.unfilled_ratio_x64をスナップショットします。tick.orders_amount += amount(現在のコホート内)。limit_order_nonce.order_nonce += 1。OpenLimitOrderEventが発行されます。
NotApproved(入力または出力トークン アカウント フリーズ、またはプールがスワップ/リミット オーダー無効)、InvalidLimitOrderAmount(ゼロまたはプールの最小値以下)、InvalidTickIndex([MIN_TICK, MAX_TICK] 外、または選択された方向に対して tick_current の間違った側)、TickAndSpacingNotMatch(tick_index % pool.tick_spacing != 0)、OrderPhaseSaturated。
IncreaseLimitOrder
既存のオープン オーダーに追加します。オーダーの owner のみが呼び出し可能です。
引数
OpenLimitOrder と同じですが、nonce アカウントを除く。limit_order PDA は直接渡されます。
前提条件
limit_order.owner == signer。- オーダーはまだ同じコホート内にあります(
tick.order_phase == limit_order.order_phase)。コホートが既に約定を開始している場合、オーダーは部分的に決済されています。呼び出し元は最初にDecreaseLimitOrderまたはSettleLimitOrderを呼び出して前に進める必要があります。
- 所有者 ATA から
input_vaultにamountを転送します。 limit_order.total_amount += amount。tick.orders_amount += amount。
DecreaseLimitOrder
オープン オーダーを削減または完全にキャンセルします。未約定の残りを所有者に返し、過去の部分約定で既に決済された出力も返します。
引数
効果
- 開く以降のコホートの
unfilled_ratio_x64からオーダーの約定金額を再計算します。 - 約定した出力を
output_token_accountに送信します。 - 未約定の入力の
amountをinput_token_accountに返します。 limit_orderをそれに応じて更新します。新しい未約定の残りがゼロの場合、プログラムはアカウントを閉じ、レント払い戻しをownerに返します。
SettleLimitOrder
オーダーの未約定の残りを変更せずに、約定した出力トークンを所有者にプッシュします。auto_withdraw キーパーが長時間実行される部分約定をドリップ払いしたい場合に便利です。
呼び出し元 — オーダーの owner、またはプログラムの limit_order_admin(自動化されたキーパー ループを実行するオフチェーン操作ホット ウォレット)。キーパーは他の権限を持ちません。オーダーの owner ATA に約定した出力をプッシュする以外に、ユーザー ファンドを移動することはできません。
アカウント
効果
(limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64)を使用して、owed の累積出力を計算します。- デルタを
output_token_accountに転送します。 limit_order.settled_outputを更新します。- オーダーを閉じません。未約定の入力に対してまだ開いています。
CloseLimitOrder
完全に消費されたオーダー アカウントを閉じます。誰が署名するかに関わらず、レント払い戻しは常に limit_order.owner に返されます。
呼び出し元 — owner または limit_order_admin。
前提条件
- オーダーの未約定の残りがゼロです(
amount == total_amountが約定して決済されたか、所有者が以前にオーダーをゼロに減らして閉じるのを忘れた)。
limit_orderを閉じます。レント払い戻しはlimit_order.ownerに送信されます。
CreateDynamicFeeConfig(管理者)
u16 インデックスの下に再利用可能なパラメータ セットを作成します。
引数
一般的なエラー —
InvalidDynamicFeeConfigParams(decay_period <= filter_period または任意のゼロ値フィールドが範囲外)。
UpdateDynamicFeeConfig(管理者)
既存の DynamicFeeConfig を変更します。作成時に既に設定をスナップショットしたプールは遡及的に更新されません。このコンフィグを参照する新しく作成されたプールのみが新しい値を取得します。
引数 — CreateDynamicFeeConfig と同じ 5 つのキャリブレーション フィールド(filter_period、decay_period、reduction_factor、dynamic_fee_control、max_volatility_accumulator)。index は作成時に固定され、ここで再度渡されません。
CollectProtocolFee / CollectFundFee
CPMM の CollectProtocolFee / CollectFundFee と同じ形状。署名者は AmmConfig.owner / AmmConfig.fund_owner と一致する必要があります。プール ボルトから受取人に発生したプロトコル/ファンド手数料をスイープし、対応する PoolState.protocol_fees_* / fund_fees_* フィールドをゼロにします。
InitializeReward
プールに新しいリワード ストリームを追加します。最大 3 つのストリームが同時にアクティブになる場合があります。
引数
前提条件
- プールで現在 3 未満のストリームがアクティブ。
- ファンダーは
total_emission = emissions_per_second × (end_time − open_time)相当のリワード トークンをこのインストラクションの一部としてボルトに預金します。 operation_stateごとのホワイトリスト リワード ミント。
SetRewardParams
既存のリワード ストリームを拡張、トップアップ、または発行レートを変更します。通常、プール作成者または Raydium マルチシグによって呼び出されます。制約はオンチェーンに存在します。通常、end_time を拡張したり、発行を増やしたりできますが、遡及的に縮小することはできません。operation_state の所有者リストを確認してください。
UpdateRewardInfos
純粋な簿記 — reward_growth_global_x64 を現在の時刻に決済します。emissions_per_second × Δt / liquidity を乗算します。すべてのリクイディティ タッチ インストラクションによって内部的に呼び出されます。外部アクター(UI、クランク)が時々それをトリガーしたいため、スタンドアロン インストラクションとして公開されます。
CollectReward
ポジション所有者が owed リワード トークンを請求します。
アカウント
効果
- リワード成長を決済します(手数料と同じパターン)。
- owed 金額を受取人 ATA に転送し、
reward_amount_owed[i]をゼロにします。
状態変更マトリックス
次のステップ
products/clmm/code-demos— 実行可能な TypeScript サンプル。products/clmm/fees— 手数料とリワード発生の詳細。reference/error-codes— 完全な CLMM Anchor エラー テーブル。
raydium-io/raydium-clmm—programs/amm/src/instructions- Raydium SDK v2 —
@raydium-io/raydium-sdk-v2

