Raydium CP-Swap —— 概述

本文档是 Raydium CP-Swap 协议的综述,帮助开发者快速了解项目全貌。

1. 概述

1.1 什么是 Raydium CP-Swap

Raydium CP-Swap 是 Solana 上的 常量乘积自动做市商(Constant Product AMM) 协议,允许用户:

  • 创建代币交易对(流动性池)
  • 提供流动性赚取手续费
  • 进行代币交换

1.2 常量乘积公式

1
x × y = k
  • 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. 文档导航

文档 内容 适合阅读场景
raydium_admin.md Admin 指令详解 需要管理配置、提取费用
raydium_pool.md Pool 指令详解 需要创建池子、管理流动性
raydium_swap.md Swap 指令详解 需要实现交易功能

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"