rubic-sdk
Version:
Simplify dApp creation
126 lines • 6.25 kB
JavaScript
"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