Appearance
Position NFT 模块
模块路径: coinfair_clmm::position_nft
Position NFT 模块负责管理流动性位置的NFT。用户位置权限由代币表示,拥有代币的用户控制该位置。每个池都有一个集合,该池的所有位置都属于这个集合。
Public 方法(可写)
create_collection
创建位置NFT集合。
move
public fun create_collection(
creator: &signer,
tick_spacing: u64,
description: String,
uri: String,
metadata_a: Object<Metadata>,
metadata_b: Object<Metadata>
): String参数:
creator:&signer- 创建者(池资源账户)tick_spacing:u64- 池的tick间距description:String- 集合描述uri:String- NFT集合URImetadata_a:Object<Metadata>- 代币A的元数据metadata_b:Object<Metadata>- 代币B的元数据
返回: String - 集合名称
说明: 由pool模块在创建池子时自动调用
集合名称格式: "Coinfair Position | {tokenA}-{tokenB}_tick({tick_spacing})"
mint
铸造位置NFT。
move
public fun mint(
user: &signer,
creator: &signer,
pool_index: u64,
position_index: u64,
pool_uri: String,
collection: String
)参数:
user:&signer- NFT接收者creator:&signer- 创建者(池资源账户)pool_index:u64- 池索引position_index:u64- 位置索引pool_uri:String- 池URIcollection:String- NFT集合名称
说明: 由pool模块在开启位置时自动调用
NFT名称格式: "Coinfair LP | Pool{pool_index}-{position_index}"
属性:
index:u64- 位置索引TOKEN_BURNABLE_BY_CREATOR:bool- 创建者可销毁(true)
burn
销毁位置NFT。
move
public fun burn(
creator: &signer,
user: address,
collection_name: String,
pool_index: u64,
pos_index: u64
)参数:
creator:&signer- NFT创建者(池资源账户)user:address- NFT所有者collection_name:String- 集合名称pool_index:u64- 池索引pos_index:u64- 位置索引
说明: 由pool模块在关闭位置时自动调用
position_name
生成位置NFT名称。
move
public fun position_name(pool_index: u64, index: u64): String参数:
pool_index:u64- 池索引index:u64- 位置索引
返回: String - 位置名称字符串
格式: "Coinfair LP | Pool{pool_index}-{index}"
collection_name
生成位置代币集合唯一名称。
move
public fun collection_name(
tick_spacing: u64,
metadata_a: Object<Metadata>,
metadata_b: Object<Metadata>
): String参数:
tick_spacing:u64- tick间距metadata_a:Object<Metadata>- 代币A的元数据metadata_b:Object<Metadata>- 代币B的元数据
返回: String - 集合名称字符串
格式: "Coinfair Position | {tokenA}-{tokenB}_tick({tick_spacing})"
mutate_collection_uri
修改集合URI(目前在主网不支持)。
move
public fun mutate_collection_uri(
_creator: &signer,
_collection: String,
_uri: String
)参数:
_creator:&signer- 创建者_collection:String- 集合名称_uri:String- 新URI
说明: 目前在主网不支持此功能
使用说明
NFT所有权验证
位置NFT用于验证用户对流动性位置的所有权。在调用pool模块的位置相关操作时,系统会检查用户是否持有对应的位置NFT。
NFT标识符构造
位置NFT的标识符由以下信息构造:
- 创建者地址: 池资源账户地址(通过
account::get_signer_capability_address获取) - 集合名称: 通过
collection_name函数生成 - NFT名称: 通过
position_name函数生成 - 属性版本: 0
NFT生命周期
- 创建: 当用户调用
pool::open_position时,自动调用mint函数铸造NFT - 转移: NFT可以像普通NFT一样转移,转移后新所有者获得位置控制权
- 销毁: 当位置流动性为0且用户调用
pool::checked_close_position时,自动调用burn函数销毁NFT
使用示例
TypeScript 示例
typescript
// 注意:Position NFT 模块的方法通常由 pool 模块内部调用
// 前端通常不需要直接调用这些方法
// 1. 查询用户是否持有位置NFT(通过token标准)
const tokenId = createTokenId(
poolSignerAddress,
collectionName,
positionName,
0 // 属性版本
);
const balance = await view('token::balance_of', [userAddress, tokenId]);
// 2. 查询位置NFT的元数据
const tokenData = await view('token::get_token_data', [
poolSignerAddress,
collectionName,
positionName
]);
// 3. 转移位置NFT(转移后新所有者获得位置控制权)
await entry('token::transfer', [
account,
recipientAddress,
poolSignerAddress,
collectionName,
positionName,
0, // 属性版本
1 // 数量
]);