-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Simple REVM test runner #788
Conversation
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)
An aside: removing I've created a repo with some small tests that I tested this on as well, maybe we could port some stuff from that repo: https://github.com/onbjerg/foundry-test |
cli/src/cmd/test.rs
Outdated
// We only decode logs from Hardhat and DS-style console events | ||
let console_logs: Vec<String> = | ||
result.logs.iter().filter_map(|log| decode_console_log(&log)).collect(); | ||
|
||
if !console_logs.is_empty() { | ||
println!("Logs:"); | ||
for log in console_logs { | ||
println!(" {}", log); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This now collects all logs (not just Hardhat/DappTools), but I still filter them to get the behavior we had before. Does this make sense?
ethers::contract::abigen!(HardhatConsole, "./abi/console.json",); | ||
pub use hardhatconsole_mod::HARDHATCONSOLE_ABI as HARDHAT_CONSOLE_ABI; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We only use this to decode the calls themselves, but in the LogCollector
I actually cheat a little bit to avoid returning a Vec<String>
for logs (since we agreed to move that logic to the CLI) by decoding the inputs, converting them to a string and pretending like a log(string)
event was emitted
|
||
/// Builds the executor as configured. | ||
pub fn build(self) -> Executor<EmptyDB> { | ||
Executor::new(EmptyDB(), self.config) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The DB will change here when we get forking. The idea is that this is a builder we can use to selectively add/remove inspectors later on (such as the debugger etc.)
pub traces: Option<Vec<CallTraceArena>>, | ||
// TODO | ||
//pub traces: Option<Vec<CallTraceArena>>, | ||
traces: Option<Vec<()>>, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just placeholders for now because I didn't want to go around commenting out everywhere we reference this
//Fuzz(FuzzedCases), | ||
Fuzz, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Temporary until fuzzing is back
@@ -54,27 +49,33 @@ pub struct TestResult { | |||
/// | |||
/// If this is the result of a fuzz test (`TestKind::Fuzz`), then this is the median of all | |||
/// successful cases | |||
// TODO: The gas usage is both in TestKind and here. We should dedupe. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure why we have a gas_used
in TestResult
as well as TestKind
- leftover?
} | ||
|
||
fn revert<S: Clone, E: Evm<S> + evm_adapters::Evm<S, ReturnReason = T>, T>(_evm: &E) -> T { | ||
<E as evm_adapters::Evm<S>>::revert() | ||
} | ||
|
||
#[cfg(test)] | ||
mod tests { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All of the tests in this module use fuzzing in some capacity, so they are all disabled
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
High level LGTM - excited to get this ball rolling. Some nits.
* 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
* 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
* 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`
* 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`
* 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`
* 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`
* 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`
* 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`
* Simple REVM test runner (#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 (#789) * REVM cheatcodes (#841) * feat: add `InspectorStack` Adds `InspectorStack`, an inspector that calls a stack of other inspectors sequentially. Closes #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 (#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 (#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 (#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 #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` (#956) Ports #903 * REVM: FFI cheatcode updates (#955) * feat: only strip 0x in ffi output if present Ports #904 * Update forge/src/executor/inspector/cheatcodes/ext.rs Co-authored-by: Georgios Konstantopoulos <me@gakonst.com> * REVM gas fixes (#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 (#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 (#962) * Cross-crate testdata (#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 (#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 (#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 #959 * REVM fuzz dictionary (#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>
* Simple REVM test runner (#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 (#789) * REVM cheatcodes (#841) * feat: add `InspectorStack` Adds `InspectorStack`, an inspector that calls a stack of other inspectors sequentially. Closes #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 (#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 (#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 (#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 #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` (#956) Ports #903 * REVM: FFI cheatcode updates (#955) * feat: only strip 0x in ffi output if present Ports #904 * Update forge/src/executor/inspector/cheatcodes/ext.rs Co-authored-by: Georgios Konstantopoulos <me@gakonst.com> * REVM gas fixes (#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 (#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 (#962) * Cross-crate testdata (#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 (#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 (#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 #959 * REVM fuzz dictionary (#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 (#1009) * ⚙️ refactor cli * 🧪 refactor casts * REVM: Support cheatcodes in `setUp` (#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 (#1017) * fix: report correct fuzz failure case * docs: improve some docs in fuzzer * feat: add support for storage caching (#1006) * Simple REVM test runner (#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 (#789) * REVM cheatcodes (#841) * feat: add `InspectorStack` Adds `InspectorStack`, an inspector that calls a stack of other inspectors sequentially. Closes #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 (#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 (#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 (#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 #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` (#956) Ports #903 * REVM: FFI cheatcode updates (#955) * feat: only strip 0x in ffi output if present Ports #904 * Update forge/src/executor/inspector/cheatcodes/ext.rs Co-authored-by: Georgios Konstantopoulos <me@gakonst.com> * REVM gas fixes (#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 (#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 (#962) * Cross-crate testdata (#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 (#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 (#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 #959 * REVM fuzz dictionary (#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 (#1021) * feat(evm/cache): improve json file caching (#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>
* 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>
* 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>
This PR does a couple of things:
evm-adapters
crate (87d069b)LogCollector
, that collects all logs emitted during a call (even if it reverts). This supports both DS-style logs and Hardhat'sconsole.log
Additionally, a lot of features have been disabled (e.g. fuzzing, the debugger, tracing) until we're in a place where we can re-implement them. Some of these features will also see some bigger refactors (tracing for example).
Since I nuked
evm-adapters
in this PR the diff is quite large; I recommend going by commit instead. I will leave this PR as a draft until I have added comments on some pieces of code I want more feedback on/I have questions about. I have also left some comments in some places in the code as notes for myself that I will address as the refactor progressesList of disabled features:
forge run
Closes #751