UNPKG

@xyrusworx/web3-cli

Version:

A command line tool which offers low-level EVM interaction for Web3 developers

110 lines 4.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SimulatorCommand = exports.evmNetworkHelp = exports.evmSimulatorHelp = exports.parseSimulatorArguments = void 0; const tslib_1 = require("tslib"); const web3_1 = require("@xyrusworx/web3"); const chalk_1 = tslib_1.__importDefault(require("chalk")); const evm_simulator_1 = require("@xyrusworx/evm-simulator"); const fs_1 = tslib_1.__importDefault(require("fs")); function parseSimulatorArguments(output, args) { const console = output; let rpcUrl = process.env.WEB3_RPC || web3_1.EthereumNetworkDescription[web3_1.EthereumNetwork.Ethereum].rpc; let outputFile = undefined; for (let i = 0; i < args.length; i++) { const arg = args[i]; switch (arg) { case "-n": case "--network": const networkName = args[++i]; const networkDescription = Object.values(web3_1.EthereumNetworkDescription).find(x => x.id.toLowerCase() == networkName?.toLowerCase()); if (!networkDescription) { console.error("Unsupported network:", networkName, "- please specify the JSON-RPC URL manually using the -r / --rpc option."); return { exit: 1 }; } rpcUrl = networkDescription.rpc; break; case "-r": case "--rpc": rpcUrl = args[++i]; break; case "-o": case "--output": outputFile = args[++i]; break; } } if (!rpcUrl) { console.error("Invalid JSON-RPC endpoint URL. Please check the -r / --rpc option passed to the command line."); return { exit: 1 }; } return { model: { showHelp: false, rpcUrl: rpcUrl, outputFile: outputFile } }; } exports.parseSimulatorArguments = parseSimulatorArguments; function evmSimulatorHelp(output) { output.log(" --network / -n <name> Uses the given network. The default network is Ethereum mainnet."); output.log(" A list of supported networks is below. Use --rpc / -r for other networks."); output.log(" --rpc / -r <url> Sets the URL to the JSON-RPC endpoint. Must be an archive node."); output.log(" Can also be set using the environment variable WEB3_RPC"); output.log(" --output / -o <file> Writes a structured JSON output to the specified file."); } exports.evmSimulatorHelp = evmSimulatorHelp; function evmNetworkHelp(output) { output.log("Supported networks (for --network / -n):"); const sortNetwork = (a, b) => { const tna = (a.testnet ? 1 : 0); const tnb = (b.testnet ? 1 : 0); if (tna != tnb) return tna - tnb; return a.chainId - b.chainId; }; for (const network of Object.values(web3_1.EthereumNetworkDescription).sort(sortNetwork).filter(x => x.id != "ganache" && x.id != "hardhat")) { output.log(" ", chalk_1.default.magenta(network.id.padEnd(15)), network.name); } } exports.evmNetworkHelp = evmNetworkHelp; class SimulatorCommand { constructor(input, output) { this.input = input; this.output = output; } createSimulator() { const simulator = (0, evm_simulator_1.createSimulator)(); simulator.console = this.output; return simulator; } processResult(input, model, result) { if (input.quiet) { if (result.status && typeof result.result?.data === "string") process.stdout.write(`${result.result.data}\n`, "utf-8"); return result.status ? 0 : 100; } const console = this.output; if (result.status) { const logs = result.data?.logs || []; if (logs.length > 0) { console.log("Event log:"); } for (const event of logs.sort((a, b) => a.index - b.index)) { console.log(" Event", event.index + 1); console.log(" Topics: "); for (const topic of event.topics) console.log(" " + topic); console.log(" Address:", event.address); console.log(" Data: ", event.data); } } if (!!model.outputFile) { fs_1.default.writeFileSync(model.outputFile, JSON.stringify(result, null, " ")); console.log("Structured output written to:", model.outputFile); } return result.status ? 0 : 100; } } exports.SimulatorCommand = SimulatorCommand; //# sourceMappingURL=simulator.js.map