Skip to content

Commit

Permalink
refactor: move to revm (foundry-rs#918)
Browse files Browse the repository at this point in the history
* Simple REVM test runner (foundry-rs#788)

* refactor: nuke `evm-adapters`

* refactor: simple revm test runner

Current features:

- Can run unit tests
- Works with both revert-type tests and DSTest-type tests
- Collects logs, albeit not for reverting tests
- Integrated with config and CLI flags

Disabled features:

- Gas reports
- Tracing
- Cheatcodes
- Fuzzing
- Log decoding
- Forking mode
- Hardhat-style `console.log`, since those require
  us to decode calls to a specific address (HH does
  not emit logs)
- The debugger

In addition to this, I've disabled some tests that
could never pass under the current circumstances,
but that should be adjusted and re-enabled when their
respective features are implemented (such as fuzz tests)

* refactor: adjust CLI to new runner API

* feat: log collector inspector

* feat: hardhat logs

* chore: lint

* refactor: extract hh log converter to helper fn

* refactor: return single test result if setup fails

* build: use upstream revm

chore: renuke `evm-adapters`

* REVM fuzzer (foundry-rs#789)

* REVM cheatcodes (foundry-rs#841)

* feat: add `InspectorStack`

Adds `InspectorStack`, an inspector that calls a stack
of other inspectors sequentially.

Closes foundry-rs#752

* feat: port cheatcodes to revm

* feat: port `expectCall` cheatcode

* feat: extract labels from cheatcode inspector

* feat: port `expectEmit` cheatcode

* refactor: move log decoding into `forge` crate

* chore: remove unused evm patch

* test: re-enable debug logs test

* fix: record reads on `SSTORE` ops

* refactor: rename `record` to `start_record`

* docs: clarify why `DUMMY_CALL_OUTPUT` is 320 bytes

* fix: handle `expectRevert` with no return data

* build: bump revm

* chore: remove outdated todo

* refactor: use static dispatch in `InspectorStack`

* build: use k256

* fix: make gas usage not so crazy

* feat(revm): add forking mode (foundry-rs#835)

* feat: copy-paste old forking provider

* feat(fork): convert to REVM traits

* chore: remove unnecessary codehash handler

* feat: impl Database for shared backend

* chore: fix tests

* chore: fmt

* fix(fork): correctly convert H256 <> U256 for storage

* refactor: separate storage from accounts in cache

* feat(fork): fetch block hashes

* chore: remove unused DB parameter

* test: add test for block hashes

* feat: add forked backend to executor builder

* feat(cli): set fork url on the executor

* refactor: move shared backend to separate file

* feat(fork): add fn for instantiating forked env

* feat(cli): allow pinning block number

* fix(fork): install missing listeners

* feat(fork): instantiate environment with forked state

* fix: use a CALLER address with maxed out balance for calls

this is required because in forking mode otherwise the account wont have enough balance
to transact

* chore: fmt

Co-authored-by: Oliver Nordbjerg <hi@notbjerg.me>

* chore: fmt

* REVM tracing and gas reports (foundry-rs#867)

* feat: very simple traces

* feat: creation traces

* feat: setup and revert traces

* fix: fix lib addresses

* refactor: simplify tracer inspector

* fix: fill traces in correct order

* build: bump revm

* fix: get code for newly created contracts

* refactor: unify log extraction logic

* feat: trace logs

* refactor: unify labels and names

* refactor: return string from trace

Instead of passing in an empty string we then pass
around inside the trace display logic, we just return
strings where appropriate.

* refactor: remove identified contracts

* refactor: remove unused vars

* refactor: simplify `construct_func_call`

* refactor: name special characters in traces

* refactor: rework all display logic

* feat: first pass identify/decode for traces

* refactor: move tracing to own module

* refactor: simplify `test`

* feat: traces for fuzz tests

* fix: make fuzz revert reasons less verbose

* feat: port gas reports

* refactor: small readability nits

* feat: run fuzz *and* unit tests in parallel

Previously we would run each test contract in parallel,
but within each `ContractRunner` we would run unit tests
first (in parallel) and then fuzz tests (in parallel).

* refactor: move colouring logic to its own function

* fix: test contract identification

We now include three kinds of traces that are used for
identification of contracts:

- Deployment traces: these are the initial deployments
  of the test contract and libraries
- Setup traces: these are traces of calls to the `setUp`
  function
- Execution traces: these are the traces of calls to
  the test contract itself

* fix: mark setup trace as a setup trace

* fix: get correct nonce in tracer

* fix: log extraction outside of current memory

* chore: clean up complex types

* chore: remove outdated comment

* fix: make tests compile

* fix: add missing test filter function

* feat: display full address in traces

* fix: color "new" keyword in traces

* fix: filter out `console.log` calls from traces

* chore: remove unnecessary comment

* feat: add gas cost to creation traces

* fix: properly decode outputs

* refactor: destructure `TestSetup` in test funcs

* fix: ignore address for func output decoding

* fix: fix expect emit

Co-authored-by: Georgios Konstantopoulos <me@gakonst.com>
Co-authored-by: brockelmore <brockelmore@users.noreply.github.com>

* REVM debugger (foundry-rs#920)

* feat: port debugger data structures

* feat: initial port of `ui` crate

* chore: add `ui` crate as a workspace member

* refactor: adjust ui contract identification

* feat: grey out 0 values in debugger memory

Closes foundry-rs#902

* style: minor debugger ui beautification

* feat: better stack display in debugger ui

* feat: gray out zero bytes in stack view

* feat: debugger inspector

* refactor: minor code cleanup

* feat: port `forge run`

* fix: temp fix for failing `DsTest.sol` include

* chore: fix lints

* test: adjust `forge run` tests

* refactor: use simple bool for revert checks

* chore: remove unused display impl

* chore: remove unused comment

* fix: display number of stack items in ui

* docs: prettify cli help for some commands

* feat: `forge test --debug`

* refactor: `get_create_address` util

* refactor: `InspectorData`

* docs: more detailed err for `forge test --debug`

* feat: support hardhat artifacts in `vm.getCode` (foundry-rs#956)

Ports foundry-rs#903

* REVM: FFI cheatcode updates (foundry-rs#955)

* feat: only strip 0x in ffi output if present

Ports foundry-rs#904

* Update forge/src/executor/inspector/cheatcodes/ext.rs

Co-authored-by: Georgios Konstantopoulos <me@gakonst.com>

* REVM gas fixes (foundry-rs#950)

* feat: account for gas refunds

* refactor: merge `call_raw` and committing variant

* fix: actually use refund quotient

* feat: strip tx gas stipend

* fix: fix reported gas usage in debugger

* build: use upstream revm

* test: adjust `forge run` gas values in tests

* chore: remove unused copy

* chore: add note on push maths

* feat: make stipend reduction optional

* fix: remove tx stipend in `forge run`

* REVM: Pull EVM executor into own crate (foundry-rs#961)

* refactor: move evm executor to own crate

* refactor: `evm::executor::fuzz` -> `evm::fuzz`

* refactor: `evm::debugger` -> `evm::debug`

* test: fix multi runner test

* feat: better ux for expect revert without reason (foundry-rs#962)

* Cross-crate testdata (foundry-rs#965)

* feat: cross-crate shared testdata

* refactor: move `foundry-utils` to common tests

* fix: fix getcode test

* fix: compile once in tests

* fix: fix prank cheatcode (foundry-rs#973)

Correctly apply `msg.sender` prank to both transfers
and calls.

* fix: prank depth math

* test: fix lib linking test

* refactor: use revm `log` hook (foundry-rs#984)

* refactor: use revm `log` hook

* chore: bump revm

Co-authored-by: Georgios Konstantopoulos <me@gakonst.com>

* test: add lil-web3 to integration tests

* test: add maple labs loans to integration tests

Closes foundry-rs#959

* REVM fuzz dictionary (foundry-rs#985)

* feat: fuzz dictionary

Co-authored-by: brockelmore <31553173+brockelmore@users.noreply.github.com>

* fix: handle malformed bytecode

* fix: limit search for push bytes

* feat: collect fuzz state from logs

* feat: build initial fuzz state from db

* perf: use `Index` instead of `Selector`

Co-authored-by: brockelmore <31553173+brockelmore@users.noreply.github.com>

* feat(cli): Refactor cli/cmd over forge and cast (foundry-rs#1009)

* ⚙️ refactor cli

* 🧪 refactor casts

* REVM: Support cheatcodes in `setUp` (foundry-rs#997)

* fix: support cheatcodes in `setUp`

* fix: subtract stipend without panic

* chore: rename test

* fix: set tx gas price to block basefee

* fix: use `CALLER` for `is_success` check

* chore: remove duplicate clap attribute

* fix: set chain id correctly in fork mode

* fix: separate evm block env from execution env

* chore: clippy

* refactor: block override without `block_env` fn

* test: explain why git clone failed

* test: disable maple-labs/loan

* refactor: make addresses statics instead of lazies

* docs: fix console address comment

* refactor: make `DUMMY_CREATE_ADDRESS` a static

* chore: minor nits

* refactor: move inspector state collection

* fix: report correct fuzz failure case (foundry-rs#1017)

* fix: report correct fuzz failure case

* docs: improve some docs in fuzzer

* feat: add support for storage caching (foundry-rs#1006)

* Simple REVM test runner (foundry-rs#788)

* refactor: nuke `evm-adapters`

* refactor: simple revm test runner

Current features:

- Can run unit tests
- Works with both revert-type tests and DSTest-type tests
- Collects logs, albeit not for reverting tests
- Integrated with config and CLI flags

Disabled features:

- Gas reports
- Tracing
- Cheatcodes
- Fuzzing
- Log decoding
- Forking mode
- Hardhat-style `console.log`, since those require
  us to decode calls to a specific address (HH does
  not emit logs)
- The debugger

In addition to this, I've disabled some tests that
could never pass under the current circumstances,
but that should be adjusted and re-enabled when their
respective features are implemented (such as fuzz tests)

* refactor: adjust CLI to new runner API

* feat: log collector inspector

* feat: hardhat logs

* chore: lint

* refactor: extract hh log converter to helper fn

* refactor: return single test result if setup fails

* build: use upstream revm

chore: renuke `evm-adapters`

* REVM fuzzer (foundry-rs#789)

* REVM cheatcodes (foundry-rs#841)

* feat: add `InspectorStack`

Adds `InspectorStack`, an inspector that calls a stack
of other inspectors sequentially.

Closes foundry-rs#752

* feat: port cheatcodes to revm

* feat: port `expectCall` cheatcode

* feat: extract labels from cheatcode inspector

* feat: port `expectEmit` cheatcode

* refactor: move log decoding into `forge` crate

* chore: remove unused evm patch

* test: re-enable debug logs test

* fix: record reads on `SSTORE` ops

* refactor: rename `record` to `start_record`

* docs: clarify why `DUMMY_CALL_OUTPUT` is 320 bytes

* fix: handle `expectRevert` with no return data

* build: bump revm

* chore: remove outdated todo

* refactor: use static dispatch in `InspectorStack`

* build: use k256

* fix: make gas usage not so crazy

* feat(revm): add forking mode (foundry-rs#835)

* feat: copy-paste old forking provider

* feat(fork): convert to REVM traits

* chore: remove unnecessary codehash handler

* feat: impl Database for shared backend

* chore: fix tests

* chore: fmt

* fix(fork): correctly convert H256 <> U256 for storage

* refactor: separate storage from accounts in cache

* feat(fork): fetch block hashes

* chore: remove unused DB parameter

* test: add test for block hashes

* feat: add forked backend to executor builder

* feat(cli): set fork url on the executor

* refactor: move shared backend to separate file

* feat(fork): add fn for instantiating forked env

* feat(cli): allow pinning block number

* fix(fork): install missing listeners

* feat(fork): instantiate environment with forked state

* fix: use a CALLER address with maxed out balance for calls

this is required because in forking mode otherwise the account wont have enough balance
to transact

* chore: fmt

Co-authored-by: Oliver Nordbjerg <hi@notbjerg.me>

* chore: fmt

* REVM tracing and gas reports (foundry-rs#867)

* feat: very simple traces

* feat: creation traces

* feat: setup and revert traces

* fix: fix lib addresses

* refactor: simplify tracer inspector

* fix: fill traces in correct order

* build: bump revm

* fix: get code for newly created contracts

* refactor: unify log extraction logic

* feat: trace logs

* refactor: unify labels and names

* refactor: return string from trace

Instead of passing in an empty string we then pass
around inside the trace display logic, we just return
strings where appropriate.

* refactor: remove identified contracts

* refactor: remove unused vars

* refactor: simplify `construct_func_call`

* refactor: name special characters in traces

* refactor: rework all display logic

* feat: first pass identify/decode for traces

* refactor: move tracing to own module

* refactor: simplify `test`

* feat: traces for fuzz tests

* fix: make fuzz revert reasons less verbose

* feat: port gas reports

* refactor: small readability nits

* feat: run fuzz *and* unit tests in parallel

Previously we would run each test contract in parallel,
but within each `ContractRunner` we would run unit tests
first (in parallel) and then fuzz tests (in parallel).

* refactor: move colouring logic to its own function

* fix: test contract identification

We now include three kinds of traces that are used for
identification of contracts:

- Deployment traces: these are the initial deployments
  of the test contract and libraries
- Setup traces: these are traces of calls to the `setUp`
  function
- Execution traces: these are the traces of calls to
  the test contract itself

* fix: mark setup trace as a setup trace

* fix: get correct nonce in tracer

* fix: log extraction outside of current memory

* chore: clean up complex types

* chore: remove outdated comment

* fix: make tests compile

* fix: add missing test filter function

* feat: display full address in traces

* fix: color "new" keyword in traces

* fix: filter out `console.log` calls from traces

* chore: remove unnecessary comment

* feat: add gas cost to creation traces

* fix: properly decode outputs

* refactor: destructure `TestSetup` in test funcs

* fix: ignore address for func output decoding

* fix: fix expect emit

Co-authored-by: Georgios Konstantopoulos <me@gakonst.com>
Co-authored-by: brockelmore <brockelmore@users.noreply.github.com>

* REVM debugger (foundry-rs#920)

* feat: port debugger data structures

* feat: initial port of `ui` crate

* chore: add `ui` crate as a workspace member

* refactor: adjust ui contract identification

* feat: grey out 0 values in debugger memory

Closes foundry-rs#902

* style: minor debugger ui beautification

* feat: better stack display in debugger ui

* feat: gray out zero bytes in stack view

* feat: debugger inspector

* refactor: minor code cleanup

* feat: port `forge run`

* fix: temp fix for failing `DsTest.sol` include

* chore: fix lints

* test: adjust `forge run` tests

* refactor: use simple bool for revert checks

* chore: remove unused display impl

* chore: remove unused comment

* fix: display number of stack items in ui

* docs: prettify cli help for some commands

* feat: `forge test --debug`

* refactor: `get_create_address` util

* refactor: `InspectorData`

* docs: more detailed err for `forge test --debug`

* feat: support hardhat artifacts in `vm.getCode` (foundry-rs#956)

Ports foundry-rs#903

* REVM: FFI cheatcode updates (foundry-rs#955)

* feat: only strip 0x in ffi output if present

Ports foundry-rs#904

* Update forge/src/executor/inspector/cheatcodes/ext.rs

Co-authored-by: Georgios Konstantopoulos <me@gakonst.com>

* REVM gas fixes (foundry-rs#950)

* feat: account for gas refunds

* refactor: merge `call_raw` and committing variant

* fix: actually use refund quotient

* feat: strip tx gas stipend

* fix: fix reported gas usage in debugger

* build: use upstream revm

* test: adjust `forge run` gas values in tests

* chore: remove unused copy

* chore: add note on push maths

* feat: make stipend reduction optional

* fix: remove tx stipend in `forge run`

* REVM: Pull EVM executor into own crate (foundry-rs#961)

* refactor: move evm executor to own crate

* refactor: `evm::executor::fuzz` -> `evm::fuzz`

* refactor: `evm::debugger` -> `evm::debug`

* test: fix multi runner test

* feat: better ux for expect revert without reason (foundry-rs#962)

* Cross-crate testdata (foundry-rs#965)

* feat: cross-crate shared testdata

* refactor: move `foundry-utils` to common tests

* fix: fix getcode test

* fix: compile once in tests

* fix: fix prank cheatcode (foundry-rs#973)

Correctly apply `msg.sender` prank to both transfers
and calls.

* fix: prank depth math

* test: fix lib linking test

* refactor: use revm `log` hook (foundry-rs#984)

* refactor: use revm `log` hook

* chore: bump revm

Co-authored-by: Georgios Konstantopoulos <me@gakonst.com>

* test: add lil-web3 to integration tests

* test: add maple labs loans to integration tests

Closes foundry-rs#959

* REVM fuzz dictionary (foundry-rs#985)

* feat: fuzz dictionary

Co-authored-by: brockelmore <31553173+brockelmore@users.noreply.github.com>

* fix: handle malformed bytecode

* fix: limit search for push bytes

* feat: collect fuzz state from logs

* feat: build initial fuzz state from db

* perf: use `Index` instead of `Selector`

Co-authored-by: brockelmore <31553173+brockelmore@users.noreply.github.com>

* feat(config): add caching settings

* feat: add none option

* feat: add foundry data dir

* feat: add storage map support

* bump ethers

* chore(clippy): make clippy happy

* refactor: diskmap

* feat: add rpc caching support

* feat: add no storage cache option

* refactor: rename cnfig value

* docs: more storage caching docs

* fix: with config builder function

* refactor: address review

Co-authored-by: Bjerg <onbjerg@users.noreply.github.com>
Co-authored-by: Georgios Konstantopoulos <me@gakonst.com>
Co-authored-by: Oliver Nordbjerg <hi@notbjerg.me>
Co-authored-by: brockelmore <brockelmore@users.noreply.github.com>
Co-authored-by: brockelmore <31553173+brockelmore@users.noreply.github.com>

* fix: default to 80m gas

* fix(evm): gracefully shutdown backendhandler (foundry-rs#1021)

* feat(evm/cache): improve json file caching (foundry-rs#1025)

* feat(cache): proper json cache

* refactor: use new db types

* chore(clippy): make clippy happy

* bump revm

* docs: some docs

* refactor: extend Fork type

* remove diskmap types

* test: refactor tests

* remove sharedmemcache

* add tests

* more tracing

* chore(clippy): make clippy happy

* release: 0.2.0

Co-authored-by: Georgios Konstantopoulos <me@gakonst.com>
Co-authored-by: brockelmore <brockelmore@users.noreply.github.com>
Co-authored-by: brockelmore <31553173+brockelmore@users.noreply.github.com>
Co-authored-by: abigger87 <abigger87@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
  • Loading branch information
6 people committed Mar 28, 2022
1 parent 716dbdc commit 36f756f
Show file tree
Hide file tree
Showing 23 changed files with 603 additions and 420 deletions.
80 changes: 34 additions & 46 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 1 addition & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@ members = [
"config",
"fmt",
"ui",
"evm",
"node",
"node/node-core"
"evm"
]

[profile.test]
Expand Down
2 changes: 1 addition & 1 deletion cast/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "cast"
version = "0.1.0"
version = "0.2.0"
edition = "2021"
license = "MIT OR Apache-2.0"

Expand Down
5 changes: 3 additions & 2 deletions cli/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "foundry-cli"
version = "0.1.0"
version = "0.2.0"
edition = "2021"
license = "MIT OR Apache-2.0"

Expand Down Expand Up @@ -39,7 +39,8 @@ tokio = { version = "1.11.0", features = ["macros"] }
regex = { version = "1.5.4", default-features = false }
ansi_term = "0.12.1"
rpassword = "5.0.1"
tracing-subscriber = "0.2.20"
tracing-error = "0.2.0"
tracing-subscriber = { version = "0.3", features = ["registry", "env-filter", "fmt"] }
tracing = "0.1.26"
hex = "0.4.3"
rayon = "1.5.1"
Expand Down
15 changes: 2 additions & 13 deletions cli/src/cmd/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,8 @@
//! implement `figment::Provider` which allows the subcommand to override the config's defaults, see
//! [`foundry_config::Config`].

pub mod bind;
pub mod build;
pub mod config;
pub mod create;
pub mod flatten;
pub mod init;
pub mod install;
pub mod node;
pub mod remappings;
pub mod run;
pub mod snapshot;
pub mod test;
pub mod verify;
pub mod cast;
pub mod forge;

// Re-export our shared utilities
mod utils;
Expand Down
40 changes: 0 additions & 40 deletions cli/src/opts/evm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,43 +177,3 @@ pub struct EnvArgs {
#[serde(skip_serializing_if = "Option::is_none")]
pub block_gas_limit: Option<u64>,
}

impl EnvArgs {
#[cfg(feature = "sputnik")]
pub fn sputnik_state(&self) -> MemoryVicinity {
MemoryVicinity {
chain_id: self.chain_id.unwrap_or_default().into(),

gas_price: self.gas_price.unwrap_or_default().into(),
origin: self.tx_origin.unwrap_or_default(),

block_coinbase: self.block_coinbase.unwrap_or_default(),
block_number: self.block_number.unwrap_or_default().into(),
block_timestamp: self.block_timestamp.unwrap_or_default().into(),
block_difficulty: self.block_difficulty.unwrap_or_default().into(),
block_base_fee_per_gas: self.block_base_fee_per_gas.unwrap_or_default().into(),
block_gas_limit: self
.block_gas_limit
.unwrap_or_else(|| self.gas_limit.unwrap_or_default())
.into(),
block_hashes: Vec::new(),
}
}

#[cfg(feature = "evmodin")]
pub fn evmodin_state(&self) -> MockedHost {
let mut host = MockedHost::default();

host.tx_context.chain_id = self.chain_id.unwrap_or_default().into();
host.tx_context.tx_gas_price = self.gas_price.unwrap_or_default().into();
host.tx_context.tx_origin = self.tx_origin.unwrap_or_default();
host.tx_context.block_coinbase = self.block_coinbase.unwrap_or_default();
host.tx_context.block_number = self.block_number.unwrap_or_default();
host.tx_context.block_timestamp = self.block_timestamp.unwrap_or_default();
host.tx_context.block_difficulty = self.block_difficulty.unwrap_or_default().into();
host.tx_context.block_gas_limit =
self.block_gas_limit.unwrap_or(self.gas_limit.unwrap_or_default());

host
}
}
17 changes: 13 additions & 4 deletions cli/src/opts/forge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,19 @@ use clap::{Parser, Subcommand, ValueHint};
use ethers::{solc::EvmVersion, types::Address};
use std::{path::PathBuf, str::FromStr};

use crate::cmd::{
bind::BindArgs, build::BuildArgs, config, create::CreateArgs, flatten, init::InitArgs,
install::InstallArgs, node::NodeArgs, remappings::RemappingArgs, run::RunArgs, snapshot,
test::TestArgs,
use crate::cmd::forge::{
bind::BindArgs,
build::BuildArgs,
config,
create::CreateArgs,
flatten,
init::InitArgs,
inspect,
install::InstallArgs,
remappings::RemappingArgs,
run::RunArgs,
snapshot, test, tree,
verify::{VerifyArgs, VerifyCheckArgs},
};
use serde::Serialize;

Expand Down

0 comments on commit 36f756f

Please sign in to comment.