プールの作成

単一のトランザクションで CPMM 定数積プールを作成し、初期流動性を投入します。

CPMM プールを作成する方法は 2 つあります:

方法
SDK メソッド
呼び出し可能な人
Creator fees

Permissionless

createPool()

誰でも

無効

Permissioned

createPoolWithPermission()

承認済みアドレスのみ

有効、設定可能

ほとんどの integrator は permissionless の経路を使用します。permissioned の経路は、スワップからの creator fee 収益を必要とする launchpad や承認済みパートナー向けに設計されています。


手数料設定の取得

各 CPMM プールはオンチェーンの AmmConfig を参照しており、これがその fee tier を定義します。プールを作成する前に利用可能な config を取得してください。

const feeConfigs = await raydium.api.getCpmmConfigs()

公開 config ID は次の場所でも確認できます:

circle-info

カスタム fee config もサポートされています。手数料のカスタマイズが必要な場合はチームにご連絡ください。


プールの作成

次を使用します raydium.cpmm.createPool() 2 つの token mint と初期入金額を指定して新しいプールを初期化します。

import {
  CREATE_CPMM_POOL_PROGRAM,
  CREATE_CPMM_POOL_FEE_ACC,
  DEVNET_PROGRAM_ID,
  getCpmmPdaAmmConfigId,
  TxVersion,
} from '@raydium-io/raydium-sdk-v2'
import BN from 'bn.js'
import { initSdk } from '../config'

const createPool = async () => {
  const raydium = await initSdk({ loadToken: true })

  const mintA = await raydium.token.getTokenInfo('So11111111111111111111111111111111111111112')
  const mintB = await raydium.token.getTokenInfo('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v')

  /**
   * または、取得する代わりに mint 情報を直接指定することもできます:
   * {
   *   address: '4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R',
   *   programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
   *   decimals: 6,
   * }
   */

  const feeConfigs = await raydium.api.getCpmmConfigs()

  // devnet では、devnet の program から config ID を再導出します
  if (raydium.cluster === 'devnet') {
    feeConfigs.forEach((config) => {
      config.id = getCpmmPdaAmmConfigId(
        DEVNET_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM,
        config.index
      ).publicKey.toBase58()
    })
  }

  const { execute, extInfo } = await raydium.cpmm.createPool({
    programId: CREATE_CPMM_POOL_PROGRAM,
    // devnet: DEVNET_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM
    poolFeeAccount: CREATE_CPMM_POOL_FEE_ACC,
    // devnet: DEVNET_PROGRAM_ID.CREATE_CPMM_POOL_FEE_ACC
    mintA,
    mintB,
    mintAAmount: new BN(1_000_000),
    mintBAmount: new BN(1_000_000),
    startTime: new BN(0),
    feeConfig: feeConfigs[0],
    associatedOnly: false,
    ownerInfo: {
      useSOLBalance: true,
    },
    txVersion: TxVersion.V0,
    // optional: ここで priority fee を設定
    // computeBudgetConfig: {
    //   units: 600000,
    //   microLamports: 46591500,
    // },
  })

  const { txId } = await execute({ sendAndConfirm: true })
  console.log('pool created', {
    txId: `https://explorer.solana.com/tx/${txId}`,
    poolId: extInfo.address.poolId.toBase58(),
  })
}

createPool()

パラメータ

パラメータ
説明

programId

PublicKey

CPMM の program ID。 CREATE_CPMM_POOL_PROGRAM を mainnet で使用します。 DEVNET_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM を devnet で使用します。

poolFeeAccount

PublicKey

プロトコル fee account。 CREATE_CPMM_POOL_FEE_ACC を mainnet で使用します。 DEVNET_PROGRAM_ID.CREATE_CPMM_POOL_FEE_ACC を devnet で使用します。

mintA

TokenInfo

最初の token mint 情報 (address, programId, decimals)。

mintB

TokenInfo

2 つ目の token mint 情報。 mintA.

mintAAmount

BN

token A の初期入金額。最小単位で指定します。

mintBAmount

BN

token B の初期入金額。最小単位で指定します。

startTime

BN

スワップが有効になる Unix timestamp。 0 即時有効化の場合。

feeConfig

object

から取得した fee tier の config。 getCpmmConfigs()トレード手数料とプール作成手数料を決定します。

associatedOnly

boolean

もし trueなら、associated token account のみを使用します。

ownerInfo

object

{ useSOLBalance: true } を指定すると、ラップのためにネイティブ SOL 残高を使用します。

txVersion

TxVersion

トランザクションのバージョン。 TxVersion.V0 は versioned transaction 用、 TxVersion.LEGACY は legacy 用です。

戻り値

次の extInfo.address オブジェクトには、導出されたプールアドレスが含まれます:

フィールド
説明

poolId

作成されたプールの public key。

mintA

Token A の mint address。

mintB

Token B の mint address。

lpMint

LP token の mint address。

vaultA

Token A のプール vault。

vaultB

Token B のプール vault。


permission 付きのプール作成 (creator fees)

permissioned の経路では、オンチェーンの initialize_with_permission instruction を使用します。これは、Raydium admin があなたのアドレス向けに作成した Permission PDA を必要とします。代わりに、次のものを利用できます:

  • Creator fees 有効 — 通常の取引手数料に加えて、スワップごとの fee がプール作成者に送信されます。

  • 設定可能な fee token — creator fee を両方の token から徴収するか、token A のみか、token B のみかを選択できます。

  • 別の creator アドレス — 支払者とプール作成者は異なる wallet にできます。

circle-info

あなたのアドレス用の Permission PDA を要求するには、Raydium team に連絡してください。これがない場合、 createPoolWithPermission() 呼び出しは失敗します。

次を使用します raydium.cpmm.createPoolWithPermission() を使用して creator fees を有効にしたプールを作成します。

追加パラメータ (permissionless と比較)

パラメータ
説明

feeOn

FeeOn

creator fee をどの token に対して課金するかを制御します。 BothToken, OnlyTokenA、または OnlyTokenB.

その他のパラメータは permissionless の場合と同じです createPool().

FeeOn enum

動作

BothToken

creator fee は、swap input となる token に対して課金されます。

OnlyTokenA

creator fee は、token A が swap input の場合にのみ課金されます。

OnlyTokenB

creator fee は、token B が swap input の場合にのみ課金されます。

permissionless との主な違い

createPool()

createPoolWithPermission()

必要な permission

なし

Raydium admin があなたのアドレス用の Permission PDA を作成する必要があります

Creator fees

無効 (enable_creator_fee: false)

有効 (enable_creator_fee: true)

Creator fee モデル

固定 (BothToken, 未使用)

呼び出し側が選択 (BothToken, OnlyTokenA, OnlyTokenB)

支払者 vs. creator

同じ wallet

異なる wallet にできます

circle-exclamation

最終更新

役に立ちましたか?