UNPKG

@marinade.finance/kamino-sdk

Version:
173 lines 9.31 kB
"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