ChainScore Labs
LABS
Guides

Using NFTs as LP Positions

Chainscore © 2025
concepts

Core Concepts of NFT Liquidity Positions

Understanding the fundamental mechanisms that enable NFTs to represent concentrated liquidity positions in automated market makers (AMMs).

01

Concentrated Liquidity

Concentrated liquidity allows liquidity providers (LPs) to allocate capital within a specific price range, rather than across the full 0 to ∞ curve. This dramatically increases capital efficiency and potential fee earnings for the same level of exposure. Users can define custom price ranges (e.g., $1,800 - $2,200 for ETH/USDC) where their liquidity is active, earning fees only from trades occurring within that band.

02

Position NFT as a Vault

The Non-Fungible Token (NFT) acts as a unique, on-chain vault representing the LP's specific position parameters. It stores metadata like the chosen token pair, fee tier, price range, and accrued fees. This NFT is a transferable asset, allowing users to sell or collateralize their entire liquidity position on secondary markets, introducing new DeFi composability and exit strategies.

03

Active vs. Inactive Liquidity

Liquidity is only active and earning fees when the market price is within the position's set price range. When the price moves outside this range, the position becomes inactive, with its assets fully converting to one of the two tokens. This requires active management; users must monitor and potentially "re-center" their range to avoid being fully converted into a single, potentially depreciating, asset.

04

Fee Accrual & Compounding

Trading fees are accrued in real-time as a function of swap volume within the position's active range. These fees are automatically reinvested into the position's liquidity, increasing the quantity of underlying tokens held. This creates a compounding effect, but fees are only claimable upon burning the NFT to close the position, making it a longer-term commitment for optimal returns.

05

Impermanent Loss Dynamics

Impermanent loss (IL) is amplified in concentrated positions due to the narrower price range. While higher fee income can offset IL, if the price exits the range, the position suffers 100% IL relative to a HODL strategy, as it becomes entirely one asset. Sophisticated LPs use this to their advantage, strategically placing ranges to capture volatility and fee premiums where they expect the price to oscillate.

06

Range Order Strategy

A concentrated position can function as a limit order. For example, providing USDC/ETH liquidity only between $1,900 and $2,000 is equivalent to placing a limit order to buy ETH if the price falls to $2,000 and sell it if the price rises to $1,900, while earning fees in between. This transforms passive liquidity provision into an active, automated market-making strategy.

Creating and Managing an NFT LP Position

Process overview for minting, monitoring, and modifying concentrated liquidity positions represented as NFTs.

1

Define Position Parameters

Select the token pair, fee tier, and price range for your liquidity.

Detailed Instructions

First, identify the token pair (e.g., WETH/USDC) and the appropriate fee tier (e.g., 0.3% for major pairs). The core decision is setting your price range, which defines the active liquidity bounds. A narrow range provides higher fee earnings per trade but requires more frequent management. Use a price chart to determine a realistic range around the current price. Calculate the tick lower and tick upper values corresponding to your chosen prices. For a WETH/USDC pool where 1 ETH = $3000, a range of $2800-$3200 might be appropriate. Ensure you have sufficient balances of both tokens, accounting for the asymmetric deposit required by your chosen price.

Tip: Use the pool's slot0 function to get the current tick and sqrtPriceX96 for precise calculations.

2

Mint the Position NFT

Interact with the NonfungiblePositionManager contract to create your position.

Detailed Instructions

Call the mint function on the NonfungiblePositionManager contract (e.g., 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 on Ethereum Mainnet). The function requires a params struct containing:

  • token0 and token1 addresses (order matters).
  • fee: The selected fee tier.
  • tickLower and tickUpper: The calculated range bounds.
  • amount0Desired / amount1Desired: The maximum amounts you wish to supply.
  • amount0Min / amount1Min: Slippage protection minimums.
  • recipient: Your address to receive the NFT.
  • deadline: A future block timestamp.

Approve the manager contract to spend your tokens before calling. The call will return tokenId, liquidity (the amount of liquidity units minted), and the actual amount0 and amount1 used.

solidity
INonfungiblePositionManager.MintParams memory params = INonfungiblePositionManager.MintParams({ token0: address(WETH), token1: address(USDC), fee: 3000, tickLower: -600, tickUpper: 600, amount0Desired: 1 ether, amount1Desired: 3000 * 1e6, amount0Min: 0, amount1Min: 0, recipient: msg.sender, deadline: block.timestamp + 1200 }); (, , , ) = nftPositionManager.mint(params);
3

Monitor Performance and Fees

Track accrued fees and the health of your position relative to the market price.

