barterjs-sdk
Version:
Barter Network SDK
105 lines (104 loc) • 5.56 kB
JavaScript
;
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;