diff --git a/Cargo.lock b/Cargo.lock index da65e0cfba9f3..6e65f0fcb2810 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1574,27 +1574,21 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" name = "forge" version = "0.1.0" dependencies = [ - "ansi_term", - "bytes", "comfy-table", "ethers", "eyre", + "foundry-evm", "foundry-utils", - "futures", "glob", - "hashbrown 0.12.0", "hex", "once_cell", - "parking_lot 0.12.0", "proptest", "rayon", "regex", - "revm", "rlp", "semver", "serde", "serde_json", - "thiserror", "tokio", "tracing", "tracing-subscriber 0.2.25", @@ -1694,6 +1688,30 @@ dependencies = [ "toml", ] +[[package]] +name = "foundry-evm" +version = "0.1.0" +dependencies = [ + "ansi_term", + "bytes", + "ethers", + "eyre", + "foundry-utils", + "futures", + "hashbrown 0.12.0", + "hex", + "once_cell", + "parking_lot 0.12.0", + "proptest", + "revm", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "tracing-subscriber 0.2.25", +] + [[package]] name = "foundry-utils" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 210de371fb2d7..d084a8bf145e3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,8 @@ members = [ "cli/test-utils", "config", "fmt", - "ui" + "ui", + "evm" ] # Binary size optimizations diff --git a/cli/src/cmd/run.rs b/cli/src/cmd/run.rs index d54e1b71ecf31..ca96d9630dccc 100644 --- a/cli/src/cmd/run.rs +++ b/cli/src/cmd/run.rs @@ -13,7 +13,7 @@ use ethers::{ types::{Address, Bytes, U256}, }; use forge::{ - debugger::DebugArena, + debug::DebugArena, decode::decode_console_logs, executor::{ opts::EvmOpts, CallResult, DatabaseRef, DeployResult, EvmError, Executor, ExecutorBuilder, diff --git a/evm/Cargo.toml b/evm/Cargo.toml new file mode 100644 index 0000000000000..61d2e54ea09fb --- /dev/null +++ b/evm/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "foundry-evm" +version = "0.1.0" +edition = "2021" + +# TODO: We can probably reduce dependencies here or in the forge crate +[dependencies] +foundry-utils = { path = "./../utils" } + +# Encoding/decoding +serde_json = "1.0.67" +serde = "1.0.130" +hex = "0.4.3" +ethers = { git = "https://github.com/gakonst/ethers-rs", default-features = false, features = ["solc-full"] } + +# Error handling +eyre = "0.6.5" +thiserror = "1.0.29" + +# Logging +tracing = "0.1.26" +tracing-subscriber = "0.2.20" + +# Threading/futures +tokio = { version = "1.10.1" } +parking_lot = "0.12.0" +futures = "0.3.21" +once_cell = "1.9.0" + +# EVM +bytes = "1.1.0" +hashbrown = "0.12" +revm = { package = "revm", git = "https://github.com/bluealloy/revm", default-features = false, features = ["std", "k256"] } + +# Fuzzer +proptest = "1.0.0" + +# Display +ansi_term = "0.12.1" diff --git a/forge/abi/console.json b/evm/abi/console.json similarity index 100% rename from forge/abi/console.json rename to evm/abi/console.json diff --git a/forge/src/debugger.rs b/evm/src/debug.rs similarity index 100% rename from forge/src/debugger.rs rename to evm/src/debug.rs diff --git a/forge/src/decode.rs b/evm/src/decode.rs similarity index 100% rename from forge/src/decode.rs rename to evm/src/decode.rs diff --git a/forge/src/executor/abi.rs b/evm/src/executor/abi.rs similarity index 100% rename from forge/src/executor/abi.rs rename to evm/src/executor/abi.rs diff --git a/forge/src/executor/builder.rs b/evm/src/executor/builder.rs similarity index 100% rename from forge/src/executor/builder.rs rename to evm/src/executor/builder.rs diff --git a/forge/src/executor/fork/backend.rs b/evm/src/executor/fork/backend.rs similarity index 100% rename from forge/src/executor/fork/backend.rs rename to evm/src/executor/fork/backend.rs diff --git a/forge/src/executor/fork/init.rs b/evm/src/executor/fork/init.rs similarity index 100% rename from forge/src/executor/fork/init.rs rename to evm/src/executor/fork/init.rs diff --git a/forge/src/executor/fork/mod.rs b/evm/src/executor/fork/mod.rs similarity index 100% rename from forge/src/executor/fork/mod.rs rename to evm/src/executor/fork/mod.rs diff --git a/forge/src/executor/inspector/cheatcodes/env.rs b/evm/src/executor/inspector/cheatcodes/env.rs similarity index 100% rename from forge/src/executor/inspector/cheatcodes/env.rs rename to evm/src/executor/inspector/cheatcodes/env.rs diff --git a/forge/src/executor/inspector/cheatcodes/expect.rs b/evm/src/executor/inspector/cheatcodes/expect.rs similarity index 100% rename from forge/src/executor/inspector/cheatcodes/expect.rs rename to evm/src/executor/inspector/cheatcodes/expect.rs diff --git a/forge/src/executor/inspector/cheatcodes/ext.rs b/evm/src/executor/inspector/cheatcodes/ext.rs similarity index 100% rename from forge/src/executor/inspector/cheatcodes/ext.rs rename to evm/src/executor/inspector/cheatcodes/ext.rs diff --git a/forge/src/executor/inspector/cheatcodes/fuzz.rs b/evm/src/executor/inspector/cheatcodes/fuzz.rs similarity index 82% rename from forge/src/executor/inspector/cheatcodes/fuzz.rs rename to evm/src/executor/inspector/cheatcodes/fuzz.rs index 0f6fa87c46417..aef7283132285 100644 --- a/forge/src/executor/inspector/cheatcodes/fuzz.rs +++ b/evm/src/executor/inspector/cheatcodes/fuzz.rs @@ -1,4 +1,4 @@ -use crate::{abi::HEVMCalls, executor::fuzz::ASSUME_MAGIC_RETURN_CODE}; +use crate::{abi::HEVMCalls, fuzz::ASSUME_MAGIC_RETURN_CODE}; use bytes::Bytes; use revm::{Database, EVMData}; diff --git a/forge/src/executor/inspector/cheatcodes/mod.rs b/evm/src/executor/inspector/cheatcodes/mod.rs similarity index 100% rename from forge/src/executor/inspector/cheatcodes/mod.rs rename to evm/src/executor/inspector/cheatcodes/mod.rs diff --git a/forge/src/executor/inspector/cheatcodes/util.rs b/evm/src/executor/inspector/cheatcodes/util.rs similarity index 100% rename from forge/src/executor/inspector/cheatcodes/util.rs rename to evm/src/executor/inspector/cheatcodes/util.rs diff --git a/forge/src/executor/inspector/debugger.rs b/evm/src/executor/inspector/debugger.rs similarity index 99% rename from forge/src/executor/inspector/debugger.rs rename to evm/src/executor/inspector/debugger.rs index e194c111f4d4e..900af7cdbd2f6 100644 --- a/forge/src/executor/inspector/debugger.rs +++ b/evm/src/executor/inspector/debugger.rs @@ -1,5 +1,5 @@ use crate::{ - debugger::{DebugArena, DebugNode, DebugStep, Instruction}, + debug::{DebugArena, DebugNode, DebugStep, Instruction}, executor::{ inspector::utils::{gas_used, get_create_address}, CHEATCODE_ADDRESS, diff --git a/forge/src/executor/inspector/logs.rs b/evm/src/executor/inspector/logs.rs similarity index 100% rename from forge/src/executor/inspector/logs.rs rename to evm/src/executor/inspector/logs.rs diff --git a/forge/src/executor/inspector/mod.rs b/evm/src/executor/inspector/mod.rs similarity index 100% rename from forge/src/executor/inspector/mod.rs rename to evm/src/executor/inspector/mod.rs diff --git a/forge/src/executor/inspector/stack.rs b/evm/src/executor/inspector/stack.rs similarity index 100% rename from forge/src/executor/inspector/stack.rs rename to evm/src/executor/inspector/stack.rs diff --git a/forge/src/executor/inspector/tracer.rs b/evm/src/executor/inspector/tracer.rs similarity index 100% rename from forge/src/executor/inspector/tracer.rs rename to evm/src/executor/inspector/tracer.rs diff --git a/forge/src/executor/inspector/utils.rs b/evm/src/executor/inspector/utils.rs similarity index 100% rename from forge/src/executor/inspector/utils.rs rename to evm/src/executor/inspector/utils.rs diff --git a/forge/src/executor/mod.rs b/evm/src/executor/mod.rs similarity index 99% rename from forge/src/executor/mod.rs rename to evm/src/executor/mod.rs index e1cef7e6ca152..d2b7c735d401f 100644 --- a/forge/src/executor/mod.rs +++ b/evm/src/executor/mod.rs @@ -18,9 +18,6 @@ pub mod fork; pub mod builder; pub use builder::{ExecutorBuilder, Fork}; -/// Fuzzing wrapper for executors -pub mod fuzz; - /// Executor EVM spec identifiers pub use revm::SpecId; @@ -28,7 +25,7 @@ pub use revm::SpecId; pub use revm::db::DatabaseRef; use self::inspector::InspectorStackConfig; -use crate::{debugger::DebugArena, trace::CallTraceArena, CALLER}; +use crate::{debug::DebugArena, trace::CallTraceArena, CALLER}; use bytes::Bytes; use ethers::{ abi::{Abi, Detokenize, RawLog, Tokenize}, diff --git a/forge/src/executor/opts.rs b/evm/src/executor/opts.rs similarity index 100% rename from forge/src/executor/opts.rs rename to evm/src/executor/opts.rs diff --git a/forge/src/executor/fuzz/mod.rs b/evm/src/fuzz/mod.rs similarity index 90% rename from forge/src/executor/fuzz/mod.rs rename to evm/src/fuzz/mod.rs index 22ebed18a2837..fdfa1f64046a5 100644 --- a/forge/src/executor/fuzz/mod.rs +++ b/evm/src/fuzz/mod.rs @@ -251,30 +251,3 @@ pub struct FuzzCase { /// The initial gas stipend for the transaction pub stipend: u64, } - -#[cfg(test)] -mod tests { - use super::FuzzTestResult; - use crate::{ - executor::DeployResult, - test_helpers::{fuzz_executor, test_executor, COMPILED}, - CALLER, - }; - - #[test] - fn prints_fuzzed_revert_reasons() { - let mut executor = test_executor(); - - let compiled = COMPILED.find("FuzzTests").expect("could not find contract"); - let DeployResult { address, .. } = - executor.deploy(*CALLER, compiled.bytecode().unwrap().0.clone(), 0.into()).unwrap(); - - let executor = fuzz_executor(&executor); - - let func = compiled.abi.unwrap().function("testFuzzedRevert").unwrap(); - let FuzzTestResult { reason, success, .. } = - executor.fuzz(func, address, false, compiled.abi); - assert!(!success, "test did not revert"); - assert_eq!(reason, Some("fuzztest-revert".to_string())); - } -} diff --git a/forge/src/executor/fuzz/strategies/calldata.rs b/evm/src/fuzz/strategies/calldata.rs similarity index 100% rename from forge/src/executor/fuzz/strategies/calldata.rs rename to evm/src/fuzz/strategies/calldata.rs diff --git a/forge/src/executor/fuzz/strategies/mod.rs b/evm/src/fuzz/strategies/mod.rs similarity index 100% rename from forge/src/executor/fuzz/strategies/mod.rs rename to evm/src/fuzz/strategies/mod.rs diff --git a/forge/src/executor/fuzz/strategies/param.rs b/evm/src/fuzz/strategies/param.rs similarity index 100% rename from forge/src/executor/fuzz/strategies/param.rs rename to evm/src/fuzz/strategies/param.rs diff --git a/forge/src/executor/fuzz/strategies/uint.rs b/evm/src/fuzz/strategies/uint.rs similarity index 100% rename from forge/src/executor/fuzz/strategies/uint.rs rename to evm/src/fuzz/strategies/uint.rs diff --git a/evm/src/lib.rs b/evm/src/lib.rs new file mode 100644 index 0000000000000..22a9cd53d04c8 --- /dev/null +++ b/evm/src/lib.rs @@ -0,0 +1,22 @@ +/// Decoding helpers +pub mod decode; + +/// Call trace arena, decoding and formatting +pub mod trace; + +/// Debugger data structures +pub mod debug; + +/// Forge test execution backends +pub mod executor; +pub use executor::abi; + +/// Fuzzing wrapper for executors +pub mod fuzz; + +// Re-exports +pub use ethers::types::Address; +pub use hashbrown::HashMap; + +use once_cell::sync::Lazy; +pub static CALLER: Lazy
= Lazy::new(Address::random); diff --git a/forge/src/trace/decoder.rs b/evm/src/trace/decoder.rs similarity index 100% rename from forge/src/trace/decoder.rs rename to evm/src/trace/decoder.rs diff --git a/forge/src/trace/identifier.rs b/evm/src/trace/identifier.rs similarity index 100% rename from forge/src/trace/identifier.rs rename to evm/src/trace/identifier.rs diff --git a/forge/src/trace/mod.rs b/evm/src/trace/mod.rs similarity index 100% rename from forge/src/trace/mod.rs rename to evm/src/trace/mod.rs diff --git a/forge/Cargo.toml b/forge/Cargo.toml index 39e34f5772015..6df46babb8632 100644 --- a/forge/Cargo.toml +++ b/forge/Cargo.toml @@ -6,6 +6,7 @@ license = "MIT OR Apache-2.0" [dependencies] foundry-utils = { path = "./../utils" } +foundry-evm = { path = "./../evm" } ethers = { git = "https://github.com/gakonst/ethers-rs", default-features = false, features = ["solc-full"] } eyre = "0.6.5" @@ -22,15 +23,7 @@ tracing-subscriber = "0.2.20" proptest = "1.0.0" rayon = "1.5" rlp = "0.5.1" - -bytes = "1.1.0" -thiserror = "1.0.29" -revm = { package = "revm", git = "https://github.com/bluealloy/revm", default-features = false, features = ["std", "k256"] } -hashbrown = "0.12" once_cell = "1.9.0" -parking_lot = "0.12.0" -futures = "0.3.21" -ansi_term = "0.12.1" comfy-table = "5.0.0" [dev-dependencies] diff --git a/forge/src/lib.rs b/forge/src/lib.rs index 0395ea4e14fce..be4ca24415e6e 100644 --- a/forge/src/lib.rs +++ b/forge/src/lib.rs @@ -1,11 +1,3 @@ -pub mod decode; - -/// Call trace arena, decoding and formatting -pub mod trace; - -/// Debugger arena -pub mod debugger; - /// Gas reports pub mod gas_report; @@ -17,39 +9,32 @@ pub use runner::{ContractRunner, TestKind, TestKindGas, TestResult}; mod multi_runner; pub use multi_runner::{MultiContractRunner, MultiContractRunnerBuilder}; -/// Forge test execution backends -pub mod executor; -pub use executor::abi; - pub trait TestFilter { fn matches_test(&self, test_name: impl AsRef