创建池

在单笔交易中创建一个 CPMM 恒定乘积池,并用初始流动性为其注资。

创建 CPMM 池有两种方式:

方法
SDK 方法
谁可以调用
创建者费用

无权限

createPool()

任何人

禁用

需授权

createPoolWithPermission()

仅限已批准地址

启用,可配置

大多数集成方使用无权限路径。需授权路径是为 launchpad 和经批准的合作伙伴设计的,他们需要从代币交换中获得创建者费用收入。


获取费用配置

每个 CPMM 池都会引用链上的 AmmConfig ,它定义了该池的费率层级。在创建池之前,先获取可用的配置。

const feeConfigs = await raydium.api.getCpmmConfigs()

你也可以在以下位置查看公开的配置 ID:

circle-info

也支持自定义费用配置。如果你需要费用定制,请联系团队。


创建池

使用 raydium.cpmm.createPool() 使用两个代币 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 重新推导配置 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,
    // 可选:在此设置优先费用
    // 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_PROGRAMDEVNET_PROGRAM_ID.CREATE_CPMM_POOL_PROGRAM 用于 devnet。

poolFeeAccount

PublicKey

协议费用账户。使用 CREATE_CPMM_POOL_FEE_ACCDEVNET_PROGRAM_ID.CREATE_CPMM_POOL_FEE_ACC 用于 devnet。

mintA

TokenInfo

第一个代币 mint 信息(address、programId、decimals)。

mintB

TokenInfo

第二个代币 mint 信息。必须不同于 mintA.

mintAAmount

BN

代币 A 的初始存入数量,以最小单位表示。

mintBAmount

BN

代币 B 的初始存入数量,以最小单位表示。

startTime

BN

启用代币交换的 Unix 时间戳。 0 表示立即生效。

feeConfig

object

来自 getCpmmConfigs()的费率层级配置。决定交易手续费和池创建费用。

associatedOnly

boolean

如果 true,则仅使用关联代币账户。

ownerInfo

object

{ useSOLBalance: true } 表示使用原生 SOL 余额进行包装。

txVersion

TxVersion

交易版本。 TxVersion.V0 用于版本化交易, TxVersion.LEGACY 用于 legacy。

返回值

extInfo.address 对象包含推导出的池地址:

字段
说明

poolId

已创建池的公钥。

mintA

代币 A 的 mint 地址。

mintB

代币 B 的 mint 地址。

lpMint

LP 代币 mint 地址。

vaultA

代币 A 的池金库。

vaultB

代币 B 的池金库。


通过授权创建池(创建者费用)

需授权路径使用链上的 initialize_with_permission 指令。它需要一个 Permission PDA ,该 PDA 由 Raydium 管理员为你的地址创建。作为回报,你将获得:

  • 启用创建者费用 —— 每次代币交换都会向池创建者发送一笔费用,叠加在常规交易费用之上。

  • 可配置的费用代币 —— 可选择创建者费用从两种代币中收取、仅从代币 A 收取,或仅从代币 B 收取。

  • 独立的创建者地址 —— 付款方和池创建者可以是不同的钱包。

circle-info

如需为你的地址申请 Permission PDA,请联系 Raydium 团队。没有它, createPoolWithPermission() 调用将失败。

使用 raydium.cpmm.createPoolWithPermission() 用于创建一个启用了创建者费用的池。

附加参数(相对于无权限)

参数
类型
说明

feeOn

FeeOn

控制创建者费用对哪种代币收取。 BothToken, OnlyTokenA,或 OnlyTokenB.

其余所有参数都与无权限的 createPool().

FeeOn enum

行为

BothToken

创建者费用会对作为代币交换输入的那种代币收取。

OnlyTokenA

仅当代币 A 是代币交换输入时,才收取创建者费用。

OnlyTokenB

仅当代币 B 是代币交换输入时,才收取创建者费用。

与无权限方式的关键差异

createPool()

createPoolWithPermission()

需要授权

Raydium 管理员必须为你的地址创建一个 Permission PDA

创建者费用

禁用(enable_creator_fee: false)

启用(enable_creator_fee: true)

创建者费用模型

固定(BothToken,未使用)

由调用方选择(BothToken, OnlyTokenA, OnlyTokenB)

付款方与创建者

同一个钱包

可以是不同的钱包

circle-exclamation

最后更新于

这有帮助吗?