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
Liquidity Burned: Your shares in selected bins are burned
Tokens Returned: Receive proportional reserves + fees
Position Updated: Remaining bins stay untouched
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
Related Topics
Remove All Liquidity - Complete withdrawal
Get Position Bins - Check bins first
Calculate Output Amounts - Preview returns
Last updated