@rsksmart/rsk-cli
Version:
CLI tool for Rootstock network using Viem
138 lines (137 loc) ⢠5.7 kB
JavaScript
import ViemProvider from "../utils/viemProvider.js";
import chalk from "chalk";
import Table from "cli-table3";
import { MonitorManager } from "../utils/monitoring/MonitorManager.js";
import ora from "ora";
function logMessage(params, message, color = chalk.white) {
if (!params.isExternal) {
console.log(color(message));
}
}
function logError(params, message) {
logMessage(params, `ā ${message}`, chalk.red);
}
function logSuccess(params, message) {
logMessage(params, message, chalk.green);
}
function logInfo(params, message) {
logMessage(params, message, chalk.blue);
}
function logWarning(params, message) {
logMessage(params, message, chalk.yellow);
}
function startSpinner(params, spinner, message) {
if (!params.isExternal) {
spinner.start(message);
}
}
function stopSpinner(params, spinner) {
if (!params.isExternal) {
spinner.stop();
}
}
function succeedSpinner(params, spinner, message) {
if (!params.isExternal) {
spinner.succeed(message);
}
}
export async function txCommand(params) {
try {
const formattedTxId = params.txid.startsWith("0x") ? params.txid : `0x${params.txid}`;
const txidWithCorrectType = formattedTxId;
const provider = new ViemProvider(params.testnet);
const client = await provider.getPublicClient();
const txReceipt = await client.getTransactionReceipt({
hash: txidWithCorrectType,
});
if (!txReceipt) {
const network = params.testnet ? "testnet" : "mainnet";
const oppositeNetwork = params.testnet ? "mainnet" : "testnet";
const errorMessage = `Transaction not found on ${network}. Please check the transaction ID and network. Try with --testnet flag if the transaction is on ${oppositeNetwork}.`;
logError(params, errorMessage);
return {
error: errorMessage,
success: false,
};
}
const txData = {
txId: txidWithCorrectType,
blockHash: txReceipt.blockHash,
blockNumber: txReceipt.blockNumber.toString(),
gasUsed: txReceipt.gasUsed.toString(),
status: txReceipt.status ? "Success" : "Failed",
from: txReceipt.from,
to: txReceipt.to,
network: params.testnet ? "Rootstock Testnet" : "Rootstock Mainnet",
};
if (!params.isExternal) {
const table = new Table({
head: ["š", "Details"],
colWidths: [20, 68],
});
table.push({ "š Tx ID": txidWithCorrectType }, { "š Block Hash": txReceipt.blockHash }, { "š§± Block No.": txReceipt.blockNumber.toString() }, { "ā½ Gas Used": txReceipt.gasUsed.toString() }, { "ā
Status": txReceipt.status ? "Success" : "Failed" }, { "š¤ From": txReceipt.from }, { "š„ To": txReceipt.to });
console.log(table.toString());
}
if (params.monitor) {
return await handleTransactionMonitoring(params, txidWithCorrectType);
}
return {
success: true,
data: txData,
};
}
catch (error) {
const network = params.testnet ? "testnet" : "mainnet";
const oppositeNetwork = params.testnet ? "mainnet" : "testnet";
const errorMessage = `Error checking transaction status on ${network}. Please check the transaction ID and network. Try with --testnet flag if the transaction is on ${oppositeNetwork}.`;
logError(params, errorMessage);
return {
error: errorMessage,
success: false,
};
}
}
async function handleTransactionMonitoring(params, txHash) {
const spinner = params.isExternal ? ora({ isEnabled: false }) : ora();
try {
const confirmations = params.confirmations ?? 12;
logInfo(params, `š Starting transaction monitoring...`);
logMessage(params, `Network: ${params.testnet ? 'Testnet' : 'Mainnet'}`, chalk.gray);
logMessage(params, `Transaction: ${txHash}`, chalk.gray);
logMessage(params, `Required confirmations: ${confirmations}`, chalk.gray);
logMessage(params, '');
startSpinner(params, spinner, 'ā³ Initializing monitor...');
const monitorManager = new MonitorManager(params.testnet);
await monitorManager.initialize();
succeedSpinner(params, spinner, 'ā
Monitor initialized successfully');
startSpinner(params, spinner, 'ā³ Starting transaction monitoring...');
const sessionId = await monitorManager.startTransactionMonitoring(txHash, confirmations, params.testnet);
succeedSpinner(params, spinner, 'ā
Transaction monitoring started successfully');
logSuccess(params, `\nšÆ Monitoring started successfully!`);
logInfo(params, `Press Ctrl+C to stop monitoring`);
logMessage(params, '');
process.on('SIGINT', async () => {
logWarning(params, `\nā¹ļø Stopping monitoring...`);
await monitorManager.stopMonitoring(sessionId);
process.exit(0);
});
setInterval(() => { }, 1000);
return {
success: true,
data: {
txId: txHash,
network: params.testnet ? "Rootstock Testnet" : "Rootstock Mainnet",
monitoring: true,
sessionId: sessionId
},
};
}
catch (error) {
stopSpinner(params, spinner);
logError(params, `Error in monitoring: ${error.message || error}`);
return {
error: error.message || error,
success: false,
};
}
}