rubic-sdk
Version:
Simplify dApp creation
138 lines • 7.26 kB
JavaScript
;
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