@xyrusworx/web3-cli
Version:
A command line tool which offers low-level EVM interaction for Web3 developers
110 lines • 4.8 kB
JavaScript
;
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