このページは 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
mint1/mint2をバイト順でソートしてから導出します。sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64)を計算します。observationとtick_array_bitmap_extensionアカウントを作成します。ammConfigで定義されたプール作成手数料を支払います。
選択した範囲でポジションを開設
ソース:src/clmm/createPosition.ts
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 をバーンします。
直接 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 にプッシュされます。オーナーが満たされるためにオンラインである必要はありません。リミットオーダーを開設
(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 呼び出しをパックします。
ウォレットの駐車オーダーをリスト(オフチェーン)
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で提供されるティック配列が不足 →TickArrayNotFound。computeAmountOutFormatを使用して完全なリストを取得します。- ビットマップ拡張なしのフルレンジポジション → 拡張 PDA は書き込み可能である必要があります。SDK はこれを自動的に処理します。
sqrt_price_x64をpriceと間違える → ここでの 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からコンフィグを選択します。
次のステップ
sdk-api/typescript-sdk— 完全な SDK サーフェス。sdk-api/rest-api— クォートとプールメタデータエンドポイント。user-flows/create-clmm-pool— コードなしのウォークスルー。integration-guides/aggregator— パスの一部として CLMM をルーティング。

