rubic-sdk
Version:
Simplify dApp creation
111 lines • 6.01 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ArchonBridgeProvider = void 0;
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_name_1 = require("../../../../../core/blockchain/models/blockchain-name");
const web3_pure_1 = require("../../../../../core/blockchain/web3-pure/web3-pure");
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 archon_bridge_trade_1 = require("./archon-bridge-trade");
const archon_contract_service_1 = require("./archon-contract-service");
const archon_bridge_supported_blockchain_1 = require("./constants/archon-bridge-supported-blockchain");
const supported_tokens_1 = require("./constants/supported-tokens");
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");
class ArchonBridgeProvider extends cross_chain_provider_1.CrossChainProvider {
constructor() {
super(...arguments);
this.type = cross_chain_trade_type_1.CROSS_CHAIN_TRADE_TYPE.ARCHON_BRIDGE;
}
isSupportedBlockchain(blockchain) {
return archon_bridge_supported_blockchain_1.archonBridgeSupportedBlockchains.some(supportedBlockchain => supportedBlockchain === blockchain);
}
areSupportedBlockchains(fromBlockchain, toBlockchain) {
return (this.isSupportedBlockchain(fromBlockchain) &&
this.isSupportedBlockchain(toBlockchain) &&
(fromBlockchain === blockchain_name_1.BLOCKCHAIN_NAME.HORIZEN_EON ||
toBlockchain === blockchain_name_1.BLOCKCHAIN_NAME.HORIZEN_EON));
}
async calculate(fromToken, toToken, options) {
const fromBlockchain = fromToken.blockchain;
const toBlockchain = toToken.blockchain;
if (!this.areSupportedBlockchains(fromBlockchain, toBlockchain)) {
return {
trade: null,
error: new errors_1.NotSupportedTokensError(),
tradeType: this.type
};
}
if (this.checkUnsupportedTokens(fromToken, toToken)) {
return {
trade: null,
error: new errors_1.NotSupportedTokensError(),
tradeType: this.type
};
}
try {
const useProxy = options?.useProxy?.[this.type] ?? true;
const feeInfo = await this.getFeeInfo(fromBlockchain, options.providerAddress, fromToken, useProxy);
const fromWithoutFee = (0, get_from_without_fee_1.getFromWithoutFee)(fromToken, feeInfo.rubicProxy?.platformFee?.percent);
const nativeToken = await tokens_1.PriceToken.createFromToken(native_tokens_1.nativeTokensList[fromToken.blockchain]);
const cryptoFee = await archon_contract_service_1.ArchonContractService.fetchLayerZeroFee(fromToken, toToken);
feeInfo.provider = {
cryptoFee: {
amount: web3_pure_1.Web3Pure.fromWei(cryptoFee, nativeToken.decimals),
token: nativeToken
}
};
const providerFeePercent = await archon_contract_service_1.ArchonContractService.fetchDepositFeeBps(fromToken, toToken);
const toAmount = fromWithoutFee.tokenAmount.multipliedBy(1 - providerFeePercent);
const to = new tokens_1.PriceTokenAmount({
...toToken.asStruct,
tokenAmount: toAmount
});
return {
trade: new archon_bridge_trade_1.ArchonBridgeTrade({
from: fromToken,
to,
gasData: await this.getGasData(fromToken),
feeInfo
}, options.providerAddress, await this.getRoutePath(fromToken, to), useProxy),
tradeType: this.type
};
}
catch (err) {
const rubicSdkError = cross_chain_provider_1.CrossChainProvider.parseError(err);
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(fromToken, toToken) {
return [{ type: 'cross-chain', provider: this.type, path: [fromToken, toToken] }];
}
checkUnsupportedTokens(fromToken, toToken) {
const fromBlockchain = fromToken.blockchain;
const toBlockchain = toToken.blockchain;
const [eonToken, nonEonBlockchain, nonEonToken] = fromBlockchain === blockchain_name_1.BLOCKCHAIN_NAME.HORIZEN_EON
? [fromToken, toBlockchain, toToken]
: [toToken, fromBlockchain, fromToken];
const eonTokenAddress = Object.values(supported_tokens_1.supportedEonTokens).find(el => (0, blockchain_1.compareAddresses)(el, eonToken.address));
if (!eonTokenAddress) {
return true;
}
const fromNetworkAddresses = nonEonBlockchain === blockchain_name_1.BLOCKCHAIN_NAME.ETHEREUM
? supported_tokens_1.eonEthTokensMapping
: supported_tokens_1.eonAvalancheTokensMapping;
const nonEonAddresses = fromNetworkAddresses[eonTokenAddress];
const allowSwap = nonEonAddresses.some(address => (0, blockchain_1.compareAddresses)(address, nonEonToken.address));
return !allowSwap;
}
}
exports.ArchonBridgeProvider = ArchonBridgeProvider;
//# sourceMappingURL=archon-bridge-provider.js.map