このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
このコードの役割。 選択したフィー階層で新しいCLMMプールを作成し、初期集中ポジションを開きます。4つのファイル(
config.ts、createPool.ts、createPosition.ts、utils.ts)にまたがる2つのトランザクションを npx tsx で実行します。コードは raydium-sdk-V2-demo/src/clmm の公式デモから引用し、スタンドアロンで実行するように適応させています。セットアップ
クイックスタートの前提条件を読み、RPC_URL、KEYPAIR、および依存関係がインストールされていることを確認してください。
クイックスタートの依存関係に加えて、以下が必要です:
decimal.js—createPool.tsとcreatePosition.tsでの価格とティック計算。bs58— JSON キーファイルの代わりにKEYPAIR_BS58を使用する場合、config.tsで base58 エンコードされたキーペアをデコードします。tsx—npx tsx経由で以下の.tsファイルを直接実行します。スワップおよび CPMM スクリプトとは異なり、これはnodeで実行される通常の.mjsファイルではありません。
config.ts で cluster を "devnet" に変更するだけでは不十分です。createPool.ts は明示的な programId: CLMM_PROGRAM_ID(メインネットの固定定数で cluster に従いません)を渡します。その直上のコメント化された DEVNET_PROGRAM_ID.CLMM_PROGRAM_ID 行に置き換えてください。createPosition.ts もメインネットの poolId(RAY-USDCプール)をハードコードしています。ステップ2で作成したdevnetプールのIDに置き換えてください。
ステップ1 — config.ts
config.ts として保存します。これはデモリポジトリの src/config.ts.template と同じ形式です。disableFeatureCheck は true に強制されます(SDKがスタートアップ機能検出呼び出しでブロックされないようにするため、非自明な統合では推奨):
config.ts
ステップ2 — createPool.ts
config.ts と同じ場所に保存します。ソース:src/clmm/createPool.ts。
createPool.ts
ステップ3 — createPosition.ts
ソース:src/clmm/createPosition.ts。
createPosition.ts
ステップ4 — utils.ts
ソース:src/clmm/utils.ts。
utils.ts
実行
何が起きたか
トランザクション1 —raydium.clmm.createPool は以下を初期化しました:
(mint1, mint2, ammConfig)の正規PDAでのプール状態、token_0_vaultとtoken_1_vault(ミントのバイト順でソート)、observationリングバッファ、- インラインティック配列ビットマップ、
initialPrice から初期 sqrt_price_x64 を設定しました。
トランザクション2 — raydium.clmm.openPositionFromBase は集中ポジションを開きました:
- ウォレットにポジションNFTをミント(NFT が ポジション。転送するとポジションが転送される)、
- 下限と上限でティック配列を割り当て(これらの範囲の最初のポジションの場合は1回限りのレント。ティック配列はプログラムで閉じられないため、同じ配列内の後続ポジションは追加レントなし)、
mint1のinputAmountと対応するmint2の金額をデポジット(PoolUtils.getLiquidityAmountOutFromAmountInで計算)、- 範囲幅に比例するリクイディティでポジションをクレジット。
[0.000001, 100000])は実質的にフルレンジです。現在のスポット付近でフィーを集中させるために範囲を狭めてください。
フィー階層の選択
clmmConfigs[0] は最低フィー階層です。完全なセットは GET https://api-v3.raydium.io/main/clmm-config で公開されています:
完全な決定マトリックスについては
user-flows/choosing-a-pool-type を参照してください。
よくあるエラー
Pool already exists for this config— この(mint1, mint2, ammConfig)トリプルに対してCLMMプールが既に存在します。既存のプールIDを検索し、ステップ2をスキップしてください。Insufficient funds for amount B— ウォレットに要求されたmintAの金額がありますが、対応するmintBがありません。価格が範囲内にある場合、ポジションを開くには両側にリクイディティが必要です。Tick out of range—lowerPriceまたはupperPriceが表現可能な価格範囲外です。現在の価格に対してより合理的な範囲を使用してください。- 古い価格 — APIからの見積もりは5~60秒古い可能性があります。
executePositionがスリッページで失敗する場合、createPosition.tsのgetRpcClmmPoolInfoブロックをコメント解除して、署名直前にライブ価格を再取得してください。
注意事項
- ポジションNFTが唯一のハンドル。 NFTを失うか転送すると、ポジションへのアクセスが失われます。キーのように扱ってください。
- 範囲外のポジションはフィーを獲得しません。 価格が
[lowerPrice, upperPrice]の外に移動した場合、ポジションは完全に1つのアセットに駐車され、リバランスするまで何も獲得しません。 - ティック配列レントは一方向。 初期化されたことのないティック配列に最初にタッチするポジションがそのレントを支払います。プログラムはティック配列を閉じるパスを公開していないため、そのレントは永続的です。同じ配列内の後続ポジションは無料です。
次のステップ
products/clmm/overview— 完全なCLMM メカニクス。products/clmm/ticks-and-positions— ティックの背後にある数学。algorithms/impermanent-loss— CLMMの無常損失増幅の定量化。user-flows/create-clmm-pool— Raydium UIを使用した同じフロー。

