rubic-sdk
Version:
Simplify dApp creation
134 lines • 6.12 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TronWeb3Public = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const errors_1 = require("../../../../../common/errors");
const p_timeout_1 = __importDefault(require("../../../../../common/utils/p-timeout"));
const healthcheck_1 = require("../../../constants/healthcheck");
const blockchain_name_1 = require("../../../models/blockchain-name");
const tx_status_1 = require("../models/tx-status");
const trc_20_contract_abi_1 = require("./constants/trc-20-contract-abi");
const tron_multicall_abi_1 = require("./constants/tron-multicall-abi");
const web3_public_1 = require("../web3-public");
const tron_web3_pure_1 = require("../../../web3-pure/typed-web3-pure/tron-web3-pure/tron-web3-pure");
class TronWeb3Public extends web3_public_1.Web3Public {
constructor(tronWeb) {
super(blockchain_name_1.BLOCKCHAIN_NAME.TRON);
this.tronWeb = tronWeb;
this.tokenContractAbi = trc_20_contract_abi_1.TRC20_CONTRACT_ABI;
}
setProvider(provider) {
this.tronWeb.setProvider(provider);
}
async healthCheck(timeoutMs = 4000) {
if (!(0, healthcheck_1.isBlockchainHealthcheckAvailable)(this.blockchainName)) {
return true;
}
const healthcheckData = healthcheck_1.HEALTHCHECK[this.blockchainName];
this.tronWeb.setAddress(healthcheckData.contractAddress);
const contract = await this.tronWeb.contract(healthcheckData.contractAbi, healthcheckData.contractAddress);
try {
const result = await (0, p_timeout_1.default)(contract[healthcheckData.method]().call(), timeoutMs);
return result === healthcheckData.expected;
}
catch (e) {
if (e instanceof errors_1.TimeoutError) {
console.debug(`${this.blockchainName} node healthcheck timeout (${timeoutMs}ms) has occurred.`);
}
else {
console.debug(`${this.blockchainName} node healthcheck fail: ${e}`);
}
return false;
}
}
async getBalance(userAddress, tokenAddress) {
let balance;
if (tokenAddress && !tron_web3_pure_1.TronWeb3Pure.isNativeAddress(tokenAddress)) {
balance = await this.getTokenBalance(userAddress, tokenAddress);
}
else {
this.tronWeb.setAddress(userAddress);
balance = await this.tronWeb.trx.getBalance(userAddress);
}
return new bignumber_js_1.default(balance);
}
async getTokenBalance(userAddress, tokenAddress) {
this.tronWeb.setAddress(userAddress);
const contract = await this.tronWeb.contract(this.tokenContractAbi, tokenAddress);
const balance = await contract.balanceOf(userAddress).call();
return new bignumber_js_1.default(balance?.toString());
}
async getAllowance(tokenAddress, ownerAddress, spenderAddress) {
const contract = await this.tronWeb.contract(this.tokenContractAbi, tokenAddress);
const allowance = await contract
.allowance(ownerAddress, spenderAddress)
.call();
return new bignumber_js_1.default(allowance?.toString());
}
async multicallContractsMethods(contractAbi, contractsData) {
const calls = contractsData.map(({ contractAddress, methodsData }) => {
return methodsData.map(({ methodName, methodArguments }) => [
contractAddress,
tron_web3_pure_1.TronWeb3Pure.encodeFunctionCall(contractAbi, methodName, methodArguments)
]);
});
const outputs = await this.multicall(calls.flat());
let outputIndex = 0;
return contractsData.map(contractData => contractData.methodsData.map(methodData => {
const success = outputs.results[outputIndex];
const returnData = outputs.returnData[outputIndex];
outputIndex++;
const methodOutputAbi = contractAbi.find(funcSignature => funcSignature.name === methodData.methodName).outputs;
return {
success,
output: success
? tron_web3_pure_1.TronWeb3Pure.decodeMethodOutput(methodOutputAbi, returnData)
: null
};
}));
}
/**
* Executes multiple calls in the single contract call.
* @param calls Multicall calls data list.
* @returns Result of calls execution.
*/
async multicall(calls) {
this.tronWeb.setAddress(this.multicallAddress);
const contract = await this.tronWeb.contract(tron_multicall_abi_1.TRON_MULTICALL_ABI, this.multicallAddress);
return contract.aggregateViewCalls(calls).call();
}
async callContractMethod(contractAddress, contractAbi, methodName, methodArguments = []) {
this.tronWeb.setAddress(contractAddress);
const contract = await this.tronWeb.contract(contractAbi, contractAddress);
const response = await contract[methodName](...methodArguments).call();
return tron_web3_pure_1.TronWeb3Pure.flattenParameterToPrimitive(response);
}
/**
* Gets mined transaction info.
* @param hash Transaction hash.
*/
async getTransactionInfo(hash) {
return this.tronWeb.trx.getTransactionInfo(hash);
}
async getTransactionStatus(hash) {
const txReceipt = await this.getTransactionInfo(hash);
if (txReceipt?.receipt) {
if (txReceipt.result === 'FAILED') {
return tx_status_1.TxStatus.FAIL;
}
return tx_status_1.TxStatus.SUCCESS;
}
return tx_status_1.TxStatus.PENDING;
}
async getBlock() {
return this.tronWeb.trx.getCurrentBlock();
}
async getBlockNumber() {
return (await this.getBlock()).block_header.raw_data.number;
}
}
exports.TronWeb3Public = TronWeb3Public;
//# sourceMappingURL=tron-web3-public.js.map
;