UNPKG

@marinade.finance/kamino-sdk

Version:
281 lines 13.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.deserializeExpanderRebalanceWithStateOverride = exports.readExpanderRebalanceFieldInfosFromStrategy = exports.readExpanderRebalanceStateFromStrategy = exports.readRawExpanderRebalanceStateFromStrategy = exports.readExpanderRebalanceParamsFromStrategy = exports.readRawExpanderRebalanceParamsFromStrategy = exports.getDefaultExpanderRebalanceFieldInfos = exports.getPositionResetRangeFromExpanderParams = exports.getPositionRangeFromExpanderParams = exports.getExpanderRebalanceFieldInfos = exports.ExpanderRebalanceTypeName = exports.DefaultSwapUnevenAllowed = exports.DefaultExpansionSizeBPS = exports.DefaultMaxNumberOfExpansions = void 0; const decimal_js_1 = __importDefault(require("decimal.js")); const CreationParameters_1 = require("../utils/CreationParameters"); const consts_1 = require("./consts"); const utils_1 = require("../utils"); const whirlpool_sdk_1 = require("@orca-so/whirlpool-sdk"); const bn_js_1 = __importDefault(require("bn.js")); const utils_2 = require("./utils"); const math_utils_1 = require("./math_utils"); exports.DefaultMaxNumberOfExpansions = new decimal_js_1.default(10); exports.DefaultExpansionSizeBPS = new decimal_js_1.default(100); exports.DefaultSwapUnevenAllowed = new decimal_js_1.default(1); exports.ExpanderRebalanceTypeName = 'expander'; function getExpanderRebalanceFieldInfos(price, lowerPercentageBPS, upperPercentageBPS, resetLowerPercentageBPS, resetUpperPercentageBPS, expansionBPS, maxNumberOfExpansions, swapUnevenAllowed, enabled = true) { let rebalanceType = { label: consts_1.RebalanceTypeLabelName, type: 'string', value: exports.ExpanderRebalanceTypeName, enabled, }; let lowerBpsRebalanceFieldInfo = { label: 'lowerRangeBps', type: 'number', value: lowerPercentageBPS, enabled, }; let upperBpsRebalanceFieldInfo = { label: 'upperRangeBps', type: 'number', value: upperPercentageBPS, enabled, }; let resetLowerBpsRebalanceFieldInfo = { label: 'resetLowerRangeBps', type: 'number', value: resetLowerPercentageBPS, enabled, }; let resetUpperBpsRebalanceFieldInfo = { label: 'resetUpperRangeBps', type: 'number', value: resetUpperPercentageBPS, enabled, }; let expansionBpsRebalanceFieldInfo = { label: 'expansionBps', type: 'number', value: expansionBPS, enabled, }; let maxNumberOfExpansionsRebalanceFieldInfo = { label: 'maxNumberOfExpansions', type: 'number', value: maxNumberOfExpansions, enabled, }; let swapUnevenAllowedFieldInfo = { label: 'swapUnevenAllowed', type: 'number', value: swapUnevenAllowed, enabled, }; let { lowerPrice, upperPrice } = getPositionRangeFromExpanderParams(price, lowerPercentageBPS, upperPercentageBPS); let lowerRangeRebalanceFieldInfo = { label: 'rangePriceLower', type: 'number', value: lowerPrice, enabled: false, }; let upperRangeRebalanceFieldInfo = { label: 'rangePriceUpper', type: 'number', value: upperPrice, enabled: false, }; let { lowerPrice: resetLowerPrice, upperPrice: resetUpperPrice } = getPositionResetRangeFromExpanderParams(price, lowerPercentageBPS, upperPercentageBPS, resetLowerPercentageBPS, resetUpperPercentageBPS); let resetLowerRangeRebalanceFieldInfo = { label: 'resetPriceLower', type: 'number', value: resetLowerPrice, enabled: false, }; let resetUpperRangeRebalanceFieldInfo = { label: 'resetPriceUpper', type: 'number', value: resetUpperPrice, enabled: false, }; return [ rebalanceType, lowerBpsRebalanceFieldInfo, upperBpsRebalanceFieldInfo, resetLowerBpsRebalanceFieldInfo, resetUpperBpsRebalanceFieldInfo, expansionBpsRebalanceFieldInfo, maxNumberOfExpansionsRebalanceFieldInfo, swapUnevenAllowedFieldInfo, lowerRangeRebalanceFieldInfo, upperRangeRebalanceFieldInfo, resetLowerRangeRebalanceFieldInfo, resetUpperRangeRebalanceFieldInfo, ]; } exports.getExpanderRebalanceFieldInfos = getExpanderRebalanceFieldInfos; function getPositionRangeFromExpanderParams(price, lowerPriceDifferenceBPS, upperPriceDifferenceBPS) { return (0, math_utils_1.getPriceRangeFromPriceAndDiffBPS)(price, lowerPriceDifferenceBPS, upperPriceDifferenceBPS); } exports.getPositionRangeFromExpanderParams = getPositionRangeFromExpanderParams; function getPositionResetRangeFromExpanderParams(price, lowerPriceDifferenceBPS, upperPriceDifferenceBPS, resetLowerPriceDifferenceBPS, resetUpperPriceDifferenceBPS) { return (0, math_utils_1.getResetRangeFromPriceAndDiffBPS)(price, lowerPriceDifferenceBPS, upperPriceDifferenceBPS, resetLowerPriceDifferenceBPS, resetUpperPriceDifferenceBPS); } exports.getPositionResetRangeFromExpanderParams = getPositionResetRangeFromExpanderParams; function getDefaultExpanderRebalanceFieldInfos(price) { return getExpanderRebalanceFieldInfos(price, CreationParameters_1.DefaultLowerPercentageBPSDecimal, CreationParameters_1.DefaultUpperPercentageBPSDecimal, CreationParameters_1.DefaultLowerPercentageBPSDecimal, CreationParameters_1.DefaultUpperPercentageBPSDecimal, CreationParameters_1.DefaultLowerPercentageBPSDecimal, exports.DefaultMaxNumberOfExpansions, exports.DefaultSwapUnevenAllowed); } exports.getDefaultExpanderRebalanceFieldInfos = getDefaultExpanderRebalanceFieldInfos; function readRawExpanderRebalanceParamsFromStrategy(rebalanceRaw) { let paramsBuffer = Buffer.from(rebalanceRaw.params); let params = {}; params['lowerRangeBps'] = new decimal_js_1.default(paramsBuffer.readUInt16LE(0)); params['upperRangeBps'] = new decimal_js_1.default(paramsBuffer.readUInt16LE(2)); params['lowerResetRatioBps'] = new decimal_js_1.default(paramsBuffer.readUInt16LE(4)); params['upperResetRatioBps'] = new decimal_js_1.default(paramsBuffer.readUInt16LE(6)); params['expansionBps'] = new decimal_js_1.default(paramsBuffer.readUInt16LE(8)); params['maxNumberOfExpansions'] = new decimal_js_1.default(paramsBuffer.readUInt16LE(10)); params['swapUnevenAllowed'] = new decimal_js_1.default(paramsBuffer.readUInt8(12)); return params; } exports.readRawExpanderRebalanceParamsFromStrategy = readRawExpanderRebalanceParamsFromStrategy; function readExpanderRebalanceParamsFromStrategy(rebalanceRaw) { let paramsBuffer = Buffer.from(rebalanceRaw.params); let lowerRangeBps = new decimal_js_1.default(paramsBuffer.readUInt16LE(0)); let upperRangeBps = new decimal_js_1.default(paramsBuffer.readUInt16LE(2)); let lowerResetRatioBps = new decimal_js_1.default(paramsBuffer.readUInt16LE(4)); let upperResetRatioBps = new decimal_js_1.default(paramsBuffer.readUInt16LE(6)); let expansionBps = new decimal_js_1.default(paramsBuffer.readUInt16LE(8)); let maxNumberOfExpansions = new decimal_js_1.default(paramsBuffer.readUInt16LE(10)); let swapUnevenAllowed = new decimal_js_1.default(paramsBuffer.readUInt8(12)); let lowerBpsRebalanceFieldInfo = { label: 'lowerRangeBps', type: 'number', value: lowerRangeBps, enabled: true, }; let upperBpsRebalanceFieldInfo = { label: 'upperRangeBps', type: 'number', value: upperRangeBps, enabled: true, }; let resetLowerBpsRebalanceFieldInfo = { label: 'resetLowerRangeBps', type: 'number', value: lowerResetRatioBps, enabled: true, }; let resetUpperBpsRebalanceFieldInfo = { label: 'resetUpperRangeBps', type: 'number', value: upperResetRatioBps, enabled: true, }; let expansionBpsRebalanceFieldInfo = { label: 'expansionBps', type: 'number', value: expansionBps, enabled: true, }; let maxNumberOfExpansionsRebalanceFieldInfo = { label: 'maxNumberOfExpansions', type: 'number', value: maxNumberOfExpansions, enabled: true, }; let swapUnevenAllowedFieldInfo = { label: 'swapUnevenAllowed', type: 'number', value: swapUnevenAllowed, enabled: true, }; return [ lowerBpsRebalanceFieldInfo, upperBpsRebalanceFieldInfo, resetLowerBpsRebalanceFieldInfo, resetUpperBpsRebalanceFieldInfo, expansionBpsRebalanceFieldInfo, maxNumberOfExpansionsRebalanceFieldInfo, swapUnevenAllowedFieldInfo, ]; } exports.readExpanderRebalanceParamsFromStrategy = readExpanderRebalanceParamsFromStrategy; function readRawExpanderRebalanceStateFromStrategy(rebalanceRaw) { let stateBuffer = Buffer.from(rebalanceRaw.state); let state = {}; state['initialPoolPrice'] = new decimal_js_1.default((0, utils_1.readBigUint128LE)(stateBuffer, 0).toString()); state['expansionCount'] = new decimal_js_1.default(stateBuffer.readUInt16LE(16)); return state; } exports.readRawExpanderRebalanceStateFromStrategy = readRawExpanderRebalanceStateFromStrategy; function readExpanderRebalanceStateFromStrategy(dex, tokenADecimals, tokenBDecimals, rebalanceRaw) { let stateBuffer = Buffer.from(rebalanceRaw.state); let params = readRawExpanderRebalanceParamsFromStrategy(rebalanceRaw); let lowerRangeBps = params['lowerRangeBps']; let upperRangeBps = params['upperRangeBps']; let lowerResetRatioBps = params['lowerResetRatioBps']; let upperResetRatioBps = params['upperResetRatioBps']; let expansionBps = params['expansionBps']; let state = readRawExpanderRebalanceStateFromStrategy(rebalanceRaw); let initialPriceX64 = state['initialPoolPrice']; let expansionCount = state['expansionCount']; let initialPrice; if (dex == 'ORCA') { initialPrice = (0, whirlpool_sdk_1.sqrtPriceX64ToPrice)(new bn_js_1.default(initialPriceX64.toString()), tokenADecimals, tokenBDecimals); } else if (dex == 'RAYDIUM') { initialPrice = (0, whirlpool_sdk_1.sqrtPriceX64ToPrice)(new bn_js_1.default(initialPriceX64.toString()), tokenADecimals, tokenBDecimals); } else { throw new Error(`Unknown DEX ${dex}`); } let lowerRangeFactorBPS = lowerRangeBps.add(expansionBps.mul(expansionCount)); let upperRangeFactorBPS = upperRangeBps.add(expansionBps.mul(expansionCount)); let { lowerPrice, upperPrice } = (0, math_utils_1.getPriceRangeFromPriceAndDiffBPS)(initialPrice, lowerRangeFactorBPS, upperRangeFactorBPS); let { lowerPrice: lowerResetPrice, upperPrice: upperResetPrice } = (0, math_utils_1.getResetRangeFromPriceAndDiffBPS)(initialPrice, lowerRangeFactorBPS, upperRangeFactorBPS, lowerResetRatioBps, upperResetRatioBps); let lowerRangeRebalanceFieldInfo = { label: 'rangePriceLower', type: 'number', value: lowerPrice, enabled: false, }; let upperRangeRebalanceFieldInfo = { label: 'rangePriceUpper', type: 'number', value: upperPrice, enabled: false, }; let resetLowerRangeRebalanceFieldInfo = { label: 'resetPriceLower', type: 'number', value: lowerResetPrice, enabled: false, }; let resetUpperRangeRebalanceFieldInfo = { label: 'resetPriceUpper', type: 'number', value: upperResetPrice, enabled: false, }; return [ lowerRangeRebalanceFieldInfo, upperRangeRebalanceFieldInfo, resetLowerRangeRebalanceFieldInfo, resetUpperRangeRebalanceFieldInfo, ]; } exports.readExpanderRebalanceStateFromStrategy = readExpanderRebalanceStateFromStrategy; function readExpanderRebalanceFieldInfosFromStrategy(price, rebalanceRaw) { const params = readExpanderRebalanceParamsFromStrategy(rebalanceRaw); let paramsBuffer = Buffer.from(rebalanceRaw.params); let lowerRangeBps = new decimal_js_1.default(paramsBuffer.readUInt16LE(0)); let upperRangeBps = new decimal_js_1.default(paramsBuffer.readUInt16LE(2)); let lowerResetRatioBps = new decimal_js_1.default(paramsBuffer.readUInt16LE(4)); let upperResetRatioBps = new decimal_js_1.default(paramsBuffer.readUInt16LE(6)); let expansionBps = new decimal_js_1.default(paramsBuffer.readUInt16LE(8)); let maxNumberOfExpansions = new decimal_js_1.default(paramsBuffer.readUInt16LE(10)); let swapUnevenAllowed = new decimal_js_1.default(paramsBuffer.readUInt8(12)); return getExpanderRebalanceFieldInfos(price, lowerRangeBps, upperRangeBps, lowerResetRatioBps, upperResetRatioBps, expansionBps, maxNumberOfExpansions, swapUnevenAllowed); } exports.readExpanderRebalanceFieldInfosFromStrategy = readExpanderRebalanceFieldInfosFromStrategy; function deserializeExpanderRebalanceWithStateOverride(dex, tokenADecimals, tokenBDecimals, price, rebalanceRaw) { const stateFields = readExpanderRebalanceStateFromStrategy(dex, tokenADecimals, tokenBDecimals, rebalanceRaw); let fields = readExpanderRebalanceFieldInfosFromStrategy(price, rebalanceRaw); return (0, utils_2.upsertManyRebalanceFieldInfos)(fields, stateFields); } exports.deserializeExpanderRebalanceWithStateOverride = deserializeExpanderRebalanceWithStateOverride; //# sourceMappingURL=expanderRebalance.js.map