Skip to main content

V3 Position Manager

The NonfungiblePositionManager manages V3 liquidity positions as ERC-721 NFTs. Each position represents a unique combination of pool, price range, and liquidity amount.

Key Functions

mint

Creates a new liquidity position and mints an 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
);
ParameterDescription
token0, token1Token addresses (token0 < token1)
feeFee tier (100, 500, 3000, 10000)
tickLower, tickUpperPrice range boundaries (must align to tick spacing)
amount0Desired, amount1DesiredMaximum amounts to deposit
amount0Min, amount1MinMinimum accepted (slippage protection)
recipientWho receives the NFT
deadlineTransaction deadline

increaseLiquidity

Adds more liquidity to an existing position.
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

Removes liquidity from a position. Tokens are held by the contract until collect() is called.
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

Collects tokens owed to a position (from decreased liquidity and/or earned fees).
struct CollectParams {
    uint256 tokenId;
    address recipient;
    uint128 amount0Max;
    uint128 amount1Max;
}

function collect(CollectParams calldata params) external payable returns (
    uint256 amount0,
    uint256 amount1
);
Set amount0Max and amount1Max to type(uint128).max to collect everything owed.

positions

Queries the full state of a position by its 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

Burns an empty position NFT (after all liquidity is removed and fees collected).
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"
]

Token Approval

Before minting or increasing liquidity, approve both tokens to the Position Manager:
await token0.approve(V3_POSITION_MANAGER, amount0);
await token1.approve(V3_POSITION_MANAGER, amount1);
For positions involving native KAS, send KAS as msg.value instead of approving WKAS.

Multicall

The Position Manager supports multicall() to batch multiple operations in a single transaction:
function multicall(bytes[] calldata data) external payable returns (bytes[] memory results);
Common use case: decrease liquidity + collect in one transaction.