diff --git a/crates/zksync/compilers/src/compilers/zksolc/mod.rs b/crates/zksync/compilers/src/compilers/zksolc/mod.rs index 615991943..35fecfc06 100644 --- a/crates/zksync/compilers/src/compilers/zksolc/mod.rs +++ b/crates/zksync/compilers/src/compilers/zksolc/mod.rs @@ -40,7 +40,7 @@ pub const ZKSOLC: &str = "zksolc"; /// ZKsync solc release used for all ZKsync solc versions pub const ZKSYNC_SOLC_RELEASE: Version = Version::new(1, 0, 1); /// Default zksolc version -pub const ZKSOLC_VERSION: Version = Version::new(1, 5, 10); +pub const ZKSOLC_VERSION: Version = Version::new(1, 5, 9); #[cfg(test)] macro_rules! take_solc_installer_lock { @@ -151,7 +151,11 @@ impl Compiler for ZkSolcCompiler { ) -> Result> { let zksolc = self.zksolc(input)?; + println!("paso por aca 1"); + let mut zk_output = zksolc.compile(&input.input)?; + println!("zk_output {:?}", zk_output); + let mut metadata = BTreeMap::new(); if let Some(solc_version) = zk_output.version.take() { metadata.insert("solcVersion".to_string(), solc_version.into()); diff --git a/crates/zksync/compilers/src/compilers/zksolc/settings.rs b/crates/zksync/compilers/src/compilers/zksolc/settings.rs index 4866618c7..7f804fb77 100644 --- a/crates/zksync/compilers/src/compilers/zksolc/settings.rs +++ b/crates/zksync/compilers/src/compilers/zksolc/settings.rs @@ -225,6 +225,8 @@ impl CompilerSettings for ZkSolcSettings { .. } = self; + println!("ybue: zksolc_version: {:?}", self.zksolc_version); + *via_ir == other.settings.via_ir && *remappings == other.settings.remappings && *evm_version == other.settings.evm_version && diff --git a/crates/zksync/compilers/tests/zksync_tests.rs b/crates/zksync/compilers/tests/zksync_tests.rs index aa49cf6f0..d8de00315 100644 --- a/crates/zksync/compilers/tests/zksync_tests.rs +++ b/crates/zksync/compilers/tests/zksync_tests.rs @@ -5,6 +5,7 @@ use std::{ str::FromStr, }; +use foundry_compilers::ProjectCompileOutput; use foundry_compilers_artifacts_solc::Remapping; use foundry_test_utils::foundry_compilers::{ buildinfo::BuildInfo, cache::CompilerCache, project_util::*, resolver::parse::SolData, @@ -58,6 +59,7 @@ fn test_zksync_can_compile_contract_with_suppressed_errors(compiler: ZkSolcCompi // .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) // .try_init() // .ok(); + let mut project = TempProject::::dapptools().unwrap(); project.project_mut().compiler = compiler; @@ -78,16 +80,59 @@ fn test_zksync_can_compile_contract_with_suppressed_errors(compiler: ZkSolcCompi .unwrap(); let compiled = project.compile().unwrap(); + assert!(compiled.has_compiler_errors()); project.project_mut().settings.settings.suppressed_errors = HashSet::from([ErrorType::SendTransfer]); let compiled = project.compile().unwrap(); + + let cache = CompilerCache::::read(project.cache_path()).unwrap(); + print!("CAAACHEE {:?}", cache); + compiled.assert_success(); assert!(compiled.find_first("Erroneous").is_some()); } +fn test_zksync_can_compile_with_version( + project: &mut TempProject, + compiler: ZkSolcCompiler, +) -> ProjectCompileOutput { + // let _ = tracing_subscriber::fmt() + // .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) + // .try_init() + // .ok(); + + project.project_mut().compiler = compiler; + + project + .add_source( + "A", + r#" +pragma solidity ^0.8.10; +import "./B.sol"; +contract A { } +"#, + ) + .unwrap(); + + project + .add_source( + "B", + r" +pragma solidity ^0.8.10; +contract B { } +", + ) + .unwrap(); + + project.project_mut().settings.settings.suppressed_errors = + HashSet::from([ErrorType::SendTransfer]); + + project.compile().unwrap() +} + #[test] fn zksync_can_compile_contract_with_suppressed_errors() { test_zksync_can_compile_contract_with_suppressed_errors(ZkSolcCompiler::default()); @@ -657,68 +702,152 @@ fn zksync_can_compile_yul_sample() { assert!(!yul_bytecode.is_empty(), "SimpleStore bytecode is empty"); } -forgetest_init!(test_zk_cache_ok, |prj, cmd| { - let zk_toml = r#"[profile.default] -src = 'src' -out = 'out' -libs = ['lib'] -solc = '0.8.26' - -[profile.default.zksync] -zksolc = '1.5.6' -"#; - - fs::write(prj.root().join("foundry.toml"), zk_toml).unwrap(); - - cmd.args(["build", "--zksync"]); - let stdout_1 = cmd.assert_success().get_output().stdout_lossy(); - let pattern_1 = Regex::new(r"Compiler run successful").unwrap(); - - let stdout_2 = cmd.assert_success().get_output().stdout_lossy(); - let pattern_2 = Regex::new(r"No files changed, compilation skipped").unwrap(); - - assert!(pattern_1.is_match(&stdout_1)); - assert!(pattern_2.is_match(&stdout_2)); -}); - -// tests cache is invalidated when zksolc version changes -forgetest_init!(test_zk_cache_invalid_on_version_changed, |prj, cmd| { - let template_toml = r#"[profile.default] -src = 'src' -out = 'out' -libs = ['lib'] -solc = '0.8.26' - -[profile.default.zksync] -"#; - - let toml_156 = format!( - r#"{template_toml} -zksolc = '1.5.6' -"# - ); +// forgetest_init!(test_zk_cache_ok, |prj, cmd| { +// let zk_toml = r#"[profile.default] +// src = 'src' +// out = 'out' +// libs = ['lib'] +// solc = '0.8.26' - let toml_157 = format!( - r#"{template_toml} -zksolc = '1.5.7' -"# - ); +// [profile.default.zksync] +// zksolc = '1.5.6' +// "#; + +// fs::write(prj.root().join("foundry.toml"), zk_toml).unwrap(); + +// cmd.args(["build", "--zksync"]); +// let stdout_1 = cmd.assert_success().get_output().stdout_lossy(); +// let pattern_1 = Regex::new(r"Compiler run successful").unwrap(); + +// let stdout_2 = cmd.assert_success().get_output().stdout_lossy(); +// let pattern_2 = Regex::new(r"No files changed, compilation skipped").unwrap(); + +// assert!(pattern_1.is_match(&stdout_1)); +// assert!(pattern_2.is_match(&stdout_2)); +// }); + +// // tests cache is invalidated when zksolc version changes +// forgetest_init!(test_zk_cache_invalid_on_version_changed, |prj, cmd| { +// let template_toml = r#"[profile.default] +// src = 'src' +// out = 'out' +// libs = ['lib'] +// solc = '0.8.26' + +// [profile.default.zksync] +// "#; + +// let toml_156 = format!( +// r#"{template_toml} +// zksolc = '1.5.6' +// "# +// ); + +// let toml_157 = format!( +// r#"{template_toml} +// zksolc = '1.5.7' +// "# +// ); + +// fs::write(prj.root().join("foundry.toml"), toml_156).unwrap(); + +// cmd.args(["build", "--zksync"]); +// let stdout_1 = cmd.assert_success().get_output().stdout_lossy(); +// let pattern_1 = Regex::new(r"Compiler run successful").unwrap(); + +// fs::remove_file(prj.root().join("foundry.toml")).unwrap(); +// fs::write(prj.root().join("foundry.toml"), toml_157).unwrap(); + +// let stdout_2 = cmd.assert_success().get_output().stdout_lossy(); +// let pattern_2 = Regex::new(r"Compiler run successful!").unwrap(); // if we see this, means +// the cache was invalidated + +// print!("stdout_1: {}", stdout_1); +// print!("stdout_2: {}", stdout_2); - fs::write(prj.root().join("foundry.toml"), toml_156).unwrap(); +// assert!(pattern_1.is_match(&stdout_1)); +// assert!(pattern_2.is_match(&stdout_2)); +// }); - cmd.args(["build", "--zksync"]); - let stdout_1 = cmd.assert_success().get_output().stdout_lossy(); - let pattern_1 = Regex::new(r"Compiler run successful").unwrap(); +// Test that checks that you have to recompile the project if the zksolc version changes (the +// cache is invalidated) - fs::remove_file(prj.root().join("foundry.toml")).unwrap(); - fs::write(prj.root().join("foundry.toml"), toml_157).unwrap(); +#[test] +fn zksync_detects_change_on_cache_if_zksolc_version_changes() { + let mut project = TempProject::::dapptools().unwrap(); + + project.project_mut().build_info = true; + project + .add_source( + "A", + r#" +pragma solidity ^0.8.10; +import "./B.sol"; +contract A { } +"#, + ) + .unwrap(); + + project + .add_source( + "B", + r" +pragma solidity ^0.8.10; +contract B { } +", + ) + .unwrap(); + + let config_1_5_6 = ZkSolcCompiler { + zksolc: ZkSolc::get_path_for_version(&semver::Version::new(1, 5, 6)).unwrap(), + solc: Default::default(), + }; + project.project_mut().compiler = config_1_5_6; + + let compiled_1 = project.compile().unwrap(); + compiled_1.assert_success(); + + let cache = CompilerCache::::read(project.cache_path()).unwrap(); + + let config_1_5_7 = ZkSolcCompiler { + zksolc: ZkSolc::get_path_for_version(&semver::Version::new(1, 5, 7)).unwrap(), + solc: Default::default(), + }; + project.project_mut().compiler = config_1_5_7; - let stdout_2 = cmd.assert_success().get_output().stdout_lossy(); - let pattern_2 = Regex::new(r"Compiler run successful!").unwrap(); // if we see this, means the cache was invalidated + let compiled_2 = project.compile().unwrap(); - print!("stdout_1: {}", stdout_1); - print!("stdout_2: {}", stdout_2); + assert!(compiled_2.is_unchanged()); - assert!(pattern_1.is_match(&stdout_1)); - assert!(pattern_2.is_match(&stdout_2)); -}); + let latest_cache = CompilerCache::::read(project.cache_path()).unwrap(); + + assert_ne!(cache, latest_cache); +} + +#[test] +fn test_nuevo_vamoaver() { + let mut project = TempProject::::dapptools().unwrap(); + + let compiler_1_5_6 = ZkSolcCompiler { + zksolc: ZkSolc::get_path_for_version(&semver::Version::new(1, 5, 6)).unwrap(), + solc: Default::default(), + }; + let compiled_1 = test_zksync_can_compile_with_version(&mut project, compiler_1_5_6); + + assert!(!compiled_1.is_unchanged()); + + let cache = CompilerCache::::read(project.cache_path()).unwrap(); + + let compiler_1_5_7 = ZkSolcCompiler { + zksolc: ZkSolc::get_path_for_version(&semver::Version::new(1, 5, 7)).unwrap(), + solc: Default::default(), + }; + + let compiled_2 = test_zksync_can_compile_with_version(&mut project, compiler_1_5_7); + + assert!(compiled_2.is_unchanged()); + + let latest_cache = CompilerCache::::read(project.cache_path()).unwrap(); + + assert_ne!(cache, latest_cache); +}