UNPKG

barterjs-sdk

Version:
105 lines (104 loc) 5.56 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getTokenCandidates = exports.getTargetTokenAddress = exports.getTargetToken = exports.getVaultBalance = exports.getBridgeFee = void 0; const constants_1 = require("../../constants"); const TokenRegister_1 = require("../../libs/TokenRegister"); const ethers_1 = require("ethers"); const tokenUtil_1 = require("../../utils/tokenUtil"); const supported_tokens_1 = require("../../constants/supported_tokens"); const utils_1 = require("../../utils"); const VaultToken_1 = require("../../libs/VaultToken"); /** * get fee for bridging srcToken to targetChain * @param srcToken * @param targetChain * @param amount * @param rpcProvider use default rpcProvider when not specified */ async function getBridgeFee(srcToken, targetChain, amount, rpcProvider) { const chainId = rpcProvider.chainId.toString(); const mapChainId = rpcProvider.chainId.toString(); const mapProvider = new ethers_1.ethers.providers.JsonRpcProvider(rpcProvider.url ? rpcProvider.url : (0, constants_1.ID_TO_DEFAULT_PROVIDER)(mapChainId)); let totalFeeBySrcToken; const tokenRegister = new TokenRegister_1.TokenRegister(constants_1.TOKEN_REGISTER_ADDRESS_SET[chainId], mapProvider); const toMapFeeAmount = await tokenRegister.getTokenFee((0, utils_1.getHexAddress)(srcToken.address, srcToken.chainId, true), amount, rpcProvider.chainId.toString()); totalFeeBySrcToken = toMapFeeAmount; if (!(0, constants_1.IS_MAP)(targetChain)) { const mapTokenAddress = await tokenRegister.getRelayChainToken(srcToken.chainId.toString(), srcToken); const adjustedAmount = await tokenRegister.getRelayChainAmount(srcToken, srcToken.chainId.toString(), ethers_1.BigNumber.from(amount).sub(ethers_1.BigNumber.from(toMapFeeAmount)).toString()); const feeAmount = await tokenRegister.getTokenFee(mapTokenAddress, adjustedAmount, targetChain.toString()); totalFeeBySrcToken = ethers_1.BigNumber.from(totalFeeBySrcToken) .add(ethers_1.BigNumber.from(feeAmount)) .toString(); } return Promise.resolve({ feeToken: srcToken, amount: totalFeeBySrcToken.toString(), }); } exports.getBridgeFee = getBridgeFee; /** * get vault balance * @param fromChainId * @param fromToken * @param toChainId * @param rpcProvider */ async function getVaultBalance(fromChainId, fromToken, toChainId, rpcProvider) { if (fromChainId != fromToken.chainId) { throw new Error("Request Error: chainId and token.chainId doesn't match"); } const mapChainId = rpcProvider.chainId.toString(); const provider = new ethers_1.ethers.providers.JsonRpcProvider(rpcProvider.url ? rpcProvider.url : (0, constants_1.ID_TO_DEFAULT_PROVIDER)(mapChainId)); const tokenRegister = new TokenRegister_1.TokenRegister(constants_1.TOKEN_REGISTER_ADDRESS_SET[mapChainId], provider); const mapTokenAddress = (0, constants_1.IS_MAP)(fromChainId) ? fromToken.address : await tokenRegister.getRelayChainToken(fromChainId.toString(), fromToken); const vaultAddress = await tokenRegister.getVaultToken(mapTokenAddress); const vaultToken = new VaultToken_1.VaultToken(vaultAddress, provider); const tokenBalance = await vaultToken.getVaultBalance(toChainId.toString()); let toChainTokenAddress = mapTokenAddress; if (!(0, constants_1.IS_MAP)(toChainId)) { toChainTokenAddress = await tokenRegister.getToChainToken(mapTokenAddress, toChainId); if (toChainTokenAddress === '0x') { throw new Error('Internal Error: Cannot find corresponding target token on target chain'); } } return Promise.resolve({ token: (0, tokenUtil_1.getTokenByAddressAndChainId)(toChainTokenAddress, toChainId), balance: tokenBalance.toString(), }); } exports.getVaultBalance = getVaultBalance; async function getTargetToken(srcToken, targetChainId, rpcProvider) { const tokenAddress = await getTargetTokenAddress(srcToken, targetChainId, rpcProvider); if (tokenAddress === '0x') { throw new Error('token does not exist'); } return (0, tokenUtil_1.getTokenByAddressAndChainId)(tokenAddress, targetChainId); } exports.getTargetToken = getTargetToken; async function getTargetTokenAddress(srcToken, targetChainId, rpcProvider) { const mapChainId = rpcProvider.chainId.toString(); const provider = new ethers_1.ethers.providers.JsonRpcProvider(rpcProvider.url ? rpcProvider.url : (0, constants_1.ID_TO_DEFAULT_PROVIDER)(mapChainId)); const tokenRegister = new TokenRegister_1.TokenRegister(constants_1.TOKEN_REGISTER_ADDRESS_SET[mapChainId], provider); const mapTokenAddress = await tokenRegister.getRelayChainToken(srcToken.chainId.toString(), srcToken); let targetTokenAddress = mapTokenAddress; if (!(0, constants_1.IS_MAP)(targetChainId)) { targetTokenAddress = await tokenRegister.getToChainToken(mapTokenAddress, targetChainId); } return targetTokenAddress; } exports.getTargetTokenAddress = getTargetTokenAddress; async function getTokenCandidates(fromChainId, toChainId, provider) { let ret = []; const fromChainTokenList = (0, supported_tokens_1.ID_TO_SUPPORTED_TOKEN)(fromChainId); for (let i = 0; i < fromChainTokenList.length; i++) { const token = fromChainTokenList[i]; if ((await getTargetTokenAddress(token, toChainId, provider)) != '0x') { ret.push(token); } } return ret; } exports.getTokenCandidates = getTokenCandidates;