Appearance
CLMM 合约接口文档
本文档详细说明了 Coinfair CLMM (Concentrated Liquidity Market Maker) 合约的所有接口,包括方法签名、参数、返回值和数据结构。
模块概览
Coinfair CLMM 协议由以下核心模块组成:
- Factory 模块: 池子工厂,负责创建和管理池子
- Pool 模块: 池子核心逻辑,流动性管理和交换
- Router 模块: 路由模块,用户交互入口
- Config 模块: 全局配置管理
- FeeTier 模块: 费用等级管理
- Position NFT 模块: 位置NFT管理
- 数据结构: 所有数据结构定义
快速开始
1. 查询池子信息
typescript
// 检查池子是否存在
const exists = await view('factory::pool_exists', [
tokenA,
tokenB,
tickSpacing
]);
// 获取池子地址
const poolAddress = await view('factory::get_pool_address', [
tokenA,
tokenB,
tickSpacing
]);
// 获取完整池子信息
const poolInfo = await view('pool::get_pool_info', [poolAddress]);2. 创建池子并添加流动性
typescript
// 创建池子并添加初始流动性
await entry('clmm_router::create_pool_and_add_liquidity', [
account,
tokenA,
tokenB,
tickSpacing,
initializePrice,
uri,
deltaLiquidity,
maxAmountA,
maxAmountB,
tickLower,
tickUpper
]);3. 添加流动性
typescript
// 开启新位置并添加流动性
await entry('clmm_router::add_liquidity', [
account,
poolAddress,
deltaLiquidity,
maxAmountA,
maxAmountB,
tickLower,
tickUpper,
true, // is_open: 创建新位置
0 // index: 无效(因为is_open为true)
]);4. 执行交换
typescript
// 计算交换结果(预览)
const swapResult = await view('pool::calculate_swap_result', [
poolAddress,
true, // a2b: A换B
true, // by_amount_in: 按输入量
1000 // amount: 输入数量
]);
// 执行交换
await entry('clmm_router::swap', [
account,
poolAddress,
true, // a_to_b: A换B
true, // by_amount_in: 按输入量
1000, // amount: 输入数量
950, // amount_limit: 最小输出数量
priceLimit,
metadataA,
metadataB
]);5. 查询用户位置
typescript
// 查询用户在特定池子中的所有位置索引
const userPositions = await view('pool::get_user_positions', [
poolAddress,
userAddress
]);
// 查询用户在特定池子中的所有位置详细信息
const userPositionsDetail = await view('pool::get_user_positions_detail', [
poolAddress,
userAddress
]);重要概念
统一费用机制
核心特性: 无论交换方向如何,所有费用都统一从代币B收取。
- A→B交换: 用户支付精确的代币A数量,费用从输出的代币B中自动扣除
- B→A交换: 用户支付代币B数量(包含交换量+费用),费用从输入的代币B中扣除
热土豆模式
AddLiquidityReceipt 和 FlashSwapReceipt 是热土豆模式,必须在同一个交易中处理,不能存储或传递。
Tick 值要求
- tick值必须是
tick_spacing的倍数 - tick_lower 必须小于 tick_upper
价格格式
- 使用
fifrt_price格式(x^4 * y = k 中的价格) - 需要与
tick_math模块配合进行转换
文档导航
按模块查看
- Factory 模块 - 池子创建和管理
- Pool 模块 - 流动性管理和交换
- Router 模块 - 用户交互入口
- Config 模块 - 全局配置
- FeeTier 模块 - 费用等级
- Position NFT 模块 - 位置NFT管理
数据结构
- 数据结构定义 - 所有数据结构的完整定义
数学与设计文档
错误代码
Factory 模块
EPOOL_ALREADY_INITIALIZED = 1: 池子已初始化EINVALID_FIFRTPRICE = 2: 无效的初始价格
Router 模块
EAMOUNT_IN_ABOVE_MAX_LIMIT = 1: 输入数量超过最大限制EAMOUNT_OUT_BELOW_MIN_LIMIT = 2: 输出数量低于最小限制EIS_NOT_VALID_TICK = 3: 无效的tick值EINVALID_LIQUIDITY = 4: 无效的流动性EPOOL_ADDRESS_ERROR = 5: 池子地址错误EINVALID_POOL_PAIR = 6: 无效的池子对ESWAP_AMOUNT_INCORRECT = 7: 交换数量不正确EPOSITION_INDEX_ERROR = 8: 位置索引错误EPOSITION_IS_NOT_ZERO = 9: 位置不为空
Config 模块
ENOT_HAS_PRIVILEGE = 1: 没有权限ECONFIG_ALREADY_INITIALIZED = 2: 配置已初始化EINVALID_PROTOCOL_FEE_RATE = 3: 无效的协议费率EPROTOCOL_IS_PAUSED = 4: 协议已暂停EINVALID_ACL_ROLE = 5: 无效的ACL角色
FeeTier 模块
EFEE_TIER_ALREADY_EXIST = 1: 费用等级已存在EFEE_TIER_NOT_FOUND = 2: 费用等级未找到EFEETIER_ALREADY_INITIALIZED = 3: 费用等级已初始化EINVALID_FEE_RATE = 4: 无效的费率EINVALID_TICK_SPACE = 5: 无效的tick间距
版本信息
- 文档版本: 2.0
- 合约版本: 基于 Coinfair CLMM v1
- 最后更新: 2024