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