跳转到主要内容

V3 Position Manager

NonfungiblePositionManager 以 ERC-721 NFT 的形式管理 V3 流动性仓位。每个仓位代表流动性池、价格范围和流动性数量的唯一组合。

核心函数

mint

创建新的流动性仓位并铸造 NFT。
struct MintParams {
    address token0;
    address token1;
    uint24 fee;
    int24 tickLower;
    int24 tickUpper;
    uint256 amount0Desired;
    uint256 amount1Desired;
    uint256 amount0Min;
    uint256 amount1Min;
    address recipient;
    uint256 deadline;
}

function mint(MintParams calldata params) external payable returns (
    uint256 tokenId,
    uint128 liquidity,
    uint256 amount0,
    uint256 amount1
);
参数描述
token0, token1代币地址(token0 < token1)
fee费率等级(100、500、3000、10000)
tickLower, tickUpper价格范围边界(必须与 tick spacing 对齐)
amount0Desired, amount1Desired最大存入数量
amount0Min, amount1Min最小接受数量(滑点保护)
recipientNFT 的接收地址
deadline交易截止时间

increaseLiquidity

向现有仓位添加更多流动性。
struct IncreaseLiquidityParams {
    uint256 tokenId;
    uint256 amount0Desired;
    uint256 amount1Desired;
    uint256 amount0Min;
    uint256 amount1Min;
    uint256 deadline;
}

function increaseLiquidity(IncreaseLiquidityParams calldata params) external payable returns (
    uint128 liquidity,
    uint256 amount0,
    uint256 amount1
);

decreaseLiquidity

从仓位中移除流动性。代币由合约暂时持有,直到调用 collect() 后才会发放。
struct DecreaseLiquidityParams {
    uint256 tokenId;
    uint128 liquidity;
    uint256 amount0Min;
    uint256 amount1Min;
    uint256 deadline;
}

function decreaseLiquidity(DecreaseLiquidityParams calldata params) external payable returns (
    uint256 amount0,
    uint256 amount1
);

collect

收集仓位应得的代币(来自已移除的流动性和/或赚取的手续费)。
struct CollectParams {
    uint256 tokenId;
    address recipient;
    uint128 amount0Max;
    uint128 amount1Max;
}

function collect(CollectParams calldata params) external payable returns (
    uint256 amount0,
    uint256 amount1
);
amount0Maxamount1Max 设为 type(uint128).max 可收集所有应得代币。

positions

通过 token ID 查询仓位的完整状态。
function positions(uint256 tokenId) external view returns (
    uint96 nonce,
    address operator,
    address token0,
    address token1,
    uint24 fee,
    int24 tickLower,
    int24 tickUpper,
    uint128 liquidity,
    uint256 feeGrowthInside0LastX128,
    uint256 feeGrowthInside1LastX128,
    uint128 tokensOwed0,
    uint128 tokensOwed1
);

burn

销毁空的仓位 NFT(在所有流动性已移除且手续费已收集之后)。
function burn(uint256 tokenId) external payable;

ABI

[
  "function mint((address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, address recipient, uint256 deadline)) payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1)",
  "function increaseLiquidity((uint256 tokenId, uint256 amount0Desired, uint256 amount1Desired, uint256 amount0Min, uint256 amount1Min, uint256 deadline)) payable returns (uint128 liquidity, uint256 amount0, uint256 amount1)",
  "function decreaseLiquidity((uint256 tokenId, uint128 liquidity, uint256 amount0Min, uint256 amount1Min, uint256 deadline)) payable returns (uint256 amount0, uint256 amount1)",
  "function collect((uint256 tokenId, address recipient, uint128 amount0Max, uint128 amount1Max)) payable returns (uint256 amount0, uint256 amount1)",
  "function positions(uint256 tokenId) view returns (uint96 nonce, address operator, address token0, address token1, uint24 fee, int24 tickLower, int24 tickUpper, uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1)",
  "function burn(uint256 tokenId) payable"
]

代币授权

在铸造或增加流动性之前,需要将两个代币授权给 Position Manager:
await token0.approve(V3_POSITION_MANAGER, amount0);
await token1.approve(V3_POSITION_MANAGER, amount1);
涉及原生 KAS 的仓位,通过 msg.value 发送 KAS 即可,无需授权 WKAS。

Multicall

Position Manager 支持 multicall() 将多个操作批量打包到一笔交易中:
function multicall(bytes[] calldata data) external payable returns (bytes[] memory results);
常见用例:在一笔交易中同时执行移除流动性和收集代币。