UNPKG

rubic-sdk

Version:
126 lines 6.25 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.OpenOceanTrade = void 0; const bignumber_js_1 = __importDefault(require("bignumber.js")); const errors_1 = require("../../../../../common/errors"); const tokens_1 = require("../../../../../common/tokens"); const price_token_amount_1 = require("../../../../../common/tokens/price-token-amount"); const errors_2 = require("../../../../../common/utils/errors"); const blockchain_name_1 = require("../../../../../core/blockchain/models/blockchain-name"); const chain_type_1 = require("../../../../../core/blockchain/models/chain-type"); const evm_web3_pure_1 = require("../../../../../core/blockchain/web3-pure/typed-web3-pure/evm-web3-pure/evm-web3-pure"); const web3_pure_1 = require("../../../../../core/blockchain/web3-pure/web3-pure"); const injector_1 = require("../../../../../core/injector/injector"); const check_unsupported_receiver_address_1 = require("../../../../common/utils/check-unsupported-receiver-address"); const on_chain_trade_type_1 = require("../common/models/on-chain-trade-type"); const on_chain_proxy_contract_1 = require("../common/on-chain-proxy-service/constants/on-chain-proxy-contract"); const evm_on_chain_trade_1 = require("../common/on-chain-trade/evm-on-chain-trade/evm-on-chain-trade"); const get_open_ocean_api_url_1 = require("./constants/get-open-ocean-api-url"); const open_ocean_blockchain_1 = require("./constants/open-ocean-blockchain"); class OpenOceanTrade extends evm_on_chain_trade_1.EvmOnChainTrade { /** @internal */ static async getGasLimit(openOceanTradeStruct) { const fromBlockchain = openOceanTradeStruct.from.blockchain; const walletAddress = injector_1.Injector.web3PrivateService.getWeb3PrivateByBlockchain(fromBlockchain).address; if (!walletAddress) { return null; } const openOceanTrade = new OpenOceanTrade(openOceanTradeStruct, evm_web3_pure_1.EvmWeb3Pure.EMPTY_ADDRESS); try { const transactionConfig = await openOceanTrade.encode({ fromAddress: walletAddress }); const web3Public = injector_1.Injector.web3PublicService.getWeb3Public(fromBlockchain); const gasLimit = (await web3Public.batchEstimatedGas(walletAddress, [transactionConfig]))[0]; if (gasLimit?.isFinite()) { return gasLimit; } } catch { } try { const transactionData = await openOceanTrade.getTransactionData(); if (transactionData.gasLimit) { return new bignumber_js_1.default(transactionData.gasLimit); } } catch { } return null; } get spenderAddress() { const openOceanContractAddress = this.from.blockchain === blockchain_name_1.BLOCKCHAIN_NAME.OKE_X_CHAIN ? '0xc0006Be82337585481044a7d11941c0828FFD2D4' : '0x6352a56caadC4F1E25CD6c75970Fa768A3304e64'; return this.useProxy ? on_chain_proxy_contract_1.onChainProxyContractAddress[this.from.blockchain] : openOceanContractAddress; } get dexContractAddress() { throw new errors_1.RubicSdkError('Dex address is unknown before swap is started'); } get toTokenAmountMin() { return this._toTokenAmountMin; } constructor(tradeStruct, providerAddress) { super(tradeStruct, providerAddress); this.type = on_chain_trade_type_1.ON_CHAIN_TRADE_TYPE.OPEN_OCEAN; this._toTokenAmountMin = new price_token_amount_1.PriceTokenAmount({ ...this.to.asStruct, weiAmount: tradeStruct.toTokenWeiAmountMin }); } async encodeDirect(options) { await this.checkFromAddress(options.fromAddress, true); (0, check_unsupported_receiver_address_1.checkUnsupportedReceiverAddress)(options?.receiverAddress, this.walletAddress); try { const transactionData = await this.getTransactionData(); const { gas, gasPrice } = this.getGasParams(options, { gasLimit: transactionData.gasLimit, gasPrice: transactionData.gasPrice }); return { to: transactionData.to, data: transactionData.data, value: this.fromWithoutFee.isNative ? this.fromWithoutFee.stringWeiAmount : '0', gas, gasPrice }; } catch (err) { if ([400, 500, 503].includes(err.code)) { throw new errors_1.SwapRequestError(); } if (this.isDeflationError()) { throw new errors_1.LowSlippageDeflationaryTokenError(); } throw (0, errors_2.parseError)(err); } } async getTransactionData() { const gasPrice = await injector_1.Injector.web3PublicService .getWeb3Public(this.from.blockchain) .getGasPrice(); const walletAddress = injector_1.Injector.web3PrivateService.getWeb3Private(chain_type_1.CHAIN_TYPE.EVM).address; const apiUrl = get_open_ocean_api_url_1.openOceanApiUrl.swapQuote(open_ocean_blockchain_1.openOceanBlockchainName[this.from.blockchain]); const swapQuoteResponse = await injector_1.Injector.httpClient.get(apiUrl, { params: { chain: open_ocean_blockchain_1.openOceanBlockchainName[this.from.blockchain], inTokenAddress: this.from.address, outTokenAddress: this.to.address, amount: this.from.tokenAmount.toString(), gasPrice: web3_pure_1.Web3Pure.fromWei(gasPrice, tokens_1.nativeTokensList[this.from.blockchain].decimals) .multipliedBy(10 ** 9) .toFixed(0), slippage: this.slippageTolerance * 100, account: walletAddress } }); const { data, to } = swapQuoteResponse.data; return { data, to }; } } exports.OpenOceanTrade = OpenOceanTrade; //# sourceMappingURL=open-ocean-trade.js.map