Skip to main content
このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
バージョン情報。 すべての TypeScript デモは @raydium-io/raydium-sdk-v2@0.2.64-alpha を対象としており、最後に 0.2.42-alpha(2026-04)に対して実行され、2026-09-09 に Solana mainnet-beta に対して 0.2.64-alpha ソースに対して呼び出しシグネチャが再確認されました。末尾の Rust CPI スケルトンは raydium-clmm の chore/upgrade-anchor ブランチ、Anchor 1.0.2 を対象としており、CPMM ページと同じピンなので、両者は 1 つのクレート内に共存できます。master はまだ 0.32.1 をピンしています。プログラム ID は reference/program-addresses から SDK 経由で取得します。

セットアップ

このページのすべてのデモは 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) を計算します。
  • observation と tick_array_bitmap_extension アカウントを作成します。
  • ammConfig で定義されたプール作成手数料を支払います。

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

ソース:src/clmm/createPosition.ts
SDK は範囲が接するティック配列を計算し、それらをアカウントとして渡します。init 命令をバンドルする必要はありません。init-tick-array 命令はなく、OpenPosition* は不足しているティック配列を自身で割り当てます。支払者の費用で。

既存ポジションのリクイディティを増加

ソース:src/clmm/increaseLiquidity.ts

リクイディティを減少(同時に手数料を回収)

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

リワードを回収

ソース:src/clmm/harvestAllRewards.ts
harvestAllRewards は渡されたすべてのプール上のすべてのポジションを走査し、手数料とリワードを決済するゼロリクイディティ DecreaseLiquidity 呼び出し(および任意の UpdateRewardInfos)をバッチ処理し、必要に応じてトランザクション全体に分割します。

スワップ

ソース:src/clmm/swap.ts
シミュレーションはオンチェーンプログラムと同じロジックでティックマップをオフチェーンで走査し、出力額(amountCalculated)とスワップが接するアカウントの正確なリスト(accounts)を返します。 シミュレーションが返す remainingAccounts を常に渡してください。不足していると、スワップは NotEnoughTickArrayAccount でウォーク途中に戻ります。古いものは単にコンピュートを浪費します。
PoolUtils.computeAmountOutFormat はまだ存在しますが、ComputeClmmPoolInfo(getPoolInfoFromRpc からの computePoolInfo。API プールオブジェクトではない)と 2 つの追加必須引数 — tickarrayBitmapExtension と blockTimestamp — が必要です。また、raydium.clmm.fetchTickArrays メソッドはありません(fetchTickArrays はフリー関数です。モジュールレベルのヘルパーは PoolUtils.fetchMultiplePoolTickArrays と getPoolInfoFromRpc が返す tickData / tickArrays です)。

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

createCustomizablePool はプール作成時に動的手数料と片側手数料トグルを公開するエントリポイントです。createPool の形状に加えて 2 つ の追加があります:
enableDynamicFee フラグはなく、dynamicFeeConfigId パラメータもなく、startTime もありません。 dynamicFeeConfig を指定することが動的手数料を有効にします — それを省略すると、エラーなしで静的手数料プールが得られます。また、SDK enum メンバーは TokenOnlyA / TokenOnlyB ですが、オンチェーン Rust enum は Token0Only / Token1Only と綴ります。数値は一致します(FromInput = 0)。
createPool はデフォルト手数料、動的手数料なしのパスで機能し続けます。どちらかのノブが必要な場合は常に createCustomizablePool を使用してください。オンチェーンアカウントリストについては products/clmm/instructions を参照してください。

リミットオーダー

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

リミットオーダーを開設

SDK は (owner, nonce PDA, order nonce) から LimitOrderState PDA を導出し、ウォレットごとの 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 の残りアカウント順序:
スワップが拡張を必要としない場合、それを省略します。そうでなければ、それは最初の残りアカウントです。

よくある落とし穴

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

次に進む

ソース: