Get Position Bins
View all bins where a position has active liquidity. This method shows the liquidity distribution across different price levels within a specific position.
Prerequisites
Before fetching position bins:
Have a valid position ID
Have the associated LBPair object
Understand bin IDs and price relationships
Position must belong to the specified pair
Basic Usage
// Get pair and position
const pair = await sdk.Pair.getPair(pairAddress);
const positionId = "0x123...abc";
// Fetch bins with liquidity
const bins = await sdk.Position.getPositionBins(pair, positionId);
console.log(`Position has liquidity in ${bins.length} bins`);
// Display bin details
bins.forEach(bin => {
console.log(`Bin ${bin.id}: ${bin.liquidity.toString()} liquidity`);
});
Method Signature
async getPositionBins(
pair: LBPair,
positionId: string
): Promise<BinData[]>
Parameters
pair
: The LBPair object where position existspositionId
: The position NFT address
Returns
Array of BinData
objects sorted by bin ID:
interface BinData {
id: number; // Bin ID
liquidity: bigint; // LP token amount in this bin
}
Understanding Bin Data
Liquidity Values
const bins = await sdk.Position.getPositionBins(pair, positionId);
// Analyze liquidity distribution
const totalLiquidity = bins.reduce((sum, bin) => sum + bin.liquidity, 0n);
const averageLiquidity = totalLiquidity / BigInt(bins.length);
console.log("Position statistics:", {
totalBins: bins.length,
totalLiquidity: totalLiquidity.toString(),
averageLiquidity: averageLiquidity.toString()
});
Price Range Coverage
const bins = await sdk.Position.getPositionBins(pair, positionId);
const binStep = Number(pair.binStep);
if (bins.length > 0) {
const minBinId = bins[0].id;
const maxBinId = bins[bins.length - 1].id;
const minPrice = getPriceFromBinId(minBinId, binStep);
const maxPrice = getPriceFromBinId(maxBinId, binStep);
console.log("Position price range:", {
minPrice: minPrice.toFixed(4),
maxPrice: maxPrice.toFixed(4),
binsCount: bins.length,
activebin: pair.parameters.active_id
});
}
Get Position Token Amounts
For detailed token amounts per bin:
// Get bins with token amounts
const binsWithAmounts = await sdk.Position.getPositionBinsAmount(pair, positionId);
binsWithAmounts.forEach(bin => {
console.log(`Bin ${bin.id}:`, {
liquidity: bin.liquidity.toString(),
amountX: bin.amountX.toString(),
amountY: bin.amountY.toString()
});
});
// Calculate total position value
const totals = binsWithAmounts.reduce((acc, bin) => ({
x: acc.x + bin.amountX,
y: acc.y + bin.amountY
}), { x: 0n, y: 0n });
console.log("Total position value:", totals);
Analyze Position Shape
const bins = await sdk.Position.getPositionBins(pair, positionId);
const activeId = pair.parameters.active_id;
// Categorize bins relative to current price
const analysis = {
belowActive: bins.filter(b => b.id < activeId),
atActive: bins.filter(b => b.id === activeId),
aboveActive: bins.filter(b => b.id > activeId)
};
console.log("Position shape:", {
binsBelow: analysis.belowActive.length,
binsAtActive: analysis.atActive.length,
binsAbove: analysis.aboveActive.length,
isInRange: analysis.atActive.length > 0
});
Liquidity Concentration
const bins = await sdk.Position.getPositionBins(pair, positionId);
// Find bins with most liquidity
const sortedBins = [...bins].sort((a, b) =>
Number(b.liquidity - a.liquidity)
);
const top5Bins = sortedBins.slice(0, 5);
const top5Liquidity = top5Bins.reduce((sum, b) => sum + b.liquidity, 0n);
const totalLiquidity = bins.reduce((sum, b) => sum + b.liquidity, 0n);
console.log("Concentration:", {
top5Percentage: (Number(top5Liquidity) / Number(totalLiquidity) * 100).toFixed(2),
mostConcentratedBin: top5Bins[0]?.id
});
Common Patterns
Check if Position is Active
const bins = await sdk.Position.getPositionBins(pair, positionId);
const activeId = pair.parameters.active_id;
const isActive = bins.some(bin => bin.id === activeId);
console.log("Position contains active bin:", isActive);
Visualize Distribution
const bins = await sdk.Position.getPositionBins(pair, positionId);
// Create simple ASCII visualization
bins.forEach(bin => {
const barLength = Number(bin.liquidity * 100n / maxLiquidity);
const bar = "█".repeat(Math.min(barLength, 50));
console.log(`Bin ${bin.id}: ${bar}`);
});
Error Handling
try {
const bins = await sdk.Position.getPositionBins(pair, wrongPositionId);
} catch (error) {
if (error.message.includes("not match with pair")) {
console.error("Position doesn't belong to this pair");
}
}
Related Topics
Get Single Position - Fetch position metadata
Remove from Specific Bins - Remove selected bins
Position Value - Calculate bin values
Last updated