@kamino-finance/kliquidity-sdk
Version:
Typescript SDK for interacting with the Kamino Liquidity (kliquidity) protocol
95 lines • 5.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RaydiumTickUtils = exports.RaydiumLiquidityMath = exports.RaydiumTickMath = exports.RaydiumSqrtPriceMath = void 0;
exports.decodeRaydiumPersonalPosition = decodeRaydiumPersonalPosition;
exports.i32ToBytes = i32ToBytes;
exports.getPdaProtocolPositionAddress = getPdaProtocolPositionAddress;
const lib_1 = require("@raydium-io/raydium-sdk-v2/lib");
const web3_js_1 = require("@solana/web3.js");
function decodeRaydiumPersonalPosition(data) {
return lib_1.PersonalPositionLayout.decode(data);
}
// Big-endian on purpose: the on-chain CLMM program derives both protocol-position and
// tick-array PDAs with tick_index.to_be_bytes(), and all existing mainnet
// ProtocolPositionState accounts live at BE-derived addresses. raydium-sdk-v2 >= 0.2.x
// switched its own getPdaProtocolPositionAddress to little-endian, which only works for
// Raydium because the program now treats protocol_position as a deprecated unchecked
// account — but we store and read this address, so we must keep the BE derivation.
function i32ToBytes(num) {
const arr = new ArrayBuffer(4);
new DataView(arr).setInt32(0, num, false);
return new Uint8Array(arr);
}
function getPdaProtocolPositionAddress(programId, poolId, tickLower, tickUpper) {
const [publicKey, nonce] = web3_js_1.PublicKey.findProgramAddressSync([
Buffer.from('position', 'utf8'),
poolId.toBuffer(),
Buffer.from(i32ToBytes(tickLower)),
Buffer.from(i32ToBytes(tickUpper)),
], programId);
return { publicKey, nonce };
}
class RaydiumSqrtPriceMath {
static sqrtPriceX64ToPrice(sqrtPriceX64, decimalsA, decimalsB) {
return lib_1.TickUtil.sqrtPriceX64ToPrice(sqrtPriceX64, decimalsA, decimalsB);
}
static priceToSqrtPriceX64(price, decimalsA, decimalsB) {
return lib_1.TickUtil.priceToSqrtPriceX64(price, decimalsA, decimalsB);
}
static getSqrtPriceX64FromTick(tick) {
return lib_1.TickUtil.getSqrtPriceAtTick(tick);
}
static getTickFromPrice(price, decimalsA, decimalsB) {
return lib_1.TickUtil.priceToTick(price, decimalsA, decimalsB);
}
static getTickFromSqrtPriceX64(sqrtPriceX64) {
return lib_1.TickUtil.getTickAtSqrtPrice(sqrtPriceX64);
}
}
exports.RaydiumSqrtPriceMath = RaydiumSqrtPriceMath;
class RaydiumTickMath {
static getTickWithPriceAndTickspacing(price, tickSpacing, mintDecimalsA, mintDecimalsB) {
const tick = RaydiumSqrtPriceMath.getTickFromPrice(price, mintDecimalsA, mintDecimalsB);
const roundedTick = tick < 0 ? Math.floor(tick / tickSpacing) : Math.ceil(tick / tickSpacing);
return roundedTick * tickSpacing;
}
static roundPriceWithTickspacing(price, tickSpacing, mintDecimalsA, mintDecimalsB) {
const tick = this.getTickWithPriceAndTickspacing(price, tickSpacing, mintDecimalsA, mintDecimalsB);
return RaydiumSqrtPriceMath.sqrtPriceX64ToPrice(RaydiumSqrtPriceMath.getSqrtPriceX64FromTick(tick), mintDecimalsA, mintDecimalsB);
}
}
exports.RaydiumTickMath = RaydiumTickMath;
class RaydiumLiquidityMath {
static addDelta(x, y) {
return lib_1.LiquidityMathUtil.addDelta(x, y);
}
static getTokenAmountAFromLiquidity(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp) {
return lib_1.LiquidityMathUtil.getAmountForLiquidityA(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp);
}
static getTokenAmountBFromLiquidity(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp) {
return lib_1.LiquidityMathUtil.getAmountForLiquidityB(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp);
}
static getLiquidityFromTokenAmountA(sqrtPriceX64A, sqrtPriceX64B, amountA, _roundUp) {
return lib_1.LiquidityMathUtil.getLiquidityFromAmountA(sqrtPriceX64A, sqrtPriceX64B, amountA);
}
static getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceX64B, amountB) {
return lib_1.LiquidityMathUtil.getLiquidityFromAmountB(sqrtPriceX64A, sqrtPriceX64B, amountB);
}
static getLiquidityFromTokenAmounts(sqrtPriceCurrentX64, sqrtPriceX64A, sqrtPriceX64B, amountA, amountB) {
return lib_1.LiquidityMathUtil.getLiquidityFromAmounts(sqrtPriceCurrentX64, sqrtPriceX64A, sqrtPriceX64B, amountA, amountB);
}
static getAmountsFromLiquidity(sqrtPriceCurrentX64, sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp) {
return lib_1.LiquidityMathUtil.getAmountsForLiquidity(sqrtPriceCurrentX64, sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp);
}
static getAmountsFromLiquidityWithSlippage(sqrtPriceCurrentX64, sqrtPriceX64A, sqrtPriceX64B, liquidity, amountMax, roundUp, amountSlippage) {
return lib_1.LiquidityMathUtil.getAmountsFromLiquidityWithSlippage(sqrtPriceCurrentX64, sqrtPriceX64A, sqrtPriceX64B, liquidity, amountMax, roundUp, amountSlippage);
}
}
exports.RaydiumLiquidityMath = RaydiumLiquidityMath;
class RaydiumTickUtils {
static getTickArrayStartIndexByTick(tickIndex, tickSpacing) {
return lib_1.TickArrayUtil.getTickArrayStartIndex(tickIndex, tickSpacing);
}
}
exports.RaydiumTickUtils = RaydiumTickUtils;
//# sourceMappingURL=raydiumSdkCompat.js.map