UNPKG

rubic-sdk

Version:
166 lines • 9.01 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SquidrouterCrossChainProvider = void 0; const bignumber_js_1 = __importDefault(require("bignumber.js")); const errors_1 = require("../../../../../common/errors"); const tokens_1 = require("../../../../../common/tokens"); const native_tokens_1 = require("../../../../../common/tokens/constants/native-tokens"); const blockchain_1 = require("../../../../../common/utils/blockchain"); const blockchain_id_1 = require("../../../../../core/blockchain/utils/blockchains-info/constants/blockchain-id"); const web3_pure_1 = require("../../../../../core/blockchain/web3-pure/web3-pure"); const squidrouter_api_service_1 = require("../../../../common/providers/squidrouter/services/squidrouter-api-service"); const get_from_without_fee_1 = require("../../../../common/utils/get-from-without-fee"); const cross_chain_trade_type_1 = require("../../models/cross-chain-trade-type"); const cross_chain_provider_1 = require("../common/cross-chain-provider"); const proxy_cross_chain_evm_trade_1 = require("../common/proxy-cross-chain-evm-facade/proxy-cross-chain-evm-trade"); const squidrouter_cross_chain_supported_blockchain_1 = require("./constants/squidrouter-cross-chain-supported-blockchain"); const squidrouter_cross_chain_trade_1 = require("./squidrouter-cross-chain-trade"); class SquidrouterCrossChainProvider extends cross_chain_provider_1.CrossChainProvider { constructor() { super(...arguments); this.nativeAddress = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'; this.type = cross_chain_trade_type_1.CROSS_CHAIN_TRADE_TYPE.SQUIDROUTER; } isSupportedBlockchain(blockchain) { return squidrouter_cross_chain_supported_blockchain_1.squidrouterCrossChainSupportedBlockchains.some(supportedBlockchain => supportedBlockchain === blockchain); } async calculate(from, toToken, options) { const fromBlockchain = from.blockchain; const toBlockchain = toToken.blockchain; const useProxy = options?.useProxy?.[this.type] ?? true; if (!this.areSupportedBlockchains(fromBlockchain, toBlockchain)) { return { trade: null, error: new errors_1.NotSupportedTokensError(), tradeType: this.type }; } try { const feeInfo = await this.getFeeInfo(fromBlockchain, options.providerAddress, from, useProxy); const fromWithoutFee = (0, get_from_without_fee_1.getFromWithoutFee)(from, feeInfo.rubicProxy?.platformFee?.percent); const fakeAddress = '0xe388Ed184958062a2ea29B7fD049ca21244AE02e'; const fromAddress = options?.fromAddress || fakeAddress; const receiver = options?.receiverAddress || fromAddress; const requestParams = { fromAddress, fromChain: blockchain_id_1.blockchainId[fromBlockchain].toString(), fromToken: from.isNative ? this.nativeAddress : from.address, fromAmount: fromWithoutFee.stringWeiAmount, toChain: blockchain_id_1.blockchainId[toBlockchain].toString(), toToken: toToken.isNative ? this.nativeAddress : toToken.address, toAddress: receiver, slippage: Number(options.slippageTolerance * 100) }; const { route: { transactionRequest, estimate } } = await squidrouter_api_service_1.SquidRouterApiService.getRoute(requestParams); const squidGasData = { gasLimit: new bignumber_js_1.default(transactionRequest.gasLimit).plus(useProxy ? 120000 : 0), gasPrice: new bignumber_js_1.default(transactionRequest.gasPrice), maxFeePerGas: new bignumber_js_1.default(transactionRequest.maxFeePerGas), maxPriorityFeePerGas: new bignumber_js_1.default(transactionRequest.maxPriorityFeePerGas) }; const to = new tokens_1.PriceTokenAmount({ ...toToken.asStruct, tokenAmount: web3_pure_1.Web3Pure.fromWei(estimate.toAmount, toToken.decimals) }); const feeAmount = estimate.feeCosts .filter(fee => (0, blockchain_1.compareAddresses)(this.nativeAddress, fee.token.address)) .reduce((acc, fee) => acc.plus(fee.amount), new bignumber_js_1.default(0)); const nativeToken = native_tokens_1.nativeTokensList[fromBlockchain]; const cryptoFeeToken = await tokens_1.PriceTokenAmount.createFromToken({ ...nativeToken, weiAmount: new bignumber_js_1.default(feeAmount) }); return { trade: new squidrouter_cross_chain_trade_1.SquidrouterCrossChainTrade({ from, to, gasData: squidGasData, priceImpact: from.calculatePriceImpactPercent(to), allowanceTarget: transactionRequest.target, slippage: options.slippageTolerance, feeInfo: { ...feeInfo, provider: { cryptoFee: { amount: web3_pure_1.Web3Pure.fromWei(feeAmount, nativeToken.decimals), token: cryptoFeeToken } } }, cryptoFeeToken, onChainTrade: null, onChainSubtype: { from: undefined, to: undefined }, transactionRequest: requestParams }, options.providerAddress, await this.getRoutePath(estimate, from, to), useProxy), tradeType: this.type }; } catch (err) { let rubicSdkError = cross_chain_provider_1.CrossChainProvider.parseError(err); const httpError = err?.error?.errors?.[0]; if (httpError?.message) { rubicSdkError = new errors_1.RubicSdkError(httpError.message); } return { trade: null, error: rubicSdkError, tradeType: this.type }; } } async getFeeInfo(fromBlockchain, providerAddress, percentFeeToken, useProxy) { return proxy_cross_chain_evm_trade_1.ProxyCrossChainEvmTrade.getFeeInfo(fromBlockchain, providerAddress, percentFeeToken, useProxy); } async getRoutePath(_estimation, fromToken, to) { // const routePath: RubicStep[] = []; // for (const action of estimation.actions) { // const fromTokenAddress = // this.checkIsNativeToken(action.fromToken.address) ? // EvmWeb3Pure.nativeTokenAddress : action.fromToken.address; // const toTokenAddress = this.checkIsNativeToken(action.toToken.address) ? // EvmWeb3Pure.nativeTokenAddress : action.toToken.address; // if (action.fromChain === action.toChain) { // const tokens = await Token.createTokens( // [fromTokenAddress, toTokenAddress], // BlockchainsInfo.getBlockchainNameById(action.fromChain)! // ) // routePath.push({ // path: tokens, // type: 'on-chain', // provider: action.provider as OnChainTradeType // }) // } else { // const fromTransitToken = await PriceTokenAmount.createToken({ // address: fromTokenAddress, // blockchain: BlockchainsInfo.getBlockchainNameById(action.fromToken.chainId)!, // weiAmount: new BigNumber(action.fromAmount) // }); // const toTransitToken = await PriceTokenAmount.createToken({ // address: toTokenAddress, // blockchain: BlockchainsInfo.getBlockchainNameById(action.toToken.chainId)!, // weiAmount: new BigNumber(action.toAmount) // }) // routePath.push({ // path: [fromTransitToken, toTransitToken], // type: 'cross-chain', // provider: action.provider as CrossChainTradeType // }) // } // } return [ { path: [fromToken, to], provider: cross_chain_trade_type_1.CROSS_CHAIN_TRADE_TYPE.SQUIDROUTER, type: 'cross-chain' } ]; } checkIsNativeToken(address) { return address.includes(this.nativeAddress); } } exports.SquidrouterCrossChainProvider = SquidrouterCrossChainProvider; //# sourceMappingURL=squidrouter-cross-chain-provider.js.map