一个用 Go 语言实现的 CLMM SDK 用于与 Solana 区块链上的 Raydium CLMM 协议进行交互。
该 SDK 提供了完整的流动性池报价、交换计算和链上数据解析功能。
执行方式:
go run cmd/main/main.go!!! 官网默认的 RPC 接口可能较慢,建议改成付费的 solana 节点,不然可能会超时 !!!
输出结果:
=== 交换报价结果 ===
是否可以完全交易: true
需要访问的 TickArray 账户 (2 个):
1: UqhAs3nbHg9FwqmenqJnf4PyxhLNNWJHAGzAKpDrqpP
2: 6XKa1sZuf6VygnvEtUmdcM96SpZYK9u2UBG6rg5E61GF
预期输出数量: 75314131
手续费: 500000
执行价格(sqrtPriceX64): 5063631152135318266
=== JSON 输出 ===
{
"AllTrade": true,
"ExpectedAmountOut": "75314131",
"TickArrayAccounts": [
"UqhAs3nbHg9FwqmenqJnf4PyxhLNNWJHAGzAKpDrqpP",
"6XKa1sZuf6VygnvEtUmdcM96SpZYK9u2UBG6rg5E61GF"
],
"ExecutionPrice": "5063631152135318266",
"FeeAmount": "500000",
"PoolInfo": {
"PoolID": "2AXXcN6oN9bBT5owwmTH53C7QHUXvhLeu718Kqt8rvY2",
"Token0Mint": "So11111111111111111111111111111111111111112",
"Token1Mint": "4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R",
"CurrentTick": -25857,
"SqrtPriceX64": "5063735989440163490",
"Liquidity": "13251967007561"
}
}本 SDK 围绕三层核心能力构建:
- 链上账户布局解析 - 解析 Solana 链上的池子、配置、Tick 数组等数据结构
- Tick 位图与价格刻度数学 - 处理 CLMM 协议的离散化价格和流动性计算
- 逐步换汇模拟与报价 - 实现精确的交换路径计算和价格影响评估
golang-clmm/
├── cmd/ # 可执行程序和示例
│ ├── main/
│ │ └── main.go # 主要使用入口 (3参数接口)
│ ├── api.go # 对外 API 封装
│ ├── compute/ # 核心计算模块
│ │ ├── swap_math.go # 关键swap计算逻辑
│ │ ├── quote_swap.go # 报价计算封装
│ │ ├── math_helpers.go # 数学辅助函数
│ │ └── tick_navigation.go # Tick 导航计算
│ ├── core/ # 核心tick数学计算
│ │ ├── tick_array.go # Tick数组操作和位图管理
│ │ └── tick_array_bitmap.go # 位图扩展和边界计算
│ ├── layout/ # 链上账号数据解析
│ │ ├── pool.go # 池子数据结构
│ │ ├── tick_array.go # Tick数组数据结构
│ │ ├── amm_config.go # AMM配置数据结构
│ │ └── tick_array_bitmap_extension.go # 扩展位图数据结构
│ ├── types/ # 类型定义
│ ├── utils/ # 工具函数
│ ├── loader/ # 数据加载器
│ └── constant/ # 常量定义
└── readme.md # 项目说明这是用户最直接的使用入口,提供了极简的三参数接口:
type SimpleQuoteRequest struct {
RPCURL string // Solana RPC 节点地址
PoolID string // 池子地址 (必需)
InputMint string // 输入代币地址 (必需)
InputAmount string // 输入代币数量 (必需)
}用户只需要提供三个核心参数即可完成报价:
- 池子地址 - Solana 链上的流动性池 ID
- 输入代币地址 - 要交换的代币合约地址
- 输入代币数量 - 交换的代币数量(基础单位)
// 示例调用
resp, err := SimpleQuoteExactIn(SimpleQuoteRequest{
RPCURL: "https://api.mainnet-beta.solana.com",
PoolID: "2AXXcN6oN9bBT5owwmTH53C7QHUXvhLeu718Kqt8rvY2", // WSOL/RAY池
InputMint: "So11111111111111111111111111111111111111112", // WSOL
InputAmount: "1000000000", // 1 SOL
})