@kamino-finance/kliquidity-sdk
Version:
Typescript SDK for interacting with the Kamino Liquidity (kliquidity) protocol
94 lines • 4.22 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getPriceOfBinByBinId = getPriceOfBinByBinId;
exports.getBinIdFromPrice = getBinIdFromPrice;
exports.getPriceOfBinByBinIdWithDecimals = getPriceOfBinByBinIdWithDecimals;
exports.getBinIdFromPriceWithDecimals = getBinIdFromPriceWithDecimals;
exports.getPriceFromQ64Price = getPriceFromQ64Price;
exports.getBinArrayLowerUpperBinId = getBinArrayLowerUpperBinId;
exports.getBinFromBinArray = getBinFromBinArray;
exports.getBinFromBinArrays = getBinFromBinArrays;
exports.binIdToBinArrayIndex = binIdToBinArrayIndex;
exports.deriveBinArray = deriveBinArray;
const kit_1 = require("@solana/kit");
const bytes_1 = require("./bytes");
const decimal_js_1 = __importDefault(require("decimal.js"));
const numericalValues_1 = require("../constants/numericalValues");
const BASIS_POINT_MAX = 10000;
const MAX_BIN_ARRAY_SIZE = 70;
const addressEncoder = (0, kit_1.getAddressEncoder)();
function getPriceOfBinByBinId(binId, tickSpacing) {
const binStepNum = new decimal_js_1.default(tickSpacing).div(new decimal_js_1.default(BASIS_POINT_MAX));
return new decimal_js_1.default(1).add(new decimal_js_1.default(binStepNum)).pow(new decimal_js_1.default(binId));
}
function getBinIdFromPrice(price, tickSpacing, min) {
const binStepNum = new decimal_js_1.default(tickSpacing).div(new decimal_js_1.default(BASIS_POINT_MAX));
const binId = price.log().dividedBy(new decimal_js_1.default(1).add(binStepNum).log());
return (min ? binId.floor() : binId.ceil()).toNumber();
}
function getPriceOfBinByBinIdWithDecimals(binId, tickSpacing, decimalsA, decimalsB) {
return getPriceOfBinByBinId(binId, tickSpacing)
.mul(new decimal_js_1.default(10).pow(decimalsA))
.div(new decimal_js_1.default(10).pow(decimalsB));
}
function getBinIdFromPriceWithDecimals(price, tickSpacing, min, decimalsA, decimalsB) {
const scaledPrice = price.mul(new decimal_js_1.default(10).pow(decimalsB)).div(new decimal_js_1.default(10).pow(decimalsA));
return getBinIdFromPrice(scaledPrice, tickSpacing, min);
}
function getPriceFromQ64Price(price, decimalsA, decimalsB) {
const scaledPrice = price.mul(new decimal_js_1.default(10).pow(decimalsA)).div(new decimal_js_1.default(10).pow(decimalsB));
return scaledPrice.div(new decimal_js_1.default(numericalValues_1.U64_MAX));
}
function getBinArrayLowerUpperBinId(binArrayIndex) {
const lowerBinId = binArrayIndex * MAX_BIN_ARRAY_SIZE;
const upperBinId = lowerBinId + MAX_BIN_ARRAY_SIZE - 1;
return [lowerBinId, upperBinId];
}
function getBinFromBinArray(binIndex, binArray) {
const [lowerBinId] = getBinArrayLowerUpperBinId(Number(binArray.index));
const offset = binIndex - lowerBinId;
if (offset >= 0 && offset < binArray.bins.length) {
return binArray.bins[offset];
}
return null;
}
function getBinFromBinArrays(binIndex, binArrays) {
for (let i = 0; i < binArrays.length; i++) {
const bin = getBinFromBinArray(binIndex, binArrays[i]);
if (bin) {
return bin;
}
}
return null;
}
function binIdToBinArrayIndex(binId) {
const idx = binId / BigInt(MAX_BIN_ARRAY_SIZE);
const mod = binId % BigInt(MAX_BIN_ARRAY_SIZE);
return binId < 0n && mod !== 0n ? idx - 1n : idx;
}
async function deriveBinArray(lbPair, index, programId) {
let binArrayBytes;
if (index < 0n) {
const mask = (1n << 64n) - 1n;
const encoded = (~-index + 1n) & mask;
const buf = new Uint8Array(8);
const dv = new DataView(buf.buffer);
dv.setBigUint64(0, encoded, true);
binArrayBytes = buf;
}
else {
const buf = new Uint8Array(8);
const dv = new DataView(buf.buffer);
dv.setBigUint64(0, index, true);
binArrayBytes = buf;
}
const pda = await (0, kit_1.getProgramDerivedAddress)({
seeds: [(0, bytes_1.encodeUtf8)('bin_array'), addressEncoder.encode(lbPair), binArrayBytes],
programAddress: programId,
});
return pda;
}
//# sourceMappingURL=meteora.js.map