UNPKG

@rsksmart/rsk-cli

Version:

CLI tool for Rootstock network using Viem

138 lines (137 loc) • 5.7 kB
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, }; } }