@marinade.finance/kamino-sdk
Version:
173 lines • 9.31 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.deserializeDriftRebalanceWithStateOverride = exports.deserializeDriftRebalanceFromOnchainParams = exports.readDriftRebalanceStateFromStrategy = exports.readRawDriftRebalanceStateFromStrategy = exports.readDriftRebalanceParamsFromStrategy = exports.getDefaultDriftRebalanceFieldInfos = exports.getPositionRangeFromDriftParams = exports.getPositionRangeFromTakeProfitFieldInfos = exports.getDriftRebalanceFieldInfos = exports.DriftRebalanceTypeName = exports.DEFAULT_DIRECTION = exports.DEFAULT_SECONDS_PER_TICK = exports.DEFAULT_TICKS_ABOVE_MID = exports.DEFAULT_TICKS_BELOW_MID = void 0;
const decimal_js_1 = __importDefault(require("decimal.js"));
const whirlpool_sdk_1 = require("@orca-so/whirlpool-sdk");
const raydium_sdk_1 = require("@raydium-io/raydium-sdk");
const consts_1 = require("./consts");
const utils_1 = require("./utils");
exports.DEFAULT_TICKS_BELOW_MID = new decimal_js_1.default(10);
exports.DEFAULT_TICKS_ABOVE_MID = new decimal_js_1.default(10);
exports.DEFAULT_SECONDS_PER_TICK = new decimal_js_1.default(60 * 60 * 24 * 3); // 3 days; todo: get a reasonable default from Matt
exports.DEFAULT_DIRECTION = new decimal_js_1.default(1);
exports.DriftRebalanceTypeName = 'drift';
function getDriftRebalanceFieldInfos(dex, tokenADecimals, tokenBDecimals, startMidTick, ticksBelowMid, ticksAboveMid, secondsPerTick, direction, enabled = true) {
let rebalanceType = {
label: consts_1.RebalanceTypeLabelName,
type: 'string',
value: exports.DriftRebalanceTypeName,
enabled,
};
let startMidTickRebalanceFieldInfo = {
label: 'startMidTick',
type: 'number',
value: startMidTick,
enabled,
};
let ticksBelowMidRebalanceFieldInfo = {
label: 'ticksBelowMid',
type: 'number',
value: ticksBelowMid,
enabled,
};
let ticksAboveMidRebalanceFieldInfo = {
label: 'ticksAboveMid',
type: 'number',
value: ticksAboveMid,
enabled,
};
let secondsPerTickRebalanceFieldInfo = {
label: 'secondsPerTick',
type: 'number',
value: secondsPerTick,
enabled,
};
let directionRebalanceFieldInfo = {
label: 'direction',
type: 'number',
value: direction,
enabled,
};
let { lowerPrice, upperPrice } = getPositionRangeFromDriftParams(dex, tokenADecimals, tokenBDecimals, startMidTick, ticksBelowMid, ticksAboveMid);
let lowerRangeRebalanceFieldInfo = {
label: 'rangePriceLower',
type: 'number',
value: lowerPrice,
enabled: false,
};
let upperRangeRebalanceFieldInfo = {
label: 'rangePriceUpper',
type: 'number',
value: upperPrice,
enabled: false,
};
return [
rebalanceType,
startMidTickRebalanceFieldInfo,
ticksBelowMidRebalanceFieldInfo,
ticksAboveMidRebalanceFieldInfo,
secondsPerTickRebalanceFieldInfo,
directionRebalanceFieldInfo,
lowerRangeRebalanceFieldInfo,
upperRangeRebalanceFieldInfo,
];
}
exports.getDriftRebalanceFieldInfos = getDriftRebalanceFieldInfos;
// todo(silviu): see if this is needed
function getPositionRangeFromTakeProfitFieldInfos(fieldInfos) { }
exports.getPositionRangeFromTakeProfitFieldInfos = getPositionRangeFromTakeProfitFieldInfos;
function getPositionRangeFromDriftParams(dex, tokenADecimals, tokenBDecimals, startMidTick, ticksBelowMid, ticksAboveMid) {
let lowerTickIndex = startMidTick.sub(ticksBelowMid);
let upperTickIndex = startMidTick.add(ticksAboveMid);
if (dex == 'ORCA') {
let lowerPrice = (0, whirlpool_sdk_1.tickIndexToPrice)(lowerTickIndex.toNumber(), tokenADecimals, tokenBDecimals);
let upperPrice = (0, whirlpool_sdk_1.tickIndexToPrice)(upperTickIndex.toNumber(), tokenADecimals, tokenBDecimals);
return { lowerPrice, upperPrice };
}
else if (dex == 'RAYDIUM') {
let lowerPrice = (0, whirlpool_sdk_1.sqrtPriceX64ToPrice)(raydium_sdk_1.SqrtPriceMath.getSqrtPriceX64FromTick(lowerTickIndex.toNumber()), tokenADecimals, tokenBDecimals);
let upperPrice = (0, whirlpool_sdk_1.sqrtPriceX64ToPrice)(raydium_sdk_1.SqrtPriceMath.getSqrtPriceX64FromTick(upperTickIndex.toNumber()), tokenADecimals, tokenBDecimals);
return { lowerPrice, upperPrice };
}
else {
throw new Error(`Unknown DEX ${dex}`);
}
}
exports.getPositionRangeFromDriftParams = getPositionRangeFromDriftParams;
// todo(silviu): get sensible default params from Matt
function getDefaultDriftRebalanceFieldInfos(dex, price, tokenADecimals, tokenBDecimals) {
let currentTickIndex = (0, whirlpool_sdk_1.priceToTickIndex)(price, tokenADecimals, tokenBDecimals);
let startMidTick = new decimal_js_1.default(currentTickIndex);
return getDriftRebalanceFieldInfos(dex, tokenADecimals, tokenBDecimals, startMidTick, exports.DEFAULT_TICKS_BELOW_MID, exports.DEFAULT_TICKS_ABOVE_MID, exports.DEFAULT_SECONDS_PER_TICK, exports.DEFAULT_DIRECTION);
}
exports.getDefaultDriftRebalanceFieldInfos = getDefaultDriftRebalanceFieldInfos;
function readDriftRebalanceParamsFromStrategy(rebalanceRaw) {
let paramsBuffer = Buffer.from(rebalanceRaw.params);
let params = {};
params['startMidTick'] = new decimal_js_1.default(paramsBuffer.readInt32LE(0));
params['ticksBelowMid'] = new decimal_js_1.default(paramsBuffer.readInt32LE(4));
params['ticksAboveMid'] = new decimal_js_1.default(paramsBuffer.readInt32LE(8));
params['secondsPerTick'] = new decimal_js_1.default(paramsBuffer.readBigUint64LE(12).toString());
params['direction'] = new decimal_js_1.default(paramsBuffer.readUint8(20));
return params;
}
exports.readDriftRebalanceParamsFromStrategy = readDriftRebalanceParamsFromStrategy;
function readRawDriftRebalanceStateFromStrategy(rebalanceRaw) {
let stateBuffer = Buffer.from(rebalanceRaw.state);
let state = {};
state['step'] = new decimal_js_1.default(stateBuffer.readUInt8(0));
state['lastDriftTimestamp'] = new decimal_js_1.default(stateBuffer.readBigUint64LE(1).toString());
state['lastMidTick'] = new decimal_js_1.default(stateBuffer.readInt32LE(9));
return state;
}
exports.readRawDriftRebalanceStateFromStrategy = readRawDriftRebalanceStateFromStrategy;
function readDriftRebalanceStateFromStrategy(dex, tokenADecimals, tokenBDecimals, rebalanceRaw) {
let stateBuffer = Buffer.from(rebalanceRaw.state);
let paramsBuffer = Buffer.from(rebalanceRaw.params);
let lastMidTick = new decimal_js_1.default(stateBuffer.readInt32LE(9));
let ticksBelowMid = new decimal_js_1.default(paramsBuffer.readInt32LE(4));
let ticksAboveMid = new decimal_js_1.default(paramsBuffer.readInt32LE(8));
let lowerTickIndex = lastMidTick.sub(ticksBelowMid);
let upperTickIndex = lastMidTick.add(ticksAboveMid);
let lowerPrice, upperPrice;
if (dex == 'ORCA') {
lowerPrice = (0, whirlpool_sdk_1.tickIndexToPrice)(lowerTickIndex.toNumber(), tokenADecimals, tokenBDecimals);
upperPrice = (0, whirlpool_sdk_1.tickIndexToPrice)(upperTickIndex.toNumber(), tokenADecimals, tokenBDecimals);
}
else if (dex == 'RAYDIUM') {
lowerPrice = (0, whirlpool_sdk_1.sqrtPriceX64ToPrice)(raydium_sdk_1.SqrtPriceMath.getSqrtPriceX64FromTick(lowerTickIndex.toNumber()), tokenADecimals, tokenBDecimals);
upperPrice = (0, whirlpool_sdk_1.sqrtPriceX64ToPrice)(raydium_sdk_1.SqrtPriceMath.getSqrtPriceX64FromTick(upperTickIndex.toNumber()), tokenADecimals, tokenBDecimals);
}
else {
throw new Error(`Unknown DEX ${dex}`);
}
let lowerRangeRebalanceFieldInfo = {
label: 'rangePriceLower',
type: 'number',
value: lowerPrice,
enabled: false,
};
let upperRangeRebalanceFieldInfo = {
label: 'rangePriceUpper',
type: 'number',
value: upperPrice,
enabled: false,
};
return [lowerRangeRebalanceFieldInfo, upperRangeRebalanceFieldInfo];
}
exports.readDriftRebalanceStateFromStrategy = readDriftRebalanceStateFromStrategy;
function deserializeDriftRebalanceFromOnchainParams(dex, tokenADecimals, tokenBDecimals, rebalanceRaw) {
let params = readDriftRebalanceParamsFromStrategy(rebalanceRaw);
return getDriftRebalanceFieldInfos(dex, tokenADecimals, tokenBDecimals, params['startMidTick'], params['ticksBelowMid'], params['ticksAboveMid'], params['secondsPerTick'], params['direction']);
}
exports.deserializeDriftRebalanceFromOnchainParams = deserializeDriftRebalanceFromOnchainParams;
function deserializeDriftRebalanceWithStateOverride(dex, tokenADecimals, tokenBDecimals, rebalanceRaw) {
const stateFields = readDriftRebalanceStateFromStrategy(dex, tokenADecimals, tokenBDecimals, rebalanceRaw);
let fields = deserializeDriftRebalanceFromOnchainParams(dex, tokenADecimals, tokenBDecimals, rebalanceRaw);
return (0, utils_1.upsertManyRebalanceFieldInfos)(fields, stateFields);
}
exports.deserializeDriftRebalanceWithStateOverride = deserializeDriftRebalanceWithStateOverride;
//# sourceMappingURL=driftRebalance.js.map