laconicd/tests/solidity
yihuang 9227e78c79
evm: use stack of contexts to implement snapshot revert (#399)
* use stack of contexts to implement snapshot revert

Closes #338

add exception revert test case

verify partial revert

mutate state after the reverted subcall

polish

update comments

name the module after the type name

remove the unnecessary Snapshot in outer layer

and add snapshot unit test

assert context stack is clean after tx processing

cleanups

fix context revert

fix comments

update comments

it's ok to commit in failed case too

Update x/evm/keeper/context_stack.go

Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com>

Update x/evm/keeper/context_stack.go

Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com>

Update x/evm/keeper/context_stack.go

Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com>

update comment and error message

add comment to cacheContext

k -> cs

Update x/evm/keeper/context_stack.go

Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com>

evm can handle state revert

renames and unit tests

* use table driven tests

* keep all the cosmos events

* changelog

* check for if commit function is nil

* fix changelog

* Update x/evm/keeper/context_stack.go

Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com>
2021-08-10 07:22:46 +00:00
..
suites evm: use stack of contexts to implement snapshot revert (#399) 2021-08-10 07:22:46 +00:00
.gitattributes tests: reorganize packages (#7) 2021-05-11 07:54:55 -04:00
.gitignore tests: refactor solidity test cases (#249) 2021-07-12 05:22:20 -04:00
init-test-node.sh feat: configurable JSON-RPC APIs (#349) 2021-07-26 11:15:55 +00:00
package.json tests: refactor solidity test cases (#249) 2021-07-12 05:22:20 -04:00
README.md tests: refactor solidity test cases (#249) 2021-07-12 05:22:20 -04:00
test-helper.js tests: refactor solidity test cases (#249) 2021-07-12 05:22:20 -04:00
yarn.lock tests: add opcode contract tests (#273) 2021-07-20 13:01:01 +00:00

Solidity tests

Increasingly difficult tests are provided:

Quick start

Prerequisite: in the repo's root, run make install to install the ethermintd and ethermintd binaries. When done, come back to this directory.

Prerequisite: install the individual solidity packages. They're set up as individual reops in a yarn monorepo workspace. Install them all via yarn install.

To run the tests, you can use the test-helper.js utility to test all suites under ganache or ethermint network. The test-helper.js will help you spawn an ethermintd process before running the tests.

You can simply run yarn test --network ethermint to run all tests with ethermint network, or you can run yarn test --network ganache to use ganache shipped with truffle. In most cases, there two networks should produce identical test results.

If you only want to run a few test cases, append the name of tests following by the command line. For example, use yarn test --network ethermint basic to run the basic test under ethermint network.

If you need to take more control, you can also run ethermintd using:

./init-test-node.sh

You will now have three ethereum accounts unlocked in the test node:

  • 0x3b7252d007059ffc82d16d022da3cbf9992d2f70 (Validator)
  • 0xddd64b4712f7c8f1ace3c145c950339eddaf221d (User 1)
  • 0x0f54f47bf9b8e317b214ccd6a7c3e38b893cd7f0 (user 2)

Keep the terminal window open, go into any of the tests and run yarn test-ethermint. You should see ethermintd accepting transactions and producing blocks. You should be able to query for any transaction via:

  • ethermintd query tx <cosmos-sdk tx>
  • curl localhost:8545 -H "Content-Type:application/json" -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["<ethereum tx>"],"id":1}'

From here, in your other available terminal, And obviously more, via the Ethereum JSON-RPC API).

When in doubt, you can also run the tests against a Ganache instance via yarn test-ganache, to make sure they are behaving correctly.

Test node

The init-test-node.sh script sets up ethermint with the following accounts:

  • eth18de995q8qk0leqk3d5pzmg7tlxvj6tmsku084d (Validator)
    • 0x3b7252d007059ffc82d16d022da3cbf9992d2f70
  • eth1mhtyk3cj7ly0rt8rc9zuj5pnnmw67gsapygwyq (User 1)
    • 0xddd64b4712f7c8f1ace3c145c950339eddaf221d
  • eth1pa20g7lehr330vs5ent20slr3wyne4lsy8qae3 (user 2)
    • 0x0f54f47bf9b8e317b214ccd6a7c3e38b893cd7f0

Each with roughly 100 ETH available (1e18 photon).

Running ethermintd list keys should output:

[
  {
    "name": "localkey",
    "type": "local",
    "address": "eth18de995q8qk0leqk3d5pzmg7tlxvj6tmsku084d",
    "pubkey": "ethpub1pfqnmk6pq3ycjs34vv4n6rkty89f6m02qcsal3ecdzn7a3uunx0e5ly0846pzg903hxf2zp5gq4grh8jcatcemfrscdfl797zhg5crkcsx43gujzppge3n"
  },
  {
    "name": "user1",
    "type": "local",
    "address": "eth1mhtyk3cj7ly0rt8rc9zuj5pnnmw67gsapygwyq",
    "pubkey": "ethpub1pfqnmk6pq3wrkx6lh7uug8ss0thggact3n49m5gkmpca4vylldpur5qrept57e0rrxfmeq5mp5xt3cyf4kys53qcv66qxttv970das69hlpkf8cnyd2a2x"
  },
  {
    "name": "user2",
    "type": "local",
    "address": "eth1pa20g7lehr330vs5ent20slr3wyne4lsy8qae3",
    "pubkey": "ethpub1pfqnmk6pq3art9y45zw5ntyktt2qrt0skmsl0ux9qwk8458ed3d8sgnrs99zlgvj3rt2vggvkh0x56hffugwsyddwqla48npx46pglgs6xhcqpall58tgn"
  }
]

And running:

curl localhost:8545 -H "Content-Type:application/json" -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}'

Should output:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": [
    "0x3b7252d007059ffc82d16d022da3cbf9992d2f70",
    "0xddd64b4712f7c8f1ace3c145c950339eddaf221d",
    "0x0f54f47bf9b8e317b214ccd6a7c3e38b893cd7f0"
  ]
}