@prism-hq/prism-ag
Version:
Prism Aggregator
46 lines (45 loc) • 2.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.penguinRoute = void 0;
const spl_token_swap_1 = require("@solana/spl-token-swap");
const web3_js_1 = require("@solana/web3.js");
function penguinRoute(fromCoin, toCoin, fromCoinAmount, option, liquidityData, settings) {
let penguinInfo = liquidityData.penguinData[option.swapAccount];
let beforeX = penguinInfo.aTokenAmount;
let beforeY = penguinInfo.bTokenAmount;
let fromToken = penguinInfo.tokenA;
let toToken = penguinInfo.tokenB;
if (fromCoin.mintAddress != new web3_js_1.PublicKey(penguinInfo.mintA).toBase58()) {
[beforeX, beforeY] = [beforeY, beforeX];
[fromToken, toToken] = [toToken, fromToken];
}
let num = spl_token_swap_1.Numberu64.fromBuffer(penguinInfo.tradeFeeNumerator).toNumber();
let den = spl_token_swap_1.Numberu64.fromBuffer(penguinInfo.tradeFeeDenominator).toNumber();
let afterX = beforeX + fromCoinAmount * (den - num) / den * 10 ** fromCoin.decimals;
let afterY = beforeX * beforeY / afterX;
let received = +((beforeY - afterY) / 10 ** toCoin.decimals).toFixed(toCoin.decimals);
let bestPrice = beforeY / beforeX;
let execPrice = (beforeY - afterY) / (afterX - beforeX);
let priceImpact = 100 * (Math.max(execPrice, bestPrice) - Math.min(execPrice, bestPrice)) / bestPrice;
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: "penguin",
fees: fees,
priceImpact: priceImpact,
routeData: {
penguinPool: Object.assign(Object.assign({}, penguinInfo), { fromToken: fromToken, toToken: toToken }),
fromCoin: fromCoin,
toCoin: toCoin,
}
};
}
exports.penguinRoute = penguinRoute;