Skip to main content
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
这个脚本做什么。 在你选择的费用等级创建新的 CLMM 池,然后开启初始集中头寸。跨四个文件的两笔交易 — config.tscreatePool.tscreatePosition.tsutils.ts — 使用 npx tsx 运行。代码取自官方演示 raydium-sdk-V2-demo/src/clmm,并适配为独立运行。

设置

确保你已阅读 快速开始前置条件,并已安装 RPC_URLKEYPAIR 和相关依赖。 除了快速开始中的依赖外,你还需要:
  • decimal.jscreatePool.tscreatePosition.ts 中的价格和 tick 数学运算。
  • bs58 — 如果使用 KEYPAIR_BS58 而非 JSON 密钥文件,在 config.ts 中解码 base58 编码的密钥对。
  • tsx — 通过 npx tsx 直接运行下面的 .ts 文件;与交换和 CPMM 脚本不同,这个不是用 node 运行的普通 .mjs 文件。
CLMM 池创建有一次性费用加上初始头寸的 per-tick-array 租金。你还需要在钱包中拥有两个种子代币 — 当价格位于选定范围内时开启头寸需要两侧都有流动性。 在 devnet 上运行。 仅在 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_vaulttoken_1_vault(按 mint 字节顺序排序),
  • observation 环形缓冲区,
  • 内联 tick 数组位图,
并从你的 initialPrice 设置初始 sqrt_price_x64 交易 2 — raydium.clmm.openPositionFromBase 开启了集中头寸:
  • 向你的钱包铸造了头寸 NFT(NFT 就是头寸;转移它就转移了头寸),
  • 在下界和上界分配了 tick 数组(如果是这些范围内的第一个头寸则是一次性租金;tick 数组永远不会被程序关闭,所以同一数组中的后续头寸不需要额外租金),
  • 存入了 inputAmountmint1 和匹配的 mint2 对应金额(由 PoolUtils.getLiquidityAmountOutFromAmountIn 计算),
  • 根据范围宽度向头寸记入流动性。
范围越窄,每美元 TVL 的资本效率越高 — 当价格漂出范围时无常损失也越痛苦。上面使用的范围([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 — 你的 lowerPriceupperPrice 超出可表示的价格范围。使用相对于当前价格更合理的范围。
  • 过期价格 — API 的报价可能有 5–60 秒的延迟。如果 executePosition 因滑点失败,取消注释 createPosition.ts 中的 getRpcClmmPoolInfo 块以在签名前重新获取实时价格。

注意事项

  • 头寸 NFT 是你唯一的句柄。 丢失 NFT 或转移它,就失去了对头寸的访问权。把它当作密钥对待。
  • 超出范围的头寸不赚取费用。 如果价格移出 [lowerPrice, upperPrice],你的头寸完全停泊在一种资产中,直到你重新平衡才能赚取任何费用。
  • Tick 数组租金是单向的。 第一个接触从未初始化的 tick 数组的头寸支付其租金;程序不公开关闭 tick 数组的路径,所以该租金是永久的。同一数组中的后续头寸是免费的。

下一步

来源: