WangYuLue/golang-clmm

A CLMM SDK implemented in Go for interacting with the Raydium CLMM protocol. The SDK provides comprehensive liquidity pool quoting, swap calculation, and on-chain data parsing capabilities.

★ 0Forks 0GoGitHub ↗Compare

README

README

一个用 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 围绕三层核心能力构建:

  1. 链上账户布局解析 - 解析 Solana 链上的池子、配置、Tick 数组等数据结构
  2. Tick 位图与价格刻度数学 - 处理 CLMM 协议的离散化价格和流动性计算
  3. 逐步换汇模拟与报价 - 实现精确的交换路径计算和价格影响评估

项目目录结构

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                              # 项目说明

🎯 使用入口 - cmd/main/main.go

这是用户最直接的使用入口,提供了极简的三参数接口:

核心接口设计

type SimpleQuoteRequest struct {
    RPCURL      string  // Solana RPC 节点地址
    PoolID      string  // 池子地址 (必需)
    InputMint   string  // 输入代币地址 (必需)
    InputAmount string  // 输入代币数量 (必需)
}

调用流程

用户只需要提供三个核心参数即可完成报价:

  1. 池子地址 - Solana 链上的流动性池 ID
  2. 输入代币地址 - 要交换的代币合约地址
  3. 输入代币数量 - 交换的代币数量(基础单位)
// 示例调用
resp, err := SimpleQuoteExactIn(SimpleQuoteRequest{
    RPCURL:      "https://api.mainnet-beta.solana.com",
    PoolID:      "2AXXcN6oN9bBT5owwmTH53C7QHUXvhLeu718Kqt8rvY2", // WSOL/RAY池
    InputMint:   "So11111111111111111111111111111111111111112",   // WSOL
    InputAmount: "1000000000",  // 1 SOL
})

Issues