Skip to main content
このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
バージョン情報。 すべてのデモは @raydium-io/raydium-sdk-v2@0.2.42-alpha を対象とし、Solana mainnet-beta に対して検証済み(2026-04)。プログラム ID は SDK 経由で reference/program-addresses から取得します。

セットアップ

このページのすべてのデモは raydium-sdk-V2-demo/src/clmm のファイルに対応しており、各セクションの横に GitHub リンクがあります。ブートストラップはデモリポジトリの config.ts.templateソース)に従います。disableFeatureCheck: true は非自明な統合の推奨設定です:

CLMM プールの作成

ソース:src/clmm/createPool.ts
SDK は以下を実行します:
  • mint1/mint2 をバイト順でソートしてから導出します。
  • sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64) を計算します。
  • observationtick_array_bitmap_extension アカウントを作成します。
  • ammConfig で定義されたプール作成手数料を支払います。

選択した範囲でポジションを開設

ソース:src/clmm/createPosition.ts
SDK は範囲が接するティック配列を自動的に計算し、未初期化のものがあれば InitTickArray 命令をバンドルします。

既存ポジションの流動性を増加

ソース:src/clmm/increaseLiquidity.ts

流動性を減少(同時に手数料を回収)

ソース:src/clmm/decreaseLiquidity.ts および src/clmm/closePosition.ts
手数料のみを回収 するには、liquidity = new BN(0)decreaseLiquidity を呼び出します。命令の副作用は tokens_fees_owed_{0,1} を決済し、それらを転送することです。 流動性と手数料をゼロにした後、ポジション全体を閉じるには、最終的な decreaseLiquidity 呼び出しで closePosition: true を渡します。SDK は ClosePosition を追加し、NFT をバーンします。
制限付き発行者ポジションは互換性のあるクローズビルダーが必要です。 これらのポジションは凍結された NFT トークンアカウントを持ちます。ClosePosition は、CLMM がアカウントをバーンする前に解凍できるように、ポジションのプール ID を最初の残りアカウントとして追加する必要があります。プログラムソースブランチには SDK 変更が含まれていません。制限付き発行者ポジション作成を有効にする前に、SDK リリースが凍結クローズパスを明示的にサポートしていることを確認してください。
直接 Anchor クライアントの場合、宣言されたアカウントを変更せず、プールを追加します:
すべてのクローズで poolId を渡すことができます。CLMM は positionNftAccount が凍結されている場合にのみ読み込み、これにより 1 つのクライアントパスが古いポジションと新しいポジションの両方と互換性を保ちます。

リワードを回収

ソース:src/clmm/harvestAllRewards.ts
harvestAllRewards は渡されたすべてのプール上のすべてのポジションを走査し、CollectReward(および任意の UpdateRewardInfos)命令をバッチ処理し、必要に応じてトランザクション間で分割します。

スワップ

ソース:src/clmm/swap.ts
computeAmountOutFormat はオンチェーンプログラムと同じロジックを使用してティックマップをオフチェーンで走査し、以下を返します:
  • 予想される出力額、
  • スリッページ後の最小出力額、
  • 実際のスワップが接するティック配列アカウントのリスト(remainingAccounts)。
シミュレーションで返された remainingAccounts を常に渡します。渡すものが少なすぎると、スワップは TickArrayNotFound で途中で戻ります。古いものを渡すと、計算が無駄になります。

カスタマイズ可能な CLMM プールの作成

createCustomizablePool は、プール作成時に動的手数料と片側手数料トグルを公開する新しいエントリポイントです。createPool と同じ形状に 3 つの追加があります:
createPool はデフォルト手数料、リミットオーダーなし、動的手数料なしのパスで機能し続けます。3 つの新しいノブのいずれかが必要な場合は createCustomizablePool を使用します。オンチェーンアカウントリストについては products/clmm/instructions を参照してください。

リミットオーダー

リミットオーダーはユーザー入力を単一のティックに駐車し、スワップがそのティックを横切るときに FIFO で満たされます。出力は決済時にオーナーの ATA にプッシュされます。オーナーが満たされるためにオンラインである必要はありません。

リミットオーダーを開設

SDK は (pool, owner, tick, nonce) から LimitOrderState PDA を導出し、(pool, owner) ごとの LimitOrderNonce をバンプし、そのティックの FIFO コホートにオーダーを挿入します。

オープンオーダーを増加 / 減少

decreaseLimitOrder はオーダーの 未充足 部分からのみ削除できます。充足部分は決済まで ロックされます。両方の命令は、オーダーが既に完全に充足されている場合、InvalidOrderPhase で戻ります。

充足されたオーダーを決済

settleLimitOrder はオーダーの unfilled_ratio_x64 をコホートトラッカーに対して読み込み、充足出力を計算し、オーナーの ATA に転送します。オーナーは自分で呼び出すことができます。limit_order_admin(オフチェーン運用キーパー)もオーナーの代わりに呼び出すことができます。出力はまだオーナーに行きます。 完全に決済されたオーダーを閉じて家賃を回収するには、closeLimitOrder(単一)または closeAllLimitOrder(バッチ)を使用します。多くを一度に決済するには、settleAllLimitOrder は v0 tx に収まるだけ多くの SettleLimitOrder 呼び出しをパックします。

ウォレットの駐車オーダーをリスト(オフチェーン)

アクティブオーダーエンドポイントは、未充足と部分充足の両方のオーダーを 1 つのペイロードで返します(totalAmount / filledAmount / pendingSettle はフェーズを区別します)。閉じたオーダー履歴については /limit-order/history/order/list-by-user?wallet=…(ウォレットごと、nextPageId でページネーション)を使用します。特定のオーダーの完全なイベントログについては /limit-order/history/event/list-by-pda?pda=… を使用します。

Rust CPI スケルトン

SwapV2 の残りアカウント順序:
スワップが拡張機能を必要としない場合は、それを省略します。そうでない場合は、最初の残りアカウントです。

よくある落とし穴

  • スペーシング外のティックエンドポイントInvalidTickIndex。常に TickUtils.getPriceAndTick 経由でスナップします。
  • SwapV2 で提供されるティック配列が不足TickArrayNotFoundcomputeAmountOutFormat を使用して完全なリストを取得します。
  • ビットマップ拡張なしのフルレンジポジション → 拡張 PDA は書き込み可能である必要があります。SDK はこれを自動的に処理します。
  • sqrt_price_x64price と間違える → ここでの 2 倍の混乱は特に痛いです。疑わしい場合は、SDK に人間が読める価格から計算させます。
  • リワードを早すぎるタイミングで回収 → 各回収は 1 つのトランザクションがかかります。多くのポジション間で harvestAllRewards 経由でバッチ処理します。
  • NFT アカウントを自分で閉じるClosePosition は NFT をバーンし、その ATA を閉じます。Token-2022 NFT ミントも閉じます。古典的な SPL Token ミントは供給ゼロのままです。そのプログラムはミントを閉じることができないためです。サポートされているアカウントを別途閉じないでください。そうしないと命令が戻ります。
  • スペーシングされていないティックでリミットオーダーを開設InvalidTickIndex。常に TickUtils.getPriceAndTick 経由で量子化します。
  • 完全に充足されたオーダーで decreaseLimitOrder を呼び出すInvalidOrderPhase。代わりに settleLimitOrder その後 closeLimitOrder を使用します。
  • enableDynamicFee: true を渡しながら dynamicFeeConfigId を忘れるCreateCustomizablePool の戻りは InvalidDynamicFeeConfigParams です。動的手数料をオフにするか、/main/clmm-dynamic-config からコンフィグを選択します。

次のステップ

ソース: