rubic-sdk
Version:
Simplify dApp creation
150 lines • 8.08 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RangoCrossChainProvider = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const tokens_1 = require("../../../../../common/tokens");
const native_tokens_1 = require("../../../../../common/tokens/constants/native-tokens");
const chain_type_1 = require("../../../../../core/blockchain/models/chain-type");
const blockchains_info_1 = require("../../../../../core/blockchain/utils/blockchains-info/blockchains-info");
const web3_pure_1 = require("../../../../../core/blockchain/web3-pure/web3-pure");
const fake_wallet_address_1 = require("../../../../common/constants/fake-wallet-address");
const rango_supported_blockchains_1 = require("../../../../common/providers/rango/models/rango-supported-blockchains");
const rango_parser_1 = require("../../../../common/providers/rango/services/rango-parser");
const rango_utils_1 = require("../../../../common/providers/rango/utils/rango-utils");
const get_from_without_fee_1 = require("../../../../common/utils/get-from-without-fee");
const rango_cross_chain_factory_1 = require("./rango-cross-chain-factory");
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 rango_cross_chain_api_service_1 = require("./services/rango-cross-chain-api-service");
class RangoCrossChainProvider extends cross_chain_provider_1.CrossChainProvider {
constructor() {
super(...arguments);
this.type = cross_chain_trade_type_1.CROSS_CHAIN_TRADE_TYPE.RANGO;
this.rangoSupportedBlockchains = rango_supported_blockchains_1.rangoSupportedBlockchains;
}
isSupportedBlockchain(blockchain) {
return this.rangoSupportedBlockchains.some(supportedBlockchain => supportedBlockchain === blockchain);
}
async calculate(from, toToken, options) {
const fromBlockchain = from.blockchain;
const useProxy = options?.useProxy?.[this.type] ?? true;
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 bestRouteParams = await rango_parser_1.RangoCommonParser.getBestRouteQueryParams(fromWithoutFee, toToken, { ...options, swapperGroups: options.rangoDisabledProviders });
const { route } = await rango_cross_chain_api_service_1.RangoCrossChainApiService.getBestRoute(bestRouteParams);
const { outputAmountMin, outputAmount, path, fee } = route;
const toTokenAmountMin = web3_pure_1.Web3Pure.fromWei(outputAmountMin, toToken.decimals);
const to = new tokens_1.PriceTokenAmount({
...toToken.asStruct,
tokenAmount: web3_pure_1.Web3Pure.fromWei(outputAmount, toToken.decimals)
});
const routePath = await this.getRoutePath(from, to, path);
const swapQueryParams = await rango_parser_1.RangoCommonParser.getSwapQueryParams(fromWithoutFee, toToken, { ...options, swapperGroups: options.rangoDisabledProviders });
const cryptoFee = await this.getCryptoFee(fee, fromBlockchain);
if (cryptoFee?.amount.gt(0)) {
feeInfo.provider = {
cryptoFee
};
}
const bridgeSubtype = routePath.find(el => el.type === 'cross-chain')?.provider;
const priceImpact = from.calculatePriceImpactPercent(to);
const tradeParams = {
crossChainTrade: {
from,
to,
feeInfo,
toTokenAmountMin,
priceImpact,
swapQueryParams,
slippage: options.slippageTolerance,
bridgeSubtype,
gasData: await this.getGasData(from)
},
routePath,
providerAddress: options.providerAddress,
useProxy
};
const trade = rango_cross_chain_factory_1.RangoCrossChainFactory.createTrade(fromBlockchain, tradeParams);
const tradeType = this.type;
return { trade, tradeType };
}
catch (err) {
const rubicSdkError = cross_chain_provider_1.CrossChainProvider.parseError(err);
return {
trade: null,
error: rubicSdkError,
tradeType: this.type
};
}
}
async getRoutePath(fromToken, toToken, path) {
if (!path) {
return [{ type: 'cross-chain', provider: this.type, path: [fromToken, toToken] }];
}
return Promise.all(path.map(path => this.getStep(path)));
}
async getStep(rangoPath) {
const type = rangoPath.swapperType === 'DEX' ? 'on-chain' : 'cross-chain';
const provider = rango_utils_1.RangoUtils.getTradeTypeForRubic(rangoPath.swapper.swapperGroup, type);
const fromBlockchain = rango_utils_1.RangoUtils.getRubicBlockchainByRangoBlockchain(rangoPath.from.blockchain);
const toBlockchain = rango_utils_1.RangoUtils.getRubicBlockchainByRangoBlockchain(rangoPath.to.blockchain);
const fromTokenAmount = await tokens_1.TokenAmount.createToken({
address: rangoPath.from.address || native_tokens_1.nativeTokensList[fromBlockchain].address,
blockchain: fromBlockchain,
weiAmount: new bignumber_js_1.default(rangoPath.inputAmount)
});
const toTokenAmount = await tokens_1.TokenAmount.createToken({
address: rangoPath.to.address || native_tokens_1.nativeTokensList[toBlockchain].address,
blockchain: toBlockchain,
weiAmount: new bignumber_js_1.default(rangoPath.expectedOutput)
});
return {
provider: provider,
type: type,
path: [fromTokenAmount, toTokenAmount]
};
}
async getFeeInfo(fromBlockchain, providerAddress, percentFeeToken, useProxy) {
return proxy_cross_chain_evm_trade_1.ProxyCrossChainEvmTrade.getFeeInfo(fromBlockchain, providerAddress, percentFeeToken, useProxy);
}
async getCryptoFee(fee, fromBlockchain) {
const nativeToken = native_tokens_1.nativeTokensList[fromBlockchain];
if (!fee) {
return {
amount: new bignumber_js_1.default(0),
token: await tokens_1.PriceTokenAmount.createFromToken({
...nativeToken,
weiAmount: new bignumber_js_1.default(0)
})
};
}
const feeAmount = fee
.filter(fee => fee.expenseType === 'FROM_SOURCE_WALLET')
.reduce((acc, fee) => acc.plus(fee.amount), new bignumber_js_1.default(0));
const cryptoFeeToken = await tokens_1.PriceTokenAmount.createFromToken({
...nativeToken,
weiAmount: new bignumber_js_1.default(feeAmount)
});
return {
amount: web3_pure_1.Web3Pure.fromWei(feeAmount, nativeToken.decimals),
token: cryptoFeeToken
};
}
getReceiverAddress(blockchain) {
const type = blockchains_info_1.BlockchainsInfo.getChainType(blockchain);
if (type === chain_type_1.CHAIN_TYPE.EVM) {
return fake_wallet_address_1.FAKE_WALLET_ADDRESS;
}
if (type === chain_type_1.CHAIN_TYPE.BITCOIN) {
return fake_wallet_address_1.FAKE_BITCOIN_ADDRESS;
}
throw new Error('Chain type not supported');
}
}
exports.RangoCrossChainProvider = RangoCrossChainProvider;
//# sourceMappingURL=rango-cross-chain-provider.js.map