@xspswap/smart-order-router
Version:
XSwap Protocol V3 Smart Order Router
105 lines • 9.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.V2QuoteProvider = void 0;
const bignumber_1 = require("@ethersproject/bignumber");
const sdk_core_1 = require("@x-swap-protocol/sdk-core");
const v2_sdk_1 = require("@x-swap-protocol/v2-sdk");
const amounts_1 = require("../../util/amounts");
const log_1 = require("../../util/log");
const routes_1 = require("../../util/routes");
const utils_1 = require("ethers/lib/utils");
/**
* Computes quotes for V2 off-chain. Quotes are computed using the balances
* of the pools within each route provided.
*
* @export
* @class V2QuoteProvider
*/
class V2QuoteProvider {
/* eslint-disable @typescript-eslint/no-empty-function */
constructor() { }
/* eslint-enable @typescript-eslint/no-empty-function */
async getQuotesManyExactIn(amountIns, routes) {
return this.getQuotes(amountIns, routes, sdk_core_1.TradeType.EXACT_INPUT);
}
async getQuotesManyExactOut(amountOuts, routes) {
return this.getQuotes(amountOuts, routes, sdk_core_1.TradeType.EXACT_OUTPUT);
}
async getQuotes(amounts, routes, tradeType) {
const routesWithQuotes = [];
const debugStrs = [];
for (const route of routes) {
const amountQuotes = [];
let insufficientInputAmountErrorCount = 0;
let insufficientReservesErrorCount = 0;
for (const amount of amounts) {
try {
if (tradeType == sdk_core_1.TradeType.EXACT_INPUT) {
let outputAmount = amount.wrapped;
for (const pair of route.pairs) {
// const [outputAmountNew, pr] = pair.getOutputAmount(outputAmount);
const inputReserve = pair.reserveOf(outputAmount.currency);
const outputReserve = pair.reserveOf(outputAmount.currency.equals(pair.token0)
? pair.token1
: pair.token0);
const inputAmountWithFee = (0, utils_1.parseEther)(outputAmount.quotient.toString()).mul(997);
const numerator = inputAmountWithFee.mul(outputReserve.quotient.toString());
const denominator = (0, utils_1.parseEther)(inputReserve.quotient.toString())
.mul(1000)
.add(inputAmountWithFee);
const outputAmountNew = amounts_1.CurrencyAmount.fromRawAmount(outputAmount.currency.equals(pair.token0)
? pair.token1
: pair.token0, numerator.div(denominator).toString());
outputAmount = outputAmountNew;
}
amountQuotes.push({
amount,
quote: bignumber_1.BigNumber.from(outputAmount.quotient.toString()),
});
}
else {
let inputAmount = amount.wrapped;
for (let i = route.pairs.length - 1; i >= 0; i--) {
const pair = route.pairs[i];
[inputAmount] = pair.getInputAmount(inputAmount);
}
amountQuotes.push({
amount,
quote: bignumber_1.BigNumber.from(inputAmount.quotient.toString()),
});
}
}
catch (err) {
// Can fail to get quotes, e.g. throws InsufficientReservesError or InsufficientInputAmountError.
if (err instanceof v2_sdk_1.InsufficientInputAmountError) {
insufficientInputAmountErrorCount =
insufficientInputAmountErrorCount + 1;
amountQuotes.push({ amount, quote: null });
}
else if (err instanceof v2_sdk_1.InsufficientReservesError) {
insufficientReservesErrorCount = insufficientReservesErrorCount + 1;
amountQuotes.push({ amount, quote: null });
}
else {
throw err;
}
}
}
if (insufficientInputAmountErrorCount > 0 ||
insufficientReservesErrorCount > 0) {
debugStrs.push(`${[
(0, routes_1.routeToString)(route),
]} Input: ${insufficientInputAmountErrorCount} Reserves: ${insufficientReservesErrorCount} }`);
}
routesWithQuotes.push([route, amountQuotes]);
}
if (debugStrs.length > 0) {
log_1.log.info({ debugStrs }, `Failed quotes for V2 routes`);
}
return {
routesWithQuotes,
};
}
}
exports.V2QuoteProvider = V2QuoteProvider;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGUtcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3YyL3F1b3RlLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHdEQUFxRDtBQUNyRCx3REFBc0Q7QUFDdEQsb0RBR2lDO0FBR2pDLGdEQUFvRDtBQUNwRCx3Q0FBcUM7QUFDckMsOENBQWtEO0FBRWxELDRDQUE4QztBQXNCOUM7Ozs7OztHQU1HO0FBQ0gsTUFBYSxlQUFlO0lBQzFCLHlEQUF5RDtJQUN6RCxnQkFBZSxDQUFDO0lBQ2hCLHdEQUF3RDtJQUVqRCxLQUFLLENBQUMsb0JBQW9CLENBQy9CLFNBQTJCLEVBQzNCLE1BQWlCO1FBRWpCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLG9CQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxxQkFBcUIsQ0FDaEMsVUFBNEIsRUFDNUIsTUFBaUI7UUFFakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsb0JBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVMsQ0FDckIsT0FBeUIsRUFDekIsTUFBaUIsRUFDakIsU0FBb0I7UUFFcEIsTUFBTSxnQkFBZ0IsR0FBd0IsRUFBRSxDQUFDO1FBRWpELE1BQU0sU0FBUyxHQUFhLEVBQUUsQ0FBQztRQUMvQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtZQUMxQixNQUFNLFlBQVksR0FBb0IsRUFBRSxDQUFDO1lBRXpDLElBQUksaUNBQWlDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLElBQUksOEJBQThCLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO2dCQUM1QixJQUFJO29CQUNGLElBQUksU0FBUyxJQUFJ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