diff --git a/Cargo.toml b/Cargo.toml index 4e2cb8dd3..e0569f7ba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,13 +42,13 @@ foundry-compilers-artifacts-solc = { path = "crates/artifacts/solc", version = " foundry-compilers-artifacts-vyper = { path = "crates/artifacts/vyper", version = "0.18.2" } foundry-compilers-core = { path = "crates/core", version = "0.18.2" } -alloy-json-abi = { version = "1.2", features = ["serde_json"] } -alloy-primitives = { version = "1.2", features = ["serde", "rand"] } +alloy-json-abi = { version = "1.3", features = ["serde_json"] } +alloy-primitives = { version = "1.3", features = ["serde", "rand"] } cfg-if = "1.0" dunce = "1.0" memmap2 = "0.9" path-slash = "0.2" -rayon = "1.10" +rayon = "1.11" regex = "1.11" semver = { version = "1.0", features = ["serde"] } serde = { version = "1", features = ["derive", "rc"] } @@ -65,7 +65,7 @@ yansi = "1.0" # async futures-util = "0.3" -tokio = { version = "1.46", features = ["rt-multi-thread"] } +tokio = { version = "1.47", features = ["rt-multi-thread"] } snapbox = "0.6.21" diff --git a/benches/read_all.rs b/benches/read_all.rs index cdc448f30..62816306a 100644 --- a/benches/read_all.rs +++ b/benches/read_all.rs @@ -53,10 +53,10 @@ fn prepare_contracts(root: &Path, num: usize) -> Vec { let f = File::create(&path).unwrap(); let mut writer = BufWriter::new(f); - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); // let's assume a solidity file is between 2kb and 16kb - let n: usize = rng.gen_range(4..17); + let n: usize = rng.random_range(4..17); let s: String = rng.sample_iter(&Alphanumeric).take(n * 1024).map(char::from).collect(); writer.write_all(s.as_bytes()).unwrap(); writer.flush().unwrap(); diff --git a/crates/compilers/Cargo.toml b/crates/compilers/Cargo.toml index 3f7e121a3..cfd0e3edb 100644 --- a/crates/compilers/Cargo.toml +++ b/crates/compilers/Cargo.toml @@ -39,7 +39,7 @@ tokio = { workspace = true, optional = true } auto_impl = "1" winnow = "0.7" dyn-clone = "1" -derive_more = { version = "1", features = ["debug"] } +derive_more = { version = "2", features = ["debug"] } home = "0.5" dirs = "6.0" itertools = ">=0.13, <=0.14" @@ -47,7 +47,7 @@ itertools = ">=0.13, <=0.14" # project-util tempfile = { version = "3.20", optional = true } fs_extra = { version = "1.3", optional = true } -rand = { version = "0.8", optional = true } +rand = { version = "0.9", optional = true } # svm svm = { workspace = true, optional = true } @@ -61,7 +61,7 @@ tracing-subscriber = { version = "0.3", default-features = false, features = [ ] } similar-asserts.workspace = true fd-lock = "4.0.4" -tokio = { version = "1.46", features = ["rt-multi-thread", "macros"] } +tokio = { version = "1.47", features = ["rt-multi-thread", "macros"] } reqwest = "0.12" tempfile = "3.20" snapbox.workspace = true diff --git a/crates/compilers/src/project_util/mock.rs b/crates/compilers/src/project_util/mock.rs index 4d47f9147..0e9b843fc 100644 --- a/crates/compilers/src/project_util/mock.rs +++ b/crates/compilers/src/project_util/mock.rs @@ -2,11 +2,7 @@ use foundry_compilers_artifacts::Remapping; use foundry_compilers_core::error::{Result, SolcError}; -use rand::{ - distributions::{Distribution, Uniform}, - seq::SliceRandom, - Rng, -}; +use rand::{seq::SliceRandom, Rng}; use serde::{Deserialize, Serialize}; use std::{ collections::{BTreeSet, HashMap, HashSet, VecDeque}, @@ -70,11 +66,11 @@ impl MockProjectGenerator { } let graph = Graph::::resolve(paths)?; - let mut gen = Self::default(); + let mut generated = Self::default(); let (_, edges) = graph.into_sources(); // add all files as source files - gen.add_sources(edges.files().count()); + generated.add_sources(edges.files().count()); // stores libs and their files let libs = get_libs( @@ -85,25 +81,25 @@ impl MockProjectGenerator { // mark all files as libs for (lib_id, lib_files) in libs.into_values().enumerate() { - let lib_name = gen.name_strategy.new_lib_name(lib_id); - let offset = gen.inner.files.len(); + let lib_name = generated.name_strategy.new_lib_name(lib_id); + let offset = generated.inner.files.len(); let lib = MockLib { name: lib_name, id: lib_id, num_files: lib_files.len(), offset }; for lib_file in lib_files { - let file = &mut gen.inner.files[lib_file]; + let file = &mut generated.inner.files[lib_file]; file.lib_id = Some(lib_id); - file.name = gen.name_strategy.new_lib_name(file.id); + file.name = generated.name_strategy.new_lib_name(file.id); } - gen.inner.libraries.push(lib); + generated.inner.libraries.push(lib); } for id in edges.files() { for import in edges.imported_nodes(id).iter().copied() { - let import = gen.get_import(import); - gen.inner.files[id].imports.insert(import); + let import = generated.get_import(import); + generated.inner.files[id].imports.insert(import); } } - Ok(gen) + Ok(generated) } /// Consumes the type and returns the underlying skeleton @@ -243,34 +239,36 @@ impl MockProjectGenerator { self } - /// randomly assign empty file status so that mocked files don't emit artifacts + /// Randomly assign empty file status so that mocked files don't emit artifacts. pub fn assign_empty_files(&mut self) -> &mut Self { - let mut rng = rand::thread_rng(); - let die = Uniform::from(0..self.inner.files.len()); + let mut rng = rand::rng(); + let n = self.inner.files.len(); + for file in self.inner.files.iter_mut() { - let throw = die.sample(&mut rng); + let throw = rng.random_range(0..n); if throw == 0 { - // give it a 1 in num(files) chance that the file will be empty + // 1 in n chance that the file will be empty file.emit_artifacts = false; } } + self } /// Populates the imports of the project pub fn populate_imports(&mut self, settings: &MockProjectSettings) -> &mut Self { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); // populate imports for id in 0..self.inner.files.len() { let imports = if let Some(lib) = self.inner.files[id].lib_id { let num_imports = rng - .gen_range(settings.min_imports..=settings.max_imports) + .random_range(settings.min_imports..=settings.max_imports) .min(self.inner.libraries[lib].num_files.saturating_sub(1)); self.unique_imports_for_lib(&mut rng, lib, id, num_imports) } else { let num_imports = rng - .gen_range(settings.min_imports..=settings.max_imports) + .random_range(settings.min_imports..=settings.max_imports) .min(self.inner.files.len().saturating_sub(1)); self.unique_imports_for_source(&mut rng, id, num_imports) }; @@ -437,11 +435,16 @@ impl MockFile { pub fn target_path( &self, - gen: &MockProjectGenerator, + generated: &MockProjectGenerator, paths: &ProjectPathsConfig, ) -> PathBuf { let mut target = if let Some(lib) = self.lib_id { - paths.root.join("lib").join(&gen.inner.libraries[lib].name).join("src").join(&self.name) + paths + .root + .join("lib") + .join(&generated.inner.libraries[lib].name) + .join("src") + .join(&self.name) } else { paths.sources.join(&self.name) }; @@ -552,14 +555,14 @@ pub struct MockProjectSettings { impl MockProjectSettings { /// Generates a new instance with random settings within an arbitrary range pub fn random() -> Self { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); // arbitrary thresholds Self { - num_sources: rng.gen_range(2..25), - num_libs: rng.gen_range(0..5), - num_lib_files: rng.gen_range(1..10), - min_imports: rng.gen_range(0..3), - max_imports: rng.gen_range(4..10), + num_sources: rng.random_range(2..25), + num_libs: rng.random_range(0..5), + num_lib_files: rng.random_range(1..10), + min_imports: rng.random_range(0..3), + max_imports: rng.random_range(4..10), allow_no_artifacts_files: true, } }