UNPKG

rubic-sdk

Version:
158 lines • 7.44 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.OnChainManager = void 0; const errors_1 = require("../../../common/errors"); const tokens_1 = require("../../../common/tokens"); const options_1 = require("../../../common/utils/options"); const p_timeout_1 = __importDefault(require("../../../common/utils/p-timeout")); const blockchains_info_1 = require("../../../core/blockchain/utils/blockchains-info/blockchains-info"); const get_price_tokens_from_input_tokens_1 = require("../../common/utils/get-price-tokens-from-input-tokens"); const deflation_token_manager_1 = require("../../deflation-token-manager/deflation-token-manager"); const typed_trade_providers_1 = require("./constants/trade-providers/typed-trade-providers"); const on_chain_proxy_service_1 = require("./providers/common/on-chain-proxy-service/on-chain-proxy-service"); const on_chain_trade_1 = require("./providers/common/on-chain-trade/on-chain-trade"); const lifi_provider_1 = require("./providers/lifi/lifi-provider"); const open_ocean_provider_1 = require("./providers/open-ocean/open-ocean-provider"); /** * Contains methods to calculate on-chain trades. */ class OnChainManager { constructor(providerAddress) { this.providerAddress = providerAddress; /** * List of all on-chain trade providers, combined by blockchains. */ this.tradeProviders = typed_trade_providers_1.typedTradeProviders; this.lifiProvider = new lifi_provider_1.LifiProvider(); this.openOceanProvider = new open_ocean_provider_1.OpenOceanProvider(); this.deflationTokenManager = new deflation_token_manager_1.DeflationTokenManager(); } /** * Calculates on-chain trades, sorted by output amount. * * @example * ```ts * const blockchain = BLOCKCHAIN_NAME.ETHEREUM; * // ETH * const fromTokenAddress = '0x0000000000000000000000000000000000000000'; * const fromAmount = 1; * // USDT * const toTokenAddress = '0xdac17f958d2ee523a2206206994597c13d831ec7'; * * const trades = await sdk.onChainManager.calculateTrade( * { blockchain, address: fromTokenAddress }, * fromAmount, * toTokenAddress * ); * const bestTrade = trades[0]; * * trades.forEach(trade => { * if (trade instanceof OnChainTrade) { * console.log(trade.type, `to amount: ${trade.to.tokenAmount.toFormat(3)}`) * } * }) * ``` * * @param fromToken Token to sell. * @param fromAmount Amount to sell. * @param toToken Token to get. * @param options Additional options. * @returns List of calculated on-chain trades. */ async calculateTrade(fromToken, fromAmount, toToken, options) { if (toToken instanceof tokens_1.Token && fromToken.blockchain !== toToken.blockchain) { throw new errors_1.RubicSdkError('Blockchains of from and to tokens must be same'); } const { from, to } = await (0, get_price_tokens_from_input_tokens_1.getPriceTokensFromInputTokens)(fromToken, fromAmount.toString(), toToken); const fullOptions = await this.getFullOptions(from, to, options); return this.calculateTradeFromTokens(from, to, fullOptions); } async getFullOptions(from, to, options) { const chainType = blockchains_info_1.BlockchainsInfo.getChainType(from.blockchain); const [isDeflationFrom, isDeflationTo] = await Promise.all([ this.isDeflationToken(from), this.isDeflationToken(to) ]); let useProxy; if (options?.useProxy === false) { useProxy = options.useProxy; } else { useProxy = on_chain_proxy_service_1.OnChainProxyService.isSupportedBlockchain(from.blockchain) && (!isDeflationFrom.isDeflation || isDeflationFrom.isWhitelisted); } return (0, options_1.combineOptions)({ ...options, useProxy }, { timeout: OnChainManager.defaultCalculationTimeout, disabledProviders: [], providerAddress: this.providerAddress[chainType], useProxy, withDeflation: { from: isDeflationFrom, to: isDeflationTo } }); } async calculateTradeFromTokens(from, to, options) { const dexesProviders = Object.entries(this.tradeProviders[from.blockchain]).filter(([type]) => !options.disabledProviders.includes(type)); const dexesTradesPromise = this.calculateDexes(from, to, dexesProviders, options); const lifiTradesPromise = this.calculateLifiTrades(from, to, dexesProviders.map(dexProvider => dexProvider[0]), options); // const openOceanTradePromise = this.openOceanProvider.calculate( // from as PriceTokenAmount<EvmBlockchainName>, // to as PriceTokenAmount<EvmBlockchainName>, // options as RequiredOnChainCalculationOptions // ); const trades = (await Promise.all([dexesTradesPromise, lifiTradesPromise])).flat(); return trades.sort((tradeA, tradeB) => { if (tradeA instanceof on_chain_trade_1.OnChainTrade || tradeB instanceof on_chain_trade_1.OnChainTrade) { if (tradeA instanceof on_chain_trade_1.OnChainTrade && tradeB instanceof on_chain_trade_1.OnChainTrade) { return tradeA.to.tokenAmount.comparedTo(tradeB.to.tokenAmount); } return tradeA instanceof on_chain_trade_1.OnChainTrade ? 1 : -1; } return 0; }); } isDeflationToken(token) { return this.deflationTokenManager.isDeflationToken(token); } async calculateDexes(from, to, dexesProviders, options) { return Promise.all(dexesProviders.map(async ([type, provider]) => { try { return await (0, p_timeout_1.default)(provider.calculate(from, to, options), options.timeout); } catch (e) { console.debug(`[RUBIC_SDK] Trade calculation error occurred for ${type} trade provider.`, e); return { type, error: e }; } })); } async calculateLifiTrades(from, to, dexesProvidersTypes, options) { if (!blockchains_info_1.BlockchainsInfo.isEvmBlockchainName(from.blockchain)) { return []; } if (options.withDeflation.from.isDeflation) { console.debug('[RUBIC_SDK] Lifi does not work if source token is deflation.'); return []; } try { const disabledProviders = dexesProvidersTypes.concat(options.disabledProviders); const calculationOptions = { ...options, gasCalculation: options.gasCalculation === 'disabled' ? 'disabled' : 'calculate', disabledProviders }; return await this.lifiProvider.calculate(from, to, calculationOptions); } catch (err) { console.debug('[RUBIC_SDK] Trade calculation error occurred for lifi.', err); return []; } } } exports.OnChainManager = OnChainManager; OnChainManager.defaultCalculationTimeout = 10000; //# sourceMappingURL=on-chain-manager.js.map