Detailed Instructions

Your position earns fees proportionally to its share of active liquidity within the current price range. Use the positions function on the NonfungiblePositionManager, passing your tokenId, to retrieve key state variables: liquidity, tokensOwed0, tokensOwed1, and feeGrowthInside0LastX128. Monitor the current pool price via an oracle or the pool contract itself. If the price moves outside your set range, your liquidity becomes inactive and stops earning fees. Calculate impermanent loss by comparing the value of your held LP position against a simple HODL strategy of the underlying tokens. Use blockchain explorers or specialized DeFi dashboards (like Uniswap's interface) to visualize price movement relative to your range and track uncollected fees over time.

Tip: Fees accrue in real-time but are not automatically compounded; they must be claimed via a separate transaction.

4

Collect Accrued Fees

Withdraw earned trading fees from your position.

Detailed Instructions

To collect fees, call the collect function on the NonfungiblePositionManager. You must specify:

  • tokenId: Your position's NFT ID.
  • recipient: The address to receive the tokens.
  • amount0Max / amount1Max: The maximum amounts of each token to collect. Setting these to type(uint128).max will collect all available fees.

The function returns the actual amounts collected (amount0, amount1). Important: Collecting fees does not alter your underlying liquidity position or its price range; it only transfers the accrued fee tokens from the pool to your wallet. This transaction can be performed while the position is still active or after it has been closed. Regularly collecting fees can be a gas optimization strategy, as it resets the feeGrowthInside accumulators, preventing overflow issues over very long periods.

solidity
INonfungiblePositionManager.CollectParams memory params = INonfungiblePositionManager.CollectParams({ tokenId: tokenId, recipient: msg.sender, amount0Max: type(uint128).max, amount1Max: type(uint128).max }); nftPositionManager.collect(params);
5

Increase or Decrease Liquidity

Adjust the amount of capital deployed in your existing position.

Detailed Instructions

You can modify the capital in your position without changing its price range. To add liquidity, call increaseLiquidity, providing the tokenId and desired token amounts with slippage minimums. The contract will calculate the new liquidity minted and update the position state. To remove liquidity, call decreaseLiquidity, specifying the tokenId and the amount of liquidity to burn. This function returns the amounts of token0 and token1 you will receive, which can be collected in the same transaction or later. When decreasing, you must also specify minimum amounts for slippage protection. These functions are essential for managing capital efficiency, allowing you to compound earnings by reinvesting fees or to partially exit a position while keeping it open.

Tip: Always check the position's liquidity value before calling decreaseLiquidity to ensure you are not attempting to burn more than exists.

6

Close the Position

Burn the NFT and reclaim all underlying tokens and fees.

Detailed Instructions

Closing a position is a two-step process: first remove all liquidity, then burn the NFT. Call decreaseLiquidity with the full liquidity value from your position state. This action pulls your proportional share of the token pair from the pool back into the position's internal accounting. Immediately after (or in a multicall), call the collect function with amount0Max and amount1Max set to the maximum uint128 to claim both your remaining token balances and all accrued fees. Finally, call burn with the tokenId to destroy the NFT and free up on-chain storage, for which you will receive a small gas refund. Verify that your wallet balances have increased by the expected amounts of both tokens, completing the full lifecycle of the LP position.

solidity
// 1. Decrease all liquidity (, ) = nftPositionManager.decreaseLiquidity(INonfungiblePositionManager.DecreaseLiquidityParams({ tokenId: tokenId, liquidity: position.liquidity, amount0Min: 0, amount1Min: 0, deadline: block.timestamp + 1200 })); // 2. Collect all tokens and fees nftPositionManager.collect(collectParams); // 3. Burn the NFT nftPositionManager.burn(tokenId);

NFT LP Positions vs. Traditional LP Tokens

Comparison of liquidity provision mechanics, composability, and user experience.

FeatureNFT LP Positions (e.g., Uniswap V3)Traditional LP Tokens (e.g., Uniswap V2)Staked LP Tokens (e.g., in a Farm)

Capital Efficiency

Concentrated within a custom price range

Uniformly distributed across entire price curve (0, ∞)

Uniformly distributed, then staked

Fee Accrual

Accrues only for swaps within the set price range

Accrues proportionally from all swaps

Accrues from all swaps, plus external farming rewards

Position Management

Active: requires monitoring and range adjustment

Passive: "set and forget"

Passive for LP, active for farm claiming/restaking

Fungibility & Composability

Non-fungible, unique; can be used as collateral in NFTfi protocols

Fungible, ERC-20; widely composable across DeFi (lending, voting)

Fungible but often locked; composability depends on farm design

Impermanent Loss Exposure

Higher risk within range, zero exposure outside it

Continuous exposure across all prices

Continuous IL exposure plus potential farm token risk

Gas Costs (Initial Setup)

High (~200k-500k gas for mint & approvals)

Moderate (~150k gas for add liquidity)

High (~150k gas + additional staking tx)

Protocol Examples

Uniswap V3, PancakeSwap V3

Uniswap V2, SushiSwap, Curve (base pools)

Beefy Finance, Yearn, SushiSwap Onsen

Protocol Implementations of NFT LPs

How NFTs Represent Liquidity Positions

Non-fungible tokens are used to represent unique, discrete liquidity positions in Automated Market Makers (AMMs). This contrasts with the traditional model where liquidity is pooled and represented by a fungible ERC-20 LP token. The NFT acts as a verifiable on-chain receipt containing the specific parameters of the position, such as the chosen price range, deposited assets, and fee tier.

Key Advantages

  • Capital Efficiency: Liquidity providers (LPs) can concentrate capital within a custom price range rather than across the entire 0-to-infinity curve, significantly improving returns for stable or correlated pairs.
  • Flexible Management: Each position is a distinct asset that can be individually tracked, transferred, or used as collateral in other protocols without affecting other holdings.
  • Granular Fee Accrual: Fees are accrued directly to the NFT's position, allowing for precise attribution and compounding strategies.

Example

In Uniswap V3, when you add liquidity for the ETH/USDC pair between prices $1,800 and $2,200, you receive an NFT. This NFT's metadata encodes your exact contribution and range, allowing you to monitor its performance or sell the entire position on an NFT marketplace.

strategies

Advanced Strategies with NFT LPs

Explore sophisticated techniques for managing and optimizing liquidity positions represented as non-fungible tokens.

01

Concentrated Liquidity Management

Active range adjustment is the process of shifting an NFT LP's price range to follow market movements.

  • Re-center a position around a new market price to maintain fee-earning efficiency.
  • Widen the range during high volatility to reduce impermanent loss risk.
  • This matters as it allows LPs to adapt their strategy without closing and redeploying capital, saving on gas fees.
02

Fee Tier Optimization

Strategic fee selection involves choosing the appropriate swap fee percentage (e.g., 0.01%, 0.05%, 0.3%, 1%) for a trading pair.

  • High-volume, stable pairs may be best suited for the lowest fee tier to attract volume.
  • Exotic or volatile pairs can command the 1% tier for higher fee revenue per swap.
  • This directly impacts annual percentage yield (APY) and requires monitoring competitor pool fees.
03

LP NFT Composability

Financial NFT primitives enable using LP NFTs as collateral or components in other DeFi protocols.

  • Use an LP NFT as collateral to borrow assets in lending markets without dissolving the position.
  • Bundle multiple LP NFTs into a single vault for streamlined management and leveraged yield strategies.
  • This unlocks capital efficiency and allows for complex, automated yield farming loops.
04

Impermanent Loss Hedging

Delta-neutral strategies aim to offset the price risk inherent in providing liquidity.

  • Use perpetual futures or options to short the appreciating asset in your LP position.
  • Employ yield-bearing stablecoin LPs to minimize IL while still earning fees.
  • This is critical for professional LPs managing large portfolios who need to mitigate downside risk.
05

Automated Position Management

Keeper network integration automates the rebalancing and fee collection for LP NFT positions.

  • Set triggers to automatically compound earned fees back into the liquidity position.
  • Deploy scripts that adjust price ranges based on predefined volatility indicators.
  • This reduces manual overhead and ensures strategies execute optimally 24/7, maximizing returns.
06

Cross-Chain Liquidity Deployment

Omnichain LP strategies involve deploying liquidity across multiple blockchain networks from a single NFT position.

  • Use cross-chain messaging protocols to mirror a position's parameters on L2s or alternative L1s.
  • Arbitrage fee differences and capital efficiency across fragmented liquidity landscapes.
  • This matters for protocols and traders seeking deepest liquidity and lowest slippage globally.

NFT LP Position FAQs

The value is derived from the underlying assets in the liquidity pool. You must query the pool contract to get the total reserves of each token, then calculate your proportional share based on your NFT's liquidity share. Impermanent loss and accrued fees must be factored in. For a Uniswap V3 position, you would call positions(tokenId) to get liquidity, tickLower, and tickUpper, then use the pool's current price to compute the token amounts. For example, a position with 1 ETH and 3000 USDC at a 1:3000 ratio has a nominal value of $6000, but price movement will alter this.