Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 47 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,71 +1,91 @@
# ethutil

An Ethereum util, can transfer eth, check balance, call any contract function etc

# Install

```shell
GO111MODULE=on go install github.com/10gic/ethutil@latest
```

# Usage Example

## Check Balance

Check balance of an address:

```shell
$ ethutil balance 0x79047aBf3af2a1061B108D71d6dc7BdB06474790
addr 0x79047aBf3af2a1061B108D71d6dc7BdB06474790, balance 231.905355677037965414 ether
```

## Transfer ETH

Transfer 1 ETH to 0xB2aC853cF815B47903bc19BF4860540306F4f944:

```shell
$ ethutil transfer 0xB2aC853cF815B47903bc19BF4860540306F4f944 1 --private-key 0xXXXX
ethutil transfer 0xB2aC853cF815B47903bc19BF4860540306F4f944 1 --private-key 0xXXXX
```

## Contract Interaction

Invokes the (paid) contract method:

```shell
$ ethutil --node mainnet --private-key 0xXXXX call 0xdac17f958d2ee523a2206206994597c13d831ec7 'transfer(address, uint256)' 0x8F36975cdeA2e6E64f85719788C8EFBBe89DFBbb 1000000
ethutil --node mainnet --private-key 0xXXXX call 0xdac17f958d2ee523a2206206994597c13d831ec7 'transfer(address, uint256)' 0x8F36975cdeA2e6E64f85719788C8EFBBe89DFBbb 1000000
```

Invokes the (paid) contract method with abi file:

```shell
$ ethutil --node mainnet --private-key 0xXXXX call 0xdac17f958d2ee523a2206206994597c13d831ec7 --abi-file path/to/abi transfer 0x8F36975cdeA2e6E64f85719788C8EFBBe89DFBbb 1000000
ethutil --node mainnet --private-key 0xXXXX call 0xdac17f958d2ee523a2206206994597c13d831ec7 --abi-file path/to/abi transfer 0x8F36975cdeA2e6E64f85719788C8EFBBe89DFBbb 1000000
```

Invokes the (constant) contract method:

```shell
$ ethutil --node mainnet query 0xdac17f958d2ee523a2206206994597c13d831ec7 'balanceOf(address) returns (uint256)' 0x703662e526d2b71944fbfb9d87f61de3e0f0f290
ret0 = 1100000000000
```

Invokes the (constant) contract method with abi file:

```shell
$ ethutil --node mainnet query 0xdac17f958d2ee523a2206206994597c13d831ec7 --abi-file path/to/abi balanceOf 0x703662e526d2b71944fbfb9d87f61de3e0f0f290
ethutil --node mainnet query 0xdac17f958d2ee523a2206206994597c13d831ec7 --abi-file path/to/abi balanceOf 0x703662e526d2b71944fbfb9d87f61de3e0f0f290
```

## Deploy Contract

Deploy a contract:

```shell
$ ethutil --private-key 0xXXXX deploy --bin-file Contract1_sol_Contract1.bin
ethutil --private-key 0xXXXX deploy --bin-file Contract1_sol_Contract1.bin
```

The binary file Contract1_sol_Contract1.bin can be generated by `solcjs`, for example:

```
$ solcjs --bin Contract1.sol # generate Contract1_sol_Contract1.bin
solcjs --bin Contract1.sol # generate Contract1_sol_Contract1.bin
```

## Deploy A ERC20 Token

Deploy A ERC20 Token (use default setting: totalSupply = "10000000000000000000000000", name = "A Simple ERC20", symbol = "TEST", decimals = 18)

```shell
$ ethutil deploy-erc20
ethutil deploy-erc20
```

## Drop Pending Tx

```shell
$ ethutil drop-tx --private-key 0xXXXX
ethutil drop-tx --private-key 0xXXXX
```

## Encode Param

An example:

```shell
$ ethutil encode-param 'transfer(address, uint256)' 0x8F36975cdeA2e6E64f85719788C8EFBBe89DFBbb 1000000
MethodID: 0xa9059cbb
Expand All @@ -75,6 +95,7 @@ encoded parameters (input data) = 0xa9059cbb0000000000000000000000008f36975cdea2
```

Another example:

```shell
$ ethutil encode-param 'swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline)' 12939945098273591402279 '[0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0x9Ed8e7C9604790F7Ec589F99b94361d8AAB64E5E]' 0x95206727FA3DD2FA32cd0BfE1fd40736B525CF11 1615952806
MethodID: 0x7ff36ab5
Expand All @@ -89,6 +110,7 @@ encoded parameters (input data) = 0x7ff36ab5000000000000000000000000000000000000
```

Only encode arguments (without function selector):

```shell
$ ethutil encode-param '(address, uint256)' 0x8F36975cdeA2e6E64f85719788C8EFBBe89DFBbb 1000000
[0]: 0x0000000000000000000000008f36975cdea2e6e64f85719788c8efbbe89dfbbb
Expand All @@ -97,6 +119,7 @@ encoded parameters (input data) = 0x0000000000000000000000008f36975cdea2e6e64f85
```

## Generate New Private Key

```shell
$ ethutil --terse gen-private-key -n 10
0x4a7a7070d616c70ca7caa5e34dfa944f983d530be4831e6e0086a781a679c601 0x356EC6F0b43bdEB18C291D5e629c1585c3c0BA73
Expand All @@ -112,13 +135,16 @@ $ ethutil --terse gen-private-key -n 10
```

## Dump Address From Private Key

```shell
$ ethutil dump-address --private-key-or-mnemonic 0xef065dcbc43081c63c0fbf389ec8df3872d9d61b1bc2e98d7a0a4395d11314d2
private key 0xef065dcbc43081c63c0fbf389ec8df3872d9d61b1bc2e98d7a0a4395d11314d2, addr 0xB2aC853cF815B47903bc19BF4860540306F4f944
```

