# 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

```typescript
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

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

### Common Strategies

#### Remove Out-of-Range Bins

```typescript
// 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

```typescript
// 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

```typescript
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

```typescript
// 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

```typescript
// 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](https://docs.ferra.ag/integration/dlmm/typescript-sdk/remove-liquidity/remove-all-liquidity) - Complete withdrawal
* [Get Position Bins](https://docs.ferra.ag/integration/dlmm/typescript-sdk/position-management/get-position-bins) - Check bins first
* [Calculate Output Amounts](https://docs.ferra.ag/integration/dlmm/typescript-sdk/remove-liquidity/calculate-output-amounts) - Preview returns
