@broxus/js-bridge-essentials
Version:
Bridge JavaScript Essentials library
168 lines (167 loc) • 7.86 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.EvmMultiVaultUtils = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const contracts_1 = require("../../models/evm-multi-vault/contracts");
class EvmMultiVaultUtils {
static deposit(connection, vaultAddress, params) {
const req = (0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.deposit({
amount: params.amount,
expected_evers: params.expectedEvers,
payload: params.payload,
recipient: params.recipient,
token: params.token,
});
return req.send();
}
static forceWithdraw(connection, vaultAddress, pendingWithdrawalIds) {
const req = (0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.forceWithdraw(pendingWithdrawalIds);
return req.send();
}
static bridge(connection, vaultAddress) {
return (0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.bridge().call();
}
/**
* Get EVM token meta in MultiVault by the given vault and EVM-like token addresses
* @param {Web3} connection
* @param {string} vaultAddress - vault address (eg. 0x00...0000)
* @param {string} tokenAddress - token address (eg. 0x00...0000)
*/
static tokens(connection, vaultAddress, tokenAddress) {
return (0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.tokens(tokenAddress).call();
}
/**
* Get EVM native token address in MultiVault by the given vault address and TVM-like token addresses
* @param {Web3} connection
* @param {string} vaultAddress - vault address (eg. 0x00...0000)
* @param {Address | string} tokenAddress - token address (eg. 0:00...0000)
*/
static getNativeToken(connection, vaultAddress, tokenAddress) {
const [wid, addr] = tokenAddress.toString().split(':');
return (0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.getNativeToken(wid, `0x${addr}`).call();
}
/**
* Get TVM native token address in MultiVault by the given vault address and EVM-like token address
* @param {Web3} connection
* @param {string} vaultAddress - vault address (eg. 0x00...0000)
* @param {string} tokenAddress - token address (eg. 0x00...0000)
*/
static async natives(connection, vaultAddress, tokenAddress) {
const result = await (0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.natives(tokenAddress).call();
return result !== undefined ? `${result.wid}:${(0, bignumber_js_1.default)(result.addr).toString(16).padStart(64, '0')}` : undefined;
}
static async getAlienFees(connection, vaultAddress) {
try {
const contract = (0, contracts_1.multiVaultContract)(connection, vaultAddress);
const batch = new contract.BatchRequest();
const abi = [
{
name: 'depositFee',
type: 'uint256',
},
{
name: 'withdrawFee',
type: 'uint256',
},
];
batch.add({
method: 'eth_call',
params: [{
data: contract.methods.defaultAlienDepositFee().encodeABI(),
to: vaultAddress,
}, 'latest'],
});
batch.add({
method: 'eth_call',
params: [{
data: contract.methods.defaultAlienWithdrawFee().encodeABI(),
to: vaultAddress,
}, 'latest'],
});
const res = await batch.execute({ timeout: 30_000 });
return res.reduce((acc, r, idx) => {
if (typeof r.result === 'string') {
const decoded = connection.eth.abi.decodeParameter(abi[idx].type, r.result);
acc[abi[idx].name] = BigInt(decoded).toString();
return acc;
}
throw new Error(`Failed to parse ${abi[idx].name} for token ${vaultAddress}. Given result is not a string`);
}, {});
}
catch {
const [depositFee, withdrawFee] = await Promise.all([
(0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.defaultAlienDepositFee().call(),
(0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.defaultAlienWithdrawFee().call(),
]);
return {
depositFee: BigInt(depositFee).toString(),
withdrawFee: BigInt(withdrawFee).toString(),
};
}
}
static async getNativeFees(connection, vaultAddress) {
try {
const contract = (0, contracts_1.multiVaultContract)(connection, vaultAddress);
const batch = new contract.BatchRequest();
const abi = [
{
name: 'depositFee',
type: 'uint256',
},
{
name: 'withdrawFee',
type: 'uint256',
},
];
batch.add({
method: 'eth_call',
params: [{
data: contract.methods.defaultAlienDepositFee().encodeABI(),
to: vaultAddress,
}, 'latest'],
});
batch.add({
method: 'eth_call',
params: [{
data: contract.methods.defaultAlienWithdrawFee().encodeABI(),
to: vaultAddress,
}, 'latest'],
});
const res = await batch.execute({ timeout: 30_000 });
return res.reduce((acc, r, idx) => {
if (typeof r.result === 'string') {
const decoded = connection.eth.abi.decodeParameter(abi[idx].type, r.result);
acc[abi[idx].name] = BigInt(decoded).toString();
return acc;
}
throw new Error(`Failed to parse ${abi[idx].name} for token ${vaultAddress}. Given result is not a string`);
}, {});
}
catch {
const [depositFee, withdrawFee] = await Promise.all([
(0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.defaultNativeDepositFee().call(),
(0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.defaultNativeWithdrawFee().call(),
]);
return {
depositFee: BigInt(depositFee).toString(),
withdrawFee: BigInt(withdrawFee).toString(),
};
}
}
static withdrawalLimits(connection, vaultAddress, tokenAddress) {
return (0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.withdrawalLimits(tokenAddress).call();
}
static withdrawalIds(connection, vaultAddress, withdrawalId) {
return (0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.withdrawalIds(withdrawalId).call();
}
static pendingWithdrawals(connection, vaultAddress, recipient, id) {
return (0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.pendingWithdrawals(recipient, id).call();
}
static pendingWithdrawalsPerUser(connection, vaultAddress, recipient) {
return (0, contracts_1.multiVaultContract)(connection, vaultAddress).methods.pendingWithdrawalsPerUser(recipient).call();
}
}
exports.EvmMultiVaultUtils = EvmMultiVaultUtils;