UNPKG

@xyrusworx/web3-cli

Version:

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

142 lines (98 loc) 8.85 kB
# XyrusWorx Web3 Utility CLI This CLI tool offers options to interact with EVM-based blockchains. ## Installing Use the following command with Node 16+ installed: ```bash npm install -g @xyrusworx/web3-cli ``` ## Usage The program is called using `web3`. Each call is structured the following way: ``` web3 [global options] <command name> [command options] ``` There are two kinds of options: those for the CLI itself (global options), and those for a specific command. The key difference is that those for the CLI come directly after the `web3` program, the ones for the command follow the command name. The global options are generally available for all commands and control overall program behavior. ### Supported commands | Command | Description | |------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `call` | Executes `eth_call` using given call data to a given contract address. | | `simulate` | Sends a simulated transaction to a given contract address. The transaction is executed on an ephemeral fork of the chain, so no real transaction is sent. This also enables sending transactions as any address. | | `replay` | Similar to `simulate`, except that the parameters of the transaction including the block are derived from a given transaction hash, allowing to replay a past (real) transaction and obtain diagnostic information. | | `encode` | Encodes a list of parameters using a given function signature, to obtain valid calldata, usable in `call` and `simulate`. The output of this command can be piped to the aforementioned commands, if the `-q ` option was passed. | | `decode` | Decodes arbitrary hex data using a comma-separated list of Solidity data types (such as `uint256`, `address`, ...). If `call` was invoked with the `-q` option, its output can be piped to this command, which needs to receive the `-i` option. | | `dump` | Fetches the contents of the contract storage at a given address (and optionally a slot index) and writes it to the console and/or a binary output file. If no slot index is given, the contract storage is scanned until a completely empty slot is encountered. | | `layout` | Compiles a standard Solidity input JSON file or Solidity source code and extracts a structured description of the contract variable storage layout. The structured output is provided as JSON and can be sent to a file or the standard output. The input JSON can be provided as a parameter or be piped to the command using the `-i` option. | | `read` | Offers an easy way to read the state of a smart contract, either from a dump file (created with the `dump` command) or directly from the blockchain. It is required to provide a storage layout file (created using the `layout` command). The layout can also be piped into this command. | > Hint: in several commands, standard Solidity input JSON is processed. You can generate this from [Hardhat](https://hardhat.org) > using the [@xyrusworx/hardhat-solidity-json](https://github.com/xyrusworx/hardhat-solidity-json) package. ### Global options | Option | Shortcut(s) | Description | |-------------|-------------|---------------------------------------------------------------------------------------------------------------------------| | `--help` | `-h`, `-?` | Shows the help screen | | `--nologo` | None | Suppresses the output of the program name and version. <br/>This is automatically applied with the `-q` / `--quiet` flag. | | `--quiet` | `-q` | Suppresses all output except essential data. <br/>This is useful for piping. | | `--verbose` | `-v` | Adds more diagnostic output to the execution. <br/>This is mutually exclusive with `--quiet`. | ### Command options To see the respective command options, run `web3 <command> -h`. ## Examples ### Example 1: Encode the call data for a token transfer ```bash # WETH TOKEN=0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 ADDRESS=0x752031bb91c61bfc0b280e36434e67e0d43fadbc # Send 1 token (1,000,000,000,000,000,000 with 18 decimals) web3 encode "transfer(address,uint256)" $ADDRESS 1000000000000000000 ``` The resulting calldata (`0x...`) can be attached to a transaction using a wallet. ### Example 2: Simulate a token transfer at a given block For the values of `ADDRESS` and `TOKEN`, see the above example. ```bash # Special environment variable, which is picked up by the web3 command export WEB3_ACCOUNT=0x55b11bb935685f3ea5ea6385410bd1f5aef57ce6 web3 -q encode "transfer(address,uint256)" $ADDRESS 1000000000000000000 | \ web3 simulate -b 16320406 -i $TOKEN ``` Using the `-q` flag, you can instruct `web3` to only output data relevant for further processing. Please note that it must be placed between `web3` and the respective command (`encode`), unlike the `-i` flag, which is owned by the command, hence must be placed after it. The latter flag instructs `simulate` to use `STDIN` instead of an argument for the calldata. Using the `-b` flag, you can instruct `simulate` to use a specific block, instead of the latest. ### Example 3: Get the balance of a token holder For the values of `ADDRESS` and `TOKEN`, see the above example. ```bash web3 -q encode "balanceOf(address)" $ADDRESS | \ web3 -q call -i $TOKEN | \ web3 decode -i uint256 ``` You can pipe the output of `call` to `decode` to extract readable / processable results instead of a raw hex string. The last parameter is a comma-separated list of data types, which are passed to the decoder. This is arbitrary, meaning you can decode any hex data interpreting them as any Solidity type. ### Example 4: Dump the contract storage of a smart contract into a binary file For the value of `ADDRESS`, see the above example. ```bash web3 -q dump --start 0 --count 20 -i $ADDRESS -o storage.bin ``` This will fetch 20 slots starting from slot #0 from the provided smart contract address and store it into `storage.bin`. The data is padded to 32 bytes due to the way EVM storages work. ### Example 5: Create a storage layout map and use it to decode a storage dump For the value of `ADDRESS`, see the above example. ```bash cat "contract.sol" | \ web3 -q layout -i | \ web3 read -i --dump storage.bin $ADDRESS ``` The smart contract source code in `contract.sol` will be used to create a storage layout map, which is a JSON file. This is piped into the `read` command, which then uses the binary storage dump in `storage.bin` to decode the smart contract data. > **WARNING**: The dump is assumed to start with slot #0. If you created a dump with a different starting slot > index, the decoding will lead to unexpected and most certainly wrong results. You can pass the `--offline` parameter, to prevent the program from fetching missing slots from the blockchain. ## How to build Just run: ```bash npm install npm run pack ``` This will create a `dist/` folder with the deployable package. It can be released with `cd dist/ && npm publish`