rubic-sdk
Version:
Simplify dApp creation
166 lines • 9.01 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SquidrouterCrossChainProvider = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
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_id_1 = require("../../../../../core/blockchain/utils/blockchains-info/constants/blockchain-id");
const web3_pure_1 = require("../../../../../core/blockchain/web3-pure/web3-pure");
const squidrouter_api_service_1 = require("../../../../common/providers/squidrouter/services/squidrouter-api-service");
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 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");
const squidrouter_cross_chain_supported_blockchain_1 = require("./constants/squidrouter-cross-chain-supported-blockchain");
const squidrouter_cross_chain_trade_1 = require("./squidrouter-cross-chain-trade");
class SquidrouterCrossChainProvider extends cross_chain_provider_1.CrossChainProvider {
constructor() {
super(...arguments);
this.nativeAddress = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee';
this.type = cross_chain_trade_type_1.CROSS_CHAIN_TRADE_TYPE.SQUIDROUTER;
}
isSupportedBlockchain(blockchain) {
return squidrouter_cross_chain_supported_blockchain_1.squidrouterCrossChainSupportedBlockchains.some(supportedBlockchain => supportedBlockchain === blockchain);
}
async calculate(from, toToken, options) {
const fromBlockchain = from.blockchain;
const toBlockchain = toToken.blockchain;
const useProxy = options?.useProxy?.[this.type] ?? true;
if (!this.areSupportedBlockchains(fromBlockchain, toBlockchain)) {
return {
trade: null,
error: new errors_1.NotSupportedTokensError(),
tradeType: this.type
};
}
try {
const feeInfo = await this.getFeeInfo(fromBlockchain, options.providerAddress, from, useProxy);
const fromWithoutFee = (0, get_from_without_fee_1.getFromWithoutFee)(from, feeInfo.rubicProxy?.platformFee?.percent);
const fakeAddress = '0xe388Ed184958062a2ea29B7fD049ca21244AE02e';
const fromAddress = options?.fromAddress || fakeAddress;
const receiver = options?.receiverAddress || fromAddress;
const requestParams = {
fromAddress,
fromChain: blockchain_id_1.blockchainId[fromBlockchain].toString(),
fromToken: from.isNative ? this.nativeAddress : from.address,
fromAmount: fromWithoutFee.stringWeiAmount,
toChain: blockchain_id_1.blockchainId[toBlockchain].toString(),
toToken: toToken.isNative ? this.nativeAddress : toToken.address,
toAddress: receiver,
slippage: Number(options.slippageTolerance * 100)
};
const { route: { transactionRequest, estimate } } = await squidrouter_api_service_1.SquidRouterApiService.getRoute(requestParams);
const squidGasData = {
gasLimit: new bignumber_js_1.default(transactionRequest.gasLimit).plus(useProxy ? 120000 : 0),
gasPrice: new bignumber_js_1.default(transactionRequest.gasPrice),
maxFeePerGas: new bignumber_js_1.default(transactionRequest.maxFeePerGas),
maxPriorityFeePerGas: new bignumber_js_1.default(transactionRequest.maxPriorityFeePerGas)
};
const to = new tokens_1.PriceTokenAmount({
...toToken.asStruct,
tokenAmount: web3_pure_1.Web3Pure.fromWei(estimate.toAmount, toToken.decimals)
});
const feeAmount = estimate.feeCosts
.filter(fee => (0, blockchain_1.compareAddresses)(this.nativeAddress, fee.token.address))
.reduce((acc, fee) => acc.plus(fee.amount), new bignumber_js_1.default(0));
const nativeToken = native_tokens_1.nativeTokensList[fromBlockchain];
const cryptoFeeToken = await tokens_1.PriceTokenAmount.createFromToken({
...nativeToken,
weiAmount: new bignumber_js_1.default(feeAmount)
});
return {
trade: new squidrouter_cross_chain_trade_1.SquidrouterCrossChainTrade({
from,
to,
gasData: squidGasData,
priceImpact: from.calculatePriceImpactPercent(to),
allowanceTarget: transactionRequest.target,
slippage: options.slippageTolerance,
feeInfo: {
...feeInfo,
provider: {
cryptoFee: {
amount: web3_pure_1.Web3Pure.fromWei(feeAmount, nativeToken.decimals),
token: cryptoFeeToken
}
}
},
cryptoFeeToken,
onChainTrade: null,
onChainSubtype: { from: undefined, to: undefined },
transactionRequest: requestParams
}, options.providerAddress, await this.getRoutePath(estimate, from, to), useProxy),
tradeType: this.type
};
}
catch (err) {
let rubicSdkError = cross_chain_provider_1.CrossChainProvider.parseError(err);
const httpError = err?.error?.errors?.[0];
if (httpError?.message) {
rubicSdkError = new errors_1.RubicSdkError(httpError.message);
}
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(_estimation, fromToken, to) {
// const routePath: RubicStep[] = [];
// for (const action of estimation.actions) {
// const fromTokenAddress =
// this.checkIsNativeToken(action.fromToken.address) ?
// EvmWeb3Pure.nativeTokenAddress : action.fromToken.address;
// const toTokenAddress = this.checkIsNativeToken(action.toToken.address) ?
// EvmWeb3Pure.nativeTokenAddress : action.toToken.address;
// if (action.fromChain === action.toChain) {
// const tokens = await Token.createTokens(
// [fromTokenAddress, toTokenAddress],
// BlockchainsInfo.getBlockchainNameById(action.fromChain)!
// )
// routePath.push({
// path: tokens,
// type: 'on-chain',
// provider: action.provider as OnChainTradeType
// })
// } else {
// const fromTransitToken = await PriceTokenAmount.createToken({
// address: fromTokenAddress,
// blockchain: BlockchainsInfo.getBlockchainNameById(action.fromToken.chainId)!,
// weiAmount: new BigNumber(action.fromAmount)
// });
// const toTransitToken = await PriceTokenAmount.createToken({
// address: toTokenAddress,
// blockchain: BlockchainsInfo.getBlockchainNameById(action.toToken.chainId)!,
// weiAmount: new BigNumber(action.toAmount)
// })
// routePath.push({
// path: [fromTransitToken, toTransitToken],
// type: 'cross-chain',
// provider: action.provider as CrossChainTradeType
// })
// }
// }
return [
{
path: [fromToken, to],
provider: cross_chain_trade_type_1.CROSS_CHAIN_TRADE_TYPE.SQUIDROUTER,
type: 'cross-chain'
}
];
}
checkIsNativeToken(address) {
return address.includes(this.nativeAddress);
}
}
exports.SquidrouterCrossChainProvider = SquidrouterCrossChainProvider;
//# sourceMappingURL=squidrouter-cross-chain-provider.js.map