@swaptoshi/dex-module
Version:
Klayr decentralized exchange (dex) on-chain module
99 lines • 4.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.toUint128 = toUint128;
exports.getLiquidityForAmount0 = getLiquidityForAmount0;
exports.getLiquidityForAmount1 = getLiquidityForAmount1;
exports.getLiquidityForAmounts = getLiquidityForAmounts;
exports.getAmount0ForLiquidity = getAmount0ForLiquidity;
exports.getAmount1ForLiquidity = getAmount1ForLiquidity;
exports.getAmountsForLiquidity = getAmountsForLiquidity;
const int_1 = require("../int");
const FullMath = require("../core/full_math");
const FixedPoint96 = require("../core/fixed_point_96");
function toUint128(x) {
return int_1.Uint128.from(x).toString();
}
function getLiquidityForAmount0(sqrtRatioAX96, sqrtRatioBX96, amount0) {
let _sqrtRatioAX96 = sqrtRatioAX96;
let _sqrtRatioBX96 = sqrtRatioBX96;
if (int_1.Uint160.from(sqrtRatioAX96).gt(sqrtRatioBX96)) {
_sqrtRatioAX96 = sqrtRatioBX96;
_sqrtRatioBX96 = sqrtRatioAX96;
}
const intermediate = FullMath.mulDiv(_sqrtRatioAX96, _sqrtRatioBX96, FixedPoint96.Q96);
const liquidity = toUint128(FullMath.mulDiv(amount0, intermediate, int_1.Uint160.from(_sqrtRatioBX96).sub(_sqrtRatioAX96).toString()));
return liquidity;
}
function getLiquidityForAmount1(sqrtRatioAX96, sqrtRatioBX96, amount1) {
let _sqrtRatioAX96 = sqrtRatioAX96;
let _sqrtRatioBX96 = sqrtRatioBX96;
if (int_1.Uint160.from(sqrtRatioAX96).gt(sqrtRatioBX96)) {
_sqrtRatioAX96 = sqrtRatioBX96;
_sqrtRatioBX96 = sqrtRatioAX96;
}
const liquidity = toUint128(FullMath.mulDiv(amount1, FixedPoint96.Q96, int_1.Uint160.from(_sqrtRatioBX96).sub(_sqrtRatioAX96).toString()));
return liquidity;
}
function getLiquidityForAmounts(sqrtRatioX96, sqrtRatioAX96, sqrtRatioBX96, amount0, amount1) {
let liquidity;
let _sqrtRatioAX96 = sqrtRatioAX96;
let _sqrtRatioBX96 = sqrtRatioBX96;
if (int_1.Uint160.from(sqrtRatioAX96).gt(sqrtRatioBX96)) {
_sqrtRatioAX96 = sqrtRatioBX96;
_sqrtRatioBX96 = sqrtRatioAX96;
}
if (int_1.Uint160.from(sqrtRatioX96).lte(_sqrtRatioAX96)) {
liquidity = getLiquidityForAmount0(_sqrtRatioAX96, _sqrtRatioBX96, amount0);
}
else if (int_1.Uint160.from(sqrtRatioX96).lt(_sqrtRatioBX96)) {
const liquidity0 = getLiquidityForAmount0(sqrtRatioX96, _sqrtRatioBX96, amount0);
const liquidity1 = getLiquidityForAmount1(_sqrtRatioAX96, sqrtRatioX96, amount1);
liquidity = int_1.Uint128.from(liquidity0).lt(liquidity1) ? liquidity0 : liquidity1;
}
else {
liquidity = getLiquidityForAmount1(_sqrtRatioAX96, _sqrtRatioBX96, amount1);
}
return liquidity;
}
function getAmount0ForLiquidity(sqrtRatioAX96, sqrtRatioBX96, liquidity) {
let _sqrtRatioAX96 = sqrtRatioAX96;
let _sqrtRatioBX96 = sqrtRatioBX96;
if (int_1.Uint160.from(sqrtRatioAX96).gt(sqrtRatioBX96)) {
_sqrtRatioAX96 = sqrtRatioBX96;
_sqrtRatioBX96 = sqrtRatioAX96;
}
return int_1.Uint256.from(FullMath.mulDiv(int_1.Uint256.from(liquidity).shl(FixedPoint96.RESOLUTION).toString(), int_1.Uint160.from(_sqrtRatioBX96).sub(_sqrtRatioAX96).toString(), _sqrtRatioBX96))
.div(_sqrtRatioAX96)
.toString();
}
function getAmount1ForLiquidity(sqrtRatioAX96, sqrtRatioBX96, liquidity) {
let _sqrtRatioAX96 = sqrtRatioAX96;
let _sqrtRatioBX96 = sqrtRatioBX96;
if (int_1.Uint160.from(sqrtRatioAX96).gt(sqrtRatioBX96)) {
_sqrtRatioAX96 = sqrtRatioBX96;
_sqrtRatioBX96 = sqrtRatioAX96;
}
return FullMath.mulDiv(liquidity, int_1.Uint160.from(_sqrtRatioBX96).sub(_sqrtRatioAX96).toString(), FixedPoint96.Q96);
}
function getAmountsForLiquidity(sqrtRatioX96, sqrtRatioAX96, sqrtRatioBX96, liquidity) {
let amount0 = '0';
let amount1 = '0';
let _sqrtRatioAX96 = sqrtRatioAX96;
let _sqrtRatioBX96 = sqrtRatioBX96;
if (int_1.Uint160.from(sqrtRatioAX96).gt(sqrtRatioBX96)) {
_sqrtRatioAX96 = sqrtRatioBX96;
_sqrtRatioBX96 = sqrtRatioAX96;
}
if (int_1.Uint160.from(sqrtRatioX96).lte(_sqrtRatioAX96)) {
amount0 = getAmount0ForLiquidity(_sqrtRatioAX96, _sqrtRatioBX96, liquidity);
}
else if (int_1.Uint160.from(sqrtRatioX96).lt(_sqrtRatioBX96)) {
amount0 = getAmount0ForLiquidity(sqrtRatioX96, _sqrtRatioBX96, liquidity);
amount1 = getAmount1ForLiquidity(_sqrtRatioAX96, sqrtRatioX96, liquidity);
}
else {
amount1 = getAmount1ForLiquidity(_sqrtRatioAX96, _sqrtRatioBX96, liquidity);
}
return [amount0, amount1];
}
//# sourceMappingURL=liquidity_amounts.js.map