Skip to content

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 - 下边界tick
  • tick_upper: u64 - 上边界tick

流程:

  1. 检查池子是否存在,不存在则创建
  2. 开启新位置
  3. 添加流动性
  4. 支付代币

错误码:

  • 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 - 下边界tick
  • tick_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 - 下边界tick
  • tick_upper: u64 - 上边界tick
  • is_open: bool - true表示创建新位置,false表示向现有位置添加
  • index: u64 - 位置索引(is_open为true时无效)

流程:

  1. 如果需要,开启新位置
  2. 添加流动性
  3. 检查代币数量限制
  4. 支付代币

错误码:

  • 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 - 下边界tick
  • tick_upper: u64 - 上边界tick
  • is_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 - 如果位置为空,是否关闭位置

流程:

  1. 移除流动性
  2. 检查最小返回数量
  3. 收集位置费用
  4. 如果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换B
  • by_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的元数据对象

流程:

  1. 执行闪电交换
  2. 检查数量限制
  3. 分配推荐费用
  4. 支付代币

错误码:

  • 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
]);