From f35c348fbc1cf5ea4d8142c1c121b314396795e5 Mon Sep 17 00:00:00 2001 From: zugdev Date: Sun, 17 Aug 2025 05:34:37 -0300 Subject: [PATCH 1/3] feat: storage solc version option --- crates/cast/src/cmd/storage.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/crates/cast/src/cmd/storage.rs b/crates/cast/src/cmd/storage.rs index ec8a41a616e4c..a39c9a5431a51 100644 --- a/crates/cast/src/cmd/storage.rs +++ b/crates/cast/src/cmd/storage.rs @@ -69,6 +69,10 @@ pub struct StorageArgs { #[command(flatten)] build: BuildOpts, + + /// Specify the solc version to compile with. Overrides detected version. + #[arg(long, value_parser = Version::parse)] + solc_version: Option, } impl_figment_convert_cast!(StorageArgs); @@ -161,11 +165,19 @@ impl StorageArgs { let mut project = etherscan_project(metadata, root_path)?; add_storage_layout_output(&mut project); - project.compiler = if auto_detect { - SolcCompiler::AutoDetect + // Override solc version if provided + if let Some(solc_req) = self.solc_version { + // Use user-specified version + let solc = Solc::find_or_install(&solc_req)?; + project.compiler = SolcCompiler::Specific(solc); } else { - SolcCompiler::Specific(Solc::find_or_install(&version)?) - }; + // Auto-detect or use metadata version + project.compiler = if auto_detect { + SolcCompiler::AutoDetect + } else { + SolcCompiler::Specific(Solc::find_or_install(&version)?) + }; + } // Compile let mut out = ProjectCompiler::new().quiet(true).compile(&project)?; From 44ea2858438575b5b58cc890d0e051f9d8c3ab5a Mon Sep 17 00:00:00 2001 From: zugdev Date: Tue, 2 Sep 2025 01:29:20 -0300 Subject: [PATCH 2/3] feat(cast): add storage solc version unwrapping test --- crates/cast/src/cmd/storage.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/cast/src/cmd/storage.rs b/crates/cast/src/cmd/storage.rs index 56eeea9ae490f..7188b1410b65c 100644 --- a/crates/cast/src/cmd/storage.rs +++ b/crates/cast/src/cmd/storage.rs @@ -389,4 +389,10 @@ mod tests { let key = config.get_etherscan_api_key(None).unwrap(); assert_eq!(key, "dummykey".to_string()); } + + #[test] + fn parse_solc_version_arg() { + let args = StorageArgs::parse_from(["foundry-cli", "addr.eth", "--solc-version", "0.8.10"]); + assert_eq!(args.solc_version, Some(Version::parse("0.8.10").unwrap())); + } } From 4de005821d40ae99c8ebc699e96bb0763c5644e1 Mon Sep 17 00:00:00 2001 From: zugdev Date: Tue, 2 Sep 2025 01:30:54 -0300 Subject: [PATCH 3/3] feat(cast): add valid and invalid solc versions for cast storage tests --- crates/cast/tests/cli/main.rs | 46 +++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/crates/cast/tests/cli/main.rs b/crates/cast/tests/cli/main.rs index c13727352251a..8831cbb2d2440 100644 --- a/crates/cast/tests/cli/main.rs +++ b/crates/cast/tests/cli/main.rs @@ -1905,6 +1905,52 @@ casttest!(storage, |_prj, cmd| { "#]]); }); +casttest!(storage_with_valid_solc_version_1, |_prj, cmd| { + cmd.args([ + "storage", + "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "--solc-version", + "0.8.10", + "--rpc-url", + next_http_archive_rpc_url().as_str(), + "--etherscan-api-key", + next_etherscan_api_key().as_str(), + ]) + .assert_success(); +}); + +casttest!(storage_with_valid_solc_version_2, |_prj, cmd| { + cmd.args([ + "storage", + "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "--solc-version", + "0.8.23", + "--rpc-url", + next_http_archive_rpc_url().as_str(), + "--etherscan-api-key", + next_etherscan_api_key().as_str(), + ]) + .assert_success(); +}); + +casttest!(storage_with_invalid_solc_version, |_prj, cmd| { + cmd.args([ + "storage", + "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "--solc-version", + "0.8.2", + "--rpc-url", + next_http_archive_rpc_url().as_str(), + "--etherscan-api-key", + next_etherscan_api_key().as_str(), + ]) + .assert_failure() + .stderr_eq(str![[r#" +Error: Encountered invalid solc version in contracts/Create2Deployer.sol: No solc version exists that matches the version requirement: ^0.8.9 + +"#]]); +}); + // casttest!(storage_layout_simple, |_prj, cmd| { cmd.args([