UNPKG

rubic-sdk

Version:
138 lines • 7.26 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.LifiProvider = void 0; const bignumber_js_1 = __importDefault(require("bignumber.js")); const errors_1 = require("../../../../../../common/errors"); const tokens_1 = require("../../../../../../common/tokens"); const object_1 = require("../../../../../../common/utils/object"); const options_1 = require("../../../../../../common/utils/options"); const blockchain_name_1 = require("../../../../../../core/blockchain/models/blockchain-name"); const blockchains_info_1 = require("../../../../../../core/blockchain/utils/blockchains-info/blockchains-info"); const lifi_utils_service_1 = require("../../../../../common/providers/lifi/lifi-utils-service"); const get_from_without_fee_1 = require("../../../../../common/utils/get-from-without-fee"); const get_solana_fee_1 = require("../../../../../common/utils/get-solana-fee"); const lifi_providers_1 = require("./constants/lifi-providers"); const lifi_supported_blockchains_1 = require("./constants/lifi-supported-blockchains"); const evm_provider_default_options_1 = require("../../dexes/common/on-chain-provider/evm-on-chain-provider/constants/evm-provider-default-options"); const on_chain_trade_type_1 = require("../../common/models/on-chain-trade-type"); const aggregator_on_chain_provider_abstract_1 = require("../../common/on-chain-aggregator/aggregator-on-chain-provider-abstract"); const get_gas_fee_info_1 = require("../../common/utils/get-gas-fee-info"); const get_gas_price_info_1 = require("../../common/utils/get-gas-price-info"); const lifi_on_chain_factory_1 = require("./lifi-on-chain-factory"); const lifi_on_chain_api_service_1 = require("./services/lifi-on-chain-api-service"); class LifiProvider extends aggregator_on_chain_provider_abstract_1.AggregatorOnChainProvider { constructor() { super(...arguments); this.tradeType = on_chain_trade_type_1.ON_CHAIN_TRADE_TYPE.LIFI; this.defaultOptions = { ...evm_provider_default_options_1.evmProviderDefaultOptions, gasCalculation: 'calculate' }; } isSupportedBlockchain(blockchain) { return lifi_supported_blockchains_1.lifiOnChainSupportedBlockchains.some(chain => chain === blockchain); } async calculate(from, toToken, options) { if (options.withDeflation.from.isDeflation) { throw new errors_1.RubicSdkError('[RUBIC_SDK] Lifi does not work if source token is deflation.'); } const fromBlockchain = from.blockchain; const fullOptions = (0, options_1.combineOptions)(options, { ...this.defaultOptions, disabledProviders: [...options.disabledProviders, on_chain_trade_type_1.ON_CHAIN_TRADE_TYPE.DODO] }); const { fromWithoutFee: fromWithoutEvmFee, proxyFeeInfo } = await this.handleProxyContract(from, fullOptions); const feeSolanaPercent = (0, get_solana_fee_1.getSolanaFee)(from) * 100; const fromWithoutSolanaFee = (0, get_from_without_fee_1.getFromWithoutFee)(from, feeSolanaPercent); const fromWithoutFee = from.blockchain === blockchain_name_1.BLOCKCHAIN_NAME.SOLANA ? fromWithoutSolanaFee : fromWithoutEvmFee; const fromChainId = lifi_utils_service_1.LifiUtilsService.getLifiChainId(fromBlockchain); const toChainId = lifi_utils_service_1.LifiUtilsService.getLifiChainId(fromBlockchain); const fromTokenAddress = lifi_utils_service_1.LifiUtilsService.getLifiTokenAddress(from.blockchain, from.isNative, from.address); const toTokenAddress = lifi_utils_service_1.LifiUtilsService.getLifiTokenAddress(toToken.blockchain, toToken.isNative, toToken.address); const { disabledProviders } = fullOptions; const lifiDisabledProviders = Object.entries(lifi_providers_1.LIFI_API_ON_CHAIN_PROVIDERS) .filter(([_, tradeType]) => disabledProviders.includes(tradeType)) .map(([lifiProviderKey]) => lifiProviderKey) .concat(lifi_providers_1.LIFI_DISABLED_ON_CHAIN_PROVIDERS); const routeOptions = { order: 'RECOMMENDED', slippage: fullOptions.slippageTolerance, maxPriceImpact: 0.5, exchanges: { deny: lifiDisabledProviders }, integrator: 'rubic' }; const routesRequest = { fromChainId, fromAmount: fromWithoutFee.stringWeiAmount, fromTokenAddress, toChainId, toTokenAddress, options: routeOptions }; const result = await lifi_on_chain_api_service_1.LifiOnChainApiService.getRoutes(routesRequest); const { routes } = result; const allTrades = (await Promise.all(routes.map(async (route) => { const step = route.steps[0]; if (!step) return null; const to = new tokens_1.PriceTokenAmount({ ...toToken.asStruct, weiAmount: new bignumber_js_1.default(route.toAmount) }); const path = this.getRoutePath(from, to); const lifiTradeStruct = { from, to, gasFeeInfo: await this.getGasFeeInfo(from, step), slippageTolerance: fullOptions.slippageTolerance, type: this.tradeType, path, route, toTokenWeiAmountMin: new bignumber_js_1.default(route.toAmountMin), useProxy: fullOptions.useProxy, proxyFeeInfo, fromWithoutFee, withDeflation: fullOptions.withDeflation }; return lifi_on_chain_factory_1.LifiOnChainFactory.createTrade(fromBlockchain, lifiTradeStruct, fullOptions.providerAddress); }))).filter(object_1.notNull); const bestTrade = this.getBestTrade(allTrades); return bestTrade; } /** * @description Lifi-aggregator provides several providers at the same time, this method chooses the most profitable trade * @param trades all available lifiTrades * @returns best trade */ getBestTrade(trades) { const best = trades.sort((curr, prev) => prev.to.tokenAmount.comparedTo(curr.to.tokenAmount))[0]; return best; } async getGasFeeInfo(from, step) { if (!blockchains_info_1.BlockchainsInfo.isEvmBlockchainName(from.blockchain)) { return Promise.resolve(null); } const gasCosts = step.estimate.gasCosts; if (!gasCosts || !gasCosts.length) { return Promise.resolve(null); } let gasLimit = new bignumber_js_1.default(0); for (const el of gasCosts) { gasLimit = gasLimit.plus(el.limit); } try { const gasPriceInfo = await (0, get_gas_price_info_1.getGasPriceInfo)(from.blockchain); return (0, get_gas_fee_info_1.getGasFeeInfo)(gasPriceInfo, { gasLimit }); } catch { return null; } } } exports.LifiProvider = LifiProvider; //# sourceMappingURL=lifi-provider.js.map