Appearance
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', []);