const { BigNumber } = require('ethers');
const { TickMath, FullMath } = require('@uniswap/v3-sdk');
function getLiquidityForAmounts(
sqrtPriceX96,
sqrtPriceAX96,
sqrtPriceBX96,
amount0,
amount1
) {
// Ensure A < B
if (sqrtPriceAX96.gt(sqrtPriceBX96)) {
[sqrtPriceAX96, sqrtPriceBX96] = [sqrtPriceBX96, sqrtPriceAX96];
}
if (sqrtPriceX96.lte(sqrtPriceAX96)) {
// Price below range - only token0
return getLiquidityForAmount0(sqrtPriceAX96, sqrtPriceBX96, amount0);
} else if (sqrtPriceX96.lt(sqrtPriceBX96)) {
// Price in range
const liquidity0 = getLiquidityForAmount0(sqrtPriceX96, sqrtPriceBX96, amount0);
const liquidity1 = getLiquidityForAmount1(sqrtPriceAX96, sqrtPriceX96, amount1);
return liquidity0.lt(liquidity1) ? liquidity0 : liquidity1;
} else {
// Price above range - only token1
return getLiquidityForAmount1(sqrtPriceAX96, sqrtPriceBX96, amount1);
}
}
function getAmountsForLiquidity(
sqrtPriceX96,
sqrtPriceAX96,
sqrtPriceBX96,
liquidity
) {
// Ensure A < B
if (sqrtPriceAX96.gt(sqrtPriceBX96)) {
[sqrtPriceAX96, sqrtPriceBX96] = [sqrtPriceBX96, sqrtPriceAX96];
}
let amount0 = BigNumber.from(0);
let amount1 = BigNumber.from(0);
if (sqrtPriceX96.lte(sqrtPriceAX96)) {
// Price below range
amount0 = getAmount0ForLiquidity(sqrtPriceAX96, sqrtPriceBX96, liquidity);
} else if (sqrtPriceX96.lt(sqrtPriceBX96)) {
// Price in range
amount0 = getAmount0ForLiquidity(sqrtPriceX96, sqrtPriceBX96, liquidity);
amount1 = getAmount1ForLiquidity(sqrtPriceAX96, sqrtPriceX96, liquidity);
} else {
// Price above range
amount1 = getAmount1ForLiquidity(sqrtPriceAX96, sqrtPriceBX96, liquidity);
}
return { amount0, amount1 };
}