From 91756bdadf9d39525b639d6b60b7637d05a22c85 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:02:44 +0200 Subject: [PATCH 01/17] chore: deprecate dapp_solc --- solc/Cargo.toml | 24 - solc/src/lib.rs | 488 ------------------ solc/testdata/test-contract-libs/lib1/Bar.sol | 3 - solc/testdata/test-contract-libs/lib2/Baz.sol | 3 - solc/testdata/test-contract-libs/src/Foo.sol | 6 - .../test-contract-remappings/lib/bar/Bar.sol | 3 - .../test-contract-remappings/src/Foo.sol | 5 - .../test-contract-versions/caret-0.4.14.sol | 5 - .../greater-equal-0.5.0.sol | 5 - .../test-contract-versions/pinned-0.4.14.sol | 5 - .../test-contract-versions/range-0.5.0.sol | 5 - .../test-contract-versions/simple-0.4.14.sol | 5 - 12 files changed, 557 deletions(-) delete mode 100644 solc/Cargo.toml delete mode 100644 solc/src/lib.rs delete mode 100644 solc/testdata/test-contract-libs/lib1/Bar.sol delete mode 100644 solc/testdata/test-contract-libs/lib2/Baz.sol delete mode 100644 solc/testdata/test-contract-libs/src/Foo.sol delete mode 100644 solc/testdata/test-contract-remappings/lib/bar/Bar.sol delete mode 100644 solc/testdata/test-contract-remappings/src/Foo.sol delete mode 100644 solc/testdata/test-contract-versions/caret-0.4.14.sol delete mode 100644 solc/testdata/test-contract-versions/greater-equal-0.5.0.sol delete mode 100644 solc/testdata/test-contract-versions/pinned-0.4.14.sol delete mode 100644 solc/testdata/test-contract-versions/range-0.5.0.sol delete mode 100644 solc/testdata/test-contract-versions/simple-0.4.14.sol diff --git a/solc/Cargo.toml b/solc/Cargo.toml deleted file mode 100644 index 3777c3b97146d..0000000000000 --- a/solc/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "dapp-solc" -version = "0.1.0" -authors = ["Georgios Konstantopoulos "] -edition = "2018" -description = """ -Incremental, parallel and multi-version Solidity compiler abstraction -""" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -semver = "1.0.4" -eyre = "0.6.5" -# ethers = { version = "0.5.2" } -ethers = { git = "https://github.com/gakonst/ethers-rs" } -svm = { package = "svm-rs", git = "https://github.com/roynalnaruto/svm-rs" } -tracing = "0.1.28" -glob = "0.3.0" -tokio = "1.12.0" -rayon = "1.5.1" - -[features] -sync = [] diff --git a/solc/src/lib.rs b/solc/src/lib.rs deleted file mode 100644 index 601d962ebf607..0000000000000 --- a/solc/src/lib.rs +++ /dev/null @@ -1,488 +0,0 @@ -use ethers::core::utils::{CompiledContract, Solc}; -use eyre::Result; -use rayon::prelude::*; -use semver::{Version, VersionReq}; -use std::{ - collections::HashMap, - fs::File, - io::{BufRead, BufReader}, - path::{Path, PathBuf}, - time::Instant, -}; - -#[cfg(any(test, feature = "sync"))] -use std::sync::Mutex; -#[cfg(any(test, feature = "sync"))] -static LOCK: Lazy> = Lazy::new(|| Mutex::new(())); -#[cfg(any(test, feature = "sync"))] -use ethers::prelude::Lazy; - -/// Supports building contracts -#[derive(Debug)] -pub struct SolcBuilder<'a> { - contracts: &'a str, - remappings: &'a [String], - lib_paths: &'a [String], - releases: Vec, -} - -impl<'a> SolcBuilder<'a> { - pub fn new( - contracts: &'a str, - remappings: &'a [String], - lib_paths: &'a [String], - ) -> Result { - // Try to download the releases, if it fails default to empty - let releases = match tokio::runtime::Runtime::new()?.block_on(svm::all_versions()) { - Ok(inner) => inner, - Err(err) => { - tracing::error!("Failed to get upstream releases: {}", err); - Vec::new() - } - }; - Ok(Self { contracts, remappings, lib_paths, releases }) - } - - /// Builds all provided contract files with the specified compiler version. - /// Assumes that the lib-paths and remappings have already been specified and - /// that the correct compiler version is provided. - // FIXME: Does NOT support contracts with the same name. - #[tracing::instrument(skip(self, files))] - fn build( - &self, - version: &str, - files: Vec, - ) -> Result> { - let compiler_path = find_installed_version_path(version)? - .ok_or_else(|| eyre::eyre!("version {} not installed", version))?; - - // tracing::trace!(?files); - let mut solc = Solc::new_with_paths(files).solc_path(compiler_path); - let lib_paths = self - .lib_paths - .iter() - .filter(|path| PathBuf::from(path).exists()) - .map(|path| { - std::fs::canonicalize(path).unwrap().into_os_string().into_string().unwrap() - }) - .collect::>() - .join(","); - - // tracing::trace!(?lib_paths); - solc = solc.args(std::array::IntoIter::new(["--allow-paths", &lib_paths])); - - // tracing::trace!(?self.remappings); - if !self.remappings.is_empty() { - solc = solc.args(self.remappings) - } - - Ok(solc.build()?) - } - - /// Builds all contracts with their corresponding compiler versions - #[tracing::instrument(skip(self))] - pub fn build_all(&self) -> Result> { - tracing::info!("starting compilation"); - let contracts_by_version = self.contract_versions()?; - let start = Instant::now(); - - let res = contracts_by_version - .into_par_iter() - .try_fold(HashMap::new, |mut map, (version, files)| { - let res = self.build(&version, files)?; - map.extend(res); - Ok::<_, eyre::Error>(map) - }) - // Need to define the logic for combining the 2 maps in Rayon after the fold - .reduce( - || Ok(HashMap::new()), - |prev: Result>, map: Result>| match (prev, map) { - (Ok(mut prev), Ok(map)) => { - prev.extend(map); - Ok(prev) - } - (Err(err), _) => Err(err), - (_, Err(err)) => Err(err), - }, - ); - let duration = Instant::now().duration_since(start); - tracing::info!(compilation_time = ?duration); - - res - } - - /// Given a Solidity file, it detects the latest compiler version which can be used - /// to build it, and returns it along with its canonicalized path. If the required - /// compiler version is not installed, it also proceeds to install it. - #[tracing::instrument(err)] - fn detect_version(&self, fname: &Path) -> Result> { - let path = std::fs::canonicalize(fname)?; - - // detects the required solc version - let sol_version = Self::version_req(&path)?; - - let path_str = path - .into_os_string() - .into_string() - .map_err(|_| eyre::eyre!("invalid path, maybe not utf-8?"))?; - - #[cfg(any(test, feature = "sync"))] - // take the lock in tests, we use this to enforce that - // a test does not run while a compiler version is being installed - let _lock = LOCK.lock(); - - // load the local / remote versions - let versions = svm::installed_versions().unwrap_or_default(); - let local_versions = Self::find_matching_installation(&versions, &sol_version); - let remote_versions = Self::find_matching_installation(&self.releases, &sol_version); - - // if there's a better upstream version than the one we have, install it - let res = match (local_versions, remote_versions) { - (Some(local), None) => Some(local), - (Some(local), Some(remote)) => Some(if remote > local { - self.install_version(&remote); - remote - } else { - local - }), - (None, Some(version)) => { - self.install_version(&version); - Some(version) - } - // do nothing otherwise - _ => None, - } - .map(|version| (version, path_str)); - - Ok(res) - } - - fn install_version(&self, version: &Version) { - println!("Installing {}", version); - // Blocking call to install it over RPC. - install_blocking(version).expect("could not install solc remotely"); - println!("Done!"); - } - - /// Gets a map of compiler version -> vec[contract paths] - fn contract_versions(&self) -> Result>> { - // Group contracts in the nones with the same version pragma - let files = glob::glob(self.contracts)?; - // tracing::trace!("Compiling files under {}", self.contracts); - println!("Compiling files under {}", self.contracts); - - // get all the corresponding contract versions - let contracts = files - .filter_map(|fname| fname.ok()) - .filter_map(|fname| self.detect_version(&fname).ok().flatten()) - .fold(HashMap::new(), |mut map, (version, path)| { - let entry = map.entry(version.to_string()).or_insert_with(Vec::new); - entry.push(path); - map - }); - - if contracts.is_empty() { - eyre::bail!( - "no contracts were compiled. do you have the correct compiler version installed?" - ) - } - - Ok(contracts) - } - - /// Parses the given Solidity file looking for the `pragma` definition and - /// returns the corresponding SemVer version requirement. - fn version_req(path: &Path) -> Result { - let file = BufReader::new(File::open(path)?); - let version = file - .lines() - .map(|line| line.unwrap()) - .find(|line| line.starts_with("pragma solidity")) - .ok_or_else(|| eyre::eyre!("{:?} has no version", path))?; - let version = version - .replace("pragma solidity ", "") - .replace(";", "") - // needed to make it valid semver for things like - // `>=0.4.0 <0.5.0` => `>=0.4.0,<0.5.0` - .replace(" ", ","); - - // Somehow, Solidity semver without an operator is considered to be "exact", - // but lack of operator automatically marks the operator as Caret, so we need - // to manually patch it? :shrug: - let exact = !matches!(&version[0..1], "*" | "^" | "=" | ">" | "<" | "~"); - let mut version = VersionReq::parse(&version)?; - if exact { - version.comparators[0].op = semver::Op::Exact; - } - - Ok(version) - } - - /// Find a matching local installation for the specified required version - fn find_matching_installation( - versions: &[Version], - required_version: &VersionReq, - ) -> Option { - // iterate in reverse to find the last match - versions.iter().rev().find(|version| required_version.matches(version)).cloned() - } -} - -/// Returns the path for an installed version -fn find_installed_version_path(version: &str) -> Result> { - let home_dir = svm::SVM_HOME.clone(); - let path = std::fs::read_dir(home_dir)? - .into_iter() - .filter_map(|version| version.ok()) - .map(|version_dir| version_dir.path()) - .find(|path| path.to_string_lossy().contains(&version)) - .map(|mut path| { - path.push(format!("solc-{}", &version)); - path - }); - Ok(path) -} - -/// Blocking call to the svm installer for a specified version -fn install_blocking(version: &Version) -> Result<()> { - tokio::runtime::Runtime::new().unwrap().block_on(svm::install(version))?; - Ok(()) -} - -#[cfg(test)] -mod tests { - use ethers::core::rand::random; - use svm::SVM_HOME; - - use super::*; - use std::{io::Write, str::FromStr}; - - #[test] - fn test_find_installed_version_path() { - // this test does not take the lock by default, so we need to manually - // add it here. - let _lock = LOCK.lock(); - let ver = "0.8.6"; - let version = Version::from_str(ver).unwrap(); - if !svm::installed_versions().unwrap().contains(&version) { - install_blocking(&version).unwrap(); - } - let res = find_installed_version_path(&version.to_string()).unwrap(); - let expected = SVM_HOME.join(ver).join(format!("solc-{}", ver)); - assert_eq!(res.unwrap(), expected); - } - - #[test] - fn does_not_find_not_installed_version() { - let ver = "1.1.1"; - let version = Version::from_str(ver).unwrap(); - let res = find_installed_version_path(&version.to_string()).unwrap(); - assert!(res.is_none()); - } - - #[test] - fn test_find_latest_matching_installation() { - let versions = ["0.4.24", "0.5.1", "0.5.2"] - .iter() - .map(|version| Version::from_str(version).unwrap()) - .collect::>(); - - let required = VersionReq::from_str(">=0.4.24").unwrap(); - - let got = SolcBuilder::find_matching_installation(&versions, &required).unwrap(); - assert_eq!(got, versions[2]); - } - - #[test] - fn test_no_matching_installation() { - let versions = ["0.4.24", "0.5.1", "0.5.2"] - .iter() - .map(|version| Version::from_str(version).unwrap()) - .collect::>(); - - let required = VersionReq::from_str(">=0.6.0").unwrap(); - let got = SolcBuilder::find_matching_installation(&versions, &required); - assert!(got.is_none()); - } - - // helper for testing solidity file versioning - struct TempSolidityFile { - version: String, - path: PathBuf, - } - - use std::ops::Deref; - - impl Deref for TempSolidityFile { - type Target = PathBuf; - fn deref(&self) -> &PathBuf { - &self.path - } - } - - // mkdir -p - fn mkdir() -> PathBuf { - let dir = std::env::temp_dir().join(&random::().to_string()).join("contracts"); - if !dir.exists() { - std::fs::create_dir_all(&dir).unwrap(); - } - dir - } - - // rm -rf - fn rmdir(dir: &Path) { - std::fs::remove_dir_all(&dir).unwrap(); - } - - impl TempSolidityFile { - fn new(dir: &Path, version: &str) -> Self { - let path = dir.join(format!("temp-{}-{}.sol", version, random::())); - let mut file = File::create(&path).unwrap(); - file.write(format!("pragma solidity {};\n", version).as_bytes()).unwrap(); - Self { path, version: version.to_string() } - } - } - - #[test] - fn test_version_req() { - let dir = mkdir(); - - let versions = ["=0.1.2", "^0.5.6", ">=0.7.1", ">0.8.0"]; - let files = versions.iter().map(|version| TempSolidityFile::new(&dir, version)); - - files.for_each(|file| { - let version_req = SolcBuilder::version_req(&file.path).unwrap(); - assert_eq!(version_req, VersionReq::from_str(&file.version).unwrap()); - }); - - // Solidity defines version ranges with a space, whereas the semver package - // requires them to be separated with a comma - let version_range = ">=0.8.0 <0.9.0"; - let file = TempSolidityFile::new(&dir, version_range); - let version_req = SolcBuilder::version_req(&file.path).unwrap(); - assert_eq!(version_req, VersionReq::from_str(">=0.8.0,<0.9.0").unwrap()); - - rmdir(&dir); - } - - #[test] - // This test might be a bit hard to maintain - fn test_detect_version() { - let dir = mkdir(); - - let builder = SolcBuilder::new("", &[], &[]).unwrap(); - for (pragma, expected) in [ - // pinned - ("=0.4.14", "0.4.14"), - // pinned too - ("0.4.14", "0.4.14"), - // The latest patch is 0.4.26 - ("^0.4.14", "0.4.26"), - // latest version above 0.5.0 -> we have to - // update this test whenever there's a new sol - // version. that's ok! good reminder to check the - // patch notes. - (">=0.5.0", "0.8.10"), - // range - (">=0.4.0 <0.5.0", "0.4.26"), - ] - .iter() - { - // println!("Checking {}", pragma); - let file = TempSolidityFile::new(&dir, pragma); - let res = builder.detect_version(&file.path).unwrap().unwrap(); - assert_eq!(res.0, Version::from_str(expected).unwrap()); - } - - rmdir(&dir); - } - - #[test] - // Ensures that the contract versions get correctly assigned to a compiler - // version given a glob - fn test_contract_versions() { - let dir = mkdir(); - - let versions = [ - // pinned - "=0.4.14", - // Up to later patches (caret implied) - "0.4.14", - // Up to later patches - "^0.4.14", - // any version above 0.5.0 - ">=0.5.0", - // range - ">=0.4.0 <0.5.0", - ]; - versions.iter().for_each(|version| { - TempSolidityFile::new(&dir, version); - }); - - let dir_str = dir.clone().into_os_string().into_string().unwrap(); - let glob = format!("{}/**/*.sol", dir_str); - let builder = SolcBuilder::new(&glob, &[], &[]).unwrap(); - - let versions = builder.contract_versions().unwrap(); - assert_eq!(versions["0.4.14"].len(), 2); - assert_eq!(versions["0.4.26"].len(), 2); - assert_eq!(versions["0.8.10"].len(), 1); - - rmdir(&dir); - } - - fn get_glob(path: &str) -> String { - let path = std::fs::canonicalize(path).unwrap(); - let mut path = path.into_os_string().into_string().unwrap(); - path.push_str("/**/*.sol"); - path - } - - #[test] - fn test_build_all_versions() { - let path = get_glob("testdata/test-contract-versions"); - let builder = SolcBuilder::new(&path, &[], &[]).unwrap(); - let res = builder.build_all().unwrap(); - // Contracts A to F - assert_eq!(res.keys().count(), 5); - } - - #[test] - fn test_remappings() { - // Need to give the full paths here because we're running solc from the current - // directory and not the repo's root directory - let path = get_glob("testdata/test-contract-remappings"); - let remappings = vec!["bar/=testdata/test-contract-remappings/lib/bar/".to_owned()]; - let lib = std::fs::canonicalize("testdata/test-contract-remappings") - .unwrap() - .into_os_string() - .into_string() - .unwrap(); - let libs = vec![lib]; - let builder = SolcBuilder::new(&path, &remappings, &libs).unwrap(); - let res = builder.build_all().unwrap(); - // Foo & Bar - assert_eq!(res.keys().count(), 2); - } - - fn canonicalized_path(path: &str) -> String { - std::fs::canonicalize(path).unwrap().into_os_string().into_string().unwrap() - } - - #[test] - // This is useful if you want to import a library from e.g. `node_modules` (for - // whatever reason that may be) and from another path at the same time - fn test_multiple_libs() { - // Need to give the full paths here because we're running solc from the current - // directory and not the repo's root directory - let path = get_glob("testdata/test-contract-libs"); - let libs = vec![ - canonicalized_path("testdata/test-contract-libs/lib1"), - canonicalized_path("testdata/test-contract-libs/lib2"), - ]; - let builder = SolcBuilder::new(&path, &[], &libs).unwrap(); - let res = builder.build_all().unwrap(); - // Foo & Bar - assert_eq!(res.keys().count(), 3); - } -} diff --git a/solc/testdata/test-contract-libs/lib1/Bar.sol b/solc/testdata/test-contract-libs/lib1/Bar.sol deleted file mode 100644 index 16dfcecb35a08..0000000000000 --- a/solc/testdata/test-contract-libs/lib1/Bar.sol +++ /dev/null @@ -1,3 +0,0 @@ -pragma solidity ^0.8.6; - -contract Bar {} diff --git a/solc/testdata/test-contract-libs/lib2/Baz.sol b/solc/testdata/test-contract-libs/lib2/Baz.sol deleted file mode 100644 index e4527d07f04e1..0000000000000 --- a/solc/testdata/test-contract-libs/lib2/Baz.sol +++ /dev/null @@ -1,3 +0,0 @@ -pragma solidity ^0.8.6; - -contract Baz {} diff --git a/solc/testdata/test-contract-libs/src/Foo.sol b/solc/testdata/test-contract-libs/src/Foo.sol deleted file mode 100644 index ab9eba943801f..0000000000000 --- a/solc/testdata/test-contract-libs/src/Foo.sol +++ /dev/null @@ -1,6 +0,0 @@ -pragma solidity 0.8.6; - -import "../lib1/Bar.sol"; -import "../lib2/Baz.sol"; - -contract Foo is Bar, Baz {} diff --git a/solc/testdata/test-contract-remappings/lib/bar/Bar.sol b/solc/testdata/test-contract-remappings/lib/bar/Bar.sol deleted file mode 100644 index 06579092f5d05..0000000000000 --- a/solc/testdata/test-contract-remappings/lib/bar/Bar.sol +++ /dev/null @@ -1,3 +0,0 @@ -pragma solidity 0.8.6; - -contract Bar {} diff --git a/solc/testdata/test-contract-remappings/src/Foo.sol b/solc/testdata/test-contract-remappings/src/Foo.sol deleted file mode 100644 index 2edb8f5d27863..0000000000000 --- a/solc/testdata/test-contract-remappings/src/Foo.sol +++ /dev/null @@ -1,5 +0,0 @@ -pragma solidity 0.8.6; - -import "bar/Bar.sol"; - -contract Foo is Bar {} diff --git a/solc/testdata/test-contract-versions/caret-0.4.14.sol b/solc/testdata/test-contract-versions/caret-0.4.14.sol deleted file mode 100644 index e57e12931b04f..0000000000000 --- a/solc/testdata/test-contract-versions/caret-0.4.14.sol +++ /dev/null @@ -1,5 +0,0 @@ -pragma solidity ^0.4.14; - -contract B { - function foo() public {} -} diff --git a/solc/testdata/test-contract-versions/greater-equal-0.5.0.sol b/solc/testdata/test-contract-versions/greater-equal-0.5.0.sol deleted file mode 100644 index 382894d228581..0000000000000 --- a/solc/testdata/test-contract-versions/greater-equal-0.5.0.sol +++ /dev/null @@ -1,5 +0,0 @@ -pragma solidity >=0.5.0; - -contract C { - function foo() public {} -} diff --git a/solc/testdata/test-contract-versions/pinned-0.4.14.sol b/solc/testdata/test-contract-versions/pinned-0.4.14.sol deleted file mode 100644 index 28e6774e332a1..0000000000000 --- a/solc/testdata/test-contract-versions/pinned-0.4.14.sol +++ /dev/null @@ -1,5 +0,0 @@ -pragma solidity =0.4.14; - -contract D { - function foo() public {} -} diff --git a/solc/testdata/test-contract-versions/range-0.5.0.sol b/solc/testdata/test-contract-versions/range-0.5.0.sol deleted file mode 100644 index 9ac40a4a908c1..0000000000000 --- a/solc/testdata/test-contract-versions/range-0.5.0.sol +++ /dev/null @@ -1,5 +0,0 @@ -pragma solidity >=0.4.0 <0.5.0; - -contract E { - function foo() public {} -} diff --git a/solc/testdata/test-contract-versions/simple-0.4.14.sol b/solc/testdata/test-contract-versions/simple-0.4.14.sol deleted file mode 100644 index 8a8ec28b3c67b..0000000000000 --- a/solc/testdata/test-contract-versions/simple-0.4.14.sol +++ /dev/null @@ -1,5 +0,0 @@ -pragma solidity =0.4.14; - -contract F { - function foo() public {} -} From 4a9a84bb1170b3d56ff115fac2e941ea9114cb61 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:18:36 +0200 Subject: [PATCH 02/17] chore: cargo lock --- Cargo.lock | 236 +++++++++++++++++++++++++---------------------------- Cargo.toml | 1 - 2 files changed, 112 insertions(+), 125 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 675e4d21a11b1..68ac90222c01f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -108,9 +108,9 @@ checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1" [[package]] name = "arrayvec" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" dependencies = [ "serde", ] @@ -160,6 +160,18 @@ dependencies = [ "syn", ] +[[package]] +name = "auto_impl" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7862e21c893d65a1650125d157eaeec691439379a1cee17ee49031b79236ada4" +dependencies = [ + "proc-macro-error 1.0.4", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "autocfg" version = "0.1.7" @@ -426,9 +438,9 @@ dependencies = [ [[package]] name = "cargo_metadata" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c297bd3135f558552f99a0daa180876984ea2c4ffa7470314540dff8c654109a" +checksum = "ba2ae6de944143141f6155a473a6b02f66c7c3f9f47316f802f80204ebfe6e12" dependencies = [ "camino", "cargo-platform", @@ -572,6 +584,17 @@ dependencies = [ "thiserror", ] +[[package]] +name = "colored" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +dependencies = [ + "atty", + "lazy_static", + "winapi", +] + [[package]] name = "console" version = "0.14.1" @@ -624,50 +647,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "lazy_static", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" -dependencies = [ - "cfg-if", - "lazy_static", -] - [[package]] name = "crunchy" version = "0.2.2" @@ -738,7 +717,6 @@ dependencies = [ name = "dapp" version = "0.1.0" dependencies = [ - "dapp-solc", "dapp-utils", "ethers", "evm", @@ -758,20 +736,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "dapp-solc" -version = "0.1.0" -dependencies = [ - "ethers", - "eyre", - "glob", - "rayon", - "semver 1.0.4", - "svm-rs", - "tokio", - "tracing", -] - [[package]] name = "dapp-utils" version = "0.1.0" @@ -788,7 +752,6 @@ version = "0.1.0" dependencies = [ "ansi_term 0.12.1", "dapp", - "dapp-solc", "dapp-utils", "ethers", "ethers-etherscan", @@ -1040,20 +1003,21 @@ dependencies = [ [[package]] name = "ethers" -version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#5ab0b7e0f46e1ba290ed50b5000678dc059916f7" +version = "0.5.4" +source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" dependencies = [ "ethers-contract", "ethers-core", "ethers-middleware", "ethers-providers", "ethers-signers", + "ethers-solc", ] [[package]] name = "ethers-contract" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#5ab0b7e0f46e1ba290ed50b5000678dc059916f7" +source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" dependencies = [ "ethers-contract-abigen", "ethers-contract-derive", @@ -1071,11 +1035,10 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#5ab0b7e0f46e1ba290ed50b5000678dc059916f7" +source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" dependencies = [ "Inflector", "anyhow", - "cargo_metadata", "cfg-if", "ethers-core", "getrandom 0.2.3", @@ -1093,7 +1056,7 @@ dependencies = [ [[package]] name = "ethers-contract-derive" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#5ab0b7e0f46e1ba290ed50b5000678dc059916f7" +source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" dependencies = [ "ethers-contract-abigen", "ethers-core", @@ -1106,18 +1069,17 @@ dependencies = [ [[package]] name = "ethers-core" -version = "0.5.4" -source = "git+https://github.com/gakonst/ethers-rs#5ab0b7e0f46e1ba290ed50b5000678dc059916f7" +version = "0.5.5" +source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" dependencies = [ "arrayvec", "bytes", + "cargo_metadata", "convert_case", "ecdsa", "elliptic-curve", "ethabi", - "futures-util", "generic-array 0.14.4", - "glob", "hex", "k256", "once_cell", @@ -1126,19 +1088,17 @@ dependencies = [ "rand 0.8.4", "rlp", "rlp-derive", - "semver 1.0.4", "serde", "serde_json", "syn", "thiserror", "tiny-keccak", - "tokio", ] [[package]] name = "ethers-etherscan" version = "0.1.1" -source = "git+https://github.com/gakonst/ethers-rs#5ab0b7e0f46e1ba290ed50b5000678dc059916f7" +source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" dependencies = [ "ethers-core", "reqwest", @@ -1150,7 +1110,7 @@ dependencies = [ [[package]] name = "ethers-middleware" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#5ab0b7e0f46e1ba290ed50b5000678dc059916f7" +source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" dependencies = [ "async-trait", "ethers-contract", @@ -1173,10 +1133,10 @@ dependencies = [ [[package]] name = "ethers-providers" version = "0.5.4" -source = "git+https://github.com/gakonst/ethers-rs#5ab0b7e0f46e1ba290ed50b5000678dc059916f7" +source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" dependencies = [ "async-trait", - "auto_impl", + "auto_impl 0.5.0", "ethers-core", "futures-channel", "futures-core", @@ -1202,7 +1162,7 @@ dependencies = [ [[package]] name = "ethers-signers" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#5ab0b7e0f46e1ba290ed50b5000678dc059916f7" +source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" dependencies = [ "async-trait", "coins-bip32", @@ -1219,12 +1179,35 @@ dependencies = [ "thiserror", ] +[[package]] +name = "ethers-solc" +version = "0.1.0" +source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" +dependencies = [ + "colored", + "ethers-core", + "futures-util", + "glob", + "hex", + "home", + "md-5", + "once_cell", + "regex", + "semver 1.0.4", + "serde", + "serde_json", + "svm-rs", + "thiserror", + "tokio", + "walkdir", +] + [[package]] name = "evm" version = "0.30.1" source = "git+https://github.com/rust-blockchain/evm#b632ef27f9415e7db1b818d39b10ca2228629111" dependencies = [ - "auto_impl", + "auto_impl 0.4.1", "environmental", "ethereum", "evm-core", @@ -1243,7 +1226,6 @@ name = "evm-adapters" version = "0.1.0" dependencies = [ "bytes", - "dapp-solc", "dapp-utils", "ethers", "evm", @@ -1287,7 +1269,7 @@ name = "evm-runtime" version = "0.30.0" source = "git+https://github.com/rust-blockchain/evm#b632ef27f9415e7db1b818d39b10ca2228629111" dependencies = [ - "auto_impl", + "auto_impl 0.4.1", "environmental", "evm-core", "primitive-types", @@ -2052,19 +2034,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] -name = "memchr" -version = "2.4.1" +name = "md-5" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "opaque-debug 0.3.0", +] [[package]] -name = "memoffset" -version = "0.6.4" +name = "memchr" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" -dependencies = [ - "autocfg 1.0.1", -] +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "mime" @@ -2581,9 +2565,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.30" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc3358ebc67bc8b7fa0c007f945b0b18226f78437d61bec735a9eb96b61ee70" +checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" dependencies = [ "unicode-xid", ] @@ -2848,31 +2832,6 @@ dependencies = [ "rand_core 0.6.3", ] -[[package]] -name = "rayon" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" -dependencies = [ - "autocfg 1.0.1", - "crossbeam-deque", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "lazy_static", - "num_cpus", -] - [[package]] name = "rdrand" version = "0.4.0" @@ -3111,6 +3070,15 @@ dependencies = [ "cipher 0.3.0", ] +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.19" @@ -3253,9 +3221,9 @@ dependencies = [ [[package]] name = "serde-aux" -version = "2.3.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "907c320ef8f45ce134b28ca9567ec58ec0d51dcae4e1ffe7ee0cc15517243810" +checksum = "93abf9799c576f004252b2a05168d58527fb7c54de12e94b4d12fe3475ffad24" dependencies = [ "serde", "serde_json", @@ -3517,9 +3485,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.80" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d010a1623fbd906d51d650a9916aaefc05ffa0e4053ff7fe601167f3e715d194" +checksum = "f2afee18b8beb5a596ecb4a2dce128c719b4ba399d34126b9e4396e3f9860966" dependencies = [ "proc-macro2", "quote", @@ -3943,6 +3911,17 @@ dependencies = [ "libc", ] +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + [[package]] name = "want" version = "0.3.0" @@ -4091,6 +4070,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index 6d2f8ba297fcf..4afc16258f8cb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,6 @@ members = [ "seth", "dapp", "dapptools", - "solc", ] # Binary size optimizations From d9808c0b9eb753b5d8d968954cbb40f6501bd3f3 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:04:33 +0200 Subject: [PATCH 03/17] chore(evm-adapters): use sol 0.6.6 for tests without auto solc detection --- evm-adapters/testdata/CheatCodes.sol | 2 +- evm-adapters/testdata/LargeContract.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/evm-adapters/testdata/CheatCodes.sol b/evm-adapters/testdata/CheatCodes.sol index d617a400ef197..55d1dc223c83f 100644 --- a/evm-adapters/testdata/CheatCodes.sol +++ b/evm-adapters/testdata/CheatCodes.sol @@ -1,6 +1,6 @@ // Taken from: // https://github.com/dapphub/dapptools/blob/e41b6cd9119bbd494aba1236838b859f2136696b/src/dapp-tests/pass/cheatCodes.sol -pragma solidity ^0.6.7; +pragma solidity ^0.6.6; pragma experimental ABIEncoderV2; import "./DsTest.sol"; diff --git a/evm-adapters/testdata/LargeContract.sol b/evm-adapters/testdata/LargeContract.sol index 2cfa7fcf00d95..1ff76b8f371d5 100644 --- a/evm-adapters/testdata/LargeContract.sol +++ b/evm-adapters/testdata/LargeContract.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.8.6; +pragma solidity =0.6.6; contract LargeContract { string public foo = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; From d3c8b33e5b0186aeb778d6f64ed7b1cf89414355 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:06:39 +0200 Subject: [PATCH 04/17] fix(evm-adapters): adjust breaking changes COMPILED.get -> COMPILED.find bytecode -> bin --- evm-adapters/Cargo.toml | 6 ++--- evm-adapters/src/evmodin.rs | 4 +-- evm-adapters/src/lib.rs | 27 +++++++++++-------- .../sputnik/cheatcodes/cheatcode_handler.rs | 18 ++++++------- evm-adapters/src/sputnik/evm.rs | 26 +++++++++--------- .../src/sputnik/forked_backend/rpc.rs | 4 +-- 6 files changed, 43 insertions(+), 42 deletions(-) diff --git a/evm-adapters/Cargo.toml b/evm-adapters/Cargo.toml index 4b0d810cbcd95..e471720755bda 100644 --- a/evm-adapters/Cargo.toml +++ b/evm-adapters/Cargo.toml @@ -8,20 +8,18 @@ edition = "2018" [dependencies] dapp-utils = { path = "./../utils" } -dapp-solc = { path = "./../solc" } # evm = { version = "0.30.1" } sputnik = { package = "evm", git = "https://github.com/rust-blockchain/evm", optional = true, features = ["tracing"] } evmodin = { git = "https://github.com/vorot93/evmodin", optional = true } -# ethers = { version = "0.5.2" } -ethers = { git = "https://github.com/gakonst/ethers-rs" } +ethers = { git = "https://github.com/gakonst/ethers-rs", features = ["solc-full"] } eyre = "0.6.5" once_cell = "1.8.0" tracing = "0.1.28" bytes = "1.1.0" -tokio = { version = "1.12.0", features = ["rt-multi-thread"] } +tokio = { version = "1.12.0", features = ["rt-multi-thread", "macros"] } hex = "0.4.3" thiserror = "1.0.29" proptest = "1.0.0" diff --git a/evm-adapters/src/evmodin.rs b/evm-adapters/src/evmodin.rs index 1ead6f8cd3f4c..0a332268de5f5 100644 --- a/evm-adapters/src/evmodin.rs +++ b/evm-adapters/src/evmodin.rs @@ -152,7 +152,7 @@ mod tests { // TODO: Ignore until we figure out how to deploy stuff in evmodin fn evmodin_can_call_vm_directly() { let revision = Revision::Istanbul; - let compiled = COMPILED.get("Greeter").expect("could not find contract"); + let compiled = COMPILED.find("Greeter").expect("could not find contract"); let host = MockedHost::default(); @@ -167,7 +167,7 @@ mod tests { #[ignore] fn evmodin_can_call_solidity_unit_test() { let revision = Revision::Istanbul; - let compiled = COMPILED.get("Greeter").expect("could not find contract"); + let compiled = COMPILED.find("Greeter").expect("could not find contract"); let host = MockedHost::default(); let gas_limit = 12_000_000; let evm = EvmOdin::new(host, gas_limit, revision, NoopTracer); diff --git a/evm-adapters/src/lib.rs b/evm-adapters/src/lib.rs index a26b400bca186..5fc38dcfc6008 100644 --- a/evm-adapters/src/lib.rs +++ b/evm-adapters/src/lib.rs @@ -179,16 +179,21 @@ pub trait Evm { #[cfg(test)] mod test_helpers { use super::*; - use dapp_solc::SolcBuilder; - use ethers::{prelude::Lazy, utils::CompiledContract}; - use std::collections::HashMap; - - pub static COMPILED: Lazy> = - Lazy::new(|| SolcBuilder::new("./testdata/*.sol", &[], &[]).unwrap().build_all().unwrap()); - - pub fn can_call_vm_directly>(mut evm: E, compiled: &CompiledContract) { + use ethers::{ + prelude::Lazy, + solc::{artifacts::CompactContractRef, CompilerOutput, Project, ProjectPathsConfig}, + }; + + pub static COMPILED: Lazy = Lazy::new(|| { + let paths = + ProjectPathsConfig::builder().root("testdata").sources("testdata").build().unwrap(); + let project = Project::builder().paths(paths).ephemeral().no_artifacts().build().unwrap(); + project.compile().unwrap().output() + }); + + pub fn can_call_vm_directly>(mut evm: E, compiled: CompactContractRef) { let (addr, _, _, _) = - evm.deploy(Address::zero(), compiled.bytecode.clone(), 0.into()).unwrap(); + evm.deploy(Address::zero(), compiled.bin.unwrap().clone(), 0.into()).unwrap(); let (_, status1, _, _) = evm .call::<(), _, _>(Address::zero(), addr, "greet(string)", "hi".to_owned(), 0.into()) @@ -205,9 +210,9 @@ mod test_helpers { }); } - pub fn solidity_unit_test>(mut evm: E, compiled: &CompiledContract) { + pub fn solidity_unit_test>(mut evm: E, compiled: CompactContractRef) { let (addr, _, _, _) = - evm.deploy(Address::zero(), compiled.bytecode.clone(), 0.into()).unwrap(); + evm.deploy(Address::zero(), compiled.bin.unwrap().clone(), 0.into()).unwrap(); // call the setup function to deploy the contracts inside the test let status1 = evm.setup(addr).unwrap().0; diff --git a/evm-adapters/src/sputnik/cheatcodes/cheatcode_handler.rs b/evm-adapters/src/sputnik/cheatcodes/cheatcode_handler.rs index b3eb359e831bb..830a603527b29 100644 --- a/evm-adapters/src/sputnik/cheatcodes/cheatcode_handler.rs +++ b/evm-adapters/src/sputnik/cheatcodes/cheatcode_handler.rs @@ -20,8 +20,7 @@ use std::{process::Command, rc::Rc}; use ethers::{ abi::{RawLog, Token}, contract::EthLogDecode, - core::{k256::ecdsa::SigningKey, utils}, - prelude::AbiDecode, + core::{abi::AbiDecode, k256::ecdsa::SigningKey, utils}, signers::{LocalWallet, Signer}, types::{Address, H160, H256, U256}, }; @@ -617,9 +616,9 @@ mod tests { let gas_limit = 10_000_000; let mut evm = Executor::new_with_cheatcodes(backend, gas_limit, &config, true); - let compiled = COMPILED.get("DebugLogs").expect("could not find contract"); + let compiled = COMPILED.find("DebugLogs").expect("could not find contract"); let (addr, _, _, _) = - evm.deploy(Address::zero(), compiled.bytecode.clone(), 0.into()).unwrap(); + evm.deploy(Address::zero(), compiled.bin.unwrap().clone(), 0.into()).unwrap(); // after the evm call is done, we call `logs` and print it all to the user let (_, _, _, logs) = @@ -656,9 +655,9 @@ mod tests { let gas_limit = 10_000_000; let mut evm = Executor::new_with_cheatcodes(backend, gas_limit, &config, true); - let compiled = COMPILED.get("CheatCodes").expect("could not find contract"); + let compiled = COMPILED.find("CheatCodes").expect("could not find contract"); let (addr, _, _, _) = - evm.deploy(Address::zero(), compiled.bytecode.clone(), 0.into()).unwrap(); + evm.deploy(Address::zero(), compiled.bin.unwrap().clone(), 0.into()).unwrap(); let state = evm.state().clone(); let mut cfg = proptest::test_runner::Config::default(); @@ -676,7 +675,8 @@ mod tests { let evm = FuzzedExecutor::new(&mut evm, runner); - for func in compiled.abi.functions().filter(|func| func.name.starts_with("test")) { + let abi = compiled.abi.as_ref().unwrap(); + for func in abi.functions().filter(|func| func.name.starts_with("test")) { let should_fail = func.name.starts_with("testFail"); if func.inputs.is_empty() { let (_, reason, _, _) = @@ -699,9 +699,9 @@ mod tests { let gas_limit = 10_000_000; let mut evm = Executor::new_with_cheatcodes(backend, gas_limit, &config, false); - let compiled = COMPILED.get("CheatCodes").expect("could not find contract"); + let compiled = COMPILED.find("CheatCodes").expect("could not find contract"); let (addr, _, _, _) = - evm.deploy(Address::zero(), compiled.bytecode.clone(), 0.into()).unwrap(); + evm.deploy(Address::zero(), compiled.bin.unwrap().clone(), 0.into()).unwrap(); let err = evm.call::<(), _, _>(Address::zero(), addr, "testFFI()", (), 0.into()).unwrap_err(); diff --git a/evm-adapters/src/sputnik/evm.rs b/evm-adapters/src/sputnik/evm.rs index 5a0fd1a5def14..7ff668d4ee0b8 100644 --- a/evm-adapters/src/sputnik/evm.rs +++ b/evm-adapters/src/sputnik/evm.rs @@ -196,7 +196,7 @@ mod tests { #[test] fn sputnik_can_call_vm_directly() { let cfg = Config::istanbul(); - let compiled = COMPILED.get("Greeter").expect("could not find contract"); + let compiled = COMPILED.find("Greeter").expect("could not find contract"); let vicinity = new_vicinity(); let backend = new_backend(&vicinity, Default::default()); @@ -208,7 +208,7 @@ mod tests { fn sputnik_solidity_unit_test() { let cfg = Config::istanbul(); - let compiled = COMPILED.get("GreeterTest").expect("could not find contract"); + let compiled = COMPILED.find("GreeterTest").expect("could not find contract"); let vicinity = new_vicinity(); let backend = new_backend(&vicinity, Default::default()); @@ -220,14 +220,14 @@ mod tests { fn failing_with_no_reason_if_no_setup() { let cfg = Config::istanbul(); - let compiled = COMPILED.get("GreeterTest").expect("could not find contract"); + let compiled = COMPILED.find("GreeterTest").expect("could not find contract"); let vicinity = new_vicinity(); let backend = new_backend(&vicinity, Default::default()); let mut evm = Executor::new(12_000_000, &cfg, &backend); let (addr, _, _, _) = - evm.deploy(Address::zero(), compiled.bytecode.clone(), 0.into()).unwrap(); + evm.deploy(Address::zero(), compiled.bin.unwrap().clone(), 0.into()).unwrap(); let (status, res) = evm.executor.transact_call( Address::zero(), @@ -245,14 +245,14 @@ mod tests { fn failing_solidity_unit_test() { let cfg = Config::istanbul(); - let compiled = COMPILED.get("GreeterTest").expect("could not find contract"); + let compiled = COMPILED.find("GreeterTest").expect("could not find contract"); let vicinity = new_vicinity(); let backend = new_backend(&vicinity, Default::default()); let mut evm = Executor::new(12_000_000, &cfg, &backend); let (addr, _, _, _) = - evm.deploy(Address::zero(), compiled.bytecode.clone(), 0.into()).unwrap(); + evm.deploy(Address::zero(), compiled.bin.clone().unwrap().clone(), 0.into()).unwrap(); // call the setup function to deploy the contracts inside the test let status = evm.setup(addr).unwrap().0; @@ -266,27 +266,25 @@ mod tests { _ => panic!("unexpected error variant"), }; assert_eq!(reason, "not equal to `hi`".to_string()); - assert_eq!(gas_used, 30330); + assert_eq!(gas_used, 31233); } #[test] fn test_can_call_large_contract() { let cfg = Config::istanbul(); - use dapp_solc::SolcBuilder; + use ethers::solc::Solc; - let compiled = SolcBuilder::new("./testdata/LargeContract.sol", &[], &[]) - .unwrap() - .build_all() - .unwrap(); - let compiled = compiled.get("LargeContract").unwrap(); + let path = "./testdata/LargeContract.sol"; + let compiled = Solc::default().compile_source(path).unwrap(); + let compiled = compiled.get(path, "LargeContract").unwrap(); let vicinity = new_vicinity(); let backend = new_backend(&vicinity, Default::default()); let mut evm = Executor::new(13_000_000, &cfg, &backend); let from = Address::random(); - let (addr, _, _, _) = evm.deploy(from, compiled.bytecode.clone(), 0.into()).unwrap(); + let (addr, _, _, _) = evm.deploy(from, compiled.bin.unwrap().clone(), 0.into()).unwrap(); // makes a call to the contract let sig = ethers::utils::id("foo()").to_vec(); diff --git a/evm-adapters/src/sputnik/forked_backend/rpc.rs b/evm-adapters/src/sputnik/forked_backend/rpc.rs index 21faa7782b133..2ee47db9a40ee 100644 --- a/evm-adapters/src/sputnik/forked_backend/rpc.rs +++ b/evm-adapters/src/sputnik/forked_backend/rpc.rs @@ -213,7 +213,7 @@ mod tests { #[test] fn forked_backend() { let cfg = Config::istanbul(); - let compiled = COMPILED.get("Greeter").expect("could not find contract"); + let compiled = COMPILED.find("Greeter").expect("could not find contract"); let provider = Provider::::try_from( "https://mainnet.infura.io/v3/c60b0bb42f8a4c6481ecd229eddaca27", @@ -228,7 +228,7 @@ mod tests { let mut evm = Executor::new(12_000_000, &cfg, &backend); let (addr, _, _, _) = - evm.deploy(Address::zero(), compiled.bytecode.clone(), 0.into()).unwrap(); + evm.deploy(Address::zero(), compiled.bin.unwrap().clone(), 0.into()).unwrap(); let (res, _, _, _) = evm.call::(Address::zero(), addr, "time()(uint256)", (), 0.into()).unwrap(); From 8db4cddb4c9ab5c7fcbaad127bfc2f7e98f08812 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:07:25 +0200 Subject: [PATCH 05/17] refactor(dapp): move sol contracts under testdata/ --- FooTest.sol => dapp/testdata/FooTest.sol | 0 FooTest2.sol => dapp/testdata/FooTest2.sol | 0 dapp/{ => testdata}/GreetTest.sol | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename FooTest.sol => dapp/testdata/FooTest.sol (100%) rename FooTest2.sol => dapp/testdata/FooTest2.sol (100%) rename dapp/{ => testdata}/GreetTest.sol (100%) diff --git a/FooTest.sol b/dapp/testdata/FooTest.sol similarity index 100% rename from FooTest.sol rename to dapp/testdata/FooTest.sol diff --git a/FooTest2.sol b/dapp/testdata/FooTest2.sol similarity index 100% rename from FooTest2.sol rename to dapp/testdata/FooTest2.sol diff --git a/dapp/GreetTest.sol b/dapp/testdata/GreetTest.sol similarity index 100% rename from dapp/GreetTest.sol rename to dapp/testdata/GreetTest.sol From 3c92342e17963c6b65dbe60e0348ef65983c2e6e Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:07:40 +0200 Subject: [PATCH 06/17] chore(dapp): remove dapptools artifacts they will be available via the upstream compilation pipeline --- dapp/src/artifacts.rs | 72 ------------------------------------------- dapp/src/lib.rs | 4 --- 2 files changed, 76 deletions(-) delete mode 100644 dapp/src/artifacts.rs diff --git a/dapp/src/artifacts.rs b/dapp/src/artifacts.rs deleted file mode 100644 index c02c2ce4d6685..0000000000000 --- a/dapp/src/artifacts.rs +++ /dev/null @@ -1,72 +0,0 @@ -use ethers::core::utils::{solc::Contract, CompiledContract}; -use eyre::{Result, WrapErr}; -use serde::{Deserialize, Serialize}; -use std::{ - collections::{BTreeMap, HashMap}, - path::Path, -}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct DapptoolsArtifact { - contracts: BTreeMap>, -} - -impl DapptoolsArtifact { - /// Convenience function to read from a file - pub fn read(file: impl AsRef) -> Result { - let file = std::fs::File::open(file.as_ref()).wrap_err_with(|| { - format!("Failed to open artifacts file `{}`", file.as_ref().display()) - })?; - Ok(serde_json::from_reader::<_, _>(file)?) - } - - /// Returns all the contract from the artifacts - pub fn into_contracts(self) -> Result> { - let mut map = HashMap::with_capacity(self.contracts.len()); - for (key, value) in self.contracts { - for (contract, data) in value { - let data: Contract = serde_json::from_value(data)?; - let data = CompiledContract { - abi: data.abi, - bytecode: data.evm.bytecode.object, - runtime_bytecode: data.evm.deployed_bytecode.object, - }; - map.insert(format!("{}:{}", key, contract), data); - } - } - - Ok(map) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn parses_dapptools_artifact() { - let path = std::fs::canonicalize("testdata/dapp-artifact.json").unwrap(); - let data = DapptoolsArtifact::read(path).unwrap(); - let contracts = data.into_contracts().unwrap(); - let mut expected = [ - "src/test/Greeter.t.sol:Greet", - "lib/ds-test/src/test.sol:DSTest", - "src/test/utils/Hevm.sol:Hevm", - "src/test/Greeter.t.sol:Gm", - "src/test/utils/GreeterTest.sol:User", - "src/test/utils/GreeterTest.sol:GreeterTest", - "lib/openzeppelin-contracts/contracts/access/Ownable.sol:Ownable", - "lib/openzeppelin-contracts/contracts/utils/Context.sol:Context", - "src/Greeter.sol:Greeter", - "src/Greeter.sol:Errors", - ] - .iter() - .map(|x| x.to_string()) - .collect::>(); - expected.sort_by_key(|name| name.to_lowercase()); - - let mut got = contracts.keys().cloned().collect::>(); - got.sort_by_key(|name| name.to_lowercase()); - assert_eq!(expected, got); - } -} diff --git a/dapp/src/lib.rs b/dapp/src/lib.rs index 0a2d69f111ce3..4de39f78f060e 100644 --- a/dapp/src/lib.rs +++ b/dapp/src/lib.rs @@ -1,7 +1,3 @@ -mod artifacts; -pub use artifacts::DapptoolsArtifact; -pub use ethers::core::utils::{solc::Contract, CompiledContract}; - mod runner; pub use runner::{ContractRunner, TestResult}; From 38fd28eb56d7eaed54de1fb7b33e3f1a533703b4 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:08:38 +0200 Subject: [PATCH 07/17] fix(dapp): adjust breaking changes COMPILED.get -> COMPILED.find bytecode -> bin --- dapp/Cargo.toml | 4 +--- dapp/src/lib.rs | 19 ++++++++++++------- dapp/src/runner.rs | 39 +++++++++++++++++++-------------------- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/dapp/Cargo.toml b/dapp/Cargo.toml index 83f6fc4505c58..3aed39e191dcd 100644 --- a/dapp/Cargo.toml +++ b/dapp/Cargo.toml @@ -8,11 +8,10 @@ license = "MIT OR Apache-2.0" [dependencies] dapp-utils = { path = "./../utils" } -dapp-solc = { path = "./../solc" } evm-adapters = { path = "./../evm-adapters", default-features = false } # ethers = { version = "0.5.2" } -ethers = { git = "https://github.com/gakonst/ethers-rs" } +ethers = { git = "https://github.com/gakonst/ethers-rs", features = ["solc-full"] } svm = { package = "svm-rs", git = "https://github.com/roynalnaruto/svm-rs" } eyre = "0.6.5" @@ -33,4 +32,3 @@ evm-adapters = { path = "./../evm-adapters", features = ["sputnik", "sputnik-hel evmodin = { git = "https://github.com/vorot93/evmodin", features = ["util"] } # evm = { version = "0.30.1" } evm = { git = "https://github.com/rust-blockchain/evm" } -dapp-solc = { path = "./../solc", features = ["sync"] } diff --git a/dapp/src/lib.rs b/dapp/src/lib.rs index 4de39f78f060e..ceea9488627b3 100644 --- a/dapp/src/lib.rs +++ b/dapp/src/lib.rs @@ -13,12 +13,17 @@ pub fn decode_revert(error: &[u8]) -> Result { #[cfg(test)] pub mod test_helpers { + use ethers::{ + prelude::Lazy, + solc::{CompilerOutput, Project, ProjectPathsConfig}, + }; - use ethers::{prelude::Lazy, utils::CompiledContract}; - use std::collections::HashMap; - - use dapp_solc::SolcBuilder; - - pub static COMPILED: Lazy> = - Lazy::new(|| SolcBuilder::new("./*.sol", &[], &[]).unwrap().build_all().unwrap()); + pub static COMPILED: Lazy = Lazy::new(|| { + // NB: should we add a test-helper function that makes creating these + // ephemeral projects easier? + let paths = + ProjectPathsConfig::builder().root("testdata").sources("testdata").build().unwrap(); + let project = Project::builder().paths(paths).ephemeral().no_artifacts().build().unwrap(); + project.compile().unwrap().output() + }); } diff --git a/dapp/src/runner.rs b/dapp/src/runner.rs index d4bc037e2e059..9e9215ba88d10 100644 --- a/dapp/src/runner.rs +++ b/dapp/src/runner.rs @@ -1,7 +1,6 @@ use ethers::{ - abi::{Function, Token}, + abi::{Abi, Function, Token}, types::{Address, Bytes}, - utils::CompiledContract, }; use evm_adapters::{fuzz::FuzzedExecutor, Evm, EvmError}; @@ -53,7 +52,7 @@ pub struct ContractRunner<'a, S, E> { /// since we don't use any parallelized fuzzing yet the `test` function has exclusive access of /// the mutable reference over time of its existence. pub evm: &'a mut E, - pub contract: &'a CompiledContract, + pub contract: &'a Abi, pub address: Address, /// Any logs emitted in the constructor of the specific contract pub init_logs: &'a [String], @@ -64,7 +63,7 @@ pub struct ContractRunner<'a, S, E> { impl<'a, S, E> ContractRunner<'a, S, E> { pub fn new( evm: &'a mut E, - contract: &'a CompiledContract, + contract: &'a Abi, address: Address, init_logs: &'a [String], ) -> Self { @@ -81,10 +80,9 @@ impl<'a, S: Clone, E: Evm> ContractRunner<'a, S, E> { ) -> Result> { tracing::info!("starting tests"); let start = Instant::now(); - let needs_setup = self.contract.abi.functions().any(|func| func.name == "setUp"); + let needs_setup = self.contract.functions().any(|func| func.name == "setUp"); let test_fns = self .contract - .abi .functions() .into_iter() .filter(|func| func.name.starts_with("test")) @@ -227,6 +225,7 @@ impl<'a, S: Clone, E: Evm> ContractRunner<'a, S, E> { mod tests { use super::*; use crate::test_helpers::COMPILED; + use ethers::solc::artifacts::CompactContractRef; use evm::Config; use std::marker::PhantomData; @@ -245,7 +244,7 @@ mod tests { #[test] fn test_runner() { let cfg = Config::istanbul(); - let compiled = COMPILED.get("GreeterTest").expect("could not find contract"); + let compiled = COMPILED.find("GreeterTest").expect("could not find contract"); let vicinity = new_vicinity(); let backend = new_backend(&vicinity, Default::default()); let evm = Executor::new(12_000_000, &cfg, &backend); @@ -255,17 +254,17 @@ mod tests { #[test] fn test_fuzzing_counterexamples() { let cfg = Config::istanbul(); - let compiled = COMPILED.get("GreeterTest").expect("could not find contract"); + let compiled = COMPILED.find("GreeterTest").expect("could not find contract"); let vicinity = new_vicinity(); let backend = new_backend(&vicinity, Default::default()); let mut evm = Executor::new(12_000_000, &cfg, &backend); let (addr, _, _, _) = - evm.deploy(Address::zero(), compiled.bytecode.clone(), 0.into()).unwrap(); + evm.deploy(Address::zero(), compiled.bin.unwrap().clone(), 0.into()).unwrap(); let mut runner = ContractRunner { evm: &mut evm, - contract: compiled, + contract: compiled.abi.as_ref().unwrap(), address: addr, state: PhantomData, init_logs: &[], @@ -286,17 +285,17 @@ mod tests { #[test] fn test_fuzzing_ok() { let cfg = Config::istanbul(); - let compiled = COMPILED.get("GreeterTest").expect("could not find contract"); + let compiled = COMPILED.find("GreeterTest").expect("could not find contract"); let vicinity = new_vicinity(); let backend = new_backend(&vicinity, Default::default()); let mut evm = Executor::new(u64::MAX, &cfg, &backend); let (addr, _, _, _) = - evm.deploy(Address::zero(), compiled.bytecode.clone(), 0.into()).unwrap(); + evm.deploy(Address::zero(), compiled.bin.unwrap().clone(), 0.into()).unwrap(); let mut runner = ContractRunner { evm: &mut evm, - contract: compiled, + contract: compiled.abi.as_ref().unwrap(), address: addr, state: PhantomData, init_logs: &[], @@ -314,17 +313,17 @@ mod tests { #[test] fn test_fuzz_shrinking() { let cfg = Config::istanbul(); - let compiled = COMPILED.get("GreeterTest").expect("could not find contract"); + let compiled = COMPILED.find("GreeterTest").expect("could not find contract"); let vicinity = new_vicinity(); let backend = new_backend(&vicinity, Default::default()); let mut evm = Executor::new(12_000_000, &cfg, &backend); let (addr, _, _, _) = - evm.deploy(Address::zero(), compiled.bytecode.clone(), 0.into()).unwrap(); + evm.deploy(Address::zero(), compiled.bin.unwrap().clone(), 0.into()).unwrap(); let mut runner = ContractRunner { evm: &mut evm, - contract: compiled, + contract: compiled.abi.as_ref().unwrap(), address: addr, state: PhantomData, init_logs: &[], @@ -371,7 +370,7 @@ mod tests { #[ignore] fn test_runner() { let revision = Revision::Istanbul; - let compiled = COMPILED.get("GreeterTest").expect("could not find contract"); + let compiled = COMPILED.find("GreeterTest").expect("could not find contract"); let host = MockedHost::default(); @@ -381,13 +380,13 @@ mod tests { } } - pub fn test_runner>(mut evm: E, compiled: &CompiledContract) { + pub fn test_runner>(mut evm: E, compiled: CompactContractRef) { let (addr, _, _, _) = - evm.deploy(Address::zero(), compiled.bytecode.clone(), 0.into()).unwrap(); + evm.deploy(Address::zero(), compiled.bin.unwrap().clone(), 0.into()).unwrap(); let mut runner = ContractRunner { evm: &mut evm, - contract: compiled, + contract: compiled.abi.as_ref().unwrap(), address: addr, state: PhantomData, init_logs: &[], From c6853263d0a0771e8ec5a675ad777ddff16da3ce Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:12:59 +0200 Subject: [PATCH 08/17] feat(multi-runner): use new compilation pipeline We now provide a pre-configured Project to the builder, it'll proceed to compile it and use the artifacts accordingly. The addresses map is now part of the contracts map --- dapp/src/multi_runner.rs | 147 +++++++++++++++------------------------ 1 file changed, 57 insertions(+), 90 deletions(-) diff --git a/dapp/src/multi_runner.rs b/dapp/src/multi_runner.rs index 2aa168ef16a20..aacd49af85918 100644 --- a/dapp/src/multi_runner.rs +++ b/dapp/src/multi_runner.rs @@ -1,30 +1,25 @@ -use crate::{artifacts::DapptoolsArtifact, runner::TestResult, ContractRunner}; -use dapp_solc::SolcBuilder; +use crate::{runner::TestResult, ContractRunner}; use evm_adapters::Evm; use ethers::{ + abi::Abi, + prelude::ArtifactOutput, + solc::{Artifact, Project}, types::{Address, U256}, - utils::CompiledContract, }; use proptest::test_runner::TestRunner; use regex::Regex; use eyre::{Context, Result}; -use std::{collections::HashMap, marker::PhantomData, path::PathBuf}; +use std::{ + collections::{BTreeMap, HashMap}, + marker::PhantomData, +}; /// Builder used for instantiating the multi-contract runner -#[derive(Clone, Debug, Default)] -pub struct MultiContractRunnerBuilder<'a> { - /// Glob to the contracts we want compiled - pub contracts: &'a str, - /// Solc remappings - pub remappings: &'a [String], - /// Solc lib import paths - pub libraries: &'a [String], - /// The path for the output file - pub out_path: PathBuf, - pub no_compile: bool, +#[derive(Debug, Default)] +pub struct MultiContractRunnerBuilder { /// The fuzzer to be used for running fuzz tests pub fuzzer: Option, /// The address which will be used to deploy the initial contracts @@ -33,57 +28,61 @@ pub struct MultiContractRunnerBuilder<'a> { pub initial_balance: U256, } -impl<'a> MultiContractRunnerBuilder<'a> { +impl MultiContractRunnerBuilder { /// Given an EVM, proceeds to return a runner which is able to execute all tests /// against that evm - pub fn build(self, mut evm: E) -> Result> + pub fn build( + self, + project: Project, + mut evm: E, + ) -> Result> where + // TODO: Can we remove the static? It's due to the `into_artifacts()` call below + A: ArtifactOutput + 'static, E: Evm, { - // 1. incremental compilation - // 2. parallel compilation - // 3. Hardhat / Truffle-style artifacts - let contracts = if self.no_compile { - DapptoolsArtifact::read(self.out_path)?.into_contracts()? + let output = project.compile()?; + if output.is_unchanged() { + println!("no files changed, compilation skippped."); + } else if output.has_compiler_errors() { + // return the diagnostics error back to the user. + eyre::bail!(output.to_string()) } else { - SolcBuilder::new(self.contracts, self.remappings, self.libraries)?.build_all()? - }; + println!("success."); + } let deployer = self.deployer; let initial_balance = self.initial_balance; - let addresses = contracts - .iter() - .filter(|(_, compiled)| { - compiled.abi.constructor.as_ref().map(|c| c.inputs.is_empty()).unwrap_or(true) + + // This is just the contracts compiled, but we need to merge this with the read cached + // artifacts + let contracts = output.into_artifacts(); + let contracts: BTreeMap)> = contracts + .map(|(fname, contract)| { + let (abi, bytecode) = contract.into_inner(); + (fname, abi.unwrap(), bytecode.unwrap()) }) - .filter(|(_, compiled)| { - compiled.abi.functions().any(|func| func.name.starts_with("test")) + // Only take contracts with empty constructors. + .filter(|(_, abi, _)| { + abi.constructor.as_ref().map(|c| c.inputs.is_empty()).unwrap_or(true) }) - .map(|(name, compiled)| { + // Only take contracts which contain a `test` function + .filter(|(_, abi, _)| abi.functions().any(|func| func.name.starts_with("test"))) + // deploy the contracts + .map(|(name, abi, bytecode)| { let span = tracing::trace_span!("deploying", ?name); let _enter = span.enter(); let (addr, _, _, logs) = evm - .deploy(deployer, compiled.bytecode.clone(), 0.into()) + .deploy(deployer, bytecode, 0.into()) .wrap_err(format!("could not deploy {}", name))?; evm.set_balance(addr, initial_balance); - Ok((name.clone(), (addr, logs))) + Ok((name, (abi, addr, logs))) }) - .collect::>>()?; - - Ok(MultiContractRunner { - contracts, - addresses, - evm, - state: PhantomData, - fuzzer: self.fuzzer, - }) - } + .collect::>>()?; - pub fn contracts(mut self, contracts: &'a str) -> Self { - self.contracts = contracts; - self + Ok(MultiContractRunner { contracts, evm, state: PhantomData, fuzzer: self.fuzzer }) } pub fn deployer(mut self, deployer: Address) -> Self { @@ -100,36 +99,19 @@ impl<'a> MultiContractRunnerBuilder<'a> { self.fuzzer = Some(fuzzer); self } - - pub fn remappings(mut self, remappings: &'a [String]) -> Self { - self.remappings = remappings; - self - } - - pub fn libraries(mut self, libraries: &'a [String]) -> Self { - self.libraries = libraries; - self - } - - pub fn out_path(mut self, out_path: PathBuf) -> Self { - self.out_path = out_path; - self - } - - pub fn skip_compilation(mut self, flag: bool) -> Self { - self.no_compile = flag; - self - } } +/// A multi contract runner receives a set of contracts deployed in an EVM instance and proceeds +/// to run all test functions in these contracts. pub struct MultiContractRunner { - /// Mapping of contract name to compiled bytecode - contracts: HashMap, - /// Mapping of contract name to the address it's been injected in the EVM state - addresses: HashMap)>, + /// Mapping of contract name to compiled bytecode, deployed address and logs emitted during + /// deployment + contracts: BTreeMap)>, /// The EVM instance used in the test runner evm: E, + /// The fuzzer which will be used to run parametric tests (w/ non-0 solidity args) fuzzer: Option, + /// Market type for the EVM state being used state: PhantomData, } @@ -139,26 +121,12 @@ where S: Clone, { pub fn test(&mut self, pattern: Regex) -> Result>> { - // NB: We also have access to the contract's abi. When running the test. - // Can this be useful for decorating the stacktrace during a revert? - // TODO: Check if the function starts with `prove` or `invariant` - // Filter out for contracts that have at least 1 test function + // TODO: Convert to iterator, ideally parallel one? let contracts = std::mem::take(&mut self.contracts); - let tests = contracts + let results = contracts .iter() - .filter(|(_, contract)| contract.abi.functions().any(|x| x.name.starts_with("test"))); - - // TODO: Is this pattern OK? We use the memory and then write it back to avoid any - // borrow checker issues. Otherwise, we'd need to clone large vectors. - let addresses = std::mem::take(&mut self.addresses); - let results = tests - .into_iter() - .map(|(name, contract)| { - let (address, init_logs) = addresses - .get(name) - .ok_or_else(|| eyre::eyre!("could not find contract address"))?; - - let result = self.run_tests(name, contract, *address, init_logs, &pattern)?; + .map(|(name, (abi, address, logs))| { + let result = self.run_tests(name, abi, *address, logs, &pattern)?; Ok((name.clone(), result)) }) .filter_map(|x: Result<_>| x.ok()) @@ -166,7 +134,6 @@ where .collect::>(); self.contracts = contracts; - self.addresses = addresses; Ok(results) } @@ -181,7 +148,7 @@ where fn run_tests( &mut self, _name: &str, - contract: &CompiledContract, + contract: &Abi, address: Address, init_logs: &[String], pattern: &Regex, From 162ffbab697b2f5f90c0de7e653c3296fbf7dc0a Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:13:14 +0200 Subject: [PATCH 09/17] test(multi-runner): adjust tests to match new compilation pipeline --- dapp/src/multi_runner.rs | 71 ++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/dapp/src/multi_runner.rs b/dapp/src/multi_runner.rs index aacd49af85918..94606863a2926 100644 --- a/dapp/src/multi_runner.rs +++ b/dapp/src/multi_runner.rs @@ -161,34 +161,48 @@ where #[cfg(test)] mod tests { use super::*; + use ethers::solc::ProjectPathsConfig; + use std::path::PathBuf; - fn test_multi_runner>(evm: E) { - let mut runner = - MultiContractRunnerBuilder::default().contracts("./GreetTest.sol").build(evm).unwrap(); + fn project() -> Project { + let root = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("testdata"); - let results = runner.test(Regex::new(".*").unwrap()).unwrap(); + let paths = ProjectPathsConfig::builder().root(&root).sources(&root).build().unwrap(); + + let project = Project::builder() + // need to add the ilb path here. would it be better placed in the ProjectPathsConfig + // instead? what is the `libs` modifier useful for then? linked libraries? + .allowed_path(root.join("../../evm-adapters/testdata")) + .paths(paths) + .ephemeral() + .no_artifacts() + .build() + .unwrap(); + + project + } + + fn runner>(evm: E) -> MultiContractRunner { + MultiContractRunnerBuilder::default().build(project(), evm).unwrap() + } - // 2 contracts - assert_eq!(results.len(), 2); + fn test_multi_runner>(evm: E) { + let mut runner = runner(evm); + let results = runner.test(Regex::new(".*").unwrap()).unwrap(); - // 3 tests on greeter 1 on gm - assert_eq!(results["GreeterTest"].len(), 3); - assert_eq!(results["GmTest"].len(), 1); - for (_, res) in results { - assert!(res.iter().all(|(_, result)| result.success)); + // 6 contracts being built + assert_eq!(results.keys().len(), 5); + for (_, contract_tests) in results { + assert_ne!(contract_tests.keys().len(), 0); + assert!(contract_tests.iter().all(|(_, result)| result.success)); } + // can also filter let only_gm = runner.test(Regex::new("testGm.*").unwrap()).unwrap(); assert_eq!(only_gm.len(), 1); - assert_eq!(only_gm["GmTest"].len(), 1); - } - fn test_ds_test_fail>(evm: E) { - let mut runner = - MultiContractRunnerBuilder::default().contracts("./../FooTest.sol").build(evm).unwrap(); - let results = runner.test(Regex::new(".*").unwrap()).unwrap(); - let test = results.get("FooTest").unwrap().get("testFailX").unwrap(); - assert!(test.success); + assert_eq!(only_gm["GmTest"].len(), 1); + assert!(only_gm["GmTest"]["testGm"].success); } mod sputnik { @@ -205,15 +219,12 @@ mod tests { let gas_limit = 12_500_000; let env = new_vicinity(); let backend = new_backend(&env, Default::default()); + // important to instantiate the VM with cheatcodes let evm = Executor::new_with_cheatcodes(backend, gas_limit, &config, false); - let mut runner = MultiContractRunnerBuilder::default() - .contracts("./testdata/DebugLogsTest.sol") - .libraries(&["../evm-adapters/testdata".to_owned()]) - .build(evm) - .unwrap(); - + let mut runner = runner(evm); let results = runner.test(Regex::new(".*").unwrap()).unwrap(); + let reasons = results["DebugLogsTest"] .iter() .map(|(name, res)| (name, res.logs.clone())) @@ -237,16 +248,6 @@ mod tests { let evm = Executor::new(gas_limit, &config, &backend); test_multi_runner(evm); } - - #[test] - fn test_sputnik_ds_test_fail() { - let config = Config::istanbul(); - let gas_limit = 12_500_000; - let env = new_vicinity(); - let backend = new_backend(&env, Default::default()); - let evm = Executor::new(gas_limit, &config, &backend); - test_ds_test_fail(evm); - } } // TODO: Add EvmOdin tests once we get the Mocked Host working From 28c5ecca35d91dd7edb6ba6506e377bd60b45f40 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:17:21 +0200 Subject: [PATCH 10/17] feat(cli): set Project paths from the BuildOpts --- dapptools/Cargo.toml | 1 - dapptools/src/dapp_opts.rs | 100 ++++++++++++++++++++++++++++++------- 2 files changed, 82 insertions(+), 19 deletions(-) diff --git a/dapptools/Cargo.toml b/dapptools/Cargo.toml index 0d5df8e871913..26fe655b352a0 100644 --- a/dapptools/Cargo.toml +++ b/dapptools/Cargo.toml @@ -9,7 +9,6 @@ license = "MIT OR Apache-2.0" [dependencies] structopt = "0.3.23" dapp-utils = { path = "../utils" } -dapp-solc = { path = "../solc" } dapp = { path = "../dapp" } seth = { path = "../seth" } evm-adapters = { path = "../evm-adapters" } diff --git a/dapptools/src/dapp_opts.rs b/dapptools/src/dapp_opts.rs index b4778a3d955a2..aba92e38f48bb 100644 --- a/dapptools/src/dapp_opts.rs +++ b/dapptools/src/dapp_opts.rs @@ -1,6 +1,9 @@ use structopt::StructOpt; -use ethers::types::{Address, U256}; +use ethers::{ + solc::{remappings::Remapping, Project, ProjectPathsConfig}, + types::{Address, U256}, +}; use std::{path::PathBuf, str::FromStr}; #[derive(Debug, StructOpt)] @@ -40,9 +43,6 @@ pub enum Subcommands { )] evm_type: EvmType, - #[structopt(help = "skip re-compilation", long, short)] - no_compile: bool, - #[structopt( help = "fetch state over a remote instead of starting from empty state", long, @@ -94,7 +94,12 @@ pub enum Subcommands { dependencies: Vec, }, #[structopt(about = "prints the automatically inferred remappings for this repository")] - Remappings, + Remappings { + #[structopt(help = "the project's root path, default being the current directory", long)] + root: Option, + #[structopt(help = "the paths where your libraries are installed", long)] + lib_paths: Vec, + }, #[structopt(about = "build your smart contracts. Requires `ETHERSCAN_API_KEY` to be set.")] VerifyContract { #[structopt(help = "contract source info `:`")] @@ -154,31 +159,90 @@ impl FromStr for FullContractInfo { } } +impl std::convert::TryFrom<&BuildOpts> for Project { + type Error = eyre::Error; + + /// Defaults to converting to DAppTools-style repo layout, but can be customized. + fn try_from(opts: &BuildOpts) -> eyre::Result { + // 1. Set the root dir + let root = opts.root.clone().unwrap_or_else(|| std::env::current_dir().unwrap()); + let root = std::fs::canonicalize(root)?; + + // 2. Set the contracts dir + let contracts = if let Some(ref contracts) = opts.contracts { + root.join(contracts) + } else { + root.join("src") + }; + + // 3. Set the output dir + let artifacts = if let Some(ref artifacts) = opts.out_path { + root.join(artifacts) + } else { + root.join("out") + }; + + // 4. Set where the libraries are going to be read from + // default to the lib path being the `lib/` dir + let lib_paths = + if opts.lib_paths.is_empty() { vec![root.join("lib")] } else { opts.lib_paths.clone() }; + + // get all the remappings corresponding to the lib paths + let mut remappings: Vec<_> = + lib_paths.iter().map(|path| Remapping::find_many(&path).unwrap()).flatten().collect(); + // extend them with the once manually provided in the opts + remappings.extend_from_slice(&opts.remappings); + // extend them with the one via the env vars + if let Some(ref env) = opts.remappings_env { + let remappings_env = env.split('\n').map(|x| { + Remapping::from_str(x) + .unwrap_or_else(|_| panic!("could not parse remapping: {}", x)) + }); + remappings.extend(remappings_env); + } + // remove any potential duplicates + remappings.sort_unstable(); + remappings.dedup(); + + // build the path + let mut paths_builder = + ProjectPathsConfig::builder().root(&root).sources(contracts).artifacts(artifacts); + + if !remappings.is_empty() { + paths_builder = paths_builder.remappings(remappings); + } + + let paths = paths_builder.build()?; + + // build the project w/ allowed paths = root and all the libs + let project = Project::builder().paths(paths).allowed_path(root).build()?; + + Ok(project) + } +} + #[derive(Debug, StructOpt)] pub struct BuildOpts { + #[structopt(help = "the project's root path, default being the current directory", long)] + pub root: Option, + #[structopt( - help = "glob path to your smart contracts", + help = "the directory relative to the root under which the smart contrats are", long, - short, - default_value = "./src/**/*.sol" + short )] - pub contracts: String, + pub contracts: Option, #[structopt(help = "the remappings", long, short)] - pub remappings: Vec, + pub remappings: Vec, #[structopt(env = "DAPP_REMAPPINGS")] pub remappings_env: Option, #[structopt(help = "the paths where your libraries are installed", long)] - pub lib_paths: Vec, + pub lib_paths: Vec, - #[structopt( - help = "path to where the contract artifacts are stored", - long = "out", - short, - default_value = crate::utils::DAPP_JSON - )] - pub out_path: PathBuf, + #[structopt(help = "path to where the contract artifacts are stored", long = "out", short)] + pub out_path: Option, #[structopt(help = "choose the evm version", long, default_value = "berlin")] pub evm_version: EvmVersion, From 17fe4f3ae17a30eaa5806d29e65eec9eb4a978ad Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:18:03 +0200 Subject: [PATCH 11/17] feat(cli): use Project to compile files --- dapptools/src/dapp.rs | 93 +++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 52 deletions(-) diff --git a/dapptools/src/dapp.rs b/dapptools/src/dapp.rs index 92e7cd95a0485..b7d39d5a86185 100644 --- a/dapptools/src/dapp.rs +++ b/dapptools/src/dapp.rs @@ -1,4 +1,7 @@ -use ethers::prelude::Provider; +use ethers::{ + providers::Provider, + solc::{remappings::Remapping, ArtifactOutput, Project}, +}; use evm_adapters::{ sputnik::{vicinity, ForkMemoryBackend}, FAUCET_ACCOUNT, @@ -8,14 +11,12 @@ use sputnik::backend::Backend; use structopt::StructOpt; use dapp::MultiContractRunnerBuilder; -use dapp_solc::SolcBuilder; use ansi_term::Colour; use ethers::types::U256; mod dapp_opts; -use dapp_opts::{BuildOpts, EvmType, Opts, Subcommands}; -use utils::Remapping; +use dapp_opts::{EvmType, Opts, Subcommands}; use crate::dapp_opts::FullContractInfo; use std::{collections::HashMap, convert::TryFrom, path::Path, sync::Arc}; @@ -30,13 +31,11 @@ fn main() -> eyre::Result<()> { let opts = Opts::from_args(); match opts.sub { Subcommands::Test { - opts: - BuildOpts { contracts, remappings, remappings_env, lib_paths, out_path, evm_version }, + opts, env, json, pattern, evm_type, - no_compile, fork_url, fork_block_number, initial_balance, @@ -44,30 +43,20 @@ fn main() -> eyre::Result<()> { ffi, verbosity, } => { - // if no env var for remappings is provided, try calculating them on the spot - let remappings = if remappings_env.is_none() { - [remappings, utils::Remapping::find_many_str("lib")?].concat() - } else { - remappings - }; - let remappings = utils::merge(remappings, remappings_env); - let lib_paths = utils::default_path(lib_paths)?; - + // Setup the fuzzer // TODO: Add CLI Options to modify the persistence let cfg = proptest::test_runner::Config { failure_persistence: None, ..Default::default() }; let fuzzer = proptest::test_runner::TestRunner::new(cfg); - // prepare the builder + // Set up the project + let project = Project::try_from(&opts)?; + + // prepare the test builder let builder = MultiContractRunnerBuilder::default() - .contracts(&contracts) - .remappings(&remappings) - .libraries(&lib_paths) - .out_path(out_path) .fuzzer(fuzzer) .initial_balance(initial_balance) - .deployer(deployer) - .skip_compilation(no_compile); + .deployer(deployer); // run the tests depending on the chosen EVM match evm_type { @@ -75,7 +64,7 @@ fn main() -> eyre::Result<()> { EvmType::Sputnik => { use evm_adapters::sputnik::Executor; use sputnik::backend::MemoryBackend; - let mut cfg = evm_version.sputnik_cfg(); + let mut cfg = opts.evm_version.sputnik_cfg(); // We disable the contract size limit by default, because Solidity // test smart contracts are likely to be >24kb @@ -111,45 +100,35 @@ fn main() -> eyre::Result<()> { let evm = Executor::new_with_cheatcodes(backend, env.gas_limit, &cfg, ffi); - test(builder, evm, pattern, json, verbosity)?; + test(builder, project, evm, pattern, json, verbosity)?; } #[cfg(feature = "evmodin-evm")] EvmType::EvmOdin => { use evm_adapters::evmodin::EvmOdin; use evmodin::tracing::NoopTracer; - let revision = evm_version.evmodin_cfg(); + let revision = opts.evm_version.evmodin_cfg(); // TODO: Replace this with a proper host. We'll want this to also be // provided generically when we add the Forking host(s). let host = env.evmodin_state(); let evm = EvmOdin::new(host, env.gas_limit, revision, NoopTracer); - test(builder, evm, pattern, json, verbosity)?; + test(builder, project, evm, pattern, json, verbosity)?; } } } - Subcommands::Build { - opts: - BuildOpts { contracts, remappings, remappings_env, lib_paths, out_path, evm_version: _ }, - } => { - // build the contracts - // if no env var for remappings is provided, try calculating them on the spot - let remappings = if remappings_env.is_none() { - [remappings, utils::Remapping::find_many_str("lib")?].concat() + Subcommands::Build { opts } => { + let project = Project::try_from(&opts)?; + let output = project.compile()?; + if output.is_unchanged() { + println!("no files changed, compilation skippped."); + } else if output.has_compiler_errors() { + // return the diagnostics error back to the user. + eyre::bail!(output.to_string()) } else { - remappings - }; - let remappings = utils::merge(remappings, remappings_env); - let lib_paths = utils::default_path(lib_paths)?; - // TODO: Do we also want to include the file path in the contract map so - // that we're more compatible with dapptools' artifact? - let contracts = SolcBuilder::new(&contracts, &remappings, &lib_paths)?.build_all()?; - - let out_file = utils::open_file(out_path)?; - - // dump as json - serde_json::to_writer(out_file, &contracts)?; + println!("success."); + } } Subcommands::VerifyContract { contract, address, constructor_args } => { let FullContractInfo { path, name } = contract; @@ -246,23 +225,33 @@ fn main() -> eyre::Result<()> { Ok(()) })? } - Subcommands::Remappings => { - let remappings = Remapping::find_many("lib")?; - remappings.iter().for_each(|mapping| println!("{}={}", mapping.name, mapping.path)) + Subcommands::Remappings { lib_paths, root } => { + let root = root.unwrap_or_else(|| std::env::current_dir().unwrap()); + let root = std::fs::canonicalize(root)?; + + let lib_paths = + if lib_paths.is_empty() { vec![root.join("lib")] } else { lib_paths }; + let remappings: Vec<_> = lib_paths + .iter() + .map(|path| Remapping::find_many(&path).unwrap()) + .flatten() + .collect(); + remappings.iter().for_each(|x| println!("{}", x)); } } Ok(()) } -fn test>( +fn test>( builder: MultiContractRunnerBuilder, + project: Project, evm: E, pattern: Regex, json: bool, verbosity: u8, ) -> eyre::Result>> { - let mut runner = builder.build(evm)?; + let mut runner = builder.build(project, evm)?; let results = runner.test(pattern)?; From 055cdb35bbba0a3ec35ffb4bbc3ef324121a3fdf Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:18:12 +0200 Subject: [PATCH 12/17] chore(cli): remove unused funcs --- dapptools/src/utils.rs | 269 +---------------------------------------- 1 file changed, 2 insertions(+), 267 deletions(-) diff --git a/dapptools/src/utils.rs b/dapptools/src/utils.rs index 3403fadb97558..fe2342ff89dfb 100644 --- a/dapptools/src/utils.rs +++ b/dapptools/src/utils.rs @@ -1,14 +1,7 @@ -use dapp::Contract; +use ethers::solc::artifacts::Contract; use eyre::{ContextCompat, WrapErr}; -use std::{ - env::VarError, - fs::{File, OpenOptions}, - path::PathBuf, -}; - -/// Default deps path -const DEFAULT_OUT_FILE: &str = "dapp.sol.json"; +use std::{env::VarError, path::PathBuf}; /// Default local RPC endpoint const LOCAL_RPC_URL: &str = "http://127.0.0.1:8545"; @@ -24,151 +17,6 @@ pub fn subscriber() { .init(); } -/// Default to including all files under current directory in the allowed paths -pub fn default_path(path: Vec) -> eyre::Result> { - Ok(if path.is_empty() { vec![".".to_owned()] } else { path }) -} - -/// merge the cli-provided remappings vector with the -/// new-line separated env var -pub fn merge(mut remappings: Vec, remappings_env: Option) -> Vec { - // merge the cli-provided remappings vector with the - // new-line separated env var - if let Some(env) = remappings_env { - remappings.extend_from_slice(&env.split('\n').map(|x| x.to_string()).collect::>()); - // deduplicate the extra remappings - remappings.sort_unstable(); - remappings.dedup(); - } - - remappings -} - -#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord)] -pub struct Remapping { - pub name: String, - pub path: String, -} - -const DAPPTOOLS_CONTRACTS_DIR: &str = "src"; -const JS_CONTRACTS_DIR: &str = "contracts"; - -impl Remapping { - fn find(name: &str) -> eyre::Result { - Self::find_with_type(name, DAPPTOOLS_CONTRACTS_DIR) - .or_else(|_| Self::find_with_type(name, JS_CONTRACTS_DIR)) - } - - fn find_with_type(name: &str, source: &str) -> eyre::Result { - let pattern = if name.contains(source) { - format!("{}/**/*.sol", name) - } else { - format!("{}/{}/**/*.sol", name, source) - }; - let mut dapptools_contracts = glob::glob(&pattern)?; - if dapptools_contracts.next().is_some() { - let path = format!("{}/{}/", name, source); - let mut name = name - .split('/') - .last() - .ok_or_else(|| eyre::eyre!("repo name not found"))? - .to_string(); - name.push('/'); - Ok(Remapping { name, path }) - } else { - eyre::bail!("no contracts found under {}", pattern) - } - } - - pub fn find_many_str(path: &str) -> eyre::Result> { - let remappings = Self::find_many(path)?; - Ok(remappings.iter().map(|mapping| format!("{}={}", mapping.name, mapping.path)).collect()) - } - - /// Gets all the remappings detected - pub fn find_many(path: &str) -> eyre::Result> { - let path = std::path::Path::new(path); - let mut paths = std::fs::read_dir(path) - .wrap_err_with(|| { - format!("Failed to read directory `{}` for remappings", path.display()) - })? - .into_iter() - .collect::>(); - - let mut remappings = Vec::new(); - while let Some(path) = paths.pop() { - let path = path?.path(); - - // get all the directories inside a file if it's a valid dir - if let Ok(dir) = std::fs::read_dir(&path) { - for inner in dir { - let inner = inner?; - let path = inner.path().display().to_string(); - let path = path.rsplit('/').next().unwrap().to_string(); - if path != DAPPTOOLS_CONTRACTS_DIR && path != JS_CONTRACTS_DIR { - paths.push(Ok(inner)); - } - } - } - - let remapping = Self::find(&path.display().to_string()); - if let Ok(remapping) = remapping { - // skip remappings that exist already - if let Some(ref mut found) = - remappings.iter_mut().find(|x: &&mut Remapping| x.name == remapping.name) - { - // always replace with the shortest length path - fn depth(path: &str, delim: char) -> usize { - path.matches(delim).count() - } - // if the one which exists is larger, we should replace it - // if not, ignore it - if depth(&found.path, '/') > depth(&remapping.path, '/') { - **found = remapping; - } - } else { - remappings.push(remapping); - } - } - } - - Ok(remappings) - } -} - -/// Opens the file at `out_path` for R/W and creates it if it doesn't exist. -pub fn open_file(out_path: PathBuf) -> eyre::Result { - Ok(if out_path.is_file() { - // get the file if it exists - OpenOptions::new().write(true).open(out_path)? - } else if out_path.is_dir() { - // get the directory if it exists & the default file path - let out_path = out_path.join(DEFAULT_OUT_FILE); - - // get a file handler (overwrite any contents of the existing file) - OpenOptions::new().write(true).create(true).open(out_path)? - } else { - // otherwise try to create the entire path - - // in case it's a directory, we must mkdir it - let out_path = - if out_path.to_str().ok_or_else(|| eyre::eyre!("not utf-8 path"))?.ends_with('/') { - std::fs::create_dir_all(&out_path)?; - out_path.join(DEFAULT_OUT_FILE) - } else { - // if it's a file path, we must mkdir the parent - let parent = out_path - .parent() - .ok_or_else(|| eyre::eyre!("could not get parent of {:?}", out_path))?; - std::fs::create_dir_all(parent)?; - out_path - }; - - // finally we get the handler - OpenOptions::new().write(true).create_new(true).open(out_path)? - }) -} - /// Reads the `ETHERSCAN_API_KEY` env variable pub fn etherscan_api_key() -> eyre::Result { std::env::var("ETHERSCAN_API_KEY").map_err(|err| match err { @@ -220,116 +68,3 @@ pub fn find_dapp_json_contract(path: &str, name: &str) -> eyre::Result Ok(serde_json::from_value(contract)?) } - -#[cfg(test)] -mod tests { - use super::*; - - // https://doc.rust-lang.org/rust-by-example/std_misc/fs.html - fn touch(path: &std::path::Path) -> std::io::Result<()> { - match std::fs::OpenOptions::new().create(true).write(true).open(path) { - Ok(_) => Ok(()), - Err(e) => Err(e), - } - } - - fn mkdir_or_touch(tmp: &std::path::Path, paths: &[&str]) { - for path in paths { - if path.ends_with(".sol") { - let path = tmp.join(path); - touch(&path).unwrap(); - } else { - let path = tmp.join(path); - std::fs::create_dir_all(&path).unwrap(); - } - } - } - - // helper function for converting path bufs to remapping strings - fn to_str(p: std::path::PathBuf) -> String { - let mut s = p.into_os_string().into_string().unwrap(); - s.push('/'); - s - } - - #[test] - fn recursive_remappings() { - //let tmp_dir_path = PathBuf::from("."); // tempdir::TempDir::new("lib").unwrap(); - let tmp_dir = tempdir::TempDir::new("lib").unwrap(); - let tmp_dir_path = tmp_dir.path(); - let paths = [ - "repo1/src/", - "repo1/src/contract.sol", - "repo1/lib/", - "repo1/lib/ds-math/src/", - "repo1/lib/ds-math/src/contract.sol", - "repo1/lib/ds-math/lib/ds-test/src/", - "repo1/lib/ds-math/lib/ds-test/src/test.sol", - ]; - mkdir_or_touch(&tmp_dir_path, &paths[..]); - - let path = tmp_dir_path.display().to_string(); - let mut remappings = Remapping::find_many(&path).unwrap(); - remappings.sort_unstable(); - - let mut expected = vec![ - Remapping { - name: "repo1/".to_string(), - path: to_str(tmp_dir_path.join("repo1").join("src")), - }, - Remapping { - name: "ds-math/".to_string(), - path: to_str(tmp_dir_path.join("repo1").join("lib").join("ds-math").join("src")), - }, - Remapping { - name: "ds-test/".to_string(), - path: to_str( - tmp_dir_path - .join("repo1") - .join("lib") - .join("ds-math") - .join("lib") - .join("ds-test") - .join("src"), - ), - }, - ]; - expected.sort_unstable(); - assert_eq!(remappings, expected); - } - - #[test] - fn remappings() { - let tmp_dir = tempdir::TempDir::new("lib").unwrap(); - let repo1 = tmp_dir.path().join("src_repo"); - let repo2 = tmp_dir.path().join("contracts_repo"); - - let dir1 = repo1.join("src"); - std::fs::create_dir_all(&dir1).unwrap(); - - let dir2 = repo2.join("contracts"); - std::fs::create_dir_all(&dir2).unwrap(); - - let contract1 = dir1.join("contract.sol"); - touch(&contract1).unwrap(); - - let contract2 = dir2.join("contract.sol"); - touch(&contract2).unwrap(); - - let path = tmp_dir.path().display().to_string(); - let mut remappings = Remapping::find_many(&path).unwrap(); - remappings.sort_unstable(); - let mut expected = vec![ - Remapping { - name: "src_repo/".to_string(), - path: format!("{}/", dir1.into_os_string().into_string().unwrap()), - }, - Remapping { - name: "contracts_repo/".to_string(), - path: format!("{}/", dir2.into_os_string().into_string().unwrap()), - }, - ]; - expected.sort_unstable(); - assert_eq!(remappings, expected); - } -} From 5e754e8fd10867770a0557dcef0ab79df3b6767d Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:18:25 +0200 Subject: [PATCH 13/17] fix(cli/etherscan): breaking api changes --- dapptools/src/cmd/verify.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dapptools/src/cmd/verify.rs b/dapptools/src/cmd/verify.rs index 0489cdf12e9c7..bc0a56b511e49 100644 --- a/dapptools/src/cmd/verify.rs +++ b/dapptools/src/cmd/verify.rs @@ -45,7 +45,7 @@ pub async fn run( let metadata = contract.metadata.wrap_err("No compiler version found")?; let compiler_version = format!("v{}", metadata.compiler.version); let mut constructor_args = None; - if let Some(constructor) = contract.abi.constructor { + if let Some(constructor) = contract.abi.unwrap().constructor { // convert constructor into function #[allow(deprecated)] let fun = Function { @@ -77,8 +77,8 @@ pub async fn run( let contract = VerifyContract::new(address, source, compiler_version) .constructor_arguments(constructor_args) - .optimization(metadata.settings.optimizer.enabled) - .runs(metadata.settings.optimizer.runs); + .optimization(metadata.settings.optimizer.enabled.unwrap_or_default()) + .runs(metadata.settings.optimizer.runs.unwrap_or_default() as u32); let resp = etherscan .submit_contract_verification(&contract) From 4e169c2f2f95013f806a279e131229c232f5b0d9 Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 02:19:07 +0200 Subject: [PATCH 14/17] chore: cargo fmt --- dapptools/src/dapp.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dapptools/src/dapp.rs b/dapptools/src/dapp.rs index b7d39d5a86185..33e6e768a11d7 100644 --- a/dapptools/src/dapp.rs +++ b/dapptools/src/dapp.rs @@ -229,8 +229,7 @@ fn main() -> eyre::Result<()> { let root = root.unwrap_or_else(|| std::env::current_dir().unwrap()); let root = std::fs::canonicalize(root)?; - let lib_paths = - if lib_paths.is_empty() { vec![root.join("lib")] } else { lib_paths }; + let lib_paths = if lib_paths.is_empty() { vec![root.join("lib")] } else { lib_paths }; let remappings: Vec<_> = lib_paths .iter() .map(|path| Remapping::find_many(&path).unwrap()) From 19e9f45f9e29027a91de03c1fe44daab6b5f663f Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Tue, 16 Nov 2021 15:30:19 +0200 Subject: [PATCH 15/17] tests: avoid race conditions during solc install We do that by using ethers-solc/tests feature which imposes a mutex on the solc downloading step. --- Cargo.lock | 20 ++++++++++---------- dapp/Cargo.toml | 1 + evm-adapters/Cargo.toml | 1 + 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 68ac90222c01f..7893a7d14c45f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1004,7 +1004,7 @@ dependencies = [ [[package]] name = "ethers" version = "0.5.4" -source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" +source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" dependencies = [ "ethers-contract", "ethers-core", @@ -1017,7 +1017,7 @@ dependencies = [ [[package]] name = "ethers-contract" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" +source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" dependencies = [ "ethers-contract-abigen", "ethers-contract-derive", @@ -1035,7 +1035,7 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" +source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" dependencies = [ "Inflector", "anyhow", @@ -1056,7 +1056,7 @@ dependencies = [ [[package]] name = "ethers-contract-derive" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" +source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" dependencies = [ "ethers-contract-abigen", "ethers-core", @@ -1070,7 +1070,7 @@ dependencies = [ [[package]] name = "ethers-core" version = "0.5.5" -source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" +source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" dependencies = [ "arrayvec", "bytes", @@ -1098,7 +1098,7 @@ dependencies = [ [[package]] name = "ethers-etherscan" version = "0.1.1" -source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" +source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" dependencies = [ "ethers-core", "reqwest", @@ -1110,7 +1110,7 @@ dependencies = [ [[package]] name = "ethers-middleware" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" +source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" dependencies = [ "async-trait", "ethers-contract", @@ -1133,7 +1133,7 @@ dependencies = [ [[package]] name = "ethers-providers" version = "0.5.4" -source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" +source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" dependencies = [ "async-trait", "auto_impl 0.5.0", @@ -1162,7 +1162,7 @@ dependencies = [ [[package]] name = "ethers-signers" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" +source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" dependencies = [ "async-trait", "coins-bip32", @@ -1182,7 +1182,7 @@ dependencies = [ [[package]] name = "ethers-solc" version = "0.1.0" -source = "git+https://github.com/gakonst/ethers-rs#1da62d65d2f8f4110a350cad9e23f02bf9f0ce78" +source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" dependencies = [ "colored", "ethers-core", diff --git a/dapp/Cargo.toml b/dapp/Cargo.toml index 3aed39e191dcd..217fbb2601b62 100644 --- a/dapp/Cargo.toml +++ b/dapp/Cargo.toml @@ -32,3 +32,4 @@ evm-adapters = { path = "./../evm-adapters", features = ["sputnik", "sputnik-hel evmodin = { git = "https://github.com/vorot93/evmodin", features = ["util"] } # evm = { version = "0.30.1" } evm = { git = "https://github.com/rust-blockchain/evm" } +ethers = { git = "https://github.com/gakonst/ethers-rs", features = ["solc-full", "solc-tests"] } diff --git a/evm-adapters/Cargo.toml b/evm-adapters/Cargo.toml index e471720755bda..a41d021f54478 100644 --- a/evm-adapters/Cargo.toml +++ b/evm-adapters/Cargo.toml @@ -29,6 +29,7 @@ revm_precompiles = "0.1.0" [dev-dependencies] evmodin = { git = "https://github.com/vorot93/evmodin", features = ["util"] } +ethers = { git = "https://github.com/gakonst/ethers-rs", features = ["solc-full", "solc-tests"] } [features] sputnik-helpers = ["sputnik"] From bef4b4c0e392e6f6702e5d6f70d0f62d5bc8fadb Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Wed, 17 Nov 2021 01:25:13 +0200 Subject: [PATCH 16/17] test(evm-adapters): make LargeContract test more robust --- evm-adapters/src/sputnik/evm.rs | 6 +----- evm-adapters/testdata/LargeContract.sol | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/evm-adapters/src/sputnik/evm.rs b/evm-adapters/src/sputnik/evm.rs index 7ff668d4ee0b8..e66fe1f62b143 100644 --- a/evm-adapters/src/sputnik/evm.rs +++ b/evm-adapters/src/sputnik/evm.rs @@ -273,11 +273,7 @@ mod tests { fn test_can_call_large_contract() { let cfg = Config::istanbul(); - use ethers::solc::Solc; - - let path = "./testdata/LargeContract.sol"; - let compiled = Solc::default().compile_source(path).unwrap(); - let compiled = compiled.get(path, "LargeContract").unwrap(); + let compiled = COMPILED.find("LargeContract").expect("could not find contract"); let vicinity = new_vicinity(); let backend = new_backend(&vicinity, Default::default()); diff --git a/evm-adapters/testdata/LargeContract.sol b/evm-adapters/testdata/LargeContract.sol index 1ff76b8f371d5..d07455e76d889 100644 --- a/evm-adapters/testdata/LargeContract.sol +++ b/evm-adapters/testdata/LargeContract.sol @@ -1,4 +1,4 @@ -pragma solidity =0.6.6; +pragma solidity >=0.4.0; contract LargeContract { string public foo = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; From 2178fe00ce47d3feece0e2715c9530c83bb50c1f Mon Sep 17 00:00:00 2001 From: Georgios Konstantopoulos Date: Wed, 17 Nov 2021 01:26:59 +0200 Subject: [PATCH 17/17] fix(ethers-solc): update ethers-solc to fixed version bug --- Cargo.lock | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7893a7d14c45f..45a2fe8cba396 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -730,7 +730,6 @@ dependencies = [ "semver 1.0.4", "serde", "serde_json", - "svm-rs", "tokio", "tracing", "tracing-subscriber", @@ -1004,7 +1003,7 @@ dependencies = [ [[package]] name = "ethers" version = "0.5.4" -source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" +source = "git+https://github.com/gakonst/ethers-rs#b3fed152a44ecdcc92cf457a5d873d04eddbec33" dependencies = [ "ethers-contract", "ethers-core", @@ -1017,7 +1016,7 @@ dependencies = [ [[package]] name = "ethers-contract" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" +source = "git+https://github.com/gakonst/ethers-rs#b3fed152a44ecdcc92cf457a5d873d04eddbec33" dependencies = [ "ethers-contract-abigen", "ethers-contract-derive", @@ -1035,7 +1034,7 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" +source = "git+https://github.com/gakonst/ethers-rs#b3fed152a44ecdcc92cf457a5d873d04eddbec33" dependencies = [ "Inflector", "anyhow", @@ -1056,7 +1055,7 @@ dependencies = [ [[package]] name = "ethers-contract-derive" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" +source = "git+https://github.com/gakonst/ethers-rs#b3fed152a44ecdcc92cf457a5d873d04eddbec33" dependencies = [ "ethers-contract-abigen", "ethers-core", @@ -1070,7 +1069,7 @@ dependencies = [ [[package]] name = "ethers-core" version = "0.5.5" -source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" +source = "git+https://github.com/gakonst/ethers-rs#b3fed152a44ecdcc92cf457a5d873d04eddbec33" dependencies = [ "arrayvec", "bytes", @@ -1098,7 +1097,7 @@ dependencies = [ [[package]] name = "ethers-etherscan" version = "0.1.1" -source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" +source = "git+https://github.com/gakonst/ethers-rs#b3fed152a44ecdcc92cf457a5d873d04eddbec33" dependencies = [ "ethers-core", "reqwest", @@ -1110,7 +1109,7 @@ dependencies = [ [[package]] name = "ethers-middleware" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" +source = "git+https://github.com/gakonst/ethers-rs#b3fed152a44ecdcc92cf457a5d873d04eddbec33" dependencies = [ "async-trait", "ethers-contract", @@ -1133,7 +1132,7 @@ dependencies = [ [[package]] name = "ethers-providers" version = "0.5.4" -source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" +source = "git+https://github.com/gakonst/ethers-rs#b3fed152a44ecdcc92cf457a5d873d04eddbec33" dependencies = [ "async-trait", "auto_impl 0.5.0", @@ -1162,7 +1161,7 @@ dependencies = [ [[package]] name = "ethers-signers" version = "0.5.3" -source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" +source = "git+https://github.com/gakonst/ethers-rs#b3fed152a44ecdcc92cf457a5d873d04eddbec33" dependencies = [ "async-trait", "coins-bip32", @@ -1182,7 +1181,7 @@ dependencies = [ [[package]] name = "ethers-solc" version = "0.1.0" -source = "git+https://github.com/gakonst/ethers-rs#26a7626915cc91a8186211357c58d59b117904f4" +source = "git+https://github.com/gakonst/ethers-rs#b3fed152a44ecdcc92cf457a5d873d04eddbec33" dependencies = [ "colored", "ethers-core",