UNPKG

@prism-hq/prism-ag

Version:

Prism Aggregator

125 lines (124 loc) 5.83 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.proportional = exports.sharesFromValue = exports.valueFromShares = exports.totalCoolingDown = exports.totalLamportsUnderControl = exports.totalVirtualStakedLamports = exports.calcLamportsFromMsolAmount = exports.calcMsolFromLamports = exports.linearFee = exports.getUnstakeQuote = exports.getDepositQuote = exports.marinadeRoute = void 0; const bn_js_1 = __importDefault(require("bn.js")); const marinade_1 = require("../liquidity/infos/marinade"); function marinadeRoute(fromCoin, toCoin, fromCoinAmount, option, liquidityData, settings) { let marinadeInfo = liquidityData.marinadeData["marinade"]; let received = 0; if (fromCoin.mintAddress == marinade_1.SOL_MINT) { if (fromCoinAmount < 0.003) return null; received = getDepositQuote(marinadeInfo.state, new bn_js_1.default(fromCoinAmount * 10 ** fromCoin.decimals), marinadeInfo.liqPoolMsolLegAmount).toNumber() / 10 ** toCoin.decimals; } else received = getUnstakeQuote(marinadeInfo.state, new bn_js_1.default(fromCoinAmount * 10 ** fromCoin.decimals), new bn_js_1.default(marinadeInfo.liqPoolSolLegPdaAmount)).toNumber() / 10 ** toCoin.decimals; received = +received.toFixed(toCoin.decimals); let totalFees = (settings.owner.fee + settings.host.fee) / 100; let fees = {}; fees[toCoin.symbol] = received * totalFees / 100; let amountWithFees = received * (1 - totalFees / 100); return { from: fromCoin.symbol, amountIn: fromCoinAmount, to: toCoin.symbol, amountOut: received, amountWithFees: amountWithFees, minimumReceived: amountWithFees * (1 - settings.slippage / 100), provider: "marinade", fees: fees, priceImpact: 0, routeData: { marinadePool: Object.assign({}, marinadeInfo), fromCoin: fromCoin, toCoin: toCoin, } }; } exports.marinadeRoute = marinadeRoute; function getDepositQuote(state, amount, liqPoolMsolLegAmount) { let userLamports = amount; let userMsolBuyOrder = calcMsolFromLamports(state, userLamports); let swapMsolMax = bn_js_1.default.min(userMsolBuyOrder, liqPoolMsolLegAmount); let outAmount = new bn_js_1.default(0); if (swapMsolMax.gt(new bn_js_1.default(0))) { let lamportsForTheLiqPool = new bn_js_1.default(0); if (userMsolBuyOrder.eq(swapMsolMax)) { lamportsForTheLiqPool = userLamports; } else { lamportsForTheLiqPool = calcLamportsFromMsolAmount(state, swapMsolMax); } outAmount = outAmount.add(swapMsolMax); userLamports = userLamports.sub(lamportsForTheLiqPool); } if (userLamports.gt(new bn_js_1.default(0))) { let msolToMint = calcMsolFromLamports(state, userLamports); outAmount = outAmount.add(msolToMint); } return outAmount; } exports.getDepositQuote = getDepositQuote; function getUnstakeQuote(state, amount, liqPoolSolLegPdaAmount) { let maxLamports = liqPoolSolLegPdaAmount.sub(state.rentExemptForTokenAcc); let userRemoveLamports = calcLamportsFromMsolAmount(state, amount); let liquidUnstakeFee = new bn_js_1.default(0); if (userRemoveLamports.gt(maxLamports)) { liquidUnstakeFee = state.liqPool.lpMaxFee; } else { let afterLamports = maxLamports.sub(userRemoveLamports); liquidUnstakeFee = linearFee(state, afterLamports); } let fee = amount.mul(liquidUnstakeFee).div(new bn_js_1.default(10000)); return calcLamportsFromMsolAmount(state, amount.sub(fee)); } exports.getUnstakeQuote = getUnstakeQuote; function linearFee(state, lamports) { if (lamports.gt(state.liqPool.lpLiquidityTarget)) { return new bn_js_1.default(state.liqPool.lpMinFee.basisPoints); } else { return state.liqPool.lpMaxFee.basisPoints.sub(proportional(state.liqPool.lpMaxFee.basisPoints.sub(state.liqPool.lpMinFee.basisPoints), lamports, state.liqPool.lpLiquidityTarget)); } } exports.linearFee = linearFee; function calcMsolFromLamports(state, stakeLamports) { return sharesFromValue(stakeLamports, totalVirtualStakedLamports(state), state.msolSupply); } exports.calcMsolFromLamports = calcMsolFromLamports; function calcLamportsFromMsolAmount(state, msolAmount) { return valueFromShares(msolAmount, totalVirtualStakedLamports(state), state.msolSupply); } exports.calcLamportsFromMsolAmount = calcLamportsFromMsolAmount; function totalVirtualStakedLamports(state) { return totalLamportsUnderControl(state).sub(state.circulatingTicketBalance); } exports.totalVirtualStakedLamports = totalVirtualStakedLamports; function totalLamportsUnderControl(state) { return state.validatorSystem.totalActiveBalance.add(totalCoolingDown(state)).add(state.availableReserveBalance); } exports.totalLamportsUnderControl = totalLamportsUnderControl; function totalCoolingDown(state) { return state.stakeSystem.delayedUnstakeCoolingDown.add(state.emergencyCoolingDown); } exports.totalCoolingDown = totalCoolingDown; function valueFromShares(shares, totalValue, totalShares) { return proportional(shares, totalValue, totalShares); } exports.valueFromShares = valueFromShares; function sharesFromValue(value, totalValue, totalShares) { if (totalValue.toNumber() == 0) return value; return proportional(value, totalShares, totalValue); } exports.sharesFromValue = sharesFromValue; function proportional(amount, numerator, denominator) { if (denominator.toNumber() == 0) return amount; return amount.mul(numerator).div(denominator); } exports.proportional = proportional;