Remove from Specific Bins

Selectively withdraw liquidity from individual bins while maintaining positions in others. Perfect for rebalancing, profit-taking, or adjusting your range.

Prerequisites

  • Position ID with active liquidity

  • List of bin IDs to remove from

  • Understanding of current bin distribution

  • Gas for transaction execution

Basic Usage

const pair = await sdk.Pair.getPair(pairAddress);

// Remove from specific bins only
const tx = await sdk.Pair.removeLiquidity(pair, {
  positionId: "0x123...abc",
  binIds: [8388606, 8388607, 8388609]  // Selected bins
});

await sdk.fullClient.signAndExecuteTransaction({
  transaction: tx,
  signer: keypair
});

Method Parameters

interface RemoveLiquidityParams {
  positionId: string;    // Your position NFT
  binIds: number[];      // Array of bin IDs to remove
}

Common Strategies

Remove Out-of-Range Bins

// Get current position bins
const bins = await sdk.Position.getPositionBins(pair, positionId);
const activeId = pair.parameters.active_id;

// Find bins far from current price
const outOfRangeBins = bins
  .filter(bin => Math.abs(bin.id - activeId) > 10)
  .map(bin => bin.id);

// Remove distant liquidity
await sdk.Pair.removeLiquidity(pair, {
  positionId,
  binIds: outOfRangeBins
});

Harvest High-Fee Bins

// Get bins with accumulated fees
const binsWithAmounts = await sdk.Position.getPositionBinsAmount(pair, positionId);

// Find bins with significant fees
const highFeeBins = binsWithAmounts
  .filter(bin => {
    const fees = calculateBinFees(bin);
    return fees > FEE_THRESHOLD;
  })
  .map(bin => bin.id);

// Collect from profitable bins
await sdk.Pair.removeLiquidity(pair, {
  positionId,
  binIds: highFeeBins
});

Rebalance Toward Active Price

const activeId = pair.parameters.active_id;
const bins = await sdk.Position.getPositionBins(pair, positionId);

// Remove from one side to rebalance
const removeBins = bins
  .filter(bin => bin.id < activeId - 5)  // Remove below
  .map(bin => bin.id);

await sdk.Pair.removeLiquidity(pair, {
  positionId,
  binIds: removeBins
});

What Happens

  1. Liquidity Burned: Your shares in selected bins are burned

  2. Tokens Returned: Receive proportional reserves + fees

  3. Position Updated: Remaining bins stay untouched

  4. Fees Collected: Accumulated fees automatically included

Calculate Before Removing

// Preview removal amounts
const binsToRemove = [8388606, 8388607];
const amounts = await sdk.Position.getPositionBinsAmount(pair, positionId);

const totalOut = amounts
  .filter(bin => binsToRemove.includes(bin.id))
  .reduce((acc, bin) => ({
    x: acc.x + bin.amountX,
    y: acc.y + bin.amountY
  }), { x: 0n, y: 0n });

console.log("Will receive:", totalOut);

Gas Optimization

// Batch remove many bins efficiently
const allBinIds = bins.map(b => b.id);

// More efficient than multiple transactions
await sdk.Pair.removeLiquidity(pair, {
  positionId,
  binIds: allBinIds  // Remove all at once
});

Important Notes

  • Cannot remove from bins without liquidity

  • Fees are included automatically

  • Position NFT remains active

  • Can add back to same bins later

Last updated