## Compute Contract Address

Compute contract address before deployment:

```shell
$ ethutil compute-contract-addr 0x8F36975cdeA2e6E64f85719788C8EFBBe89DFBbb --nonce 0
deployer address 0x8F36975cdeA2e6E64f85719788C8EFBBe89DFBbb
Expand All @@ -127,6 +153,7 @@ contract address 0x3bb8C061Ec6EdB3E78777b983b96468CC4799888
```

Compute contract address (CREATE2) before deployment:

```shell
$ ethutil compute-contract-addr 0x0000000000000000000000000000000000000000 --salt 0x0000000000000000000000000000000000000000000000000000000000000000 --init-code 0x00
deployer address 0x0000000000000000000000000000000000000000
Expand All @@ -136,6 +163,7 @@ contract address 0x4D1A2e2bB4F88F0250f26Ffff098B0b30B26BF38
```

## Decode Raw Transaction

```shell
$ ethutil decode-tx 0xf86c808504e3b2920082520894428cf082d321d435ff0e1f8a994e01f976f19c118809b5552f5abade008026a00a27decf27241dca4e5d82bd5b7c1fbcc3f09c35a2a05cb967f2983d148ad6aba0596e9baa40ab157f5b1b0d66746472550ba9000d4154e3faa43ccce00b030452
basic info (eip155):
Expand All @@ -159,39 +187,46 @@ sender = 0xf7033D6010E8F2E12b810883e1c28CAcd6D25B16
```

## Get Contract Runtime Bytecode

```shell
$ ethutil --node mainnet code 0xd152f549545093347a162dce210e7293f1452150
runtime bytecode of contract 0xd152f549545093347a162dce210e7293f1452150 is 0x608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806351ba162c1461005c578063c73a2d60146100cf578063e63d38ed14610142575b600080fd5b34801561006857600080fd5b506100cd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390505050610188565b005b3480156100db57600080fd5b50610140600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390505050610309565b005b6101866004803603810190808035906020019082018035906020019190919293919293908035906020019082018035906020019190919293919293905050506105b0565b005b60008090505b84849050811015610301578573ffffffffffffffffffffffffffffffffffffffff166323b872dd3387878581811015156101c457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1686868681811015156101ef57fe5b905060200201356040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156102ae57600080fd5b505af11580156102c2573d6000803e3d6000fd5b505050506040513d60208110156102d857600080fd5b810190808051906020019092919050505015156102f457600080fd5b808060010191505061018e565b505050505050565b60008060009150600090505b8585905081101561034657838382818110151561032e57fe5b90506020020135820191508080600101915050610315565b8673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561041d57600080fd5b505af1158015610431573d6000803e3d6000fd5b505050506040513d602081101561044757600080fd5b8101908080519060200190929190505050151561046357600080fd5b600090505b858590508110156105a7578673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb878784818110151561049d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1686868581811015156104c857fe5b905060200201356040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561055457600080fd5b505af1158015610568573d6000803e3d6000fd5b505050506040513d602081101561057e57600080fd5b8101908080519060200190929190505050151561059a57600080fd5b8080600101915050610468565b50505050505050565b600080600091505b858590508210156106555785858381811015156105d157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc858585818110151561061557fe5b905060200201359081150290604051600060405180830381858888f19350505050158015610647573d6000803e3d6000fd5b5081806001019250506105b8565b3073ffffffffffffffffffffffffffffffffffffffff1631905060008111156106c0573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156106be573d6000803e3d6000fd5b505b5050505050505600a165627a7a72305820104eaf57909eb0d29f37ba9e3196e8e88438f83546136cf61270ca5d3b491e160029
```

## ERC20 Interaction

The subcommand `erc20` is a helper for subcommand `call/query`.

Example of check ERC20 balance:

```shell
$ ethutil --node mainnet erc20 0xdac17f958d2ee523a2206206994597c13d831ec7 balanceOf 0x703662e526d2b71944fbfb9d87f61de3e0f0f290
ethutil --node mainnet erc20 0xdac17f958d2ee523a2206206994597c13d831ec7 balanceOf 0x703662e526d2b71944fbfb9d87f61de3e0f0f290

```

Example of transfer ERC20:

```shell
$ ethutil --node mainnet --private-key 0xXXXX erc20 0xdac17f958d2ee523a2206206994597c13d831ec7 transfer 0x8F36975cdeA2e6E64f85719788C8EFBBe89DFBbb 1000000
ethutil --node mainnet --private-key 0xXXXX erc20 0xdac17f958d2ee523a2206206994597c13d831ec7 transfer 0x8F36975cdeA2e6E64f85719788C8EFBBe89DFBbb 1000000
```

## Compute keccak hash

```shell
$ echo -n "abc" | ethutil keccak -
4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 -
```

## Download source of verified contract

```shell
$ ethutil --node mainnet download-src 0xdac17f958d2ee523a2206206994597c13d831ec7 -d output
2021/12/12 21:25:44 Current network is mainnet
2021/12/12 21:25:45 saving output/TetherToken.sol
```

# Documentation

```txt
An Ethereum util, can transfer eth, check balance, call any contract function etc

Expand Down Expand Up @@ -238,5 +273,7 @@ Use "ethutil [command] --help" for more information about a command.
```

# Issue

## daily request count exceeded, request rate limited

If `panic: daily request count exceeded, request rate limited` appears, please use your own node url. It can be changed by option `--node-url`, for example `--node-url wss://mainnet.infura.io/ws/v3/YOUR_INFURA_PROJECT_ID`