Appearance
Router 模块
模块路径: coinfair_clmm::clmm_router
Router 模块是用户交互的主要入口,封装了 Factory 和 Pool 的功能,提供更友好的接口。所有方法都是 entry 函数,可以直接从交易中调用。
Entry 方法(可写)
create_pool
创建新池子。
move
public entry fun create_pool(
account: &signer,
token_a: Object<Metadata>,
token_b: Object<Metadata>,
tick_spacing: u64,
initialize_fifrt_price: u128,
uri: String
)参数:
account:&signer- 创建者账户token_a:Object<Metadata>- 代币A的元数据对象token_b:Object<Metadata>- 代币B的元数据对象tick_spacing:u64- tick间距initialize_fifrt_price:u128- 初始价格(fifrt格式)uri:String- 位置NFT的URI
内部调用: factory::create_pool
create_pool_and_add_liquidity
创建池子并添加初始流动性(整合方法)。
move
public entry fun create_pool_and_add_liquidity(
account: &signer,
token_a: Object<Metadata>,
token_b: Object<Metadata>,
tick_spacing: u64,
initialize_fifrt_price: u128,
uri: String,
delta_liquidity: u128,
max_amount_a: u64,
max_amount_b: u64,
tick_lower: u64,
tick_upper: u64
)参数:
account:&signer- 创建者账户token_a:Object<Metadata>- 代币A的元数据对象token_b:Object<Metadata>- 代币B的元数据对象tick_spacing:u64- tick间距initialize_fifrt_price:u128- 初始价格(仅在创建新池时使用)uri:String- 位置NFT的URI(仅在创建新池时使用)delta_liquidity:u128- 要添加的流动性数量max_amount_a:u64- 代币A的最大消耗数量max_amount_b:u64- 代币B的最大消耗数量tick_lower:u64- 下边界ticktick_upper:u64- 上边界tick
流程:
- 检查池子是否存在,不存在则创建
- 开启新位置
- 添加流动性
- 支付代币
错误码:
EAMOUNT_IN_ABOVE_MAX_LIMIT = 1: 输入数量超过最大限制
create_pool_and_add_liquidity_fix_token
创建池子并添加流动性(固定代币数量模式)。
move
public entry fun create_pool_and_add_liquidity_fix_token(
account: &signer,
token_a: Object<Metadata>,
token_b: Object<Metadata>,
tick_spacing: u64,
initialize_fifrt_price: u128,
uri: String,
amount_a: u64,
amount_b: u64,
fix_amount_a: bool,
tick_lower: u64,
tick_upper: u64
)参数:
account:&signer- 创建者账户token_a:Object<Metadata>- 代币A的元数据对象token_b:Object<Metadata>- 代币B的元数据对象tick_spacing:u64- tick间距initialize_fifrt_price:u128- 初始价格(仅在创建新池时使用)uri:String- 位置NFT的URI(仅在创建新池时使用)amount_a:u64- 如果fix_amount_a为false,amount_a是要消费的代币A的最大数量amount_b:u64- 如果fix_amount_a为true,amount_b是要消费的代币B的最大数量fix_amount_a:bool- 控制固定代币A还是代币B的数量tick_lower:u64- 下边界ticktick_upper:u64- 上边界tick
add_liquidity
添加流动性。
move
public entry fun add_liquidity(
account: &signer,
pool_address: address,
delta_liquidity: u128,
max_amount_a: u64,
max_amount_b: u64,
tick_lower: u64,
tick_upper: u64,
is_open: bool,
index: u64
)参数:
account:&signer- 账户签名者pool_address:address- 池子地址delta_liquidity:u128- 要添加的流动性数量max_amount_a:u64- 代币A的最大消耗数量max_amount_b:u64- 代币B的最大消耗数量tick_lower:u64- 下边界ticktick_upper:u64- 上边界tickis_open:bool- true表示创建新位置,false表示向现有位置添加index:u64- 位置索引(is_open为true时无效)
流程:
- 如果需要,开启新位置
- 添加流动性
- 检查代币数量限制
- 支付代币
错误码:
EAMOUNT_IN_ABOVE_MAX_LIMIT = 1: 输入数量超过最大限制EIS_NOT_VALID_TICK = 3: 无效的tick值
add_liquidity_fix_token
添加流动性(固定代币数量模式)。
move
public entry fun add_liquidity_fix_token(
account: &signer,
pool_address: address,
amount_a: u64,
amount_b: u64,
fix_amount_a: bool,
tick_lower: u64,
tick_upper: u64,
is_open: bool,
index: u64,
metadata_a: Object<Metadata>,
metadata_b: Object<Metadata>
)参数:
account:&signer- 账户签名者pool_address:address- 池子地址amount_a:u64- 如果fix_amount_a为false,amount_a是要消费的代币A的最大数量amount_b:u64- 如果fix_amount_a为true,amount_b是要消费的代币B的最大数量fix_amount_a:bool- 控制固定代币A还是代币B的数量tick_lower:u64- 下边界ticktick_upper:u64- 上边界tickis_open:bool- 控制是否创建新位置或向现有位置添加流动性index:u64- 位置索引,如果is_open为true,index无用metadata_a:Object<Metadata>- 代币A的元数据对象metadata_b:Object<Metadata>- 代币B的元数据对象
remove_liquidity
移除流动性。
move
public entry fun remove_liquidity(
account: &signer,
pool_address: address,
delta_liquidity: u128,
min_amount_a: u64,
min_amount_b: u64,
position_index: u64,
is_close: bool
)参数:
account:&signer- 账户签名者pool_address:address- 池子地址delta_liquidity:u128- 要移除的流动性数量min_amount_a:u64- 代币A的最小返回数量min_amount_b:u64- 代币B的最小返回数量position_index:u64- 要移除流动性的位置索引is_close:bool- 如果位置为空,是否关闭位置
流程:
- 移除流动性
- 检查最小返回数量
- 收集位置费用
- 如果is_close为true且位置为空,关闭位置
错误码:
EAMOUNT_OUT_BELOW_MIN_LIMIT = 2: 输出数量低于最小限制
close_position
关闭空位置。
move
public entry fun close_position(
account: &signer,
pool_address: address,
position_index: u64
)参数:
account:&signer- 账户签名者pool_address:address- 池子地址position_index:u64- 位置索引
错误码:
EPOSITION_IS_NOT_ZERO = 9: 位置不为空
collect_fee
收集位置费用。
move
public entry fun collect_fee(
account: &signer,
pool_address: address,
position_index: u64
)参数:
account:&signer- 账户签名者pool_address:address- 池子地址position_index:u64- 位置索引
流程: 收集费用并存入用户账户
collect_rewarder
收集位置奖励。
move
public entry fun collect_rewarder(
account: &signer,
pool_address: address,
rewarder_index: u8,
pos_index: u64
)参数:
account:&signer- 账户签名者pool_address:address- 池子地址rewarder_index:u8- 奖励器索引(0-2)pos_index:u64- 位置索引
流程: 收集奖励并存入用户账户
collect_protocol_fee
收集协议费用。
move
public entry fun collect_protocol_fee(
account: &signer,
pool_address: address
)参数:
account:&signer- 协议费用收集权限账户pool_address:address- 池子地址
流程: 收集协议费用并存入权限账户
swap
执行代币交换。
move
public entry fun swap(
account: &signer,
pool_address: address,
a_to_b: bool,
by_amount_in: bool,
amount: u64,
amount_limit: u64,
fifrt_price_limit: u128,
metadata_a: Object<Metadata>,
metadata_b: Object<Metadata>
)参数:
account:&signer- 交换交易签名者pool_address:address- 池子地址a_to_b:bool- true表示A换Bby_amount_in:bool- true表示amount是输入数量amount:u64- 交换数量amount_limit:u64-- 如果by_amount_in为true,是最小输出数量
- 如果by_amount_in为false,是最大输入数量
fifrt_price_limit:u128- 价格限制metadata_a:Object<Metadata>- 代币A的元数据对象metadata_b:Object<Metadata>- 代币B的元数据对象
流程:
- 执行闪电交换
- 检查数量限制
- 分配推荐费用
- 支付代币
错误码:
EAMOUNT_IN_ABOVE_MAX_LIMIT = 1: 输入数量超过最大限制EAMOUNT_OUT_BELOW_MIN_LIMIT = 2: 输出数量低于最小限制ESWAP_AMOUNT_INCORRECT = 7: 交换数量不正确
update_fee_rate
更新池子费率(仅协议权限)。
move
public entry fun update_fee_rate(
protocol_authority: &signer,
pool_addr: address,
new_fee_rate: u64
)参数:
protocol_authority:&signer- 协议权限账户pool_addr:address- 池子地址new_fee_rate:u64- 新的费率
initialize_rewarder
初始化奖励器。
move
public entry fun initialize_rewarder(
account: &signer,
pool_address: address,
authority: address,
index: u64,
reward_token: Object<Metadata>
)参数:
account:&signer- 协议权限签名者pool_address:address- 池子地址authority:address- 奖励器权限地址index:u64- 奖励器索引reward_token:Object<Metadata>- 奖励代币元数据
update_rewarder_emission
更新奖励器发放速率。
move
public entry fun update_rewarder_emission(
account: &signer,
pool_address: address,
index: u8,
emission_per_second: u128,
reward_token: Object<Metadata>
)参数:
account:&signer- 奖励器权限签名者pool_address:address- 池子地址index:u8- 奖励器索引(0-2)emission_per_second:u128- 每秒发放数量reward_token:Object<Metadata>- 奖励代币元数据
transfer_rewarder_authority
转移奖励器权限。
move
public entry fun transfer_rewarder_authority(
account: &signer,
pool_addr: address,
index: u8,
new_authority: address
)参数:
account:&signer- 当前奖励器权限签名者pool_addr:address- 池子地址index:u8- 奖励器索引(0-2)new_authority:address- 新权限地址
accept_rewarder_authority
接受奖励器权限。
move
public entry fun accept_rewarder_authority(
account: &signer,
pool_addr: address,
index: u8
)参数:
account:&signer- 新奖励器权限签名者pool_addr:address- 池子地址index:u8- 奖励器索引(0-2)
pause
暂停协议。
move
public entry fun pause(protocol_authority: &signer)参数:
protocol_authority:&signer- 协议权限账户
unpause
恢复协议。
move
public entry fun unpause(protocol_authority: &signer)参数:
protocol_authority:&signer- 协议权限账户
pause_pool
暂停池子。
move
public entry fun pause_pool(
protocol_authority: &signer,
pool_address: address
)参数:
protocol_authority:&signer- 协议权限账户pool_address:address- 池子地址
unpause_pool
恢复池子。
move
public entry fun unpause_pool(
protocol_authority: &signer,
pool_address: address
)参数:
protocol_authority:&signer- 协议权限账户pool_address:address- 池子地址
update_pool_uri
更新池子的位置NFT集合和代币URI。
move
public entry fun update_pool_uri(
account: &signer,
pool_address: address,
uri: String
)参数:
account:&signer- 设置者账户签名者pool_address:address- 池子地址uri:String- NFT URI
transfer_protocol_authority
转移协议权限。
move
public entry fun transfer_protocol_authority(
protocol_authority: &signer,
next_protocol_authority: address
)参数:
protocol_authority:&signer- 当前协议权限账户next_protocol_authority:address- 新的协议权限地址
accept_protocol_authority
接受协议权限。
move
public entry fun accept_protocol_authority(
next_protocol_authority: &signer
)参数:
next_protocol_authority:&signer- 新的协议权限账户
update_protocol_fee_claim_authority
更新协议费用领取权限。
move
public entry fun update_protocol_fee_claim_authority(
protocol_authority: &signer,
next_protocol_fee_claim_authority: address
)参数:
protocol_authority:&signer- 协议权限账户next_protocol_fee_claim_authority:address- 新的协议费用领取权限地址
update_pool_create_authority
更新池子创建权限。
move
public entry fun update_pool_create_authority(
protocol_authority: &signer,
pool_create_authority: address
)参数:
protocol_authority:&signer- 协议权限账户pool_create_authority:address- 新的池子创建权限地址(@0x0表示任何人都可以创建)
update_protocol_fee_rate
更新协议费率。
move
public entry fun update_protocol_fee_rate(
protocol_authority: &signer,
protocol_fee_rate: u64
)参数:
protocol_authority:&signer- 协议权限账户protocol_fee_rate:u64- 新的协议费率
add_fee_tier
添加费用等级。
move
public entry fun add_fee_tier(
protocol_authority: &signer,
tick_spacing: u64,
fee_rate: u64
)参数:
protocol_authority:&signer- 协议权限账户tick_spacing:u64- tick间距fee_rate:u64- 费率
update_fee_tier
更新费用等级费率。
move
public entry fun update_fee_tier(
protocol_authority: &signer,
tick_spacing: u64,
new_fee_rate: u64
)参数:
protocol_authority:&signer- 协议权限账户tick_spacing:u64- tick间距new_fee_rate:u64- 新的费率
delete_fee_tier
删除费用等级。
move
public entry fun delete_fee_tier(
protocol_authority: &signer,
tick_spacing: u64
)参数:
protocol_authority:&signer- 协议权限账户tick_spacing:u64- tick间距
init_clmm_acl
初始化集中流动性访问控制列表。
move
public entry fun init_clmm_acl(account: &signer)参数:
account:&signer- 集中流动性池部署者
add_role
在集中流动性访问控制列表中添加角色。
move
public entry fun add_role(
account: &signer,
member: address,
role: u8
)参数:
account:&signer- 协议权限签名者member:address- 角色成员地址role:u8- 角色(1: 设置位置NFT URI, 2: 重置初始fifrt价格)
remove_role
从集中流动性访问控制列表中移除角色。
move
public entry fun remove_role(
account: &signer,
member: address,
role: u8
)参数:
account:&signer- 协议权限签名者member:address- 角色成员地址role:u8- 角色
使用示例
TypeScript 示例
typescript
// 1. 创建池子并添加初始流动性
await entry('clmm_router::create_pool_and_add_liquidity', [
account,
tokenA,
tokenB,
tickSpacing,
initializePrice,
uri,
deltaLiquidity,
maxAmountA,
maxAmountB,
tickLower,
tickUpper
]);
// 2. 添加流动性
await entry('clmm_router::add_liquidity', [
account,
poolAddress,
deltaLiquidity,
maxAmountA,
maxAmountB,
tickLower,
tickUpper,
isOpen,
index
]);
// 3. 移除流动性
await entry('clmm_router::remove_liquidity', [
account,
poolAddress,
deltaLiquidity,
minAmountA,
minAmountB,
positionIndex,
isClose
]);
// 4. 执行交换
await entry('clmm_router::swap', [
account,
poolAddress,
aToB,
byAmountIn,
amount,
amountLimit,
priceLimit,
metadataA,
metadataB
]);
// 5. 收集费用
await entry('clmm_router::collect_fee', [
account,
poolAddress,
positionIndex
]);