Skip to content

Factory 模块

模块路径: coinfair_clmm::factory

Factory 模块负责创建和管理 CLMM 流动性池,类似于 Uniswap V3 的工厂合约。每个池子由两种代币类型和 tick 间距唯一标识。

View 方法(只读)

get_pool

获取池子地址。

move
#[view]
public fun get_pool(
    token_a: Object<Metadata>,
    token_b: Object<Metadata>,
    tick_spacing: u64
): option::Option<address>

参数:

  • token_a: Object<Metadata> - 代币A的元数据对象
  • token_b: Object<Metadata> - 代币B的元数据对象
  • tick_spacing: u64 - tick间距

返回: option::Option<address> - 池子地址的Option,如果不存在则返回none

说明: 代币类型会自动排序(token_a < token_b)


pool_exists

检查池子是否存在。

move
#[view]
public fun pool_exists(
    token_a: Object<Metadata>,
    token_b: Object<Metadata>,
    tick_spacing: u64
): bool

参数:

  • token_a: Object<Metadata> - 代币A的元数据对象
  • token_b: Object<Metadata> - 代币B的元数据对象
  • tick_spacing: u64 - tick间距

返回: bool - 池子是否存在


get_pool_count

获取池子总数。

move
#[view]
public fun get_pool_count(): u64

返回: u64 - 池子总数


get_pool_address

获取池子地址(如果不存在返回 @0x0)。

move
#[view]
public fun get_pool_address(
    token_a: Object<Metadata>,
    token_b: Object<Metadata>,
    tick_spacing: u64
): address

参数:

  • token_a: Object<Metadata> - 代币A的元数据对象
  • token_b: Object<Metadata> - 代币B的元数据对象
  • tick_spacing: u64 - tick间距

返回: address - 池子地址,如果不存在则返回 @0x0


calculate_pool_address

计算池子地址并检查是否存在。

move
#[view]
public fun calculate_pool_address(
    token_a: Object<Metadata>,
    token_b: Object<Metadata>,
    tick_spacing: u64
): (address, bool)

参数:

  • token_a: Object<Metadata> - 代币A的元数据对象
  • token_b: Object<Metadata> - 代币B的元数据对象
  • tick_spacing: u64 - tick间距

返回: (address, bool) - (池子地址, 是否已存在)


Public 方法(可写)

create_pool

创建新的流动性池。

move
public fun create_pool(
    account: &signer,
    token_a: Object<Metadata>,
    token_b: Object<Metadata>,
    tick_spacing: u64,
    initialize_price: u128,
    uri: String
): address

参数:

  • account: &signer - 创建者账户
  • token_a: Object<Metadata> - 代币A的元数据对象
  • token_b: Object<Metadata> - 代币B的元数据对象
  • tick_spacing: u64 - tick间距(必须与fee_tier匹配)
  • initialize_price: u128 - 初始价格(fifrt格式)
  • uri: String - 位置NFT的URI

返回: address - 池子地址

前置条件:

  • 池子不存在
  • 初始价格在有效范围内(min_fifrt_price <= initialize_price <= max_fifrt_price)
  • 有创建池子的权限(通过config::assert_pool_create_authority检查)

事件: 触发 CreatePoolEvent

错误码:

  • EPOOL_ALREADY_INITIALIZED = 1: 池子已初始化
  • EINVALID_FIFRTPRICE = 2: 无效的初始价格

数据结构

PoolId

池子ID,用于唯一标识一个池子。

move
struct PoolId has store, copy, drop {
    token_a: Object<Metadata>,    // 代币A类型
    token_b: Object<Metadata>,     // 代币B类型
    tick_spacing: u64              // tick间距
}

CreatePoolEvent

创建池子事件。

move
#[event]
struct CreatePoolEvent has drop, store {
    creator: address,              // 创建者地址
    pool_address: address,         // 池子地址
    position_collection_name: String, // 位置收藏名称
    token_a: Object<Metadata>,     // 代币A类型
    token_b: Object<Metadata>,     // 代币B类型
    tick_spacing: u64              // tick间距
}

使用示例

TypeScript 示例

typescript
// 1. 检查池子是否存在
const exists = await view('factory::pool_exists', [
  tokenA,
  tokenB,
  tickSpacing
]);

// 2. 获取池子地址
const poolAddress = await view('factory::get_pool_address', [
  tokenA,
  tokenB,
  tickSpacing
]);

// 3. 创建新池子
const newPoolAddress = await entry('factory::create_pool', [
  account,
  tokenA,
  tokenB,
  tickSpacing,
  initializePrice,
  uri
]);

// 4. 获取池子总数
const poolCount = await view('factory::get_pool_count', []);