UNPKG

rubic-sdk

Version:
111 lines 6.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ArchonBridgeProvider = void 0; 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_name_1 = require("../../../../../core/blockchain/models/blockchain-name"); const web3_pure_1 = require("../../../../../core/blockchain/web3-pure/web3-pure"); 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 archon_bridge_trade_1 = require("./archon-bridge-trade"); const archon_contract_service_1 = require("./archon-contract-service"); const archon_bridge_supported_blockchain_1 = require("./constants/archon-bridge-supported-blockchain"); const supported_tokens_1 = require("./constants/supported-tokens"); 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"); class ArchonBridgeProvider extends cross_chain_provider_1.CrossChainProvider { constructor() { super(...arguments); this.type = cross_chain_trade_type_1.CROSS_CHAIN_TRADE_TYPE.ARCHON_BRIDGE; } isSupportedBlockchain(blockchain) { return archon_bridge_supported_blockchain_1.archonBridgeSupportedBlockchains.some(supportedBlockchain => supportedBlockchain === blockchain); } areSupportedBlockchains(fromBlockchain, toBlockchain) { return (this.isSupportedBlockchain(fromBlockchain) && this.isSupportedBlockchain(toBlockchain) && (fromBlockchain === blockchain_name_1.BLOCKCHAIN_NAME.HORIZEN_EON || toBlockchain === blockchain_name_1.BLOCKCHAIN_NAME.HORIZEN_EON)); } async calculate(fromToken, toToken, options) { const fromBlockchain = fromToken.blockchain; const toBlockchain = toToken.blockchain; if (!this.areSupportedBlockchains(fromBlockchain, toBlockchain)) { return { trade: null, error: new errors_1.NotSupportedTokensError(), tradeType: this.type }; } if (this.checkUnsupportedTokens(fromToken, toToken)) { return { trade: null, error: new errors_1.NotSupportedTokensError(), tradeType: this.type }; } try { const useProxy = options?.useProxy?.[this.type] ?? true; const feeInfo = await this.getFeeInfo(fromBlockchain, options.providerAddress, fromToken, useProxy); const fromWithoutFee = (0, get_from_without_fee_1.getFromWithoutFee)(fromToken, feeInfo.rubicProxy?.platformFee?.percent); const nativeToken = await tokens_1.PriceToken.createFromToken(native_tokens_1.nativeTokensList[fromToken.blockchain]); const cryptoFee = await archon_contract_service_1.ArchonContractService.fetchLayerZeroFee(fromToken, toToken); feeInfo.provider = { cryptoFee: { amount: web3_pure_1.Web3Pure.fromWei(cryptoFee, nativeToken.decimals), token: nativeToken } }; const providerFeePercent = await archon_contract_service_1.ArchonContractService.fetchDepositFeeBps(fromToken, toToken); const toAmount = fromWithoutFee.tokenAmount.multipliedBy(1 - providerFeePercent); const to = new tokens_1.PriceTokenAmount({ ...toToken.asStruct, tokenAmount: toAmount }); return { trade: new archon_bridge_trade_1.ArchonBridgeTrade({ from: fromToken, to, gasData: await this.getGasData(fromToken), feeInfo }, options.providerAddress, await this.getRoutePath(fromToken, to), useProxy), tradeType: this.type }; } catch (err) { const rubicSdkError = cross_chain_provider_1.CrossChainProvider.parseError(err); 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(fromToken, toToken) { return [{ type: 'cross-chain', provider: this.type, path: [fromToken, toToken] }]; } checkUnsupportedTokens(fromToken, toToken) { const fromBlockchain = fromToken.blockchain; const toBlockchain = toToken.blockchain; const [eonToken, nonEonBlockchain, nonEonToken] = fromBlockchain === blockchain_name_1.BLOCKCHAIN_NAME.HORIZEN_EON ? [fromToken, toBlockchain, toToken] : [toToken, fromBlockchain, fromToken]; const eonTokenAddress = Object.values(supported_tokens_1.supportedEonTokens).find(el => (0, blockchain_1.compareAddresses)(el, eonToken.address)); if (!eonTokenAddress) { return true; } const fromNetworkAddresses = nonEonBlockchain === blockchain_name_1.BLOCKCHAIN_NAME.ETHEREUM ? supported_tokens_1.eonEthTokensMapping : supported_tokens_1.eonAvalancheTokensMapping; const nonEonAddresses = fromNetworkAddresses[eonTokenAddress]; const allowSwap = nonEonAddresses.some(address => (0, blockchain_1.compareAddresses)(address, nonEonToken.address)); return !allowSwap; } } exports.ArchonBridgeProvider = ArchonBridgeProvider; //# sourceMappingURL=archon-bridge-provider.js.map