Skip to main content
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
本页是权威的指令参考。如需实际编写这些指令的代码,请参阅 products/cpmm/code-demos。有关错误代码的含义,请参阅 reference/error-codes

指令概览

状态位掩码:每个池的 status 是一个 u8,其中位 0 = 禁用存款,位 1 = 禁用提取,位 2 = 禁用交换(程序中的 PoolStatusBitIndex { Deposit, Withdraw, Swap })。清除位表示允许操作;设置位表示暂停。UpdatePoolStatus 接受原始 u8 并覆盖现有值。 接下来的部分详细介绍每一个。账户顺序遵循 CPMM IDL;SDK 和 raydium-cp-swap/programs/cp-swap/src/instructions 中的 Rust 客户端匹配此顺序。

Initialize

创建新的 CPMM 池。 参数
账户(W = 可写,S = 签署者) * pool_state 仅在随机密钥对路径上签署;规范 PDA 路径在没有 pool_state 签署的情况下运行。 前置条件
  • 代币已排序(按字节顺序 token_0_mint < token_1_mint)。
  • 两个代币都不使用 CPMM 允许列表之外的扩展(TransferFeeConfigMetadataPointerTokenMetadataInterestBearingConfigScaledUiAmount)——见 products/cpmm/accounts。程序内的小型每代币允许列表绕过检查以进行逐案例上线。
  • creator 在各自的 ATA 中至少有 init_amount_0init_amount_1
  • amm_config.disable_create_pool == false
后置条件
  • pool_state 存在,lp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP
  • LOCKED_LP(100 lamports LP 代币)的 LP 启动器永久锁定在池中——pool_state.lp_supply 记录 liquidity − 100,而 100 LP 单位保持在流通之外,防止池被完全耗尽和除以零。
  • observation_state 已初始化;observation_index = 0pool_id = pool_state.key()
  • create_pool_fee lamports 从创建者转移到接收者并同步为原生 SOL(它是 wSOL ATA)。
  • 池的状态位掩码为 0(存款/提取/交换全部启用)。
  • enable_creator_fee = falsecreator_fee_on = BothTokenInitialize 支持启用创建者费用——该路径是 InitializeWithPermission
  • 如果调用者传递的值 <= block_timestampopen_time 会被提升到 block_timestamp + 1。交换在 open_time 之前被拒绝;存款和提取立即生效。
常见错误(完整列表见 reference/error-codes
  • InvalidInput — 代币未排序或代币相同。
  • NotSupportMint — 被阻止的 Token-2022 扩展。
  • ExceededSlippage — 罕见;如果 init_amount_0/1 由于小数位数不匹配导致零 LP。

Deposit

添加与池成比例的两种代币的流动性。 参数
账户 数学
k 的比例性没有变化——两个金库和 lp_supply 按相同因子缩放。 后置条件
  • lp_supply += lp_token_amount
  • vault_0 += needed_token_0(扣除输入上任何 Token-2022 转账费用)。
  • vault_1 += needed_token_1(扣除输入上任何 Token-2022 转账费用)。
常见错误ExceededSlippageZeroTradingTokens、如果存款被暂停则 InvalidStatus

Withdraw

销毁 LP 代币并按比例接收两种基础代币。 参数
账户 (与 Deposit 相同;lp_mint 可写是因为 LP 代币被销毁。) 数学
后置条件
  • lp_supply -= lp_token_amount
  • 金库发送 out_token_0 / out_token_1(总额;用户接收扣除任何 Token-2022 转账费用的净额)。

SwapBaseInput

精确输入交换。 参数
账户 顺序输入 → 输出由用户的方向决定,而不是池的规范 token_0 / token_1。程序通过匹配代币来确定哪个金库是哪个。 数学 — 见 products/cpmm/math 前置条件
  • open_time <= now
  • pool_status 允许交换。
  • 对于此权限,两个代币都未暂停或冻结。
  • amount_in > 0
常见错误
  • ExceededSlippageamount_out < minimum_amount_out
  • ZeroTradingTokens — 交易舍入为零。
  • NotApproved — 池通过 UpdatePoolStatus 暂停交换。
  • InvalidInput — 代币与池的任一金库代币不匹配。

SwapBaseOutput

精确输出交换。 参数
账户 — 与 SwapBaseInput 相同。 数学 — 反向曲线带上限,见 products/cpmm/math 常见错误ExceededSlippagegross_in > max_amount_in)、ZeroTradingTokensInvalidInputNotApproved

CollectProtocolFee

从金库中扫出累积的协议费用到协议目标。 参数 — 无。 账户 效果
曲线有效余额没有变化(累积费用已被排除)。 常见错误 — 如果签署者不是 protocol_owner,则 NotApproved

CollectFundFee

CollectProtocolFee 形状相同,但由 fund_owner 签署并将 fund_fees_* 计数器清零。

CollectCreatorFee

pool_state.pool_creator 签署。它将完整的 creator_fees_token_0creator_fees_token_1 余额转移到创建者的代币账户,然后将两个计数器清零。当两个计数器都为零时,它返回 NoFeeCollect

CollectCreatorFeePermissionless

任何人都可以触发创建者费用收集。该指令始终将完整的累积余额发送到由 pool_state.pool_creator 拥有的规范关联代币账户;调用者无法选择另一个创建者或目标。如果任一 ATA 缺失,支付者为其创建提供资金。 原始的 CollectCreatorFee 仍然可调用,因此现有客户端保持兼容。 参数 — 无。 账户 效果
  • 将所有 creator_fees_token_0creator_fees_token_1 从池金库转移到创建者 ATA。
  • 将两个创建者费用计数器清零并更新 pool_state.recent_epoch
  • 当两个计数器都为零时返回 NoFeeCollect

UpdatePoolStatus

暂停或恢复池上的单个操作。status 字段是一个位掩码: 参数
账户 管理员密钥是 CPMM 程序上的升级权限——实际上是 Raydium 多签。见 security/admin-and-multisig

CreateAmmConfig

创建新的费用等级。 参数
账户 前置条件
  • 不存在具有相同 indexAmmConfig
  • protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE

UpdateAmmConfig

更改现有 AmmConfig 上的费率或所有权。接受 param: u8(用于更新哪个字段的判别器)和 value: u64。每个参数的值语义在源代码中;常见的有:
  • param = 0trade_fee_rate
  • param = 1protocol_fee_rate
  • param = 2fund_fee_rate
  • param = 3new_protocol_owner(将 Pubkey 字节作为重新解释传递)
  • param = 4new_fund_owner
  • param = 5create_pool_fee
  • param = 6disable_create_pool
更改由管理员签署,影响绑定到此 AmmConfig 的每个池在下一次交换时。无迁移;池只是读取新值。

状态变化矩阵

后续步骤

来源: