From e3230be058b1d257017809cbb06f4310cb0240cd Mon Sep 17 00:00:00 2001 From: Yash Atreya <44857776+yash-atreya@users.noreply.github.com> Date: Mon, 13 Jan 2025 16:44:40 +0530 Subject: [PATCH 1/7] fix(`config`): enable optimizer if `optimizer_runs` has been set --- crates/config/src/lib.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index f7392118d849..ea4d68943d7f 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -669,6 +669,12 @@ impl Config { add_profile(&Self::DEFAULT_PROFILE); add_profile(&config.profile); + // Ref: https://github.com/foundry-rs/foundry/issues/9665 + // Enables the optimizer if the `optimizer_runs` has been set. + let optimizer = config.optimizer(); + if optimizer.runs.is_some_and(|runs| runs > 0) && !config.optimizer { + config.optimizer = true; + } Ok(config) } From 89137a405843eb11985355a4a93a9706c5ccbb88 Mon Sep 17 00:00:00 2001 From: Yash Atreya <44857776+yash-atreya@users.noreply.github.com> Date: Mon, 13 Jan 2025 16:49:59 +0530 Subject: [PATCH 2/7] test --- crates/forge/tests/cli/config.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/crates/forge/tests/cli/config.rs b/crates/forge/tests/cli/config.rs index e4c8e25a7ca1..e2f2d9bd9f19 100644 --- a/crates/forge/tests/cli/config.rs +++ b/crates/forge/tests/cli/config.rs @@ -486,6 +486,17 @@ forgetest!(can_set_optimizer_runs, |prj, cmd| { assert_eq!(config.optimizer_runs, 300); }); +// +forgetest!(enable_optimizer_when_runs_set, |prj, cmd| { + // explicitly set optimizer runs + let config = Config { optimizer_runs: 1337, ..Default::default() }; + assert!(!config.optimizer); + prj.write_config(config); + + let config = cmd.config(); + assert!(config.optimizer); +}); + // test that gas_price can be set forgetest!(can_set_gas_price, |prj, cmd| { // explicitly set gas_price From a039774bb82532b2bec9c03eac54f445c55e53d9 Mon Sep 17 00:00:00 2001 From: Yash Atreya <44857776+yash-atreya@users.noreply.github.com> Date: Mon, 13 Jan 2025 17:56:31 +0530 Subject: [PATCH 3/7] fix(`config`): change optimizer properties to Option --- crates/config/src/lib.rs | 25 ++++++++++--------- crates/forge/tests/cli/build.rs | 6 ++--- crates/forge/tests/cli/cmd.rs | 30 +++++++++++------------ crates/forge/tests/cli/config.rs | 18 +++++++------- crates/forge/tests/cli/script.rs | 2 +- crates/forge/tests/cli/test_cmd.rs | 18 +++++++------- crates/forge/tests/cli/verify_bytecode.rs | 30 +++++++++++------------ crates/forge/tests/it/fuzz.rs | 4 +-- crates/forge/tests/it/inline.rs | 2 +- crates/forge/tests/it/invariant.rs | 4 +-- crates/forge/tests/it/test_helpers.rs | 4 +-- crates/script/src/verify.rs | 7 ++++-- crates/verify/src/etherscan/mod.rs | 6 +++-- crates/verify/src/utils.rs | 13 +++++++--- 14 files changed, 91 insertions(+), 78 deletions(-) diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index ea4d68943d7f..f1bc658b1113 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -237,7 +237,7 @@ pub struct Config { /// install it pub offline: bool, /// Whether to activate optimizer - pub optimizer: bool, + pub optimizer: Option, /// The number of runs specifies roughly how often each opcode of the deployed code will be /// executed across the life-time of the contract. This means it is a trade-off parameter /// between code size (deploy cost) and code execution cost (cost after deployment). @@ -248,7 +248,7 @@ pub struct Config { /// A common misconception is that this parameter specifies the number of iterations of the /// optimizer. This is not true: The optimizer will always run as many times as it can /// still improve the code. - pub optimizer_runs: usize, + pub optimizer_runs: Option, /// Switch optimizer components on or off in detail. /// The "enabled" switch above provides two defaults which can be /// tweaked here. If "details" is given, "enabled" can be omitted. @@ -672,9 +672,12 @@ impl Config { // Ref: https://github.com/foundry-rs/foundry/issues/9665 // Enables the optimizer if the `optimizer_runs` has been set. let optimizer = config.optimizer(); - if optimizer.runs.is_some_and(|runs| runs > 0) && !config.optimizer { - config.optimizer = true; - } + if optimizer.runs.is_some_and(|runs| runs > 0) && optimizer.enabled.is_none() { + config.optimizer = Some(true); + } else if optimizer.runs.is_none() && optimizer.enabled.is_some_and(|enabled| enabled) { + // Default optimizer runs set to 200 if `optimizer = true`. + config.optimizer_runs = Some(200); + }; Ok(config) } @@ -1472,8 +1475,8 @@ impl Config { /// and pub fn optimizer(&self) -> Optimizer { Optimizer { - enabled: Some(self.optimizer), - runs: Some(self.optimizer_runs), + enabled: self.optimizer, + runs: self.optimizer_runs, // we always set the details because `enabled` is effectively a specific details profile // that can still be modified details: self.optimizer_details.clone(), @@ -2304,8 +2307,8 @@ impl Default for Config { vyper: Default::default(), auto_detect_solc: true, offline: false, - optimizer: false, - optimizer_runs: 200, + optimizer: None, + optimizer_runs: None, optimizer_details: None, model_checker: None, extra_output: Default::default(), @@ -4072,8 +4075,8 @@ mod tests { assert_eq!(config.fuzz.runs, 420); assert_eq!(config.invariant.depth, 20); assert_eq!(config.fork_block_number, Some(100)); - assert_eq!(config.optimizer_runs, 999); - assert!(!config.optimizer); + assert_eq!(config.optimizer_runs, Some(999)); + assert!(config.optimizer.is_none()); Ok(()) }); diff --git a/crates/forge/tests/cli/build.rs b/crates/forge/tests/cli/build.rs index 15d630f857ba..7c9355471d15 100644 --- a/crates/forge/tests/cli/build.rs +++ b/crates/forge/tests/cli/build.rs @@ -72,7 +72,7 @@ contract Dummy { }); forgetest!(initcode_size_exceeds_limit, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.add_source("LargeContract", generate_large_contract(5450).as_str()).unwrap(); cmd.args(["build", "--sizes"]).assert_failure().stdout_eq(str![[r#" [COMPILING_FILES] with [SOLC_VERSION] @@ -104,7 +104,7 @@ Compiler run successful! }); forgetest!(initcode_size_limit_can_be_ignored, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.add_source("LargeContract", generate_large_contract(5450).as_str()).unwrap(); cmd.args(["build", "--sizes", "--ignore-eip-3860"]).assert_success().stdout_eq(str![[r#" [COMPILING_FILES] with [SOLC_VERSION] @@ -151,7 +151,7 @@ Compiler run successful! // tests build output is as expected forgetest_init!(build_sizes_no_forge_std, |prj, cmd| { prj.write_config(Config { - optimizer: true, + optimizer: Some(true), solc: Some(foundry_config::SolcReq::Version(semver::Version::new(0, 8, 27))), ..Default::default() }); diff --git a/crates/forge/tests/cli/cmd.rs b/crates/forge/tests/cli/cmd.rs index 4941a6ea5e61..f0774a36802a 100644 --- a/crates/forge/tests/cli/cmd.rs +++ b/crates/forge/tests/cli/cmd.rs @@ -1573,7 +1573,7 @@ forgetest!(gas_report_all_contracts, |prj, cmd| { // report for all prj.write_config(Config { - optimizer: true, + optimizer: Some(true), gas_reports: (vec!["*".to_string()]), gas_reports_ignore: (vec![]), ..Default::default() @@ -1683,7 +1683,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) .is_json(), ); - prj.write_config(Config { optimizer: true, gas_reports: (vec![]), ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), gas_reports: (vec![]), ..Default::default() }); cmd.forge_fuse().arg("test").arg("--gas-report").assert_success().stdout_eq(str![[r#" ... ╭----------------------------------------+-----------------+-------+--------+-------+---------╮ @@ -1789,7 +1789,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) ); prj.write_config(Config { - optimizer: true, + optimizer: Some(true), gas_reports: (vec!["*".to_string()]), ..Default::default() }); @@ -1898,7 +1898,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) ); prj.write_config(Config { - optimizer: true, + optimizer: Some(true), gas_reports: (vec![ "ContractOne".to_string(), "ContractTwo".to_string(), @@ -2017,7 +2017,7 @@ forgetest!(gas_report_some_contracts, |prj, cmd| { // report for One prj.write_config(Config { - optimizer: true, + optimizer: Some(true), gas_reports: vec!["ContractOne".to_string()], ..Default::default() }); @@ -2068,7 +2068,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) // report for Two prj.write_config(Config { - optimizer: true, + optimizer: Some(true), gas_reports: vec!["ContractTwo".to_string()], ..Default::default() }); @@ -2119,7 +2119,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) // report for Three prj.write_config(Config { - optimizer: true, + optimizer: Some(true), gas_reports: vec!["ContractThree".to_string()], ..Default::default() }); @@ -2175,7 +2175,7 @@ forgetest!(gas_report_ignore_some_contracts, |prj, cmd| { // ignore ContractOne prj.write_config(Config { - optimizer: true, + optimizer: Some(true), gas_reports: (vec!["*".to_string()]), gas_reports_ignore: (vec!["ContractOne".to_string()]), ..Default::default() @@ -2258,7 +2258,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) // ignore ContractTwo cmd.forge_fuse(); prj.write_config(Config { - optimizer: true, + optimizer: Some(true), gas_reports: (vec![]), gas_reports_ignore: (vec!["ContractTwo".to_string()]), ..Default::default() @@ -2345,7 +2345,7 @@ Ran 3 test suites [ELAPSED]: 3 tests passed, 0 failed, 0 skipped (3 total tests) // indicating the "double listing". cmd.forge_fuse(); prj.write_config(Config { - optimizer: true, + optimizer: Some(true), gas_reports: (vec![ "ContractOne".to_string(), "ContractTwo".to_string(), @@ -2479,7 +2479,7 @@ Warning: ContractThree is listed in both 'gas_reports' and 'gas_reports_ignore'. }); forgetest!(gas_report_flatten_multiple_selectors, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.insert_ds_test(); prj.add_source( "Counter.sol", @@ -2598,7 +2598,7 @@ Ran 1 test suite [ELAPSED]: 1 tests passed, 0 failed, 0 skipped (1 total tests) // forgetest_init!(gas_report_with_fallback, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.add_test( "DelegateProxyTest.sol", r#" @@ -2742,7 +2742,7 @@ Ran 1 test suite [ELAPSED]: 1 tests passed, 0 failed, 0 skipped (1 total tests) // forgetest_init!(gas_report_size_for_nested_create, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.add_test( "NestedDeployTest.sol", r#" @@ -3181,7 +3181,7 @@ Error: No source files found in specified build paths. // checks that build --sizes includes all contracts even if unchanged forgetest_init!(can_build_sizes_repeatedly, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.clear_cache(); cmd.args(["build", "--sizes"]).assert_success().stdout_eq(str![[r#" @@ -3248,7 +3248,7 @@ interface Counter { // checks that `clean` also works with the "out" value set in Config forgetest_init!(gas_report_include_tests, |prj, cmd| { prj.write_config(Config { - optimizer: true, + optimizer: Some(true), gas_reports_include_tests: true, fuzz: FuzzConfig { runs: 1, ..Default::default() }, ..Default::default() diff --git a/crates/forge/tests/cli/config.rs b/crates/forge/tests/cli/config.rs index e2f2d9bd9f19..97174bed291f 100644 --- a/crates/forge/tests/cli/config.rs +++ b/crates/forge/tests/cli/config.rs @@ -50,8 +50,8 @@ forgetest!(can_extract_config_values, |prj, cmd| { auto_detect_solc: false, auto_detect_remappings: true, offline: true, - optimizer: false, - optimizer_runs: 1000, + optimizer: Some(false), + optimizer_runs: Some(1000), optimizer_details: Some(OptimizerDetails { yul: Some(false), yul_details: Some(YulDetails { stack_allocation: Some(true), ..Default::default() }), @@ -426,7 +426,7 @@ Compiler run successful! // test to ensure yul optimizer can be set as intended forgetest!(can_set_yul_optimizer, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.add_source( "foo.sol", r" @@ -476,25 +476,25 @@ forgetest_init!(can_parse_dapp_libraries, |_prj, cmd| { // test that optimizer runs works forgetest!(can_set_optimizer_runs, |prj, cmd| { // explicitly set optimizer runs - let config = Config { optimizer_runs: 1337, ..Default::default() }; + let config = Config { optimizer_runs: Some(1337), ..Default::default() }; prj.write_config(config); let config = cmd.config(); - assert_eq!(config.optimizer_runs, 1337); + assert_eq!(config.optimizer_runs, Some(1337)); let config = prj.config_from_output(["--optimizer-runs", "300"]); - assert_eq!(config.optimizer_runs, 300); + assert_eq!(config.optimizer_runs, Some(300)); }); // forgetest!(enable_optimizer_when_runs_set, |prj, cmd| { // explicitly set optimizer runs - let config = Config { optimizer_runs: 1337, ..Default::default() }; - assert!(!config.optimizer); + let config = Config { optimizer_runs: Some(1337), ..Default::default() }; + assert!(config.optimizer.is_none()); prj.write_config(config); let config = cmd.config(); - assert!(config.optimizer); + assert!(config.optimizer.is_some_and(|enabled| enabled)); }); // test that gas_price can be set diff --git a/crates/forge/tests/cli/script.rs b/crates/forge/tests/cli/script.rs index bfd7fde8f371..38360648e04b 100644 --- a/crates/forge/tests/cli/script.rs +++ b/crates/forge/tests/cli/script.rs @@ -1926,7 +1926,7 @@ forgetest_async!(adheres_to_json_flag, |prj, cmd| { } foundry_test_utils::util::initialize(prj.root()); - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.add_script( "Foo", r#" diff --git a/crates/forge/tests/cli/test_cmd.rs b/crates/forge/tests/cli/test_cmd.rs index f19eefeb92b9..de066297fd93 100644 --- a/crates/forge/tests/cli/test_cmd.rs +++ b/crates/forge/tests/cli/test_cmd.rs @@ -591,7 +591,7 @@ Ran 1 test suite [ELAPSED]: 1 tests passed, 0 failed, 0 skipped (1 total tests) // https://github.com/foundry-rs/foundry/issues/6579 forgetest_init!(include_custom_types_in_traces, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.wipe_contracts(); prj.add_test( @@ -959,7 +959,7 @@ contract SetupFailureTest is Test { // https://github.com/foundry-rs/foundry/issues/7530 forgetest_init!(should_show_precompile_labels, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.wipe_contracts(); prj.add_test( @@ -1417,7 +1417,7 @@ contract DeterministicRandomnessTest is Test { // Tests that `pauseGasMetering` used at the end of test does not produce meaningless values. // https://github.com/foundry-rs/foundry/issues/5491 forgetest_init!(gas_metering_pause_last_call, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.wipe_contracts(); prj.add_test( @@ -1503,7 +1503,7 @@ Ran 1 test suite [ELAPSED]: 1 tests passed, 0 failed, 0 skipped (1 total tests) // https://github.com/foundry-rs/foundry/issues/4523 forgetest_init!(gas_metering_gasleft, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.wipe_contracts(); prj.add_test( @@ -1582,7 +1582,7 @@ contract ATest is Test { // tests `pauseTracing` and `resumeTracing` functions #[cfg(not(feature = "isolate-by-default"))] forgetest_init!(pause_tracing, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.wipe_contracts(); prj.insert_ds_test(); prj.insert_vm(); @@ -2331,7 +2331,7 @@ Logs: // forgetest_init!(metadata_bytecode_traces, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.add_source( "ParentProxy.sol", r#" @@ -2454,7 +2454,7 @@ forgetest_async!(can_get_broadcast_txs, |prj, cmd| { let (_api, handle) = spawn(NodeConfig::test().silent()).await; - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.insert_vm(); prj.insert_ds_test(); prj.insert_console(); @@ -2703,7 +2703,7 @@ Suite result: FAILED. 0 passed; 1 failed; 0 skipped; [ELAPSED] // Tests that test traces display state changes when running with verbosity. #[cfg(not(feature = "isolate-by-default"))] forgetest_init!(should_show_state_changes, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); cmd.args(["test", "--mt", "test_Increment", "-vvvvv"]).assert_success().stdout_eq(str![[r#" ... @@ -2764,7 +2764,7 @@ Encountered a total of 1 failing tests, 0 tests succeeded // Tests that `start/stopAndReturn` debugTraceRecording does not panic when running with // verbosity > 3. forgetest_init!(should_not_panic_on_debug_trace_verbose, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.add_test( "DebugTraceRecordingTest.t.sol", r#" diff --git a/crates/forge/tests/cli/verify_bytecode.rs b/crates/forge/tests/cli/verify_bytecode.rs index 6e89f1e940f7..68d1035601c4 100644 --- a/crates/forge/tests/cli/verify_bytecode.rs +++ b/crates/forge/tests/cli/verify_bytecode.rs @@ -144,8 +144,8 @@ forgetest_async!(can_verify_bytecode_no_metadata, |prj, cmd| { None, Config { evm_version: EvmVersion::London, - optimizer_runs: 999999, - optimizer: true, + optimizer_runs: Some(999999), + optimizer: Some(true), cbor_metadata: false, bytecode_hash: BytecodeHash::None, ..Default::default() @@ -165,8 +165,8 @@ forgetest_async!(can_verify_bytecode_with_metadata, |prj, cmd| { None, Config { evm_version: EvmVersion::Paris, - optimizer_runs: 50000, - optimizer: true, + optimizer_runs: Some(50000), + optimizer: Some(true), ..Default::default() }, "etherscan", @@ -185,8 +185,8 @@ forgetest_async!(can_verify_bytecode_with_blockscout, |prj, cmd| { None, Config { evm_version: EvmVersion::London, - optimizer: true, - optimizer_runs: 200, + optimizer: Some(true), + optimizer_runs: Some(200), ..Default::default() }, "blockscout", @@ -205,8 +205,8 @@ forgetest_async!(can_vb_create2_with_blockscout, |prj, cmd| { None, Config { evm_version: EvmVersion::London, - optimizer_runs: 999999, - optimizer: true, + optimizer_runs: Some(999999), + optimizer: Some(true), cbor_metadata: false, bytecode_hash: BytecodeHash::None, ..Default::default() @@ -232,8 +232,8 @@ forgetest_async!(can_verify_bytecode_with_constructor_args, |prj, cmd| { Some(constructor_args), Config { evm_version: EvmVersion::London, - optimizer: true, - optimizer_runs: 200, + optimizer: Some(true), + optimizer_runs: Some(200), ..Default::default() }, "etherscan", @@ -251,8 +251,8 @@ forgetest_async!(can_ignore_creation, |prj, cmd| { "SystemConfig", Config { evm_version: EvmVersion::London, - optimizer_runs: 999999, - optimizer: true, + optimizer_runs: Some(999999), + optimizer: Some(true), cbor_metadata: false, bytecode_hash: BytecodeHash::None, ..Default::default() @@ -273,8 +273,8 @@ forgetest_async!(can_ignore_runtime, |prj, cmd| { "SystemConfig", Config { evm_version: EvmVersion::London, - optimizer_runs: 999999, - optimizer: true, + optimizer_runs: Some(999999), + optimizer: Some(true), cbor_metadata: false, bytecode_hash: BytecodeHash::None, ..Default::default() @@ -298,7 +298,7 @@ forgetest_async!(can_ignore_runtime, |prj, cmd| { // "WETH9", // Config { // evm_version: EvmVersion::default(), -// optimizer: true, +// optimizer: Some(true), // optimizer_runs: 10000, // cbor_metadata: true, // bytecode_hash: BytecodeHash::Bzzr1, diff --git a/crates/forge/tests/it/fuzz.rs b/crates/forge/tests/it/fuzz.rs index 627232df9bc5..30b34dcd9df1 100644 --- a/crates/forge/tests/it/fuzz.rs +++ b/crates/forge/tests/it/fuzz.rs @@ -118,7 +118,7 @@ async fn test_persist_fuzz_failure() { () => { run_fail!(|config| {}) }; (|$config:ident| $e:expr) => {{ let mut runner = TEST_DATA_DEFAULT.runner_with(|$config| { - $config.optimizer = true; + $config.optimizer = Some(true); $config.fuzz.runs = 1000; $e }); @@ -163,7 +163,7 @@ async fn test_persist_fuzz_failure() { } forgetest_init!(test_can_scrape_bytecode, |prj, cmd| { - prj.write_config(Config { optimizer: true, ..Default::default() }); + prj.write_config(Config { optimizer: Some(true), ..Default::default() }); prj.add_source( "FuzzerDict.sol", r#" diff --git a/crates/forge/tests/it/inline.rs b/crates/forge/tests/it/inline.rs index 0a1956c456bf..991c556c7d68 100644 --- a/crates/forge/tests/it/inline.rs +++ b/crates/forge/tests/it/inline.rs @@ -8,7 +8,7 @@ use foundry_test_utils::Filter; async fn inline_config_run_fuzz() { let filter = Filter::new(".*", ".*", ".*inline/FuzzInlineConf.t.sol"); let mut runner = TEST_DATA_DEFAULT.runner_with(|config| { - config.optimizer = true; + config.optimizer = Some(true); }); let result = runner.test_collect(&filter); let results = result diff --git a/crates/forge/tests/it/invariant.rs b/crates/forge/tests/it/invariant.rs index fc58805b4878..df0cba011148 100644 --- a/crates/forge/tests/it/invariant.rs +++ b/crates/forge/tests/it/invariant.rs @@ -263,7 +263,7 @@ async fn test_invariant_shrink() { let filter = Filter::new(".*", ".*", ".*fuzz/invariant/common/InvariantInnerContract.t.sol"); let mut runner = TEST_DATA_DEFAULT.runner_with(|config| { config.fuzz.seed = Some(U256::from(119u32)); - config.optimizer = true; + config.optimizer = Some(true); }); match get_counterexample!(runner, &filter) { @@ -796,7 +796,7 @@ contract AssumeTest is Test { // forgetest_init!(should_revert_with_assume_code, |prj, cmd| { let config = Config { - optimizer: true, + optimizer: Some(true), invariant: { InvariantConfig { fail_on_revert: true, max_assume_rejects: 10, ..Default::default() } }, diff --git a/crates/forge/tests/it/test_helpers.rs b/crates/forge/tests/it/test_helpers.rs index 68fb231f9da9..3488eca2fedf 100644 --- a/crates/forge/tests/it/test_helpers.rs +++ b/crates/forge/tests/it/test_helpers.rs @@ -89,8 +89,8 @@ impl ForgeTestProfile { config.prompt_timeout = 0; - config.optimizer = true; - config.optimizer_runs = 200; + config.optimizer = Some(true); + config.optimizer_runs = Some(200); config.gas_limit = u64::MAX.into(); config.chain = None; diff --git a/crates/script/src/verify.rs b/crates/script/src/verify.rs index eeeee3d1153a..bd8a79536c03 100644 --- a/crates/script/src/verify.rs +++ b/crates/script/src/verify.rs @@ -63,8 +63,11 @@ impl VerifyBundle { retry: RetryArgs, verifier: VerifierArgs, ) -> Self { - let num_of_optimizations = - if config.optimizer { Some(config.optimizer_runs) } else { None }; + let num_of_optimizations = if config.optimizer.is_some_and(|enabled| enabled) { + config.optimizer_runs + } else { + None + }; let config_path = config.get_config_path(); diff --git a/crates/verify/src/etherscan/mod.rs b/crates/verify/src/etherscan/mod.rs index 26832e3b4ab5..6ac50e9c70df 100644 --- a/crates/verify/src/etherscan/mod.rs +++ b/crates/verify/src/etherscan/mod.rs @@ -324,8 +324,10 @@ impl EtherscanVerificationProvider { if code_format == CodeFormat::SingleFile { verify_args = if let Some(optimizations) = args.num_of_optimizations { verify_args.optimized().runs(optimizations as u32) - } else if context.config.optimizer { - verify_args.optimized().runs(context.config.optimizer_runs.try_into()?) + } else if context.config.optimizer.is_some_and(|enabled| enabled) { + verify_args + .optimized() + .runs(context.config.optimizer_runs.unwrap_or(200).try_into()?) } else { verify_args.not_optimized() }; diff --git a/crates/verify/src/utils.rs b/crates/verify/src/utils.rs index 2f5a1fb8be99..d41df304a4c8 100644 --- a/crates/verify/src/utils.rs +++ b/crates/verify/src/utils.rs @@ -237,18 +237,23 @@ fn find_mismatch_in_settings( ); mismatches.push(str); } - let local_optimizer: u64 = if local_settings.optimizer { 1 } else { 0 }; + let local_optimizer: u64 = + if local_settings.optimizer.is_some_and(|enabled| enabled) { 1 } else { 0 }; if etherscan_settings.optimization_used != local_optimizer { let str = format!( "Optimizer mismatch: local={}, onchain={}", - local_settings.optimizer, etherscan_settings.optimization_used + local_settings.optimizer.unwrap_or(false), + etherscan_settings.optimization_used ); mismatches.push(str); } - if etherscan_settings.runs != local_settings.optimizer_runs as u64 { + if local_settings.optimizer_runs.is_some_and(|runs| etherscan_settings.runs != runs as u64) || + (local_settings.optimizer_runs.is_none() && etherscan_settings.runs > 0) + { let str = format!( "Optimizer runs mismatch: local={}, onchain={}", - local_settings.optimizer_runs, etherscan_settings.runs + local_settings.optimizer_runs.unwrap(), + etherscan_settings.runs ); mismatches.push(str); } From f855e0c3813ce5adbf7efeba74ccce5455bbdf72 Mon Sep 17 00:00:00 2001 From: Yash Atreya <44857776+yash-atreya@users.noreply.github.com> Date: Mon, 13 Jan 2025 18:09:25 +0530 Subject: [PATCH 4/7] fix --- crates/config/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index f1bc658b1113..baf16036cf03 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -4076,7 +4076,7 @@ mod tests { assert_eq!(config.invariant.depth, 20); assert_eq!(config.fork_block_number, Some(100)); assert_eq!(config.optimizer_runs, Some(999)); - assert!(config.optimizer.is_none()); + assert!(config.optimizer.is_some_and(|enabled| !enabled)); Ok(()) }); From 4576284f528273fc111149745d3b12ffd286fd73 Mon Sep 17 00:00:00 2001 From: Yash Atreya <44857776+yash-atreya@users.noreply.github.com> Date: Mon, 13 Jan 2025 18:35:43 +0530 Subject: [PATCH 5/7] nit Co-authored-by: DaniPopes <57450786+DaniPopes@users.noreply.github.com> --- crates/verify/src/etherscan/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/verify/src/etherscan/mod.rs b/crates/verify/src/etherscan/mod.rs index 6ac50e9c70df..7c6da1e1cb33 100644 --- a/crates/verify/src/etherscan/mod.rs +++ b/crates/verify/src/etherscan/mod.rs @@ -324,7 +324,7 @@ impl EtherscanVerificationProvider { if code_format == CodeFormat::SingleFile { verify_args = if let Some(optimizations) = args.num_of_optimizations { verify_args.optimized().runs(optimizations as u32) - } else if context.config.optimizer.is_some_and(|enabled| enabled) { + } else if context.config.optimizer == Some(true) { verify_args .optimized() .runs(context.config.optimizer_runs.unwrap_or(200).try_into()?) From c791f31de2c08dc2c9afa64df4f4b41f7073c39b Mon Sep 17 00:00:00 2001 From: Yash Atreya <44857776+yash-atreya@users.noreply.github.com> Date: Mon, 13 Jan 2025 18:44:37 +0530 Subject: [PATCH 6/7] fix --- crates/config/src/lib.rs | 2 +- crates/forge/tests/cli/config.rs | 12 +++++++++++- crates/script/src/verify.rs | 2 +- crates/verify/src/utils.rs | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index baf16036cf03..c7762fe6a5bf 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -4076,7 +4076,7 @@ mod tests { assert_eq!(config.invariant.depth, 20); assert_eq!(config.fork_block_number, Some(100)); assert_eq!(config.optimizer_runs, Some(999)); - assert!(config.optimizer.is_some_and(|enabled| !enabled)); + assert!(!config.optimizer.unwrap()); Ok(()) }); diff --git a/crates/forge/tests/cli/config.rs b/crates/forge/tests/cli/config.rs index 97174bed291f..4035158ba7a1 100644 --- a/crates/forge/tests/cli/config.rs +++ b/crates/forge/tests/cli/config.rs @@ -494,7 +494,17 @@ forgetest!(enable_optimizer_when_runs_set, |prj, cmd| { prj.write_config(config); let config = cmd.config(); - assert!(config.optimizer.is_some_and(|enabled| enabled)); + assert!(config.optimizer.unwrap()); +}); + +// test `optimizer_runs` set to 200 by default if optimizer enabled +forgetest!(optimizer_runs_default, |prj, cmd| { + // explicitly set optimizer runs + let config = Config { optimizer: Some(true), ..Default::default() }; + prj.write_config(config); + + let config = cmd.config(); + assert_eq!(config.optimizer_runs, Some(200)); }); // test that gas_price can be set diff --git a/crates/script/src/verify.rs b/crates/script/src/verify.rs index bd8a79536c03..0e3bfd2643a9 100644 --- a/crates/script/src/verify.rs +++ b/crates/script/src/verify.rs @@ -63,7 +63,7 @@ impl VerifyBundle { retry: RetryArgs, verifier: VerifierArgs, ) -> Self { - let num_of_optimizations = if config.optimizer.is_some_and(|enabled| enabled) { + let num_of_optimizations = if config.optimizer == Some(true) { config.optimizer_runs } else { None diff --git a/crates/verify/src/utils.rs b/crates/verify/src/utils.rs index d41df304a4c8..6027ae223759 100644 --- a/crates/verify/src/utils.rs +++ b/crates/verify/src/utils.rs @@ -238,7 +238,7 @@ fn find_mismatch_in_settings( mismatches.push(str); } let local_optimizer: u64 = - if local_settings.optimizer.is_some_and(|enabled| enabled) { 1 } else { 0 }; + if local_settings.optimizer == Some(true) { 1 } else { 0 }; if etherscan_settings.optimization_used != local_optimizer { let str = format!( "Optimizer mismatch: local={}, onchain={}", From 08db9a1dea69891624658773d14f36c21fc5194b Mon Sep 17 00:00:00 2001 From: Yash Atreya <44857776+yash-atreya@users.noreply.github.com> Date: Mon, 13 Jan 2025 18:46:50 +0530 Subject: [PATCH 7/7] nit --- crates/script/src/verify.rs | 7 ++----- crates/verify/src/utils.rs | 3 +-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/crates/script/src/verify.rs b/crates/script/src/verify.rs index 0e3bfd2643a9..5c21e4f7ef1e 100644 --- a/crates/script/src/verify.rs +++ b/crates/script/src/verify.rs @@ -63,11 +63,8 @@ impl VerifyBundle { retry: RetryArgs, verifier: VerifierArgs, ) -> Self { - let num_of_optimizations = if config.optimizer == Some(true) { - config.optimizer_runs - } else { - None - }; + let num_of_optimizations = + if config.optimizer == Some(true) { config.optimizer_runs } else { None }; let config_path = config.get_config_path(); diff --git a/crates/verify/src/utils.rs b/crates/verify/src/utils.rs index 6027ae223759..132f0218f8d7 100644 --- a/crates/verify/src/utils.rs +++ b/crates/verify/src/utils.rs @@ -237,8 +237,7 @@ fn find_mismatch_in_settings( ); mismatches.push(str); } - let local_optimizer: u64 = - if local_settings.optimizer == Some(true) { 1 } else { 0 }; + let local_optimizer: u64 = if local_settings.optimizer == Some(true) { 1 } else { 0 }; if etherscan_settings.optimization_used != local_optimizer { let str = format!( "Optimizer mismatch: local={}, onchain={}",