diff --git a/Cargo.toml b/Cargo.toml index 6d27a103b7fd7..2e1f71ccddc02 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -71,7 +71,7 @@ prettyplease.opt-level = 0 lalrpop.opt-level = 0 ethers-contract-abigen.opt-level = 0 -ethers-contract-abigen-derive.opt-level = 0 +ethers-contract-derive.opt-level = 0 async-recursion.opt-level = 0 miette-derive.opt-level = 0 strum_macros.opt-level = 0 diff --git a/anvil/src/genesis.rs b/anvil/src/genesis.rs index 6e96783be2f65..e004cc8a2d6de 100644 --- a/anvil/src/genesis.rs +++ b/anvil/src/genesis.rs @@ -224,10 +224,7 @@ pub struct CliqueConfig { pub mod secret_key { use ethers::{core::k256::SecretKey, signers::LocalWallet, types::Bytes}; - use serde::{ - de::{self}, - Deserialize, Deserializer, Serialize, Serializer, - }; + use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; pub fn serialize(value: &Option, serializer: S) -> Result where diff --git a/chisel/src/bin/chisel.rs b/chisel/src/bin/chisel.rs index b3a9e3ac8217b..9844d2c5d96fb 100644 --- a/chisel/src/bin/chisel.rs +++ b/chisel/src/bin/chisel.rs @@ -9,8 +9,8 @@ use chisel::{ }; use clap::Parser; use foundry_cli::{ - cmd::{forge::build::BuildArgs, LoadConfig}, - utils, + opts::CoreBuildArgs, + utils::{self, LoadConfig}, }; use foundry_common::evm::EvmArgs; use foundry_config::{ @@ -44,7 +44,7 @@ pub struct ChiselParser { pub sub: Option, #[clap(flatten)] - pub opts: BuildArgs, + pub opts: CoreBuildArgs, #[clap(flatten)] pub evm_opts: EvmArgs, diff --git a/cli/Cargo.toml b/cli/Cargo.toml index b23523ae4d0a7..21a72a38429ab 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -98,12 +98,12 @@ external-integration-tests = [] [[bin]] name = "cast" -path = "src/cast.rs" +path = "src/cast/main.rs" doc = false [[bin]] name = "forge" -path = "src/forge.rs" +path = "src/forge/main.rs" doc = false [[bench]] diff --git a/cli/benches/cast.rs b/cli/benches/cast.rs index 9021627b00220..f7c1b2020061f 100644 --- a/cli/benches/cast.rs +++ b/cli/benches/cast.rs @@ -1,8 +1,12 @@ use criterion::{criterion_group, criterion_main, Criterion}; -use foundry_cli::cmd::cast::wallet::vanity::*; use rayon::prelude::*; use std::{hint::black_box, time::Duration}; +#[path = "../src/cast/cmd/wallet/mod.rs"] +#[allow(unused)] +mod wallet; +use wallet::vanity::*; + /// Benches `cast wallet vanity` /// /// Left or right matchers, with or without nonce do not change the outcome. diff --git a/cli/src/cmd/cast/access_list.rs b/cli/src/cast/cmd/access_list.rs similarity index 98% rename from cli/src/cmd/cast/access_list.rs rename to cli/src/cast/cmd/access_list.rs index 231843bc339cf..ebfd63d27a692 100644 --- a/cli/src/cmd/cast/access_list.rs +++ b/cli/src/cast/cmd/access_list.rs @@ -1,8 +1,3 @@ -// cast estimate subcommands -use crate::{ - opts::{EthereumOpts, TransactionOpts}, - utils::{self}, -}; use cast::{Cast, TxBuilder}; use clap::Parser; use ethers::{ @@ -10,6 +5,10 @@ use ethers::{ types::{BlockId, NameOrAddress}, }; use eyre::WrapErr; +use foundry_cli::{ + opts::{EthereumOpts, TransactionOpts}, + utils, +}; use foundry_config::{Chain, Config}; use std::str::FromStr; diff --git a/cli/src/cmd/cast/bind.rs b/cli/src/cast/cmd/bind.rs similarity index 98% rename from cli/src/cmd/cast/bind.rs rename to cli/src/cast/cmd/bind.rs index 2db8b1baa1ca7..16794711b0eed 100644 --- a/cli/src/cmd/cast/bind.rs +++ b/cli/src/cast/cmd/bind.rs @@ -1,7 +1,7 @@ -use crate::opts::EtherscanOpts; use clap::{Parser, ValueHint}; use ethers::prelude::{errors::EtherscanError, Abigen, Client, MultiAbigen}; use eyre::Result; +use foundry_cli::opts::EtherscanOpts; use foundry_config::Config; use std::path::{Path, PathBuf}; diff --git a/cli/src/cmd/cast/call.rs b/cli/src/cast/cmd/call.rs similarity index 98% rename from cli/src/cmd/cast/call.rs rename to cli/src/cast/cmd/call.rs index df367c2b9ddfd..aeef292e7b351 100644 --- a/cli/src/cmd/cast/call.rs +++ b/cli/src/cast/cmd/call.rs @@ -1,9 +1,3 @@ -// cast estimate subcommands -use crate::{ - cmd::utils::{handle_traces, TraceResult}, - opts::{EthereumOpts, TransactionOpts}, - utils::{self, parse_ether_value}, -}; use cast::{Cast, TxBuilder}; use clap::Parser; use ethers::{ @@ -12,6 +6,10 @@ use ethers::{ }; use eyre::WrapErr; use forge::executor::opts::EvmOpts; +use foundry_cli::{ + opts::{EthereumOpts, TransactionOpts}, + utils::{self, handle_traces, parse_ether_value, TraceResult}, +}; use foundry_config::{find_project_root_path, Config}; use foundry_evm::trace::TracingExecutor; use std::str::FromStr; diff --git a/cli/src/cmd/cast/create2.rs b/cli/src/cast/cmd/create2.rs similarity index 99% rename from cli/src/cmd/cast/create2.rs rename to cli/src/cast/cmd/create2.rs index f40f0c8cd7970..9582eadd31928 100644 --- a/cli/src/cmd/cast/create2.rs +++ b/cli/src/cast/cmd/create2.rs @@ -1,6 +1,3 @@ -//! cast create2 subcommand - -use crate::cmd::Cmd; use cast::SimpleCast; use clap::Parser; use ethers::{ @@ -9,6 +6,7 @@ use ethers::{ utils::{get_create2_address_from_hash, keccak256}, }; use eyre::{Result, WrapErr}; +use foundry_cli::utils::Cmd; use rayon::prelude::*; use regex::RegexSetBuilder; use std::{str::FromStr, time::Instant}; diff --git a/cli/src/cmd/cast/estimate.rs b/cli/src/cast/cmd/estimate.rs similarity index 98% rename from cli/src/cmd/cast/estimate.rs rename to cli/src/cast/cmd/estimate.rs index 32221c160bcfb..e2f992b2c9731 100644 --- a/cli/src/cmd/cast/estimate.rs +++ b/cli/src/cast/cmd/estimate.rs @@ -1,12 +1,11 @@ -// cast estimate subcommands -use crate::{ - opts::{EtherscanOpts, RpcOpts}, - utils::{self, parse_ether_value}, -}; use cast::{Cast, TxBuilder}; use clap::Parser; use ethers::types::{NameOrAddress, U256}; use eyre::Result; +use foundry_cli::{ + opts::{EtherscanOpts, RpcOpts}, + utils::{self, parse_ether_value}, +}; use foundry_config::{figment::Figment, Config}; use std::str::FromStr; diff --git a/cli/src/cmd/cast/find_block.rs b/cli/src/cast/cmd/find_block.rs similarity index 98% rename from cli/src/cmd/cast/find_block.rs rename to cli/src/cast/cmd/find_block.rs index 012f30f509f80..6f1ed25b02c52 100644 --- a/cli/src/cmd/cast/find_block.rs +++ b/cli/src/cast/cmd/find_block.rs @@ -1,10 +1,8 @@ -//! cast find-block subcommand - -use crate::{opts::RpcOpts, utils}; use cast::Cast; use clap::Parser; use ethers::prelude::*; use eyre::Result; +use foundry_cli::{opts::RpcOpts, utils}; use foundry_config::Config; use futures::join; diff --git a/cli/src/cmd/cast/interface.rs b/cli/src/cast/cmd/interface.rs similarity index 98% rename from cli/src/cmd/cast/interface.rs rename to cli/src/cast/cmd/interface.rs index de2044ed11dc0..3f1f5cfa956a1 100644 --- a/cli/src/cmd/cast/interface.rs +++ b/cli/src/cast/cmd/interface.rs @@ -1,6 +1,6 @@ -use crate::opts::EtherscanOpts; use cast::{AbiPath, SimpleCast}; use clap::Parser; +use foundry_cli::opts::EtherscanOpts; use foundry_common::fs; use foundry_config::Config; use std::path::{Path, PathBuf}; diff --git a/cli/src/cmd/cast/logs.rs b/cli/src/cast/cmd/logs.rs similarity index 99% rename from cli/src/cmd/cast/logs.rs rename to cli/src/cast/cmd/logs.rs index be87e13a12a27..14d923e2b93b5 100644 --- a/cli/src/cmd/cast/logs.rs +++ b/cli/src/cast/cmd/logs.rs @@ -1,8 +1,3 @@ -// cast estimate subcommands -use crate::{ - opts::EthereumOpts, - utils::{self}, -}; use cast::Cast; use clap::Parser; use ethers::{ @@ -10,6 +5,7 @@ use ethers::{ providers::Middleware, types::{BlockId, BlockNumber, Filter, FilterBlockOption, NameOrAddress, ValueOrArray, H256}, }; +use foundry_cli::{opts::EthereumOpts, utils}; use foundry_common::abi::{get_event, parse_tokens}; use foundry_config::Config; @@ -220,14 +216,14 @@ fn build_filter_topics(topics: Vec) -> Result #[cfg(test)] mod tests { - use ethers::types::H160; - use super::*; + use ethers::types::H160; const ADDRESS: &str = "0x4D1A2e2bB4F88F0250f26Ffff098B0b30B26BF38"; const TRANSFER_SIG: &str = "Transfer(address indexed,address indexed,uint256)"; const TRANSFER_TOPIC: &str = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"; + #[test] fn test_build_filter_basic() { let from_block = Some(BlockNumber::from(1337)); diff --git a/cli/src/cmd/cast/mod.rs b/cli/src/cast/cmd/mod.rs similarity index 100% rename from cli/src/cmd/cast/mod.rs rename to cli/src/cast/cmd/mod.rs diff --git a/cli/src/cmd/cast/rpc.rs b/cli/src/cast/cmd/rpc.rs similarity index 97% rename from cli/src/cmd/cast/rpc.rs rename to cli/src/cast/cmd/rpc.rs index 9e16056e1a9f3..78c0105de6c96 100644 --- a/cli/src/cmd/cast/rpc.rs +++ b/cli/src/cast/cmd/rpc.rs @@ -1,7 +1,7 @@ -use crate::{opts::RpcOpts, utils}; use cast::Cast; use clap::Parser; use eyre::Result; +use foundry_cli::{opts::RpcOpts, utils}; use foundry_config::Config; use itertools::Itertools; diff --git a/cli/src/cmd/cast/run.rs b/cli/src/cast/cmd/run.rs similarity index 99% rename from cli/src/cmd/cast/run.rs rename to cli/src/cast/cmd/run.rs index 0722f01b281c2..e18175d1e0cdf 100644 --- a/cli/src/cmd/cast/run.rs +++ b/cli/src/cast/cmd/run.rs @@ -1,10 +1,3 @@ -use crate::{ - cmd::utils::{handle_traces, TraceResult}, - init_progress, - opts::RpcOpts, - update_progress, utils, -}; - use clap::Parser; use ethers::{prelude::Middleware, solc::EvmVersion, types::H160}; use eyre::WrapErr; @@ -13,6 +6,12 @@ use forge::{ revm::primitives::U256 as rU256, utils::h256_to_b256, }; +use foundry_cli::{ + init_progress, + opts::RpcOpts, + update_progress, utils, + utils::{handle_traces, TraceResult}, +}; use foundry_config::{find_project_root_path, Config}; use foundry_evm::{executor::EvmError, trace::TracingExecutor}; use tracing::trace; diff --git a/cli/src/cmd/cast/send.rs b/cli/src/cast/cmd/send.rs similarity index 99% rename from cli/src/cmd/cast/send.rs rename to cli/src/cast/cmd/send.rs index 4b90f24f77268..6a55d5a24c280 100644 --- a/cli/src/cmd/cast/send.rs +++ b/cli/src/cast/cmd/send.rs @@ -1,13 +1,12 @@ -// cast send subcommands -use crate::{ - opts::{EthereumOpts, TransactionOpts}, - utils, -}; use cast::{Cast, TxBuilder}; use clap::Parser; use ethers::{ prelude::MiddlewareBuilder, providers::Middleware, signers::Signer, types::NameOrAddress, }; +use foundry_cli::{ + opts::{EthereumOpts, TransactionOpts}, + utils, +}; use foundry_common::cli_warn; use foundry_config::{Chain, Config}; use std::str::FromStr; diff --git a/cli/src/cmd/cast/storage.rs b/cli/src/cast/cmd/storage.rs similarity index 98% rename from cli/src/cmd/cast/storage.rs rename to cli/src/cast/cmd/storage.rs index aed500e7ed2d8..3afc441360c32 100644 --- a/cli/src/cmd/cast/storage.rs +++ b/cli/src/cast/cmd/storage.rs @@ -1,8 +1,4 @@ -use crate::{ - cmd::forge::build, - opts::{cast::parse_slot, EtherscanOpts, RpcOpts}, - utils, -}; +use crate::opts::parse_slot; use cast::Cast; use clap::Parser; use comfy_table::{presets::ASCII_MARKDOWN, Table}; @@ -11,6 +7,10 @@ use ethers::{ solc::artifacts::StorageLayout, }; use eyre::Result; +use foundry_cli::{ + opts::{CoreBuildArgs, EtherscanOpts, RpcOpts}, + utils, +}; use foundry_common::{ abi::find_source, compile::{compile, etherscan_project, suppress_compile}, @@ -53,7 +53,7 @@ pub struct StorageArgs { etherscan: EtherscanOpts, #[clap(flatten)] - build: build::CoreBuildArgs, + build: CoreBuildArgs, } impl_figment_convert_cast!(StorageArgs); diff --git a/cli/src/cmd/cast/wallet/mod.rs b/cli/src/cast/cmd/wallet/mod.rs similarity index 99% rename from cli/src/cmd/cast/wallet/mod.rs rename to cli/src/cast/cmd/wallet/mod.rs index 67a8774ca8c81..5755a2c5361fd 100644 --- a/cli/src/cmd/cast/wallet/mod.rs +++ b/cli/src/cast/cmd/wallet/mod.rs @@ -1,13 +1,3 @@ -//! cast wallet subcommand - -pub mod vanity; - -use std::path::Path; - -use crate::{ - cmd::{cast::wallet::vanity::VanityArgs, Cmd}, - opts::{RawWallet, Wallet}, -}; use cast::SimpleCast; use clap::Parser; use ethers::{ @@ -16,10 +6,18 @@ use ethers::{ types::{transaction::eip712::TypedData, Address, Signature}, }; use eyre::Context; +use foundry_cli::{ + opts::{RawWallet, Wallet}, + utils::Cmd, +}; use foundry_common::fs; use foundry_config::Config; +use std::path::Path; use yansi::Paint; +pub mod vanity; +use vanity::VanityArgs; + /// CLI arguments for `cast wallet`. #[derive(Debug, Parser)] pub enum WalletSubcommands { diff --git a/cli/src/cmd/cast/wallet/vanity.rs b/cli/src/cast/cmd/wallet/vanity.rs similarity index 99% rename from cli/src/cmd/cast/wallet/vanity.rs rename to cli/src/cast/cmd/wallet/vanity.rs index aa5ea81bca65b..cafcd32468a28 100644 --- a/cli/src/cmd/cast/wallet/vanity.rs +++ b/cli/src/cast/cmd/wallet/vanity.rs @@ -1,6 +1,3 @@ -//! Vanity address generation - -use crate::cmd::Cmd; use cast::SimpleCast; use clap::{builder::TypedValueParser, Parser}; use ethers::{ @@ -9,6 +6,7 @@ use ethers::{ types::{H160, U256}, utils::{get_contract_address, secret_key_to_address}, }; +use foundry_cli::utils::Cmd; use rayon::iter::{self, ParallelIterator}; use regex::Regex; use std::time::Instant; diff --git a/cli/src/cast.rs b/cli/src/cast/main.rs similarity index 99% rename from cli/src/cast.rs rename to cli/src/cast/main.rs index b97c8a4471b8f..b0b29d0b1f815 100644 --- a/cli/src/cast.rs +++ b/cli/src/cast/main.rs @@ -7,12 +7,7 @@ use ethers::{ types::Address, utils::keccak256, }; -use foundry_cli::{ - cmd::Cmd, - handler, - opts::cast::{Opts, Subcommands, ToBaseArgs}, - prompt, stdin, utils, -}; +use foundry_cli::{handler, prompt, stdin, utils, utils::Cmd}; use foundry_common::{ abi::{format_tokens, get_event}, fs, @@ -24,6 +19,11 @@ use foundry_common::{ use foundry_config::Config; use std::time::Instant; +pub mod cmd; +pub mod opts; + +use opts::{Opts, Subcommands, ToBaseArgs}; + #[tokio::main] async fn main() -> eyre::Result<()> { utils::load_dotenv(); diff --git a/cli/src/opts/cast.rs b/cli/src/cast/opts.rs similarity index 98% rename from cli/src/opts/cast.rs rename to cli/src/cast/opts.rs index 81be0157e4e78..37e08a538aaf7 100644 --- a/cli/src/opts/cast.rs +++ b/cli/src/cast/opts.rs @@ -1,22 +1,21 @@ -use super::{EtherscanOpts, RpcOpts}; -use crate::{ - cmd::cast::{ - access_list::AccessListArgs, bind::BindArgs, call::CallArgs, create2::Create2Args, - estimate::EstimateArgs, find_block::FindBlockArgs, interface::InterfaceArgs, - logs::LogsArgs, rpc::RpcArgs, run::RunArgs, send::SendTxArgs, storage::StorageArgs, - wallet::WalletSubcommands, - }, - utils::parse_u256, +use crate::cmd::{ + access_list::AccessListArgs, bind::BindArgs, call::CallArgs, create2::Create2Args, + estimate::EstimateArgs, find_block::FindBlockArgs, interface::InterfaceArgs, logs::LogsArgs, + rpc::RpcArgs, run::RunArgs, send::SendTxArgs, storage::StorageArgs, wallet::WalletSubcommands, }; use clap::{Parser, Subcommand, ValueHint}; use ethers::{ abi::ethabi::ethereum_types::BigEndianHash, types::{serde_helpers::Numeric, Address, BlockId, NameOrAddress, H256, U256}, }; +use foundry_cli::{ + opts::{EtherscanOpts, RpcOpts}, + utils::parse_u256, +}; use std::{path::PathBuf, str::FromStr}; #[derive(Debug, Parser)] -#[clap(name = "cast", version = crate::utils::VERSION_MESSAGE)] +#[clap(name = "cast", version = foundry_cli::utils::VERSION_MESSAGE)] pub struct Opts { #[clap(subcommand)] pub sub: Subcommands, diff --git a/cli/src/cmd/mod.rs b/cli/src/cmd/mod.rs deleted file mode 100644 index 7acd8ffb05d81..0000000000000 --- a/cli/src/cmd/mod.rs +++ /dev/null @@ -1,15 +0,0 @@ -//! Subcommands -//! -//! All subcommands should respect the `foundry_config::Config`. -//! If a subcommand accepts values that are supported by the `Config`, then the subcommand should -//! implement `figment::Provider` which allows the subcommand to override the config's defaults, see -//! [`foundry_config::Config`]. - -pub mod cast; -pub mod forge; - -// Re-export our shared utilities -mod retry; -mod utils; - -pub use utils::*; diff --git a/cli/src/cmd/forge/bind.rs b/cli/src/forge/cmd/bind.rs similarity index 99% rename from cli/src/cmd/forge/bind.rs rename to cli/src/forge/cmd/bind.rs index 6789fe0409b33..626c57399810b 100644 --- a/cli/src/cmd/forge/bind.rs +++ b/cli/src/forge/cmd/bind.rs @@ -1,9 +1,9 @@ -use crate::cmd::{ - forge::build::CoreBuildArgs, - utils::{Cmd, LoadConfig}, -}; use clap::{Parser, ValueHint}; use ethers::contract::{Abigen, ContractFilter, ExcludeContracts, MultiAbigen, SelectContracts}; +use foundry_cli::{ + opts::CoreBuildArgs, + utils::{Cmd, LoadConfig}, +}; use foundry_common::{compile, fs::json_files}; use foundry_config::impl_figment_convert; use std::{ diff --git a/cli/src/cmd/forge/build/mod.rs b/cli/src/forge/cmd/build.rs similarity index 95% rename from cli/src/cmd/forge/build/mod.rs rename to cli/src/forge/cmd/build.rs index 514816ad9305c..109a364302432 100644 --- a/cli/src/cmd/forge/build/mod.rs +++ b/cli/src/forge/cmd/build.rs @@ -1,13 +1,10 @@ -//! Build command -use crate::cmd::{ - forge::{ - install::{self}, - watch::WatchArgs, - }, - Cmd, LoadConfig, -}; +use super::{install, watch::WatchArgs}; use clap::Parser; use ethers::solc::{Project, ProjectCompileOutput}; +use foundry_cli::{ + opts::CoreBuildArgs, + utils::{Cmd, LoadConfig}, +}; use foundry_common::{ compile, compile::{ProjectCompiler, SkipBuildFilter}, @@ -24,12 +21,6 @@ use foundry_config::{ use serde::Serialize; use watchexec::config::{InitConfig, RuntimeConfig}; -mod core; -pub use self::core::CoreBuildArgs; - -mod paths; -pub use self::paths::ProjectPathsArgs; - foundry_config::merge_impl_figment_convert!(BuildArgs, args); /// CLI arguments for `forge build`. diff --git a/cli/src/cmd/forge/cache.rs b/cli/src/forge/cmd/cache.rs similarity index 99% rename from cli/src/cmd/forge/cache.rs rename to cli/src/forge/cmd/cache.rs index 3b98302cac26e..d9b7b9440ccc9 100644 --- a/cli/src/cmd/forge/cache.rs +++ b/cli/src/forge/cmd/cache.rs @@ -1,6 +1,3 @@ -//! cache command - -use crate::cmd::Cmd; use cache::Cache; use clap::{ builder::{PossibleValuesParser, TypedValueParser}, @@ -8,6 +5,7 @@ use clap::{ }; use ethers::prelude::Chain; use eyre::Result; +use foundry_cli::utils::Cmd; use foundry_config::{cache, Chain as FoundryConfigChain, Config}; use std::{ffi::OsStr, str::FromStr}; use strum::VariantNames; diff --git a/cli/src/cmd/forge/config.rs b/cli/src/forge/cmd/config.rs similarity index 94% rename from cli/src/cmd/forge/config.rs rename to cli/src/forge/cmd/config.rs index 9ed58d7600ac8..2e7c6a3ab2441 100644 --- a/cli/src/cmd/forge/config.rs +++ b/cli/src/forge/cmd/config.rs @@ -1,7 +1,6 @@ -//! config command - -use crate::cmd::{forge::build::BuildArgs, utils::Cmd, LoadConfig}; +use super::build::BuildArgs; use clap::Parser; +use foundry_cli::utils::{Cmd, LoadConfig}; use foundry_common::{evm::EvmArgs, term::cli_warn}; use foundry_config::fix::fix_tomls; diff --git a/cli/src/cmd/forge/coverage.rs b/cli/src/forge/cmd/coverage.rs similarity index 98% rename from cli/src/cmd/forge/coverage.rs rename to cli/src/forge/cmd/coverage.rs index 36cc7075019ea..92fe362051405 100644 --- a/cli/src/cmd/forge/coverage.rs +++ b/cli/src/forge/cmd/coverage.rs @@ -1,11 +1,4 @@ -//! Coverage command -use crate::{ - cmd::{ - forge::{build::CoreBuildArgs, install, test::FilterArgs}, - LoadConfig, - }, - utils::{p_println, STATIC_FUZZ_SEED}, -}; +use super::{install, test::FilterArgs}; use clap::{Parser, ValueEnum}; use ethers::{ abi::Address, @@ -27,6 +20,11 @@ use forge::{ utils::{build_ic_pc_map, ICPCMap}, MultiContractRunnerBuilder, TestOptions, }; +use foundry_cli::{ + opts::CoreBuildArgs, + p_println, + utils::{LoadConfig, STATIC_FUZZ_SEED}, +}; use foundry_common::{compile::ProjectCompiler, evm::EvmArgs, fs}; use foundry_config::{Config, SolcReq}; use foundry_evm::utils::evm_spec; diff --git a/cli/src/cmd/forge/create.rs b/cli/src/forge/cmd/create.rs similarity index 97% rename from cli/src/cmd/forge/create.rs rename to cli/src/forge/cmd/create.rs index edc7a02cbb9c1..dd0d44c5343c4 100644 --- a/cli/src/cmd/forge/create.rs +++ b/cli/src/forge/cmd/create.rs @@ -1,13 +1,4 @@ -//! Create command -use super::verify; -use crate::{ - cmd::{ - forge::build::CoreBuildArgs, read_constructor_args_file, remove_contract, retry::RetryArgs, - LoadConfig, - }, - opts::{EthereumOpts, EtherscanOpts, TransactionOpts}, - utils, -}; +use super::{retry::RetryArgs, verify}; use cast::SimpleCast; use clap::{Parser, ValueHint}; use ethers::{ @@ -17,6 +8,10 @@ use ethers::{ types::{transaction::eip2718::TypedTransaction, Chain}, }; use eyre::Context; +use foundry_cli::{ + opts::{CoreBuildArgs, EthereumOpts, EtherscanOpts, TransactionOpts}, + utils::{self, read_constructor_args_file, remove_contract, LoadConfig}, +}; use foundry_common::{abi::parse_tokens, compile, estimate_eip1559_fees}; use serde_json::json; use std::{path::PathBuf, sync::Arc}; diff --git a/cli/src/cmd/forge/debug.rs b/cli/src/forge/cmd/debug.rs similarity index 93% rename from cli/src/cmd/forge/debug.rs rename to cli/src/forge/cmd/debug.rs index df45f4d5d67e5..1bd5989985816 100644 --- a/cli/src/cmd/forge/debug.rs +++ b/cli/src/forge/cmd/debug.rs @@ -1,6 +1,6 @@ -use super::{build::BuildArgs, script::ScriptArgs}; -use crate::cmd::{forge::build::CoreBuildArgs, retry::RETRY_VERIFY_ON_CREATE}; +use super::{build::BuildArgs, retry::RETRY_VERIFY_ON_CREATE, script::ScriptArgs}; use clap::{Parser, ValueHint}; +use foundry_cli::opts::CoreBuildArgs; use foundry_common::evm::{Breakpoints, EvmArgs}; use std::path::PathBuf; diff --git a/cli/src/cmd/forge/doc.rs b/cli/src/forge/cmd/doc.rs similarity index 96% rename from cli/src/cmd/forge/doc.rs rename to cli/src/forge/cmd/doc.rs index 4962bb14400c3..14a7a79432f00 100644 --- a/cli/src/cmd/forge/doc.rs +++ b/cli/src/forge/cmd/doc.rs @@ -1,6 +1,6 @@ -use crate::{cmd::Cmd, opts::GH_REPO_PREFIX_REGEX}; use clap::{Parser, ValueHint}; use forge_doc::{ContractInheritance, Deployments, DocBuilder, GitSource, Inheritdoc, Server}; +use foundry_cli::{opts::GH_REPO_PREFIX_REGEX, utils::Cmd}; use foundry_config::{find_project_root_path, load_config_with_root}; use std::{path::PathBuf, process::Command}; @@ -75,7 +75,7 @@ impl Cmd for DocArgs { } } - let commit = crate::utils::Git::new(&root).commit_hash(false).ok(); + let commit = foundry_cli::utils::Git::new(&root).commit_hash(false).ok(); let mut builder = DocBuilder::new(root.clone(), config.project_paths().sources) .with_should_build(self.build) diff --git a/cli/src/cmd/forge/flatten.rs b/cli/src/forge/cmd/flatten.rs similarity index 95% rename from cli/src/cmd/forge/flatten.rs rename to cli/src/forge/cmd/flatten.rs index bb99643e44b25..c9c9ab393defb 100644 --- a/cli/src/cmd/forge/flatten.rs +++ b/cli/src/forge/cmd/flatten.rs @@ -1,8 +1,8 @@ -use crate::cmd::{ - forge::build::{CoreBuildArgs, ProjectPathsArgs}, - Cmd, LoadConfig, -}; use clap::{Parser, ValueHint}; +use foundry_cli::{ + opts::{CoreBuildArgs, ProjectPathsArgs}, + utils::{Cmd, LoadConfig}, +}; use foundry_common::fs; use std::path::PathBuf; diff --git a/cli/src/cmd/forge/fmt.rs b/cli/src/forge/cmd/fmt.rs similarity index 99% rename from cli/src/cmd/forge/fmt.rs rename to cli/src/forge/cmd/fmt.rs index d88034b8ad9d1..cb78c2f0c484c 100644 --- a/cli/src/cmd/forge/fmt.rs +++ b/cli/src/forge/cmd/fmt.rs @@ -1,9 +1,6 @@ -use crate::{ - cmd::{Cmd, LoadConfig}, - utils::FoundryPathExt, -}; use clap::{Parser, ValueHint}; use forge_fmt::{format, parse, print_diagnostics_report}; +use foundry_cli::utils::{Cmd, FoundryPathExt, LoadConfig}; use foundry_common::{fs, term::cli_warn}; use foundry_config::impl_figment_convert_basic; use foundry_utils::glob::expand_globs; diff --git a/cli/src/cmd/forge/fourbyte.rs b/cli/src/forge/cmd/fourbyte.rs similarity index 96% rename from cli/src/cmd/forge/fourbyte.rs rename to cli/src/forge/cmd/fourbyte.rs index d11128038c9d2..6268f2e790ba2 100644 --- a/cli/src/cmd/forge/fourbyte.rs +++ b/cli/src/forge/cmd/fourbyte.rs @@ -1,10 +1,9 @@ -use crate::{ - cmd::forge::build::{CoreBuildArgs, ProjectPathsArgs}, - opts::forge::CompilerArgs, - utils::FoundryPathExt, -}; use clap::Parser; use ethers::prelude::artifacts::output_selection::ContractOutputSelection; +use foundry_cli::{ + opts::{CompilerArgs, CoreBuildArgs, ProjectPathsArgs}, + utils::FoundryPathExt, +}; use foundry_common::{ compile, selectors::{import_selectors, SelectorImportData}, diff --git a/cli/src/cmd/forge/geiger/error.rs b/cli/src/forge/cmd/geiger/error.rs similarity index 91% rename from cli/src/cmd/forge/geiger/error.rs rename to cli/src/forge/cmd/geiger/error.rs index be2994aa121ea..77c6374ea7a76 100644 --- a/cli/src/cmd/forge/geiger/error.rs +++ b/cli/src/forge/cmd/geiger/error.rs @@ -1,5 +1,3 @@ -//! errors related to the command - use foundry_common::errors::FsPathError; use solang_parser::diagnostics::Diagnostic; use std::path::PathBuf; diff --git a/cli/src/cmd/forge/geiger/find.rs b/cli/src/forge/cmd/geiger/find.rs similarity index 97% rename from cli/src/cmd/forge/geiger/find.rs rename to cli/src/forge/cmd/geiger/find.rs index 4587557ba0daf..c6f2887acef86 100644 --- a/cli/src/cmd/forge/geiger/find.rs +++ b/cli/src/forge/cmd/geiger/find.rs @@ -1,6 +1,4 @@ -//! scan a file for unsafe usage - -use crate::cmd::forge::geiger::{error::ScanFileError, visitor::CheatcodeVisitor}; +use super::{error::ScanFileError, visitor::CheatcodeVisitor}; use forge_fmt::{offset_to_line_column, parse, Visitable}; use foundry_common::fs; use solang_parser::{diagnostics::Diagnostic, pt::Loc}; diff --git a/cli/src/cmd/forge/geiger/mod.rs b/cli/src/forge/cmd/geiger/mod.rs similarity index 96% rename from cli/src/cmd/forge/geiger/mod.rs rename to cli/src/forge/cmd/geiger/mod.rs index 5414458637d19..3ec377cc4a7c6 100644 --- a/cli/src/cmd/forge/geiger/mod.rs +++ b/cli/src/forge/cmd/geiger/mod.rs @@ -1,10 +1,7 @@ -use crate::cmd::{ - forge::geiger::find::{find_cheatcodes_in_file, SolFileMetricsPrinter}, - Cmd, LoadConfig, -}; use clap::{Parser, ValueHint}; use ethers::solc::Graph; use eyre::WrapErr; +use foundry_cli::utils::{Cmd, LoadConfig}; use foundry_config::{impl_figment_convert_basic, Config}; use itertools::Itertools; use rayon::prelude::*; @@ -12,7 +9,10 @@ use std::path::PathBuf; use yansi::Paint; mod error; + mod find; +use find::{find_cheatcodes_in_file, SolFileMetricsPrinter}; + mod visitor; /// CLI arguments for `forge geiger`. diff --git a/cli/src/cmd/forge/geiger/visitor.rs b/cli/src/forge/cmd/geiger/visitor.rs similarity index 100% rename from cli/src/cmd/forge/geiger/visitor.rs rename to cli/src/forge/cmd/geiger/visitor.rs diff --git a/cli/src/cmd/forge/generate/mod.rs b/cli/src/forge/cmd/generate/mod.rs similarity index 99% rename from cli/src/cmd/forge/generate/mod.rs rename to cli/src/forge/cmd/generate/mod.rs index 22929f421e562..b806cc68da3cd 100644 --- a/cli/src/cmd/forge/generate/mod.rs +++ b/cli/src/forge/cmd/generate/mod.rs @@ -1,5 +1,3 @@ -//! generate command - use clap::{Parser, Subcommand}; use foundry_common::fs; use std::path::Path; diff --git a/cli/src/cmd/forge/init.rs b/cli/src/forge/cmd/init.rs similarity index 98% rename from cli/src/cmd/forge/init.rs rename to cli/src/forge/cmd/init.rs index 0fefb6fdc9d37..5b14b43006eca 100644 --- a/cli/src/cmd/forge/init.rs +++ b/cli/src/forge/cmd/init.rs @@ -1,11 +1,10 @@ -//! init command - -use crate::{ - cmd::{forge::install::DependencyInstallOpts, Cmd}, - utils::{p_println, Git}, -}; +use super::install::DependencyInstallOpts; use clap::{Parser, ValueHint}; use ethers::solc::remappings::Remapping; +use foundry_cli::{ + p_println, + utils::{Cmd, Git}, +}; use foundry_common::fs; use foundry_config::Config; use std::path::{Path, PathBuf}; diff --git a/cli/src/cmd/forge/inspect.rs b/cli/src/forge/cmd/inspect.rs similarity index 99% rename from cli/src/cmd/forge/inspect.rs rename to cli/src/forge/cmd/inspect.rs index 5645deb72f903..f1ed09e21f678 100644 --- a/cli/src/cmd/forge/inspect.rs +++ b/cli/src/forge/cmd/inspect.rs @@ -1,7 +1,3 @@ -use crate::{ - cmd::{forge::build::CoreBuildArgs, Cmd}, - opts::forge::CompilerArgs, -}; use clap::Parser; use comfy_table::{presets::ASCII_MARKDOWN, Table}; use ethers::{ @@ -18,6 +14,10 @@ use ethers::{ utils::canonicalize, }, }; +use foundry_cli::{ + opts::{CompilerArgs, CoreBuildArgs}, + utils::Cmd, +}; use foundry_common::compile; use serde_json::{to_value, Value}; use std::fmt; diff --git a/cli/src/cmd/forge/install.rs b/cli/src/forge/cmd/install.rs similarity index 99% rename from cli/src/cmd/forge/install.rs rename to cli/src/forge/cmd/install.rs index 29b25fbe2cad1..1f9a694b6dc56 100644 --- a/cli/src/cmd/forge/install.rs +++ b/cli/src/forge/cmd/install.rs @@ -1,12 +1,10 @@ -//! Install command -use crate::{ - cmd::{Cmd, LoadConfig}, - opts::Dependency, - prompt, - utils::{p_println, CommandUtils, Git}, -}; use clap::{Parser, ValueHint}; use eyre::{Context, Result}; +use foundry_cli::{ + opts::Dependency, + p_println, prompt, + utils::{Cmd, CommandUtils, Git, LoadConfig}, +}; use foundry_common::fs; use foundry_config::{impl_figment_convert_basic, Config}; use once_cell::sync::Lazy; diff --git a/cli/src/cmd/forge/mod.rs b/cli/src/forge/cmd/mod.rs similarity index 99% rename from cli/src/cmd/forge/mod.rs rename to cli/src/forge/cmd/mod.rs index 5a1f508e04412..1c88f21ca29e9 100644 --- a/cli/src/cmd/forge/mod.rs +++ b/cli/src/forge/cmd/mod.rs @@ -57,6 +57,7 @@ pub mod inspect; pub mod install; pub mod remappings; pub mod remove; +pub mod retry; pub mod script; pub mod selectors; pub mod snapshot; diff --git a/cli/src/cmd/forge/remappings.rs b/cli/src/forge/cmd/remappings.rs similarity index 96% rename from cli/src/cmd/forge/remappings.rs rename to cli/src/forge/cmd/remappings.rs index f2fe8ba1289f8..fe4e525b6ad51 100644 --- a/cli/src/cmd/forge/remappings.rs +++ b/cli/src/forge/cmd/remappings.rs @@ -1,9 +1,7 @@ -//! remappings command - -use crate::cmd::{Cmd, LoadConfig}; use cast::HashMap; use clap::{Parser, ValueHint}; use ethers::solc::remappings::RelativeRemapping; +use foundry_cli::utils::{Cmd, LoadConfig}; use foundry_config::impl_figment_convert_basic; use std::path::PathBuf; diff --git a/cli/src/cmd/forge/remove.rs b/cli/src/forge/cmd/remove.rs similarity index 96% rename from cli/src/cmd/forge/remove.rs rename to cli/src/forge/cmd/remove.rs index 39059b1076ab4..e488c9e24a533 100644 --- a/cli/src/cmd/forge/remove.rs +++ b/cli/src/forge/cmd/remove.rs @@ -1,9 +1,8 @@ -use crate::{ - cmd::{Cmd, LoadConfig}, +use clap::{Parser, ValueHint}; +use foundry_cli::{ opts::Dependency, - utils::Git, + utils::{Cmd, Git, LoadConfig}, }; -use clap::{Parser, ValueHint}; use foundry_config::impl_figment_convert_basic; use std::path::PathBuf; diff --git a/cli/src/cmd/retry.rs b/cli/src/forge/cmd/retry.rs similarity index 100% rename from cli/src/cmd/retry.rs rename to cli/src/forge/cmd/retry.rs diff --git a/cli/src/cmd/forge/script/artifacts.rs b/cli/src/forge/cmd/script/artifacts.rs similarity index 100% rename from cli/src/cmd/forge/script/artifacts.rs rename to cli/src/forge/cmd/script/artifacts.rs diff --git a/cli/src/cmd/forge/script/broadcast.rs b/cli/src/forge/cmd/script/broadcast.rs similarity index 98% rename from cli/src/cmd/forge/script/broadcast.rs rename to cli/src/forge/cmd/script/broadcast.rs index b0f4d9068c35d..5414c0d9284a5 100644 --- a/cli/src/cmd/forge/script/broadcast.rs +++ b/cli/src/forge/cmd/script/broadcast.rs @@ -1,14 +1,6 @@ -use super::{multi::MultiChainSequence, providers::ProvidersManager, sequence::ScriptSequence, *}; -use crate::{ - cmd::{ - forge::script::{ - receipts::clear_pendings, transaction::TransactionWithMetadata, verify::VerifyBundle, - }, - has_batch_support, has_different_gas_calc, - }, - init_progress, - opts::WalletSigner, - update_progress, +use super::{ + multi::MultiChainSequence, providers::ProvidersManager, receipts::clear_pendings, + sequence::ScriptSequence, transaction::TransactionWithMetadata, verify::VerifyBundle, *, }; use ethers::{ prelude::{Provider, Signer, TxHash}, @@ -16,6 +8,12 @@ use ethers::{ utils::format_units, }; use eyre::{bail, ContextCompat, Result, WrapErr}; +use foundry_cli::{ + init_progress, + opts::WalletSigner, + update_progress, + utils::{has_batch_support, has_different_gas_calc}, +}; use foundry_common::{estimate_eip1559_fees, shell, try_get_http_provider, RetryProvider}; use futures::StreamExt; use std::{cmp::min, collections::HashSet, ops::Mul, sync::Arc}; diff --git a/cli/src/cmd/forge/script/build.rs b/cli/src/forge/cmd/script/build.rs similarity index 99% rename from cli/src/cmd/forge/script/build.rs rename to cli/src/forge/cmd/script/build.rs index 832452e1c8d48..75fc19f2741d8 100644 --- a/cli/src/cmd/forge/script/build.rs +++ b/cli/src/forge/cmd/script/build.rs @@ -1,5 +1,4 @@ use super::*; -use crate::cmd::get_cached_entry_by_name; use ethers::{ prelude::{ artifacts::Libraries, cache::SolFilesCache, ArtifactId, Graph, Project, @@ -13,6 +12,7 @@ use ethers::{ types::{Address, U256}, }; use eyre::{Context, ContextCompat}; +use foundry_cli::utils::get_cached_entry_by_name; use foundry_common::compile; use foundry_utils::{PostLinkInput, ResolvedDependency}; use std::{collections::BTreeMap, fs, str::FromStr}; diff --git a/cli/src/cmd/forge/script/cmd.rs b/cli/src/forge/cmd/script/cmd.rs similarity index 98% rename from cli/src/cmd/forge/script/cmd.rs rename to cli/src/forge/cmd/script/cmd.rs index df447a12a60a7..cc61668e72fed 100644 --- a/cli/src/cmd/forge/script/cmd.rs +++ b/cli/src/forge/cmd/script/cmd.rs @@ -1,12 +1,9 @@ -use super::{sequence::ScriptSequence, *}; -use crate::cmd::{ - forge::script::{multi::MultiChainSequence, verify::VerifyBundle}, - LoadConfig, -}; +use super::{multi::MultiChainSequence, sequence::ScriptSequence, verify::VerifyBundle, *}; use ethers::{ prelude::{Middleware, Signer}, types::{transaction::eip2718::TypedTransaction, U256}, }; +use foundry_cli::utils::LoadConfig; use foundry_common::{contracts::flatten_contracts, try_get_http_provider}; use std::sync::Arc; use tracing::trace; diff --git a/cli/src/cmd/forge/script/executor.rs b/cli/src/forge/cmd/script/executor.rs similarity index 98% rename from cli/src/cmd/forge/script/executor.rs rename to cli/src/forge/cmd/script/executor.rs index 974ce9b516bd6..824c0393ac3f5 100644 --- a/cli/src/cmd/forge/script/executor.rs +++ b/cli/src/forge/cmd/script/executor.rs @@ -1,12 +1,8 @@ -use super::*; -use crate::cmd::{ - ensure_clean_constructor, - forge::script::{ - artifacts::ArtifactInfo, - runner::SimulationStage, - transaction::{AdditionalContract, TransactionWithMetadata}, - }, - needs_setup, +use super::{ + artifacts::ArtifactInfo, + runner::SimulationStage, + transaction::{AdditionalContract, TransactionWithMetadata}, + *, }; use ethers::{ solc::artifacts::CompactContractBytecode, @@ -21,6 +17,7 @@ use forge::{ trace::{CallTraceDecoder, Traces}, CallKind, }; +use foundry_cli::utils::{ensure_clean_constructor, needs_setup}; use foundry_common::{shell, RpcUrl}; use foundry_evm::utils::evm_spec; use futures::future::join_all; diff --git a/cli/src/cmd/forge/script/mod.rs b/cli/src/forge/cmd/script/mod.rs similarity index 98% rename from cli/src/cmd/forge/script/mod.rs rename to cli/src/forge/cmd/script/mod.rs index 6cc8532217856..633d9823b4a48 100644 --- a/cli/src/cmd/forge/script/mod.rs +++ b/cli/src/forge/cmd/script/mod.rs @@ -1,5 +1,8 @@ -//! script command -use crate::{cmd::forge::build::BuildArgs, opts::MultiWallet, utils::parse_ether_value}; +use self::{ + build::{filter_sources_and_artifacts, BuildOutput}, + runner::ScriptRunner, +}; +use super::{build::BuildArgs, retry::RetryArgs}; use cast::{ decode, executor::inspector::{ @@ -35,12 +38,22 @@ use forge::{ }, CallKind, }; +use foundry_cli::{opts::MultiWallet, utils::parse_ether_value}; use foundry_common::{ - abi::format_token, + abi::{encode_args, format_token}, + contracts::get_contract_name, + errors::UnlinkedByteCode, evm::{Breakpoints, EvmArgs}, shell, ContractsByArtifact, RpcUrl, CONTRACT_MAX_SIZE, SELECTOR_LEN, }; -use foundry_config::{figment, Config}; +use foundry_config::{ + figment, + figment::{ + value::{Dict, Map}, + Metadata, Profile, Provider, + }, + Config, +}; use futures::future; use serde::{Deserialize, Serialize}; use std::{ @@ -48,33 +61,22 @@ use std::{ path::PathBuf, }; use tracing::log::trace; -use yansi::Paint; - -mod build; -use build::{filter_sources_and_artifacts, BuildOutput}; -use foundry_common::{abi::encode_args, contracts::get_contract_name, errors::UnlinkedByteCode}; -use foundry_config::figment::{ - value::{Dict, Map}, - Metadata, Profile, Provider, -}; - -mod runner; -use runner::ScriptRunner; - -mod broadcast; use ui::{TUIExitReason, Tui, Ui}; +use yansi::Paint; mod artifacts; +mod broadcast; +mod build; mod cmd; mod executor; mod multi; mod providers; mod receipts; +mod runner; mod sequence; pub mod transaction; mod verify; -use crate::cmd::retry::RetryArgs; pub use transaction::TransactionWithMetadata; /// List of Chains that support Shanghai. @@ -786,7 +788,7 @@ For more information, please see https://eips.ethereum.org/EIPS/eip-3855"#, #[cfg(test)] mod tests { use super::*; - use crate::cmd::LoadConfig; + use foundry_cli::utils::LoadConfig; use foundry_cli_test_utils::tempfile::tempdir; use foundry_config::UnresolvedEnvVarError; use std::fs; diff --git a/cli/src/cmd/forge/script/multi.rs b/cli/src/forge/cmd/script/multi.rs similarity index 100% rename from cli/src/cmd/forge/script/multi.rs rename to cli/src/forge/cmd/script/multi.rs diff --git a/cli/src/cmd/forge/script/providers.rs b/cli/src/forge/cmd/script/providers.rs similarity index 100% rename from cli/src/cmd/forge/script/providers.rs rename to cli/src/forge/cmd/script/providers.rs diff --git a/cli/src/cmd/forge/script/receipts.rs b/cli/src/forge/cmd/script/receipts.rs similarity index 97% rename from cli/src/cmd/forge/script/receipts.rs rename to cli/src/forge/cmd/script/receipts.rs index 6d4d30e4d4be3..e051c023a2f30 100644 --- a/cli/src/cmd/forge/script/receipts.rs +++ b/cli/src/forge/cmd/script/receipts.rs @@ -1,12 +1,10 @@ -use crate::{ - cmd::forge::script::sequence::ScriptSequence, init_progress, update_progress, - utils::print_receipt, -}; +use super::sequence::ScriptSequence; use ethers::{ prelude::{PendingTransaction, TxHash}, providers::Middleware, types::TransactionReceipt, }; +use foundry_cli::{init_progress, update_progress, utils::print_receipt}; use foundry_common::RetryProvider; use futures::StreamExt; use std::sync::Arc; diff --git a/cli/src/cmd/forge/script/runner.rs b/cli/src/forge/cmd/script/runner.rs similarity index 100% rename from cli/src/cmd/forge/script/runner.rs rename to cli/src/forge/cmd/script/runner.rs diff --git a/cli/src/cmd/forge/script/sequence.rs b/cli/src/forge/cmd/script/sequence.rs similarity index 99% rename from cli/src/cmd/forge/script/sequence.rs rename to cli/src/forge/cmd/script/sequence.rs index c55c712f31e0c..1abe2352c2de1 100644 --- a/cli/src/cmd/forge/script/sequence.rs +++ b/cli/src/forge/cmd/script/sequence.rs @@ -1,5 +1,5 @@ use super::NestedValue; -use crate::cmd::forge::{ +use crate::cmd::{ init::get_commit_hash, script::{ transaction::{wrapper, AdditionalContract, TransactionWithMetadata}, diff --git a/cli/src/cmd/forge/script/transaction.rs b/cli/src/forge/cmd/script/transaction.rs similarity index 99% rename from cli/src/cmd/forge/script/transaction.rs rename to cli/src/forge/cmd/script/transaction.rs index f1ad9cabc26d1..dff31f2235556 100644 --- a/cli/src/cmd/forge/script/transaction.rs +++ b/cli/src/forge/cmd/script/transaction.rs @@ -1,4 +1,4 @@ -use crate::cmd::forge::script::{artifacts::ArtifactInfo, ScriptResult}; +use super::{artifacts::ArtifactInfo, ScriptResult}; use cast::{executor::inspector::DEFAULT_CREATE2_DEPLOYER, trace::CallTraceDecoder, CallKind}; use ethers::{ abi, diff --git a/cli/src/cmd/forge/script/verify.rs b/cli/src/forge/cmd/script/verify.rs similarity index 95% rename from cli/src/cmd/forge/script/verify.rs rename to cli/src/forge/cmd/script/verify.rs index d67f128f5077a..1ec2a050d0458 100644 --- a/cli/src/cmd/forge/script/verify.rs +++ b/cli/src/forge/cmd/script/verify.rs @@ -1,19 +1,12 @@ -//! Verify support - -use crate::{ - cmd::{ - forge::{ - build::ProjectPathsArgs, - verify::{VerifierArgs, VerifyArgs}, - }, - retry::RetryArgs, - }, - opts::EtherscanOpts, +use crate::cmd::{ + retry::RetryArgs, + verify::{VerifierArgs, VerifyArgs}, }; use ethers::{ abi::Address, solc::{info::ContractInfo, Project}, }; +use foundry_cli::opts::{EtherscanOpts, ProjectPathsArgs}; use foundry_common::ContractsByArtifact; use foundry_config::{Chain, Config}; use semver::Version; diff --git a/cli/src/cmd/forge/selectors.rs b/cli/src/forge/cmd/selectors.rs similarity index 98% rename from cli/src/cmd/forge/selectors.rs rename to cli/src/forge/cmd/selectors.rs index c02ed4408c89f..ba7f2e8d771c0 100644 --- a/cli/src/cmd/forge/selectors.rs +++ b/cli/src/forge/cmd/selectors.rs @@ -1,17 +1,15 @@ -use std::fs::canonicalize; - -use crate::{ - cmd::forge::build::{CoreBuildArgs, ProjectPathsArgs}, - opts::forge::CompilerArgs, - utils::FoundryPathExt, -}; use clap::Parser; use comfy_table::Table; use ethers::prelude::{artifacts::output_selection::ContractOutputSelection, info::ContractInfo}; +use foundry_cli::{ + opts::{CompilerArgs, CoreBuildArgs, ProjectPathsArgs}, + utils::FoundryPathExt, +}; use foundry_common::{ compile, selectors::{import_selectors, SelectorImportData}, }; +use std::fs::canonicalize; /// CLI arguments for `forge selectors`. #[derive(Debug, Clone, Parser)] diff --git a/cli/src/cmd/forge/snapshot.rs b/cli/src/forge/cmd/snapshot.rs similarity index 98% rename from cli/src/cmd/forge/snapshot.rs rename to cli/src/forge/cmd/snapshot.rs index 637250964a792..3213aeb9f2ee5 100644 --- a/cli/src/cmd/forge/snapshot.rs +++ b/cli/src/forge/cmd/snapshot.rs @@ -1,16 +1,12 @@ -//! Snapshot command -use crate::{ - cmd::forge::{ - build::CoreBuildArgs, - test, - test::{Test, TestOutcome}, - }, - utils::STATIC_FUZZ_SEED, +use super::{ + test, + test::{Test, TestOutcome}, }; use clap::{builder::RangedU64ValueParser, Parser, ValueHint}; use ethers::types::U256; use eyre::Context; use forge::result::TestKindReport; +use foundry_cli::utils::STATIC_FUZZ_SEED; use once_cell::sync::Lazy; use regex::Regex; use std::{ @@ -100,11 +96,6 @@ impl SnapshotArgs { self.test.watchexec_config() } - /// Returns the nested [`CoreBuildArgs`] - pub fn build_args(&self) -> &CoreBuildArgs { - self.test.build_args() - } - pub async fn run(mut self) -> eyre::Result<()> { // Set fuzz seed so gas snapshots are deterministic self.test.fuzz_seed = Some(U256::from_big_endian(&STATIC_FUZZ_SEED)); diff --git a/cli/src/cmd/forge/test/filter.rs b/cli/src/forge/cmd/test/filter.rs similarity index 99% rename from cli/src/cmd/forge/test/filter.rs rename to cli/src/forge/cmd/test/filter.rs index 455be5a11e27d..572ad327700e7 100644 --- a/cli/src/cmd/forge/test/filter.rs +++ b/cli/src/forge/cmd/test/filter.rs @@ -1,7 +1,7 @@ -use crate::utils::FoundryPathExt; use clap::Parser; use ethers::solc::{FileFilter, ProjectPathsConfig}; use forge::TestFilter; +use foundry_cli::utils::FoundryPathExt; use foundry_common::glob::GlobMatcher; use foundry_config::Config; use std::{fmt, path::Path}; diff --git a/cli/src/cmd/forge/test/mod.rs b/cli/src/forge/cmd/test/mod.rs similarity index 97% rename from cli/src/cmd/forge/test/mod.rs rename to cli/src/forge/cmd/test/mod.rs index 82bb5d77dd0bb..45ce77a5565b5 100644 --- a/cli/src/cmd/forge/test/mod.rs +++ b/cli/src/forge/cmd/test/mod.rs @@ -1,11 +1,4 @@ -//! Test command -use crate::{ - cmd::{ - forge::{build::CoreBuildArgs, debug::DebugArgs, install, watch::WatchArgs}, - LoadConfig, - }, - suggestions, utils, -}; +use super::{debug::DebugArgs, install, test::filter::ProjectPathsAwareFilter, watch::WatchArgs}; use cast::fuzz::CounterExample; use clap::Parser; use ethers::types::U256; @@ -20,26 +13,32 @@ use forge::{ }, MultiContractRunner, MultiContractRunnerBuilder, TestOptions, TestOptionsBuilder, }; +use foundry_cli::{ + opts::CoreBuildArgs, + utils::{self, LoadConfig}, +}; use foundry_common::{ compile::{self, ProjectCompiler}, evm::EvmArgs, - get_contract_name, get_file_name, + get_contract_name, get_file_name, shell, +}; +use foundry_config::{ + figment, + figment::{ + value::{Dict, Map}, + Metadata, Profile, Provider, + }, + get_available_profiles, Config, }; -use foundry_config::{figment, get_available_profiles, Config}; +use foundry_evm::utils::evm_spec; use regex::Regex; use std::{collections::BTreeMap, path::PathBuf, sync::mpsc::channel, time::Duration}; use tracing::trace; use watchexec::config::{InitConfig, RuntimeConfig}; use yansi::Paint; + mod filter; -use crate::cmd::forge::test::filter::ProjectPathsAwareFilter; pub use filter::FilterArgs; -use foundry_common::shell; -use foundry_config::figment::{ - value::{Dict, Map}, - Metadata, Profile, Provider, -}; -use foundry_evm::utils::evm_spec; // Loads project's figment and merges the build cli arguments into it foundry_config::merge_impl_figment_convert!(TestArgs, opts, evm_opts); @@ -528,7 +527,7 @@ async fn test( if let Some(ref test_pattern) = filter.args().test_pattern { let test_name = test_pattern.as_str(); let candidates = runner.get_tests(&filter); - if let Some(suggestion) = suggestions::did_you_mean(test_name, candidates).pop() { + if let Some(suggestion) = utils::did_you_mean(test_name, candidates).pop() { println!("\nDid you mean `{suggestion}`?"); } } diff --git a/cli/src/cmd/forge/tree.rs b/cli/src/forge/cmd/tree.rs similarity index 82% rename from cli/src/cmd/forge/tree.rs rename to cli/src/forge/cmd/tree.rs index af8c78fa3bb03..b742bc4349a64 100644 --- a/cli/src/cmd/forge/tree.rs +++ b/cli/src/forge/cmd/tree.rs @@ -1,12 +1,12 @@ -//! tree command - -use crate::cmd::Cmd; use clap::Parser; -use ethers::solc::Graph; - -foundry_config::impl_figment_convert!(TreeArgs, opts); -use crate::cmd::{forge::build::ProjectPathsArgs, LoadConfig}; -use ethers::solc::resolver::{Charset, TreeOptions}; +use ethers::solc::{ + resolver::{Charset, TreeOptions}, + Graph, +}; +use foundry_cli::{ + opts::ProjectPathsArgs, + utils::{Cmd, LoadConfig}, +}; /// CLI arguments for `forge tree`. #[derive(Debug, Clone, Parser)] @@ -25,6 +25,8 @@ pub struct TreeArgs { opts: ProjectPathsArgs, } +foundry_config::impl_figment_convert!(TreeArgs, opts); + impl Cmd for TreeArgs { type Output = (); diff --git a/cli/src/cmd/forge/update.rs b/cli/src/forge/cmd/update.rs similarity index 96% rename from cli/src/cmd/forge/update.rs rename to cli/src/forge/cmd/update.rs index 412992941b334..4865d08fae782 100644 --- a/cli/src/cmd/forge/update.rs +++ b/cli/src/forge/cmd/update.rs @@ -1,11 +1,9 @@ -//! Update command -use crate::{ - cmd::{Cmd, LoadConfig}, - opts::Dependency, - utils::Git, -}; use clap::{Parser, ValueHint}; use eyre::{Context, Result}; +use foundry_cli::{ + opts::Dependency, + utils::{Cmd, Git, LoadConfig}, +}; use foundry_config::{impl_figment_convert_basic, Config}; use std::path::PathBuf; diff --git a/cli/src/cmd/forge/verify/etherscan/flatten.rs b/cli/src/forge/cmd/verify/etherscan/flatten.rs similarity index 100% rename from cli/src/cmd/forge/verify/etherscan/flatten.rs rename to cli/src/forge/cmd/verify/etherscan/flatten.rs diff --git a/cli/src/cmd/forge/verify/etherscan/mod.rs b/cli/src/forge/cmd/verify/etherscan/mod.rs similarity index 98% rename from cli/src/cmd/forge/verify/etherscan/mod.rs rename to cli/src/forge/cmd/verify/etherscan/mod.rs index 7948f48b58198..0d09e243f9225 100644 --- a/cli/src/cmd/forge/verify/etherscan/mod.rs +++ b/cli/src/forge/cmd/verify/etherscan/mod.rs @@ -1,11 +1,5 @@ -mod flatten; -mod standard_json; - -use super::{VerifyArgs, VerifyCheckArgs}; -use crate::cmd::{ - forge::verify::provider::VerificationProvider, get_cached_entry_by_name, - read_constructor_args_file, retry::RETRY_CHECK_ON_VERIFY, LoadConfig, -}; +use super::{provider::VerificationProvider, VerifyArgs, VerifyCheckArgs}; +use crate::cmd::retry::RETRY_CHECK_ON_VERIFY; use cast::SimpleCast; use ethers::{ abi::Function, @@ -18,6 +12,7 @@ use ethers::{ solc::{artifacts::CompactContract, cache::CacheEntry, Project, Solc}, }; use eyre::{eyre, Context}; +use foundry_cli::utils::{get_cached_entry_by_name, read_constructor_args_file, LoadConfig}; use foundry_common::abi::encode_args; use foundry_config::{Chain, Config, SolcReq}; use foundry_utils::Retry; @@ -31,6 +26,9 @@ use std::{ }; use tracing::{error, trace, warn}; +mod flatten; +mod standard_json; + pub static RE_BUILD_COMMIT: Lazy = Lazy::new(|| Regex::new(r"(?Pcommit\.[0-9,a-f]{8})").unwrap()); @@ -461,8 +459,8 @@ async fn ensure_solc_build_metadata(version: Version) -> eyre::Result { #[cfg(test)] mod tests { use super::*; - use crate::cmd::LoadConfig; use clap::Parser; + use foundry_cli::utils::LoadConfig; use foundry_cli_test_utils::tempfile::tempdir; use foundry_common::fs; diff --git a/cli/src/cmd/forge/verify/etherscan/standard_json.rs b/cli/src/forge/cmd/verify/etherscan/standard_json.rs similarity index 100% rename from cli/src/cmd/forge/verify/etherscan/standard_json.rs rename to cli/src/forge/cmd/verify/etherscan/standard_json.rs diff --git a/cli/src/cmd/forge/verify/mod.rs b/cli/src/forge/cmd/verify/mod.rs similarity index 96% rename from cli/src/cmd/forge/verify/mod.rs rename to cli/src/forge/cmd/verify/mod.rs index 185a7319ec04b..5758c65e31f08 100644 --- a/cli/src/cmd/forge/verify/mod.rs +++ b/cli/src/forge/cmd/verify/mod.rs @@ -1,22 +1,18 @@ -//! Verify contract source - -use crate::{ - cmd::{ - forge::verify::{etherscan::EtherscanVerificationProvider, provider::VerificationProvider}, - retry::RetryArgs, - LoadConfig, - }, - opts::EtherscanOpts, -}; +use super::retry::RetryArgs; use clap::{Parser, ValueHint}; use ethers::{abi::Address, solc::info::ContractInfo}; +use foundry_cli::{opts::EtherscanOpts, utils::LoadConfig}; use foundry_config::{figment, impl_figment_convert, impl_figment_convert_cast, Config}; use provider::VerificationProviderType; use reqwest::Url; use std::path::PathBuf; mod etherscan; +use etherscan::EtherscanVerificationProvider; + pub mod provider; +use provider::VerificationProvider; + mod sourcify; /// Verification provider arguments diff --git a/cli/src/cmd/forge/verify/provider.rs b/cli/src/forge/cmd/verify/provider.rs similarity index 98% rename from cli/src/cmd/forge/verify/provider.rs rename to cli/src/forge/cmd/verify/provider.rs index e4864ed50472b..a210e501e0811 100644 --- a/cli/src/cmd/forge/verify/provider.rs +++ b/cli/src/forge/cmd/verify/provider.rs @@ -1,4 +1,4 @@ -use crate::cmd::forge::verify::{ +use super::{ etherscan::EtherscanVerificationProvider, sourcify::SourcifyVerificationProvider, VerifyArgs, VerifyCheckArgs, }; diff --git a/cli/src/cmd/forge/verify/sourcify.rs b/cli/src/forge/cmd/verify/sourcify.rs similarity index 97% rename from cli/src/cmd/forge/verify/sourcify.rs rename to cli/src/forge/cmd/verify/sourcify.rs index b8ac13903f638..ad93d5d2e8e84 100644 --- a/cli/src/cmd/forge/verify/sourcify.rs +++ b/cli/src/forge/cmd/verify/sourcify.rs @@ -1,10 +1,8 @@ -use super::{VerifyArgs, VerifyCheckArgs}; -use crate::cmd::LoadConfig; +use super::{provider::VerificationProvider, VerifyArgs, VerifyCheckArgs}; use async_trait::async_trait; use cast::SimpleCast; use ethers::solc::ConfigurableContractArtifact; - -use crate::cmd::forge::verify::provider::VerificationProvider; +use foundry_cli::utils::{get_cached_entry_by_name, LoadConfig}; use foundry_common::fs; use foundry_utils::Retry; use futures::FutureExt; @@ -118,7 +116,7 @@ impl SourcifyVerificationProvider { } let cache = project.read_cache_file()?; - let (path, entry) = crate::cmd::get_cached_entry_by_name(&cache, &args.contract.name)?; + let (path, entry) = get_cached_entry_by_name(&cache, &args.contract.name)?; if entry.solc_config.settings.metadata.is_none() { eyre::bail!( diff --git a/cli/src/cmd/forge/watch.rs b/cli/src/forge/cmd/watch.rs similarity index 98% rename from cli/src/cmd/forge/watch.rs rename to cli/src/forge/cmd/watch.rs index 9be754c4fc49c..a6b99c33a51e2 100644 --- a/cli/src/cmd/forge/watch.rs +++ b/cli/src/forge/cmd/watch.rs @@ -1,10 +1,6 @@ -//! Watch mode support - -use crate::{ - cmd::forge::{build::BuildArgs, snapshot::SnapshotArgs, test::TestArgs}, - utils::{self, FoundryPathExt}, -}; +use super::{build::BuildArgs, snapshot::SnapshotArgs, test::TestArgs}; use clap::Parser; +use foundry_cli::utils::{self, FoundryPathExt}; use foundry_config::Config; use std::{collections::HashSet, convert::Infallible, path::PathBuf, sync::Arc}; use tracing::trace; diff --git a/cli/src/forge.rs b/cli/src/forge/main.rs similarity index 94% rename from cli/src/forge.rs rename to cli/src/forge/main.rs index efcabad7dc368..aa697dcb4658e 100644 --- a/cli/src/forge.rs +++ b/cli/src/forge/main.rs @@ -1,14 +1,12 @@ use clap::{CommandFactory, Parser}; use clap_complete::generate; -use foundry_cli::{ - cmd::{ - forge::{cache::CacheSubcommands, generate::GenerateSubcommands, watch}, - Cmd, - }, - handler, - opts::forge::{Opts, Subcommands}, - utils, -}; +use foundry_cli::{handler, utils, utils::Cmd}; + +mod cmd; +mod opts; + +use cmd::{cache::CacheSubcommands, generate::GenerateSubcommands, watch}; +use opts::{Opts, Subcommands}; fn main() -> eyre::Result<()> { utils::load_dotenv(); diff --git a/cli/src/opts/forge.rs b/cli/src/forge/opts.rs similarity index 62% rename from cli/src/opts/forge.rs rename to cli/src/forge/opts.rs index 391c6b783c1e4..fd3f3a1f4dd8a 100644 --- a/cli/src/opts/forge.rs +++ b/cli/src/forge/opts.rs @@ -1,4 +1,4 @@ -use crate::cmd::forge::{ +use crate::cmd::{ bind::BindArgs, build::BuildArgs, cache::CacheArgs, @@ -21,13 +21,10 @@ use crate::cmd::forge::{ verify::{VerifyArgs, VerifyCheckArgs}, }; use clap::{Parser, Subcommand, ValueHint}; -use ethers::solc::{artifacts::output_selection::ContractOutputSelection, EvmVersion}; use std::path::PathBuf; -use serde::Serialize; - #[derive(Debug, Parser)] -#[clap(name = "forge", version = crate::utils::VERSION_MESSAGE)] +#[clap(name = "forge", version = foundry_cli::utils::VERSION_MESSAGE)] pub struct Opts { #[clap(subcommand)] pub sub: Subcommands, @@ -167,78 +164,3 @@ pub enum Subcommands { /// Generate scaffold files. Generate(generate::GenerateArgs), } - -// A set of solc compiler settings that can be set via command line arguments, which are intended -// to be merged into an existing `foundry_config::Config`. -// -// See also [`BuildArgs`] -#[derive(Default, Debug, Clone, Parser, Serialize)] -#[clap(next_help_heading = "Compiler options")] -pub struct CompilerArgs { - /// The target EVM version. - #[clap(long, value_name = "VERSION")] - #[serde(skip_serializing_if = "Option::is_none")] - pub evm_version: Option, - - /// Activate the Solidity optimizer. - #[clap(long)] - #[serde(skip)] - pub optimize: bool, - - /// The number of optimizer runs. - #[clap(long, value_name = "RUNS")] - #[serde(skip_serializing_if = "Option::is_none")] - pub optimizer_runs: Option, - - /// Extra output to include in the contract's artifact. - /// - /// Example keys: evm.assembly, ewasm, ir, irOptimized, metadata - /// - /// For a full description, see https://docs.soliditylang.org/en/v0.8.13/using-the-compiler.html#input-description - #[clap(long, num_args(1..), value_name = "SELECTOR")] - #[serde(skip_serializing_if = "Vec::is_empty")] - pub extra_output: Vec, - - /// Extra output to write to separate files. - /// - /// Valid values: metadata, ir, irOptimized, ewasm, evm.assembly - #[clap(long, num_args(1..), value_name = "SELECTOR")] - #[serde(skip_serializing_if = "Vec::is_empty")] - pub extra_output_files: Vec, -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn can_parse_evm_version() { - let args: CompilerArgs = - CompilerArgs::parse_from(["foundry-cli", "--evm-version", "london"]); - assert_eq!(args.evm_version, Some(EvmVersion::London)); - } - - #[test] - fn can_parse_extra_output() { - let args: CompilerArgs = - CompilerArgs::parse_from(["foundry-cli", "--extra-output", "metadata", "ir-optimized"]); - assert_eq!( - args.extra_output, - vec![ContractOutputSelection::Metadata, ContractOutputSelection::IrOptimized] - ); - } - - #[test] - fn can_parse_extra_output_files() { - let args: CompilerArgs = CompilerArgs::parse_from([ - "foundry-cli", - "--extra-output-files", - "metadata", - "ir-optimized", - ]); - assert_eq!( - args.extra_output_files, - vec![ContractOutputSelection::Metadata, ContractOutputSelection::IrOptimized] - ); - } -} diff --git a/cli/src/lib.rs b/cli/src/lib.rs index ed98e9773dae3..8779c6defe276 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -1,6 +1,4 @@ -pub mod cmd; pub mod handler; pub mod opts; pub mod stdin; -pub mod suggestions; pub mod utils; diff --git a/cli/src/cmd/forge/build/core.rs b/cli/src/opts/build/core.rs similarity index 98% rename from cli/src/cmd/forge/build/core.rs rename to cli/src/opts/build/core.rs index bc10d21f8a811..d726be2354a77 100644 --- a/cli/src/cmd/forge/build/core.rs +++ b/cli/src/opts/build/core.rs @@ -1,7 +1,5 @@ -use crate::{ - cmd::{forge::build::ProjectPathsArgs, LoadConfig}, - opts::forge::CompilerArgs, -}; +use super::ProjectPathsArgs; +use crate::{opts::CompilerArgs, utils::LoadConfig}; use clap::{Parser, ValueHint}; use ethers::solc::{ artifacts::RevertStrings, remappings::Remapping, utils::canonicalized, Project, diff --git a/cli/src/opts/build/mod.rs b/cli/src/opts/build/mod.rs new file mode 100644 index 0000000000000..0014f5bfb61f0 --- /dev/null +++ b/cli/src/opts/build/mod.rs @@ -0,0 +1,84 @@ +use clap::Parser; +use ethers::solc::{artifacts::output_selection::ContractOutputSelection, EvmVersion}; +use serde::Serialize; + +mod core; +pub use self::core::CoreBuildArgs; + +mod paths; +pub use self::paths::ProjectPathsArgs; + +// A set of solc compiler settings that can be set via command line arguments, which are intended +// to be merged into an existing `foundry_config::Config`. +// +// See also `BuildArgs`. +#[derive(Default, Debug, Clone, Parser, Serialize)] +#[clap(next_help_heading = "Compiler options")] +pub struct CompilerArgs { + /// The target EVM version. + #[clap(long, value_name = "VERSION")] + #[serde(skip_serializing_if = "Option::is_none")] + pub evm_version: Option, + + /// Activate the Solidity optimizer. + #[clap(long)] + #[serde(skip)] + pub optimize: bool, + + /// The number of optimizer runs. + #[clap(long, value_name = "RUNS")] + #[serde(skip_serializing_if = "Option::is_none")] + pub optimizer_runs: Option, + + /// Extra output to include in the contract's artifact. + /// + /// Example keys: evm.assembly, ewasm, ir, irOptimized, metadata + /// + /// For a full description, see https://docs.soliditylang.org/en/v0.8.13/using-the-compiler.html#input-description + #[clap(long, num_args(1..), value_name = "SELECTOR")] + #[serde(skip_serializing_if = "Vec::is_empty")] + pub extra_output: Vec, + + /// Extra output to write to separate files. + /// + /// Valid values: metadata, ir, irOptimized, ewasm, evm.assembly + #[clap(long, num_args(1..), value_name = "SELECTOR")] + #[serde(skip_serializing_if = "Vec::is_empty")] + pub extra_output_files: Vec, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn can_parse_evm_version() { + let args: CompilerArgs = + CompilerArgs::parse_from(["foundry-cli", "--evm-version", "london"]); + assert_eq!(args.evm_version, Some(EvmVersion::London)); + } + + #[test] + fn can_parse_extra_output() { + let args: CompilerArgs = + CompilerArgs::parse_from(["foundry-cli", "--extra-output", "metadata", "ir-optimized"]); + assert_eq!( + args.extra_output, + vec![ContractOutputSelection::Metadata, ContractOutputSelection::IrOptimized] + ); + } + + #[test] + fn can_parse_extra_output_files() { + let args: CompilerArgs = CompilerArgs::parse_from([ + "foundry-cli", + "--extra-output-files", + "metadata", + "ir-optimized", + ]); + assert_eq!( + args.extra_output_files, + vec![ContractOutputSelection::Metadata, ContractOutputSelection::IrOptimized] + ); + } +} diff --git a/cli/src/cmd/forge/build/paths.rs b/cli/src/opts/build/paths.rs similarity index 100% rename from cli/src/cmd/forge/build/paths.rs rename to cli/src/opts/build/paths.rs diff --git a/cli/src/opts/mod.rs b/cli/src/opts/mod.rs index 4eba2ef7cd810..76480f400ed84 100644 --- a/cli/src/opts/mod.rs +++ b/cli/src/opts/mod.rs @@ -1,12 +1,11 @@ -pub mod cast; -pub mod forge; - +mod build; mod chain; mod dependency; mod ethereum; mod transaction; mod wallet; +pub use build::*; pub use chain::*; pub use dependency::*; pub use ethereum::*; diff --git a/cli/src/cmd/utils.rs b/cli/src/utils/cmd.rs similarity index 97% rename from cli/src/cmd/utils.rs rename to cli/src/utils/cmd.rs index 118c4abb6a196..0e5534aa441b0 100644 --- a/cli/src/cmd/utils.rs +++ b/cli/src/utils/cmd.rs @@ -1,4 +1,3 @@ -use crate::suggestions; use ethers::{ abi::Abi, core::types::Chain, @@ -45,7 +44,7 @@ pub fn remove_contract( } else { let mut err = format!("could not find artifact: `{}`", info.name); if let Some(suggestion) = - suggestions::did_you_mean(&info.name, output.artifacts().map(|(name, _)| name)).pop() + super::did_you_mean(&info.name, output.artifacts().map(|(name, _)| name)).pop() { if suggestion != info.name { err = format!( @@ -107,7 +106,7 @@ pub fn get_cached_entry_by_name( } let mut err = format!("could not find artifact: `{name}`"); - if let Some(suggestion) = suggestions::did_you_mean(name, &alternatives).pop() { + if let Some(suggestion) = super::did_you_mean(name, &alternatives).pop() { err = format!( r#"{err} @@ -143,7 +142,7 @@ pub fn needs_setup(abi: &Abi) -> bool { setup_fns.len() == 1 && setup_fns[0].name == "setUp" } -pub(crate) fn eta_key(state: &indicatif::ProgressState, f: &mut dyn Write) { +pub fn eta_key(state: &indicatif::ProgressState, f: &mut dyn Write) { write!(f, "{:.1}s", state.eta().as_secs_f64()).unwrap() } @@ -158,7 +157,7 @@ macro_rules! init_progress { pb.set_style( indicatif::ProgressStyle::with_template(&template) .unwrap() - .with_key("eta", $crate::cmd::utils::eta_key) + .with_key("eta", $crate::utils::eta_key) .progress_chars("#>-"), ); pb diff --git a/cli/src/utils.rs b/cli/src/utils/mod.rs similarity index 99% rename from cli/src/utils.rs rename to cli/src/utils/mod.rs index 7a1080bac1fdb..d304e80e86071 100644 --- a/cli/src/utils.rs +++ b/cli/src/utils/mod.rs @@ -20,13 +20,19 @@ use tracing_error::ErrorLayer; use tracing_subscriber::prelude::*; use yansi::Paint; +mod cmd; +pub use cmd::*; + +mod suggestions; +pub use suggestions::*; + // reexport all `foundry_config::utils` #[doc(hidden)] pub use foundry_config::utils::*; /// The version message for the current program, like /// `forge 0.1.0 (f01b232bc 2022-01-22T23:28:39.493201+00:00)` -pub(crate) const VERSION_MESSAGE: &str = concat!( +pub const VERSION_MESSAGE: &str = concat!( env!("CARGO_PKG_VERSION"), " (", env!("VERGEN_GIT_SHA"), @@ -162,6 +168,7 @@ pub fn block_on(future: F) -> F::Output { /// let quiet = true; /// p_println!(!quiet => "message"); /// ``` +#[macro_export] macro_rules! p_println { ($p:expr => $($arg:tt)*) => {{ if $p { @@ -169,7 +176,6 @@ macro_rules! p_println { } }} } -pub(crate) use p_println; /// Loads a dotenv file, from the cwd and the project root, ignoring potential failure. /// diff --git a/cli/src/suggestions.rs b/cli/src/utils/suggestions.rs similarity index 100% rename from cli/src/suggestions.rs rename to cli/src/utils/suggestions.rs diff --git a/cli/tests/it/cast.rs b/cli/tests/it/cast.rs index 2773a2e02e79a..b757451ee9abc 100644 --- a/cli/tests/it/cast.rs +++ b/cli/tests/it/cast.rs @@ -1,7 +1,5 @@ //! Contains various tests for checking cast commands -use clap::CommandFactory; -use foundry_cli::opts::cast::Opts; use foundry_cli_test_utils::{ casttest, util::{OutputExt, TestCommand, TestProject}, @@ -15,15 +13,6 @@ casttest!(print_help, |_: TestProject, mut cmd: TestCommand| { cmd.assert_non_empty_stdout(); }); -// tests `--help` for all subcommand -casttest!(print_cast_subcommand_help, |_: TestProject, mut cmd: TestCommand| { - let cast = Opts::command(); - for sub_command in cast.get_subcommands() { - cmd.cast_fuse().args([sub_command.get_name(), "--help"]); - cmd.assert_non_empty_stdout(); - } -}); - // tests that the `cast block` command works correctly casttest!(latest_block, |_: TestProject, mut cmd: TestCommand| { let eth_rpc_url = next_http_rpc_endpoint(); diff --git a/cli/tests/it/cmd.rs b/cli/tests/it/cmd.rs index 4f72b89b6af22..9952df8d11bef 100644 --- a/cli/tests/it/cmd.rs +++ b/cli/tests/it/cmd.rs @@ -1,7 +1,6 @@ //! Contains various tests for checking forge's commands use crate::constants::*; -use clap::CommandFactory; use ethers::{ prelude::remappings::Remapping, solc::{ @@ -9,7 +8,6 @@ use ethers::{ ConfigurableContractArtifact, }, }; -use foundry_cli::opts::forge::Opts; use foundry_cli_test_utils::{ ethers_solc::PathStyle, forgetest, forgetest_init, @@ -30,15 +28,6 @@ forgetest!(print_help, |_: TestProject, mut cmd: TestCommand| { cmd.assert_non_empty_stdout(); }); -// tests `--help` is printed to std out for all subcommands -forgetest!(print_forge_subcommand_help, |_: TestProject, mut cmd: TestCommand| { - let forge = Opts::command(); - for sub_command in forge.get_subcommands() { - cmd.forge_fuse().args([sub_command.get_name(), "--help"]); - cmd.assert_non_empty_stdout(); - } -}); - // checks that `clean` can be invoked even if out and cache don't exist forgetest!(can_clean_non_existing, |prj: TestProject, mut cmd: TestCommand| { cmd.arg("clean"); diff --git a/cli/tests/it/main.rs b/cli/tests/it/main.rs index 6ae4c7a5e6192..18e79c26a5713 100644 --- a/cli/tests/it/main.rs +++ b/cli/tests/it/main.rs @@ -24,7 +24,7 @@ mod verify; // import forge utils as mod #[allow(unused)] -#[path = "../../src/utils.rs"] +#[path = "../../src/utils/mod.rs"] pub(crate) mod forge_utils; #[cfg(feature = "external-integration-tests")] diff --git a/evm/src/lib.rs b/evm/src/lib.rs index ada871210e912..5f6090f272700 100644 --- a/evm/src/lib.rs +++ b/evm/src/lib.rs @@ -28,7 +28,7 @@ pub mod utils; // Re-exports pub use ethers::types::Address; -pub use hashbrown::{self}; +pub use hashbrown; use revm::interpreter::{CallScheme, CreateScheme}; pub use revm::{self, primitives::HashMap}; use serde::{Deserialize, Serialize};