本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
指令概览
状态位掩码:每个池的
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 池。
参数
* pool_state 仅在随机密钥对路径上签署;标准 PDA 路径无需 pool_state 签署即可运行。
前置条件
- 代币已排序(按字节顺序
token_0_mint < token_1_mint)。 - 两个代币都不使用 CPMM 允许列表之外的扩展(
TransferFeeConfig、MetadataPointer、TokenMetadata、InterestBearingConfig、ScaledUiAmount)——见products/cpmm/accounts。程序内的小型每代币允许列表绕过检查以用于逐个案例的集成。 creator在各自 ATA 中至少拥有init_amount_0和init_amount_1。amm_config.disable_create_pool == false。
pool_state存在,lp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP。- LP 的初始锁定部分
LOCKED_LP(100 个 LP 代币的 lamports)永久锁定在池中——pool_state.lp_supply记录liquidity − 100,而 100 个 LP 单位保持在流通外,防止池被完全耗尽和被零除。 observation_state已初始化;observation_index = 0和pool_id = pool_state.key()。create_pool_feelamports 从创建者转移到接收者并同步为原生 SOL(它是一个 wSOL ATA)。- 池的状态位掩码是
0(存入/提取/交换全部启用)。 enable_creator_fee = false和creator_fee_on = BothToken。Initialize不支持启用创建者费用——该路径是InitializeWithPermission。- 如果调用者传入的值
<= block_timestamp,open_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 转账费用)。
ExceededSlippage、ZeroTradingTokens、如果存入被暂停则为 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。
ExceededSlippage—amount_out < minimum_amount_out。ZeroTradingTokens— 交易舍入为零。NotApproved— 池通过UpdatePoolStatus被暂停用于交换。InvalidInput— 代币不匹配池的任何一个金库代币。
SwapBaseOutput
精确输出交换。
参数
SwapBaseInput 相同。
数学 — 反向曲线与上限,见products/cpmm/math。
常见错误 — ExceededSlippage(gross_in > max_amount_in)、ZeroTradingTokens、InvalidInput、NotApproved。
CollectProtocolFee
从金库扫除累积的协议费用到协议目的地。
参数 — 无。
账户
效果
protocol_owner 则为 NotApproved。
CollectFundFee
与 CollectProtocolFee 形状相同,但由 fund_owner 签署并将 fund_fees_* 计数器清零。
CollectCreatorFee
同样的形状,由 pool_state.pool_creator 签署。仅在池以非零创建者费率初始化时才发出转账。
UpdatePoolStatus
暂停或恢复池上的单个操作。status 字段是一个位掩码:
参数
管理员密钥是 CPMM 程序上的升级权限——实际上是 Raydium 多签。见
security/admin-and-multisig。
CreateAmmConfig
创建新的费用级别。
参数
前置条件
- 不存在具有相同
index的AmmConfig。 protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE。
UpdateAmmConfig
更改现有 AmmConfig 上的费率或所有权。接收 param: u8(用于更新哪个字段的判别器)和 value: u64。每个参数的值语义在源代码中;通常:
param = 0→trade_fee_rateparam = 1→protocol_fee_rateparam = 2→fund_fee_rateparam = 3→new_protocol_owner(以重解释形式传入Pubkey字节)param = 4→new_fund_ownerparam = 5→create_pool_feeparam = 6→disable_create_pool
AmmConfig 的每个池。无需迁移;池简单地读取新值。
状态变化矩阵
后续步骤
products/cpmm/code-demos— 上述内容的可运行 TypeScript 示例。reference/error-codes— 完整的 Anchor 错误表。products/cpmm/fees—CollectProtocolFee/CollectFundFee/CollectCreatorFee清空的费用计提模型。

