本文档是 Raydium CP-Swap 协议的综述,帮助开发者快速了解项目全貌。
1. 概述
1.1 什么是 Raydium CP-Swap
Raydium CP-Swap 是 Solana 上的 常量乘积自动做市商(Constant Product AMM) 协议,允许用户:
- 创建代币交易对(流动性池)
- 提供流动性赚取手续费
- 进行代币交换
1.2 常量乘积公式
- x:池子中代币 A 的数量
- y:池子中代币 B 的数量
- k:常量(交易后只能增加,不能减少)
价格机制:交易会改变 x 和 y 的比例,从而影响价格。买入越多,价格越高(滑点)。
1.3 程序 ID
1 2
| Mainnet: CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C Devnet: CPMDWBwJDtYax9qW7AyRuVC19Cc4L4Vcy4n2BHAbHkCW
|
2. 核心概念
2.1 流动性池(Liquidity Pool)
由两种代币组成的交易对,用户可以在池中交换代币。
1 2 3 4 5 6 7 8
| ┌─────────────────────────────────────┐ │ Liquidity Pool │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ Token 0 │ │ Token 1 │ │ │ │ Vault │ │ Vault │ │ │ │ (如 SOL) │ │ (如 USDC) │ │ │ └─────────────┘ └─────────────┘ │ └─────────────────────────────────────┘
|
2.2 LP Token
流动性提供者凭证,代表在池中的份额:
- 存入流动性 → 获得 LP Token
- 销毁 LP Token → 按比例提取两种代币
1
| 初始流动性 = sqrt(token_0_amount × token_1_amount)
|
2.3 滑点(Slippage)
交易量越大,价格偏离越多。协议通过 minimum_amount_out / maximum_amount_in 提供滑点保护。
2.4 费用机制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 交易金额 │ ▼ ┌─────────────────────────────────────────────────────┐ │ 总手续费 (trade_fee + creator_fee) │ └─────────────────────────────────────────────────────┘ │ │ ▼ ▼ ┌─────────────┐ ┌─────────────┐ │ trade_fee │ │ creator_fee │ │ (交易费) │ │ (创建者费) │ └─────────────┘ └─────────────┘ │ ├──▶ 留在池中(增加 LP 价值) │ ├──▶ protocol_fee(协议费)→ protocol_owner │ └──▶ fund_fee(基金费)→ fund_owner
|
费率单位:百万分之一(1,000,000 = 100%)
trade_fee_rate = 2500 表示 0.25%
3. 模块架构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ┌─────────────────────────────────────────────────────────────┐ │ Raydium CP-Swap │ ├─────────────────┬─────────────────┬─────────────────────────┤ │ Admin │ Pool │ Swap │ │ │ │ │ │ • create_config │ • initialize │ • swap_base_input │ │ • update_config │ • deposit │ • swap_base_output │ │ • update_pool │ • withdraw │ │ │ _status │ • collect_ │ │ │ • collect_ │ creator_fee │ │ │ protocol_fee │ │ │ │ • collect_ │ │ │ │ fund_fee │ │ │ │ • create/close │ │ │ │ _permission │ │ │ │ _pda │ │ │ └─────────────────┴─────────────────┴─────────────────────────┘
|
| 模块 |
职责 |
调用者 |
| Admin |
全局配置、费率管理、权限控制 |
管理员 |
| Pool |
池子创建、流动性添加/移除 |
任何用户 |
| Swap |
代币交换 |
任何用户 |
4. 账户体系
4.1 账户关系图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| ┌─────────────────────────────────────────────────────────────────┐ │ AmmConfig │ │ (全局配置:费率、权限开关、费用接收地址) │ └─────────────────────────────────────────────────────────────────┘ │ │ 1:N ▼ ┌─────────────────────────────────────────────────────────────────┐ │ PoolState │ │ (池子状态:储备量、LP供应、累积费用、开放时间) │ ├─────────────────────────────────────────────────────────────────┤ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Token0 Vault │ │ Token1 Vault │ │ LP Mint │ │ │ │ (储备) │ │ (储备) │ │ (流动性凭证) │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ └─────────────────────────────────────────────────────────────────┘ │ │ 1:1 ▼ ┌─────────────────────────────────────────────────────────────────┐ │ ObservationState │ │ (价格预言机:记录历史价格,供外部查询) │ └─────────────────────────────────────────────────────────────────┘
|
4.2 核心账户说明
| 账户 |
用途 |
数量关系 |
| AmmConfig |
全局费率配置 |
可有多个(不同 index) |
| PoolState |
单个池子状态 |
每个交易对一个 |
| ObservationState |
价格预言机 |
每个池子一个 |
| Token Vault |
代币储备账户 |
每个池子两个 |
| LP Mint |
LP Token 铸造账户 |
每个池子一个 |
| Permission |
授权创建池子 |
按需创建 |
4.3 PDA 种子总表
| 账户 |
Seeds |
说明 |
| AmmConfig |
["amm_config", index.to_be_bytes()] |
index 区分不同配置 |
| PoolState |
["pool", amm_config, token_0_mint, token_1_mint] |
或随机账户 |
| Authority |
["vault_and_lp_mint_auth_seed"] |
全局签名 PDA |
| LP Mint |
["pool_lp_mint", pool_state] |
池子的 LP Token |
| Token0 Vault |
["pool_vault", pool_state, token_0_mint] |
代币 0 储备 |
| Token1 Vault |
["pool_vault", pool_state, token_1_mint] |
代币 1 储备 |
| Observation |
["observation", pool_state] |
价格预言机 |
| Permission |
["permission", authority] |
授权账户 |
5. 典型调用流程
5.1 部署与配置
1 2 3 4 5 6 7
| 管理员 │ ├─1─▶ create_config 创建全局配置(费率、接收地址) │ ├─2─▶ create_permission_pda 授权特定地址创建池子(可选) │ └─3─▶ update_config 按需调整费率
|
5.2 创建池子与添加流动性
1 2 3 4 5 6 7 8 9 10
| 用户 A(池子创建者) │ ├─1─▶ initialize 创建池子,存入初始流动性 │ 获得 LP Token(减去锁定的 100) │ └─2─▶ deposit 继续添加流动性(可选)
用户 B(流动性提供者) │ └───▶ deposit 按比例存入两种代币,获得 LP Token
|
5.3 交易
1 2 3 4 5 6 7
| 用户 C(交易者) │ ├───▶ swap_base_input 指定输入数量,计算输出 │ "我要卖 100 SOL" │ └───▶ swap_base_output 指定输出数量,计算输入 "我要买 1000 USDC"
|
5.4 移除流动性与提取费用
1 2 3 4 5 6 7 8 9 10 11 12 13
| 用户 A/B(LP 持有者) │ └───▶ withdraw 销毁 LP Token,按比例提取两种代币
池子创建者 │ └───▶ collect_creator_fee 提取累积的创建者费用
管理员 / 费用接收者 │ ├───▶ collect_protocol_fee 提取协议费用 │ └───▶ collect_fund_fee 提取基金费用
|
6. Token 标准支持
| 标准 |
支持 |
说明 |
| SPL Token |
✅ |
标准代币 |
| Token-2022 |
✅ |
扩展代币(含转账费用等) |
限制:部分 Token-2022 扩展不支持(如 TransferHook)
7. 文档导航
8. 快速参考
8.1 指令一览
| 指令 |
模块 |
功能 |
| create_config |
Admin |
创建全局配置 |
| update_config |
Admin |
更新配置参数 |
| update_pool_status |
Admin |
控制池子状态 |
| collect_protocol_fee |
Admin |
提取协议费用 |
| collect_fund_fee |
Admin |
提取基金费用 |
| create_permission_pda |
Admin |
授权创建池子 |
| close_permission_pda |
Admin |
撤销授权 |
| initialize |
Pool |
创建池子 |
| initialize_with_permission |
Pool |
授权创建池子 |
| deposit |
Pool |
添加流动性 |
| withdraw |
Pool |
移除流动性 |
| collect_creator_fee |
Pool |
提取创建者费用 |
| swap_base_input |
Swap |
固定输入交换 |
| swap_base_output |
Swap |
固定输出交换 |
8.2 常量定义
1 2 3 4 5 6 7 8
| FEE_RATE_DENOMINATOR_VALUE = 1_000_000 AUTH_SEED = "vault_and_lp_mint_auth_seed" POOL_SEED = "pool" POOL_LP_MINT_SEED = "pool_lp_mint" POOL_VAULT_SEED = "pool_vault" OBSERVATION_SEED = "observation" AMM_CONFIG_SEED = "amm_config" PERMISSION_SEED = "permission"
|