From 95a384b1218d9a83eac8c14362086e56f5bacc5a Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Mon, 21 Mar 2022 09:58:56 +0100 Subject: [PATCH] fix(solc): bundle new svm-solc feature (#1071) * fix(solc): bundle new svm-solc feature * chore: update CHANGELOG * fix: enabled new feature in full --- CHANGELOG.md | 2 ++ ethers-solc/Cargo.toml | 7 ++++--- ethers-solc/src/compile/mod.rs | 16 ++++++++-------- ethers-solc/src/compile/project.rs | 4 ++-- ethers-solc/src/error.rs | 2 +- ethers-solc/src/lib.rs | 12 ++++++------ ethers-solc/src/resolver/mod.rs | 6 +++--- 7 files changed, 26 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12f6b1d9..a1e41acc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,6 +73,8 @@ ### Unreleased +- Bundle svm, svm-builds and sha2 dependencies in new `svm-solc` feature + [#1071](https://github.com/gakonst/ethers-rs/pull/1071) - Wrap `ethabi::Contract` into new type `LosslessAbi` and `abi: Option` with `abi: Option` in `ConfigurableContractArtifact` [#952](https://github.com/gakonst/ethers-rs/pull/952) - Let `Project` take ownership of `ArtifactOutput` and change trait interface diff --git a/ethers-solc/Cargo.toml b/ethers-solc/Cargo.toml index 9ea020ed..35dc4ab1 100644 --- a/ethers-solc/Cargo.toml +++ b/ethers-solc/Cargo.toml @@ -70,17 +70,18 @@ harness = false [[test]] name = "project" path = "tests/project.rs" -required-features = ["async", "svm", "svm-builds", "project-util"] +required-features = ["async", "solc-svm", "project-util"] [[test]] name = "mocked" path = "tests/mocked.rs" -required-features = ["async", "svm", "svm-builds", "project-util"] +required-features = ["async", "solc-svm", "project-util"] [features] default = ["rustls"] async = ["tokio", "futures-util"] -full = ["async", "svm", "svm/blocking", "svm-builds"] +full = ["async", "svm-solc"] +svm-solc = ["svm/blocking", "svm-builds", "sha2"] # Utilities for creating and testing project workspaces project-util = ["tempfile", "fs_extra", "rand"] tests = [] diff --git a/ethers-solc/src/compile/mod.rs b/ethers-solc/src/compile/mod.rs index dcdb4a7a..49b8c549 100644 --- a/ethers-solc/src/compile/mod.rs +++ b/ethers-solc/src/compile/mod.rs @@ -64,7 +64,7 @@ pub(crate) fn take_solc_installer_lock() -> std::sync::MutexGuard<'static, ()> { /// A list of upstream Solc releases, used to check which version /// we should download. /// The boolean value marks whether there was an error accessing the release list -#[cfg(all(feature = "svm", feature = "svm-builds"))] +#[cfg(all(feature = "svm-solc"))] pub static RELEASES: once_cell::sync::Lazy<(svm::Releases, Vec, bool)> = once_cell::sync::Lazy::new(|| { match serde_json::from_str::(svm_builds::RELEASE_LIST_JSON) { @@ -224,7 +224,7 @@ impl Solc { /// Returns the list of all versions that are available to download and marking those which are /// already installed. - #[cfg(all(feature = "svm", feature = "async"))] + #[cfg(all(feature = "svm-solc", feature = "async"))] pub fn all_versions() -> Vec { let mut all_versions = Self::installed_versions(); let mut uniques = all_versions @@ -285,7 +285,7 @@ impl Solc { /// to build it, and returns it. /// /// If the required compiler version is not installed, it also proceeds to install it. - #[cfg(all(feature = "svm", feature = "async"))] + #[cfg(all(feature = "svm-solc", feature = "async"))] pub fn detect_version(source: &Source) -> Result { // detects the required solc version let sol_version = Self::source_version_req(source)?; @@ -296,7 +296,7 @@ impl Solc { /// used to build it, and returns it. /// /// If the required compiler version is not installed, it also proceeds to install it. - #[cfg(all(feature = "svm", feature = "async"))] + #[cfg(all(feature = "svm-solc", feature = "async"))] pub fn ensure_installed(sol_version: &VersionReq) -> Result { #[cfg(any(test, feature = "tests"))] let _lock = take_solc_installer_lock(); @@ -361,7 +361,7 @@ impl Solc { /// # Ok(()) /// # } /// ``` - #[cfg(feature = "svm")] + #[cfg(feature = "svm-solc")] pub async fn install(version: &Version) -> std::result::Result { tracing::trace!("installing solc version \"{}\"", version); crate::report::solc_installation_start(version); @@ -371,7 +371,7 @@ impl Solc { } /// Blocking version of `Self::install` - #[cfg(all(feature = "svm", feature = "async"))] + #[cfg(all(feature = "svm-solc", feature = "async"))] pub fn blocking_install(version: &Version) -> std::result::Result { tracing::trace!("blocking installing solc version \"{}\"", version); crate::report::solc_installation_start(version); @@ -389,7 +389,7 @@ impl Solc { /// Verify that the checksum for this version of solc is correct. We check against the SHA256 /// checksum from the build information published by binaries.soliditylang - #[cfg(all(feature = "svm", feature = "async"))] + #[cfg(all(feature = "svm-solc", feature = "async"))] pub fn verify_checksum(&self) -> Result<()> { let version = self.version_short()?; let mut version_path = svm::version_path(version.to_string().as_str()); @@ -731,7 +731,7 @@ mod tests { #[test] // This test might be a bit hard to maintain - #[cfg(all(feature = "svm", feature = "async"))] + #[cfg(all(feature = "svm-solc", feature = "async"))] fn test_detect_version() { for (pragma, expected) in [ // pinned diff --git a/ethers-solc/src/compile/project.rs b/ethers-solc/src/compile/project.rs index 388466b4..3e1553c2 100644 --- a/ethers-solc/src/compile/project.rs +++ b/ethers-solc/src/compile/project.rs @@ -140,7 +140,7 @@ impl<'a, T: ArtifactOutput> ProjectCompiler<'a, T> { /// let project = Project::builder().build().unwrap(); /// let output = project.compile().unwrap(); /// ``` - #[cfg(all(feature = "svm", feature = "async"))] + #[cfg(all(feature = "svm-solc", feature = "async"))] pub fn new(project: &'a Project) -> Result { Self::with_sources(project, project.paths.read_input_files()?) } @@ -151,7 +151,7 @@ impl<'a, T: ArtifactOutput> ProjectCompiler<'a, T> { /// /// Multiple (`Solc` -> `Sources`) pairs can be compiled in parallel if the `Project` allows /// multiple `jobs`, see [`crate::Project::set_solc_jobs()`]. - #[cfg(all(feature = "svm", feature = "async"))] + #[cfg(all(feature = "svm-solc", feature = "async"))] pub fn with_sources(project: &'a Project, sources: Sources) -> Result { let graph = Graph::resolve_sources(&project.paths, sources)?; let (versions, edges) = graph.into_sources_by_version(project.offline)?; diff --git a/ethers-solc/src/error.rs b/ethers-solc/src/error.rs index 8271cc81..015c4c12 100644 --- a/ethers-solc/src/error.rs +++ b/ethers-solc/src/error.rs @@ -26,7 +26,7 @@ pub enum SolcError { /// Failed to resolve a file #[error("Failed to resolve file: {0}.\n Check configured remappings.")] Resolve(SolcIoError), - #[cfg(feature = "svm")] + #[cfg(feature = "svm-solc")] #[error(transparent)] SvmError(#[from] svm::SolcVmError), #[error("No contracts found at \"{0}\"")] diff --git a/ethers-solc/src/lib.rs b/ethers-solc/src/lib.rs index 53e30771..dde6139d 100644 --- a/ethers-solc/src/lib.rs +++ b/ethers-solc/src/lib.rs @@ -209,7 +209,7 @@ impl Project { let sources = self.paths.read_input_files()?; tracing::trace!("found {} sources to compile: {:?}", sources.len(), sources.keys()); - #[cfg(all(feature = "svm", feature = "async"))] + #[cfg(all(feature = "svm-solc", feature = "async"))] if self.auto_detect { tracing::trace!("using solc auto detection to compile sources"); return self.svm_compile(sources) @@ -243,7 +243,7 @@ impl Project { /// let output = project.svm_compile(sources).unwrap(); /// # } /// ``` - #[cfg(all(feature = "svm", feature = "async"))] + #[cfg(all(feature = "svm-solc", feature = "async"))] pub fn svm_compile(&self, sources: Sources) -> Result> { project::ProjectCompiler::with_sources(self, sources)?.compile() } @@ -260,7 +260,7 @@ impl Project { /// let output = project.compile_file("example/Greeter.sol").unwrap(); /// # } /// ``` - #[cfg(all(feature = "svm", feature = "async"))] + #[cfg(all(feature = "svm-solc", feature = "async"))] pub fn compile_file(&self, file: impl Into) -> Result> { let file = file.into(); let source = Source::read(&file)?; @@ -282,7 +282,7 @@ impl Project { /// ).unwrap(); /// # } /// ``` - #[cfg(all(feature = "svm", feature = "async"))] + #[cfg(all(feature = "svm-solc", feature = "async"))] pub fn compile_files(&self, files: I) -> Result> where I: IntoIterator, @@ -321,7 +321,7 @@ impl Project { /// ).unwrap(); /// # } /// ``` - #[cfg(all(feature = "svm", feature = "async"))] + #[cfg(all(feature = "svm-solc", feature = "async"))] pub fn compile_sparse( &self, filter: F, @@ -748,7 +748,7 @@ impl ArtifactOutput for Project { } #[cfg(test)] -#[cfg(all(feature = "svm", feature = "async"))] +#[cfg(all(feature = "svm-solc", feature = "async"))] mod tests { use crate::remappings::Remapping; diff --git a/ethers-solc/src/resolver/mod.rs b/ethers-solc/src/resolver/mod.rs index cceb013b..e5d1cbae 100644 --- a/ethers-solc/src/resolver/mod.rs +++ b/ethers-solc/src/resolver/mod.rs @@ -327,7 +327,7 @@ impl Graph { } } -#[cfg(all(feature = "svm", feature = "async"))] +#[cfg(all(feature = "svm-solc", feature = "async"))] impl Graph { /// Consumes the nodes of the graph and returns all input files together with their appropriate /// version and the edges of the graph @@ -632,14 +632,14 @@ impl<'a> Iterator for NodesIter<'a> { } /// Container type for solc versions and their compatible sources -#[cfg(all(feature = "svm", feature = "async"))] +#[cfg(all(feature = "svm-solc", feature = "async"))] #[derive(Debug)] pub struct VersionedSources { inner: HashMap, offline: bool, } -#[cfg(all(feature = "svm", feature = "async"))] +#[cfg(all(feature = "svm-solc", feature = "async"))] impl VersionedSources { /// Resolves or installs the corresponding `Solc` installation. pub fn get(