UNPKG

rubic-sdk-next

Version:
158 lines 7.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EvmCrossChainTrade = void 0; const errors_1 = require("../../../../../../common/errors"); const blockchain_name_1 = require("../../../../../../core/blockchain/models/blockchain-name"); const blockchains_info_1 = require("../../../../../../core/blockchain/utils/blockchains-info/blockchains-info"); 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 injector_1 = require("../../../../../../core/injector/injector"); const cross_chain_trade_1 = require("../cross-chain-trade"); const transfer_trade_supported_providers_1 = require("../cross-chain-transfer-trade/constans/transfer-trade-supported-providers"); class EvmCrossChainTrade extends cross_chain_trade_1.CrossChainTrade { constructor() { super(...arguments); /** * Signature to auth wallet */ this.signature = ''; } get fromWeb3Public() { return injector_1.Injector.web3PublicService.getWeb3Public(this.from.blockchain); } get web3Private() { return injector_1.Injector.web3PrivateService.getWeb3PrivateByBlockchain(this.from.blockchain); } get gasLimitRatio() { if (this.to.blockchain === blockchain_name_1.BLOCKCHAIN_NAME.ZETACHAIN || this.from.blockchain === blockchain_name_1.BLOCKCHAIN_NAME.ZETACHAIN) { return 1.5; } return 1.05; } /** * Gets gas fee in source blockchain. */ get estimatedGas() { if (!this.gasData) { return null; } if (this.gasData.baseFee && this.gasData.maxPriorityFeePerGas) { return web3_pure_1.Web3Pure.fromWei(this.gasData.baseFee).plus(web3_pure_1.Web3Pure.fromWei(this.gasData.maxPriorityFeePerGas)); } if (this.gasData.gasPrice) { return web3_pure_1.Web3Pure.fromWei(this.gasData.gasPrice).multipliedBy(this.gasData.gasLimit ?? 0); } return null; } /** * Returns true, if allowance is not enough. */ async needApprove() { this.checkWalletConnected(); if (this.from.isNative && this.from.blockchain !== blockchain_name_1.BLOCKCHAIN_NAME.METIS) { return false; } const isTransferTrade = transfer_trade_supported_providers_1.transferTradeSupportedProviders.some(transferTradeType => transferTradeType === this.type); if ((!this.useProxy && isTransferTrade) || !this.contractSpender) return false; const fromTokenAddress = this.from.isNative && this.from.blockchain === blockchain_name_1.BLOCKCHAIN_NAME.METIS ? '0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000' : this.from.address; const allowance = await this.fromWeb3Public.getAllowance(fromTokenAddress, this.walletAddress, this.contractSpender); return this.from.weiAmount.gt(allowance); } async approve(options, checkNeedApprove = true, amount = 'infinity') { if (checkNeedApprove) { const needApprove = await this.needApprove(); if (!needApprove) { throw new errors_1.UnnecessaryApproveError(); } } this.checkWalletConnected(); await this.checkBlockchainCorrect(); const approveAmount = this.from.blockchain === blockchain_name_1.BLOCKCHAIN_NAME.GNOSIS || this.from.blockchain === blockchain_name_1.BLOCKCHAIN_NAME.CRONOS ? this.from.weiAmount : amount; const fromTokenAddress = this.from.isNative && this.from.blockchain === blockchain_name_1.BLOCKCHAIN_NAME.METIS ? '0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000' : this.from.address; return this.web3Private.approveTokens(fromTokenAddress, this.contractSpender, approveAmount, this.from.blockchain, options); } async authWallet() { if (this.needAuthWallet) { const res = await injector_1.Injector.rubicApiService.getMessageToAuthWallet(this.walletAddress); const signature = await this.web3Private.signMessage(res.messageToAuth); this.signature = signature; return signature; } throw new errors_1.RubicSdkError('No need to auth wallet'); } /** * * @returns txHash(srcTxHash) | never */ async swap(options = {}) { if (!options?.testMode) { await this.checkTradeErrors(); } await this.checkReceiverAddress(options.receiverAddress, !blockchains_info_1.BlockchainsInfo.isEvmBlockchainName(this.to.blockchain)); const method = options?.testMode ? 'sendTransaction' : 'trySendTransaction'; const fromAddress = this.walletAddress; const { data, value, to } = await this.encode({ ...options, fromAddress }); const { onConfirm, gasPriceOptions } = options; let transactionHash; const onTransactionHash = (hash) => { if (onConfirm) { onConfirm(hash); } transactionHash = hash; }; try { await this.web3Private[method](to, { data, value, onTransactionHash, gasPriceOptions, gasLimitRatio: this.gasLimitRatio, ...(options?.useEip155 && { chainId: `0x${blockchain_id_1.blockchainId[this.from.blockchain].toString(16)}` }) }); return transactionHash; } catch (err) { if (err instanceof errors_1.FailedToCheckForTransactionReceiptError) { return transactionHash; } throw err; } } async encode(options) { await this.checkFromAddress(options.fromAddress, true); await this.checkReceiverAddress(options.receiverAddress, !blockchains_info_1.BlockchainsInfo.isEvmBlockchainName(this.to.blockchain)); return this.setTransactionConfig(options?.skipAmountCheck || false, options?.useCacheData || false, options.testMode || false, options?.receiverAddress || this.walletAddress, options?.refundAddress); } async getTransactionConfigAndAmount(testMode, receiverAddress) { const swapRequestData = { ...this.apiQuote, fromAddress: this.walletAddress, receiver: receiverAddress, id: this.apiResponse.id, enableChecks: !testMode, ...(this.signature && { signature: this.signature }) }; const swapData = await this.fetchSwapData(swapRequestData); this._uniqueInfo = swapData.uniqueInfo ?? {}; const amount = swapData.estimate.destinationWeiAmount; const config = { data: swapData.transaction.data, value: swapData.transaction.value, to: swapData.transaction.to }; return { config, amount }; } } exports.EvmCrossChainTrade = EvmCrossChainTrade; //# sourceMappingURL=evm-cross-chain-trade.js.map