diff --git a/.github/workflows/wasm.yml b/.github/workflows/wasm.yml index f4210b57d5..9d090f62d9 100644 --- a/.github/workflows/wasm.yml +++ b/.github/workflows/wasm.yml @@ -21,7 +21,7 @@ jobs: strategy: matrix: - node-version: [18.x] + node-version: [20.x] steps: - name: Checkout the repository diff --git a/Cargo.lock b/Cargo.lock index 82c9e90616..d2225122cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,7 +65,7 @@ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -289,7 +289,6 @@ dependencies = [ "logging", "pos-accounting", "proptest", - "rand 0.8.5", "randomness", "serialization", "test-utils", @@ -398,7 +397,7 @@ checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" dependencies = [ "base64ct", "blake2", - "cpufeatures", + "cpufeatures 0.2.17", "password-hash", ] @@ -444,7 +443,7 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.2", + "rand 0.9.4", "raw-window-handle", "serde", "serde_repr", @@ -1312,7 +1311,18 @@ checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.2.17", +] + +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", ] [[package]] @@ -1322,7 +1332,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" dependencies = [ "aead", - "chacha20", + "chacha20 0.9.1", "cipher", "poly1305", "zeroize", @@ -1493,7 +1503,6 @@ dependencies = [ "logging", "orders-accounting", "pos-accounting", - "rand 0.8.5", "randomness", "rstest", "serialization", @@ -1973,6 +1982,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -2123,7 +2141,8 @@ dependencies = [ "num-derive", "num-traits", "parity-scale-codec", - "rand_chacha 0.3.1", + "rand 0.8.6", + "rand_chacha 0.10.0", "randomness", "ripemd", "rpc-description", @@ -2212,7 +2231,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "curve25519-dalek-derive", "digest", "fiat-crypto", @@ -2978,7 +2997,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.5", "rustc-hex", "static_assertions", ] @@ -3312,10 +3330,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", + "rand_core 0.10.1", "wasip2", "wasip3", + "wasm-bindgen", ] [[package]] @@ -3324,7 +3345,7 @@ version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" dependencies = [ - "rand 0.8.5", + "rand 0.8.6", "rand_core 0.6.4", ] @@ -3641,7 +3662,7 @@ dependencies = [ "hickory-proto", "once_cell", "radix_trie", - "rand 0.8.5", + "rand 0.8.6", "thiserror 1.0.69", "tokio", "tracing", @@ -3663,7 +3684,7 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand 0.8.5", + "rand 0.8.6", "thiserror 1.0.69", "tinyvec", "tokio", @@ -4455,7 +4476,7 @@ dependencies = [ "jsonrpsee-types", "parking_lot 0.12.5", "pin-project", - "rand 0.9.2", + "rand 0.9.4", "rustc-hash 2.1.1", "serde", "serde_json", @@ -4561,7 +4582,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -6374,7 +6395,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared 0.11.3", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -6524,7 +6545,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug", "universal-hash", ] @@ -6536,7 +6557,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug", "universal-hash", ] @@ -6572,7 +6593,7 @@ dependencies = [ "hmac", "md-5", "memchr", - "rand 0.9.2", + "rand 0.9.4", "sha2", "stringprep", ] @@ -6721,18 +6742,17 @@ checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" [[package]] name = "proptest" -version = "1.6.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ "bit-set 0.8.0", "bit-vec 0.8.0", "bitflags 2.10.0", - "lazy_static", "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_xorshift 0.3.0", + "rand 0.9.4", + "rand_chacha 0.9.0", + "rand_xorshift 0.4.0", "regex-syntax", "rusty-fork", "tempfile", @@ -6893,9 +6913,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -6904,14 +6924,25 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", ] +[[package]] +name = "rand" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +dependencies = [ + "chacha20 0.10.0", + "getrandom 0.4.1", + "rand_core 0.10.1", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -6942,6 +6973,16 @@ dependencies = [ "rand_core 0.9.5", ] +[[package]] +name = "rand_chacha" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e6af7f3e25ded52c41df4e0b1af2d047e45896c2f3281792ed68a1c243daedb" +dependencies = [ + "ppv-lite86", + "rand_core 0.10.1", +] + [[package]] name = "rand_core" version = "0.5.1" @@ -6969,6 +7010,12 @@ dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + [[package]] name = "rand_hc" version = "0.2.0" @@ -6989,18 +7036,20 @@ dependencies = [ [[package]] name = "rand_xorshift" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core 0.6.4", + "rand_core 0.9.5", ] [[package]] name = "randomness" version = "1.3.0" dependencies = [ - "rand 0.8.5", + "rand 0.10.1", + "rand 0.8.6", + "rand_core 0.10.1", "static_assertions", ] @@ -7424,7 +7473,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3a8fb4672e840a587a66fc577a5491375df51ddb88f2a2c2a792598c326fe14" dependencies = [ "quote", - "rand 0.8.5", + "rand 0.8.6", "syn 2.0.114", ] @@ -7472,7 +7521,7 @@ dependencies = [ "borsh", "bytes", "num-traits", - "rand 0.8.5", + "rand 0.8.6", "rkyv", "serde", "serde_json", @@ -7779,7 +7828,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ "bitcoin_hashes", - "rand 0.8.5", + "rand 0.8.6", "secp256k1-sys", ] @@ -8056,7 +8105,10 @@ dependencies = [ "arraytools", "hex-literal", "parity-scale-codec", - "rand 0.8.5", + "rand 0.10.1", + "randomness", + "rstest", + "test-utils", ] [[package]] @@ -8088,7 +8140,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -8099,7 +8151,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -8110,7 +8162,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -8332,7 +8384,7 @@ dependencies = [ "futures-util", "log", "pin-project", - "rand 0.8.5", + "rand 0.8.6", "snow", "thiserror 1.0.69", "tokio", @@ -8402,7 +8454,7 @@ dependencies = [ "http", "httparse", "log", - "rand 0.8.5", + "rand 0.8.6", "sha1", ] @@ -8794,7 +8846,7 @@ dependencies = [ "hex", "itertools 0.14.0", "logging", - "rand_chacha 0.3.1", + "rand_chacha 0.10.0", "randomness", "regex", "rstest", @@ -9043,7 +9095,7 @@ dependencies = [ "pin-project-lite", "postgres-protocol", "postgres-types", - "rand 0.9.2", + "rand 0.9.4", "socket2 0.6.2", "tokio", "tokio-util", @@ -9631,6 +9683,7 @@ dependencies = [ "crypto", "directories", "fix-hidden-lifetime-bug", + "fixed-hash", "heck 0.5.0", "log_error", "logging", @@ -10313,6 +10366,7 @@ dependencies = [ "crypto", "fixed-hash", "getrandom 0.2.17", + "getrandom 0.4.1", "gloo-utils", "hex", "itertools 0.14.0", @@ -11492,7 +11546,7 @@ dependencies = [ "hex", "nix", "ordered-stream", - "rand 0.8.5", + "rand 0.8.6", "serde", "serde_repr", "sha1", diff --git a/Cargo.toml b/Cargo.toml index 170b4b97e2..06c0356c75 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -169,7 +169,11 @@ enumflags2 = "0.7" expect-test = "1.3" file-rotate = "0.7" fix-hidden-lifetime-bug = "0.2" -fixed-hash = "0.8" +# Note: we deliberately don't enable the `rand` feature of `fixed-hash` because it still uses +# the `rand` crate v0.8.x, so the `random_using` calls generated by `construct_fixed_hash!` would +# require to use an adapter, which is inconvenient (we wrap the macro and provide our own implementation +# of `random_using` instead). +fixed-hash = { version = "0.8", default-features = false, features = ["byteorder", "rustc-hex"] } flate2 = "1.0" fs4 = "0.12" futures = { version = "0.3", default-features = false } @@ -212,14 +216,13 @@ parking_lot = "0.12" paste = "1.0" probabilistic-collections = "0.7" proc-macro2 = "1.0" -# Note: proptest v1.7+ uses rand 0.9, which is incompatible with rand 0.8 that we currently use. -# But we can't easily switch to rand 0.9 because many of our other dependencies use earlier versions -# of rand. -proptest = "~1.6" +proptest = "1.11" qrcodegen = "1.8" quote = "1.0" -rand = "0.8" -rand_chacha = "0.3" +rand = "0.10" +rand_core = "0.10" +rand_0_8 = { version = "0.8", package = "rand" } +rand_chacha = "0.10" rayon = "1.10" reedline = "0.38" ref-cast = "1.0" diff --git a/api-server/scanner-lib/src/sync/tests/mod.rs b/api-server/scanner-lib/src/sync/tests/mod.rs index 83fa63f6d2..c61afebbe2 100644 --- a/api-server/scanner-lib/src/sync/tests/mod.rs +++ b/api-server/scanner-lib/src/sync/tests/mod.rs @@ -70,7 +70,7 @@ use crypto::{ }; use logging::log; use mempool::FeeRate; -use randomness::{seq::IteratorRandom, CryptoRng, Rng}; +use randomness::{seq::IteratorRandom, CryptoRng, RngExt as _}; use serialization::Encode; use test_utils::random::{make_seedable_rng, Seed}; @@ -150,7 +150,7 @@ struct MockRemoteNode { } impl MockRemoteNode { - fn new(rng: &mut (impl Rng + CryptoRng)) -> Self { + fn new(rng: &mut impl CryptoRng) -> Self { let tf = Arc::new(Mutex::new(TestFramework::builder(rng).build())); Self { tf } } @@ -199,12 +199,7 @@ impl RemoteNode for MockRemoteNode { } } -fn create_chain( - node: &MockRemoteNode, - rng: &mut (impl Rng + CryptoRng), - parent: u64, - count: usize, -) { +fn create_chain(node: &MockRemoteNode, rng: &mut impl CryptoRng, parent: u64, count: usize) { let mut tf = node.tf.lock().unwrap(); let parent_id = tf.chainstate.get_block_id_from_height(parent.into()).unwrap().unwrap(); tf.create_chain(&parent_id, count, rng).unwrap(); @@ -325,7 +320,7 @@ async fn randomized(#[case] seed: Seed) { async fn compare_pool_rewards_with_chainstate_real_state(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let initial_pledge = 40_000 * CoinUnit::ATOMS_PER_COIN + rng.gen_range(10000..100000); + let initial_pledge = 40_000 * CoinUnit::ATOMS_PER_COIN + rng.random_range(10000..100000); let (staking_sk, pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); let (vrf_sk, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let staking_key = Destination::PublicKey(pk.clone()); @@ -335,7 +330,7 @@ async fn compare_pool_rewards_with_chainstate_real_state(#[case] seed: Seed) { vrf_pk, staking_key.clone(), PerThousand::new_from_rng(&mut rng), - Amount::from_atoms(rng.gen_range(0..100)), + Amount::from_atoms(rng.random_range(0..100)), ); let pool_id = PoolId::new(H256::random_using(&mut rng)); @@ -394,7 +389,7 @@ async fn compare_pool_rewards_with_chainstate_real_state(#[case] seed: Seed) { let prev_block_hash = block.get_id(); sync_and_compare(&mut tf, block, &mut local_state, pool_id).await; - let remaining_coins = remaining_coins - rng.gen_range(0..10); + let remaining_coins = remaining_coins - rng.random_range(0..10); eprintln!("coins: {remaining_coins}"); let transaction = TransactionBuilder::new() .add_input( @@ -423,7 +418,7 @@ async fn compare_pool_rewards_with_chainstate_real_state(#[case] seed: Seed) { let prev_block_hash = block.get_id(); sync_and_compare(&mut tf, block, &mut local_state, pool_id).await; - let remaining_coins = remaining_coins - rng.gen_range(0..10); + let remaining_coins = remaining_coins - rng.random_range(0..10); eprintln!("coins: {remaining_coins}"); let (_, deleg_pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); let transaction = TransactionBuilder::new() @@ -443,8 +438,8 @@ async fn compare_pool_rewards_with_chainstate_real_state(#[case] seed: Seed) { let delegation_id = make_delegation_id(transaction.inputs()).unwrap(); let prev_tx_id = transaction.transaction().get_id(); - let amount_to_stake = rng.gen_range(100..1000); - let remaining_coins = remaining_coins - amount_to_stake - rng.gen_range(0..10); + let amount_to_stake = rng.random_range(100..1000); + let remaining_coins = remaining_coins - amount_to_stake - rng.random_range(0..10); eprintln!("coins: {remaining_coins} {amount_to_stake}"); let stake_transaction = TransactionBuilder::new() .add_input( @@ -477,7 +472,7 @@ async fn compare_pool_rewards_with_chainstate_real_state(#[case] seed: Seed) { let prev_block_hash = block.get_id(); sync_and_compare(&mut tf, block, &mut local_state, pool_id).await; - let remaining_coins = remaining_coins - rng.gen_range(0..10); + let remaining_coins = remaining_coins - rng.random_range(0..10); eprintln!("coins: {remaining_coins}"); let transaction = TransactionBuilder::new() .add_input( @@ -507,7 +502,7 @@ async fn compare_pool_rewards_with_chainstate_real_state(#[case] seed: Seed) { sync_and_compare(&mut tf, block, &mut local_state, pool_id).await; let initial_pledge = 40_000 * CoinUnit::ATOMS_PER_COIN - + rng.gen_range( + + rng.random_range( 0..remaining_coins - chain_config.min_stake_pool_pledge().into_atoms() - 100, ); let (new_staking_sk, new_pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); @@ -519,7 +514,7 @@ async fn compare_pool_rewards_with_chainstate_real_state(#[case] seed: Seed) { vrf_pk, staking_key.clone(), PerThousand::new_from_rng(&mut rng), - Amount::from_atoms(rng.gen_range(0..100)), + Amount::from_atoms(rng.random_range(0..100)), ); let new_pool_id = PoolId::from_utxo(&UtxoOutPoint::new( OutPointSourceId::Transaction(prev_tx_id), @@ -527,7 +522,7 @@ async fn compare_pool_rewards_with_chainstate_real_state(#[case] seed: Seed) { )); eprintln!("coins {remaining_coins}, {initial_pledge}"); - let remaining_coins = remaining_coins - initial_pledge - rng.gen_range(0..10); + let remaining_coins = remaining_coins - initial_pledge - rng.random_range(0..10); let transaction = TransactionBuilder::new() .add_input( TxInput::from_utxo(OutPointSourceId::Transaction(prev_tx_id), 0), @@ -559,7 +554,7 @@ async fn compare_pool_rewards_with_chainstate_real_state(#[case] seed: Seed) { let prev_block_hash = block.get_id(); sync_and_compare(&mut tf, block, &mut local_state, pool_id).await; - let remaining_coins = remaining_coins - rng.gen_range(0..10); + let remaining_coins = remaining_coins - rng.random_range(0..10); let input1 = TxInput::from_utxo(OutPointSourceId::Transaction(prev_tx_id), 0); let input2 = TxInput::from_utxo(OutPointSourceId::BlockReward(prev_block_hash.into()), 0); let transaction = TransactionBuilder::new() @@ -688,7 +683,7 @@ async fn reorg_locked_balance(#[case] seed: Seed) { let lock_for_sec = TxOutput::LockThenTransfer( OutputValue::Coin(Amount::from_atoms(3)), destination.clone(), - OutputTimeLock::ForSeconds(rng.gen_range(1..=target_block_time.as_secs())), + OutputTimeLock::ForSeconds(rng.random_range(1..=target_block_time.as_secs())), ); let lock_until_time = TxOutput::LockThenTransfer( OutputValue::Coin(Amount::from_atoms(4)), @@ -698,7 +693,7 @@ async fn reorg_locked_balance(#[case] seed: Seed) { .genesis_block() .timestamp() .add_int_seconds( - target_block_time.as_secs() + rng.gen_range(1..=target_block_time.as_secs()), + target_block_time.as_secs() + rng.random_range(1..=target_block_time.as_secs()), ) .unwrap(), ), @@ -1038,7 +1033,7 @@ async fn reorg_locked_balance(#[case] seed: Seed) { #[allow(clippy::too_many_arguments)] fn create_block( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, target_block_time: Duration, prev_block_hash: Id, @@ -1159,7 +1154,7 @@ async fn check_all_destinations_are_tracked(#[case] seed: Seed) { let public_key_dest = Destination::PublicKey(pub_key.clone()); let public_key_hash_dest = Destination::PublicKeyHash((&pub_key).into()); let classic_multisig_dest = Destination::ClassicMultisig((&pub_key).into()); - let script_dest = Destination::ScriptHash(Id::new(H256::from_slice(&rng.gen::<[u8; 32]>()))); + let script_dest = Destination::ScriptHash(Id::new(H256::from_slice(&rng.random::<[u8; 32]>()))); let with_public_key = TxOutput::Transfer( OutputValue::Coin(Amount::from_atoms(1)), diff --git a/api-server/scanner-lib/src/sync/tests/simulation.rs b/api-server/scanner-lib/src/sync/tests/simulation.rs index 75d1040310..a920031304 100644 --- a/api-server/scanner-lib/src/sync/tests/simulation.rs +++ b/api-server/scanner-lib/src/sync/tests/simulation.rs @@ -52,7 +52,7 @@ use crypto::{ }; use orders_accounting::{OrderData, OrdersAccountingOperations, OrdersAccountingView}; use pos_accounting::PoSAccountingView; -use randomness::Rng; +use randomness::RngExt as _; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; use tokens_accounting::TokensAccountingView; @@ -188,7 +188,7 @@ async fn simulation( let mut statistics: BTreeMap> = BTreeMap::new(); - let num_blocks = rng.gen_range((max_blocks / 2)..max_blocks); + let num_blocks = rng.random_range((max_blocks / 2)..max_blocks); let (vrf_sk, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let (staking_sk, staking_pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); let (config_builder, genesis_pool_id) = @@ -207,10 +207,10 @@ async fn simulation( )]; let consensus_upgrades = NetUpgrades::initialize(upgrades).expect("valid net-upgrades"); - let epoch_length = NonZeroU64::new(rng.gen_range(1..10)).unwrap(); - let sealed_epoch_distance_from_tip = rng.gen_range(1..10); + let epoch_length = NonZeroU64::new(rng.random_range(1..10)).unwrap(); + let sealed_epoch_distance_from_tip = rng.random_range(1..10); let token_id_generation_v1_fork_height = - BlockHeight::new(rng.gen_range(1..=num_blocks + 1) as u64); + BlockHeight::new(rng.random_range(1..=num_blocks + 1) as u64); let chain_config = config_builder .consensus_upgrades(consensus_upgrades) .max_future_block_time_offset(Some(std::time::Duration::from_secs(1_000_000))) @@ -309,9 +309,9 @@ async fn simulation( // Generate a random chain for current_height in 0..num_blocks { - let create_reorg = rng.gen_bool(0.1); + let create_reorg = rng.random_bool(0.1); let height_to_continue_from = if create_reorg { - rng.gen_range(0..=current_height) + rng.random_range(0..=current_height) } else { current_height }; @@ -376,7 +376,7 @@ async fn simulation( let mut block_builder = tf.make_pos_block_builder().with_random_staking_pool(&mut rng); - for _ in 0..rng.gen_range(10..max_tx_per_block) { + for _ in 0..rng.random_range(10..max_tx_per_block) { block_builder = block_builder.add_test_transaction(&mut rng); } diff --git a/api-server/stack-test-suite/tests/v2/address.rs b/api-server/stack-test-suite/tests/v2/address.rs index 63131fd16a..941c13ae5b 100644 --- a/api-server/stack-test-suite/tests/v2/address.rs +++ b/api-server/stack-test-suite/tests/v2/address.rs @@ -143,9 +143,9 @@ async fn multiple_outputs_to_single_address(#[case] seed: Seed) { // Generate two outputs for a single transaction - let random_coin_amount1 = rng.gen_range(1..10); - let random_coin_amount2 = rng.gen_range(1..10); - let random_coin_amount3 = rng.gen_range(1..10); + let random_coin_amount1 = rng.random_range(1..10); + let random_coin_amount2 = rng.random_range(1..10); + let random_coin_amount3 = rng.random_range(1..10); alice_balance = (alice_balance - Amount::from_atoms(random_coin_amount1)).unwrap(); alice_balance = (alice_balance - Amount::from_atoms(random_coin_amount2)).unwrap(); @@ -385,9 +385,9 @@ async fn test_unlocking_for_locked_utxos(#[case] seed: Seed) { // Generate two outputs for a single transaction - let random_coin_amount1 = rng.gen_range(1..10); - let random_coin_amount2 = rng.gen_range(1..10); - let random_coin_amount3 = rng.gen_range(1..10); + let random_coin_amount1 = rng.random_range(1..10); + let random_coin_amount2 = rng.random_range(1..10); + let random_coin_amount3 = rng.random_range(1..10); alice_balance = (alice_balance - Amount::from_atoms(random_coin_amount1)).unwrap(); alice_balance = (alice_balance - Amount::from_atoms(random_coin_amount2)).unwrap(); @@ -633,8 +633,8 @@ async fn ok(#[case] seed: Seed) { .unwrap() .block_id()]; - for _ in 0..rng.gen_range(1..100) { - let random_coin_amount = rng.gen_range(1..10); + for _ in 0..rng.random_range(1..100) { + let random_coin_amount = rng.random_range(1..10); alice_balance = (alice_balance - Amount::from_atoms(random_coin_amount)).unwrap(); diff --git a/api-server/stack-test-suite/tests/v2/address_all_utxos.rs b/api-server/stack-test-suite/tests/v2/address_all_utxos.rs index 8ebc59faa5..e4416ad95e 100644 --- a/api-server/stack-test-suite/tests/v2/address_all_utxos.rs +++ b/api-server/stack-test-suite/tests/v2/address_all_utxos.rs @@ -142,8 +142,8 @@ async fn multiple_utxos_to_single_address(#[case] seed: Seed) { // Generate two outputs for a single transaction - let random_coin_amount1 = rng.gen_range(1..10); - let random_coin_amount2 = rng.gen_range(1..10); + let random_coin_amount1 = rng.random_range(1..10); + let random_coin_amount2 = rng.random_range(1..10); alice_balance = (alice_balance - Amount::from_atoms(random_coin_amount1)).unwrap(); alice_balance = (alice_balance - Amount::from_atoms(random_coin_amount2)).unwrap(); @@ -390,8 +390,8 @@ async fn ok(#[case] seed: Seed) { .unwrap() .block_id()]; - for _ in 0..rng.gen_range(1..2) { - let random_coin_amount = rng.gen_range(1..10); + for _ in 0..rng.random_range(1..2) { + let random_coin_amount = rng.random_range(1..10); alice_balance = (alice_balance - Amount::from_atoms(random_coin_amount * 2)).unwrap(); @@ -408,7 +408,7 @@ async fn ok(#[case] seed: Seed) { let bob_tx_out2 = TxOutput::LockThenTransfer( OutputValue::Coin(Amount::from_atoms(random_coin_amount)), bob_destination.clone(), - OutputTimeLock::ForBlockCount(rng.gen_range(1..100)), + OutputTimeLock::ForBlockCount(rng.random_range(1..100)), ); let transaction = TransactionBuilder::new() diff --git a/api-server/stack-test-suite/tests/v2/address_delegations.rs b/api-server/stack-test-suite/tests/v2/address_delegations.rs index 1baa160c63..64d0e20d39 100644 --- a/api-server/stack-test-suite/tests/v2/address_delegations.rs +++ b/api-server/stack-test-suite/tests/v2/address_delegations.rs @@ -119,7 +119,7 @@ async fn ok(#[case] seed: Seed) { &mut tf, ); - let (_transfer_outpoint, mut delegations) = (0..rng.gen_range(0..5)).fold( + let (_transfer_outpoint, mut delegations) = (0..rng.random_range(0..5)).fold( (transfer_outpoint, vec![]), |(transfer_outpoint, mut delegations), _| { if available_amount == Amount::ZERO { diff --git a/api-server/stack-test-suite/tests/v2/address_spendable_utxos.rs b/api-server/stack-test-suite/tests/v2/address_spendable_utxos.rs index c5b64e4891..70c08324b1 100644 --- a/api-server/stack-test-suite/tests/v2/address_spendable_utxos.rs +++ b/api-server/stack-test-suite/tests/v2/address_spendable_utxos.rs @@ -145,8 +145,8 @@ async fn multiple_utxos_to_single_address(#[case] seed: Seed) { // Generate two outputs for a single transaction - let random_coin_amount1 = rng.gen_range(1..10); - let random_coin_amount2 = rng.gen_range(1..10); + let random_coin_amount1 = rng.random_range(1..10); + let random_coin_amount2 = rng.random_range(1..10); alice_balance = (alice_balance - Amount::from_atoms(random_coin_amount1)).unwrap(); alice_balance = (alice_balance - Amount::from_atoms(random_coin_amount2)).unwrap(); @@ -392,8 +392,8 @@ async fn ok(#[case] seed: Seed) { .unwrap() .block_id()]; - for _ in 0..rng.gen_range(1..100) { - let random_coin_amount = rng.gen_range(1..10); + for _ in 0..rng.random_range(1..100) { + let random_coin_amount = rng.random_range(1..10); alice_balance = (alice_balance - Amount::from_atoms(random_coin_amount)).unwrap(); diff --git a/api-server/stack-test-suite/tests/v2/address_token_authority.rs b/api-server/stack-test-suite/tests/v2/address_token_authority.rs index 6fa417dfe1..421c1bce56 100644 --- a/api-server/stack-test-suite/tests/v2/address_token_authority.rs +++ b/api-server/stack-test-suite/tests/v2/address_token_authority.rs @@ -68,7 +68,7 @@ async fn ok(#[case] seed: Seed) { let mut input_utxo = tf.genesis().utxos()[0].clone(); for _ in 0..10 { - let (dest, token_ids) = if rng.gen_bool(0.5) { + let (dest, token_ids) = if rng.random_bool(0.5) { (alice_destination.clone(), &mut alice_token_ids) } else { (bob_destination.clone(), &mut bob_token_ids) @@ -76,7 +76,7 @@ async fn ok(#[case] seed: Seed) { let token_issuance = TokenIssuanceV1 { token_ticker: "XXXX".as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: "http://uri".as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: dest.clone(), @@ -118,10 +118,10 @@ async fn ok(#[case] seed: Seed) { // Select a random token_id and transfer authority to the other person let (token_id, dest, dest2, priv_key, token_ids) = if !alice_token_ids .is_empty() - && (bob_token_ids.is_empty() || rng.gen_bool(0.5)) + && (bob_token_ids.is_empty() || rng.random_bool(0.5)) { ( - alice_token_ids.remove(rng.gen_range(0..alice_token_ids.len())), + alice_token_ids.remove(rng.random_range(0..alice_token_ids.len())), alice_destination.clone(), bob_destination.clone(), &alice_sk, @@ -129,7 +129,7 @@ async fn ok(#[case] seed: Seed) { ) } else { ( - bob_token_ids.remove(rng.gen_range(0..bob_token_ids.len())), + bob_token_ids.remove(rng.random_range(0..bob_token_ids.len())), bob_destination.clone(), alice_destination.clone(), &bob_sk, diff --git a/api-server/stack-test-suite/tests/v2/block.rs b/api-server/stack-test-suite/tests/v2/block.rs index 1c529836dc..c842318fa5 100644 --- a/api-server/stack-test-suite/tests/v2/block.rs +++ b/api-server/stack-test-suite/tests/v2/block.rs @@ -72,12 +72,13 @@ async fn ok(#[case] seed: Seed) { let (tx, rx) = tokio::sync::oneshot::channel(); let mut rng = make_seedable_rng(seed); - let block_height = rng.gen_range(2..50); + let block_height = rng.random_range(2..50); let task = tokio::spawn(async move { let web_server_state = { - let n_blocks = rng.gen_range(block_height..100); + let n_blocks = rng.random_range(block_height..100); - let initial_pledge = 40_000 * CoinUnit::ATOMS_PER_COIN + rng.gen_range(10000..100000); + let initial_pledge = + 40_000 * CoinUnit::ATOMS_PER_COIN + rng.random_range(10000..100000); let (staking_sk, pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); let (vrf_sk, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let staking_key = Destination::PublicKey(pk.clone()); @@ -87,7 +88,7 @@ async fn ok(#[case] seed: Seed) { vrf_pk, staking_key.clone(), PerThousand::new_from_rng(&mut rng), - Amount::from_atoms(rng.gen_range(0..100)), + Amount::from_atoms(rng.random_range(0..100)), ); let pool_id = PoolId::new(H256::random_using(&mut rng)); @@ -165,7 +166,7 @@ async fn ok(#[case] seed: Seed) { // create a reorg let parent_block = chainstate_blocks.get(block_height - 2).unwrap(); let mut prev_block_hash = parent_block.get_id().into(); - let count = rng.gen_range(block_height..=100); + let count = rng.random_range(block_height..=100); tf.set_time_seconds_since_epoch(parent_block.timestamp().as_int_seconds()); let new_chainstate_blocks: Vec<_> = (block_height - 1..count) diff --git a/api-server/stack-test-suite/tests/v2/block_header.rs b/api-server/stack-test-suite/tests/v2/block_header.rs index 8757651303..347018b404 100644 --- a/api-server/stack-test-suite/tests/v2/block_header.rs +++ b/api-server/stack-test-suite/tests/v2/block_header.rs @@ -70,7 +70,8 @@ async fn ok(#[case] seed: Seed) { let web_server_state = { let mut rng = make_seedable_rng(seed); - let initial_pledge = 40_000 * CoinUnit::ATOMS_PER_COIN + rng.gen_range(10000..100000); + let initial_pledge = + 40_000 * CoinUnit::ATOMS_PER_COIN + rng.random_range(10000..100000); let (staking_sk, pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); let (vrf_sk, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let staking_key = Destination::PublicKey(pk.clone()); @@ -80,7 +81,7 @@ async fn ok(#[case] seed: Seed) { vrf_pk, staking_key.clone(), PerThousand::new_from_rng(&mut rng), - Amount::from_atoms(rng.gen_range(0..100)), + Amount::from_atoms(rng.random_range(0..100)), ); let pool_id = PoolId::new(H256::random_using(&mut rng)); diff --git a/api-server/stack-test-suite/tests/v2/block_reward.rs b/api-server/stack-test-suite/tests/v2/block_reward.rs index 1fdce278f8..a554ca4045 100644 --- a/api-server/stack-test-suite/tests/v2/block_reward.rs +++ b/api-server/stack-test-suite/tests/v2/block_reward.rs @@ -67,8 +67,8 @@ async fn no_reward(#[case] seed: Seed) { async move { let web_server_state = { let mut rng = make_seedable_rng(seed); - let block_height = rng.gen_range(1..50); - let n_blocks = rng.gen_range(block_height..100); + let block_height = rng.random_range(1..50); + let n_blocks = rng.random_range(block_height..100); let chain_config = create_unit_test_config(); diff --git a/api-server/stack-test-suite/tests/v2/block_transaction_ids.rs b/api-server/stack-test-suite/tests/v2/block_transaction_ids.rs index 2b6d47e2af..3b4343af16 100644 --- a/api-server/stack-test-suite/tests/v2/block_transaction_ids.rs +++ b/api-server/stack-test-suite/tests/v2/block_transaction_ids.rs @@ -65,8 +65,8 @@ async fn ok(#[case] seed: Seed) { async move { let web_server_state = { let mut rng = make_seedable_rng(seed); - let block_height = rng.gen_range(1..50); - let n_blocks = rng.gen_range(block_height..100); + let block_height = rng.random_range(1..50); + let n_blocks = rng.random_range(block_height..100); let chain_config = create_unit_test_config(); diff --git a/api-server/stack-test-suite/tests/v2/chain_at_height.rs b/api-server/stack-test-suite/tests/v2/chain_at_height.rs index 34030bfa85..8c3edef2a6 100644 --- a/api-server/stack-test-suite/tests/v2/chain_at_height.rs +++ b/api-server/stack-test-suite/tests/v2/chain_at_height.rs @@ -76,8 +76,8 @@ async fn height_past_tip() { #[tokio::test] async fn height_n(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let block_height = rng.gen_range(1..50); - let n_blocks = rng.gen_range(block_height..100); + let block_height = rng.random_range(1..50); + let n_blocks = rng.random_range(block_height..100); let url = format!("/api/v2/chain/{block_height}"); let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); diff --git a/api-server/stack-test-suite/tests/v2/chain_tip.rs b/api-server/stack-test-suite/tests/v2/chain_tip.rs index 3983c1b58b..30fb774919 100644 --- a/api-server/stack-test-suite/tests/v2/chain_tip.rs +++ b/api-server/stack-test-suite/tests/v2/chain_tip.rs @@ -94,7 +94,7 @@ async fn height_n(#[case] seed: Seed) { let task = tokio::spawn({ async move { let mut rng = make_seedable_rng(seed); - let n_blocks = rng.gen_range(1..100); + let n_blocks = rng.random_range(1..100); let web_server_state = { let chain_config = create_unit_test_config(); diff --git a/api-server/stack-test-suite/tests/v2/feerate.rs b/api-server/stack-test-suite/tests/v2/feerate.rs index 144f8c4292..9ba10d8799 100644 --- a/api-server/stack-test-suite/tests/v2/feerate.rs +++ b/api-server/stack-test-suite/tests/v2/feerate.rs @@ -49,7 +49,7 @@ async fn invalid_query_parameter() { #[tokio::test] async fn ok(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let in_top_x_mb = rng.gen_range(1..100); + let in_top_x_mb = rng.random_range(1..100); let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); let addr = listener.local_addr().unwrap(); @@ -115,7 +115,7 @@ async fn ok_reload_feerate(#[case] seed: Seed) { } } let mut rng = make_seedable_rng(seed); - let in_top_x_mb = rng.gen_range(1..100); + let in_top_x_mb = rng.random_range(1..100); let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); let addr = listener.local_addr().unwrap(); @@ -164,7 +164,7 @@ async fn ok_reload_feerate(#[case] seed: Seed) { let body = response.text().await.unwrap(); assert_eq!(body, format!("\"{in_top_x_mb}\"")); - let sec_to_pass = rng.gen_range(1..REFRESH_INTERVAL_SEC); + let sec_to_pass = rng.random_range(1..REFRESH_INTERVAL_SEC); seconds.fetch_add(sec_to_pass); time_passed += sec_to_pass; } diff --git a/api-server/stack-test-suite/tests/v2/helpers.rs b/api-server/stack-test-suite/tests/v2/helpers.rs index f9d04f1fab..5a994ba5aa 100644 --- a/api-server/stack-test-suite/tests/v2/helpers.rs +++ b/api-server/stack-test-suite/tests/v2/helpers.rs @@ -30,11 +30,11 @@ use crypto::{ key::{KeyKind, PrivateKey}, vrf::{VRFKeyKind, VRFPrivateKey}, }; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; pub fn prepare_stake_pool( stake_pool_outpoint: UtxoOutPoint, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, available_amount: &mut Amount, tf: &mut TestFramework, ) -> (UtxoOutPoint, StakePoolData, PoolId, Block) { @@ -42,16 +42,16 @@ pub fn prepare_stake_pool( let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 2))); + Amount::from_atoms(rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 2))); let (_, pk) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); - let margin_ratio_per_thousand = rng.gen_range(1..=1000); + let margin_ratio_per_thousand = rng.random_range(1..=1000); let stake_pool_data = StakePoolData::new( amount_to_stake, Destination::PublicKey(pk), vrf_pk, - Destination::PublicKeyHash(PublicKeyHash::from_low_u64_ne(rng.gen::())), + Destination::PublicKeyHash(PublicKeyHash::from_low_u64_ne(rng.random::())), PerThousand::new(margin_ratio_per_thousand).unwrap(), Amount::ZERO, ); @@ -83,7 +83,7 @@ pub fn prepare_stake_pool( pub fn prepare_delegation( transfer_outpoint: UtxoOutPoint, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, pool_id: PoolId, available_amount: Amount, destination: Option, @@ -113,14 +113,14 @@ pub fn prepare_delegation( } pub fn stake_delegation( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, available_amount: Amount, transfer_outpoint: UtxoOutPoint, delegation_id: DelegationId, tf: &mut TestFramework, ) -> (Amount, UtxoOutPoint, Block) { let delegate_max_amount = std::cmp::min(1000, available_amount.into_atoms()); - let amount_to_delegate = Amount::from_atoms(rng.gen_range(1..=delegate_max_amount)); + let amount_to_delegate = Amount::from_atoms(rng.random_range(1..=delegate_max_amount)); let stake_tx = TransactionBuilder::new() .add_input(transfer_outpoint.into(), empty_witness(rng)) .add_output(TxOutput::DelegateStaking(amount_to_delegate, delegation_id)) @@ -154,7 +154,7 @@ pub struct IssueAndMintTokensResult { pub fn issue_and_mint_tokens_from_genesis( min_mint_amount: Amount, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, ) -> IssueAndMintTokensResult { let token_issuance_fee = tf.chainstate.get_chain_config().fungible_token_issuance_fee(); @@ -168,10 +168,10 @@ pub fn issue_and_mint_tokens_from_genesis( ); let amount_to_mint = match issuance.total_supply { TokenTotalSupply::Fixed(limit) => { - Amount::from_atoms(rng.gen_range(min_mint_amount_atoms..=limit.into_atoms())) + Amount::from_atoms(rng.random_range(min_mint_amount_atoms..=limit.into_atoms())) } TokenTotalSupply::Lockable | TokenTotalSupply::Unlimited => { - Amount::from_atoms(rng.gen_range(min_mint_amount_atoms..min_mint_amount_atoms * 10)) + Amount::from_atoms(rng.random_range(min_mint_amount_atoms..min_mint_amount_atoms * 10)) } }; diff --git a/api-server/stack-test-suite/tests/v2/mod.rs b/api-server/stack-test-suite/tests/v2/mod.rs index 292762c495..5bc6671019 100644 --- a/api-server/stack-test-suite/tests/v2/mod.rs +++ b/api-server/stack-test-suite/tests/v2/mod.rs @@ -82,7 +82,7 @@ use std::{ collections::BTreeMap, sync::{Arc, RwLock}, }; -use test_utils::random::{make_seedable_rng, Rng, Seed}; +use test_utils::random::{make_seedable_rng, RngExt as _, Seed}; #[ctor::ctor] fn init() { diff --git a/api-server/stack-test-suite/tests/v2/pool.rs b/api-server/stack-test-suite/tests/v2/pool.rs index d29502852f..b9242ea3c2 100644 --- a/api-server/stack-test-suite/tests/v2/pool.rs +++ b/api-server/stack-test-suite/tests/v2/pool.rs @@ -86,7 +86,7 @@ async fn ok(#[case] seed: Seed) { + Amount::from_atoms(10000)) .unwrap(); - let (_, pools) = (0..rng.gen_range(1..5)).fold( + let (_, pools) = (0..rng.random_range(1..5)).fold( (stake_pool_outpoint, vec![]), |(stake_pool_outpoint, mut pools), _| { if available_amount == Amount::ZERO { @@ -101,7 +101,7 @@ async fn ok(#[case] seed: Seed) { &mut tf, ); - let (transfer_outpoint, delegations) = (0..rng.gen_range(0..5)).fold( + let (transfer_outpoint, delegations) = (0..rng.random_range(0..5)).fold( (transfer_outpoint, vec![]), |(transfer_outpoint, mut delegations), _| { if available_amount == Amount::ZERO { diff --git a/api-server/stack-test-suite/tests/v2/pool_block_stats.rs b/api-server/stack-test-suite/tests/v2/pool_block_stats.rs index 83aa6ce088..9725595626 100644 --- a/api-server/stack-test-suite/tests/v2/pool_block_stats.rs +++ b/api-server/stack-test-suite/tests/v2/pool_block_stats.rs @@ -86,7 +86,8 @@ async fn ok(#[case] seed: Seed) { let web_server_state = { let mut rng = make_seedable_rng(seed); - let initial_pledge = 40_000 * CoinUnit::ATOMS_PER_COIN + rng.gen_range(10000..100000); + let initial_pledge = + 40_000 * CoinUnit::ATOMS_PER_COIN + rng.random_range(10000..100000); let (staking_sk, pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); let (vrf_sk, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let staking_key = Destination::PublicKey(pk.clone()); @@ -96,7 +97,7 @@ async fn ok(#[case] seed: Seed) { vrf_pk, staking_key.clone(), PerThousand::new_from_rng(&mut rng), - Amount::from_atoms(rng.gen_range(0..100)), + Amount::from_atoms(rng.random_range(0..100)), ); let pool_id = PoolId::new(H256::random_using(&mut rng)); @@ -113,7 +114,7 @@ async fn ok(#[case] seed: Seed) { let prev_block_hash = chain_config.genesis_block_id(); let chainstate_blocks = { - let (_, blocks) = (0..rng.gen_range(1..100)).fold( + let (_, blocks) = (0..rng.random_range(1..100)).fold( (prev_block_hash, vec![]), |(prev_block_hash, mut blocks), _| { tf.progress_time_seconds_since_epoch(target_block_time.as_secs()); @@ -134,7 +135,7 @@ async fn ok(#[case] seed: Seed) { }, ); - let num_blocks = rng.gen_range(0..blocks.len()); + let num_blocks = rng.random_range(0..blocks.len()); let time_range = ( blocks.first().unwrap().timestamp(), blocks[num_blocks].timestamp(), diff --git a/api-server/stack-test-suite/tests/v2/pools.rs b/api-server/stack-test-suite/tests/v2/pools.rs index c979a157ac..9021ff48f4 100644 --- a/api-server/stack-test-suite/tests/v2/pools.rs +++ b/api-server/stack-test-suite/tests/v2/pools.rs @@ -57,7 +57,7 @@ async fn invalid_num_items() { #[tokio::test] async fn invalid_num_items_max(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let more_than_max = rng.gen_range(101..1000); + let more_than_max = rng.random_range(101..1000); let (task, response) = spawn_webserver(&format!("/api/v2/pool?items={more_than_max}")).await; assert_eq!(response.status(), 400); @@ -113,7 +113,7 @@ async fn ok(#[case] seed: Seed) { + Amount::from_atoms(10000)) .unwrap(); - let (_, pools) = (0..rng.gen_range(1..5)).fold( + let (_, pools) = (0..rng.random_range(1..5)).fold( (stake_pool_outpoint, vec![]), |(stake_pool_outpoint, mut pools), _| { if available_amount == Amount::ZERO { @@ -128,7 +128,7 @@ async fn ok(#[case] seed: Seed) { &mut tf, ); - let (transfer_outpoint, delegations) = (0..rng.gen_range(0..5)).fold( + let (transfer_outpoint, delegations) = (0..rng.random_range(0..5)).fold( (transfer_outpoint, vec![]), |(transfer_outpoint, mut delegations), _| { if available_amount == Amount::ZERO { diff --git a/api-server/stack-test-suite/tests/v2/statistics.rs b/api-server/stack-test-suite/tests/v2/statistics.rs index 964e3c2ce0..8d96aeb268 100644 --- a/api-server/stack-test-suite/tests/v2/statistics.rs +++ b/api-server/stack-test-suite/tests/v2/statistics.rs @@ -98,7 +98,7 @@ async fn ok_tokens(#[case] seed: Seed) { let alice_destination = Destination::PublicKeyHash(PublicKeyHash::from(&alice_pk)); - let token_decimals = rng.gen_range(1..18); + let token_decimals = rng.random_range(1..18); let token_issuance = TokenIssuanceV1 { token_ticker: "XXXX".as_bytes().to_vec(), number_of_decimals: token_decimals, @@ -344,9 +344,9 @@ async fn ok_coins(#[case] seed: Seed) { available_amount = (available_amount - delegated_amount).unwrap(); let amount_to_unstake = - Amount::from_atoms(rng.gen_range(1..=delegated_amount.into_atoms())); + Amount::from_atoms(rng.random_range(1..=delegated_amount.into_atoms())); let amount_to_burn = - Amount::from_atoms(rng.gen_range(1..=available_amount.into_atoms())); + Amount::from_atoms(rng.random_range(1..=available_amount.into_atoms())); let undelegate_and_burn = TransactionBuilder::new() .add_input(transfer_outpoint.into(), InputWitness::NoSignature(None)) diff --git a/api-server/stack-test-suite/tests/v2/token.rs b/api-server/stack-test-suite/tests/v2/token.rs index 8d3b788e0b..96b9222661 100644 --- a/api-server/stack-test-suite/tests/v2/token.rs +++ b/api-server/stack-test-suite/tests/v2/token.rs @@ -96,7 +96,7 @@ async fn ok(#[case] seed: Seed) { let token_issuance = TokenIssuanceV1 { token_ticker: "XXXX".as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: "http://uri".as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: alice_destination, diff --git a/api-server/stack-test-suite/tests/v2/token_ids.rs b/api-server/stack-test-suite/tests/v2/token_ids.rs index 8578c882a1..6a3b6ce947 100644 --- a/api-server/stack-test-suite/tests/v2/token_ids.rs +++ b/api-server/stack-test-suite/tests/v2/token_ids.rs @@ -56,7 +56,7 @@ async fn invalid_num_items() { #[tokio::test] async fn invalid_num_items_max(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let more_than_max = rng.gen_range(101..1000); + let more_than_max = rng.random_range(101..1000); let (task, response) = spawn_webserver(&format!("/api/v2/token?items={more_than_max}")).await; assert_eq!(response.status(), 400); @@ -97,7 +97,7 @@ async fn ok(#[case] seed: Seed) { let token_issuance = TokenIssuanceV1 { token_ticker: "XXXX".as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: "http://uri".as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: alice_destination.clone(), diff --git a/api-server/stack-test-suite/tests/v2/token_ticker.rs b/api-server/stack-test-suite/tests/v2/token_ticker.rs index c53a4e2acb..4517d30748 100644 --- a/api-server/stack-test-suite/tests/v2/token_ticker.rs +++ b/api-server/stack-test-suite/tests/v2/token_ticker.rs @@ -56,7 +56,7 @@ async fn invalid_num_items() { #[tokio::test] async fn invalid_num_items_max(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let more_than_max = rng.gen_range(101..1000); + let more_than_max = rng.random_range(101..1000); let (task, response) = spawn_webserver(&format!("/api/v2/token/ticker/XXXX?items={more_than_max}")).await; @@ -99,7 +99,7 @@ async fn ok(#[case] seed: Seed) { let token_issuance = TokenIssuanceV1 { token_ticker: token_ticker.as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: "http://uri".as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: alice_destination.clone(), diff --git a/api-server/stack-test-suite/tests/v2/token_transactions.rs b/api-server/stack-test-suite/tests/v2/token_transactions.rs index 76a934c041..1db3a2bdac 100644 --- a/api-server/stack-test-suite/tests/v2/token_transactions.rs +++ b/api-server/stack-test-suite/tests/v2/token_transactions.rs @@ -78,7 +78,7 @@ async fn invalid_num_items() { #[tokio::test] async fn invalid_num_items_max(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let more_than_max = rng.gen_range(101..1000); + let more_than_max = rng.random_range(101..1000); let token_id = TokenId::new(H256::zero()); let chain_config = create_unit_test_config(); @@ -292,7 +292,7 @@ async fn ok(#[case] seed: Seed) { } let mut rng = make_seedable_rng(seed); - let offset = rng.gen_range(1..num_tx); + let offset = rng.random_range(1..num_tx); let items = num_tx - offset; let tx_global_index = &arr_body[offset - 1].get("tx_global_index").unwrap(); diff --git a/api-server/stack-test-suite/tests/v2/transaction.rs b/api-server/stack-test-suite/tests/v2/transaction.rs index 0bea9574f7..4f477cd0e6 100644 --- a/api-server/stack-test-suite/tests/v2/transaction.rs +++ b/api-server/stack-test-suite/tests/v2/transaction.rs @@ -116,8 +116,8 @@ async fn multiple_tx_in_same_block(#[case] seed: Seed) { // Generate two outputs for a single transaction - let random_coin_amount1 = rng.gen_range(1..10); - let random_coin_amount2 = rng.gen_range(1..10); + let random_coin_amount1 = rng.random_range(1..10); + let random_coin_amount2 = rng.random_range(1..10); alice_balance = (alice_balance - Amount::from_atoms(random_coin_amount1)).unwrap(); alice_balance = (alice_balance - Amount::from_atoms(random_coin_amount2)).unwrap(); @@ -302,8 +302,8 @@ async fn ok(#[case] seed: Seed) { let task = tokio::spawn(async move { let web_server_state = { let mut rng = make_seedable_rng(seed); - let block_height = rng.gen_range(2..50); - let n_blocks = rng.gen_range(block_height..100); + let block_height = rng.random_range(2..50); + let n_blocks = rng.random_range(block_height..100); let chain_config = create_unit_test_config(); @@ -323,7 +323,7 @@ async fn ok(#[case] seed: Seed) { tf.block(tf.to_chain_block_id(&chainstate_block_ids[block_height - 2])); let prev_tx = &prev_block.transactions()[0]; - let transaction_index = rng.gen_range(0..block.transactions().len()); + let transaction_index = rng.random_range(0..block.transactions().len()); let transaction = block.transactions()[transaction_index].transaction(); let transaction_id = transaction.get_id(); @@ -474,10 +474,10 @@ async fn mint_tokens(#[case] seed: Seed) { ); let amount_to_mint = match issuance.total_supply { TokenTotalSupply::Fixed(limit) => { - Amount::from_atoms(rng.gen_range(1..=limit.into_atoms())) + Amount::from_atoms(rng.random_range(1..=limit.into_atoms())) } TokenTotalSupply::Lockable | TokenTotalSupply::Unlimited => { - Amount::from_atoms(rng.gen_range(100..1000)) + Amount::from_atoms(rng.random_range(100..1000)) } }; let mint_amount_decimal = diff --git a/api-server/stack-test-suite/tests/v2/transaction_merkle_path.rs b/api-server/stack-test-suite/tests/v2/transaction_merkle_path.rs index b6fdf06ebf..d0f12d10e9 100644 --- a/api-server/stack-test-suite/tests/v2/transaction_merkle_path.rs +++ b/api-server/stack-test-suite/tests/v2/transaction_merkle_path.rs @@ -43,10 +43,10 @@ async fn cannot_find_transaction_in_block(#[case] seed: Seed) { let (tx, rx) = tokio::sync::oneshot::channel(); let mut rng = make_seedable_rng(seed); - let block_height = rng.gen_range(1..50); + let block_height = rng.random_range(1..50); let task = tokio::spawn(async move { let web_server_state = { - let n_blocks = rng.gen_range(block_height..100); + let n_blocks = rng.random_range(block_height..100); let chain_config = create_unit_test_config(); @@ -63,7 +63,7 @@ async fn cannot_find_transaction_in_block(#[case] seed: Seed) { let block_id = chainstate_block_ids[block_height - 1]; let block = tf.block(tf.to_chain_block_id(&block_id)); - let transaction_index = rng.gen_range(0..block.transactions().len()); + let transaction_index = rng.random_range(0..block.transactions().len()); let transaction = block.transactions()[transaction_index].transaction(); let transaction_id = transaction.get_id(); @@ -175,8 +175,8 @@ async fn ok(#[case] seed: Seed) { let task = tokio::spawn(async move { let web_server_state = { let mut rng = make_seedable_rng(seed); - let block_height = rng.gen_range(1..50); - let n_blocks = rng.gen_range(block_height..100); + let block_height = rng.random_range(1..50); + let n_blocks = rng.random_range(block_height..100); let chain_config = create_unit_test_config(); @@ -193,7 +193,7 @@ async fn ok(#[case] seed: Seed) { let block_id = chainstate_block_ids[block_height - 1]; let block = tf.block(tf.to_chain_block_id(&block_id)); - let transaction_index = rng.gen_range(0..block.transactions().len()); + let transaction_index = rng.random_range(0..block.transactions().len()); let transaction = block.transactions()[transaction_index].transaction(); let transaction_id = transaction.get_id(); diff --git a/api-server/stack-test-suite/tests/v2/transactions.rs b/api-server/stack-test-suite/tests/v2/transactions.rs index bdbe28d1cc..621e444650 100644 --- a/api-server/stack-test-suite/tests/v2/transactions.rs +++ b/api-server/stack-test-suite/tests/v2/transactions.rs @@ -70,7 +70,7 @@ async fn invalid_num_items() { #[tokio::test] async fn invalid_num_items_max(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let more_than_max = rng.gen_range(101..1000); + let more_than_max = rng.random_range(101..1000); let (task, response) = spawn_webserver(&format!("/api/v2/transaction?items={more_than_max}")).await; @@ -97,8 +97,8 @@ async fn ok(#[case] seed: Seed) { let task = tokio::spawn(async move { let web_server_state = { let mut rng = make_seedable_rng(seed); - let n_blocks = rng.gen_range(3..100); - let num_tx = rng.gen_range(2..n_blocks); + let n_blocks = rng.random_range(3..100); + let num_tx = rng.random_range(2..n_blocks); let chain_config = create_unit_test_config(); @@ -130,7 +130,7 @@ async fn ok(#[case] seed: Seed) { let prev_block = tf.block(tf.to_chain_block_id(&ids[0])); let prev_tx = &prev_block.transactions()[0]; - let transaction_index = rng.gen_range(0..block.transactions().len()); + let transaction_index = rng.random_range(0..block.transactions().len()); let signed_transaction = &block.transactions()[transaction_index]; let transaction = signed_transaction.transaction(); @@ -231,7 +231,7 @@ async fn ok(#[case] seed: Seed) { } let mut rng = make_seedable_rng(seed); - let offset = rng.gen_range(1..num_tx); + let offset = rng.random_range(1..num_tx); let items = num_tx - offset; let url = format!("/api/v2/transaction?offset={offset}&items={items}"); diff --git a/api-server/storage-test-suite/Cargo.toml b/api-server/storage-test-suite/Cargo.toml index 382458d211..33935a6442 100644 --- a/api-server/storage-test-suite/Cargo.toml +++ b/api-server/storage-test-suite/Cargo.toml @@ -22,7 +22,6 @@ chrono.workspace = true futures = { workspace = true, default-features = false } libtest-mimic.workspace = true proptest.workspace = true -rand.workspace = true tokio = { workspace = true, features = ["full"] } [[test]] diff --git a/api-server/storage-test-suite/src/basic.rs b/api-server/storage-test-suite/src/basic.rs index 817afcef24..1d427430b0 100644 --- a/api-server/storage-test-suite/src/basic.rs +++ b/api-server/storage-test-suite/src/basic.rs @@ -13,7 +13,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -use rand::CryptoRng; use serialization::extras::non_empty_vec::DataOrNoVec; use std::{collections::BTreeMap, sync::Arc}; @@ -35,7 +34,7 @@ use crypto::{ key::{KeyKind, PrivateKey}, vrf::{VRFKeyKind, VRFPrivateKey}, }; -use randomness::Rng; +use randomness::{CryptoRng, RngExt as _}; use chainstate_test_framework::{empty_witness, TestFramework, TransactionBuilder}; use common::{ @@ -134,7 +133,7 @@ where // Create a test framework and blocks let genesis_id = chain_config.genesis_block_id(); - let num_blocks = rng.gen_range(10..20); + let num_blocks = rng.random_range(10..20); test_framework .create_chain_advancing_time_return_ids(&genesis_id, num_blocks, &mut rng) .unwrap(); @@ -417,14 +416,14 @@ where .unwrap(); } - let random_height = rng.gen_range(1..3); + let random_height = rng.random_range(1..3); let block_id = test_framework .block_id(random_height) .classify(&chain_config) .chain_block_id() .unwrap(); let block1 = test_framework.block(block_id); - let random_height2 = rng.gen_range(3..10); + let random_height2 = rng.random_range(3..10); let block_id2 = test_framework .block_id(random_height2) .classify(&chain_config) @@ -491,7 +490,7 @@ where ) .build(); let tx1_input_utxos = vec![Some(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(1..100))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(1..100))), Destination::AnyoneCanSpend, ))]; @@ -511,7 +510,7 @@ where let tx_info = TransactionInfo { tx: tx1.clone(), additional_info: TxAdditionalInfo { - fee: Amount::from_atoms(rng.gen_range(0..100)), + fee: Amount::from_atoms(rng.random_range(0..100)), input_utxos: tx1_input_utxos.clone(), token_decimals: BTreeMap::new(), }, @@ -532,7 +531,7 @@ where let tx_info = TransactionInfo { tx: tx1.clone(), additional_info: TxAdditionalInfo { - fee: Amount::from_atoms(rng.gen_range(0..100)), + fee: Amount::from_atoms(rng.random_range(0..100)), input_utxos: tx1_input_utxos.clone(), token_decimals: BTreeMap::new(), }, @@ -554,9 +553,9 @@ where let mut db_tx = storage.transaction_rw().await.unwrap(); { - let height1_u64 = rng.gen_range::(1..i64::MAX as u64); + let height1_u64 = rng.random_range::(1..i64::MAX as u64); let height1 = height1_u64.into(); - let random_block_timestamp = BlockTimestamp::from_int_seconds(rng.gen::()); + let random_block_timestamp = BlockTimestamp::from_int_seconds(rng.random::()); let aux_data1 = BlockAuxData::new(owning_block1.into(), height1, random_block_timestamp); db_tx.set_block_aux_data(owning_block1, &aux_data1).await.unwrap(); @@ -564,7 +563,7 @@ where let tx_info = TransactionInfo { tx: tx1.clone(), additional_info: TxAdditionalInfo { - fee: Amount::from_atoms(rng.gen_range(0..100)), + fee: Amount::from_atoms(rng.random_range(0..100)), input_utxos: tx1_input_utxos.clone(), token_decimals: BTreeMap::new(), }, @@ -580,7 +579,8 @@ where let last_num = db_tx.get_last_transaction_global_index().await.unwrap(); assert_eq!(last_num, Some(expected_last_tx_global_index)); - let take_txs = rng.gen_range(1..expected_last_tx_global_index - start_tx_global_index); + let take_txs = + rng.random_range(1..expected_last_tx_global_index - start_tx_global_index); let txs = db_tx .get_transactions_with_block_info_before_tx_global_index( take_txs as u32, @@ -602,12 +602,12 @@ where let mut db_tx = storage.transaction_rw().await.unwrap(); let random_block_id = Id::::random_using(&mut rng); - let random_block_timestamp = BlockTimestamp::from_int_seconds(rng.gen::()); + let random_block_timestamp = BlockTimestamp::from_int_seconds(rng.random::()); let block = db_tx.get_block_aux_data(random_block_id).await.unwrap(); assert!(block.is_none()); let existing_block_id: Id = block_id; - let height1_u64 = rng.gen_range::(1..i64::MAX as u64); + let height1_u64 = rng.random_range::(1..i64::MAX as u64); let height1 = height1_u64.into(); let aux_data1 = BlockAuxData::new(existing_block_id.into(), height1, random_block_timestamp); @@ -617,9 +617,9 @@ where assert_eq!(retrieved_aux_data, Some(aux_data1)); // Test overwrite - let height2_u64 = rng.gen_range::(1..i64::MAX as u64); + let height2_u64 = rng.random_range::(1..i64::MAX as u64); let height2 = height2_u64.into(); - let random_block_timestamp = BlockTimestamp::from_int_seconds(rng.gen::()); + let random_block_timestamp = BlockTimestamp::from_int_seconds(rng.random::()); let aux_data2 = BlockAuxData::new(existing_block_id.into(), height2, random_block_timestamp); db_tx.set_block_aux_data(existing_block_id, &aux_data2).await.unwrap(); @@ -652,15 +652,15 @@ where let random_tx_id = Id::::random_using(&mut rng); let outpoint = UtxoOutPoint::new( OutPointSourceId::Transaction(random_tx_id), - rng.gen::(), + rng.random::(), ); let output = TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(1..1000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(1..1000))), bob_destination.clone(), ); let utxo = Utxo::new(output.clone(), None, None); - let block_height = BlockHeight::new(rng.gen_range(1..100)); + let block_height = BlockHeight::new(rng.random_range(1..100)); // set one and get it { @@ -768,10 +768,10 @@ where let random_tx_id = Id::::random_using(&mut rng); let outpoint = UtxoOutPoint::new( OutPointSourceId::Transaction(random_tx_id), - rng.gen::(), + rng.random::(), ); let output = TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(1..1000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(1..1000))), bob_destination.clone(), ); @@ -820,17 +820,17 @@ where let random_tx_id = Id::::random_using(&mut rng); let locked_outpoint = UtxoOutPoint::new( OutPointSourceId::Transaction(random_tx_id), - rng.gen::(), + rng.random::(), ); let locked_output = TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(1..1000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(1..1000))), bob_destination.clone(), ); let locked_utxo = LockedUtxo::new( locked_output.clone(), None, - UtxoLock::UntilHeight(BlockHeight::new(rng.gen_range(10000..100000))), + UtxoLock::UntilHeight(BlockHeight::new(rng.random_range(10000..100000))), ); db_tx .set_locked_utxo_at_height( @@ -879,15 +879,15 @@ where let random_tx_id = Id::::random_using(&mut rng); let outpoint2 = UtxoOutPoint::new( OutPointSourceId::Transaction(random_tx_id), - rng.gen::(), + rng.random::(), ); let output2 = TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(1..1000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(1..1000))), bob_destination, ); let utxo = Utxo::new(output2.clone(), None, None); - let block_height = BlockHeight::new(rng.gen_range(1..100)); + let block_height = BlockHeight::new(rng.random_range(1..100)); db_tx .set_utxo_at_height( outpoint2.clone(), @@ -1078,8 +1078,8 @@ where .unwrap(); } - let len = rng.gen_range(0..5); - let global_idx = rng.gen_range(5..=10); + let len = rng.random_range(0..5); + let global_idx = rng.random_range(5..=10); let token_txs = db_tx.get_token_transactions(random_token_id, len, global_idx).await.unwrap(); eprintln!("getting len: {len} < idx {global_idx}"); @@ -1118,14 +1118,14 @@ where { let random_pool_id = PoolId::random_using(&mut rng); - let random_block_height = BlockHeight::new(rng.gen::() as u64); + let random_block_height = BlockHeight::new(rng.random::() as u64); let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); - let amount_to_stake = Amount::from_atoms(rng.gen::()); - let cost_per_block = Amount::from_atoms(rng.gen::()); + let amount_to_stake = Amount::from_atoms(rng.random::()); + let cost_per_block = Amount::from_atoms(rng.random::()); let (_, pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); - let margin_ratio_per_thousand = rng.gen_range(1..=1000); + let margin_ratio_per_thousand = rng.random_range(1..=1000); let random_pool_data = PoolData::new( Destination::PublicKey(pk), amount_to_stake, @@ -1136,7 +1136,7 @@ where ); let random_pool_data = PoolDataWithExtraInfo { pool_data: random_pool_data, - delegations_balance: Amount::from_atoms(rng.gen_range(0..=1000)), + delegations_balance: Amount::from_atoms(rng.random_range(0..=1000)), }; db_tx @@ -1152,14 +1152,14 @@ where let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let (_, pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); let amount_to_stake = { - let mut amount_to_stake = Amount::from_atoms(rng.gen::()); + let mut amount_to_stake = Amount::from_atoms(rng.random::()); while amount_to_stake == random_pool_data.staker_balance().unwrap() { - amount_to_stake = Amount::from_atoms(rng.gen::()); + amount_to_stake = Amount::from_atoms(rng.random::()); } amount_to_stake }; - let cost_per_block = Amount::from_atoms(rng.gen::()); - let margin_ratio_per_thousand = rng.gen_range(1..=1000); + let cost_per_block = Amount::from_atoms(rng.random::()); + let margin_ratio_per_thousand = rng.random_range(1..=1000); let random_pool_data2 = PoolData::new( Destination::PublicKey(pk), amount_to_stake, @@ -1169,15 +1169,15 @@ where cost_per_block, ); let random_block_height2 = { - let mut height = BlockHeight::new(rng.gen::() as u64); + let mut height = BlockHeight::new(rng.random::() as u64); while height == random_block_height { - height = BlockHeight::new(rng.gen::() as u64) + height = BlockHeight::new(rng.random::() as u64) } height }; let random_pool_data2 = PoolDataWithExtraInfo { pool_data: random_pool_data2, - delegations_balance: Amount::from_atoms(rng.gen_range(0..=1000)), + delegations_balance: Amount::from_atoms(rng.random_range(0..=1000)), }; db_tx @@ -1220,9 +1220,9 @@ where // update the first one let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let (_, pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); - let amount_to_stake = Amount::from_atoms(rng.gen::()); - let cost_per_block = Amount::from_atoms(rng.gen::()); - let margin_ratio_per_thousand = rng.gen_range(1..=1000); + let amount_to_stake = Amount::from_atoms(rng.random::()); + let cost_per_block = Amount::from_atoms(rng.random::()); + let margin_ratio_per_thousand = rng.random_range(1..=1000); let random_pool_data_new = PoolData::new( Destination::PublicKey(pk.clone()), amount_to_stake, @@ -1233,7 +1233,7 @@ where ); let random_pool_data_new = PoolDataWithExtraInfo { pool_data: random_pool_data_new, - delegations_balance: Amount::from_atoms(rng.gen_range(0..=1000)), + delegations_balance: Amount::from_atoms(rng.random_range(0..=1000)), }; // update pool data in next block height @@ -1280,7 +1280,7 @@ where ); let decommissioned_random_pool_data = PoolDataWithExtraInfo { pool_data: decommissioned_random_pool_data, - delegations_balance: Amount::from_atoms(rng.gen_range(0..=1000)), + delegations_balance: Amount::from_atoms(rng.random_range(0..=1000)), }; eprintln!("setting pledge to 0 for pool {random_pool_id:?}"); db_tx @@ -1340,16 +1340,16 @@ where } }; - let random_block_height = BlockHeight::new(rng.gen_range(500..1000) as u64); - let random_block_height2 = BlockHeight::new(rng.gen_range(1..500) as u64); + let random_block_height = BlockHeight::new(rng.random_range(500..1000) as u64); + let random_block_height2 = BlockHeight::new(rng.random_range(1..500) as u64); let (_, pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); let random_pool_id = PoolId::random_using(&mut rng); let random_pool_id2 = PoolId::random_using(&mut rng); - let random_balance = Amount::from_atoms(rng.gen::()); - let random_balance2 = Amount::from_atoms(rng.gen::()); - let random_nonce = AccountNonce::new(rng.gen::()); - let random_nonce2 = AccountNonce::new(rng.gen::()); + let random_balance = Amount::from_atoms(rng.random::()); + let random_balance2 = Amount::from_atoms(rng.random::()); + let random_nonce = AccountNonce::new(rng.random::()); + let random_nonce2 = AccountNonce::new(rng.random::()); let random_delegation = Delegation::new( random_block_height, @@ -1406,8 +1406,8 @@ where assert_eq!(delegation, &random_delegation2); // update delegation on new height - let random_balance = Amount::from_atoms(rng.gen::()); - let random_nonce = AccountNonce::new(rng.gen::()); + let random_balance = Amount::from_atoms(rng.random::()); + let random_nonce = AccountNonce::new(rng.random::()); let random_delegation_new = Delegation::new( random_block_height, @@ -1508,7 +1508,7 @@ where let mut db_tx = storage.transaction_rw().await.unwrap(); - let block_height = BlockHeight::new(rng.gen_range(1..100)); + let block_height = BlockHeight::new(rng.random_range(1..100)); db_tx .set_nft_token_issuance(random_token_id, block_height, nft.clone(), &random_owner) .await @@ -1596,7 +1596,7 @@ where let (_, pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); let random_destination = Destination::PublicKeyHash(PublicKeyHash::from(&pk)); - let random_num_decimals = rng.gen_range(1..18); + let random_num_decimals = rng.random_range(1..18); let token_data = FungibleTokenData { token_ticker: "XXXX".as_bytes().to_vec(), @@ -1612,7 +1612,7 @@ where let mut db_tx = storage.transaction_rw().await.unwrap(); - let block_height = BlockHeight::new(rng.gen_range(1..100)); + let block_height = BlockHeight::new(rng.random_range(1..100)); db_tx .set_fungible_token_issuance(random_token_id, block_height, token_data.clone()) .await @@ -1633,7 +1633,7 @@ where let locked_token_data = token_data .clone() .mint_tokens( - Amount::from_atoms(rng.gen_range(1..1000)), + Amount::from_atoms(rng.random_range(1..1000)), token_data.next_nonce, ) .lock(token_data.next_nonce.increment().unwrap()); @@ -1653,7 +1653,7 @@ where assert_eq!(returned_token, locked_token_data); let address = Address::new(&chain_config, random_destination.clone()).unwrap(); - let random_amount = Amount::from_atoms(rng.gen_range(0..100_000)); + let random_amount = Amount::from_atoms(rng.random_range(0..100_000)); db_tx .set_address_balance_at_height( &address, @@ -1734,7 +1734,7 @@ where let token_ticker = String::from("AB\\CD"); let token_data = FungibleTokenData { token_ticker: token_ticker.as_bytes().to_vec().clone(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: "http://uri".as_bytes().to_vec(), circulating_supply: Amount::ZERO, total_supply: TokenTotalSupply::Unlimited, @@ -1744,7 +1744,7 @@ where next_nonce: AccountNonce::new(0), }; - let block_height = BlockHeight::new(rng.gen_range(1..100)); + let block_height = BlockHeight::new(rng.random_range(1..100)); let random_token_id1 = TokenId::random_using(&mut rng); db_tx .set_fungible_token_issuance(random_token_id1, block_height, token_data.clone()) @@ -1870,7 +1870,7 @@ where let random_token_id = TokenId::random_using(&mut rng); let random_coin_or_token_id = CoinOrTokenId::TokenId(random_token_id); - let random_statistic = match rng.gen_range(0..4) { + let random_statistic = match rng.random_range(0..4) { 0 => CoinOrTokenStatistic::CirculatingSupply, 1 => CoinOrTokenStatistic::Staked, 2 => CoinOrTokenStatistic::Burned, @@ -1884,8 +1884,8 @@ where let mut db_tx = storage.transaction_rw().await.unwrap(); - let random_block_height = BlockHeight::new(rng.gen_range(1..100)); - let random_amount = Amount::from_atoms(rng.gen_range(0..100_000)); + let random_block_height = BlockHeight::new(rng.random_range(1..100)); + let random_amount = Amount::from_atoms(rng.random_range(0..100_000)); db_tx .set_statistic( random_statistic, @@ -1901,7 +1901,7 @@ where assert_eq!(returned_amount, Some(random_amount)); - let random_amount2 = Amount::from_atoms(rng.gen_range(0..100_000)); + let random_amount2 = Amount::from_atoms(rng.random_range(0..100_000)); db_tx .set_statistic( @@ -1943,10 +1943,7 @@ where Ok(()) } -async fn orders<'a, S: for<'b> Transactional<'b>>( - rng: &mut (impl Rng + CryptoRng), - storage: &'a mut S, -) { +async fn orders<'a, S: for<'b> Transactional<'b>>(rng: &mut impl CryptoRng, storage: &'a mut S) { let chain_config = common::chain::config::create_regtest(); { let db_tx = storage.transaction_ro().await.unwrap(); @@ -2000,7 +1997,7 @@ async fn orders<'a, S: for<'b> Transactional<'b>>( let mut db_tx = storage.transaction_rw().await.unwrap(); - let block_height = BlockHeight::new(rng.gen_range(100..1000)); + let block_height = BlockHeight::new(rng.random_range(100..1000)); db_tx .set_order_at_height(order1_id, &order1, BlockHeight::new(1)) @@ -2156,7 +2153,7 @@ async fn orders<'a, S: for<'b> Transactional<'b>>( } fn random_order( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, creation_height: BlockHeight, ask_currency: CoinOrTokenId, give_currency: CoinOrTokenId, @@ -2164,8 +2161,8 @@ fn random_order( let order_id = OrderId::random_using(rng); let (_, pk) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); let conclude_destination = Destination::PublicKeyHash(PublicKeyHash::from(&pk)); - let give_amount = Amount::from_atoms(rng.gen_range(1000..10000)); - let ask_amount = Amount::from_atoms(rng.gen_range(1000..10000)); + let give_amount = Amount::from_atoms(rng.random_range(1000..10000)); + let ask_amount = Amount::from_atoms(rng.random_range(1000..10000)); let order = Order { creation_block_height: creation_height, conclude_destination, @@ -2176,7 +2173,7 @@ fn random_order( initially_asked: ask_amount, ask_balance: ask_amount, is_frozen: false, - next_nonce: AccountNonce::new(rng.gen::()), + next_nonce: AccountNonce::new(rng.random::()), }; (order_id, order) } diff --git a/api-server/storage-test-suite/src/podman.rs b/api-server/storage-test-suite/src/podman.rs index 11ee0f5677..4600bfe875 100644 --- a/api-server/storage-test-suite/src/podman.rs +++ b/api-server/storage-test-suite/src/podman.rs @@ -13,6 +13,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use randomness::{make_pseudo_rng, RngExt as _}; + pub enum Container { PostgresFromDockerHub, } @@ -26,9 +28,8 @@ impl Container { } fn random_string(length: usize) -> String { - use rand::Rng; - rand::thread_rng() - .sample_iter(&rand::distributions::Alphanumeric) + make_pseudo_rng() + .sample_iter(&randomness::distributions::Alphanumeric) .take(length) .map(char::from) .collect() diff --git a/blockprod/src/detail/mod.rs b/blockprod/src/detail/mod.rs index 352ca7b13d..52125c6180 100644 --- a/blockprod/src/detail/mod.rs +++ b/blockprod/src/detail/mod.rs @@ -46,7 +46,7 @@ use consensus::{ use crypto::ephemeral_e2e::{self, EndToEndPrivateKey}; use mempool::{tx_accumulator::PackingStrategy, MempoolHandle}; use p2p::P2pHandle; -use randomness::{make_true_rng, Rng}; +use randomness::{make_true_rng, Rng, RngExt as _}; use serialization::{Decode, Encode}; use ::utils::{ @@ -97,7 +97,7 @@ impl CustomId { pub fn new_from_rng(rng: &mut impl Rng) -> Self { Self { - data: rng.gen::<[u8; JOBKEY_DEFAULT_LEN]>().into(), + data: rng.random::<[u8; JOBKEY_DEFAULT_LEN]>().into(), } } diff --git a/blockprod/src/detail/tests.rs b/blockprod/src/detail/tests.rs index d9ae6294f2..90666a2e6d 100644 --- a/blockprod/src/detail/tests.rs +++ b/blockprod/src/detail/tests.rs @@ -55,7 +55,7 @@ use mempool::{ TxOptions, }; use mocks::{MockChainstateInterface, MockMempoolInterface}; -use randomness::Rng; +use randomness::RngExt as _; use subsystem::error::ResponseError; use test_utils::{ mock_time_getter::mocked_time_getter_seconds, @@ -1578,7 +1578,7 @@ mod produce_block { ) }; - let blocks_to_generate = rng.gen_range(100..=1000); + let blocks_to_generate = rng.random_range(100..=1000); let override_chain_config = { let genesis_block = Genesis::new( @@ -1606,14 +1606,14 @@ mod produce_block { let mut next_height_consensus_change = 1; while next_height_consensus_change < blocks_to_generate { - let next_consensus_type = rng.gen_range(0..consensus_types.len()); + let next_consensus_type = rng.random_range(0..consensus_types.len()); randomized_net_upgrades.push(( BlockHeight::new(next_height_consensus_change), consensus_types[next_consensus_type].clone(), )); - next_height_consensus_change += rng.gen_range(1..50); + next_height_consensus_change += rng.random_range(1..50); } let net_upgrades = @@ -1854,7 +1854,7 @@ mod produce_block { .expect("Error initializing blockprod"); let mut rng = make_seedable_rng(seed); - let jobs_to_create = rng.gen::() % 20 + 1; + let jobs_to_create = rng.random_range(1..=20); for _ in 0..jobs_to_create { let (_block, job) = block_production @@ -1891,7 +1891,7 @@ mod process_block_with_custom_id { let mut rng = make_seedable_rng(seed); - let jobs_to_create = rng.gen::() % 20 + 1; + let jobs_to_create = rng.random_range(1..=20); let block_production = BlockProduction::new( chain_config, @@ -1913,7 +1913,7 @@ mod process_block_with_custom_id { }); let produce_blocks_futures_iter = (0..jobs_to_create).map(|_| { - let id: Vec = (0..1024).map(|_| rng.gen::()).collect(); + let id: Vec = (0..1024).map(|_| rng.random::()).collect(); block_production.produce_block_with_custom_id( GenerateBlockInputData::None, @@ -1951,7 +1951,7 @@ mod process_block_with_custom_id { let mut rng = make_seedable_rng(seed); - let jobs_to_create = 10 + rng.gen::() % 20 + 1; + let jobs_to_create = 10 + rng.random_range(1..=20); let block_production = BlockProduction::new( chain_config, @@ -1972,7 +1972,7 @@ mod process_block_with_custom_id { shutdown_trigger.initiate(); }); - let id: Vec = (0..1024).map(|_| rng.gen::()).collect(); + let id: Vec = (0..1024).map(|_| rng.random::()).collect(); // The following is a race between the successive // calls to produce_block_with_custom_id() and the job @@ -2104,7 +2104,7 @@ mod stop_all_jobs { .expect("Error initializing blockprod"); let mut mock_job_manager = Box::::default(); - let return_value = make_seedable_rng(seed).gen(); + let return_value = make_seedable_rng(seed).random_range(0..=usize::MAX); let expected_value = return_value; mock_job_manager @@ -2226,7 +2226,7 @@ mod stop_job { .expect("Error initializing blockprod"); let mut job_keys = Vec::new(); - let jobs_to_create = rng.gen::() % 20 + 1; + let jobs_to_create = rng.random_range(1..=20); for _ in 1..=jobs_to_create { let (job_key, _stop_last_used_block_timestamp, _stop_job_cancel_receiver) = diff --git a/blockprod/src/detail/timestamp_searcher/mod.rs b/blockprod/src/detail/timestamp_searcher/mod.rs index c548e1ab12..d5768db62e 100644 --- a/blockprod/src/detail/timestamp_searcher/mod.rs +++ b/blockprod/src/detail/timestamp_searcher/mod.rs @@ -36,7 +36,7 @@ use consensus::{ }; use crypto::vrf::{VRFPrivateKey, VRFPublicKey}; use logging::log; -use randomness::{CryptoRng, Rng}; +use randomness::CryptoRng; use serialization::{Decode, Encode}; use utils::{ensure, once_destructor::OnceDestructor, tokio_spawn_blocking}; @@ -427,7 +427,7 @@ fn find_timestamps( final_supply: Amount, vrf_pub_key: &VRFPublicKey, vrf_prv_key: &VRFPrivateKey, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, precomputed_hashes: Option<&PrecomputedHashes>, ) -> Result, ConsensusPoSError> { let target = compact_target_to_target(search_data.target_required)?; diff --git a/blockprod/src/detail/timestamp_searcher/tests.rs b/blockprod/src/detail/timestamp_searcher/tests.rs index 68de15b50d..bac97a13a2 100644 --- a/blockprod/src/detail/timestamp_searcher/tests.rs +++ b/blockprod/src/detail/timestamp_searcher/tests.rs @@ -18,7 +18,7 @@ use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; use logging::{init_logging, log}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use crate::{detail::timestamp_searcher::SearchDataForHeight, TimestampSearchData}; @@ -58,7 +58,7 @@ mod collect_search_data { let mut rng = make_seedable_rng(seed); - let consensus_version = if rng.gen_bool(0.5) { + let consensus_version = if rng.random_bool(0.5) { PoSConsensusVersion::V0 } else { PoSConsensusVersion::V1 @@ -370,7 +370,7 @@ mod collect_search_data { fn make_test_framework( consensus_version: PoSConsensusVersion, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> TestFramework { let (staking_sk, staking_pk) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); let (vrf_sk, vrf_pk) = VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel); @@ -418,14 +418,15 @@ mod collect_search_data { fn create_pool( tf: &mut TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, utxo_for_spending: &mut UtxoForSpending, ) -> (PoolId, Amount) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let pledge = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let pledge = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(rng, pledge, vrf_pk); let pool_id = PoolId::from_utxo(utxo_for_spending.outpoint()); @@ -441,14 +442,15 @@ mod collect_search_data { fn delegate( tf: &mut TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, pool_id: &PoolId, utxo_for_spending: &mut UtxoForSpending, ) -> Amount { let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_delegate = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge / 2..min_stake_pool_pledge * 2)); + let amount_to_delegate = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge / 2..min_stake_pool_pledge * 2), + ); let tx1_builder = TransactionBuilder::new() .add_output(TxOutput::CreateDelegationId( @@ -516,20 +518,20 @@ mod search { let mut rng = make_seedable_rng(seed); - let start_height = BlockHeight::new(rng.gen_range(0..10)); - let items_count = rng.gen_range(10..20); + let start_height = BlockHeight::new(rng.random_range(0..10)); + let items_count = rng.random_range(10..20); let mut data = Vec::with_capacity(items_count); for i in 0..items_count { - let min_timestamp = rng.gen::() as u64; - let max_timestamp = min_timestamp + rng.gen_range(1..10); - let staker_balance = rng.gen_range(1..u32::MAX) as u128; - let total_balance = staker_balance + rng.gen::() as u128; + let min_timestamp = rng.random::() as u64; + let max_timestamp = min_timestamp + rng.random_range(1..10); + let staker_balance = rng.random_range(1..u32::MAX) as u128; + let total_balance = staker_balance + rng.random::() as u128; data.push(SearchDataForHeight { sealed_epoch_randomness: PoSRandomness::new(H256::random_using(&mut rng)), epoch_index: i as u64, - target_required: Uint256::from_u64(rng.gen()).into(), + target_required: Uint256::from_u64(rng.random()).into(), min_timestamp: BlockTimestamp::from_int_seconds(min_timestamp), max_timestamp: BlockTimestamp::from_int_seconds(max_timestamp), pool_balances: NonZeroPoolBalances::new( @@ -537,7 +539,7 @@ mod search { Amount::from_atoms(staker_balance), ) .unwrap(), - consensus_version: if rng.gen_bool(0.5) { + consensus_version: if rng.random_bool(0.5) { PoSConsensusVersion::V0 } else { PoSConsensusVersion::V1 @@ -545,7 +547,7 @@ mod search { }); } - let final_supply = Amount::from_atoms(rng.gen_range(u32::MAX as u64..u64::MAX) as u128); + let final_supply = Amount::from_atoms(rng.random_range(u32::MAX as u64..u64::MAX) as u128); let search_data1 = TimestampSearchData { start_height, diff --git a/blockprod/src/lib.rs b/blockprod/src/lib.rs index c5b47d8128..3e243a59c5 100644 --- a/blockprod/src/lib.rs +++ b/blockprod/src/lib.rs @@ -182,7 +182,7 @@ mod tests { use p2p::{ peer_manager::peerdb::storage_impl::PeerDbStorageImpl, test_helpers::test_p2p_config, }; - use randomness::{CryptoRng, Rng}; + use randomness::{CryptoRng, Rng, RngExt as _}; use storage_inmemory::InMemory; use subsystem::Manager; @@ -323,7 +323,7 @@ mod tests { (time_getter.get_time() - Duration::new( // Genesis must be in the past: now - (1 day..2 weeks) - rng.gen_range(60 * 60 * 24..60 * 60 * 24 * 14), + rng.random_range(60 * 60 * 24..60 * 60 * 24 * 14), 0, )) .expect("No time underflow") @@ -359,7 +359,7 @@ mod tests { pub fn create_genesis_for_pos_tests( timestamp: BlockTimestamp, extra_txs: &[TxOutput], - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> ( Genesis, /*stake_private_key:*/ PrivateKey, @@ -409,7 +409,7 @@ mod tests { time_getter: &TimeGetter, switch_to_pos_at: BlockHeight, extra_genesis_txs: &[TxOutput], - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> (chain::config::Builder, PrivateKey, VRFPrivateKey, TxOutput) { let genesis_timestamp = make_genesis_timestamp(time_getter, rng); setup_pos_with_genesis_timestamp( @@ -424,7 +424,7 @@ mod tests { genesis_timestamp: BlockTimestamp, switch_to_pos_at: BlockHeight, extra_genesis_txs: &[TxOutput], - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> (chain::config::Builder, PrivateKey, VRFPrivateKey, TxOutput) { let initial_target = pos_initial_difficulty(ChainType::Regtest); diff --git a/chainstate/constraints-value-accumulator/src/tests/constraints_tests.rs b/chainstate/constraints-value-accumulator/src/tests/constraints_tests.rs index 0927a441de..da7dfa781f 100644 --- a/chainstate/constraints-value-accumulator/src/tests/constraints_tests.rs +++ b/chainstate/constraints-value-accumulator/src/tests/constraints_tests.rs @@ -34,7 +34,7 @@ use common::{ use crypto::vrf::{VRFKeyKind, VRFPrivateKey}; use orders_accounting::{InMemoryOrdersAccounting, OrdersAccountingDB}; use pos_accounting::{DelegationData, InMemoryPoSAccounting, PoSAccountingDB, PoolData}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use rstest::rstest; use test_utils::{ random::{make_seedable_rng, Seed}, @@ -43,7 +43,7 @@ use test_utils::{ use crate::{ConstrainedValueAccumulator, Error}; -fn create_stake_pool_data(rng: &mut (impl Rng + CryptoRng), atoms_to_stake: u128) -> StakePoolData { +fn create_stake_pool_data(rng: &mut impl CryptoRng, atoms_to_stake: u128) -> StakePoolData { let (_, vrf_pub_key) = VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel); StakePoolData::new( Amount::from_atoms(atoms_to_stake), @@ -71,8 +71,8 @@ fn allow_fees_from_decommission(#[case] seed: Seed) { chain_config.staking_pool_spend_maturity_block_count(block_height); let pool_id = PoolId::new(H256::zero()); - let staked_atoms = rng.gen_range(100..1000); - let fee_atoms = rng.gen_range(1..100); + let staked_atoms = rng.random_range(100..1000); + let fee_atoms = rng.random_range(1..100); let stake_pool_data = create_stake_pool_data(&mut rng, staked_atoms); let pos_store = InMemoryPoSAccounting::from_values( @@ -146,8 +146,8 @@ fn allow_fees_from_spend_share(#[case] seed: Seed) { let delegation_id = DelegationId::new(H256::zero()); let delegation_data = DelegationData::new(PoolId::new(H256::zero()), Destination::AnyoneCanSpend); - let delegated_atoms = rng.gen_range(100..1000); - let fee_atoms = rng.gen_range(1..100); + let delegated_atoms = rng.random_range(100..1000); + let fee_atoms = rng.random_range(1..100); let pos_store = InMemoryPoSAccounting::from_values( BTreeMap::new(), @@ -216,8 +216,8 @@ fn no_timelock_outputs_on_decommission(#[case] seed: Seed) { let block_height = BlockHeight::new(1); let pool_id = PoolId::new(H256::zero()); - let staked_atoms = rng.gen_range(100..1000); - let less_than_staked_amount = Amount::from_atoms(rng.gen_range(1..staked_atoms)); + let staked_atoms = rng.random_range(100..1000); + let less_than_staked_amount = Amount::from_atoms(rng.random_range(1..staked_atoms)); let stake_pool_data = create_stake_pool_data(&mut rng, staked_atoms); let pos_store = InMemoryPoSAccounting::from_values( @@ -329,8 +329,8 @@ fn try_to_unlock_coins_with_smaller_timelock(#[case] seed: Seed) { chain_config.staking_pool_spend_maturity_block_count(block_height); let pool_id = PoolId::new(H256::zero()); - let staked_atoms = rng.gen_range(100..1000); - let less_than_staked_amount = Amount::from_atoms(rng.gen_range(1..staked_atoms)); + let staked_atoms = rng.random_range(100..1000); + let less_than_staked_amount = Amount::from_atoms(rng.random_range(1..staked_atoms)); let stake_pool_data = create_stake_pool_data(&mut rng, staked_atoms); let pos_store = InMemoryPoSAccounting::from_values( @@ -473,15 +473,15 @@ fn check_timelock_saturation(#[case] seed: Seed) { let block_height = BlockHeight::new(1); let pool_id = PoolId::new(H256::zero()); - let staked_atoms = rng.gen_range(100..1000); + let staked_atoms = rng.random_range(100..1000); let stake_pool_data = create_stake_pool_data(&mut rng, staked_atoms); let delegation_id = DelegationId::new(H256::zero()); let delegation_data = DelegationData::new(PoolId::new(H256::zero()), Destination::AnyoneCanSpend); - let delegated_atoms = rng.gen_range(1..1000); + let delegated_atoms = rng.random_range(1..1000); - let transferred_atoms = rng.gen_range(100..1000); + let transferred_atoms = rng.random_range(100..1000); let pos_store = InMemoryPoSAccounting::from_values( BTreeMap::from_iter([(pool_id, PoolData::from(stake_pool_data.clone()))]), @@ -606,7 +606,7 @@ fn try_to_overspend_on_spending_delegation(#[case] seed: Seed) { let delegation_id = DelegationId::new(H256::zero()); let delegation_data = DelegationData::new(PoolId::new(H256::zero()), Destination::AnyoneCanSpend); - let delegation_balance = Amount::from_atoms(rng.gen_range(100..1000)); + let delegation_balance = Amount::from_atoms(rng.random_range(100..1000)); let overspent_amount = (delegation_balance + Amount::from_atoms(1)).unwrap(); let pos_store = InMemoryPoSAccounting::from_values( @@ -1373,7 +1373,7 @@ fn htlc_output(#[case] seed: Seed) { .consensus_upgrades(NetUpgrades::regtest_with_pos()) .build(); let block_height = BlockHeight::new(1); - let balance = Amount::from_atoms(rng.gen_range(1..1000)); + let balance = Amount::from_atoms(rng.random_range(1..1000)); let pos_store = InMemoryPoSAccounting::new(); let pos_db = PoSAccountingDB::new(&pos_store); @@ -1467,7 +1467,7 @@ fn htlc_input(#[case] seed: Seed) { .consensus_upgrades(NetUpgrades::regtest_with_pos()) .build(); let block_height = BlockHeight::new(1); - let balance = Amount::from_atoms(rng.gen_range(1..1000)); + let balance = Amount::from_atoms(rng.random_range(1..1000)); let pos_store = InMemoryPoSAccounting::new(); let pos_db = PoSAccountingDB::new(&pos_store); diff --git a/chainstate/constraints-value-accumulator/src/tests/homomorphism.rs b/chainstate/constraints-value-accumulator/src/tests/homomorphism.rs index d02a001e23..991cc74c45 100644 --- a/chainstate/constraints-value-accumulator/src/tests/homomorphism.rs +++ b/chainstate/constraints-value-accumulator/src/tests/homomorphism.rs @@ -22,7 +22,7 @@ use common::{ primitives::{per_thousand::PerThousand, Amount, BlockHeight, Fee, Id, H256}, }; use crypto::vrf::{VRFKeyKind, VRFPrivateKey}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use rstest::rstest; use test_utils::{ random::{make_seedable_rng, Seed}, @@ -31,7 +31,7 @@ use test_utils::{ use crate::ConstrainedValueAccumulator; -fn create_stake_pool_data(rng: &mut (impl Rng + CryptoRng), atoms_to_stake: u128) -> StakePoolData { +fn create_stake_pool_data(rng: &mut impl CryptoRng, atoms_to_stake: u128) -> StakePoolData { let (_, vrf_pub_key) = VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel); StakePoolData::new( Amount::from_atoms(atoms_to_stake), @@ -76,15 +76,15 @@ fn accumulators_homomorphism(#[case] seed: Seed) { let delegation_id = DelegationId::new(H256::random_using(&mut rng)); let delegation_data = pos_accounting::DelegationData::new(pool_id, Destination::AnyoneCanSpend); - let transferred_atoms = rng.gen_range(0..1000); - let staked_atoms = rng.gen_range(100..1000); + let transferred_atoms = rng.random_range(0..1000); + let staked_atoms = rng.random_range(100..1000); let stake_pool_data = create_stake_pool_data(&mut rng, staked_atoms); - let delegation_balance = Amount::from_atoms(rng.gen_range(100..1000)); + let delegation_balance = Amount::from_atoms(rng.random_range(100..1000)); // total outputs is a part of total inputs because some random part goes as fees - let decommission_output_atoms = rng.gen_range(1..staked_atoms); - let share_to_spend_atoms = rng.gen_range(1..=delegation_balance.into_atoms()); - let spend_share_output = rng.gen_range(1..=share_to_spend_atoms); + let decommission_output_atoms = rng.random_range(1..staked_atoms); + let share_to_spend_atoms = rng.random_range(1..=delegation_balance.into_atoms()); + let spend_share_output = rng.random_range(1..=share_to_spend_atoms); let expected_fee = Fee(Amount::from_atoms( transferred_atoms + transferred_atoms + staked_atoms + share_to_spend_atoms @@ -110,7 +110,7 @@ fn accumulators_homomorphism(#[case] seed: Seed) { let tokens_db = tokens_accounting::TokensAccountingDB::new(&tokens_store); let (decommission_tx, decommission_tx_inputs_utxos) = { - let decommission_pool_utxo = if rng.gen::() { + let decommission_pool_utxo = if rng.random::() { TxOutput::CreateStakePool(pool_id, Box::new(stake_pool_data)) } else { TxOutput::ProduceBlockFromStake(Destination::AnyoneCanSpend, pool_id) @@ -146,7 +146,7 @@ fn accumulators_homomorphism(#[case] seed: Seed) { let locked_outputs = split_value(&mut rng, decommission_output_atoms).into_iter().map(|atoms| { - let random_additional_distance = rng.gen_range(0..10); + let random_additional_distance = rng.random_range(0..10); TxOutput::LockThenTransfer( OutputValue::Coin(Amount::from_atoms(atoms)), Destination::AnyoneCanSpend, @@ -200,7 +200,7 @@ fn accumulators_homomorphism(#[case] seed: Seed) { }); let locked_outputs = split_value(&mut rng, spend_share_output).into_iter().map(|atoms| { - let random_additional_distance = rng.gen_range(0..10); + let random_additional_distance = rng.random_range(0..10); TxOutput::LockThenTransfer( OutputValue::Coin(Amount::from_atoms(atoms)), Destination::AnyoneCanSpend, diff --git a/chainstate/constraints-value-accumulator/src/tests/orders_constraints.rs b/chainstate/constraints-value-accumulator/src/tests/orders_constraints.rs index 21bdc96291..919f669149 100644 --- a/chainstate/constraints-value-accumulator/src/tests/orders_constraints.rs +++ b/chainstate/constraints-value-accumulator/src/tests/orders_constraints.rs @@ -29,7 +29,7 @@ use common::{ }; use orders_accounting::{InMemoryOrdersAccounting, OrdersAccountingDB}; use pos_accounting::{InMemoryPoSAccounting, PoSAccountingDB}; -use randomness::Rng; +use randomness::RngExt as _; use test_utils::random::{make_seedable_rng, Seed}; use crate::{ConstrainedValueAccumulator, Error}; @@ -46,9 +46,9 @@ fn create_order_constraints(#[case] seed: Seed) { let pos_store = InMemoryPoSAccounting::new(); let pos_db = PoSAccountingDB::new(&pos_store); - let give_amount = Amount::from_atoms(rng.gen_range(100..1000)); + let give_amount = Amount::from_atoms(rng.random_range(100..1000)); let token_id = TokenId::random_using(&mut rng); - let ask_amount = Amount::from_atoms(rng.gen_range(100..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(100..1000)); let order_data = Box::new(OrderData::new( Destination::AnyoneCanSpend, OutputValue::TokenV1(token_id, ask_amount), @@ -279,9 +279,9 @@ fn fill_order_constraints(#[case] seed: Seed, #[case] version: OrdersVersion) { let tokens_db = tokens_accounting::TokensAccountingDB::new(&tokens_store); let order_id = OrderId::random_using(&mut rng); - let give_amount = Amount::from_atoms(rng.gen_range(100..1000)); + let give_amount = Amount::from_atoms(rng.random_range(100..1000)); let token_id = TokenId::random_using(&mut rng); - let ask_amount = Amount::from_atoms(rng.gen_range(100..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(100..1000)); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::TokenV1(token_id, ask_amount), @@ -633,9 +633,9 @@ fn conclude_order_constraints(#[case] seed: Seed, #[case] version: OrdersVersion let tokens_db = tokens_accounting::TokensAccountingDB::new(&tokens_store); let order_id = OrderId::random_using(&mut rng); - let give_amount = Amount::from_atoms(rng.gen_range(100..1000)); + let give_amount = Amount::from_atoms(rng.random_range(100..1000)); let token_id = TokenId::random_using(&mut rng); - let ask_amount = Amount::from_atoms(rng.gen_range(100..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(100..1000)); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::TokenV1(token_id, ask_amount), diff --git a/chainstate/db-dumper/src/dumper_lib/tests/mod.rs b/chainstate/db-dumper/src/dumper_lib/tests/mod.rs index 95f2743241..d65dfa7ca0 100644 --- a/chainstate/db-dumper/src/dumper_lib/tests/mod.rs +++ b/chainstate/db-dumper/src/dumper_lib/tests/mod.rs @@ -36,7 +36,8 @@ use crypto::vrf::{VRFKeyKind, VRFPrivateKey, VRFReturn}; use mocks::MockChainstateInterface; use test_utils::{ random::{ - make_seedable_rng, randomness::SliceRandom, CryptoRng, IteratorRandom as _, Rng, Seed, + make_seedable_rng, randomness::SliceRandom, CryptoRng, IteratorRandom as _, RngExt as _, + Seed, }, random_ascii_alphanumeric_string, }; @@ -241,13 +242,13 @@ fn dump_blocks_random( let mut rng = make_seedable_rng(seed); let genesis_msg = random_ascii_alphanumeric_string(&mut rng, 10..20); - let genesis_timestamp = BlockTimestamp::from_int_seconds(rng.gen_range(0..1_000_000)); + let genesis_timestamp = BlockTimestamp::from_int_seconds(rng.random_range(0..1_000_000)); let genesis = Genesis::new(genesis_msg, genesis_timestamp, vec![]); let chain_config = Arc::new(chain::config::create_unit_test_config_builder().genesis_custom(genesis).build()); - let mainchain_block_count = rng.gen_range(10..20); - let stale_block_count = rng.gen_range(0..mainchain_block_count); + let mainchain_block_count = rng.random_range(10..20); + let stale_block_count = rng.random_range(0..mainchain_block_count); let block_infos = { let mut infos = Vec::new(); @@ -260,7 +261,7 @@ fn dump_blocks_random( if !mainchain_only { for _ in 0..stale_block_count { - let height = BlockHeight::new(rng.gen_range(1..=mainchain_block_count)); + let height = BlockHeight::new(rng.random_range(1..=mainchain_block_count)); let input_info = TestBlockInputInfo::from_rng(height, false, &mut rng); infos.push(TestBlockInfo::from_input_info(input_info)); } @@ -312,7 +313,7 @@ fn dump_blocks_random( let start_height = if start_from_zero_height { 0 } else { - rng.gen_range(1..=mainchain_block_count) + rng.random_range(1..=mainchain_block_count) }; let starting_block_info_index = block_infos @@ -380,16 +381,16 @@ impl TestBlockInputInfo { fn from_rng( height: BlockHeight, is_mainchain: bool, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> TestBlockInputInfo { Self { height, is_mainchain, parent_id: Id::random_using(rng), - timestamp: BlockTimestamp::from_int_seconds(rng.gen()), + timestamp: BlockTimestamp::from_int_seconds(rng.random()), pool_id: PoolId::random_using(rng), target: gen_target(rng), - chain_trust: Uint256::from_bytes(rng.gen()), + chain_trust: Uint256::from_bytes(rng.random()), status: BlockStatusOutput::iter().choose(rng).unwrap(), } } @@ -499,24 +500,24 @@ fn make_consensus_data(pool_id: PoolId, compact_target: Compact) -> ConsensusDat ))) } -fn bogus_vrf_return(rng: &mut (impl Rng + CryptoRng)) -> VRFReturn { +fn bogus_vrf_return(rng: &mut impl CryptoRng) -> VRFReturn { let (vrf_sk, _) = VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel); let vrf_transcript = construct_transcript( - rng.gen(), - &rng.gen(), - BlockTimestamp::from_int_seconds(rng.gen()), + rng.random(), + &rng.random(), + BlockTimestamp::from_int_seconds(rng.random()), ) .with_rng(rng); vrf_sk.produce_vrf_data(vrf_transcript) } -fn gen_compact_target(rng: &mut (impl Rng + CryptoRng)) -> Compact { - let target = Uint256::from_bytes(rng.gen()); +fn gen_compact_target(rng: &mut impl CryptoRng) -> Compact { + let target = Uint256::from_bytes(rng.random()); target.into() } -fn gen_target(rng: &mut (impl Rng + CryptoRng)) -> Uint256 { +fn gen_target(rng: &mut impl CryptoRng) -> Uint256 { gen_compact_target(rng).try_into().unwrap() } diff --git a/chainstate/src/detail/bootstrap.rs b/chainstate/src/detail/bootstrap.rs index 2259890108..742399a5c9 100644 --- a/chainstate/src/detail/bootstrap.rs +++ b/chainstate/src/detail/bootstrap.rs @@ -261,7 +261,7 @@ where mod tests { use rstest::rstest; - use randomness::Rng as _; + use randomness::RngExt as _; use test_utils::random::{make_seedable_rng, Seed}; use super::*; @@ -276,10 +276,10 @@ mod tests { { let header = BootstrapFileHeader { - file_magic_bytes: rng.gen(), - chain_magic_bytes: MagicBytes::new(rng.gen()), - file_format_version: rng.gen(), - blocks_count: rng.gen(), + file_magic_bytes: rng.random(), + chain_magic_bytes: MagicBytes::new(rng.random()), + file_format_version: rng.random(), + blocks_count: rng.random(), }; let encoded_size = header.encoded_size(); diff --git a/chainstate/src/detail/orphan_blocks/pool.rs b/chainstate/src/detail/orphan_blocks/pool.rs index 714c9f0406..f10c6882b7 100644 --- a/chainstate/src/detail/orphan_blocks/pool.rs +++ b/chainstate/src/detail/orphan_blocks/pool.rs @@ -13,13 +13,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::collections::BTreeMap; -use std::rc::Rc; +use std::{collections::BTreeMap, rc::Rc}; -use common::chain::{Block, GenBlock}; -use common::primitives::id::WithId; -use common::primitives::{Id, Idable}; -use randomness::SliceRandom; +use common::{ + chain::{Block, GenBlock}, + primitives::{id::WithId, Id, Idable}, +}; +use randomness::IndexedRandom as _; pub struct OrphanBlocksPool { orphan_ids: Vec>, @@ -152,12 +152,16 @@ impl OrphanBlocksPool { #[cfg(test)] mod tests { + use rstest::rstest; + + use common::{chain::block::Block, primitives::Id}; + use randomness::{Rng, RngExt as _}; + use test_utils::random::{make_seedable_rng, Seed}; + use super::*; + use checkers::*; - use common::{chain::block::Block, primitives::Id}; use helpers::*; - use rstest::rstest; - use test_utils::random::{make_seedable_rng, Seed}; const MAX_ORPHAN_BLOCKS: usize = 512; @@ -168,7 +172,6 @@ mod tests { use common::chain::signed_transaction::SignedTransaction; use common::chain::transaction::Transaction; use common::primitives::H256; - use randomness::Rng; pub fn gen_random_blocks(rng: &mut impl Rng, count: u32) -> Vec { (0..count).map(|_| gen_random_block(rng)).collect::>() @@ -183,8 +186,8 @@ mod tests { Block::new( vec![SignedTransaction::new(tx, vec![]).expect("invalid witness count")], - prev_block_id.unwrap_or_else(|| H256::from_low_u64_be(rng.gen()).into()), - BlockTimestamp::from_int_seconds(rng.gen()), + prev_block_id.unwrap_or_else(|| H256::from_low_u64_be(rng.random()).into()), + BlockTimestamp::from_int_seconds(rng.random()), ConsensusData::None, BlockReward::new(Vec::new()), ) @@ -220,7 +223,7 @@ mod tests { prev_block_id: Option>, ) -> Vec { let prev_block_id = - prev_block_id.unwrap_or_else(|| H256::from_low_u64_be(rng.gen()).into()); + prev_block_id.unwrap_or_else(|| H256::from_low_u64_be(rng.random()).into()); (0..count).map(|_| gen_block_from_id(rng, Some(prev_block_id.into()))).collect() } diff --git a/chainstate/storage/src/internal/test.rs b/chainstate/storage/src/internal/test.rs index 27c3aad054..0e117a1d45 100644 --- a/chainstate/storage/src/internal/test.rs +++ b/chainstate/storage/src/internal/test.rs @@ -20,7 +20,7 @@ use common::chain::{Block, Destination, OutPointSourceId, TxOutput, UtxoOutPoint use common::primitives::Id; use common::primitives::{Amount, BlockHeight, Idable, H256}; use crypto::key::{KeyKind, PrivateKey}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use rstest::rstest; use serialization::Encode; use test_utils::random::{make_seedable_rng, Seed}; @@ -298,9 +298,9 @@ fn test_storage_transactions_with_result_check(#[case] seed: Seed) { } /// returns a tuple of utxo and outpoint, for testing. -fn create_rand_utxo(rng: &mut (impl Rng + CryptoRng), block_height: u64) -> (Utxo, UtxoOutPoint) { +fn create_rand_utxo(rng: &mut impl CryptoRng, block_height: u64) -> (Utxo, UtxoOutPoint) { // just a random value generated, and also a random `is_block_reward` value. - let random_value = rng.gen_range(0..(u128::MAX - 1)); + let random_value = rng.random_range(0..(u128::MAX - 1)); let (_, pub_key) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); let output = TxOutput::Transfer( OutputValue::Coin(Amount::from_atoms(random_value)), @@ -323,11 +323,11 @@ fn create_rand_utxo(rng: &mut (impl Rng + CryptoRng), block_height: u64) -> (Utx /// `max_lim_of_utxos` - sets the maximum limit of utxos of a random TxUndo. /// `max_lim_of_tx_undos` - the maximum limit of TxUndos in the BlockUndo. pub fn create_rand_block_undo( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, max_lim_of_utxos: u8, max_lim_of_tx_undos: u8, ) -> UtxosBlockUndo { - let utxo_rng = rng.gen_range(1..max_lim_of_utxos); + let utxo_rng = rng.random_range(1..max_lim_of_utxos); let reward_utxos = (0..utxo_rng) .enumerate() .map(|(i, _)| create_rand_utxo(rng, i as u64).0) @@ -335,12 +335,12 @@ pub fn create_rand_block_undo( let reward_undo = UtxosBlockRewardUndo::new(reward_utxos); let mut tx_undo = vec![]; - let undo_rng = rng.gen_range(1..max_lim_of_tx_undos); + let undo_rng = rng.random_range(1..max_lim_of_tx_undos); for _ in 0..undo_rng { - let utxo_rng = rng.gen_range(1..max_lim_of_utxos); + let utxo_rng = rng.random_range(1..max_lim_of_utxos); let tx_utxos = (0..utxo_rng) .enumerate() - .map(|(i, _)| rng.gen::().then(|| create_rand_utxo(rng, i as u64).0)) + .map(|(i, _)| rng.random::().then(|| create_rand_utxo(rng, i as u64).0)) .collect(); tx_undo.push(UtxosTxUndoWithSources::new(tx_utxos, vec![])); diff --git a/chainstate/test-framework/src/block_builder.rs b/chainstate/test-framework/src/block_builder.rs index 9244f418b6..2d04d9d2be 100644 --- a/chainstate/test-framework/src/block_builder.rs +++ b/chainstate/test-framework/src/block_builder.rs @@ -139,7 +139,7 @@ impl<'f> BlockBuilder<'f> { /// Adds a transaction that uses random utxos and accounts // TODO: this function is currently unused. Remove it? - pub fn add_test_transaction(mut self, rng: &mut (impl Rng + CryptoRng)) -> Self { + pub fn add_test_transaction(mut self, rng: &mut impl CryptoRng) -> Self { let utxo_set = self .framework .storage @@ -345,7 +345,7 @@ impl<'f> BlockBuilder<'f> { self } - fn build_impl(self, rng: &mut (impl Rng + CryptoRng)) -> (Block, &'f mut TestFramework) { + fn build_impl(self, rng: &mut impl CryptoRng) -> (Block, &'f mut TestFramework) { let block_body = BlockBody::new(self.reward, self.transactions); let merkle_proxy = block_body.merkle_tree_proxy().unwrap(); let unsigned_header = BlockHeader::new( @@ -372,14 +372,14 @@ impl<'f> BlockBuilder<'f> { } /// Builds a block without processing it. - pub fn build(self, rng: &mut (impl Rng + CryptoRng)) -> Block { + pub fn build(self, rng: &mut impl CryptoRng) -> Block { self.build_impl(rng).0 } /// Constructs a block and processes it by the chainstate. pub fn build_and_process( self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> Result, ChainstateError> { let block_source = self.block_source; let (block, framework) = self.build_impl(rng); diff --git a/chainstate/test-framework/src/framework.rs b/chainstate/test-framework/src/framework.rs index 9fd20b3f71..23345dd333 100644 --- a/chainstate/test-framework/src/framework.rs +++ b/chainstate/test-framework/src/framework.rs @@ -37,7 +37,7 @@ use common::{ use crypto::{key::PrivateKey, vrf::VRFPrivateKey}; use orders_accounting::OrdersAccountingDB; use pos_accounting::{PoSAccountingDB, PoSAccountingData}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use utils::atomics::SeqCstAtomicU64; use utxo::{Utxo, UtxosDB}; @@ -80,7 +80,7 @@ pub type BlockOutputs = BTreeMap>; impl TestFramework { /// Creates a new test framework instance using a builder api. - pub fn builder(rng: &mut (impl Rng + CryptoRng)) -> TestFrameworkBuilder { + pub fn builder(rng: &mut impl CryptoRng) -> TestFrameworkBuilder { TestFrameworkBuilder::new(rng) } @@ -230,7 +230,7 @@ impl TestFramework { &mut self, parent_block: &Id, blocks_count: usize, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> Result>, ChainstateError> { self.create_chain_return_ids_impl(parent_block, blocks_count, false, rng) } @@ -243,7 +243,7 @@ impl TestFramework { &mut self, parent_block: &Id, blocks_count: usize, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> Result>, ChainstateError> { self.create_chain_return_ids_impl(parent_block, blocks_count, true, rng) } @@ -253,7 +253,7 @@ impl TestFramework { parent_block: &Id, blocks_count: usize, advance_time: bool, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> Result>, ChainstateError> { let target_block_time = self.chain_config().target_block_spacing(); @@ -262,7 +262,7 @@ impl TestFramework { let mut ids = Vec::with_capacity(blocks_count); for _ in 0..blocks_count { if advance_time { - let seconds = rng.gen_range(1..target_block_time.as_secs() * 2); + let seconds = rng.random_range(1..target_block_time.as_secs() * 2); self.progress_time_seconds_since_epoch(seconds); } @@ -288,7 +288,7 @@ impl TestFramework { &mut self, parent_block: &Id, blocks_count: usize, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> Result, ChainstateError> { Ok(*self.create_chain_return_ids(parent_block, blocks_count, rng)?.last().unwrap()) } @@ -301,7 +301,7 @@ impl TestFramework { /// will be identical. pub fn create_chain_pos( &mut self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, parent_block: &Id, blocks: usize, staking_pool: PoolId, @@ -325,7 +325,7 @@ impl TestFramework { /// based on "target_block_spacing". pub fn create_chain_pos_randomizing_time( &mut self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, parent_block: &Id, blocks: usize, staking_pool: PoolId, @@ -346,7 +346,7 @@ impl TestFramework { #[allow(clippy::too_many_arguments)] fn create_chain_pos_impl( &mut self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, parent_block: &Id, blocks: usize, staking_pool: PoolId, @@ -382,7 +382,7 @@ impl TestFramework { &mut self, parent_block: &Id, blocks_count: usize, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> Result, ChainstateError> { let mut prev_block_id = *parent_block; let result = || -> Result>, ChainstateError> { diff --git a/chainstate/test-framework/src/framework_builder.rs b/chainstate/test-framework/src/framework_builder.rs index c4042a245a..f76d8cf8c6 100644 --- a/chainstate/test-framework/src/framework_builder.rs +++ b/chainstate/test-framework/src/framework_builder.rs @@ -32,7 +32,7 @@ use common::{ time_getter::TimeGetter, }; use crypto::{key::PrivateKey, vrf::VRFPrivateKey}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use strum::EnumCount; use test_utils::{mock_time_getter::mocked_time_getter_seconds, random::Seed}; use utils::atomics::SeqCstAtomicU64; @@ -60,7 +60,7 @@ pub struct TestFrameworkBuilder { impl TestFrameworkBuilder { /// Constructs a builder instance with values appropriate for most of the tests. - pub fn new(rng: &mut (impl Rng + CryptoRng)) -> Self { + pub fn new(rng: &mut impl CryptoRng) -> Self { let chain_config = common::chain::config::create_unit_test_config(); let chainstate_config = ChainstateConfig::new(); let chainstate_storage = TestStore::new_empty().unwrap(); @@ -70,7 +70,7 @@ impl TestFrameworkBuilder { let staking_pools = StakingPools::new(); assert_eq!(TxVerificationStrategy::COUNT, 3); - let tx_verification_strategy = match rng.gen_range(0..3) { + let tx_verification_strategy = match rng.random_range(0..3) { 0 => TxVerificationStrategy::Default, 1 => TxVerificationStrategy::Disposable, 2 => TxVerificationStrategy::Randomized(Seed::from_u64(rng.next_u64())), diff --git a/chainstate/test-framework/src/helpers.rs b/chainstate/test-framework/src/helpers.rs index 5edc86240b..3e9636d836 100644 --- a/chainstate/test-framework/src/helpers.rs +++ b/chainstate/test-framework/src/helpers.rs @@ -27,14 +27,14 @@ use common::{ primitives::{Amount, BlockHeight, Id, Idable}, }; use orders_accounting::{OrdersAccountingDB, OrdersAccountingView as _}; -use randomness::{CryptoRng, Rng, SliceRandom as _}; +use randomness::{CryptoRng, Rng, RngExt as _, SliceRandom as _}; use test_utils::{random_ascii_alphanumeric_string, token_utils::random_nft_issuance}; use crate::{get_output_value, TestFramework, TransactionBuilder}; // Note: this function will create 2 blocks pub fn issue_and_mint_random_token_from_best_block( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, utxo_to_pay_fee: UtxoOutPoint, amount_to_mint: Amount, @@ -55,7 +55,7 @@ pub fn issue_and_mint_random_token_from_best_block( token_ticker: random_ascii_alphanumeric_string(rng, 1..max_ticker_len) .as_bytes() .to_vec(), - number_of_decimals: rng.gen_range(1..max_dec_count), + number_of_decimals: rng.random_range(1..max_dec_count), metadata_uri: random_ascii_alphanumeric_string(rng, 1..max_uri_len).as_bytes().to_vec(), total_supply, is_freezable, @@ -86,7 +86,7 @@ pub fn issue_and_mint_random_token_from_best_block( } pub fn issue_token_from_block( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, parent_block_id: Id, utxo_to_pay_fee: UtxoOutPoint, @@ -139,7 +139,7 @@ pub fn make_token_issuance( ) -> TokenIssuance { TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(rng, 1..1024).as_bytes().to_vec(), total_supply: supply, authority: Destination::AnyoneCanSpend, @@ -148,7 +148,7 @@ pub fn make_token_issuance( } pub fn issue_token_from_genesis( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, supply: TokenTotalSupply, freezable: IsTokenFreezable, @@ -179,7 +179,7 @@ pub fn issue_token_from_genesis( } pub fn mint_tokens_in_block( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, parent_block_id: Id, utxo_to_pay_fee: UtxoOutPoint, @@ -237,7 +237,7 @@ pub fn mint_tokens_in_block( } pub fn issue_random_nft_from_best_block( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, utxo_to_pay_fee: UtxoOutPoint, ) -> ( @@ -320,7 +320,7 @@ pub fn order_min_non_zero_fill_amount( /// Split an u128 value into the specified number of "randomish" parts (the min part size is half /// the average part size). -pub fn split_u128(rng: &mut (impl Rng + CryptoRng), amount: u128, parts_count: usize) -> Vec { +pub fn split_u128(rng: &mut impl CryptoRng, amount: u128, parts_count: usize) -> Vec { assert!(parts_count > 0); let mut result = Vec::with_capacity(parts_count); let parts_count = parts_count as u128; @@ -331,7 +331,7 @@ pub fn split_u128(rng: &mut (impl Rng + CryptoRng), amount: u128, parts_count: u let amount_part_above_min = if i == parts_count - 1 { remaining_amount_above_min } else { - rng.gen_range(0..remaining_amount_above_min / 2) + rng.random_range(0..remaining_amount_above_min / 2) }; result.push(min_part_amount + amount_part_above_min); @@ -348,7 +348,7 @@ pub fn split_u128(rng: &mut (impl Rng + CryptoRng), amount: u128, parts_count: u /// /// The "fee" parameter only makes sense if the outpoint's currency is coins. pub fn make_tx_builder_to_split_utxo( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, outpoint: UtxoOutPoint, parts_count: usize, @@ -372,7 +372,7 @@ pub fn make_tx_builder_to_split_utxo( } pub fn split_utxo( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, outpoint: UtxoOutPoint, parts_count: usize, diff --git a/chainstate/test-framework/src/key_manager.rs b/chainstate/test-framework/src/key_manager.rs index 42873ad2b5..b79737a8d1 100644 --- a/chainstate/test-framework/src/key_manager.rs +++ b/chainstate/test-framework/src/key_manager.rs @@ -38,7 +38,7 @@ use common::{ }, }; use crypto::key::{KeyKind, PrivateKey, PublicKey}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; #[derive(Clone)] struct Multisig { @@ -78,9 +78,9 @@ impl KeyManager { pub fn new_destination( &mut self, chain_config: &ChainConfig, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> Destination { - match rng.gen_range(0..5) { + match rng.random_range(0..5) { 0 => { let (private_key, public_key) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); @@ -95,8 +95,8 @@ impl KeyManager { Destination::PublicKey(public_key) } 2 => { - let min_required_signatures = rng.gen_range(1..32); - let num_pub_keys = rng.gen_range(min_required_signatures..=32); + let min_required_signatures = rng.random_range(1..32); + let num_pub_keys = rng.random_range(min_required_signatures..=32); let keys: Vec<_> = (0..num_pub_keys) .map(|_| PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr)) .collect(); @@ -115,7 +115,7 @@ impl KeyManager { ); Destination::ClassicMultisig(multisig_hash) } - // 3 => Destination::ScriptHash(Id::new(H256::from_slice(&rng.gen::<[u8; 32]>()))), + // 3 => Destination::ScriptHash(Id::new(H256::from_slice(&rng.random::<[u8; 32]>()))), _ => Destination::AnyoneCanSpend, } } @@ -123,7 +123,7 @@ impl KeyManager { pub fn new_2_of_2_multisig_destination( &mut self, chain_config: &ChainConfig, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> Destination { let min_required_signatures = 2; let num_pub_keys = 2; @@ -148,7 +148,7 @@ impl KeyManager { #[allow(clippy::too_many_arguments)] pub fn get_signature( &self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, destination: &Destination, chain_config: &ChainConfig, tx: &Transaction, diff --git a/chainstate/test-framework/src/pos_block_builder.rs b/chainstate/test-framework/src/pos_block_builder.rs index 43bf1f8959..ad31dc515a 100644 --- a/chainstate/test-framework/src/pos_block_builder.rs +++ b/chainstate/test-framework/src/pos_block_builder.rs @@ -49,7 +49,7 @@ use crypto::{ }; use orders_accounting::{InMemoryOrdersAccounting, OrdersAccountingDB}; use pos_accounting::{InMemoryPoSAccounting, PoSAccountingDB}; -use randomness::{seq::IteratorRandom, CryptoRng, Rng}; +use randomness::{seq::IteratorRandom, CryptoRng, Rng, RngExt as _}; use serialization::Encode; use tokens_accounting::{InMemoryTokensAccounting, TokensAccountingDB}; @@ -230,7 +230,7 @@ impl<'f> PoSBlockBuilder<'f> { self } - fn build_impl(self, rng: &mut (impl Rng + CryptoRng)) -> (Block, &'f mut TestFramework) { + fn build_impl(self, rng: &mut impl CryptoRng) -> (Block, &'f mut TestFramework) { let (consensus_data, block_timestamp) = match self.consensus_data { Some(data) => (data, self.timestamp), None => { @@ -271,7 +271,7 @@ impl<'f> PoSBlockBuilder<'f> { let target_block_time = self.framework.chainstate.get_chain_config().target_block_spacing(); let time_advancement = if self.randomize_timediffs { - rng.gen_range(1..target_block_time.as_secs() * 2) + rng.random_range(1..target_block_time.as_secs() * 2) } else { target_block_time.as_secs() }; @@ -288,21 +288,21 @@ impl<'f> PoSBlockBuilder<'f> { } /// Builds a block without processing it. - pub fn build(self, rng: &mut (impl Rng + CryptoRng)) -> Block { + pub fn build(self, rng: &mut impl CryptoRng) -> Block { self.build_impl(&mut *rng).0 } /// Constructs a block and processes it by the chainstate. pub fn build_and_process( self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> Result, ChainstateError> { let (block, framework) = self.build_impl(&mut *rng); let res = framework.process_block(block, BlockSource::Local)?; Ok(res) } - fn mine_pos_block(&self, rng: &mut (impl Rng + CryptoRng)) -> (PoSData, BlockTimestamp) { + fn mine_pos_block(&self, rng: &mut impl CryptoRng) -> (PoSData, BlockTimestamp) { let parent_block_index = self.framework.gen_block_index(&self.prev_block_hash); let kernel_input_outpoint = self.kernel_input_outpoint.clone().unwrap_or_else(|| { @@ -375,7 +375,7 @@ impl<'f> PoSBlockBuilder<'f> { } /// Adds a transaction that uses random utxos and accounts - pub fn add_test_transaction(mut self, rng: &mut (impl Rng + CryptoRng)) -> Self { + pub fn add_test_transaction(mut self, rng: &mut impl CryptoRng) -> Self { let utxo_set = self .framework .storage diff --git a/chainstate/test-framework/src/random_tx_maker.rs b/chainstate/test-framework/src/random_tx_maker.rs index 61e729954b..0e666559a4 100644 --- a/chainstate/test-framework/src/random_tx_maker.rs +++ b/chainstate/test-framework/src/random_tx_maker.rs @@ -49,7 +49,7 @@ use pos_accounting::{ PoSAccountingDeltaData, PoSAccountingOperations, PoSAccountingUndo, PoSAccountingView, PoolData, }; -use randomness::{seq::IteratorRandom, CryptoRng, Rng, SliceRandom}; +use randomness::{seq::IteratorRandom, CryptoRng, Rng, RngExt as _, SliceRandom}; use test_utils::{random_ascii_alphanumeric_string, token_utils::*}; use tokens_accounting::{ InMemoryTokensAccounting, TokensAccountingCache, TokensAccountingDB, TokensAccountingDeltaData, @@ -133,18 +133,18 @@ fn get_random_timelock( ) -> OutputTimeLock { const MAX_LOCK_FOR_NUM_BLOCKS: u64 = 5; let target_block_spacing_sec = chainstate.get_chain_config().target_block_spacing().as_secs(); - match rng.gen_range(0..4) { - 0 => OutputTimeLock::ForBlockCount(rng.gen_range(0..=MAX_LOCK_FOR_NUM_BLOCKS)), + match rng.random_range(0..4) { + 0 => OutputTimeLock::ForBlockCount(rng.random_range(0..=MAX_LOCK_FOR_NUM_BLOCKS)), 1 => OutputTimeLock::UntilHeight( chainstate .get_best_block_height() .unwrap() - .checked_add(rng.gen_range(0..=MAX_LOCK_FOR_NUM_BLOCKS)) + .checked_add(rng.random_range(0..=MAX_LOCK_FOR_NUM_BLOCKS)) .unwrap(), ), 2 => OutputTimeLock::ForSeconds( - target_block_spacing_sec * rng.gen_range(0..=MAX_LOCK_FOR_NUM_BLOCKS) - + rng.gen_range(0..=target_block_spacing_sec), + target_block_spacing_sec * rng.random_range(0..=MAX_LOCK_FOR_NUM_BLOCKS) + + rng.random_range(0..=target_block_spacing_sec), ), 3 => OutputTimeLock::UntilTime( chainstate @@ -152,8 +152,8 @@ fn get_random_timelock( .unwrap() .block_timestamp() .add_int_seconds( - target_block_spacing_sec * rng.gen_range(0..=MAX_LOCK_FOR_NUM_BLOCKS) - + rng.gen_range(0..=target_block_spacing_sec), + target_block_spacing_sec * rng.random_range(0..=MAX_LOCK_FOR_NUM_BLOCKS) + + rng.random_range(0..=target_block_spacing_sec), ) .unwrap(), ), @@ -237,7 +237,7 @@ impl<'a> RandomTxMaker<'a> { pub fn make( mut self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, staking_pools_observer: &mut impl StakingPoolsObserver, key_manager: &mut KeyManager, ) -> ( @@ -363,11 +363,11 @@ impl<'a> RandomTxMaker<'a> { } fn select_utxos(&self, rng: &mut impl Rng) -> Vec<(TxInput, TxOutput)> { - let number_of_inputs = rng.gen_range(1..5); + let number_of_inputs = rng.random_range(1..5); self.utxo_set .utxos() .iter() - .choose_multiple(rng, number_of_inputs) + .sample(rng, number_of_inputs) .iter() .filter_map(|(outpoint, utxo)| { let input = TxInput::Utxo((*outpoint).clone()); @@ -396,13 +396,13 @@ impl<'a> RandomTxMaker<'a> { } fn select_accounts(&self, rng: &mut impl Rng) -> Vec { - let number_of_inputs = rng.gen_range(1..5); + let number_of_inputs = rng.random_range(1..5); let tokens = self .tokens_store .tokens_data() .iter() - .choose_multiple(rng, number_of_inputs) + .sample(rng, number_of_inputs) .iter() .map(|(token_id, _)| AccountType::Token(**token_id)) .collect::>(); @@ -411,7 +411,7 @@ impl<'a> RandomTxMaker<'a> { .orders_store .orders_data() .iter() - .choose_multiple(rng, number_of_inputs) + .sample(rng, number_of_inputs) .iter() .map(|(id, _)| AccountType::Order(**id)) .collect::>(); @@ -420,7 +420,7 @@ impl<'a> RandomTxMaker<'a> { .pos_accounting_store .all_delegation_balances() .iter() - .choose_multiple(rng, number_of_inputs) + .sample(rng, number_of_inputs) .iter() .map(|(id, _)| AccountType::Delegation(**id)) .collect::>(); @@ -453,7 +453,7 @@ impl<'a> RandomTxMaker<'a> { #[allow(clippy::too_many_arguments)] fn create_account_spending( &mut self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tokens_cache: &mut (impl TokensAccountingView + TokensAccountingOperations), pos_accounting_before_tx: &impl PoSAccountingView, pos_accounting_latest: &mut (impl PoSAccountingView @@ -471,7 +471,8 @@ impl<'a> RandomTxMaker<'a> { let balance = pos_accounting_before_tx.get_delegation_balance(delegation_id).unwrap(); if balance > Amount::ZERO { - let to_spend = Amount::from_atoms(rng.gen_range(1..=balance.into_atoms())); + let to_spend = + Amount::from_atoms(rng.random_range(1..=balance.into_atoms())); let new_nonce = self.get_next_nonce(AccountType::Delegation(delegation_id)); result_inputs.push(TxInput::Account(AccountOutPoint::new( @@ -508,7 +509,7 @@ impl<'a> RandomTxMaker<'a> { result_outputs.extend(outputs); } AccountType::Order(order_id) => { - let switch = rng.gen_range(0..3); + let switch = rng.random_range(0..3); if !self.account_command_used && switch != 0 { // conclude an order @@ -569,7 +570,7 @@ impl<'a> RandomTxMaker<'a> { fn create_token_account_spending( &mut self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tokens_cache: &mut (impl TokensAccountingView + TokensAccountingOperations), token_id: TokenId, key_manager: &mut KeyManager, @@ -605,11 +606,11 @@ impl<'a> RandomTxMaker<'a> { } else { (Vec::new(), Vec::new()) } - } else if rng.gen_bool(0.1) { + } else if rng.random_bool(0.1) { if token_data.can_be_frozen() { // Freeze let new_nonce = self.get_next_nonce(AccountType::Token(token_id)); - let unfreezable = if rng.gen::() { + let unfreezable = if rng.random::() { IsTokenUnfreezable::Yes } else { IsTokenUnfreezable::No @@ -634,7 +635,7 @@ impl<'a> RandomTxMaker<'a> { } else { (Vec::new(), Vec::new()) } - } else if rng.gen_bool(0.1) { + } else if rng.random_bool(0.1) { // Change token authority let new_nonce = self.get_next_nonce(AccountType::Token(token_id)); let new_authority = @@ -658,7 +659,7 @@ impl<'a> RandomTxMaker<'a> { ); (vec![account_input, fee_input], vec![fee_change_output]) - } else if rng.gen_bool(0.1) { + } else if rng.random_bool(0.1) { // Change token metadata uri let new_nonce = self.get_next_nonce(AccountType::Token(token_id)); let max_len = self.chainstate.get_chain_config().token_max_uri_len(); @@ -681,7 +682,7 @@ impl<'a> RandomTxMaker<'a> { (vec![account_input, fee_input], vec![fee_change_output]) } else if !token_data.is_locked() { - if rng.gen_bool(0.9) { + if rng.random_bool(0.9) { let circulating_supply = tokens_cache.get_circulating_supply(&token_id).unwrap(); // mint @@ -698,7 +699,7 @@ impl<'a> RandomTxMaker<'a> { } let mint_limit = std::cmp::min(100_000, supply_left.into_atoms()); - let to_mint = Amount::from_atoms(rng.gen_range(1..=mint_limit)); + let to_mint = Amount::from_atoms(rng.random_range(1..=mint_limit)); let new_nonce = self.get_next_nonce(AccountType::Token(token_id)); let account_input = TxInput::AccountCommand( @@ -767,7 +768,7 @@ impl<'a> RandomTxMaker<'a> { #[allow(clippy::too_many_arguments)] fn create_utxo_spending( &mut self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, staking_pools_observer: &mut impl StakingPoolsObserver, tokens_cache: &mut (impl TokensAccountingView + TokensAccountingOperations), pos_accounting_cache: &mut (impl PoSAccountingView + PoSAccountingOperations), @@ -808,7 +809,7 @@ impl<'a> RandomTxMaker<'a> { } TxOutput::CreateStakePool(pool_id, _) | TxOutput::ProduceBlockFromStake(_, pool_id) => { - if self.staking_pool.is_none_or(|id| id != *pool_id) && rng.gen_bool(0.1) { + if self.staking_pool.is_none_or(|id| id != *pool_id) && rng.random_bool(0.1) { let staker_balance = pos_accounting_cache .get_pool_data(*pool_id) .unwrap() @@ -891,7 +892,7 @@ impl<'a> RandomTxMaker<'a> { fn spend_coins( &mut self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, coins: Amount, tokens_cache: &mut (impl TokensAccountingView + TokensAccountingOperations), pos_accounting_cache: &mut (impl PoSAccountingView + PoSAccountingOperations), @@ -911,7 +912,7 @@ impl<'a> RandomTxMaker<'a> { let mut result_outputs = Vec::new(); for atoms_to_spend in atoms_vec { - let switch = rng.gen_range(0..6); + let switch = rng.random_range(0..6); let amount_to_spend = Amount::from_atoms(atoms_to_spend); if switch == 0 && self.token_can_be_issued { // issue token v1 @@ -982,8 +983,9 @@ impl<'a> RandomTxMaker<'a> { { if token_supply > Amount::ZERO { let ask_amount = - Amount::from_atoms(rng.gen_range(1u128..=token_supply.into_atoms())); - let give_amount = Amount::from_atoms(rng.gen_range(1u128..=atoms_to_spend)); + Amount::from_atoms(rng.random_range(1u128..=token_supply.into_atoms())); + let give_amount = + Amount::from_atoms(rng.random_range(1u128..=atoms_to_spend)); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::TokenV1(token_id, ask_amount), @@ -1052,9 +1054,9 @@ impl<'a> RandomTxMaker<'a> { .chainstate .get_chain_config() .data_deposit_max_size(BlockHeight::zero()); - let deposited_data_len = rng.gen_range(0..deposited_data_len); + let deposited_data_len = rng.random_range(0..deposited_data_len); let deposited_data = - (0..deposited_data_len).map(|_| rng.gen::()).collect::>(); + (0..deposited_data_len).map(|_| rng.random::()).collect::>(); let outputs = vec![ TxOutput::DataDeposit(deposited_data), @@ -1082,12 +1084,12 @@ impl<'a> RandomTxMaker<'a> { VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel).1, Destination::AnyoneCanSpend, PerThousand::new_from_rng(rng), - Amount::from_atoms(rng.gen_range(0..1000)), + Amount::from_atoms(rng.random_range(0..1000)), ); TxOutput::CreateStakePool(dummy_pool_id, Box::new(pool_data)) } else { - if rng.gen_bool(0.3) { + if rng.random_bool(0.3) { // Send coins to random delegation if let Some((delegation_id, _)) = get_random_delegation_data( rng, @@ -1106,7 +1108,7 @@ impl<'a> RandomTxMaker<'a> { let destination = key_manager.new_destination(self.chainstate.get_chain_config(), rng); let timelock = get_random_timelock(rng, self.chainstate); - match rng.gen_range(0..5) { + match rng.random_range(0..5) { 0 => TxOutput::LockThenTransfer( OutputValue::Coin(amount_to_spend), destination, @@ -1134,7 +1136,7 @@ impl<'a> RandomTxMaker<'a> { result_outputs.push(output); // Occasionally create new delegation id - if rng.gen::() && self.delegation_can_be_created { + if rng.random::() && self.delegation_can_be_created { if let Some((pool_id, _)) = get_random_pool_data(rng, self.pos_accounting_store, &pos_accounting_cache) { @@ -1154,7 +1156,7 @@ impl<'a> RandomTxMaker<'a> { #[allow(clippy::too_many_arguments)] fn spend_output_value( &mut self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tokens_cache: &mut (impl TokensAccountingView + TokensAccountingOperations), pos_accounting_cache: &mut (impl PoSAccountingView + PoSAccountingOperations), orders_cache: &mut (impl OrdersAccountingView + OrdersAccountingOperations), @@ -1206,7 +1208,7 @@ impl<'a> RandomTxMaker<'a> { fn spend_tokens_v1( &mut self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tokens_cache: &mut (impl TokensAccountingView + TokensAccountingOperations), orders_cache: &mut (impl OrdersAccountingView + OrdersAccountingOperations), token_id: TokenId, @@ -1222,9 +1224,9 @@ impl<'a> RandomTxMaker<'a> { let mut result_outputs = Vec::new(); for atoms in atoms_vec { - if rng.gen::() { + if rng.random::() { let output_value = OutputValue::TokenV1(token_id, Amount::from_atoms(atoms)); - if rng.gen::() { + if rng.random::() { // transfer result_outputs.push(TxOutput::Transfer( output_value, @@ -1271,7 +1273,7 @@ impl<'a> RandomTxMaker<'a> { } } } - } else if rng.gen_bool(0.4) && !self.account_command_used { + } else if rng.random_bool(0.4) && !self.account_command_used { // unmint let token_data = tokens_cache.get_token_data(&token_id).unwrap(); @@ -1317,16 +1319,16 @@ impl<'a> RandomTxMaker<'a> { self.account_command_used = true; } } - } else if rng.gen_bool(0.4) && self.order_can_be_created && atoms > 0 { + } else if rng.random_bool(0.4) && self.order_can_be_created && atoms > 0 { // create order to exchange part of available tokens for coins or other tokens let random_token = get_random_token(rng, self.tokens_store, tokens_cache); - let ask_value = if rng.gen::() + let ask_value = if rng.random::() && random_token .is_some_and(|(id, amount)| id != token_id && amount > Amount::ZERO) { OutputValue::TokenV1(random_token.unwrap().0, random_token.unwrap().1) } else { - OutputValue::Coin(Amount::from_atoms(rng.gen_range(100..10000))) + OutputValue::Coin(Amount::from_atoms(rng.random_range(100..10000))) }; let give_value = OutputValue::TokenV1(token_id, Amount::from_atoms(atoms)); @@ -1352,7 +1354,7 @@ impl<'a> RandomTxMaker<'a> { fn tx_outputs_post_process( &self, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, pos_accounting_cache: &mut (impl PoSAccountingView + PoSAccountingOperations), tokens_cache: &mut (impl TokensAccountingView + TokensAccountingOperations), orders_cache: &mut (impl OrdersAccountingView + OrdersAccountingOperations), diff --git a/chainstate/test-framework/src/tx_verification_strategy/randomized_strategy.rs b/chainstate/test-framework/src/tx_verification_strategy/randomized_strategy.rs index 6c71cd0edf..d03506b066 100644 --- a/chainstate/test-framework/src/tx_verification_strategy/randomized_strategy.rs +++ b/chainstate/test-framework/src/tx_verification_strategy/randomized_strategy.rs @@ -24,7 +24,7 @@ use common::{ use constraints_value_accumulator::AccumulatedFee; use orders_accounting::OrdersAccountingView; use pos_accounting::PoSAccountingView; -use randomness::{Rng, RngCore}; +use randomness::{Rng, RngExt as _}; use test_utils::random::{make_seedable_rng, Seed}; use tokens_accounting::TokensAccountingView; use tx_verifier::{ @@ -53,7 +53,7 @@ use utxo::UtxosView; /// ``` /// pub struct RandomizedTransactionVerificationStrategy { - rng: std::sync::Mutex>, + rng: std::sync::Mutex>, } impl RandomizedTransactionVerificationStrategy { @@ -152,7 +152,7 @@ impl RandomizedTransactionVerificationStrategy { let mut total_fees = AccumulatedFee::new(); let mut tx_num = 0usize; while tx_num < block.transactions().len() { - if self.rng.lock().unwrap().gen::() { + if self.rng.lock().unwrap().random::() { // derive a new cache let (consumed_cache, fee, new_tx_index) = self.connect_with_derived( &tx_verifier, @@ -233,7 +233,7 @@ impl RandomizedTransactionVerificationStrategy { let mut tx_verifier = base_tx_verifier.derive_child(); let mut total_fees = AccumulatedFee::new(); while tx_num < block.transactions().len() { - if self.rng.lock().unwrap().gen::() { + if self.rng.lock().unwrap().random::() { // break the loop, which effectively would flush current state to the parent break; } else { @@ -279,7 +279,7 @@ impl RandomizedTransactionVerificationStrategy { let mut tx_num = i32::try_from(block.transactions().len()).unwrap() - 1; while tx_num >= 0 { - if self.rng.lock().unwrap().gen::() { + if self.rng.lock().unwrap().random::() { // derive a new cache let (consumed_cache, new_tx_index) = self.disconnect_with_derived(&tx_verifier, block, tx_num)?; @@ -319,7 +319,7 @@ impl RandomizedTransactionVerificationStrategy { { let mut tx_verifier = base_tx_verifier.derive_child(); while tx_num >= 0 { - if self.rng.lock().unwrap().gen::() { + if self.rng.lock().unwrap().random::() { // break the loop, which effectively would flush current state to the parent break; } else { diff --git a/chainstate/test-framework/src/utils.rs b/chainstate/test-framework/src/utils.rs index 22d6617e54..fae67ec203 100644 --- a/chainstate/test-framework/src/utils.rs +++ b/chainstate/test-framework/src/utils.rs @@ -56,7 +56,7 @@ use crypto::{ }; use orders_accounting::OrdersAccountingView; use pos_accounting::{PoSAccountingDB, PoSAccountingView}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, Rng, RngExt as _}; use utxo::UtxosView; pub fn empty_witness(rng: &mut impl Rng) -> InputWitness { @@ -126,7 +126,7 @@ pub fn create_utxo_data( let new_output = match v { OutputValue::Coin(output_value) => { let spent_value = - Amount::from_atoms(rng.gen_range(0..output_value.into_atoms())); + Amount::from_atoms(rng.random_range(0..output_value.into_atoms())); let new_value = (*output_value - spent_value).unwrap(); utils::ensure!(new_value >= Amount::from_atoms(1)); TxOutput::Transfer(OutputValue::Coin(new_value), anyonecanspend_address()) @@ -134,7 +134,7 @@ pub fn create_utxo_data( OutputValue::TokenV0(_) => return None, // ignore OutputValue::TokenV1(token_id, output_value) => { let spent_value = - Amount::from_atoms(rng.gen_range(0..output_value.into_atoms())); + Amount::from_atoms(rng.random_range(0..output_value.into_atoms())); let new_value = (*output_value - spent_value).unwrap(); utils::ensure!(new_value >= Amount::from_atoms(1)); TxOutput::Transfer( @@ -238,7 +238,7 @@ pub fn create_chain_config_with_staking_pool( let genesis = Genesis::new( String::new(), - BlockTimestamp::from_int_seconds(rng.gen_range(0..1639975460)), + BlockTimestamp::from_int_seconds(rng.random_range(0..1639975460)), vec![mint_output, pool], ); @@ -250,7 +250,7 @@ pub fn create_chain_config_with_staking_pool( pub fn produce_kernel_signature( tf: &TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, staking_sk: &PrivateKey, reward_outputs: &[TxOutput], staking_destination: Destination, @@ -291,7 +291,7 @@ pub fn produce_kernel_signature( #[allow(clippy::too_many_arguments)] pub fn pos_mine( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, storage: &impl BlockchainStorageRead, pos_config: &PoSChainConfig, initial_timestamp: BlockTimestamp, @@ -374,7 +374,7 @@ pub fn assert_gen_block_index_opt_identical_to( #[allow(clippy::too_many_arguments)] pub fn sign_witnesses( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, key_manager: &KeyManager, chain_config: &ChainConfig, tx: &common::chain::Transaction, @@ -451,7 +451,7 @@ pub fn find_create_pool_tx_in_genesis(genesis: &Genesis, pool_id: &PoolId) -> Op // Alongside `StakePoolData` also returns `PrivateKey` that allows to sign a block that spends a kernel // with this pool data pub fn create_stake_pool_data_with_all_reward_to_staker( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, amount: Amount, vrf_pk: VRFPublicKey, ) -> (StakePoolData, PrivateKey) { diff --git a/chainstate/test-framework/src/utxo_for_spending.rs b/chainstate/test-framework/src/utxo_for_spending.rs index b73b131f88..5aad7701f3 100644 --- a/chainstate/test-framework/src/utxo_for_spending.rs +++ b/chainstate/test-framework/src/utxo_for_spending.rs @@ -20,7 +20,7 @@ use common::{ }, primitives::{Amount, Idable}, }; -use randomness::{CryptoRng, Rng}; +use randomness::CryptoRng; use crate::{empty_witness, TransactionBuilder}; @@ -53,7 +53,7 @@ impl UtxoForSpending { tx_builder: TransactionBuilder, amount_to_spend: Amount, fee: Amount, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> SignedTransaction { let change = (self.amount_available - amount_to_spend).unwrap(); let change = (change - fee).unwrap(); diff --git a/chainstate/test-suite/Cargo.toml b/chainstate/test-suite/Cargo.toml index f55e86a5d1..9f3660dd62 100644 --- a/chainstate/test-suite/Cargo.toml +++ b/chainstate/test-suite/Cargo.toml @@ -35,7 +35,6 @@ tokio = { workspace = true, features = ["rt", "time"] } criterion.workspace = true expect-test.workspace = true -rand.workspace = true rstest.workspace = true strum.workspace = true diff --git a/chainstate/test-suite/src/tests/block_invalidation.rs b/chainstate/test-suite/src/tests/block_invalidation.rs index c887855b21..5bf8f65ab1 100644 --- a/chainstate/test-suite/src/tests/block_invalidation.rs +++ b/chainstate/test-suite/src/tests/block_invalidation.rs @@ -31,7 +31,7 @@ use common::{ primitives::{BlockDistance, BlockHeight, Id, Idable}, Uint256, }; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use test_utils::{ assert_matches, mock_time_getter::mocked_time_getter_seconds, @@ -77,7 +77,7 @@ fn test_stale_chain_invalidation(#[case] seed: Seed, #[case] sb: StorageBuilder) utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng) - .with_storage(sb.clone().build(Seed(rng.gen()))) + .with_storage(sb.clone().build(Seed(rng.random()))) .build(); let genesis_id = tf.genesis().get_id(); @@ -133,7 +133,7 @@ fn test_basic_tip_invalidation(#[case] seed: Seed, #[case] sb: StorageBuilder) { utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng) - .with_storage(sb.clone().build(Seed(rng.gen()))) + .with_storage(sb.clone().build(Seed(rng.random()))) .build(); let genesis_id = tf.genesis().get_id(); @@ -189,7 +189,7 @@ fn test_basic_parent_invalidation(#[case] seed: Seed, #[case] sb: StorageBuilder utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng) - .with_storage(sb.clone().build(Seed(rng.gen()))) + .with_storage(sb.clone().build(Seed(rng.random()))) .build(); let genesis_id = tf.genesis().get_id(); @@ -256,7 +256,7 @@ struct TestChainBlockIds { // | |------d0----d1----d2 // | | /----?e0----e1----e2 // G----m0----(m1)----m2----m3----m4----m5----m6 -fn make_complex_chain(rng: &mut (impl Rng + CryptoRng)) -> (TestFramework, TestChainBlockIds) { +fn make_complex_chain(rng: &mut impl CryptoRng) -> (TestFramework, TestChainBlockIds) { let mut tf = TestFramework::builder(rng) .with_chain_config( chain::config::create_unit_test_config_builder() @@ -741,7 +741,7 @@ fn test_tip_invalidation_with_no_better_candidates(#[case] seed: Seed, #[case] s utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng) - .with_storage(sb.clone().build(Seed(rng.gen()))) + .with_storage(sb.clone().build(Seed(rng.random()))) .build(); let genesis_id = tf.genesis().get_id(); @@ -1077,7 +1077,7 @@ fn test_reset_bad_stale_tip_status_and_add_blocks(#[case] seed: Seed, #[case] sb utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng) - .with_storage(sb.clone().build(Seed(rng.gen()))) + .with_storage(sb.clone().build(Seed(rng.random()))) .build(); let genesis_id = tf.genesis().get_id(); diff --git a/chainstate/test-suite/src/tests/bootstrap.rs b/chainstate/test-suite/src/tests/bootstrap.rs index 071d77e762..d4ebb30edb 100644 --- a/chainstate/test-suite/src/tests/bootstrap.rs +++ b/chainstate/test-suite/src/tests/bootstrap.rs @@ -32,7 +32,7 @@ use common::{ primitives::{Id, Idable}, }; use logging::log; -use rand::{seq::IteratorRandom as _, CryptoRng, Rng}; +use randomness::{seq::IteratorRandom as _, CryptoRng, RngExt as _}; use serialization::Encode as _; use test_utils::random::{gen_random_bytes, make_seedable_rng, Seed}; @@ -77,7 +77,7 @@ fn append_block_data_for_v0(dest: &mut Vec, encoded_block_data: &[u8]) { fn gen_blocks( chain_config: ChainConfig, blocks_count: usize, - mut rng: impl Rng + CryptoRng, + mut rng: impl CryptoRng, ) -> Vec { if blocks_count > 0 { let mut tf = TestFramework::builder(&mut rng).with_chain_config(chain_config).build(); @@ -338,7 +338,7 @@ fn exact_v0_format(#[case] seed: Seed) { let mut source_tf = TestFramework::builder(&mut rng).with_chain_config(chain_config.clone()).build(); let source_tf_genesis_id = source_tf.genesis().get_id(); - let blocks_count = rng.gen_range(5..10); + let blocks_count = rng.random_range(5..10); source_tf .create_chain(&source_tf_genesis_id.into(), blocks_count, &mut rng) .unwrap(); @@ -470,10 +470,10 @@ fn file_too_small(#[case] seed: Seed) { tf.create_chain(&genesis_id.into(), 5, &mut rng).unwrap(); let orig_block_ids = tf.chainstate.get_block_id_tree_as_list().unwrap(); - let header_data = make_header_data(&chain_config, 0, rng.gen()); + let header_data = make_header_data(&chain_config, 0, rng.random()); let incomplete_header_data = - &header_data[0..rng.gen_range(EXPECTED_MAGIC_BYTES.len()..header_data.len() - 1)]; + &header_data[0..rng.random_range(EXPECTED_MAGIC_BYTES.len()..header_data.len() - 1)]; let err = import_from_slice(&mut tf, incomplete_header_data).unwrap_err(); assert_eq!( @@ -505,11 +505,11 @@ fn unsupported_version(#[case] seed: Seed) { tf.create_chain(&genesis_id.into(), 5, &mut rng).unwrap(); let orig_block_ids = tf.chainstate.get_block_id_tree_as_list().unwrap(); - let valid_blocks_count = rng.gen_range(1..5); + let valid_blocks_count = rng.random_range(1..5); let valid_blocks = gen_blocks(chain_config.clone(), valid_blocks_count, &mut rng); // Make a header with an unsupported version, followed by valid v0 data. - let format_version = rng.gen_range(1..10); + let format_version = rng.random_range(1..10); let mut data = make_header_data(&chain_config, format_version, valid_blocks_count as u64); for valid_block in &valid_blocks { let encoded_block = valid_block.encode(); @@ -559,13 +559,13 @@ fn wrong_format(#[case] seed: Seed) { tf.create_chain(&genesis_id.into(), 5, &mut rng).unwrap(); let orig_block_ids = tf.chainstate.get_block_id_tree_as_list().unwrap(); - let valid_blocks_count = rng.gen_range(1..5); + let valid_blocks_count = rng.random_range(1..5); let valid_blocks = gen_blocks(chain_config.clone(), valid_blocks_count, &mut rng); // Make a header with wrong format magic bytes, followed by valid v0 data. let mut data = make_header_data(&chain_config, 0, valid_blocks_count as u64); - let byte_idx_to_mutate = rng.gen_range(0..EXPECTED_MAGIC_BYTES.len()); - data[byte_idx_to_mutate] = data[byte_idx_to_mutate].wrapping_add(rng.gen_range(1..255)); + let byte_idx_to_mutate = rng.random_range(0..EXPECTED_MAGIC_BYTES.len()); + data[byte_idx_to_mutate] = data[byte_idx_to_mutate].wrapping_add(rng.random_range(1..255)); for valid_block in &valid_blocks { let encoded_block = valid_block.encode(); append_block_data_for_v0(&mut data, &encoded_block); @@ -614,7 +614,7 @@ fn bad_v0_file(#[case] seed: Seed) { BadBlockDataLen, } - let valid_blocks_count = rng.gen_range(1..5); + let valid_blocks_count = rng.random_range(1..5); let valid_blocks = gen_blocks(chain_config.clone(), valid_blocks_count, &mut rng); for kind in TestKind::iter() { @@ -645,11 +645,11 @@ fn bad_v0_file(#[case] seed: Seed) { TestKind::BadBlockLenLen => { // Either the file ends right after the previously written valid_blocks_count-1 blocks, // or some portion of the block length field is present. - rng.gen_range(0..3) + rng.random_range(0..3) } TestKind::BadBlockDataLen => { // The block length is correct, but the data after it is incomplete. - rng.gen_range(4..last_block_data.len() - 1) + rng.random_range(4..last_block_data.len() - 1) } }; data.extend_from_slice(&last_block_data[0..last_block_cutoff_pos]); @@ -683,7 +683,7 @@ fn block_size_too_big(#[case] seed: Seed) { let chain_type = ChainType::iter().choose(&mut rng).unwrap(); let chain_config = make_chain_config(chain_type); - let valid_blocks_count = rng.gen_range(0..5); + let valid_blocks_count = rng.random_range(0..5); let valid_blocks = gen_blocks(chain_config.clone(), valid_blocks_count, &mut rng); let mut tf = @@ -730,7 +730,7 @@ fn check_reckless_mode( let mut source_tf = TestFramework::builder(&mut rng).with_chain_config(chain_config.clone()).build(); let genesis_id = source_tf.genesis().get_id(); - let blocks_count = rng.gen_range(5..10); + let blocks_count = rng.random_range(5..10); source_tf.create_chain(&genesis_id.into(), blocks_count, &mut rng).unwrap(); let block_ids = source_tf.chainstate.get_mainchain_blocks_list().unwrap(); diff --git a/chainstate/test-suite/src/tests/chainstate_accounting_storage_tests.rs b/chainstate/test-suite/src/tests/chainstate_accounting_storage_tests.rs index adf51fc601..25c3fdfb83 100644 --- a/chainstate/test-suite/src/tests/chainstate_accounting_storage_tests.rs +++ b/chainstate/test-suite/src/tests/chainstate_accounting_storage_tests.rs @@ -33,19 +33,19 @@ use common::{ }; use crypto::vrf::{VRFKeyKind, VRFPrivateKey}; use pos_accounting::PoolData; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; use utxo::UtxosStorageRead; fn create_pool_data( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, decommission_destination: Destination, pledged_amount: Amount, ) -> PoolData { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel); let margin_ratio = PerThousand::new_from_rng(rng); - let cost_per_block = Amount::from_atoms(rng.gen_range(0..1000)); + let cost_per_block = Amount::from_atoms(rng.random_range(0..1000)); PoolData::new( decommission_destination, pledged_amount, @@ -57,7 +57,7 @@ fn create_pool_data( } fn make_tx_with_stake_pool_from_genesis( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, amount_to_stake: Amount, amount_to_transfer: Amount, @@ -72,7 +72,7 @@ fn make_tx_with_stake_pool_from_genesis( } fn make_tx_with_stake_pool( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, input0_outpoint: UtxoOutPoint, amount_to_stake: Amount, amount_to_transfer: Amount, @@ -102,7 +102,7 @@ fn make_tx_with_stake_pool( // random order of transfer and stake outputs so that tests can use different outpoint 0 or 1 // to make the next pool - let (tx, transfer_output_idx) = if rng.gen::() { + let (tx, transfer_output_idx) = if rng.random::() { ( tx_builder.add_output(transfer_output).add_output(stake_output).build(), 0, diff --git a/chainstate/test-suite/src/tests/chainstate_storage_tests.rs b/chainstate/test-suite/src/tests/chainstate_storage_tests.rs index 0325bf45f8..2f38aa95f8 100644 --- a/chainstate/test-suite/src/tests/chainstate_storage_tests.rs +++ b/chainstate/test-suite/src/tests/chainstate_storage_tests.rs @@ -139,8 +139,8 @@ fn store_fungible_token_v0(#[case] seed: Seed) { .add_output(TxOutput::Transfer( TokenIssuanceV0 { token_ticker: "XXXX".as_bytes().to_vec(), - amount_to_issue: Amount::from_atoms(rng.gen_range(1..u128::MAX)), - number_of_decimals: rng.gen_range(1..18), + amount_to_issue: Amount::from_atoms(rng.random_range(1..u128::MAX)), + number_of_decimals: rng.random_range(1..18), metadata_uri: "http://uri".as_bytes().to_vec(), } .into(), diff --git a/chainstate/test-suite/src/tests/data_deposit.rs b/chainstate/test-suite/src/tests/data_deposit.rs index ebd24576d7..8331bcfe79 100644 --- a/chainstate/test-suite/src/tests/data_deposit.rs +++ b/chainstate/test-suite/src/tests/data_deposit.rs @@ -23,7 +23,7 @@ use common::chain::{ TxInput, TxOutput, UtxoOutPoint, }; use common::primitives::{Amount, BlockHeight, CoinOrTokenId, Idable}; -use randomness::Rng; +use randomness::RngExt as _; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; use tx_verifier::CheckTransactionError; @@ -45,7 +45,8 @@ fn data_deposited_too_large(#[case] seed: Seed, #[case] expect_success: bool) { } else { tf.chain_config().data_deposit_max_size(BlockHeight::zero()) + 1 }; - let deposited_data = (0..deposited_data_len).map(|_| rng.gen::()).collect::>(); + let deposited_data = + (0..deposited_data_len).map(|_| rng.random::()).collect::>(); let tx = TransactionBuilder::new() .add_input( @@ -103,8 +104,9 @@ fn data_deposit_insufficient_fee( let mut rng = make_seedable_rng(seed); let deposited_data_len = tf.chain_config().data_deposit_max_size(BlockHeight::zero()); - let deposited_data_len = rng.gen_range(0..deposited_data_len); - let deposited_data = (0..deposited_data_len).map(|_| rng.gen::()).collect::>(); + let deposited_data_len = rng.random_range(0..deposited_data_len); + let deposited_data = + (0..deposited_data_len).map(|_| rng.random::()).collect::>(); let data_fee = if expect_success { (tf.chain_config().data_deposit_fee(BlockHeight::zero()) @@ -182,8 +184,9 @@ fn data_deposit_output_attempt_spend(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let deposited_data_len = tf.chain_config().data_deposit_max_size(BlockHeight::zero()); - let deposited_data_len = rng.gen_range(0..deposited_data_len); - let deposited_data = (0..deposited_data_len).map(|_| rng.gen::()).collect::>(); + let deposited_data_len = rng.random_range(0..deposited_data_len); + let deposited_data = + (0..deposited_data_len).map(|_| rng.random::()).collect::>(); let at_least_data_fee = (tf.chain_config().data_deposit_fee(BlockHeight::zero()) * 10).unwrap(); diff --git a/chainstate/test-suite/src/tests/delegation_tests.rs b/chainstate/test-suite/src/tests/delegation_tests.rs index 5c1b173a08..8630f7919b 100644 --- a/chainstate/test-suite/src/tests/delegation_tests.rs +++ b/chainstate/test-suite/src/tests/delegation_tests.rs @@ -44,19 +44,19 @@ use crypto::{ vrf::{VRFKeyKind, VRFPrivateKey}, }; use pos_accounting::{DelegationData, PoSAccountingStorageRead}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use test_utils::random::{make_seedable_rng, Seed}; use tx_verifier::error::{InputCheckError, ScriptError}; fn prepare_stake_pool( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, ) -> (PoolId, UtxoOutPoint, UtxoOutPoint) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + Amount::from_atoms(rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(rng, amount_to_stake, vrf_pk); @@ -91,7 +91,7 @@ fn prepare_stake_pool( } fn prepare_delegation( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, ) -> ( PoolId, @@ -238,8 +238,9 @@ fn create_delegation_twice(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(&mut rng, amount_to_stake, vrf_pk); @@ -791,8 +792,9 @@ fn create_pool_and_delegation_and_delegate_same_block(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(&mut rng, amount_to_stake, vrf_pk); @@ -1021,7 +1023,7 @@ fn delegate_and_spend_share_same_tx(#[case] seed: Seed) { // try spending in an single input original balance and a part of newly delegated amount let amount_to_spend = (original_delegation_balance - + Amount::from_atoms(rng.gen_range(1..=change.into_atoms()))) + + Amount::from_atoms(rng.random_range(1..=change.into_atoms()))) .unwrap(); let tx = TransactionBuilder::new() @@ -1107,7 +1109,7 @@ fn delegate_and_spend_share_same_tx_no_overspend_per_input(#[case] seed: Seed) { // try spending in an single input original balance and newly delegated amount let amount_to_spend_per_input = Amount::from_atoms( - rng.gen_range( + rng.random_range( original_delegation_balance.into_atoms() ..=(original_delegation_balance + change).unwrap().into_atoms(), ) / 2, @@ -1201,7 +1203,7 @@ fn delegate_and_spend_share_same_block(#[case] seed: Seed) { assert_eq!(amount_to_delegate, original_delegation_balance); // try spending more the original balance but including new delegation amount - let amount_to_spend = Amount::from_atoms(rng.gen_range( + let amount_to_spend = Amount::from_atoms(rng.random_range( original_delegation_balance.into_atoms() ..=(original_delegation_balance + amount_to_delegate).unwrap().into_atoms(), )); @@ -1285,8 +1287,8 @@ fn try_overspend_delegation_single_tx(#[case] seed: Seed) { assert_eq!(amount_to_delegate, Amount::from_atoms(delegation_balance)); // try overspend delegation balance, but each spending individually must be valid - let to_spend_1 = rng.gen_range(1..=delegation_balance); - let to_spend_2 = rng.gen_range(delegation_balance - to_spend_1 + 1..=delegation_balance); + let to_spend_1 = rng.random_range(1..=delegation_balance); + let to_spend_2 = rng.random_range(delegation_balance - to_spend_1 + 1..=delegation_balance); assert!( (to_spend_1 <= delegation_balance) && (to_spend_2 <= delegation_balance) @@ -1499,7 +1501,7 @@ fn delegate_and_spend_share_same_block_multiple_delegations(#[case] seed: Seed) // try spending more from delegation_1 than the original balance but including new delegation amount let amount_to_spend_per_input = Amount::from_atoms( - rng.gen_range( + rng.random_range( original_delegation_balance_1.into_atoms() ..=(original_delegation_balance_1 + change).unwrap().into_atoms(), ) / 2, @@ -1698,7 +1700,7 @@ fn delegate_same_pool_as_staking(#[case] seed: Seed) { Amount::ZERO, ); - let mint_amount = Amount::from_atoms(rng.gen_range(100..100_000)); + let mint_amount = Amount::from_atoms(rng.random_range(100..100_000)); let chain_config = chainstate_test_framework::create_chain_config_with_staking_pool( &mut rng, mint_amount, diff --git a/chainstate/test-suite/src/tests/double_spend_tests.rs b/chainstate/test-suite/src/tests/double_spend_tests.rs index 46a1fcf42b..00353e1085 100644 --- a/chainstate/test-suite/src/tests/double_spend_tests.rs +++ b/chainstate/test-suite/src/tests/double_spend_tests.rs @@ -13,7 +13,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -use super::*; use chainstate::{ BlockError, BlockSource, ChainstateError, CheckBlockError, CheckBlockTransactionsError, ConnectTransactionError, @@ -28,9 +27,11 @@ use common::{ }, primitives::{Amount, CoinOrTokenId, Id, Idable}, }; -use randomness::SliceRandom; +use randomness::{IndexedRandom as _, Rng, SliceRandom}; use tx_verifier::CheckTransactionError; +use super::*; + // Process a block where the second transaction uses the first one as input. // // +--Block----------------+ @@ -51,9 +52,9 @@ fn spend_output_in_the_same_block(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let tx1_output_value = rng.gen_range(100_000..200_000); + let tx1_output_value = rng.random_range(100_000..200_000); let first_tx = tx_from_genesis(&tf.genesis(), &mut rng, tx1_output_value); - let second_tx = tx_from_tx(&first_tx, rng.gen_range(1000..2000)); + let second_tx = tx_from_tx(&first_tx, rng.random_range(1000..2000)); let block = tf .make_block_builder() @@ -87,10 +88,10 @@ fn spend_output_in_the_same_block_invalid_order(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let tx1_output_value = rng.gen_range(100_000..200_000); + let tx1_output_value = rng.random_range(100_000..200_000); let first_tx = tx_from_genesis(&tf.genesis(), &mut rng, tx1_output_value); let first_tx_id = first_tx.transaction().get_id(); - let second_tx = tx_from_tx(&first_tx, rng.gen_range(1000..2000)); + let second_tx = tx_from_tx(&first_tx, rng.random_range(1000..2000)); assert_eq!( tf.make_block_builder() @@ -132,10 +133,10 @@ fn double_spend_tx_in_the_same_block(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let tx1_output_value = rng.gen_range(100_000..200_000); + let tx1_output_value = rng.random_range(100_000..200_000); let first_tx = tx_from_genesis(&tf.genesis(), &mut rng, tx1_output_value); - let second_tx = tx_from_tx(&first_tx, rng.gen_range(1000..2000)); - let third_tx = tx_from_tx(&first_tx, rng.gen_range(1000..2000)); + let second_tx = tx_from_tx(&first_tx, rng.random_range(1000..2000)); + let third_tx = tx_from_tx(&first_tx, rng.random_range(1000..2000)); let block = tf .make_block_builder() @@ -179,14 +180,14 @@ fn double_spend_tx_in_another_block(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let tx1_output_value = rng.gen_range(100_000..200_000); + let tx1_output_value = rng.random_range(100_000..200_000); let first_tx = tx_from_genesis(&tf.genesis(), &mut rng, tx1_output_value); let first_block = tf.make_block_builder().add_transaction(first_tx).build(&mut rng); let first_block_id = first_block.get_id(); tf.process_block(first_block, BlockSource::Local).unwrap(); assert_eq!(tf.best_block_id(), first_block_id); - let tx2_output_value = rng.gen_range(100_000..200_000); + let tx2_output_value = rng.random_range(100_000..200_000); let second_tx = tx_from_genesis(&tf.genesis(), &mut rng, tx2_output_value); let second_block = tf.make_block_builder().add_transaction(second_tx).build(&mut rng); assert_eq!( @@ -222,8 +223,8 @@ fn overspend_single_output(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let tx1_output_value = rng.gen_range(1000..2000); - let tx2_output_value = rng.gen_range(100_000..200_000); + let tx1_output_value = rng.random_range(1000..2000); + let tx2_output_value = rng.random_range(100_000..200_000); let first_tx = tx_from_genesis(&tf.genesis(), &mut rng, tx1_output_value); let second_tx = tx_from_tx(&first_tx, tx2_output_value); let second_tx_id = second_tx.transaction().get_id(); @@ -256,7 +257,7 @@ fn overspend_multiple_outputs(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let tx1_output_value = rng.gen_range(1000..2000); + let tx1_output_value = rng.random_range(1000..2000); let tx1 = tx_from_genesis(&tf.genesis(), &mut rng, tx1_output_value); let tx2_output_value = tx1_output_value - 1; @@ -312,7 +313,7 @@ fn duplicate_input_in_the_same_tx(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let tx1_output_value = rng.gen_range(100_000..200_000); + let tx1_output_value = rng.random_range(100_000..200_000); let first_tx = tx_from_genesis(&tf.genesis(), &mut rng, tx1_output_value); let witness = InputWitness::NoSignature(None); @@ -321,7 +322,7 @@ fn duplicate_input_in_the_same_tx(#[case] seed: Seed) { .add_input(input.clone(), witness.clone()) .add_input(input, witness) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(100_000..200_000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(100_000..200_000))), anyonecanspend_address(), )) .build(); @@ -366,7 +367,7 @@ fn same_input_diff_sig_in_the_same_tx(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let tx1_output_value = rng.gen_range(100_000..200_000); + let tx1_output_value = rng.random_range(100_000..200_000); let first_tx = tx_from_genesis(&tf.genesis(), &mut rng, tx1_output_value); let witness1 = InputWitness::NoSignature(Some(vec![0, 1, 2])); @@ -377,7 +378,7 @@ fn same_input_diff_sig_in_the_same_tx(#[case] seed: Seed) { .add_input(input1, witness1) .add_input(input2, witness2) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(100_000..200_000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(100_000..200_000))), anyonecanspend_address(), )) .build(); @@ -426,7 +427,7 @@ fn duplicate_tx_in_the_same_block(#[case] seed: Seed) { let mut tf = TestFramework::builder(&mut rng).build(); let first_tx = tx_from_genesis(&tf.genesis(), &mut rng, 1); - let second_tx = tx_from_tx(&first_tx, rng.gen_range(1000..2000)); + let second_tx = tx_from_tx(&first_tx, rng.random_range(1000..2000)); let txs = vec![first_tx, second_tx]; let tx_duplicate = txs.choose(&mut rng).unwrap().clone(); @@ -457,8 +458,8 @@ fn triplicate_tx_in_the_same_block(#[case] seed: Seed) { let mut tf = TestFramework::builder(&mut rng).build(); let first_tx = tx_from_genesis(&tf.genesis(), &mut rng, 1); - let second_tx = tx_from_tx(&first_tx, rng.gen_range(1000..2000)); - let third_tx = tx_from_tx(&second_tx, rng.gen_range(1000..2000)); + let second_tx = tx_from_tx(&first_tx, rng.random_range(1000..2000)); + let third_tx = tx_from_tx(&second_tx, rng.random_range(1000..2000)); let txs = vec![first_tx, second_tx, third_tx]; let tx_duplicate = txs.choose(&mut rng).unwrap().clone(); @@ -496,11 +497,11 @@ fn try_spend_burned_output_same_block(#[case] seed: Seed) { empty_witness(&mut rng), ) .add_output(TxOutput::Burn(OutputValue::Coin(Amount::from_atoms( - rng.gen_range(100_000..200_000), + rng.random_range(100_000..200_000), )))) .build(); let first_tx_id = first_tx.transaction().get_id(); - let second_tx = tx_from_tx(&first_tx, rng.gen_range(1000..2000)); + let second_tx = tx_from_tx(&first_tx, rng.random_range(1000..2000)); let block = tf .make_block_builder() @@ -537,7 +538,7 @@ fn try_spend_burned_output_different_blocks(#[case] seed: Seed) { empty_witness(&mut rng), ) .add_output(TxOutput::Burn(OutputValue::Coin(Amount::from_atoms( - rng.gen_range(100_000..200_000), + rng.random_range(100_000..200_000), )))) .build(); let block = tf @@ -546,7 +547,7 @@ fn try_spend_burned_output_different_blocks(#[case] seed: Seed) { .build(&mut rng); tf.process_block(block, BlockSource::Local).unwrap(); - let second_tx = tx_from_tx(&first_tx, rng.gen_range(1000..2000)); + let second_tx = tx_from_tx(&first_tx, rng.random_range(1000..2000)); let block_2 = tf.make_block_builder().with_transactions(vec![second_tx]).build(&mut rng); assert_eq!( tf.process_block(block_2, BlockSource::Local).unwrap_err(), diff --git a/chainstate/test-suite/src/tests/events_tests.rs b/chainstate/test-suite/src/tests/events_tests.rs index 191b60f793..b96c7223b8 100644 --- a/chainstate/test-suite/src/tests/events_tests.rs +++ b/chainstate/test-suite/src/tests/events_tests.rs @@ -28,7 +28,7 @@ use common::{ chain::{block::timestamp::BlockTimestamp, GenBlock}, primitives::{id::Idable, BlockHeight, Id}, }; -use randomness::Rng; +use randomness::RngExt as _; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -95,7 +95,7 @@ fn several_subscribers(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let subscribers = rng.gen_range(8..256); + let subscribers = rng.random_range(8..256); let events = subscribe(&mut tf.chainstate, subscribers); let block = tf @@ -124,8 +124,8 @@ fn several_subscribers_several_events(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let subscribers = rng.gen_range(4..16); - let blocks = rng.gen_range(8..128); + let subscribers = rng.random_range(4..16); + let blocks = rng.random_range(8..128); let events = subscribe(&mut tf.chainstate, subscribers); assert!(!tf.chainstate.subscribers().is_empty()); @@ -282,8 +282,8 @@ async fn several_subscribers_several_events_broadcaster(#[case] seed: Seed) { .build(); let mock_time = Arc::clone(tf.time_value.as_ref().unwrap()); - let subscribers_count = rng.gen_range(4..16); - let blocks_count = rng.gen_range(8..128); + let subscribers_count = rng.random_range(4..16); + let blocks_count = rng.random_range(8..128); let mut receivers: Vec<_> = (0..subscribers_count) .map(|_| tf.chainstate.subscribe_to_rpc_events()) @@ -302,23 +302,26 @@ async fn several_subscribers_several_events_broadcaster(#[case] seed: Seed) { events }); - let first_fresh_block_idx = rng.gen_range(0..blocks_count); + let first_fresh_block_idx = rng.random_range(0..blocks_count); let mut expected_events = Vec::new(); for idx in 0..blocks_count { let (time_advance, is_ibd) = match idx.cmp(&first_fresh_block_idx) { std::cmp::Ordering::Less => { // The block will not be considered fresh and the chainstate will remain in ibd. - (rng.gen_range(max_tip_age_secs..max_tip_age_secs * 2), true) + ( + rng.random_range(max_tip_age_secs..max_tip_age_secs * 2), + true, + ) } std::cmp::Ordering::Equal => { // The block will be considered fresh and the chainstate will no longer be in ibd. - (rng.gen_range(0..max_tip_age_secs), false) + (rng.random_range(0..max_tip_age_secs), false) } std::cmp::Ordering::Greater => { // The chainstate can't return to ibd once it switched to non-ibd, // so block time can be arbitrary here. - (rng.gen_range(0..max_tip_age_secs * 2), false) + (rng.random_range(0..max_tip_age_secs * 2), false) } }; diff --git a/chainstate/test-suite/src/tests/framework_tests.rs b/chainstate/test-suite/src/tests/framework_tests.rs index a140fc759a..5fbc18af0b 100644 --- a/chainstate/test-suite/src/tests/framework_tests.rs +++ b/chainstate/test-suite/src/tests/framework_tests.rs @@ -28,7 +28,7 @@ use common::{ }, primitives::Idable, }; -use randomness::{CryptoRng, Rng}; +use randomness::CryptoRng; use chainstate_test_framework::TestFramework; use chainstate_types::{BlockStatus, BlockValidationStage}; @@ -127,7 +127,7 @@ fn test_consistency_check_explicitly_enabled_for_testnet(#[case] seed: Seed) { } // Store a block index with the persistence flag set, but without storing the corresponding block. -fn make_chainstate_inconsistent(tf: &mut TestFramework, rng: &mut (impl Rng + CryptoRng)) { +fn make_chainstate_inconsistent(tf: &mut TestFramework, rng: &mut impl CryptoRng) { let genesis_id = tf.chain_config().genesis_block_id(); let block = build_block(tf, &genesis_id, rng); diff --git a/chainstate/test-suite/src/tests/fungible_tokens.rs b/chainstate/test-suite/src/tests/fungible_tokens.rs index c319982415..82e6277d05 100644 --- a/chainstate/test-suite/src/tests/fungible_tokens.rs +++ b/chainstate/test-suite/src/tests/fungible_tokens.rs @@ -35,7 +35,7 @@ use common::{ primitives::{id, Amount, BlockHeight, Id, Idable}, }; use crypto::hash::StreamHasher; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use serialization::extras::non_empty_vec::DataOrNoVec; use test_utils::{ random::{make_seedable_rng, Seed}, @@ -44,7 +44,7 @@ use test_utils::{ }; use tx_verifier::CheckTransactionError; -fn make_test_framework_with_v0(rng: &mut (impl Rng + CryptoRng)) -> TestFramework { +fn make_test_framework_with_v0(rng: &mut impl CryptoRng) -> TestFramework { TestFramework::builder(rng) .with_chain_config( common::chain::config::Builder::test_chain() @@ -77,8 +77,8 @@ fn token_issue_test(#[case] seed: Seed) { // Valid case let output_value = TokenIssuanceV0 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), - amount_to_issue: Amount::from_atoms(rng.gen_range(1..u128::MAX)), - number_of_decimals: rng.gen_range(1..18), + amount_to_issue: Amount::from_atoms(rng.random_range(1..u128::MAX)), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), }; let block_index = tf @@ -116,7 +116,7 @@ fn token_transfer_test(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = make_test_framework_with_v0(&mut rng); // To have possibility to send exceed tokens amount than we have, let's limit the max issuance tokens amount - let total_funds = Amount::from_atoms(rng.gen_range(1..u128::MAX - 1)); + let total_funds = Amount::from_atoms(rng.random_range(1..u128::MAX - 1)); let genesis_outpoint_id: OutPointSourceId = tf.genesis().get_id().into(); let token_issuance_fee = tf.chainstate.get_chain_config().fungible_token_issuance_fee(); @@ -125,7 +125,7 @@ fn token_transfer_test(#[case] seed: Seed) { let output_value = TokenIssuanceV0 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), amount_to_issue: total_funds, - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: "https://some_site.some".as_bytes().to_vec(), }; @@ -190,7 +190,7 @@ fn multiple_token_issuance_in_one_tx(#[case] seed: Seed) { utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); let mut tf = make_test_framework_with_v0(&mut rng); - let total_funds = Amount::from_atoms(rng.gen_range(1..u128::MAX)); + let total_funds = Amount::from_atoms(rng.random_range(1..u128::MAX)); let genesis_outpoint_id: OutPointSourceId = tf.genesis().get_id().into(); let token_issuance_fee = tf.chainstate.get_chain_config().fungible_token_issuance_fee(); @@ -199,7 +199,7 @@ fn multiple_token_issuance_in_one_tx(#[case] seed: Seed) { let issuance_value = TokenIssuanceV0 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), amount_to_issue: total_funds, - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), }; @@ -270,7 +270,7 @@ fn token_issuance_with_insufficient_fee(#[case] seed: Seed) { utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); let mut tf = make_test_framework_with_v0(&mut rng); - let total_funds = Amount::from_atoms(rng.gen_range(1..u128::MAX)); + let total_funds = Amount::from_atoms(rng.random_range(1..u128::MAX)); let token_issuance_fee = tf.chainstate.get_chain_config().fungible_token_issuance_fee(); let coins_value = @@ -283,7 +283,7 @@ fn token_issuance_with_insufficient_fee(#[case] seed: Seed) { let issuance_data = TokenIssuanceV0 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), amount_to_issue: total_funds, - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), }; let tx = TransactionBuilder::new() @@ -351,7 +351,7 @@ fn transfer_split_and_combine_tokens(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = make_test_framework_with_v0(&mut rng); // Due to transfer a piece of funds, let's limit the start range value - let total_funds = Amount::from_atoms(rng.gen_range(4..u128::MAX - 1)); + let total_funds = Amount::from_atoms(rng.random_range(4..u128::MAX - 1)); let quarter_funds = (total_funds / 4).unwrap(); let token_issuance_fee = tf.chainstate.get_chain_config().fungible_token_issuance_fee(); @@ -361,7 +361,7 @@ fn transfer_split_and_combine_tokens(#[case] seed: Seed) { let output_value = TokenIssuanceV0 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), amount_to_issue: total_funds, - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), }; let tx = TransactionBuilder::new() @@ -469,13 +469,13 @@ fn reorg_and_try_to_double_spend_tokens(#[case] seed: Seed) { utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); let mut tf = make_test_framework_with_v0(&mut rng); - let total_funds = Amount::from_atoms(rng.gen_range(1..u128::MAX)); + let total_funds = Amount::from_atoms(rng.random_range(1..u128::MAX)); // Issue a new token let genesis_outpoint_id = OutPointSourceId::BlockReward(tf.genesis().get_id().into()); let issuance_data = TokenIssuanceV0 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), amount_to_issue: total_funds, - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), } .into(); @@ -762,7 +762,7 @@ fn token_issuance_in_block_reward(#[case] seed: Seed) { utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); let mut tf = make_test_framework_with_v0(&mut rng); - let total_funds = Amount::from_atoms(rng.gen_range(1..u128::MAX)); + let total_funds = Amount::from_atoms(rng.random_range(1..u128::MAX)); let (_, pub_key) = crypto::key::PrivateKey::new_from_rng(&mut rng, crypto::key::KeyKind::Secp256k1Schnorr); @@ -771,7 +771,7 @@ fn token_issuance_in_block_reward(#[case] seed: Seed) { TokenIssuanceV0 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), amount_to_issue: total_funds, - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024) .as_bytes() .to_vec(), @@ -907,8 +907,8 @@ fn issue_and_transfer_in_the_same_block(#[case] seed: Seed) { .add_output(TxOutput::Transfer( TokenIssuanceV0 { token_ticker: "XXXX".as_bytes().to_vec(), - amount_to_issue: Amount::from_atoms(rng.gen_range(100_000..u128::MAX)), - number_of_decimals: rng.gen_range(1..18), + amount_to_issue: Amount::from_atoms(rng.random_range(100_000..u128::MAX)), + number_of_decimals: rng.random_range(1..18), metadata_uri: "http://uri".as_bytes().to_vec(), } .into(), @@ -934,7 +934,7 @@ fn issue_and_transfer_in_the_same_block(#[case] seed: Seed) { .add_output(TxOutput::Transfer( TokenData::TokenTransfer(TokenTransfer { token_id, - amount: Amount::from_atoms(rng.gen_range(1..100_000)), + amount: Amount::from_atoms(rng.random_range(1..100_000)), }) .into(), Destination::AnyoneCanSpend, diff --git a/chainstate/test-suite/src/tests/fungible_tokens_v1.rs b/chainstate/test-suite/src/tests/fungible_tokens_v1.rs index ed2d6e4fd9..105fe6b4c3 100644 --- a/chainstate/test-suite/src/tests/fungible_tokens_v1.rs +++ b/chainstate/test-suite/src/tests/fungible_tokens_v1.rs @@ -50,7 +50,7 @@ use common::{ primitives::{amount::SignedAmount, Amount, BlockHeight, CoinOrTokenId, Id, Idable}, }; use crypto::key::{KeyKind, PrivateKey}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use test_utils::{ assert_matches_return_val, gen_text_with_non_ascii, random::{make_seedable_rng, Seed}, @@ -67,7 +67,7 @@ use crate::tests::helpers::token_checks::{ }; fn unmint_tokens_in_block( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, parent_block_id: Id, token_id: TokenId, @@ -150,7 +150,7 @@ fn unmint_tokens_in_block( fn token_issue_test(#[case] seed: Seed) { utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); - let mut rng2 = make_seedable_rng(rng.gen::()); + let mut rng2 = make_seedable_rng(rng.random::()); let mut tf = TestFramework::builder(&mut rng).build(); let genesis_source_id: OutPointSourceId = tf.genesis().get_id().into(); @@ -181,7 +181,7 @@ fn token_issue_test(#[case] seed: Seed) { ) .as_bytes() .to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::AnyoneCanSpend, @@ -205,7 +205,7 @@ fn token_issue_test(#[case] seed: Seed) { // Ticker doesn't exist let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: b"".to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::AnyoneCanSpend, @@ -239,7 +239,7 @@ fn token_issue_test(#[case] seed: Seed) { // Ticker contain non alpha-numeric char let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker, - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024) .as_bytes() .to_vec(), @@ -301,7 +301,7 @@ fn token_issue_test(#[case] seed: Seed) { let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, uri_len_range_to_use) .as_bytes() .to_vec(), @@ -328,7 +328,7 @@ fn token_issue_test(#[case] seed: Seed) { // URI contain non alpha-numeric char let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: "https://💖🚁🌭.🦠🚀🚖🚧".as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::AnyoneCanSpend, @@ -401,7 +401,7 @@ fn issue_twice_in_same_tx(#[case] seed: Seed) { let issuance1 = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::AnyoneCanSpend, @@ -409,7 +409,7 @@ fn issue_twice_in_same_tx(#[case] seed: Seed) { }); let issuance2 = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::AnyoneCanSpend, @@ -578,7 +578,7 @@ fn mint_unmint_fixed_supply(#[case] seed: Seed) { let token_supply_change_fee = tf.chainstate.get_chain_config().token_supply_change_fee(BlockHeight::zero()); - let total_supply = Amount::from_atoms(rng.gen_range(2..100_000_000)); + let total_supply = Amount::from_atoms(rng.random_range(2..100_000_000)); let (token_id, issuance_block_id, issuance_tx, issuance, utxo_with_change) = issue_token_from_genesis( &mut rng, @@ -587,10 +587,10 @@ fn mint_unmint_fixed_supply(#[case] seed: Seed) { IsTokenFreezable::No, ); - let amount_to_mint = Amount::from_atoms(rng.gen_range(1..total_supply.into_atoms())); + let amount_to_mint = Amount::from_atoms(rng.random_range(1..total_supply.into_atoms())); let amount_to_mint_over_limit = (total_supply + Amount::from_atoms(1)).unwrap(); - let amount_to_unmint = Amount::from_atoms(rng.gen_range(1..amount_to_mint.into_atoms())); + let amount_to_unmint = Amount::from_atoms(rng.random_range(1..amount_to_mint.into_atoms())); let amount_to_unmint_over_limit = (amount_to_mint + Amount::from_atoms(1)).unwrap(); // Mint over the limit @@ -767,7 +767,7 @@ fn mint_twice_in_same_tx(#[case] seed: Seed) { IsTokenFreezable::No, ); - let amount_to_mint = Amount::from_atoms(rng.gen_range(1..100_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(1..100_000)); // Mint tokens let tx = TransactionBuilder::new() @@ -829,7 +829,7 @@ fn try_unmint_twice_in_same_tx(#[case] seed: Seed) { IsTokenFreezable::No, ); - let amount_to_mint = Amount::from_atoms(rng.gen_range(1..100_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(1..100_000)); let best_block_id = tf.best_block_id(); let (_, mint_tx_id) = mint_tokens_in_block( &mut rng, @@ -903,7 +903,7 @@ fn try_unmint_twice_in_same_tx(#[case] seed: Seed) { fn unmint_two_tokens_in_same_tx(#[case] seed: Seed) { utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); - let mut rng2 = make_seedable_rng(rng.gen::()); + let mut rng2 = make_seedable_rng(rng.random::()); let mut tf = TestFramework::builder(&mut rng).build(); let (token1_id, issuance1_block_id, issuance1_tx, issuance1, utxo_with_change) = @@ -926,7 +926,7 @@ fn unmint_two_tokens_in_same_tx(#[case] seed: Seed) { issuance2.clone(), ); - let amount_to_mint = Amount::from_atoms(rng.gen_range(1..100_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(1..100_000)); let best_block_id = tf.best_block_id(); let (_, mint_tx_1_id) = mint_tokens_in_block( &mut rng, @@ -1046,7 +1046,7 @@ fn mint_unmint_fixed_supply_repeatedly(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let total_supply = Amount::from_atoms(rng.gen_range(2..100_000_000)); + let total_supply = Amount::from_atoms(rng.random_range(2..100_000_000)); let (token_id, issuance_block_id, issuance_tx, issuance, utxo_with_change) = issue_token_from_genesis( &mut rng, @@ -1156,7 +1156,8 @@ fn mint_unmint_fixed_supply_repeatedly(#[case] seed: Seed) { // Unmint n tokens // Note: -1 because 1 was unminted previously - let amount_to_unmint = Amount::from_atoms(rng.gen_range(1..total_supply.into_atoms() - 1)); + let amount_to_unmint = + Amount::from_atoms(rng.random_range(1..total_supply.into_atoms() - 1)); let best_block_id = tf.best_block_id(); let (_, unmint_n_tokens_tx_id) = unmint_tokens_in_block( &mut rng, @@ -1262,7 +1263,7 @@ fn mint_unlimited_supply(#[case] seed: Seed) { let token_supply_change_fee = tf.chainstate.get_chain_config().token_supply_change_fee(BlockHeight::zero()); - let amount_to_mint = Amount::from_atoms(rng.gen_range(1..=i128::MAX as u128)); + let amount_to_mint = Amount::from_atoms(rng.random_range(1..=i128::MAX as u128)); let (token_id, issuance_block_id, issuance_tx, issuance, utxo_with_change) = issue_token_from_genesis( &mut rng, @@ -1460,7 +1461,7 @@ fn mint_unlimited_supply_max(#[case] seed: Seed) { { // Try minting a random number of atoms - let amount = Amount::from_atoms(rng.gen_range(1..=i128::MAX as u128)); + let amount = Amount::from_atoms(rng.random_range(1..=i128::MAX as u128)); let mint_tx = make_mint_tx(amount); let mint_tx_id = mint_tx.transaction().get_id(); let result = @@ -1484,7 +1485,7 @@ fn mint_unlimited_supply_max(#[case] seed: Seed) { { // For completeness, try minting a random number of atoms bigger than i128::MAX. // A different error will be generated. - let amount = Amount::from_atoms(rng.gen_range((i128::MAX as u128) + 1..=u128::MAX)); + let amount = Amount::from_atoms(rng.random_range((i128::MAX as u128) + 1..=u128::MAX)); let mint_tx = make_mint_tx(amount); let mint_tx_id = mint_tx.transaction().get_id(); let result = @@ -1523,10 +1524,10 @@ fn mint_pseudo_unlimited_supply_max(#[case] seed: Seed) { tf.chainstate.get_chain_config().token_supply_change_fee(BlockHeight::zero()); let max_amount_to_mint = Amount::from_atoms(i128::MAX as u128); - let total_supply_atoms = if rng.gen_bool(0.5) { + let total_supply_atoms = if rng.random_bool(0.5) { u128::MAX } else { - rng.gen_range((i128::MAX as u128) + 1..u128::MAX) + rng.random_range((i128::MAX as u128) + 1..u128::MAX) }; let total_supply_atoms_above_i128_max = total_supply_atoms - i128::MAX as u128; assert!(total_supply_atoms_above_i128_max > 0); @@ -1626,7 +1627,8 @@ fn mint_pseudo_unlimited_supply_max(#[case] seed: Seed) { { // Try minting a random number of atoms, so that the total is below the specified max supply. - let amount = Amount::from_atoms(rng.gen_range(1..=total_supply_atoms_above_i128_max)); + let amount = + Amount::from_atoms(rng.random_range(1..=total_supply_atoms_above_i128_max)); let mint_tx = make_mint_tx(amount); let mint_tx_id = mint_tx.transaction().get_id(); let result = @@ -1659,7 +1661,7 @@ fn mint_pseudo_unlimited_supply_max(#[case] seed: Seed) { let amount = Amount::from_atoms( total_supply_atoms_above_i128_max - + rng.gen_range(1..=max_extra_amount_to_fit_into_u128), + + rng.random_range(1..=max_extra_amount_to_fit_into_u128), ); let mint_tx = make_mint_tx(amount); let mint_tx_id = mint_tx.transaction().get_id(); @@ -1686,7 +1688,7 @@ fn mint_pseudo_unlimited_supply_max(#[case] seed: Seed) { { // The total amount doesn't fit into u128. - let amount = Amount::from_atoms(rng.gen_range( + let amount = Amount::from_atoms(rng.random_range( total_supply_atoms_above_i128_max + max_extra_amount_to_fit_into_u128 + 1 ..=u128::MAX, )); @@ -1724,7 +1726,7 @@ fn mint_from_wrong_account(#[case] seed: Seed) { let mut tf = TestFramework::builder(&mut rng).build(); let amount_to_mint = - Amount::from_atoms(rng.gen_range(2..SignedAmount::MAX.into_atoms() as u128)); + Amount::from_atoms(rng.random_range(2..SignedAmount::MAX.into_atoms() as u128)); let (token_id, _, _, _, utxo_with_change) = issue_token_from_genesis( &mut rng, &mut tf, @@ -1795,7 +1797,7 @@ fn try_to_print_money_on_mint(#[case] seed: Seed) { let mut tf = TestFramework::builder(&mut rng).build(); let amount_to_mint = - Amount::from_atoms(rng.gen_range(2..SignedAmount::MAX.into_atoms() as u128)); + Amount::from_atoms(rng.random_range(2..SignedAmount::MAX.into_atoms() as u128)); let (token_id, _, _, _, utxo_with_change) = issue_token_from_genesis( &mut rng, &mut tf, @@ -1876,8 +1878,8 @@ fn burn_from_total_supply_account(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let amount_to_mint = Amount::from_atoms(rng.gen_range(2..1_000_000)); - let amount_to_unmint = Amount::from_atoms(rng.gen_range(1..amount_to_mint.into_atoms())); + let amount_to_mint = Amount::from_atoms(rng.random_range(2..1_000_000)); + let amount_to_unmint = Amount::from_atoms(rng.random_range(1..amount_to_mint.into_atoms())); let (token_id, issuance_block_id, issuance_tx, issuance, utxo_with_change) = issue_token_from_genesis( @@ -1957,8 +1959,8 @@ fn burn_from_lock_supply_account(#[case] seed: Seed) { let mut tf = TestFramework::builder(&mut rng).build(); let amount_to_mint = - Amount::from_atoms(rng.gen_range(2..SignedAmount::MAX.into_atoms() as u128)); - let amount_to_unmint = Amount::from_atoms(rng.gen_range(1..amount_to_mint.into_atoms())); + Amount::from_atoms(rng.random_range(2..SignedAmount::MAX.into_atoms() as u128)); + let amount_to_unmint = Amount::from_atoms(rng.random_range(1..amount_to_mint.into_atoms())); let (token_id, issuance_block_id, issuance_tx, issuance, utxo_with_change) = issue_token_from_genesis( @@ -2036,7 +2038,7 @@ fn burn_zero_tokens_on_unmint(#[case] seed: Seed) { let mut tf = TestFramework::builder(&mut rng).build(); let amount_to_mint = - Amount::from_atoms(rng.gen_range(2..SignedAmount::MAX.into_atoms() as u128)); + Amount::from_atoms(rng.random_range(2..SignedAmount::MAX.into_atoms() as u128)); let (token_id, issuance_block_id, issuance_tx, issuance, utxo_with_change) = issue_token_from_genesis( @@ -2115,8 +2117,8 @@ fn burn_less_than_input_on_unmint(#[case] seed: Seed) { let mut tf = TestFramework::builder(&mut rng).build(); let amount_to_mint = - Amount::from_atoms(rng.gen_range(2..SignedAmount::MAX.into_atoms() as u128)); - let amount_to_burn = Amount::from_atoms(rng.gen_range(1..amount_to_mint.into_atoms())); + Amount::from_atoms(rng.random_range(2..SignedAmount::MAX.into_atoms() as u128)); + let amount_to_burn = Amount::from_atoms(rng.random_range(1..amount_to_mint.into_atoms())); let (token_id, issuance_block_id, issuance_tx, issuance, utxo_with_change) = issue_token_from_genesis( @@ -2198,8 +2200,8 @@ fn burn_less_by_providing_smaller_input_utxo(#[case] seed: Seed) { let mut tf = TestFramework::builder(&mut rng).build(); let amount_to_mint = - Amount::from_atoms(rng.gen_range(2..SignedAmount::MAX.into_atoms() as u128)); - let amount_to_unmint = Amount::from_atoms(rng.gen_range(1..amount_to_mint.into_atoms())); + Amount::from_atoms(rng.random_range(2..SignedAmount::MAX.into_atoms() as u128)); + let amount_to_unmint = Amount::from_atoms(rng.random_range(1..amount_to_mint.into_atoms())); let (token_id, _, _, _, utxo_with_change) = issue_token_from_genesis( &mut rng, @@ -2298,8 +2300,8 @@ fn unmint_using_multiple_burn_utxos(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let amount_to_mint = Amount::from_atoms(rng.gen_range(2..100_000)); - let amount_to_unmint = Amount::from_atoms(rng.gen_range(1..amount_to_mint.into_atoms())); + let amount_to_mint = Amount::from_atoms(rng.random_range(2..100_000)); + let amount_to_unmint = Amount::from_atoms(rng.random_range(1..amount_to_mint.into_atoms())); let (token_id, issuance_block_id, issuance_tx, issuance, utxo_with_change) = issue_token_from_genesis( @@ -2421,8 +2423,8 @@ fn check_lockable_supply(#[case] seed: Seed) { IsTokenFreezable::No, ); - let amount_to_mint = Amount::from_atoms(rng.gen_range(2..100_000_000)); - let amount_to_unmint = Amount::from_atoms(rng.gen_range(1..amount_to_mint.into_atoms())); + let amount_to_mint = Amount::from_atoms(rng.random_range(2..100_000_000)); + let amount_to_unmint = Amount::from_atoms(rng.random_range(1..amount_to_mint.into_atoms())); // Mint some tokens let mint_tx = TransactionBuilder::new() @@ -2759,7 +2761,7 @@ fn try_lock_twice_in_same_tx(#[case] seed: Seed) { fn lock_two_tokens_in_same_tx(#[case] seed: Seed) { utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); - let mut rng2 = make_seedable_rng(rng.gen::()); + let mut rng2 = make_seedable_rng(rng.random::()); let mut tf = TestFramework::builder(&mut rng).build(); let (token_id_1, _, _, _, utxo_with_change) = issue_token_from_genesis( @@ -2826,7 +2828,7 @@ fn mint_fee(#[case] seed: Seed) { let token_supply_change_fee = tf.chainstate.get_chain_config().token_supply_change_fee(BlockHeight::zero()); - let some_amount = Amount::from_atoms(rng.gen_range(100..100_000)); + let some_amount = Amount::from_atoms(rng.random_range(100..100_000)); let (token_id, _, _, _, utxo_with_change) = issue_token_from_genesis( &mut rng, &mut tf, @@ -2921,7 +2923,7 @@ fn unmint_fee(#[case] seed: Seed) { let token_supply_change_fee = tf.chainstate.get_chain_config().token_supply_change_fee(BlockHeight::zero()); - let some_amount = Amount::from_atoms(rng.gen_range(100..100_000)); + let some_amount = Amount::from_atoms(rng.random_range(100..100_000)); let (token_id, _, _, _, utxo_with_change) = issue_token_from_genesis( &mut rng, &mut tf, @@ -3118,7 +3120,7 @@ fn spend_mint_tokens_output(#[case] seed: Seed) { IsTokenFreezable::No, ); - let amount_to_mint = Amount::from_atoms(rng.gen_range(2..100_000_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(2..100_000_000)); let amount_to_overspend = (amount_to_mint + Amount::from_atoms(1)).unwrap(); // Mint some tokens @@ -3216,7 +3218,7 @@ fn issue_and_mint_same_tx(#[case] seed: Seed) { let mut tf = TestFramework::builder(&mut rng).build(); let genesis_source_id: OutPointSourceId = tf.genesis().get_id().into(); - let amount_to_mint = Amount::from_atoms(rng.gen_range(1..100_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(1..100_000)); let first_tx_input = TxInput::from_utxo(genesis_source_id.clone(), 0); let token_id = make_token_id( tf.chain_config().as_ref(), @@ -3274,7 +3276,7 @@ fn issue_and_mint_same_block(#[case] seed: Seed) { let token_supply_change_fee = tf.chainstate.get_chain_config().token_supply_change_fee(BlockHeight::zero()); - let amount_to_mint = Amount::from_atoms(rng.gen_range(1..100_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(1..100_000)); let tx_issuance_inputs = vec![TxInput::from_utxo(genesis_source_id, 0)]; let token_id = make_token_id( @@ -3353,8 +3355,8 @@ fn mint_unmint_same_tx(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut tf = TestFramework::builder(&mut rng).build(); - let amount_to_mint = Amount::from_atoms(rng.gen_range(1000..100_000)); - let amount_to_unmint = Amount::from_atoms(rng.gen_range(1..amount_to_mint.into_atoms())); + let amount_to_mint = Amount::from_atoms(rng.random_range(1000..100_000)); + let amount_to_unmint = Amount::from_atoms(rng.random_range(1..amount_to_mint.into_atoms())); let (token_id, _, _, _, utxo_with_change) = issue_token_from_genesis( &mut rng, @@ -3445,7 +3447,7 @@ fn reorg_test_simple(#[case] seed: Seed) { assert_eq!(tf.best_block_id(), block_a_id); // Create block `b` with token minting - let amount_to_mint = Amount::from_atoms(rng.gen_range(2..100_000_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(2..100_000_000)); let (block_b_id, _) = mint_tokens_in_block( &mut rng, &mut tf, @@ -3497,12 +3499,12 @@ fn reorg_test_simple(#[case] seed: Seed) { fn reorg_test_2_tokens(#[case] seed: Seed) { utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); - let mut rng2 = make_seedable_rng(rng.gen::()); + let mut rng2 = make_seedable_rng(rng.random::()); let mut tf = TestFramework::builder(&mut rng).build(); let genesis_block_id = tf.best_block_id(); - let amount_to_mint_1 = Amount::from_atoms(rng.gen_range(2..100_000_000)); - let amount_to_mint_2 = Amount::from_atoms(rng.gen_range(2..100_000_000)); + let amount_to_mint_1 = Amount::from_atoms(rng.random_range(2..100_000_000)); + let amount_to_mint_2 = Amount::from_atoms(rng.random_range(2..100_000_000)); let token_supply_change_fee = tf.chainstate.get_chain_config().token_supply_change_fee(BlockHeight::zero()); @@ -3621,7 +3623,7 @@ fn check_signature_on_mint(#[case] seed: Seed) { let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::PublicKey(controller_pk.clone()), @@ -3636,7 +3638,7 @@ fn check_signature_on_mint(#[case] seed: Seed) { issuance, ); - let amount_to_mint = Amount::from_atoms(rng.gen_range(2..100_000_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(2..100_000_000)); // Try to mint without signature let tx_no_signatures = TransactionBuilder::new() @@ -3758,7 +3760,7 @@ fn check_signature_on_unmint(#[case] seed: Seed) { let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::PublicKey(controller_pk.clone()), @@ -3774,7 +3776,7 @@ fn check_signature_on_unmint(#[case] seed: Seed) { ); // Mint some tokens - let amount_to_mint = Amount::from_atoms(rng.gen_range(2..100_000_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(2..100_000_000)); let mint_tx = { let input_commitments = vec![ SighashInputCommitment::None, @@ -3968,7 +3970,7 @@ fn check_signature_on_lock_supply(#[case] seed: Seed) { let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Lockable, authority: Destination::PublicKey(controller_pk.clone()), @@ -4095,7 +4097,7 @@ fn mint_with_timelock(#[case] seed: Seed) { tf.chainstate.get_chain_config().token_supply_change_fee(BlockHeight::zero()); let amount_to_mint = - Amount::from_atoms(rng.gen_range(2..SignedAmount::MAX.into_atoms() as u128)); + Amount::from_atoms(rng.random_range(2..SignedAmount::MAX.into_atoms() as u128)); let (token_id, issuance_block_id, issuance_tx, issuance, utxo_with_change) = issue_token_from_genesis( &mut rng, @@ -4231,7 +4233,7 @@ fn only_ascii_alphanumeric_after_v1(#[case] seed: Seed) { let token_ticker = gen_text_with_non_ascii(c, &mut rng, max_ticker_len); let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker, - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::AnyoneCanSpend, @@ -4268,7 +4270,7 @@ fn only_ascii_alphanumeric_after_v1(#[case] seed: Seed) { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..max_ticker_len) .as_bytes() .to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::AnyoneCanSpend, @@ -4337,7 +4339,7 @@ fn token_issue_mint_and_data_deposit_not_enough_fee(#[case] seed: Seed) { .build_and_process(&mut rng) .unwrap(); - let amount_to_mint = Amount::from_atoms(rng.gen_range(2..100_000_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(2..100_000_000)); let issuance = make_token_issuance(&mut rng, TokenTotalSupply::Unlimited, IsTokenFreezable::No); @@ -4414,7 +4416,7 @@ fn check_freezable_supply(#[case] seed: Seed) { ); // Mint some tokens - let amount_to_mint = Amount::from_atoms(rng.gen_range(1..100_000_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(1..100_000_000)); let best_block_id = tf.best_block_id(); let (_, mint_tx_id) = mint_tokens_in_block( &mut rng, @@ -4812,7 +4814,7 @@ fn fill_freeze_conclude_order_with_frozen_token( ); // Mint some tokens - let amount_to_mint = Amount::from_atoms(rng.gen_range(100..1000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(100..1000)); let best_block_id = tf.best_block_id(); let (_, mint_tx_id) = mint_tokens_in_block( &mut rng, @@ -4869,7 +4871,7 @@ fn fill_freeze_conclude_order_with_frozen_token( // Create the orders let order1_token_give_amount = (amount_to_mint / 2).unwrap(); - let order1_coin_ask_amount = Amount::from_atoms(rng.gen_range(100..1000)); + let order1_coin_ask_amount = Amount::from_atoms(rng.random_range(100..1000)); let token_remaining_amount = (amount_to_mint - order1_token_give_amount).unwrap(); let order1_data = OrderData::new( @@ -4898,7 +4900,7 @@ fn fill_freeze_conclude_order_with_frozen_token( let utxo_with_tokens_change = UtxoOutPoint::new(order1_creation_tx_id.into(), 1); let order2_token_ask_amount = token_remaining_amount; - let order2_coin_give_amount = Amount::from_atoms(rng.gen_range(100..1000)); + let order2_coin_give_amount = Amount::from_atoms(rng.random_range(100..1000)); let order2_data = OrderData::new( Destination::AnyoneCanSpend, @@ -5172,7 +5174,7 @@ fn check_freeze_unfreeze_takes_effect_after_submit(#[case] seed: Seed) { ); // Mint some tokens - let amount_to_mint = Amount::from_atoms(rng.gen_range(1..100_000_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(1..100_000_000)); let best_block_id = tf.best_block_id(); let (_, mint_tx_id) = mint_tokens_in_block( &mut rng, @@ -5548,8 +5550,8 @@ fn token_unfreeze_fee(#[case] seed: Seed) { fn check_signature_on_freeze_unfreeze(#[case] seed: Seed) { utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); - let mut rng2 = make_seedable_rng(rng.gen::()); - let mut rng3 = make_seedable_rng(rng.gen::()); + let mut rng2 = make_seedable_rng(rng.random::()); + let mut rng3 = make_seedable_rng(rng.random::()); let mut tf = TestFramework::builder(&mut rng).build(); let token_freeze_fee = tf.chainstate.get_chain_config().token_freeze_fee(BlockHeight::zero()); @@ -5560,7 +5562,7 @@ fn check_signature_on_freeze_unfreeze(#[case] seed: Seed) { let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::PublicKey(controller_pk.clone()), @@ -5759,7 +5761,7 @@ fn check_signature_on_change_authority(#[case] seed: Seed) { let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Lockable, authority: Destination::PublicKey(original_pk.clone()), @@ -6850,7 +6852,7 @@ fn reorg_metadata_uri_change(#[case] seed: Seed) { assert_eq!(tf.best_block_id(), block_a_id); // Create block `b` with token minting - let amount_to_mint = Amount::from_atoms(rng.gen_range(2..100_000_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(2..100_000_000)); let (block_b_id, mint_tokens_tx_id) = mint_tokens_in_block( &mut rng, &mut tf, @@ -7083,7 +7085,7 @@ fn only_authority_can_change_metadata_uri(#[case] seed: Seed) { let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Lockable, authority: Destination::PublicKey(original_pk.clone()), diff --git a/chainstate/test-suite/src/tests/get_stake_pool_balances_at_heights.rs b/chainstate/test-suite/src/tests/get_stake_pool_balances_at_heights.rs index 865ffba3b4..491106b357 100644 --- a/chainstate/test-suite/src/tests/get_stake_pool_balances_at_heights.rs +++ b/chainstate/test-suite/src/tests/get_stake_pool_balances_at_heights.rs @@ -38,7 +38,7 @@ use crypto::{ }; use logging::log; use pos_accounting::PoSAccountingStorageRead; -use randomness::{seq::IteratorRandom, CryptoRng, Rng}; +use randomness::{seq::IteratorRandom, CryptoRng, Rng, RngExt as _}; use test_utils::random::{make_seedable_rng, Seed}; #[rstest] @@ -163,13 +163,13 @@ fn randomized_test(#[case] seed: Seed) { // anything explicitly. for _ in 0..100 { let mut did_something = false; - match rng.gen_range(0..5) { + match rng.random_range(0..5) { 0 => { let _ = test_data.make_new_pool(&mut tf, &mut rng); did_something = true; } 1 => { - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { if let Some(pool_id) = test_data.random_pool_id(&mut rng) { test_data.decommission_pool(&mut tf, &mut rng, &pool_id); did_something = true; @@ -177,7 +177,7 @@ fn randomized_test(#[case] seed: Seed) { } } 2 => { - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { if let Some(pool_id) = test_data.random_pool_id(&mut rng) { let _ = test_data.create_delegation(&mut tf, &mut rng, &pool_id); did_something = true; @@ -185,7 +185,7 @@ fn randomized_test(#[case] seed: Seed) { } } 3 => { - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { if let Some((pool_id, delegation_id)) = test_data.random_pool_and_delegation_id(&mut rng) { @@ -200,7 +200,7 @@ fn randomized_test(#[case] seed: Seed) { } } _ => { - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { if let Some((pool_id, delegation_id)) = test_data.random_pool_and_delegation_id(&mut rng) { @@ -216,7 +216,7 @@ fn randomized_test(#[case] seed: Seed) { } } - if !did_something && rng.gen_bool(0.5) { + if !did_something && rng.random_bool(0.5) { if let Some(pool_id) = test_data.random_pool_id(&mut rng) { test_data.produce_trivial_block_with_pool(&mut tf, &mut rng, &pool_id); did_something = true; @@ -230,7 +230,7 @@ fn randomized_test(#[case] seed: Seed) { }); } -fn make_test_framework(rng: &mut (impl Rng + CryptoRng)) -> TestFramework { +fn make_test_framework(rng: &mut impl CryptoRng) -> TestFramework { let (staking_sk, staking_pk) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); let (vrf_sk, vrf_pk) = VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel); @@ -400,13 +400,14 @@ impl TestData { fn make_new_pool( &mut self, tf: &mut TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> (PoolId, Amount) { let (vrf_sk, vrf_pk) = VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let pledge = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let pledge = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, staker_key) = create_stake_pool_data_with_all_reward_to_staker(rng, pledge, vrf_pk); let pool_id = PoolId::from_utxo(self.utxo_for_spending.outpoint()); @@ -450,7 +451,7 @@ impl TestData { fn decommission_pool( &mut self, tf: &mut TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, pool_id: &PoolId, ) { let info = self.pools.remove(pool_id).unwrap(); @@ -492,13 +493,14 @@ impl TestData { fn create_delegation( &mut self, tf: &mut TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, pool_id: &PoolId, ) -> (DelegationId, Amount) { let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_delegate = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge / 2..min_stake_pool_pledge * 2)); + let amount_to_delegate = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge / 2..min_stake_pool_pledge * 2), + ); let tx1_builder = TransactionBuilder::new() .add_output(TxOutput::CreateDelegationId( @@ -553,11 +555,11 @@ impl TestData { fn withdraw_from_delegation( &mut self, tf: &mut TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, pool_id: &PoolId, delegation_id: &DelegationId, ) -> Amount { - let amount_to_withdraw = Amount::from_atoms(rng.gen_range(1000..10_000)); + let amount_to_withdraw = Amount::from_atoms(rng.random_range(1000..10_000)); let nonce = self.next_nonce(delegation_id); @@ -601,11 +603,11 @@ impl TestData { fn add_to_delegation( &mut self, tf: &mut TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, pool_id: &PoolId, delegation_id: &DelegationId, ) -> Amount { - let amount_to_add = Amount::from_atoms(rng.gen_range(1000..10_000)); + let amount_to_add = Amount::from_atoms(rng.random_range(1000..10_000)); let tx_builder = TransactionBuilder::new() .add_output(TxOutput::DelegateStaking(amount_to_add, *delegation_id)); @@ -641,7 +643,7 @@ impl TestData { fn produce_trivial_block_with_pool( &mut self, tf: &mut TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, pool_id: &PoolId, ) { make_block_builder_with_pool(tf, pool_id).build_and_process(rng).unwrap(); diff --git a/chainstate/test-suite/src/tests/helpers/block_creation_helpers.rs b/chainstate/test-suite/src/tests/helpers/block_creation_helpers.rs index fcade04805..0a6c86f670 100644 --- a/chainstate/test-suite/src/tests/helpers/block_creation_helpers.rs +++ b/chainstate/test-suite/src/tests/helpers/block_creation_helpers.rs @@ -24,13 +24,13 @@ use common::{ }, primitives::{Amount, Id, Idable}, }; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; // Build a block that spends some outputs of its parent. pub fn build_block( tf: &mut TestFramework, parent_block: &Id, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> Block { tf.make_block_builder() .add_test_transaction_with_parent(*parent_block, rng) @@ -55,7 +55,7 @@ pub fn make_some_block_reward() -> Vec { pub fn process_block( tf: &mut TestFramework, parent_block: &Id, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> (Id, Result, ChainstateError>) { let block = build_block(tf, parent_block, rng); let block_id = block.get_id(); @@ -65,7 +65,7 @@ pub fn process_block( // Build a block with an invalid tx that has no inputs and outputs. pub fn build_block_with_empty_tx( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, parent_block: &Id, ) -> Block { @@ -78,7 +78,7 @@ pub fn build_block_with_empty_tx( // Process a block with an invalid tx that has no inputs and outputs. pub fn process_block_with_empty_tx( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, parent_block: &Id, ) -> (Id, Result, ChainstateError>) { @@ -93,7 +93,7 @@ pub fn build_block_burn_or_spend_parent_reward( tf: &mut TestFramework, parent_block: &Id, burn: bool, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> (Block, SignedTransaction) { let tx = TransactionBuilder::new() .add_input( @@ -119,7 +119,7 @@ pub fn build_block_burn_or_spend_parent_reward( pub fn build_block_burn_parent_reward( tf: &mut TestFramework, parent_block: &Id, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> (Block, SignedTransaction) { build_block_burn_or_spend_parent_reward(tf, parent_block, true, rng) } @@ -127,7 +127,7 @@ pub fn build_block_burn_parent_reward( pub fn build_block_spend_parent_reward( tf: &mut TestFramework, parent_block: &Id, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> (Block, SignedTransaction) { build_block_burn_or_spend_parent_reward(tf, parent_block, false, rng) } @@ -136,7 +136,7 @@ pub fn process_block_burn_or_spend_parent_reward( tf: &mut TestFramework, parent_block: &Id, burn: bool, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> (Id, Result, ChainstateError>) { let (block, _) = build_block_burn_or_spend_parent_reward(tf, parent_block, burn, rng); let block_id = block.get_id(); @@ -147,7 +147,7 @@ pub fn process_block_burn_or_spend_parent_reward( pub fn process_block_spend_parent_reward( tf: &mut TestFramework, parent_block: &Id, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> (Id, Result, ChainstateError>) { process_block_burn_or_spend_parent_reward(tf, parent_block, false, rng) } @@ -157,7 +157,7 @@ pub fn process_block_spend_parent_reward( pub fn build_block_split_parent_reward( tf: &mut TestFramework, parent_block: &Id, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> (Block, SignedTransaction) { let tx = TransactionBuilder::new() .add_input( @@ -183,7 +183,7 @@ pub fn build_block_split_parent_reward( pub fn process_block_split_parent_reward( tf: &mut TestFramework, parent_block: &Id, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> ( Id, Id, @@ -201,7 +201,7 @@ pub fn build_block_spend_tx( parent_block: &Id, parent_tx: &Id, tx_output_index: u32, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> Block { let tx = TransactionBuilder::new() .add_input( @@ -227,7 +227,7 @@ pub fn process_block_spend_tx( parent_block: &Id, parent_tx: &Id, tx_output_index: u32, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> (Id, Result, ChainstateError>) { let block = build_block_spend_tx(tf, parent_block, parent_tx, tx_output_index, rng); let block_id = block.get_id(); @@ -252,10 +252,10 @@ pub fn coins(amount: u32) -> OutputValue { OutputValue::Coin(Amount::from_atoms(amount.into())) } -pub fn some_coins(rng: &mut (impl Rng + CryptoRng)) -> OutputValue { - coins(rng.gen_range(100_000..200_000)) +pub fn some_coins(rng: &mut impl CryptoRng) -> OutputValue { + coins(rng.random_range(100_000..200_000)) } -pub fn less_coins(rng: &mut (impl Rng + CryptoRng)) -> OutputValue { - coins(rng.gen_range(50_000..100_000)) +pub fn less_coins(rng: &mut impl CryptoRng) -> OutputValue { + coins(rng.random_range(50_000..100_000)) } diff --git a/chainstate/test-suite/src/tests/helpers/mod.rs b/chainstate/test-suite/src/tests/helpers/mod.rs index b8a980925e..7fd3226c56 100644 --- a/chainstate/test-suite/src/tests/helpers/mod.rs +++ b/chainstate/test-suite/src/tests/helpers/mod.rs @@ -29,7 +29,7 @@ use common::{ primitives::{Amount, BlockDistance, Id, Idable}, }; use crypto::key::{KeyKind, PrivateKey}; -use randomness::{CryptoRng, Rng}; +use randomness::CryptoRng; pub mod block_creation_helpers; pub mod block_status_helpers; @@ -39,7 +39,7 @@ pub mod token_checks; /// Adds a block with the locked output and returns input corresponding to this output. pub fn add_block_with_locked_output( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, output_time_lock: OutputTimeLock, timestamp: BlockTimestamp, @@ -79,7 +79,7 @@ pub fn add_block_with_locked_output( ) } -pub fn new_pub_key_destination(rng: &mut (impl Rng + CryptoRng)) -> Destination { +pub fn new_pub_key_destination(rng: &mut impl CryptoRng) -> Destination { let (_, pub_key) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); Destination::PublicKey(pub_key) } diff --git a/chainstate/test-suite/src/tests/helpers/token_checks.rs b/chainstate/test-suite/src/tests/helpers/token_checks.rs index c7dd1a5b27..4dd0f97475 100644 --- a/chainstate/test-suite/src/tests/helpers/token_checks.rs +++ b/chainstate/test-suite/src/tests/helpers/token_checks.rs @@ -30,7 +30,7 @@ use common::{ }, primitives::{Amount, Id, Idable}, }; -use randomness::{CryptoRng, Rng}; +use randomness::CryptoRng; use test_utils::assert_matches_return_val; use tokens_accounting::{FungibleTokenData, TokensAccountingStorageRead}; @@ -65,7 +65,7 @@ pub fn make_expected_rpc_token_info_from_token_issuance( pub fn check_fungible_token( tf: &TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, token_id: &TokenId, expected_data: &ExpectedFungibleTokenData, no_other_tokens_present: bool, @@ -234,7 +234,7 @@ pub fn make_expected_rpc_token_info_from_nft_metadata( pub fn check_nft( tf: &TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, token_id: &TokenId, expected_data: &ExpectedNftData, ) { diff --git a/chainstate/test-suite/src/tests/homomorphism.rs b/chainstate/test-suite/src/tests/homomorphism.rs index 7138632d3e..02b4d4eba8 100644 --- a/chainstate/test-suite/src/tests/homomorphism.rs +++ b/chainstate/test-suite/src/tests/homomorphism.rs @@ -66,7 +66,7 @@ fn coins_homomorphism(#[case] seed: Seed) { empty_witness(&mut rng), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(100_000..200_000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(100_000..200_000))), anyonecanspend_address(), )) .build(); @@ -80,7 +80,7 @@ fn coins_homomorphism(#[case] seed: Seed) { InputWitness::NoSignature(None), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(1000..2000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(1000..2000))), anyonecanspend_address(), )) .build(); @@ -94,7 +94,7 @@ fn coins_homomorphism(#[case] seed: Seed) { InputWitness::NoSignature(None), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(100..200))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(100..200))), anyonecanspend_address(), )) .build(); @@ -308,7 +308,7 @@ fn pos_accounting_homomorphism(#[case] seed: Seed) { Box::new(stake_pool_data), )) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(100_000..200_000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(100_000..200_000))), anyonecanspend_address(), )) .build(); @@ -326,7 +326,7 @@ fn pos_accounting_homomorphism(#[case] seed: Seed) { pool_id, )) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(1000..2000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(1000..2000))), anyonecanspend_address(), )) .build(); @@ -341,7 +341,7 @@ fn pos_accounting_homomorphism(#[case] seed: Seed) { InputWitness::NoSignature(None), ) .add_output(TxOutput::DelegateStaking( - Amount::from_atoms(rng.gen_range(100..200)), + Amount::from_atoms(rng.random_range(100..200)), delegation_id, )) .build(); diff --git a/chainstate/test-suite/src/tests/htlc.rs b/chainstate/test-suite/src/tests/htlc.rs index b658d88aae..dfc8e24bd0 100644 --- a/chainstate/test-suite/src/tests/htlc.rs +++ b/chainstate/test-suite/src/tests/htlc.rs @@ -66,7 +66,7 @@ struct TestFixture { } impl TestFixture { - fn new(rng: &mut (impl Rng + CryptoRng)) -> Self { + fn new(rng: &mut impl CryptoRng) -> Self { let secret = HtlcSecret::new_from_rng(rng); let (alice_sk, _) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); diff --git a/chainstate/test-suite/src/tests/initialization.rs b/chainstate/test-suite/src/tests/initialization.rs index 6052e8a245..31e02e3003 100644 --- a/chainstate/test-suite/src/tests/initialization.rs +++ b/chainstate/test-suite/src/tests/initialization.rs @@ -26,7 +26,7 @@ use common::{ use randomness::CryptoRng; #[cfg(not(loom))] -fn genesis_check_ok(num_blocks: u64, rng: &mut (impl Rng + CryptoRng)) { +fn genesis_check_ok(num_blocks: u64, rng: &mut impl CryptoRng) { // Get initial storage from the test framework. let storage = { @@ -54,7 +54,7 @@ fn genesis_check_ok(num_blocks: u64, rng: &mut (impl Rng + CryptoRng)) { } #[cfg(not(loom))] -fn genesis_check_err(num_blocks: u64, rng: &mut (impl Rng + CryptoRng)) { +fn genesis_check_err(num_blocks: u64, rng: &mut impl CryptoRng) { // Two different configs with separate genesis IDs. let conf0 = ChainConfigBuilder::new(ChainType::Regtest) @@ -118,7 +118,7 @@ fn genesis_check_ok_empty_chain(#[case] seed: Seed) { #[case(Seed::from_entropy())] fn genesis_check_ok_nonempty_chain(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - genesis_check_ok(rng.gen_range(1..100), &mut rng); + genesis_check_ok(rng.random_range(1..100), &mut rng); } #[rstest] @@ -142,5 +142,5 @@ fn genesis_check_err_height_1(#[case] seed: Seed) { #[case(Seed::from_entropy())] fn genesis_check_err_nonempty_chain(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - genesis_check_err(rng.gen_range(2..100), &mut rng); + genesis_check_err(rng.random_range(2..100), &mut rng); } diff --git a/chainstate/test-suite/src/tests/input_commitments.rs b/chainstate/test-suite/src/tests/input_commitments.rs index b55f323e8e..1b078d83ce 100644 --- a/chainstate/test-suite/src/tests/input_commitments.rs +++ b/chainstate/test-suite/src/tests/input_commitments.rs @@ -48,10 +48,10 @@ use common::{ }; use crypto::{ key::{KeyKind, PrivateKey}, - vrf::{transcript::with_rng::RngCoreAndCrypto, VRFKeyKind, VRFPrivateKey, VRFPublicKey}, + vrf::{VRFKeyKind, VRFPrivateKey, VRFPublicKey}, }; use logging::log; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use test_utils::{ assert_matches_return_val, random::{make_seedable_rng, Seed}, @@ -74,14 +74,14 @@ fn pool_decommissioning(#[case] seed: Seed) { let genesis_pool_pledge_amount = min_pledge; let genesis_output_amount = Amount::from_atoms( - rng.gen_range(min_pledge.into_atoms() * 5..min_pledge.into_atoms() * 10), + rng.random_range(min_pledge.into_atoms() * 5..min_pledge.into_atoms() * 10), ); - let blocks_to_produce_by_another_pool = rng.gen_range(1..=3); + let blocks_to_produce_by_another_pool = rng.random_range(1..=3); // This is the number of blocks after "another pool" has produced its last block until // the fork to SighashInputCommitmentVersion::V1 happens. We want it to be non-zero, // so that we can try V0 commitments too. - let fork_distance_after_setup_finished = rng.gen_range(1..=3); + let fork_distance_after_setup_finished = rng.random_range(1..=3); // Add 1 to account for the block that creates "another pool". // Add another 1 because we're interested in what happens on "next_block_height" after the setup is finished. let fork_height = BlockHeight::new( @@ -128,7 +128,7 @@ fn pool_decommissioning(#[case] seed: Seed) { tf.chain_config().staking_pool_spend_maturity_block_count(1.into()).to_int(); let another_pool_pledge_amount = - Amount::from_atoms(rng.gen_range(min_pledge.into_atoms()..min_pledge.into_atoms() * 2)); + Amount::from_atoms(rng.random_range(min_pledge.into_atoms()..min_pledge.into_atoms() * 2)); let another_pool_id = PoolId::from_utxo(&coins_outpoint); let another_pool_info = PoolInfoForStaking::new_random(&mut rng, another_pool_id); @@ -162,7 +162,7 @@ fn pool_decommissioning(#[case] seed: Seed) { let make_another_pool_decommission_txs = |tf: &TestFramework, - mut rng: &mut dyn RngCoreAndCrypto, + mut rng: &mut dyn CryptoRng, current_commitment_version: SighashInputCommitmentVersion| { let produce_block_utxo = tf.utxo(&produce_block_outpoint).take_output(); @@ -305,7 +305,7 @@ fn pool_decommissioning(#[case] seed: Seed) { fn order_fill(#[case] seed: Seed, #[case] orders_version: OrdersVersion) { let mut rng = make_seedable_rng(seed); - let fork_distance_after_setup_finished = rng.gen_range(1..=3); + let fork_distance_after_setup_finished = rng.random_range(1..=3); // Add 4 to account for creating and minting a token and creating and partially filling an order. // Add another 1 because we're interested in what happens on "next_block_height" after the setup is finished. @@ -342,7 +342,7 @@ fn order_fill(#[case] seed: Seed, #[case] orders_version: OrdersVersion) { 0, ); - let token_amount_to_mint = Amount::from_atoms(rng.gen_range(1_000_000..2_000_000)); + let token_amount_to_mint = Amount::from_atoms(rng.random_range(1_000_000..2_000_000)); let (token_id, tokens_outpoint, coins_outpoint) = issue_and_mint_random_token_from_best_block( &mut rng, &mut tf, @@ -353,9 +353,9 @@ fn order_fill(#[case] seed: Seed, #[case] orders_version: OrdersVersion) { ); let coins_left = tf.coin_amount_from_utxo(&coins_outpoint); - let initial_ask_amount = Amount::from_atoms(rng.gen_range(10..1000)); + let initial_ask_amount = Amount::from_atoms(rng.random_range(10..1000)); let initial_give_amount = - Amount::from_atoms(rng.gen_range(10..=token_amount_to_mint.into_atoms())); + Amount::from_atoms(rng.random_range(10..=token_amount_to_mint.into_atoms())); let initially_asked = OutputValue::Coin(initial_ask_amount); let initially_given = OutputValue::TokenV1(token_id, initial_give_amount); let order_data = OrderData::new( @@ -375,7 +375,7 @@ fn order_fill(#[case] seed: Seed, #[case] orders_version: OrdersVersion) { .build_and_process(&mut rng) .unwrap(); - let fill_amount = Amount::from_atoms(rng.gen_range(1..initial_ask_amount.into_atoms() / 2)); + let fill_amount = Amount::from_atoms(rng.random_range(1..initial_ask_amount.into_atoms() / 2)); let filled_amount = calculate_fill_order(&tf, &order_id, fill_amount, orders_version); let left_to_fill = (initial_ask_amount - fill_amount).unwrap(); let coins_left = (coins_left - fill_amount).unwrap(); @@ -410,9 +410,10 @@ fn order_fill(#[case] seed: Seed, #[case] orders_version: OrdersVersion) { // Here we'll create FillOrder txs that actually require signing. let make_fill_order_txs = |tf: &TestFramework, - mut rng: &mut dyn RngCoreAndCrypto, + mut rng: &mut dyn CryptoRng, current_commitment_version: SighashInputCommitmentVersion| { - let fill_amount = Amount::from_atoms(rng.gen_range(1..left_to_fill.into_atoms() / 2)); + let fill_amount = + Amount::from_atoms(rng.random_range(1..left_to_fill.into_atoms() / 2)); let filled_amount = calculate_fill_order(tf, &order_id, fill_amount, orders_version); let fill_order_input = @@ -464,12 +465,12 @@ fn order_fill(#[case] seed: Seed, #[case] orders_version: OrdersVersion) { good_fill_order_input_commitment_v1.clone(), ]; - let bad_initially_asked = if rng.gen_bool(0.5) { + let bad_initially_asked = if rng.random_bool(0.5) { OutputValue::Coin(amount_variation(&mut rng, initial_ask_amount)) } else { OutputValue::TokenV1(token_id, initial_ask_amount) }; - let bad_initially_given = if rng.gen_bool(0.5) { + let bad_initially_given = if rng.random_bool(0.5) { OutputValue::TokenV1(token_id, amount_variation(&mut rng, initial_give_amount)) } else { OutputValue::Coin(initial_give_amount) @@ -591,7 +592,7 @@ fn order_fill(#[case] seed: Seed, #[case] orders_version: OrdersVersion) { fn order_conclude(#[case] seed: Seed, #[case] orders_version: OrdersVersion) { let mut rng = make_seedable_rng(seed); - let fork_distance_after_setup_finished = rng.gen_range(1..=3); + let fork_distance_after_setup_finished = rng.random_range(1..=3); // Add 4 to account for creating and minting a token and creating and partially filling an order. // Add another 1 because we're interested in what happens on "next_block_height" after the setup is finished. @@ -628,7 +629,7 @@ fn order_conclude(#[case] seed: Seed, #[case] orders_version: OrdersVersion) { 0, ); - let token_amount_to_mint = Amount::from_atoms(rng.gen_range(1_000_000..2_000_000)); + let token_amount_to_mint = Amount::from_atoms(rng.random_range(1_000_000..2_000_000)); let (token_id, tokens_outpoint, coins_outpoint) = issue_and_mint_random_token_from_best_block( &mut rng, &mut tf, @@ -643,9 +644,9 @@ fn order_conclude(#[case] seed: Seed, #[case] orders_version: OrdersVersion) { PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); let order_owner_dest = Destination::PublicKey(order_owner_pk); - let initial_ask_amount = Amount::from_atoms(rng.gen_range(10..1000)); + let initial_ask_amount = Amount::from_atoms(rng.random_range(10..1000)); let initial_give_amount = - Amount::from_atoms(rng.gen_range(10..=token_amount_to_mint.into_atoms())); + Amount::from_atoms(rng.random_range(10..=token_amount_to_mint.into_atoms())); let initially_asked = OutputValue::Coin(initial_ask_amount); let initially_given = OutputValue::TokenV1(token_id, initial_give_amount); let order_data = OrderData::new( @@ -665,7 +666,7 @@ fn order_conclude(#[case] seed: Seed, #[case] orders_version: OrdersVersion) { .build_and_process(&mut rng) .unwrap(); - let fill_amount = Amount::from_atoms(rng.gen_range(1..initial_ask_amount.into_atoms() / 2)); + let fill_amount = Amount::from_atoms(rng.random_range(1..initial_ask_amount.into_atoms() / 2)); let filled_amount = calculate_fill_order(&tf, &order_id, fill_amount, orders_version); let ask_balance = (initial_ask_amount - fill_amount).unwrap(); let give_balance = (initial_give_amount - filled_amount).unwrap(); @@ -693,8 +694,7 @@ fn order_conclude(#[case] seed: Seed, #[case] orders_version: OrdersVersion) { .unwrap(); let make_conclude_order_txs = - |mut rng: &mut dyn RngCoreAndCrypto, - current_commitment_version: SighashInputCommitmentVersion| { + |mut rng: &mut dyn CryptoRng, current_commitment_version: SighashInputCommitmentVersion| { let conclude_order_input = make_conclude_order_input(orders_version, AccountNonce::new(1), &order_id); @@ -721,12 +721,12 @@ fn order_conclude(#[case] seed: Seed, #[case] orders_version: OrdersVersion) { give_balance, }]; - let bad_initially_asked = if rng.gen_bool(0.5) { + let bad_initially_asked = if rng.random_bool(0.5) { OutputValue::Coin(amount_variation(&mut rng, initial_ask_amount)) } else { OutputValue::TokenV1(token_id, initial_ask_amount) }; - let bad_initially_given = if rng.gen_bool(0.5) { + let bad_initially_given = if rng.random_bool(0.5) { OutputValue::TokenV1(token_id, amount_variation(&mut rng, initial_give_amount)) } else { OutputValue::Coin(initial_give_amount) @@ -871,8 +871,8 @@ fn make_conclude_order_input( } } -fn amount_variation(rng: &mut (impl Rng + CryptoRng), amount: Amount) -> Amount { - if rng.gen_bool(0.5) { +fn amount_variation(rng: &mut impl CryptoRng, amount: Amount) -> Amount { + if rng.random_bool(0.5) { (amount - Amount::from_atoms(1)).unwrap() } else { (amount + Amount::from_atoms(1)).unwrap() @@ -883,7 +883,7 @@ fn amount_variation(rng: &mut (impl Rng + CryptoRng), amount: Amount) -> Amount fn check_txs_pos( pool_info: &PoolInfoForStaking, tf: &mut TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, good_tx: SignedTransaction, bad_txs: Vec, ) { @@ -918,7 +918,7 @@ fn check_txs_pos( fn check_txs_non_pos( tf: &mut TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, good_tx: SignedTransaction, bad_txs: Vec, ) { @@ -963,7 +963,7 @@ struct PoolInfoForStaking { } impl PoolInfoForStaking { - fn new_random(rng: &mut (impl Rng + CryptoRng), id: PoolId) -> Self { + fn new_random(rng: &mut impl CryptoRng, id: PoolId) -> Self { let (vrf_sk, vrf_pk) = VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel); let (staking_sk, staking_pk) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); let staking_dest = Destination::PublicKey(staking_pk); diff --git a/chainstate/test-suite/src/tests/mempool_output_timelock.rs b/chainstate/test-suite/src/tests/mempool_output_timelock.rs index c9120a5627..4ca1bb1b96 100644 --- a/chainstate/test-suite/src/tests/mempool_output_timelock.rs +++ b/chainstate/test-suite/src/tests/mempool_output_timelock.rs @@ -25,7 +25,7 @@ use common::{ }, primitives::{time, BlockHeight}, }; -use randomness::{CryptoRng, Rng}; +use randomness::CryptoRng; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; use tx_verifier::{ @@ -33,7 +33,7 @@ use tx_verifier::{ transaction_verifier::{TransactionSourceForConnect, TransactionVerifier}, }; -fn setup(rng: &mut (impl Rng + CryptoRng)) -> (ChainConfig, InMemoryStorageWrapper, TestFramework) { +fn setup(rng: &mut impl CryptoRng) -> (ChainConfig, InMemoryStorageWrapper, TestFramework) { let storage = TestStore::new_empty().unwrap(); let tf = TestFramework::builder(rng).with_storage(storage.clone()).build(); diff --git a/chainstate/test-suite/src/tests/mod.rs b/chainstate/test-suite/src/tests/mod.rs index 5ac367beaa..6464a31005 100644 --- a/chainstate/test-suite/src/tests/mod.rs +++ b/chainstate/test-suite/src/tests/mod.rs @@ -19,7 +19,7 @@ use common::{ chain::{signature::inputsig::InputWitness, GenBlock, Genesis}, primitives::{BlockHeight, Id}, }; -use randomness::Rng; +use randomness::RngExt as _; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; diff --git a/chainstate/test-suite/src/tests/nft_burn.rs b/chainstate/test-suite/src/tests/nft_burn.rs index db2cb7909f..b0e3bfb1d8 100644 --- a/chainstate/test-suite/src/tests/nft_burn.rs +++ b/chainstate/test-suite/src/tests/nft_burn.rs @@ -25,7 +25,7 @@ use common::{ }, primitives::{Amount, BlockHeight, CoinOrTokenId, Idable}, }; -use randomness::Rng; +use randomness::RngExt as _; use test_utils::{ random::{make_seedable_rng, Seed}, token_utils::random_nft_issuance, @@ -70,7 +70,7 @@ fn nft_burn_invalid_amount(#[case] seed: Seed) { ) .add_output(TxOutput::Burn(OutputValue::TokenV1( token_id, - Amount::from_atoms(rng.gen_range(2..123)), + Amount::from_atoms(rng.random_range(2..123)), ))) .build(); let tx_id = tx.transaction().get_id(); diff --git a/chainstate/test-suite/src/tests/nft_issuance.rs b/chainstate/test-suite/src/tests/nft_issuance.rs index eb6f435dd0..63705b595c 100644 --- a/chainstate/test-suite/src/tests/nft_issuance.rs +++ b/chainstate/test-suite/src/tests/nft_issuance.rs @@ -30,7 +30,7 @@ use common::{ }, primitives::{BlockHeight, Id, Idable}, }; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use serialization::extras::non_empty_vec::DataOrNoVec; use test_utils::{ gen_text_with_non_ascii, @@ -1357,7 +1357,7 @@ fn nft_media_uri_invalid(#[case] seed: Seed) { } fn new_block_with_media_hash( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, input_source_id: &OutPointSourceId, media_hash: Vec, @@ -1413,7 +1413,7 @@ fn nft_media_hash_too_short(#[case] seed: Seed) { // Media hash is too short for i in 0..min_hash_len { - let media_hash = [rng.gen::()].repeat(i); + let media_hash = [rng.random::()].repeat(i); let block = new_block_with_media_hash(&mut rng, &mut tf, &outpoint_source_id, media_hash); @@ -1448,7 +1448,7 @@ fn nft_media_hash_too_long(#[case] seed: Seed) { // Media hash is too long for i in (max_hash_len + 1)..=(u8::MAX as usize) { - let media_hash = [rng.gen::()].repeat(i); + let media_hash = [rng.random::()].repeat(i); let block = new_block_with_media_hash(&mut rng, &mut tf, &outpoint_source_id, media_hash); @@ -1493,7 +1493,7 @@ fn nft_media_hash_valid(#[case] seed: Seed) { min_hash_len + 20, max_hash_len, ] { - let media_hash = [rng.gen::()].repeat(hash_size); + let media_hash = [rng.random::()].repeat(hash_size); let block = new_block_with_media_hash( &mut rng, @@ -1848,7 +1848,7 @@ fn nft_token_id_mismatch(#[case] seed: Seed) { let mut tf = TestFramework::builder(&mut rng).build(); let outpoint_source_id = OutPointSourceId::BlockReward(tf.genesis().get_id().into()); let invalid_token_id = TokenId::from_tx_input( - &UtxoOutPoint::new(outpoint_source_id.clone(), rng.gen_range(1..100)).into(), + &UtxoOutPoint::new(outpoint_source_id.clone(), rng.random_range(1..100)).into(), ); let tx_first_input = TxInput::from_utxo(outpoint_source_id, 0); let valid_token_id = TokenId::from_tx_input(&tx_first_input); diff --git a/chainstate/test-suite/src/tests/nft_transfer.rs b/chainstate/test-suite/src/tests/nft_transfer.rs index ab0f61768b..e6a6bc4852 100644 --- a/chainstate/test-suite/src/tests/nft_transfer.rs +++ b/chainstate/test-suite/src/tests/nft_transfer.rs @@ -27,7 +27,7 @@ use common::{ }, primitives::{Amount, BlockHeight, CoinOrTokenId, Idable}, }; -use randomness::Rng; +use randomness::RngExt; use test_utils::{ random::{make_seedable_rng, Seed}, token_utils::random_nft_issuance, @@ -129,7 +129,7 @@ fn nft_invalid_transfer(#[case] seed: Seed) { InputWitness::NoSignature(None), ) .add_output(TxOutput::Transfer( - OutputValue::TokenV1(token_id, Amount::from_atoms(rng.gen_range(2..123))), + OutputValue::TokenV1(token_id, Amount::from_atoms(rng.random_range(2..123))), Destination::AnyoneCanSpend, )) .build(); @@ -196,7 +196,7 @@ fn nft_zero_transfer(#[case] seed: Seed) { // and optionally a normal output as well. let mut tx_builder = TransactionBuilder::new() .add_input(issuance_outpoint.into(), InputWitness::NoSignature(None)); - let zero_outputs_count = rng.gen_range(1..5); + let zero_outputs_count = rng.random_range(1..5); for _ in 0..zero_outputs_count { tx_builder = tx_builder.add_output(TxOutput::Transfer( OutputValue::TokenV1(token_id, Amount::ZERO), @@ -204,7 +204,7 @@ fn nft_zero_transfer(#[case] seed: Seed) { )); } - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { // Also make the actual transfer tx_builder = tx_builder.add_output(TxOutput::Transfer( OutputValue::TokenV1(token_id, Amount::from_atoms(1)), diff --git a/chainstate/test-suite/src/tests/orders_tests.rs b/chainstate/test-suite/src/tests/orders_tests.rs index 0a5e167876..ee3f5ce2c2 100644 --- a/chainstate/test-suite/src/tests/orders_tests.rs +++ b/chainstate/test-suite/src/tests/orders_tests.rs @@ -49,7 +49,7 @@ use common::{ use crypto::key::{KeyKind, PrivateKey}; use logging::log; use orders_accounting::OrdersAccountingStorageRead as _; -use randomness::{CryptoRng, Rng, SliceRandom}; +use randomness::{CryptoRng, RngExt as _, SliceRandom}; use test_utils::random::{gen_random_bytes, make_seedable_rng, Seed}; use tx_verifier::{ error::{InputCheckError, InputCheckErrorPayload, ScriptError, TranslationError}, @@ -58,7 +58,7 @@ use tx_verifier::{ }; fn create_test_framework_with_orders( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, orders_version: OrdersVersion, ) -> TestFramework { TestFramework::builder(rng) @@ -77,19 +77,19 @@ fn create_test_framework_with_orders( } fn issue_and_mint_token_from_genesis( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, ) -> ( TokenId, /*tokens*/ UtxoOutPoint, /*coins change*/ UtxoOutPoint, ) { - let to_mint = Amount::from_atoms(rng.gen_range(100..100_000_000)); + let to_mint = Amount::from_atoms(rng.random_range(100..100_000_000)); issue_and_mint_token_amount_from_genesis(rng, tf, to_mint) } fn issue_and_mint_token_amount_from_genesis( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, to_mint: Amount, ) -> ( @@ -111,7 +111,7 @@ fn issue_and_mint_token_amount_from_genesis( } fn issue_and_mint_token_amount_from_best_block( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, utxo_to_pay_fee: UtxoOutPoint, to_mint: Amount, @@ -140,7 +140,7 @@ struct ExpectedOrderData { fn assert_order_exists( tf: &TestFramework, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, order_id: &OrderId, expected_data: &ExpectedOrderData, no_other_orders_present: bool, @@ -235,14 +235,14 @@ fn assert_order_exists( } let mut make_different_currency = |currency, other_currency| { - if currency != other_currency && rng.gen_bool(0.5) { + if currency != other_currency && rng.random_bool(0.5) { return other_currency; } match currency { Currency::Coin => Currency::Token(TokenId::random_using(rng)), Currency::Token(_) => { - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { Currency::Coin } else { Currency::Token(TokenId::random_using(rng)) @@ -416,9 +416,9 @@ fn create_order_check_storage(#[case] seed: Seed) { let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -461,9 +461,10 @@ fn create_two_identical_orders_same_tx(#[case] seed: Seed) { tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); let half_tokens_circulating_supply = (tokens_circulating_supply / 2).unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); - let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=half_tokens_circulating_supply.into_atoms())); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); + let give_amount = Amount::from_atoms( + rng.random_range(1u128..=half_tokens_circulating_supply.into_atoms()), + ); let order_data = Box::new(OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -503,9 +504,9 @@ fn create_two_different_orders_same_tx(#[case] seed: Seed) { tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); let half_tokens_circulating_supply = (tokens_circulating_supply / 2).unwrap(); - let amount1 = Amount::from_atoms(rng.gen_range(1u128..1000)); + let amount1 = Amount::from_atoms(rng.random_range(1u128..1000)); let amount2 = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data_1 = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(amount1), @@ -513,7 +514,7 @@ fn create_two_different_orders_same_tx(#[case] seed: Seed) { ); let order_data_2 = OrderData::new( - Destination::PublicKeyHash(PublicKeyHash::random()), + Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), OutputValue::Coin(amount2), OutputValue::TokenV1(token_id, half_tokens_circulating_supply), ); @@ -550,9 +551,9 @@ fn create_two_identical_orders_same_block(#[case] seed: Seed) { let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data = Box::new(OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -599,9 +600,9 @@ fn create_order_check_currencies(#[case] seed: Seed) { let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); // Check coins for coins trade { @@ -698,7 +699,7 @@ fn create_order_tokens_for_tokens(#[case] seed: Seed) { let (token_id_1, _, coins_outpoint) = issue_and_mint_token_from_genesis(&mut rng, &mut tf); - let token_2_mint_amount = Amount::from_atoms(rng.gen_range(100..100_000_000)); + let token_2_mint_amount = Amount::from_atoms(rng.random_range(100..100_000_000)); let (token_id_2, tokens_outpoint_2, _) = issue_and_mint_token_amount_from_best_block( &mut rng, &mut tf, @@ -706,9 +707,9 @@ fn create_order_tokens_for_tokens(#[case] seed: Seed) { token_2_mint_amount, ); - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..token_2_mint_amount.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..token_2_mint_amount.into_atoms())); // Trade tokens for coins let order_data = OrderData::new( @@ -743,9 +744,9 @@ fn conclude_order_check_storage(#[case] seed: Seed, #[case] version: OrdersVersi let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -833,9 +834,9 @@ fn conclude_order_multiple_txs(#[case] seed: Seed, #[case] version: OrdersVersio let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -933,9 +934,9 @@ fn fill_order_check_storage(#[case] seed: Seed, #[case] version: OrdersVersion) let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(10u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(10u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(10u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(10u128..=tokens_circulating_supply.into_atoms())); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -952,7 +953,7 @@ fn fill_order_check_storage(#[case] seed: Seed, #[case] version: OrdersVersion) // Fill the order partially or completely let min_non_zero_fill_amount = order_min_non_zero_fill_amount(&tf, &order_id, version); let fill_amount = Amount::from_atoms( - rng.gen_range(min_non_zero_fill_amount.into_atoms()..=ask_amount.into_atoms()), + rng.random_range(min_non_zero_fill_amount.into_atoms()..=ask_amount.into_atoms()), ); let filled_amount = calculate_fill_order(&tf, &order_id, fill_amount, version); let left_to_fill = (ask_amount - fill_amount).unwrap(); @@ -1073,9 +1074,9 @@ fn fill_then_conclude(#[case] seed: Seed, #[case] version: OrdersVersion) { let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -1092,7 +1093,7 @@ fn fill_then_conclude(#[case] seed: Seed, #[case] version: OrdersVersion) { // Fill the order partially or completely let min_fill_amount = order_min_non_zero_fill_amount(&tf, &order_id, version); let fill_amount = Amount::from_atoms( - rng.gen_range(min_fill_amount.into_atoms()..=ask_amount.into_atoms()), + rng.random_range(min_fill_amount.into_atoms()..=ask_amount.into_atoms()), ); let filled_amount = calculate_fill_order(&tf, &order_id, fill_amount, version); @@ -1295,9 +1296,9 @@ fn try_overbid_order_in_multiple_txs(#[case] seed: Seed, #[case] version: Orders let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(2u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(2u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -1408,9 +1409,9 @@ fn fill_completely_then_conclude(#[case] seed: Seed, #[case] version: OrdersVers let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -1598,10 +1599,10 @@ fn conclude_order_check_signature(#[case] seed: Seed, #[case] version: OrdersVer let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let initially_asked = OutputValue::Coin(Amount::from_atoms(rng.gen_range(1u128..1000))); + let initially_asked = OutputValue::Coin(Amount::from_atoms(rng.random_range(1u128..1000))); let initially_given = OutputValue::TokenV1( token_id, - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())), + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())), ); let order_data = OrderData::new( Destination::PublicKey(order_pk.clone()), @@ -1733,9 +1734,9 @@ fn reorg_before_create(#[case] seed: Seed, #[case] version: OrdersVersion) { tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); let reorg_common_ancestor = tf.best_block_id(); - let ask_amount = Amount::from_atoms(rng.gen_range(10u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(10u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -1756,7 +1757,7 @@ fn reorg_before_create(#[case] seed: Seed, #[case] version: OrdersVersion) { // remaining ask/give amounts are always Some). let min_fill_amount = order_min_non_zero_fill_amount(&tf, &order_id, version); let fill_amount = Amount::from_atoms( - rng.gen_range(min_fill_amount.into_atoms()..ask_amount.into_atoms()), + rng.random_range(min_fill_amount.into_atoms()..ask_amount.into_atoms()), ); let filled_amount = calculate_fill_order(&tf, &order_id, fill_amount, version); let left_to_fill = (ask_amount - fill_amount).unwrap(); @@ -1831,9 +1832,9 @@ fn reorg_after_create(#[case] seed: Seed, #[case] version: OrdersVersion) { let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(10u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(10u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -1856,7 +1857,7 @@ fn reorg_after_create(#[case] seed: Seed, #[case] version: OrdersVersion) { // Fill the order partially or completely let min_fill_amount = order_min_non_zero_fill_amount(&tf, &order_id, version); let fill_amount = Amount::from_atoms( - rng.gen_range(min_fill_amount.into_atoms()..=ask_amount.into_atoms()), + rng.random_range(min_fill_amount.into_atoms()..=ask_amount.into_atoms()), ); let filled_amount = calculate_fill_order(&tf, &order_id, fill_amount, version); let left_to_fill = (ask_amount - fill_amount).unwrap(); @@ -1973,10 +1974,12 @@ fn test_activation(#[case] seed: Seed) { let order_data = Box::new(OrderData::new( Destination::AnyoneCanSpend, - OutputValue::Coin(Amount::from_atoms(rng.gen_range(1u128..1000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(1u128..1000))), OutputValue::TokenV1( token_id, - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())), + Amount::from_atoms( + rng.random_range(1u128..=tokens_circulating_supply.into_atoms()), + ), ), )); @@ -2037,7 +2040,7 @@ fn create_order_with_nft(#[case] seed: Seed, #[case] version: OrdersVersion) { issue_random_nft_from_best_block(&mut rng, &mut tf, genesis_utxo); // Create order selling NFT for coins - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); let give_amount = Amount::from_atoms(1); let order_data = OrderData::new( Destination::AnyoneCanSpend, @@ -2174,7 +2177,7 @@ fn partially_fill_order_with_nft_v0(#[case] seed: Seed) { issue_random_nft_from_best_block(&mut rng, &mut tf, genesis_utxo); // Create order selling NFT for coins - let ask_amount = Amount::from_atoms(rng.gen_range(10u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(10u128..1000)); let give_amount = Amount::from_atoms(1); let order_data = OrderData::new( Destination::AnyoneCanSpend, @@ -2359,7 +2362,7 @@ fn partially_fill_order_with_nft_v1(#[case] seed: Seed) { issue_random_nft_from_best_block(&mut rng, &mut tf, genesis_utxo); // Create order selling NFT for coins - let ask_amount = Amount::from_atoms(rng.gen_range(10u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(10u128..1000)); let give_amount = Amount::from_atoms(1); let order_data = OrderData::new( Destination::AnyoneCanSpend, @@ -2478,9 +2481,9 @@ fn fill_order_with_zero(#[case] seed: Seed, #[case] version: OrdersVersion) { let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -2566,12 +2569,13 @@ fn fill_order_underbid(#[case] seed: Seed, #[case] version: OrdersVersion) { let min_give_atoms = 100; let max_give_atoms = 200; - let token_amount_to_mint = Amount::from_atoms(rng.gen_range(max_give_atoms..100_000_000)); + let token_amount_to_mint = + Amount::from_atoms(rng.random_range(max_give_atoms..100_000_000)); let (token_id, tokens_outpoint, coins_outpoint) = issue_and_mint_token_amount_from_genesis(&mut rng, &mut tf, token_amount_to_mint); - let ask_amount = Amount::from_atoms(rng.gen_range(min_ask_atoms..max_ask_atoms)); - let give_amount = Amount::from_atoms(rng.gen_range(min_give_atoms..=max_give_atoms)); + let ask_amount = Amount::from_atoms(rng.random_range(min_ask_atoms..max_ask_atoms)); + let give_amount = Amount::from_atoms(rng.random_range(min_give_atoms..=max_give_atoms)); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -2586,7 +2590,7 @@ fn fill_order_underbid(#[case] seed: Seed, #[case] version: OrdersVersion) { tf.make_block_builder().add_transaction(tx).build_and_process(&mut rng).unwrap(); let max_fill_atoms = ask_amount.into_atoms() / give_amount.into_atoms() - 1; - let fill_amount = Amount::from_atoms(rng.gen_range(1..=max_fill_atoms)); + let fill_amount = Amount::from_atoms(rng.random_range(1..=max_fill_atoms)); // Sanity check: the filled_amount is zero. // Note: @@ -2773,10 +2777,12 @@ fn orders_v1_activation(#[case] seed: Seed) { let order_data = Box::new(OrderData::new( Destination::AnyoneCanSpend, - OutputValue::Coin(Amount::from_atoms(rng.gen_range(1u128..1000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(1u128..1000))), OutputValue::TokenV1( token_id, - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())), + Amount::from_atoms( + rng.random_range(1u128..=tokens_circulating_supply.into_atoms()), + ), ), )); @@ -3070,9 +3076,9 @@ fn freeze_order_check_storage(#[case] seed: Seed, #[case] version: OrdersVersion let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -3196,9 +3202,9 @@ fn freeze_order_check_signature(#[case] seed: Seed) { let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data = OrderData::new( Destination::PublicKey(order_pk.clone()), OutputValue::Coin(ask_amount), @@ -3314,9 +3320,9 @@ fn fill_freeze_conclude_order(#[case] seed: Seed) { let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let ask_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let ask_amount = Amount::from_atoms(rng.random_range(1u128..1000)); let give_amount = - Amount::from_atoms(rng.gen_range(1u128..=tokens_circulating_supply.into_atoms())); + Amount::from_atoms(rng.random_range(1u128..=tokens_circulating_supply.into_atoms())); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(ask_amount), @@ -3333,7 +3339,7 @@ fn fill_freeze_conclude_order(#[case] seed: Seed) { // Fill the order partially or completely let min_fill_amount = order_min_non_zero_fill_amount(&tf, &order_id, OrdersVersion::V1); let fill_amount = Amount::from_atoms( - rng.gen_range(min_fill_amount.into_atoms()..=ask_amount.into_atoms()), + rng.random_range(min_fill_amount.into_atoms()..=ask_amount.into_atoms()), ); let filled_amount = calculate_fill_order(&tf, &order_id, fill_amount, OrdersVersion::V1); let left_to_fill = (ask_amount - fill_amount).unwrap(); @@ -3504,10 +3510,10 @@ fn order_with_zero_value(#[case] seed: Seed, #[case] version: OrdersVersion) { let tokens_circulating_supply = tf.chainstate.get_token_circulating_supply(&token_id).unwrap().unwrap(); - let (coins, tokens) = match rng.gen_range(0..3) { + let (coins, tokens) = match rng.random_range(0..3) { 0 => { let token_amount = Amount::from_atoms( - rng.gen_range(1u128..=tokens_circulating_supply.into_atoms()), + rng.random_range(1u128..=tokens_circulating_supply.into_atoms()), ); ( OutputValue::Coin(Amount::ZERO), @@ -3515,7 +3521,7 @@ fn order_with_zero_value(#[case] seed: Seed, #[case] version: OrdersVersion) { ) } 1 => { - let coin_amount = Amount::from_atoms(rng.gen_range(1u128..1000)); + let coin_amount = Amount::from_atoms(rng.random_range(1u128..1000)); ( OutputValue::Coin(coin_amount), OutputValue::TokenV1(token_id, Amount::ZERO), @@ -3527,7 +3533,7 @@ fn order_with_zero_value(#[case] seed: Seed, #[case] version: OrdersVersion) { ), }; - let (ask, give) = if rng.gen_bool(0.5) { + let (ask, give) = if rng.random_bool(0.5) { (coins, tokens) } else { (tokens, coins) @@ -3574,8 +3580,8 @@ fn fill_order_v0_destination_irrelevancy(#[case] seed: Seed) { let (token_id, tokens_outpoint, mut coins_outpoint) = issue_and_mint_token_from_genesis(&mut rng, &mut tf); - let initial_ask_amount = Amount::from_atoms(rng.gen_range(1000..2000)); - let initial_give_amount = Amount::from_atoms(rng.gen_range(1000..2000)); + let initial_ask_amount = Amount::from_atoms(rng.random_range(1000..2000)); + let initial_give_amount = Amount::from_atoms(rng.random_range(1000..2000)); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(initial_ask_amount), @@ -3593,7 +3599,7 @@ fn fill_order_v0_destination_irrelevancy(#[case] seed: Seed) { let (sk2, pk2) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); let (_, pk3) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); - let output_destination = if rng.gen_bool(0.5) { + let output_destination = if rng.random_bool(0.5) { Destination::PublicKey(pk3) } else { Destination::AnyoneCanSpend @@ -3606,7 +3612,7 @@ fn fill_order_v0_destination_irrelevancy(#[case] seed: Seed) { // The actual output destination is output_destination. { let fill_amount1 = - Amount::from_atoms(rng.gen_range(1..initial_ask_amount.into_atoms() / 10)); + Amount::from_atoms(rng.random_range(1..initial_ask_amount.into_atoms() / 10)); let filled_amount1 = calculate_fill_order(&tf, &order_id, fill_amount1, OrdersVersion::V0); let fill_order_input1 = TxInput::AccountCommand( @@ -3648,7 +3654,7 @@ fn fill_order_v0_destination_irrelevancy(#[case] seed: Seed) { // The actual output destination is output_destination. { let fill_amount2 = - Amount::from_atoms(rng.gen_range(1..initial_ask_amount.into_atoms() / 10)); + Amount::from_atoms(rng.random_range(1..initial_ask_amount.into_atoms() / 10)); let filled_amount2 = calculate_fill_order(&tf, &order_id, fill_amount2, OrdersVersion::V0); let fill_order_input2 = TxInput::AccountCommand( @@ -3709,7 +3715,7 @@ fn fill_order_v0_destination_irrelevancy(#[case] seed: Seed) { // The actual output destination is output_destination. { let fill_amount3 = - Amount::from_atoms(rng.gen_range(1..initial_ask_amount.into_atoms() / 10)); + Amount::from_atoms(rng.random_range(1..initial_ask_amount.into_atoms() / 10)); let filled_amount3 = calculate_fill_order(&tf, &order_id, fill_amount3, OrdersVersion::V0); let fill_order_input3 = TxInput::AccountCommand( @@ -3786,8 +3792,8 @@ fn fill_order_v1_must_not_be_signed(#[case] seed: Seed) { issue_and_mint_token_from_genesis(&mut rng, &mut tf); let coins_utxo = tf.utxo(&coins_outpoint).take_output(); - let initial_ask_amount = Amount::from_atoms(rng.gen_range(1000..2000)); - let initial_give_amount = Amount::from_atoms(rng.gen_range(1000..2000)); + let initial_ask_amount = Amount::from_atoms(rng.random_range(1000..2000)); + let initial_give_amount = Amount::from_atoms(rng.random_range(1000..2000)); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(initial_ask_amount), @@ -3806,7 +3812,7 @@ fn fill_order_v1_must_not_be_signed(#[case] seed: Seed) { let min_fill_amount = order_min_non_zero_fill_amount(&tf, &order_id, OrdersVersion::V1); let fill_amount = Amount::from_atoms( - rng.gen_range(min_fill_amount.into_atoms()..initial_ask_amount.into_atoms() / 10), + rng.random_range(min_fill_amount.into_atoms()..initial_ask_amount.into_atoms() / 10), ); let filled_amount = calculate_fill_order(&tf, &order_id, fill_amount, OrdersVersion::V1); let fill_order_input = @@ -3953,8 +3959,8 @@ fn fill_order_twice_in_same_block( issue_and_mint_token_from_genesis(&mut rng, &mut tf); let coins_amount = tf.coin_amount_from_utxo(&coins_outpoint); - let initial_ask_amount = Amount::from_atoms(rng.gen_range(1000..2000)); - let initial_give_amount = Amount::from_atoms(rng.gen_range(1000..2000)); + let initial_ask_amount = Amount::from_atoms(rng.random_range(1000..2000)); + let initial_give_amount = Amount::from_atoms(rng.random_range(1000..2000)); let order_data = OrderData::new( Destination::AnyoneCanSpend, OutputValue::Coin(initial_ask_amount), @@ -3973,14 +3979,14 @@ fn fill_order_twice_in_same_block( let min_fill_amount = order_min_non_zero_fill_amount(&tf, &order_id, version); let fill_amount1 = Amount::from_atoms( - rng.gen_range(min_fill_amount.into_atoms()..initial_ask_amount.into_atoms() / 3), + rng.random_range(min_fill_amount.into_atoms()..initial_ask_amount.into_atoms() / 3), ); let fill_amount2 = if use_same_amount { fill_amount1 } else { (|| { for _ in 0..1000 { - let new_amount = Amount::from_atoms(rng.gen_range( + let new_amount = Amount::from_atoms(rng.random_range( min_fill_amount.into_atoms()..initial_ask_amount.into_atoms() / 3, )); if new_amount != fill_amount1 { @@ -4109,14 +4115,14 @@ fn conclude_and_recreate_in_same_tx_with_same_balances( let mut rng = make_seedable_rng(seed); let mut tf = create_test_framework_with_orders(&mut rng, version); - let tokens_amount = Amount::from_atoms(rng.gen_range(1000..1_000_000)); + let tokens_amount = Amount::from_atoms(rng.random_range(1000..1_000_000)); let (token_id, tokens_outpoint, coins_outpoint) = issue_and_mint_token_amount_from_genesis(&mut rng, &mut tf, tokens_amount); let coins_amount = tf.coin_amount_from_utxo(&coins_outpoint); - let orig_ask_amount = Amount::from_atoms(rng.gen_range(10u128..10_000)); + let orig_ask_amount = Amount::from_atoms(rng.random_range(10u128..10_000)); let orig_give_amount = - Amount::from_atoms(rng.gen_range(10u128..=tokens_amount.into_atoms() / 2)); + Amount::from_atoms(rng.random_range(10u128..=tokens_amount.into_atoms() / 2)); let tokens_amount_after_order_creation = (tokens_amount - orig_give_amount).unwrap(); let orig_order_data = OrderData::new( @@ -4146,7 +4152,7 @@ fn conclude_and_recreate_in_same_tx_with_same_balances( // Fill the order partially. let min_fill_amount = order_min_non_zero_fill_amount(&tf, &orig_order_id, version); let fill_amount = Amount::from_atoms( - rng.gen_range(min_fill_amount.into_atoms()..orig_ask_amount.into_atoms()), + rng.random_range(min_fill_amount.into_atoms()..orig_ask_amount.into_atoms()), ); let filled_amount = calculate_fill_order(&tf, &orig_order_id, fill_amount, version); let coins_amount_after_fill = (coins_amount - fill_amount).unwrap(); @@ -4246,7 +4252,7 @@ fn conclude_and_recreate_in_same_tx_with_same_balances( )) .add_output(TxOutput::CreateOrder(Box::new(new_order_data.clone()))); // Add coins or tokens to inputs and transfer the same amount in outputs. - let tx_builder = if rng.gen_bool(0.5) { + let tx_builder = if rng.random_bool(0.5) { tx_builder .add_input(tokens_outpoint.into(), InputWitness::NoSignature(None)) .add_output(TxOutput::Transfer( @@ -4304,14 +4310,14 @@ fn conclude_and_recreate_in_same_tx_with_different_balances( let mut rng = make_seedable_rng(seed); let mut tf = create_test_framework_with_orders(&mut rng, version); - let tokens_amount = Amount::from_atoms(rng.gen_range(1000..1_000_000)); + let tokens_amount = Amount::from_atoms(rng.random_range(1000..1_000_000)); let (token_id, tokens_outpoint, coins_outpoint) = issue_and_mint_token_amount_from_genesis(&mut rng, &mut tf, tokens_amount); let coins_amount = tf.coin_amount_from_utxo(&coins_outpoint); - let orig_ask_amount = Amount::from_atoms(rng.gen_range(10u128..10_000)); + let orig_ask_amount = Amount::from_atoms(rng.random_range(10u128..10_000)); let orig_give_amount = - Amount::from_atoms(rng.gen_range(10u128..=tokens_amount.into_atoms() / 2)); + Amount::from_atoms(rng.random_range(10u128..=tokens_amount.into_atoms() / 2)); let tokens_amount_after_order_creation = (tokens_amount - orig_give_amount).unwrap(); let orig_order_data = OrderData::new( @@ -4338,14 +4344,14 @@ fn conclude_and_recreate_in_same_tx_with_different_balances( let tokens_amount = tokens_amount_after_order_creation; let (fill_amount, filled_amount) = if fill_after_creation { - let fill_amount = if increase_give_balance && rng.gen_bool(0.5) { + let fill_amount = if increase_give_balance && rng.random_bool(0.5) { // Fill the order completely. orig_ask_amount } else { // Fill the order partially. let min_fill_amount = order_min_non_zero_fill_amount(&tf, &orig_order_id, version); Amount::from_atoms( - rng.gen_range(min_fill_amount.into_atoms()..orig_ask_amount.into_atoms()), + rng.random_range(min_fill_amount.into_atoms()..orig_ask_amount.into_atoms()), ) }; let filled_amount = calculate_fill_order(&tf, &orig_order_id, fill_amount, version); @@ -4381,14 +4387,14 @@ fn conclude_and_recreate_in_same_tx_with_different_balances( let new_tokens_amount_to_trade = if increase_give_balance { (remaining_tokens_amount_to_trade - + Amount::from_atoms(rng.gen_range(1u128..tokens_amount.into_atoms()))) + + Amount::from_atoms(rng.random_range(1u128..tokens_amount.into_atoms()))) .unwrap() } else { - Amount::from_atoms(rng.gen_range(1..=remaining_tokens_amount_to_trade.into_atoms())) + Amount::from_atoms(rng.random_range(1..=remaining_tokens_amount_to_trade.into_atoms())) }; let new_coins_amount_to_trade = Amount::from_atoms( - rng.gen_range(1..=remaining_coins_amount_to_trade.into_atoms() * 2 + 100), + rng.random_range(1..=remaining_coins_amount_to_trade.into_atoms() * 2 + 100), ); let new_order_data = OrderData::new( @@ -4459,11 +4465,11 @@ fn get_orders_info_for_rpc_by_currencies_test(#[case] seed: Seed) { // Create 2 fungible tokens and 2 NFTs - let token1_mint_amount = Amount::from_atoms(rng.gen_range(1000..100_000)); + let token1_mint_amount = Amount::from_atoms(rng.random_range(1000..100_000)); let (token1_id, token1_utxo, coins_utxo) = issue_and_mint_token_amount_from_genesis(&mut rng, &mut tf, token1_mint_amount); - let token2_mint_amount = Amount::from_atoms(rng.gen_range(1000..100_000)); + let token2_mint_amount = Amount::from_atoms(rng.random_range(1000..100_000)); let (token2_id, _, coins_utxo) = issue_and_mint_token_amount_from_best_block( &mut rng, &mut tf, @@ -4496,8 +4502,8 @@ fn get_orders_info_for_rpc_by_currencies_test(#[case] seed: Seed) { // Create order 1, which gives token1 for coins - let order1_coin_ask_amount = Amount::from_atoms(rng.gen_range(100..200)); - let order1_token1_give_amount = Amount::from_atoms(rng.gen_range(100..200)); + let order1_coin_ask_amount = Amount::from_atoms(rng.random_range(100..200)); + let order1_token1_give_amount = Amount::from_atoms(rng.random_range(100..200)); let token1_change_amount = (token1_mint_amount - order1_token1_give_amount).unwrap(); let order1_data = OrderData::new( @@ -4523,7 +4529,7 @@ fn get_orders_info_for_rpc_by_currencies_test(#[case] seed: Seed) { // Create order 2, which gives NFT1 for coins - let order2_coin_ask_amount = Amount::from_atoms(rng.gen_range(100..200)); + let order2_coin_ask_amount = Amount::from_atoms(rng.random_range(100..200)); let order2_data = OrderData::new( Destination::AnyoneCanSpend, @@ -4543,7 +4549,7 @@ fn get_orders_info_for_rpc_by_currencies_test(#[case] seed: Seed) { // Create order 3, which gives NFT2 for token2 - let order3_token2_ask_amount = Amount::from_atoms(rng.gen_range(100..200)); + let order3_token2_ask_amount = Amount::from_atoms(rng.random_range(100..200)); let order3_data = OrderData::new( Destination::AnyoneCanSpend, @@ -4563,7 +4569,7 @@ fn get_orders_info_for_rpc_by_currencies_test(#[case] seed: Seed) { // Create order 4, which gives token1 for NFT1 - let order4_token1_give_amount = Amount::from_atoms(rng.gen_range(100..200)); + let order4_token1_give_amount = Amount::from_atoms(rng.random_range(100..200)); let token1_change_amount = (token1_change_amount - order4_token1_give_amount).unwrap(); let order4_data = OrderData::new( @@ -4589,7 +4595,7 @@ fn get_orders_info_for_rpc_by_currencies_test(#[case] seed: Seed) { // Create order 5, which gives coins for NFT2 - let order5_coins_give_amount = Amount::from_atoms(rng.gen_range(100..200)); + let order5_coins_give_amount = Amount::from_atoms(rng.random_range(100..200)); let coins_change_amount = (coins_change_amount - order5_coins_give_amount).unwrap(); let order5_data = OrderData::new( @@ -4615,8 +4621,8 @@ fn get_orders_info_for_rpc_by_currencies_test(#[case] seed: Seed) { // Create order 6, which gives token1 for token2 - let order6_token2_ask_amount = Amount::from_atoms(rng.gen_range(100..200)); - let order6_token1_give_amount = Amount::from_atoms(rng.gen_range(100..200)); + let order6_token2_ask_amount = Amount::from_atoms(rng.random_range(100..200)); + let order6_token1_give_amount = Amount::from_atoms(rng.random_range(100..200)); let token1_change_amount = (token1_change_amount - order6_token1_give_amount).unwrap(); let order6_data = OrderData::new( @@ -4641,8 +4647,8 @@ fn get_orders_info_for_rpc_by_currencies_test(#[case] seed: Seed) { // Create order 7, which gives coins for token2 - let order7_token2_ask_amount = Amount::from_atoms(rng.gen_range(100..200)); - let order7_coins_give_amount = Amount::from_atoms(rng.gen_range(100..200)); + let order7_token2_ask_amount = Amount::from_atoms(rng.random_range(100..200)); + let order7_coins_give_amount = Amount::from_atoms(rng.random_range(100..200)); let coins_change_amount = (coins_change_amount - order7_coins_give_amount).unwrap(); let order7_data = OrderData::new( diff --git a/chainstate/test-suite/src/tests/pos_accounting_reorg.rs b/chainstate/test-suite/src/tests/pos_accounting_reorg.rs index fbf74f7351..03ebc2ee6b 100644 --- a/chainstate/test-suite/src/tests/pos_accounting_reorg.rs +++ b/chainstate/test-suite/src/tests/pos_accounting_reorg.rs @@ -41,7 +41,7 @@ use crypto::{ vrf::{VRFKeyKind, VRFPrivateKey}, }; use pos_accounting::PoSAccountingDeltaData; -use randomness::Rng; +use randomness::RngExt; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; @@ -78,8 +78,9 @@ fn stake_pool_reorg( let genesis_id = tf.genesis().get_id(); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let pledge_amount = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let pledge_amount = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); // prepare tx_a let destination_a = new_pub_key_destination(&mut rng); @@ -649,7 +650,7 @@ fn long_chain_reorg(#[case] seed: Seed) { Amount::ZERO, ); - let mint_amount = Amount::from_atoms(rng.gen_range(100..100_000)); + let mint_amount = Amount::from_atoms(rng.random_range(100..100_000)); let chain_config = chainstate_test_framework::create_chain_config_with_staking_pool( &mut rng, mint_amount, diff --git a/chainstate/test-suite/src/tests/pos_processing_tests.rs b/chainstate/test-suite/src/tests/pos_processing_tests.rs index fd105ab8eb..9076aee649 100644 --- a/chainstate/test-suite/src/tests/pos_processing_tests.rs +++ b/chainstate/test-suite/src/tests/pos_processing_tests.rs @@ -60,7 +60,7 @@ use crypto::{ vrf::{VRFError, VRFKeyKind, VRFPrivateKey, VRFPublicKey}, }; use pos_accounting::PoSAccountingStorageRead; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -77,7 +77,7 @@ const TEST_SEALED_EPOCH_DISTANCE: usize = 0; const MIN_DIFFICULTY: Uint256 = Uint256::MAX; fn add_block_with_stake_pool( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, stake_pool_data: StakePoolData, ) -> (UtxoOutPoint, PoolId) { @@ -106,7 +106,7 @@ fn add_block_with_stake_pool( } fn add_block_with_2_stake_pools( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, stake_pool_data1: StakePoolData, stake_pool_data2: StakePoolData, @@ -169,7 +169,7 @@ fn consensus_upgrades_with_pos_at_height(height: BlockHeight) -> NetUpgrades (TestFramework, UtxoOutPoint, PoolId, PrivateKey) { let net_upgrades = consensus_upgrades_with_pos_at_height(BlockHeight::new(2)); @@ -194,7 +194,7 @@ fn setup_test_chain_with_stake_pool( // Create a chain genesis <- block_1 // block_1 has txs with 2 StakePool output fn setup_test_chain_with_2_stake_pools( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, vrf_pk_1: VRFPublicKey, vrf_pk_2: VRFPublicKey, ) -> ( @@ -221,7 +221,7 @@ fn setup_test_chain_with_2_stake_pools( } fn setup_test_chain_with_2_stake_pools_with_net_upgrades( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, vrf_pk_1: VRFPublicKey, vrf_pk_2: VRFPublicKey, upgrades: Vec<(BlockHeight, ConsensusUpgrade)>, @@ -268,7 +268,7 @@ fn setup_test_chain_with_2_stake_pools_with_net_upgrades( } fn produce_kernel_signature( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &TestFramework, staking_sk: &PrivateKey, reward_outputs: &[TxOutput], @@ -1814,7 +1814,7 @@ fn spend_from_delegation_with_reward(#[case] seed: Seed) { staker_reward_per_block, ); - let amount_to_delegate = Amount::from_atoms(rng.gen_range(100..100_000)); + let amount_to_delegate = Amount::from_atoms(rng.random_range(100..100_000)); // mint amount == amount to delegate to avoid dealing with fees let chain_config = chainstate_test_framework::create_chain_config_with_staking_pool( &mut rng, @@ -1872,7 +1872,8 @@ fn spend_from_delegation_with_reward(#[case] seed: Seed) { .unwrap(); // Process block_3: spend part of the share including reward - let amount_to_withdraw = Amount::from_atoms(rng.gen_range(1..amount_to_delegate.into_atoms())); + let amount_to_withdraw = + Amount::from_atoms(rng.random_range(1..amount_to_delegate.into_atoms())); let tx_input_spend_from_delegation = TxInput::Account(AccountOutPoint::new( AccountNonce::new(0), AccountSpending::DelegationBalance(delegation_id, amount_to_withdraw), @@ -2204,7 +2205,7 @@ fn staker_destination_change(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let pos_height = BlockHeight::new(2); - let block_count_before_fork = rng.gen_range(0..(TEST_EPOCH_LENGTH.get() * 3)); + let block_count_before_fork = rng.random_range(0..(TEST_EPOCH_LENGTH.get() * 3)); let fork_height = BlockHeight::new(pos_height.into_int() + block_count_before_fork); let chain_config = ConfigBuilder::test_chain() .consensus_upgrades(consensus_upgrades_with_pos_at_height(pos_height)) @@ -2292,7 +2293,7 @@ fn staker_destination_change(#[case] seed: Seed) { UtxoOutPoint::new(OutPointSourceId::BlockReward(block_id.into()), 0); pool_balance = new_pool_balance; - tf.progress_time_seconds_since_epoch(rng.gen_range(1..10)); + tf.progress_time_seconds_since_epoch(rng.random_range(1..10)); } (staking_destination, staking_sk) @@ -2336,7 +2337,7 @@ fn staker_destination_change(#[case] seed: Seed) { } // Produce a few blocks without changing the staking destination. - let block_count_after_fork = rng.gen_range(0..(TEST_EPOCH_LENGTH.get() * 3)); + let block_count_after_fork = rng.random_range(0..(TEST_EPOCH_LENGTH.get() * 3)); for _ in 0..block_count_after_fork { let (pos_data, block_timestamp, reward_outputs) = pos_mine( &tf, @@ -2371,7 +2372,7 @@ fn staker_destination_change(#[case] seed: Seed) { stake_pool_outpoint = UtxoOutPoint::new(OutPointSourceId::BlockReward(block_id.into()), 0); pool_balance = new_pool_balance; - tf.progress_time_seconds_since_epoch(rng.gen_range(1..10)); + tf.progress_time_seconds_since_epoch(rng.random_range(1..10)); } // Attempt to change the destination again - it still fails. @@ -2420,7 +2421,7 @@ mod staker_destination_change_test_utils { next_staking_destination: Destination, vrf_sk: &VRFPrivateKey, kernel_outpoint: UtxoOutPoint, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> (PoSData, BlockTimestamp, Vec) { let reward_outputs = vec![TxOutput::ProduceBlockFromStake(next_staking_destination, pool_id)]; diff --git a/chainstate/test-suite/src/tests/processing_tests.rs b/chainstate/test-suite/src/tests/processing_tests.rs index c409f41b42..aa3d4a79e3 100644 --- a/chainstate/test-suite/src/tests/processing_tests.rs +++ b/chainstate/test-suite/src/tests/processing_tests.rs @@ -55,7 +55,7 @@ use crypto::{ key::{KeyKind, PrivateKey}, vrf::{VRFKeyKind, VRFPrivateKey}, }; -use randomness::Rng; +use randomness::RngExt; use rstest::rstest; use test_utils::{ assert_matches, assert_matches_return_val, @@ -446,7 +446,7 @@ fn straight_chain(#[case] seed: Seed) { let mut block_index = GenBlockIndex::genesis(chain_config_clone); let mut prev_blk_id: Id = tf.genesis().get_id().into(); - for _ in 0..rng.gen_range(100..200) { + for _ in 0..rng.random_range(100..200) { assert_eq!(tf.chainstate.get_best_block_id().unwrap(), prev_blk_id); let prev_block_id = block_index.block_id(); let best_block_id = tf.best_block_id(); @@ -973,10 +973,10 @@ fn read_block_reward_from_storage(#[case] seed: Seed) { .get_proof_of_work_config() .reward_maturity_distance(); - let block_reward_output_count = rng.gen::() % 20; + let block_reward_output_count = rng.random_range(0..20); let expected_block_reward = (0..block_reward_output_count) .map(|_| { - let amount = Amount::from_atoms(rng.gen::() % 50); + let amount = Amount::from_atoms(rng.random::() % 50); let pub_key = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr).1; TxOutput::LockThenTransfer( OutputValue::Coin(amount), diff --git a/chainstate/test-suite/src/tests/reorgs_tests.rs b/chainstate/test-suite/src/tests/reorgs_tests.rs index 334933e6ba..4a7bdbebfd 100644 --- a/chainstate/test-suite/src/tests/reorgs_tests.rs +++ b/chainstate/test-suite/src/tests/reorgs_tests.rs @@ -25,7 +25,7 @@ use common::{ chain::{Block, GenBlock, Transaction, UtxoOutPoint}, primitives::{id::Idable, BlockHeight, Id}, }; -use randomness::{CryptoRng, Rng}; +use randomness::CryptoRng; use test_utils::random::{make_seedable_rng, Seed}; // TODO use EventList from helpers instead. @@ -108,7 +108,7 @@ fn test_very_long_reorgs(#[case] seed: Seed) { fn check_spend_tx_in_failed_block( tf: &mut TestFramework, events: &EventList, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) { // Check spending of a transaction in a block which failed to connect // @@ -143,7 +143,7 @@ fn check_spend_tx_in_failed_block( )); } -fn check_spend_tx_in_other_fork(tf: &mut TestFramework, rng: &mut (impl Rng + CryptoRng)) { +fn check_spend_tx_in_other_fork(tf: &mut TestFramework, rng: &mut impl CryptoRng) { // # Attempt to spend a transaction created on a different fork // // +-- 0x4273…c93c (H:7,M,B:9) @@ -176,7 +176,7 @@ fn check_spend_tx_in_other_fork(tf: &mut TestFramework, rng: &mut (impl Rng + Cr )); } -fn check_fork_that_double_spends(tf: &mut TestFramework, rng: &mut (impl Rng + CryptoRng)) { +fn check_fork_that_double_spends(tf: &mut TestFramework, rng: &mut impl CryptoRng) { // # Try to create a fork that double-spends // This is similar to check_spend_tx_in_other_fork, but double spending happens in the // same branch. @@ -216,7 +216,7 @@ fn check_fork_that_double_spends(tf: &mut TestFramework, rng: &mut (impl Rng + C fn check_reorg_to_first_chain( tf: &mut TestFramework, events: &EventList, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) { // ... and back to the first chain. // @@ -278,7 +278,7 @@ fn check_reorg_to_first_chain( fn check_make_alternative_chain_longer( tf: &mut TestFramework, events: &EventList, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) { // Now we add another block to make the alternative chain longer. // @@ -320,7 +320,7 @@ fn check_make_alternative_chain_longer( assert!(tf.is_block_in_main_chain(tf.index_at(4).block_id())); } -fn check_simple_fork(tf: &mut TestFramework, events: &EventList, rng: &mut (impl Rng + CryptoRng)) { +fn check_simple_fork(tf: &mut TestFramework, events: &EventList, rng: &mut impl CryptoRng) { // Fork like this: // // +-- 0x6e45…e8e8 (H:0,B:0) = genesis diff --git a/chainstate/test-suite/src/tests/signature_tests.rs b/chainstate/test-suite/src/tests/signature_tests.rs index b031e9e07d..9e2dedaaac 100644 --- a/chainstate/test-suite/src/tests/signature_tests.rs +++ b/chainstate/test-suite/src/tests/signature_tests.rs @@ -44,7 +44,7 @@ use common::{ primitives::{Amount, BlockHeight, Idable}, }; use crypto::key::{KeyKind, PrivateKey}; -use randomness::{Rng, SliceRandom}; +use randomness::{RngExt as _, SliceRandom}; use serialization::Encode; use test_utils::random::{gen_random_bytes, Seed}; use tx_verifier::error::{InputCheckError, ScriptError}; @@ -190,9 +190,9 @@ fn signed_classical_multisig_tx(#[case] seed: Seed) { let chain_config = tf.chainstate.get_chain_config().clone(); - let min_required_signatures = (rng.gen::() % 10) + 1; + let min_required_signatures = (rng.random::() % 10) + 1; let min_required_signatures: NonZeroU8 = min_required_signatures.try_into().unwrap(); - let total_parties: u8 = (rng.gen::() % 5) + min_required_signatures.get(); + let total_parties: u8 = (rng.random::() % 5) + min_required_signatures.get(); let (priv_keys, pub_keys): (Vec<_>, Vec<_>) = (0..total_parties) .map(|_| PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr)) .unzip(); @@ -356,9 +356,9 @@ fn signed_classical_multisig_tx_missing_sigs(#[case] seed: Seed) { let chain_config = tf.chainstate.get_chain_config().clone(); - let min_required_signatures = (rng.gen::() % 10) + 1; + let min_required_signatures = (rng.random::() % 10) + 1; let min_required_signatures: NonZeroU8 = min_required_signatures.try_into().unwrap(); - let total_parties: u8 = (rng.gen::() % 5) + min_required_signatures.get(); + let total_parties: u8 = (rng.random::() % 5) + min_required_signatures.get(); let (priv_keys, pub_keys): (Vec<_>, Vec<_>) = (0..total_parties) .map(|_| PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr)) .unzip(); @@ -519,7 +519,7 @@ fn too_large_no_sig_data(#[case] seed: Seed, #[case] valid_size: bool) { }; { - let data: Vec = (0..data_size).map(|_| rng.gen::()).collect(); + let data: Vec = (0..data_size).map(|_| rng.random::()).collect(); let tx = TransactionBuilder::new() .add_input( @@ -598,7 +598,7 @@ fn no_sig_data_not_allowed( let max_no_sig_data_size = tf.chainstate.get_chain_config().data_in_no_signature_witness_max_size(); - let data: Vec = (0..max_no_sig_data_size).map(|_| rng.gen::()).collect(); + let data: Vec = (0..max_no_sig_data_size).map(|_| rng.random::()).collect(); let data = if data_provided { Some(data) } else { None }; let tx = TransactionBuilder::new() diff --git a/chainstate/test-suite/src/tests/stake_pool_tests.rs b/chainstate/test-suite/src/tests/stake_pool_tests.rs index b7029f76f6..9ac987b795 100644 --- a/chainstate/test-suite/src/tests/stake_pool_tests.rs +++ b/chainstate/test-suite/src/tests/stake_pool_tests.rs @@ -44,7 +44,7 @@ use crypto::{ vrf::{VRFKeyKind, VRFPrivateKey}, }; use pos_accounting::PoSAccountingStorageRead; -use randomness::Rng; +use randomness::RngExt; use test_utils::{ random::{make_seedable_rng, Seed}, token_utils::random_token_issuance_v1, @@ -62,8 +62,9 @@ fn stake_pool_basic(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(&mut rng, amount_to_stake, vrf_pk); @@ -106,8 +107,9 @@ fn stake_pool_and_spend_coin_same_tx(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(&mut rng, amount_to_stake, vrf_pk); let genesis_outpoint = UtxoOutPoint::new( @@ -123,7 +125,7 @@ fn stake_pool_and_spend_coin_same_tx(#[case] seed: Seed) { Box::new(stake_pool_data), )) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(100_000..200_000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(100_000..200_000))), anyonecanspend_address(), )) .build(); @@ -147,8 +149,9 @@ fn stake_pool_and_issue_tokens_same_tx(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(&mut rng, amount_to_stake, vrf_pk); let genesis_outpoint = UtxoOutPoint::new( @@ -192,8 +195,9 @@ fn stake_pool_and_mint_tokens_same_tx(#[case] seed: Seed) { let amount_to_mint = Amount::from_atoms(100); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let tx0 = TransactionBuilder::new() .add_input( TxInput::from_utxo( @@ -286,8 +290,9 @@ fn stake_pool_twice(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(&mut rng, amount_to_stake, vrf_pk); let genesis_outpoint = UtxoOutPoint::new( @@ -334,8 +339,9 @@ fn stake_pool_twice_two_blocks(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(&mut rng, amount_to_stake, vrf_pk); let genesis_outpoint = UtxoOutPoint::new( @@ -385,8 +391,9 @@ fn stake_pool_twice_two_txs(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(&mut rng, amount_to_stake, vrf_pk); let genesis_outpoint = UtxoOutPoint::new( @@ -494,7 +501,7 @@ fn stake_pool_not_enough_pledge(#[case] seed: Seed) { let min_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge(); // invalid case - let amount_to_stake = Amount::from_atoms(rng.gen_range(1..min_pledge.into_atoms())); + let amount_to_stake = Amount::from_atoms(rng.random_range(1..min_pledge.into_atoms())); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker( &mut rng, amount_to_stake, @@ -548,8 +555,9 @@ fn decommission_from_stake_pool(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(&mut rng, amount_to_stake, vrf_pk); @@ -642,8 +650,9 @@ fn decommission_from_stake_pool_same_block(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(&mut rng, amount_to_stake, vrf_pk); @@ -708,8 +717,9 @@ fn decommission_from_stake_pool_with_staker_key(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let stake_pool_data = StakePoolData::new( amount_to_stake, diff --git a/chainstate/test-suite/src/tests/syncing_tests.rs b/chainstate/test-suite/src/tests/syncing_tests.rs index 0078b3d212..77b6346236 100644 --- a/chainstate/test-suite/src/tests/syncing_tests.rs +++ b/chainstate/test-suite/src/tests/syncing_tests.rs @@ -34,7 +34,7 @@ use common::{ Uint256, }; use logging::log; -use randomness::Rng; +use randomness::RngExt; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -74,7 +74,7 @@ fn get_locator_from_best_block(#[case] seed: Seed) { let mut blocks = 1; let mut last_block_id: Id = btf.genesis().get_id().into(); for _ in 0..8 { - let new_blocks = rng.gen_range(1..2000); + let new_blocks = rng.random_range(1..2000); last_block_id = btf.create_chain(&last_block_id, new_blocks, &mut rng).unwrap(); blocks += new_blocks; @@ -116,11 +116,11 @@ fn get_locator_from_height(#[case] seed: Seed) { .with_chainstate_config(ChainstateConfig::new().with_heavy_checks_enabled(false)) .build(); - let blocks = rng.gen_range(1001..2000); + let blocks = rng.random_range(1001..2000); btf.create_chain(&btf.genesis().get_id().into(), blocks, &mut rng).unwrap(); for _ in 0..8 { - let height = rng.gen_range(1000..blocks) as u64; + let height = rng.random_range(1000..blocks) as u64; // Check the locator length. let locator = btf.chainstate.get_locator_from_height(height.into()).unwrap(); @@ -171,9 +171,9 @@ fn get_locator_from_block_id(#[case] seed: Seed) { ) .build(); - let mainchain_len: usize = rng.gen_range(1000..2000); - let stalechain_len = rng.gen_range(mainchain_len / 2..mainchain_len); - let fork_height = rng.gen_range(0..stalechain_len); + let mainchain_len: usize = rng.random_range(1000..2000); + let stalechain_len = rng.random_range(mainchain_len / 2..mainchain_len); + let fork_height = rng.random_range(0..stalechain_len); let mainchain_block_ids = tf1 .create_chain_return_ids(&tf1.genesis().get_id().into(), mainchain_len, &mut rng) @@ -211,7 +211,7 @@ fn get_locator_from_block_id(#[case] seed: Seed) { assert_eq!(tf2.best_block_id(), *stale_branch_block_ids.last().unwrap()); for _ in 0..8 { - let stale_block_idx = rng.gen_range(0..stale_branch_block_ids.len()); + let stale_block_idx = rng.random_range(0..stale_branch_block_ids.len()); let height = (stale_block_idx + fork_height + 1) as u64; let stale_block_id = tf1.to_chain_block_id(&stale_branch_block_ids[stale_block_idx]); @@ -233,9 +233,9 @@ fn get_locator_from_block_id(#[case] seed: Seed) { fn get_mainchain_headers_by_locator(#[case] seed: Seed) { utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); - let header_limit = rng.gen_range(1500..=2000); - let headers_count = rng.gen_range(1000..header_limit); - let blocks_count = rng.gen_range(1000..2000); + let header_limit = rng.random_range(1500..=2000); + let headers_count = rng.random_range(1000..header_limit); + let blocks_count = rng.random_range(1000..2000); let mut tf = TestFramework::builder(&mut rng) // With the heavy checks enabled, this test takes a few minutes to complete in debug builds. @@ -298,16 +298,16 @@ fn get_headers_genesis(#[case] seed: Seed) { .build(); let genesis_id: Id = btf.genesis().get_id().into(); - btf.create_chain(&genesis_id, rng.gen_range(64..128), &mut rng).unwrap(); + btf.create_chain(&genesis_id, rng.random_range(64..128), &mut rng).unwrap(); let locator_1 = btf.chainstate.get_locator_from_best_block().unwrap(); - let chain_length = rng.gen_range(1200..2000); + let chain_length = rng.random_range(1200..2000); btf.create_chain(&genesis_id, chain_length, &mut rng).unwrap(); let locator_2 = btf.chainstate.get_locator_from_best_block().unwrap(); assert_ne!(locator_1, locator_2); assert!(locator_1.len() < locator_2.len()); - let header_count_limit = rng.gen_range(chain_length..chain_length * 2); + let header_count_limit = rng.random_range(chain_length..chain_length * 2); let headers = btf .chainstate .get_mainchain_headers_by_locator(&locator_1, header_count_limit) @@ -325,7 +325,7 @@ fn get_headers_genesis(#[case] seed: Seed) { fn get_headers_branching_chains(#[case] seed: Seed) { utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); - let common_height = rng.gen_range(100..1000); + let common_height = rng.random_range(100..1000); let mut tf = TestFramework::builder(&mut rng) .with_chain_config( @@ -341,9 +341,9 @@ fn get_headers_branching_chains(#[case] seed: Seed) { let common_block_id = tf.create_chain(&tf.genesis().get_id().into(), common_height, &mut rng).unwrap(); - tf.create_chain(&common_block_id, rng.gen_range(100..250), &mut rng).unwrap(); + tf.create_chain(&common_block_id, rng.random_range(100..250), &mut rng).unwrap(); let locator = tf.chainstate.get_locator_from_best_block().unwrap(); - tf.create_chain(&common_block_id, rng.gen_range(250..500), &mut rng).unwrap(); + tf.create_chain(&common_block_id, rng.random_range(250..500), &mut rng).unwrap(); let headers = tf.chainstate.get_mainchain_headers_by_locator(&locator, 2000).unwrap(); let id = headers[0].prev_block_id(); @@ -612,7 +612,7 @@ fn get_headers_different_chains(#[case] seed: Seed) { tf2.outputs_from_genblock(tf2.genesis().get_id().into()) ); let mut prev_id = tf1.genesis().get_id().into(); - for _ in 0..rng.gen_range(100..250) { + for _ in 0..rng.random_range(100..250) { let block = tf1 .make_block_builder() .with_parent(prev_id) @@ -624,10 +624,10 @@ fn get_headers_different_chains(#[case] seed: Seed) { assert_eq!(tf1.best_block_id(), tf2.best_block_id()); } - tf1.create_chain(&prev_id, rng.gen_range(32..256), &mut rng).unwrap(); - tf2.create_chain(&prev_id, rng.gen_range(256..512), &mut rng).unwrap(); + tf1.create_chain(&prev_id, rng.random_range(32..256), &mut rng).unwrap(); + tf2.create_chain(&prev_id, rng.random_range(256..512), &mut rng).unwrap(); - let header_count_limit = rng.gen_range(1000..3000); + let header_count_limit = rng.random_range(1000..3000); let locator = tf1.chainstate.get_locator_from_best_block().unwrap(); let headers = tf2 .chainstate @@ -1077,7 +1077,7 @@ fn get_block_ids_as_checkpoints(#[case] seed: Seed) { fn preliminary_checks_for_existing_block(#[case] seed: Seed) { utils::concurrency::model(move || { let mut rng = make_seedable_rng(seed); - let max_reorg_limit: usize = rng.gen_range(10..20); + let max_reorg_limit: usize = rng.random_range(10..20); let mut tf = TestFramework::builder(&mut rng) .with_chain_config( @@ -1089,14 +1089,14 @@ fn preliminary_checks_for_existing_block(#[case] seed: Seed) { let genesis_id = tf.genesis().get_id().into(); // This will be the full chain length. - let chain_len = rng.gen_range(max_reorg_limit + 1..max_reorg_limit * 2); + let chain_len = rng.random_range(max_reorg_limit + 1..max_reorg_limit * 2); // This is the lowest-height parent block, whose children will still be considered // above the reorg limit after the full chain is constructed. let first_parent_height_above_reorg_limit = chain_len - max_reorg_limit; // The height of the parent block, whose children will be considered below the // reorg limit (after the full chain is constructed). let parent_height_below_reorg_limit = - rng.gen_range(0..first_parent_height_above_reorg_limit); + rng.random_range(0..first_parent_height_above_reorg_limit); // Create the first part of the chain - until height_below_reorg_limit. let parent_below_reorg_limit_id = if parent_height_below_reorg_limit != 0 { @@ -1196,7 +1196,7 @@ fn preliminary_checks_for_existing_block(#[case] seed: Seed) { // Note: the height is below the tip height, since we want to get a child of this block. let parent_height_above_reorg_limit = - rng.gen_range(first_parent_height_above_reorg_limit..chain_len); + rng.random_range(first_parent_height_above_reorg_limit..chain_len); let parent_above_reorg_limit_id = tf.block_id(parent_height_above_reorg_limit as u64); // Create a bad block at a height above the reorg limit. @@ -1233,7 +1233,7 @@ fn preliminary_checks_for_existing_block(#[case] seed: Seed) { // Currently our good blocks are at the CheckBlockOk validation stage. // Optionally, force set it to FullyChecked, the expected results remain the same. - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { log::debug!("Resetting good block statuses to fully checked"); tf.set_block_status( diff --git a/chainstate/test-suite/src/tests/tokens_misc_tests.rs b/chainstate/test-suite/src/tests/tokens_misc_tests.rs index 48bdfd4f55..38a92f95ec 100644 --- a/chainstate/test-suite/src/tests/tokens_misc_tests.rs +++ b/chainstate/test-suite/src/tests/tokens_misc_tests.rs @@ -16,7 +16,6 @@ use std::collections::{BTreeMap, BTreeSet}; use itertools::Itertools as _; -use rand::seq::IteratorRandom as _; use rstest::rstest; use chainstate::{ChainstateError, PropertyQueryError}; @@ -33,6 +32,7 @@ use common::{ }, primitives::{Amount, BlockHeight, Idable}, }; +use randomness::seq::IteratorRandom as _; use test_utils::{ assert_matches_return_val, random::{make_seedable_rng, Seed}, @@ -200,8 +200,8 @@ fn get_tokens_info_for_rpc_test(#[case] seed: Seed) { // Check obtaining the info for 2, 3 and all the tokens simultaneously for test_set in [ - all_expected_infos.iter().choose_multiple(&mut rng, 2), - all_expected_infos.iter().choose_multiple(&mut rng, 3), + all_expected_infos.iter().sample(&mut rng, 2), + all_expected_infos.iter().sample(&mut rng, 3), all_expected_infos.iter().collect_vec(), ] { // Collect the test set into a BTreeMap, so that the expected infos are sorted diff --git a/chainstate/test-suite/src/tests/tx_fee.rs b/chainstate/test-suite/src/tests/tx_fee.rs index f3582c6c52..f897869e78 100644 --- a/chainstate/test-suite/src/tests/tx_fee.rs +++ b/chainstate/test-suite/src/tests/tx_fee.rs @@ -40,7 +40,7 @@ use randomness::CryptoRng; use test_utils::random_ascii_alphanumeric_string; use tx_verifier::transaction_verifier::{TransactionSourceForConnect, TransactionVerifier}; -fn setup(rng: &mut (impl Rng + CryptoRng)) -> (ChainConfig, InMemoryStorageWrapper, TestFramework) { +fn setup(rng: &mut impl CryptoRng) -> (ChainConfig, InMemoryStorageWrapper, TestFramework) { let storage = TestStore::new_empty().unwrap(); let chain_config = create_unit_test_config(); @@ -61,7 +61,7 @@ fn simple_fee_from_coin_transfer(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let (chain_config, storage, tf) = setup(&mut rng); - let transfer_atoms = rng.gen_range(1..100_000); + let transfer_atoms = rng.random_range(1..100_000); let genesis_amount = chainstate_test_framework::get_output_value(&tf.genesis().utxos()[0]) .unwrap() .coin_amount() @@ -110,9 +110,9 @@ fn transfer_lock_and_burn_outputs_fee(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let (chain_config, storage, tf) = setup(&mut rng); - let locked_atoms = rng.gen_range(1..100_000); - let not_locked_atoms = rng.gen_range(1..100_000); - let burned_atoms = rng.gen_range(1..100_000); + let locked_atoms = rng.random_range(1..100_000); + let not_locked_atoms = rng.random_range(1..100_000); + let burned_atoms = rng.random_range(1..100_000); let genesis_amount = chainstate_test_framework::get_output_value(&tf.genesis().utxos()[0]) .unwrap() .coin_amount() @@ -182,7 +182,7 @@ fn locked_outputs_can_go_to_fee(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let (chain_config, storage, mut tf) = setup(&mut rng); - let locked_atoms = rng.gen_range(1..100_000); + let locked_atoms = rng.random_range(1..100_000); let timelock_secs = 10; let locked_outputs = test_utils::split_value(&mut rng, locked_atoms) .into_iter() @@ -206,7 +206,7 @@ fn locked_outputs_can_go_to_fee(#[case] seed: Seed) { let tx_id = tx.transaction().get_id(); tf.make_block_builder().add_transaction(tx).build_and_process(&mut rng).unwrap(); - let not_locked_atoms = rng.gen_range(1..=locked_atoms); + let not_locked_atoms = rng.random_range(1..=locked_atoms); let expected_fee = Fee(Amount::from_atoms(locked_atoms - not_locked_atoms)); let not_locked_outputs = test_utils::split_value(&mut rng, not_locked_atoms) @@ -260,8 +260,9 @@ fn create_stake_pool(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(&mut rng, amount_to_stake, vrf_pk); @@ -308,11 +309,12 @@ fn delegate_staking(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(&mut rng, amount_to_stake, vrf_pk); - let delegated_atoms = rng.gen_range(1..100_000); + let delegated_atoms = rng.random_range(1..100_000); let stake_pool_outpoint = UtxoOutPoint::new(tf.genesis().get_id().into(), 0); let pool_id = PoolId::from_utxo(&stake_pool_outpoint); @@ -394,8 +396,9 @@ fn fee_from_decommissioning_stake_pool(#[case] seed: Seed) { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let min_stake_pool_pledge = tf.chainstate.get_chain_config().min_stake_pool_pledge().into_atoms(); - let amount_to_stake = - Amount::from_atoms(rng.gen_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10))); + let amount_to_stake = Amount::from_atoms( + rng.random_range(min_stake_pool_pledge..(min_stake_pool_pledge * 10)), + ); let (stake_pool_data, _) = create_stake_pool_data_with_all_reward_to_staker(&mut rng, amount_to_stake, vrf_pk); @@ -421,7 +424,7 @@ fn fee_from_decommissioning_stake_pool(#[case] seed: Seed) { .build(); let required_maturity_distance = chain_config.staking_pool_spend_maturity_block_count(BlockHeight::new(2)); - let maturity_distance = rng.gen_range( + let maturity_distance = rng.random_range( required_maturity_distance.to_int()..(required_maturity_distance.to_int() * 2), ); @@ -481,7 +484,7 @@ fn fee_from_spending_delegation_share(#[case] seed: Seed) { let stake_pool_outpoint = UtxoOutPoint::new(tf.genesis().get_id().into(), 0); let pool_id = PoolId::from_utxo(&stake_pool_outpoint); let delegation_id = DelegationId::from_utxo(&stake_pool_outpoint); - let amount_to_delegate = Amount::from_atoms(rng.gen_range(1..100_000)); + let amount_to_delegate = Amount::from_atoms(rng.random_range(1..100_000)); let delegate_staking_tx = TransactionBuilder::new() .add_input(TxInput::Utxo(stake_pool_outpoint), empty_witness(&mut rng)) @@ -507,7 +510,7 @@ fn fee_from_spending_delegation_share(#[case] seed: Seed) { .build(); let required_maturity_distance = chain_config.staking_pool_spend_maturity_block_count(BlockHeight::new(2)); - let maturity_distance = rng.gen_range( + let maturity_distance = rng.random_range( required_maturity_distance.to_int()..(required_maturity_distance.to_int() * 2), ); @@ -583,7 +586,7 @@ fn issue_fungible_token_v0(#[case] seed: Seed) { let issuance = TokenIssuanceV0 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), amount_to_issue: Amount::from_atoms(100), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), }; @@ -633,7 +636,7 @@ fn issue_fungible_token_v1(#[case] seed: Seed) { let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::AnyoneCanSpend, @@ -681,7 +684,7 @@ fn tokens_cannot_be_used_in_fee(#[case] seed: Seed) { let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(&mut rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(&mut rng, 1..1024).as_bytes().to_vec(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::AnyoneCanSpend, @@ -709,7 +712,7 @@ fn tokens_cannot_be_used_in_fee(#[case] seed: Seed) { ) .unwrap(); - let amount_to_mint = Amount::from_atoms(rng.gen_range(1..100_000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(1..100_000)); let token_mint_tx = TransactionBuilder::new() .add_input( TxInput::from_utxo(token_issuance_tx_id.into(), 1), diff --git a/chainstate/test-suite/src/tests/tx_verification_simulation.rs b/chainstate/test-suite/src/tests/tx_verification_simulation.rs index 70228559fa..db1c22ce96 100644 --- a/chainstate/test-suite/src/tests/tx_verification_simulation.rs +++ b/chainstate/test-suite/src/tests/tx_verification_simulation.rs @@ -55,10 +55,10 @@ fn simulation(#[case] seed: Seed, #[case] max_blocks: usize, #[case] max_tx_per_ )]; let consensus_upgrades = NetUpgrades::initialize(upgrades).expect("valid net-upgrades"); - let epoch_length = NonZeroU64::new(rng.gen_range(1..10)).unwrap(); - let sealed_epoch_distance_from_tip = rng.gen_range(1..10); + let epoch_length = NonZeroU64::new(rng.random_range(1..10)).unwrap(); + let sealed_epoch_distance_from_tip = rng.random_range(1..10); let token_id_generation_v1_fork_height = - BlockHeight::new(rng.gen_range(1..=max_blocks + 1) as u64); + BlockHeight::new(rng.random_range(1..=max_blocks + 1) as u64); let chain_config = config_builder .consensus_upgrades(consensus_upgrades) .max_future_block_time_offset(Some(std::time::Duration::from_secs(1_000_000))) @@ -130,12 +130,12 @@ fn simulation(#[case] seed: Seed, #[case] max_blocks: usize, #[case] max_tx_per_ // Generate a random chain let mut all_blocks = Vec::new(); - let blocks_to_generate = rng.gen_range((max_blocks / 2)..max_blocks); - let reorg_at_height = rng.gen_range(0..blocks_to_generate); + let blocks_to_generate = rng.random_range((max_blocks / 2)..max_blocks); + let reorg_at_height = rng.random_range(0..blocks_to_generate); for i in 0..blocks_to_generate { let mut block_builder = tf.make_pos_block_builder().with_random_staking_pool(&mut rng); - for _ in 0..rng.gen_range(10..max_tx_per_block) { + for _ in 0..rng.random_range(10..max_tx_per_block) { block_builder = block_builder.add_test_transaction(&mut rng); } @@ -172,7 +172,7 @@ fn simulation(#[case] seed: Seed, #[case] max_blocks: usize, #[case] max_tx_per_ for _ in reorg_at_height..max_blocks { let mut block_builder = tf2.make_pos_block_builder().with_random_staking_pool(&mut rng); - for _ in 0..rng.gen_range(10..max_tx_per_block) { + for _ in 0..rng.random_range(10..max_tx_per_block) { block_builder = block_builder.add_test_transaction(&mut rng); } diff --git a/chainstate/test-suite/src/tests/tx_verifier_disconnect.rs b/chainstate/test-suite/src/tests/tx_verifier_disconnect.rs index 722e16be06..3639d77531 100644 --- a/chainstate/test-suite/src/tests/tx_verifier_disconnect.rs +++ b/chainstate/test-suite/src/tests/tx_verifier_disconnect.rs @@ -34,7 +34,7 @@ use tx_verifier::{ transaction_verifier::{TransactionSource, TransactionSourceForConnect, TransactionVerifier}, }; -fn setup(rng: &mut (impl Rng + CryptoRng)) -> (ChainConfig, InMemoryStorageWrapper, TestFramework) { +fn setup(rng: &mut impl CryptoRng) -> (ChainConfig, InMemoryStorageWrapper, TestFramework) { let storage = TestStore::new_empty().unwrap(); let tf = TestFramework::builder(rng).with_storage(storage.clone()).build(); diff --git a/chainstate/tx-verifier/src/transaction_verifier/input_output_policy/tests/constraints_tests.rs b/chainstate/tx-verifier/src/transaction_verifier/input_output_policy/tests/constraints_tests.rs index 9168e05f7e..56cd25f424 100644 --- a/chainstate/tx-verifier/src/transaction_verifier/input_output_policy/tests/constraints_tests.rs +++ b/chainstate/tx-verifier/src/transaction_verifier/input_output_policy/tests/constraints_tests.rs @@ -15,6 +15,8 @@ use std::{collections::BTreeMap, ops::Range}; +use rstest::rstest; + use common::{ chain::{ config::ChainType, output_value::OutputValue, stakelock::StakePoolData, @@ -26,8 +28,7 @@ use common::{ use crypto::vrf::{VRFKeyKind, VRFPrivateKey}; use orders_accounting::{InMemoryOrdersAccounting, OrdersAccountingDB}; use pos_accounting::DelegationData; -use randomness::{CryptoRng, Rng, SliceRandom}; -use rstest::rstest; +use randomness::{CryptoRng, Rng, RngExt as _, SliceRandom}; use test_utils::{ random::{make_seedable_rng, Seed}, split_value, @@ -44,13 +45,13 @@ fn random_input_utxos( split_value(rng, total_input_atoms) .into_iter() .map(|v| { - if rng.gen::() { + if rng.random::() { TxOutput::Transfer( OutputValue::Coin(Amount::from_atoms(v)), Destination::AnyoneCanSpend, ) } else { - let lock = rng.gen_range(timelock_range.clone()); + let lock = rng.random_range(timelock_range.clone()); TxOutput::LockThenTransfer( OutputValue::Coin(Amount::from_atoms(v)), Destination::AnyoneCanSpend, @@ -61,7 +62,7 @@ fn random_input_utxos( .collect() } -fn create_stake_pool_data(rng: &mut (impl Rng + CryptoRng), atoms_to_stake: u128) -> StakePoolData { +fn create_stake_pool_data(rng: &mut impl CryptoRng, atoms_to_stake: u128) -> StakePoolData { let (_, vrf_pub_key) = VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel); StakePoolData::new( Amount::from_atoms(atoms_to_stake), @@ -87,11 +88,11 @@ fn timelock_constraints_on_decommission_in_tx(#[case] seed: Seed) { chain_config.staking_pool_spend_maturity_block_count(BlockHeight::new(1)); let mut rng = make_seedable_rng(seed); - let number_of_inputs = rng.gen_range(0..10); - let number_of_outputs = rng.gen_range(0..10); + let number_of_inputs = rng.random_range(0..10); + let number_of_outputs = rng.random_range(0..10); let pool_id = PoolId::new(H256::zero()); - let staked_atoms = rng.gen_range(100..1000); + let staked_atoms = rng.random_range(100..1000); let stake_pool_data = create_stake_pool_data(&mut rng, staked_atoms); let pos_store = pos_accounting::InMemoryPoSAccounting::from_values( @@ -109,13 +110,13 @@ fn timelock_constraints_on_decommission_in_tx(#[case] seed: Seed) { let tokens_store = tokens_accounting::InMemoryTokensAccounting::new(); let tokens_db = tokens_accounting::TokensAccountingDB::new(&tokens_store); - let decommission_pool_utxo = if rng.gen::() { + let decommission_pool_utxo = if rng.random::() { TxOutput::CreateStakePool(pool_id, Box::new(stake_pool_data)) } else { produce_block() }; - let transferred_atoms = rng.gen_range(0..1000); + let transferred_atoms = rng.random_range(0..1000); let input_utxos = { let mut outputs = random_input_utxos( @@ -132,11 +133,11 @@ fn timelock_constraints_on_decommission_in_tx(#[case] seed: Seed) { // try to unlock random value { - let random_additional_value = rng.gen_range(1..100); + let random_additional_value = rng.random_range(1..100); let timelocked_outputs = split_value(&mut rng, staked_atoms - random_additional_value) .iter() .map(|atoms| { - let random_additional_value = rng.gen_range(0..10u64); + let random_additional_value = rng.random_range(0..10u64); TxOutput::LockThenTransfer( OutputValue::Coin(Amount::from_atoms(*atoms)), Destination::AnyoneCanSpend, @@ -192,7 +193,7 @@ fn timelock_constraints_on_decommission_in_tx(#[case] seed: Seed) { let timelocked_outputs = split_value(&mut rng, staked_atoms) .iter() .map(|atoms| { - let random_additional_distance = rng.gen_range(0..10); + let random_additional_distance = rng.random_range(0..10); TxOutput::LockThenTransfer( OutputValue::Coin(Amount::from_atoms(*atoms)), Destination::AnyoneCanSpend, @@ -242,13 +243,13 @@ fn timelock_constraints_on_spend_share_in_tx(#[case] seed: Seed) { .to_int(); let mut rng = make_seedable_rng(seed); - let number_of_outputs = rng.gen_range(0..10); + let number_of_outputs = rng.random_range(0..10); let delegation_id = DelegationId::new(H256::zero()); let delegation_data = DelegationData::new(PoolId::new(H256::zero()), Destination::AnyoneCanSpend); - let delegated_atoms = rng.gen_range(1..1000); - let atoms_to_spend = rng.gen_range(1..=delegated_atoms); + let delegated_atoms = rng.random_range(1..1000); + let atoms_to_spend = rng.random_range(1..=delegated_atoms); let pos_store = pos_accounting::InMemoryPoSAccounting::from_values( BTreeMap::new(), @@ -268,11 +269,11 @@ fn timelock_constraints_on_spend_share_in_tx(#[case] seed: Seed) { // make timelock outputs but total atoms that locked is less than required { - let random_additional_value = rng.gen_range(1..=atoms_to_spend); + let random_additional_value = rng.random_range(1..=atoms_to_spend); let timelocked_outputs = split_value(&mut rng, atoms_to_spend - random_additional_value) .iter() .map(|atoms| { - let random_additional_distance = rng.gen_range(0..10); + let random_additional_distance = rng.random_range(0..10); TxOutput::LockThenTransfer( OutputValue::Coin(Amount::from_atoms(*atoms)), Destination::AnyoneCanSpend, @@ -330,7 +331,7 @@ fn timelock_constraints_on_spend_share_in_tx(#[case] seed: Seed) { let timelocked_outputs = split_value(&mut rng, atoms_to_spend) .iter() .map(|atoms| { - let random_additional_distance = rng.gen_range(0..10); + let random_additional_distance = rng.random_range(0..10); TxOutput::LockThenTransfer( OutputValue::Coin(Amount::from_atoms(*atoms)), Destination::AnyoneCanSpend, diff --git a/chainstate/tx-verifier/src/transaction_verifier/input_output_policy/tests/purpose_tests.rs b/chainstate/tx-verifier/src/transaction_verifier/input_output_policy/tests/purpose_tests.rs index 2cb9c8fc24..004c2f19b8 100644 --- a/chainstate/tx-verifier/src/transaction_verifier/input_output_policy/tests/purpose_tests.rs +++ b/chainstate/tx-verifier/src/transaction_verifier/input_output_policy/tests/purpose_tests.rs @@ -25,7 +25,7 @@ use common::{ primitives::{per_thousand::PerThousand, Id, H256}, }; use crypto::key::{KeyKind, PrivateKey}; -use randomness::{Rng, SliceRandom}; +use randomness::{RngExt as _, SliceRandom}; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -49,8 +49,8 @@ fn tx_stake_multiple_pools(#[case] seed: Seed) { let inputs = get_random_outputs_combination(&mut rng, &source_inputs, 1); - let number_of_valid_outputs = rng.gen_range(0..10); - let number_of_invalid_outputs = rng.gen_range(2..10); + let number_of_valid_outputs = rng.random_range(0..10); + let number_of_invalid_outputs = rng.random_range(2..10); let outputs = get_random_outputs_combination(&mut rng, &source_valid_outputs, number_of_valid_outputs) .into_iter() @@ -84,8 +84,8 @@ fn tx_create_multiple_delegations(#[case] seed: Seed) { let inputs = get_random_outputs_combination(&mut rng, &source_inputs, 1); - let number_of_valid_outputs = rng.gen_range(0..10); - let number_of_invalid_outputs = rng.gen_range(2..10); + let number_of_valid_outputs = rng.random_range(0..10); + let number_of_invalid_outputs = rng.random_range(2..10); let outputs = get_random_outputs_combination(&mut rng, &source_valid_outputs, number_of_valid_outputs) .into_iter() @@ -111,8 +111,8 @@ fn tx_create_multiple_delegations(#[case] seed: Seed) { #[case(Seed::from_entropy())] fn tx_many_to_many_valid(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let number_of_inputs = rng.gen_range(1..10); - let number_of_outputs = rng.gen_range(1..10); + let number_of_inputs = rng.random_range(1..10); + let number_of_outputs = rng.random_range(1..10); let valid_inputs = valid_tx_inputs_utxos(); // stake pool and create delegation are skipped to avoid dealing with uniqueness @@ -144,8 +144,8 @@ fn tx_many_to_many_valid(#[case] seed: Seed) { #[case(Seed::from_entropy())] fn tx_many_to_many_valid_with_account_input(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let number_of_inputs = rng.gen_range(1..10); - let number_of_outputs = rng.gen_range(1..10); + let number_of_inputs = rng.random_range(1..10); + let number_of_outputs = rng.random_range(1..10); let account_inputs = all_account_inputs(); // stake pool and create delegation are skipped to avoid dealing with uniqueness @@ -193,8 +193,8 @@ fn tx_many_to_many_valid_with_account_input(#[case] seed: Seed) { #[case(Seed::from_entropy())] fn tx_many_to_many_invalid_inputs(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let number_of_inputs = rng.gen_range(1..10); - let number_of_outputs = rng.gen_range(1..10); + let number_of_inputs = rng.random_range(1..10); + let number_of_outputs = rng.random_range(1..10); let valid_inputs = super::outputs_utils::valid_tx_inputs_utxos(); let valid_outputs = super::outputs_utils::valid_tx_outputs(); @@ -230,8 +230,8 @@ fn tx_many_to_many_invalid_inputs(#[case] seed: Seed) { #[case(Seed::from_entropy())] fn produce_block_in_tx_output(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let number_of_inputs = rng.gen_range(1..10); - let number_of_outputs = rng.gen_range(1..10); + let number_of_inputs = rng.random_range(1..10); + let number_of_outputs = rng.random_range(1..10); let valid_inputs = super::outputs_utils::valid_tx_inputs_utxos(); let valid_outputs = super::outputs_utils::valid_tx_outputs(); @@ -270,7 +270,7 @@ fn tx_create_pool_and_delegation_same_tx(#[case] seed: Seed) { let outputs = [stake_pool(), create_delegation()]; let mut rng = make_seedable_rng(seed); - let number_of_inputs = rng.gen_range(2..10); + let number_of_inputs = rng.random_range(2..10); let input_utxos = get_random_outputs_combination(&mut rng, &source_inputs, number_of_inputs); let (utxo_db, tx) = prepare_utxos_and_tx(&mut rng, input_utxos, outputs.to_vec()); @@ -296,7 +296,7 @@ fn reward_one_to_one(#[case] seed: Seed) { ); let block = make_block(vec![outpoint.into()], vec![output.clone()]); - let block_height = BlockHeight::new(rng.gen()); + let block_height = BlockHeight::new(rng.random()); let result = check_reward_inputs_outputs_purposes( &chain_config, @@ -335,7 +335,7 @@ fn reward_one_to_none(#[case] seed: Seed) { ); let block = make_block(vec![outpoint.into()], vec![]); - let block_height = BlockHeight::new(rng.gen()); + let block_height = BlockHeight::new(rng.random()); let res = check_reward_inputs_outputs_purposes( &chain_config, @@ -360,13 +360,13 @@ fn reward_none_to_any(#[case] seed: Seed) { let chain_config = chain::config::Builder::test_chain().build(); let best_block_id: Id = Id::new(H256::random_using(&mut rng)); let utxo_db = UtxosDBInMemoryImpl::new(best_block_id, BTreeMap::new()); - let block_height = BlockHeight::new(rng.gen()); + let block_height = BlockHeight::new(rng.random()); { // valid cases let valid_purposes = [lock_then_transfer()]; - let number_of_outputs = rng.gen_range(1..10); + let number_of_outputs = rng.random_range(1..10); let outputs = get_random_outputs_combination(&mut rng, &valid_purposes, number_of_outputs); let block = make_block_no_kernel(outputs); @@ -384,7 +384,7 @@ fn reward_none_to_any(#[case] seed: Seed) { // invalid cases let invalid_purposes = invalid_block_reward_for_pow(); - let number_of_outputs = rng.gen_range(1..10); + let number_of_outputs = rng.random_range(1..10); let outputs = get_random_outputs_combination(&mut rng, &invalid_purposes, number_of_outputs); let block = make_block_no_kernel(outputs); @@ -416,7 +416,7 @@ fn reward_many_to_none(#[case] seed: Seed) { let chain_config = chain::config::Builder::test_chain().build(); let all_purposes = super::outputs_utils::all_outputs(); - let number_of_outputs = rng.gen_range(2..10); + let number_of_outputs = rng.random_range(2..10); let kernel_outputs = get_random_outputs_combination(&mut rng, &all_purposes, number_of_outputs) .into_iter() .enumerate() @@ -436,7 +436,7 @@ fn reward_many_to_none(#[case] seed: Seed) { let utxo_db = UtxosDBInMemoryImpl::new(best_block_id, kernel_outputs); let block = make_block(inputs, vec![]); - let block_height = BlockHeight::new(rng.gen()); + let block_height = BlockHeight::new(rng.random()); let res = check_reward_inputs_outputs_purposes( &chain_config, @@ -461,8 +461,8 @@ fn reward_accounts_in_inputs(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let chain_config = chain::config::Builder::test_chain().build(); - let number_of_inputs = rng.gen_range(1..10); - let number_of_outputs = rng.gen_range(1..10); + let number_of_inputs = rng.random_range(1..10); + let number_of_outputs = rng.random_range(1..10); let invalid_inputs = all_account_inputs(); let valid_outputs = [lock_then_transfer()]; @@ -479,7 +479,7 @@ fn reward_accounts_in_inputs(#[case] seed: Seed) { let utxo_db = UtxosDBInMemoryImpl::new(best_block_id, BTreeMap::new()); let block = make_block(invalid_inputs, outputs); - let block_height = BlockHeight::new(rng.gen()); + let block_height = BlockHeight::new(rng.random()); assert_eq!( check_reward_inputs_outputs_purposes( @@ -505,7 +505,7 @@ fn reward_accounts_in_inputs(#[case] seed: Seed) { fn staker_destination_change(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let fork_height = BlockHeight::new(rng.gen_range(1..1_000_000)); + let fork_height = BlockHeight::new(rng.random_range(1..1_000_000)); let chain_config = chain::config::Builder::test_chain() .chainstate_upgrades( @@ -540,7 +540,7 @@ fn staker_destination_change(#[case] seed: Seed) { Amount::ZERO, ); - let kernel_input_utxo = if rng.gen_bool(0.5) { + let kernel_input_utxo = if rng.random_bool(0.5) { TxOutput::CreateStakePool(stake_pool_id(), Box::new(stake_pool_data.clone())) } else { TxOutput::ProduceBlockFromStake(old_staker_dest, stake_pool_id()) @@ -564,10 +564,10 @@ fn staker_destination_change(#[case] seed: Seed) { // Case 1 - before the fork; the staker destination change is allowed. { - let block_height = if rng.gen_bool(0.5) { + let block_height = if rng.random_bool(0.5) { fork_height.prev_height().unwrap() } else { - BlockHeight::new(rng.gen_range(0..fork_height.into_int())) + BlockHeight::new(rng.random_range(0..fork_height.into_int())) }; let result = check_reward_inputs_outputs_purposes( @@ -583,10 +583,12 @@ fn staker_destination_change(#[case] seed: Seed) { // Case 2 - after the fork; the staker destination change is prohibited. { - let block_height = if rng.gen_bool(0.5) { + let block_height = if rng.random_bool(0.5) { fork_height } else { - BlockHeight::new(rng.gen_range(fork_height.into_int()..=BlockHeight::max().into_int())) + BlockHeight::new( + rng.random_range(fork_height.into_int()..=BlockHeight::max().into_int()), + ) }; let result = check_reward_inputs_outputs_purposes( diff --git a/chainstate/tx-verifier/src/transaction_verifier/input_output_policy/tests/reward_tests.rs b/chainstate/tx-verifier/src/transaction_verifier/input_output_policy/tests/reward_tests.rs index f24f55293a..4337eb6f0b 100644 --- a/chainstate/tx-verifier/src/transaction_verifier/input_output_policy/tests/reward_tests.rs +++ b/chainstate/tx-verifier/src/transaction_verifier/input_output_policy/tests/reward_tests.rs @@ -26,7 +26,7 @@ use common::{ primitives::{per_thousand::PerThousand, CoinOrTokenId, Compact, H256}, }; use crypto::vrf::{VRFKeyKind, VRFPrivateKey}; -use randomness::Rng; +use randomness::RngExt; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; @@ -41,7 +41,7 @@ fn check_block_reward_pow(#[case] seed: Seed) { let block_id = Id::::new(H256::zero()); let block_height = BlockHeight::new(1); - let fee = Fee(Amount::from_atoms(rng.gen_range(0..100_000))); + let fee = Fee(Amount::from_atoms(rng.random_range(0..100_000))); let subsidy = chain_config.block_subsidy_at_height(&block_height); let check = |output_value| { @@ -79,8 +79,9 @@ fn check_block_reward_pow(#[case] seed: Seed) { // invalid random case { - let invalid_output_value = - Amount::from_atoms(rng.gen_range((expected_output_value.into_atoms() + 1)..u128::MAX)); + let invalid_output_value = Amount::from_atoms( + rng.random_range((expected_output_value.into_atoms() + 1)..u128::MAX), + ); let result = check(invalid_output_value); assert_eq!( result.unwrap_err(), @@ -100,7 +101,7 @@ fn check_block_reward_pow(#[case] seed: Seed) { // valid random case { let valid_output_value = - Amount::from_atoms(rng.gen_range(0..expected_output_value.into_atoms())); + Amount::from_atoms(rng.random_range(0..expected_output_value.into_atoms())); let result = check(valid_output_value); assert_eq!(result, Ok(())); } @@ -115,7 +116,7 @@ fn check_block_reward_pos(#[case] seed: Seed) { let pool_id = PoolId::new(H256::zero()); let outpoint = UtxoOutPoint::new(OutPointSourceId::Transaction(Id::new(H256::zero())), 0); - let pledge_amount = Amount::from_atoms(rng.gen_range(0..100_000)); + let pledge_amount = Amount::from_atoms(rng.random_range(0..100_000)); let (vrf_sk, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let vrf_data = vrf_sk.produce_vrf_data(VRFTranscript::new(b"abc")); let stake_pool_data = StakePoolData::new( @@ -132,7 +133,7 @@ fn check_block_reward_pos(#[case] seed: Seed) { BTreeMap::from_iter([(outpoint.clone(), utxo::Utxo::new_for_mempool(input_utxo))]), ); - let fee = Fee(Amount::from_atoms(rng.gen_range(0..100_000))); + let fee = Fee(Amount::from_atoms(rng.random_range(0..100_000))); let inputs = vec![outpoint.into()]; let outputs = vec![TxOutput::ProduceBlockFromStake(Destination::AnyoneCanSpend, pool_id)]; @@ -167,7 +168,7 @@ fn check_block_reward_pos_pool_id_mismatch(#[case] seed: Seed) { let pool_id_2 = PoolId::new(H256::random_using(&mut rng)); let outpoint = UtxoOutPoint::new(OutPointSourceId::Transaction(Id::new(H256::zero())), 0); - let pledge_amount_1 = Amount::from_atoms(rng.gen_range(0..100_000)); + let pledge_amount_1 = Amount::from_atoms(rng.random_range(0..100_000)); let (vrf_sk, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); let vrf_data = vrf_sk.produce_vrf_data(VRFTranscript::new(b"abc")); let stake_pool_data_1 = StakePoolData::new( @@ -184,7 +185,7 @@ fn check_block_reward_pos_pool_id_mismatch(#[case] seed: Seed) { BTreeMap::from_iter([(outpoint.clone(), utxo::Utxo::new_for_mempool(input_utxo))]), ); - let fee = Fee(Amount::from_atoms(rng.gen_range(0..100_000))); + let fee = Fee(Amount::from_atoms(rng.random_range(0..100_000))); let inputs = vec![outpoint.into()]; let outputs = vec![TxOutput::ProduceBlockFromStake(Destination::AnyoneCanSpend, pool_id_2)]; diff --git a/chainstate/tx-verifier/src/transaction_verifier/reward_distribution.rs b/chainstate/tx-verifier/src/transaction_verifier/reward_distribution.rs index 87f683d8f9..73d007eb56 100644 --- a/chainstate/tx-verifier/src/transaction_verifier/reward_distribution.rs +++ b/chainstate/tx-verifier/src/transaction_verifier/reward_distribution.rs @@ -332,7 +332,7 @@ mod tests { DelegationData, FlushablePoSAccountingView, InMemoryPoSAccounting, PoSAccountingDB, PoolData, }; - use randomness::Rng; + use randomness::RngExt; use rstest::rstest; use std::collections::BTreeMap; use test_utils::random::{make_seedable_rng, Seed}; @@ -351,13 +351,13 @@ mod tests { fn calculate_staker_reward_test_v0(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let reward = Amount::from_atoms(rng.gen_range(1..=100_000_000)); - let cost_per_block = Amount::from_atoms(rng.gen_range(1..=reward.into_atoms())); + let reward = Amount::from_atoms(rng.random_range(1..=100_000_000)); + let cost_per_block = Amount::from_atoms(rng.random_range(1..=reward.into_atoms())); let cost_per_block_over_reward = - (reward + Amount::from_atoms(rng.gen_range(1..=100_000_000))).unwrap(); + (reward + Amount::from_atoms(rng.random_range(1..=100_000_000))).unwrap(); let mpt = PerThousand::new_from_rng(&mut rng); let mpt_zero = PerThousand::new(0).unwrap(); - let mpt_more_than_one = PerThousand::new(rng.gen_range(2..=1000)).unwrap(); + let mpt_more_than_one = PerThousand::new(rng.random_range(2..=1000)).unwrap(); assert!(calculate_staker_reward_v0(Amount::ZERO, Amount::ZERO, mpt_zero).is_some()); assert!(calculate_staker_reward_v0(Amount::ZERO, Amount::ZERO, mpt).is_some()); @@ -501,16 +501,16 @@ mod tests { let mut rng = make_seedable_rng(seed); let pool_id = new_pool_id(1); - let reward = Amount::from_atoms(rng.gen_range(1..=100_000_000)); - let pool_balance = Amount::from_atoms(rng.gen_range(1..=100_000_000)); - let staker_balance = Amount::from_atoms(rng.gen_range(1..=pool_balance.into_atoms())); + let reward = Amount::from_atoms(rng.random_range(1..=100_000_000)); + let pool_balance = Amount::from_atoms(rng.random_range(1..=100_000_000)); + let staker_balance = Amount::from_atoms(rng.random_range(1..=pool_balance.into_atoms())); - let cost_per_block = Amount::from_atoms(rng.gen_range(1..=reward.into_atoms())); + let cost_per_block = Amount::from_atoms(rng.random_range(1..=reward.into_atoms())); let cost_per_block_over_reward = - (reward + Amount::from_atoms(rng.gen_range(1..=100_000_000))).unwrap(); + (reward + Amount::from_atoms(rng.random_range(1..=100_000_000))).unwrap(); let mpt = PerThousand::new_from_rng(&mut rng); let mpt_zero = PerThousand::new(0).unwrap(); - let mpt_more_than_one = PerThousand::new(rng.gen_range(2..=1000)).unwrap(); + let mpt_more_than_one = PerThousand::new(rng.random_range(2..=1000)).unwrap(); assert_eq!( calculate_staker_reward_v1( @@ -813,9 +813,9 @@ mod tests { let delegation_id_1 = new_delegation_id(1); let delegation_id_2 = new_delegation_id(2); - let original_pledged_amount = Amount::from_atoms(rng.gen_range(0..100_000_000)); - let delegation_1_balance = Amount::from_atoms(rng.gen_range(0..100_000_000)); - let delegation_2_balance = Amount::from_atoms(rng.gen_range(0..100_000_000)); + let original_pledged_amount = Amount::from_atoms(rng.random_range(0..100_000_000)); + let delegation_1_balance = Amount::from_atoms(rng.random_range(0..100_000_000)); + let delegation_2_balance = Amount::from_atoms(rng.random_range(0..100_000_000)); let total_delegation_shares = (delegation_1_balance + delegation_2_balance).unwrap(); let original_pool_balance = amount_sum!( @@ -825,8 +825,8 @@ mod tests { ) .unwrap(); - let reward = Amount::from_atoms(rng.gen_range(0..100_000_000)); - let cost_per_block = Amount::from_atoms(rng.gen_range(0..reward.into_atoms())); + let reward = Amount::from_atoms(rng.random_range(0..100_000_000)); + let cost_per_block = Amount::from_atoms(rng.random_range(0..reward.into_atoms())); let mpt = PerThousand::new_from_rng(&mut rng); let staker_reward = match version { RewardDistributionVersion::V0 => { @@ -963,12 +963,12 @@ mod tests { let pool_id = new_pool_id(1); let delegation_id = new_delegation_id(1); - let pledged_amount = Amount::from_atoms(rng.gen_range(0..100_000_000)); + let pledged_amount = Amount::from_atoms(rng.random_range(0..100_000_000)); let original_pool_balance = pledged_amount; let delegation_id_amount = Amount::ZERO; - let reward = Amount::from_atoms(rng.gen_range(0..100_000_000)); - let cost_per_block = Amount::from_atoms(rng.gen_range(0..reward.into_atoms())); + let reward = Amount::from_atoms(rng.random_range(0..100_000_000)); + let cost_per_block = Amount::from_atoms(rng.random_range(0..reward.into_atoms())); let mpt = PerThousand::new_from_rng(&mut rng); let delegation_data = DelegationData::new(pool_id, Destination::AnyoneCanSpend); @@ -1038,12 +1038,12 @@ mod tests { let pool_id = new_pool_id(1); let delegation_id = new_delegation_id(1); - let pledged_amount = Amount::from_atoms(rng.gen_range(0..100_000_000)); + let pledged_amount = Amount::from_atoms(rng.random_range(0..100_000_000)); let original_pool_balance = pledged_amount; - let delegation_id_amount = Amount::from_atoms(rng.gen_range(0..100_000_000)); + let delegation_id_amount = Amount::from_atoms(rng.random_range(0..100_000_000)); - let reward = Amount::from_atoms(rng.gen_range(0..100_000_000)); - let cost_per_block = Amount::from_atoms(rng.gen_range(0..reward.into_atoms())); + let reward = Amount::from_atoms(rng.random_range(0..100_000_000)); + let cost_per_block = Amount::from_atoms(rng.random_range(0..reward.into_atoms())); let mpt = PerThousand::new(1000).unwrap(); let delegation_data = DelegationData::new(pool_id, Destination::AnyoneCanSpend); @@ -1108,11 +1108,11 @@ mod tests { let block_id = Id::new(H256::random_using(&mut rng)); let pool_id = new_pool_id(1); - let pledged_amount = Amount::from_atoms(rng.gen_range(0..100_000_000)); + let pledged_amount = Amount::from_atoms(rng.random_range(0..100_000_000)); let original_pool_balance = pledged_amount; - let reward = Amount::from_atoms(rng.gen_range(0..100_000_000)); - let cost_per_block = Amount::from_atoms(rng.gen_range(0..reward.into_atoms())); + let reward = Amount::from_atoms(rng.random_range(0..100_000_000)); + let cost_per_block = Amount::from_atoms(rng.random_range(0..reward.into_atoms())); let mpt = PerThousand::new_from_rng(&mut rng); let (_, vrf_pk) = VRFPrivateKey::new_from_rng(&mut rng, VRFKeyKind::Schnorrkel); diff --git a/chainstate/tx-verifier/src/transaction_verifier/tests/hierarchy_read.rs b/chainstate/tx-verifier/src/transaction_verifier/tests/hierarchy_read.rs index 1abe21da14..6589342432 100644 --- a/chainstate/tx-verifier/src/transaction_verifier/tests/hierarchy_read.rs +++ b/chainstate/tx-verifier/src/transaction_verifier/tests/hierarchy_read.rs @@ -568,13 +568,13 @@ fn hierarchy_test_nonce(#[case] seed: Seed) { let chain_config = ConfigBuilder::test_chain().build(); - let nonce0 = AccountNonce::new(rng.gen()); + let nonce0 = AccountNonce::new(rng.random()); let account0 = AccountType::Delegation(DelegationId::random_using(&mut rng)); - let nonce1 = AccountNonce::new(rng.gen()); + let nonce1 = AccountNonce::new(rng.random()); let account1 = AccountType::Delegation(DelegationId::random_using(&mut rng)); - let nonce2 = AccountNonce::new(rng.gen()); + let nonce2 = AccountNonce::new(rng.random()); let account2 = AccountType::Delegation(DelegationId::random_using(&mut rng)); let mut store = mock::MockStore::new(); diff --git a/chainstate/tx-verifier/src/transaction_verifier/tests/hierarchy_write.rs b/chainstate/tx-verifier/src/transaction_verifier/tests/hierarchy_write.rs index 561d3faf9f..600744fbb7 100644 --- a/chainstate/tx-verifier/src/transaction_verifier/tests/hierarchy_write.rs +++ b/chainstate/tx-verifier/src/transaction_verifier/tests/hierarchy_write.rs @@ -1057,10 +1057,10 @@ fn nonce_set_hierarchy(#[case] seed: Seed) { let chain_config = ConfigBuilder::test_chain().build(); - let nonce1 = AccountNonce::new(rng.gen()); + let nonce1 = AccountNonce::new(rng.random()); let account1 = AccountType::Delegation(DelegationId::new(H256::random_using(&mut rng))); - let nonce2 = AccountNonce::new(rng.gen()); + let nonce2 = AccountNonce::new(rng.random()); let account2 = AccountType::Delegation(DelegationId::new(H256::random_using(&mut rng))); let mut store = mock::MockStore::new(); diff --git a/chainstate/tx-verifier/src/transaction_verifier/tests/mod.rs b/chainstate/tx-verifier/src/transaction_verifier/tests/mod.rs index d7091fd370..3a9c1a4214 100644 --- a/chainstate/tx-verifier/src/transaction_verifier/tests/mod.rs +++ b/chainstate/tx-verifier/src/transaction_verifier/tests/mod.rs @@ -29,13 +29,10 @@ use crypto::{ key::{KeyKind, PrivateKey}, vrf::{VRFKeyKind, VRFPrivateKey}, }; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use utxo::Utxo; -pub fn create_utxo( - rng: &mut (impl Rng + CryptoRng), - value: UnsignedIntType, -) -> (UtxoOutPoint, Utxo) { +pub fn create_utxo(rng: &mut impl CryptoRng, value: UnsignedIntType) -> (UtxoOutPoint, Utxo) { let outpoint = UtxoOutPoint::new( OutPointSourceId::Transaction(Id::new(H256::random_using(rng))), 0, @@ -49,20 +46,20 @@ pub fn create_utxo( (outpoint, utxo) } -fn new_pub_key_destination(rng: &mut (impl Rng + CryptoRng)) -> Destination { +fn new_pub_key_destination(rng: &mut impl CryptoRng) -> Destination { let (_, pub_key) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); Destination::PublicKey(pub_key) } fn create_pool_data( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, staker: Destination, decommission_destination: Destination, pledged_amount: Amount, ) -> StakePoolData { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel); let margin_ratio = PerThousand::new_from_rng(rng); - let cost_per_block = Amount::from_atoms(rng.gen_range(0..1000)); + let cost_per_block = Amount::from_atoms(rng.random_range(0..1000)); StakePoolData::new( pledged_amount, staker, diff --git a/common/src/address/hexified.rs b/common/src/address/hexified.rs index 73d5568c9e..2cf20ec05e 100644 --- a/common/src/address/hexified.rs +++ b/common/src/address/hexified.rs @@ -207,15 +207,17 @@ impl regex::Replacer for AddressableReplacer<'_, A> #[cfg(test)] mod tests { + use rstest::rstest; + use serde::de::value::Error as SerdeErr; + use strum::EnumCount as _; + use crypto::{ key::{KeyKind, PrivateKey}, vrf::VRFPublicKey, }; - use rstest::rstest; - use serde::de::value::Error as SerdeErr; + use randomness::Rng; use serialization::{Decode, DecodeAll, Encode}; - use strum::EnumCount as _; - use test_utils::random::{make_seedable_rng, Rng, Seed}; + use test_utils::random::{make_seedable_rng, RngExt as _, Seed}; use crate::{ address::{ @@ -291,13 +293,13 @@ mod tests { let strings = (0..100) .map(|_| { - let size = rng.gen::() % 50; + let size = rng.random_range(0..50); random_string(size, &mut rng) }) .collect::>(); let keys = (0..strings.len()) - .map(|_| match rng.gen::() % Destination::COUNT { + .map(|_| match rng.random_range(0..Destination::COUNT) { 0 => Destination::AnyoneCanSpend, 1 => { let (_private_key, public_key) = diff --git a/common/src/address/pubkeyhash.rs b/common/src/address/pubkeyhash.rs index 51e7ffea4d..fa6df269a1 100644 --- a/common/src/address/pubkeyhash.rs +++ b/common/src/address/pubkeyhash.rs @@ -33,7 +33,7 @@ pub enum PublicKeyHashError { const HASH_SIZE: usize = 20; -fixed_hash::construct_fixed_hash! { +utils::construct_fixed_hash! { #[derive(Encode, Decode)] pub struct PublicKeyHash(HASH_SIZE); } diff --git a/common/src/chain/block/block_body/mod.rs b/common/src/chain/block/block_body/mod.rs index 568d84b48f..5d17bc9424 100644 --- a/common/src/chain/block/block_body/mod.rs +++ b/common/src/chain/block/block_body/mod.rs @@ -77,9 +77,12 @@ impl OutputValuesHolder for BlockBody { #[cfg(test)] mod tests { - use super::*; + use rstest::rstest; + + use crypto::key::{KeyKind, PrivateKey}; + use randomness::{CryptoRng, Rng, RngExt as _}; + use test_utils::random::{make_seedable_rng, Seed}; - use crate::primitives::id::Idable; use crate::{ chain::{ block::BlockReward, @@ -90,13 +93,10 @@ mod tests { }, Destination, OutPointSourceId, Transaction, TxInput, TxOutput, }, - primitives::{Amount, Id, H256}, + primitives::{id::Idable, Amount, Id, H256}, }; - use crypto::key::{KeyKind, PrivateKey}; - use proptest::prelude::Rng; - use randomness::CryptoRng; - use rstest::rstest; - use test_utils::random::{make_seedable_rng, Seed}; + + use super::*; fn generate_random_h256(rng: &mut impl Rng) -> H256 { let mut bytes = [0u8; 32]; @@ -131,7 +131,7 @@ mod tests { TxInput::from_utxo(outpoint, rng.next_u32()) } - fn generate_random_invalid_output(rng: &mut (impl Rng + CryptoRng)) -> TxOutput { + fn generate_random_invalid_output(rng: &mut impl CryptoRng) -> TxOutput { let (_, pub_key) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); TxOutput::Transfer( OutputValue::Coin(Amount::from_atoms(rng.next_u64() as u128)), @@ -139,7 +139,7 @@ mod tests { ) } - fn generate_random_invalid_transaction(rng: &mut (impl Rng + CryptoRng)) -> SignedTransaction { + fn generate_random_invalid_transaction(rng: &mut impl CryptoRng) -> SignedTransaction { let inputs = { let input_count = 1 + (rng.next_u32() as usize) % 10; (0..input_count).map(|_| generate_random_invalid_input(rng)).collect::>() @@ -152,14 +152,14 @@ mod tests { .collect::>() }; - let flags = rng.gen::(); + let flags = rng.random::(); let tx = Transaction::new(flags, inputs.clone(), outputs).expect("Creating tx caused fail"); SignedTransaction::new(tx, generate_random_invalid_witness(inputs.len(), rng)).unwrap() } - fn generate_random_invalid_block_reward(rng: &mut (impl Rng + CryptoRng)) -> BlockReward { + fn generate_random_invalid_block_reward(rng: &mut impl CryptoRng) -> BlockReward { let output_count = (rng.next_u32() as usize) % 10; let outputs = (0..output_count) .map(|_| generate_random_invalid_output(rng)) diff --git a/common/src/chain/block/mod.rs b/common/src/chain/block/mod.rs index 94ac705146..e7a877074a 100644 --- a/common/src/chain/block/mod.rs +++ b/common/src/chain/block/mod.rs @@ -267,7 +267,7 @@ mod tests { }; use super::*; - use randomness::{make_pseudo_rng, Rng}; + use randomness::{make_pseudo_rng, RngExt as _}; use rstest::rstest; use serialization::Encode; use test_utils::random::Seed; @@ -291,10 +291,10 @@ mod tests { let header = BlockHeader { version: Default::default(), consensus_data: ConsensusData::None, - tx_merkle_root: H256::from_low_u64_be(rng.gen()), - witness_merkle_root: H256::from_low_u64_be(rng.gen()), - prev_block_id: Id::new(H256::from_low_u64_be(rng.gen())), - timestamp: BlockTimestamp::from_int_seconds(rng.gen()), + tx_merkle_root: H256::from_low_u64_be(rng.random()), + witness_merkle_root: H256::from_low_u64_be(rng.random()), + prev_block_id: Id::new(H256::from_low_u64_be(rng.random())), + timestamp: BlockTimestamp::from_int_seconds(rng.random()), }; let body = BlockBody { @@ -323,10 +323,10 @@ mod tests { let header = BlockHeader { version: Default::default(), consensus_data: ConsensusData::None, - tx_merkle_root: H256::from_low_u64_be(rng.gen()), - witness_merkle_root: H256::from_low_u64_be(rng.gen()), - prev_block_id: Id::new(H256::from_low_u64_be(rng.gen())), - timestamp: BlockTimestamp::from_int_seconds(rng.gen()), + tx_merkle_root: H256::from_low_u64_be(rng.random()), + witness_merkle_root: H256::from_low_u64_be(rng.random()), + prev_block_id: Id::new(H256::from_low_u64_be(rng.random())), + timestamp: BlockTimestamp::from_int_seconds(rng.random()), }; let body = BlockBody { @@ -359,10 +359,10 @@ mod tests { let header = BlockHeader { version: Default::default(), consensus_data: ConsensusData::None, - tx_merkle_root: H256::from_low_u64_be(rng.gen()), - witness_merkle_root: H256::from_low_u64_be(rng.gen()), - prev_block_id: Id::new(H256::from_low_u64_be(rng.gen())), - timestamp: BlockTimestamp::from_int_seconds(rng.gen()), + tx_merkle_root: H256::from_low_u64_be(rng.random()), + witness_merkle_root: H256::from_low_u64_be(rng.random()), + prev_block_id: Id::new(H256::from_low_u64_be(rng.random())), + timestamp: BlockTimestamp::from_int_seconds(rng.random()), }; let reward = BlockReward::new(vec![TxOutput::Transfer( @@ -390,10 +390,10 @@ mod tests { let header = BlockHeader { version: Default::default(), consensus_data: ConsensusData::None, - tx_merkle_root: H256::from_low_u64_be(rng.gen()), - witness_merkle_root: H256::from_low_u64_be(rng.gen()), - prev_block_id: Id::new(H256::from_low_u64_be(rng.gen())), - timestamp: BlockTimestamp::from_int_seconds(rng.gen()), + tx_merkle_root: H256::from_low_u64_be(rng.random()), + witness_merkle_root: H256::from_low_u64_be(rng.random()), + prev_block_id: Id::new(H256::from_low_u64_be(rng.random())), + timestamp: BlockTimestamp::from_int_seconds(rng.random()), }; let one_transaction = @@ -450,10 +450,10 @@ mod tests { let header = BlockHeader { version: Default::default(), consensus_data: ConsensusData::None, - tx_merkle_root: H256::from_low_u64_be(rng.gen()), - witness_merkle_root: H256::from_low_u64_be(rng.gen()), - prev_block_id: Id::new(H256::from_low_u64_be(rng.gen())), - timestamp: BlockTimestamp::from_int_seconds(rng.gen()), + tx_merkle_root: H256::from_low_u64_be(rng.random()), + witness_merkle_root: H256::from_low_u64_be(rng.random()), + prev_block_id: Id::new(H256::from_low_u64_be(rng.random())), + timestamp: BlockTimestamp::from_int_seconds(rng.random()), }; let body = BlockBody { diff --git a/common/src/chain/config/builder.rs b/common/src/chain/config/builder.rs index 4a37543c95..c56ad43262 100644 --- a/common/src/chain/config/builder.rs +++ b/common/src/chain/config/builder.rs @@ -651,7 +651,7 @@ impl Builder { #[cfg(test)] mod tests { use super::*; - use randomness::Rng; + use randomness::RngExt; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; @@ -670,7 +670,7 @@ mod tests { let config = Builder::new(ChainType::Mainnet).build(); let before_the_fork = BlockHeight::new( - rng.gen_range(0..MAINNET_FORK_HEIGHT_1_HTLC_AND_ORDERS.into_int()), + rng.random_range(0..MAINNET_FORK_HEIGHT_1_HTLC_AND_ORDERS.into_int()), ); assert_eq!( DEFAULT_MAX_FUTURE_BLOCK_TIME_OFFSET_V1, @@ -683,7 +683,7 @@ mod tests { ); let after_the_fork = BlockHeight::new( - rng.gen_range(MAINNET_FORK_HEIGHT_1_HTLC_AND_ORDERS.into_int()..u64::MAX), + rng.random_range(MAINNET_FORK_HEIGHT_1_HTLC_AND_ORDERS.into_int()..u64::MAX), ); assert_eq!( DEFAULT_MAX_FUTURE_BLOCK_TIME_OFFSET_V2, @@ -696,7 +696,7 @@ mod tests { let config = Builder::new(ChainType::Testnet).build(); let before_the_fork = - BlockHeight::new(rng.gen_range(0..TESTNET_FORK_HEIGHT_3_HTLC.into_int())); + BlockHeight::new(rng.random_range(0..TESTNET_FORK_HEIGHT_3_HTLC.into_int())); assert_eq!( DEFAULT_MAX_FUTURE_BLOCK_TIME_OFFSET_V1, config.max_future_block_time_offset(before_the_fork) @@ -708,7 +708,7 @@ mod tests { ); let after_the_fork = - BlockHeight::new(rng.gen_range(TESTNET_FORK_HEIGHT_3_HTLC.into_int()..u64::MAX)); + BlockHeight::new(rng.random_range(TESTNET_FORK_HEIGHT_3_HTLC.into_int()..u64::MAX)); assert_eq!( DEFAULT_MAX_FUTURE_BLOCK_TIME_OFFSET_V2, config.max_future_block_time_offset(after_the_fork) @@ -719,7 +719,7 @@ mod tests { { let config = Builder::new(ChainType::Regtest).build(); - let height = BlockHeight::new(rng.gen::()); + let height = BlockHeight::new(rng.random::()); assert_eq!( DEFAULT_MAX_FUTURE_BLOCK_TIME_OFFSET_V2, config.max_future_block_time_offset(height) @@ -728,12 +728,12 @@ mod tests { // Custom { - let custom_offset = Duration::from_secs(rng.gen::()); + let custom_offset = Duration::from_secs(rng.random::()); let config = Builder::new(ChainType::Regtest) .max_future_block_time_offset(Some(custom_offset)) .build(); - let height = BlockHeight::new(rng.gen::()); + let height = BlockHeight::new(rng.random::()); assert_eq!(custom_offset, config.max_future_block_time_offset(height)); } } diff --git a/common/src/chain/config/checkpoints.rs b/common/src/chain/config/checkpoints.rs index 5f4131a6f6..360efcd128 100644 --- a/common/src/chain/config/checkpoints.rs +++ b/common/src/chain/config/checkpoints.rs @@ -119,7 +119,7 @@ mod tests { use test_utils::{ assert_matches, - random::{make_seedable_rng, Rng, Seed}, + random::{make_seedable_rng, RngExt as _, Seed}, }; use super::*; @@ -181,7 +181,7 @@ mod tests { checkpoints_map.insert(BlockHeight::new(15), Id::random_using(&mut rng)); checkpoints_map }; - let checkpoints = if rng.gen_bool(0.5) { + let checkpoints = if rng.random_bool(0.5) { Checkpoints::new(checkpoints_map.clone(), genesis_id).unwrap() } else { static MAP: OnceCell>> = OnceCell::new(); @@ -246,8 +246,9 @@ mod tests { // Anything above the last checkpoint should return the last checkpoint assert_eq!( - checkpoints - .parent_checkpoint_to_height(BlockHeight::new(rng.gen::().saturating_add(15))), + checkpoints.parent_checkpoint_to_height(BlockHeight::new( + rng.random::().saturating_add(15) + )), (15.into(), *checkpoints_map.get(&15.into()).unwrap()), ); diff --git a/common/src/chain/make_id.rs b/common/src/chain/make_id.rs index 95a627092c..9ee3a5df0e 100644 --- a/common/src/chain/make_id.rs +++ b/common/src/chain/make_id.rs @@ -167,7 +167,7 @@ pub enum IdCreationError { mod tests { use rstest::rstest; - use randomness::Rng; + use randomness::RngExt; use test_utils::random::Seed; use crate::{ @@ -188,7 +188,7 @@ mod tests { fn token_id_consistency(#[case] seed: Seed) { let mut rng = test_utils::random::make_seedable_rng(seed); - let fork_height = BlockHeight::new(rng.gen_range(1..1_000_000)); + let fork_height = BlockHeight::new(rng.random_range(1..1_000_000)); let chain_config = config::Builder::test_chain() .chainstate_upgrades( NetUpgrades::initialize(vec![ @@ -213,19 +213,19 @@ mod tests { logging::log::warn!("fork_height = {fork_height}"); let non_utxo_input = TxInput::Account(AccountOutPoint::new( - AccountNonce::new(rng.gen()), + AccountNonce::new(rng.random()), AccountSpending::DelegationBalance( Id::random_using(&mut rng), - Amount::from_atoms(rng.gen()), + Amount::from_atoms(rng.random()), ), )); let utxo_input = TxInput::Utxo(UtxoOutPoint::new( - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { OutPointSourceId::Transaction(Id::random_using(&mut rng)) } else { OutPointSourceId::BlockReward(Id::random_using(&mut rng)) }, - rng.gen(), + rng.random(), )); // Sanity check - if the first input is non-utxo, the ids will be generated differently diff --git a/common/src/chain/transaction/account_nonce.rs b/common/src/chain/transaction/account_nonce.rs index b576932e04..936644a27e 100644 --- a/common/src/chain/transaction/account_nonce.rs +++ b/common/src/chain/transaction/account_nonce.rs @@ -62,7 +62,7 @@ impl std::fmt::Display for AccountNonce { mod tests { use super::*; - use randomness::Rng; + use randomness::RngExt; use rstest::rstest; use test_utils::random::Seed; @@ -74,7 +74,7 @@ mod tests { assert_eq!(AccountNonce::new(u64::MAX).increment(), None); - let v = rng.gen_range(0..u64::MAX - 1); + let v = rng.random_range(0..u64::MAX - 1); assert_eq!( AccountNonce::new(v).increment(), Some(AccountNonce::new(v + 1)) @@ -89,7 +89,7 @@ mod tests { assert_eq!(AccountNonce::new(0).decrement(), None); - let v = rng.gen_range(1..u64::MAX); + let v = rng.random_range(1..u64::MAX); assert_eq!( AccountNonce::new(v).decrement(), Some(AccountNonce::new(v - 1)) diff --git a/common/src/chain/transaction/mod.rs b/common/src/chain/transaction/mod.rs index ea6532bd1a..56aa63c0a9 100644 --- a/common/src/chain/transaction/mod.rs +++ b/common/src/chain/transaction/mod.rs @@ -201,10 +201,11 @@ impl rpc_description::HasValueHint for Id { #[cfg(test)] mod test { - use super::*; - use proptest::prelude::Rng; + use randomness::RngExt as _; use serialization::{Decode, DecodeAll, Encode}; + use super::*; + #[derive(Encode, Decode, Debug, PartialEq, Eq)] struct TestCompactU128 { #[codec(compact)] @@ -215,7 +216,7 @@ mod test { #[allow(clippy::eq_op)] fn version_byte() { let mut rng = randomness::make_pseudo_rng(); - let flags = rng.gen::(); + let flags = rng.random::(); let flags_compact = TestCompactU128 { value: flags }; diff --git a/common/src/chain/transaction/output/classic_multisig.rs b/common/src/chain/transaction/output/classic_multisig.rs index 2d5c698f88..339f9b6704 100644 --- a/common/src/chain/transaction/output/classic_multisig.rs +++ b/common/src/chain/transaction/output/classic_multisig.rs @@ -114,7 +114,7 @@ impl ClassicMultisigChallenge { #[cfg(test)] mod tests { use crypto::key::{KeyKind, PrivateKey}; - use randomness::Rng; + use randomness::RngExt; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; @@ -165,7 +165,7 @@ mod tests { let chain_config = create_mainnet(); - let pub_key_count = 1 + rng.gen::() % 10; + let pub_key_count = 1 + rng.random::() % 10; let min_required_signatures = pub_key_count + 1; @@ -198,7 +198,7 @@ mod tests { let pub_key_count = 1 + chain_config.max_classic_multisig_public_keys_count() as u8; - let min_required_signatures = 1 + rng.gen::() % pub_key_count; + let min_required_signatures = 1 + rng.random::() % pub_key_count; let public_keys = (0..pub_key_count) .map(|_| PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr).1) diff --git a/common/src/chain/transaction/output/htlc.rs b/common/src/chain/transaction/output/htlc.rs index 0e0f05e1fd..a2aec44c71 100644 --- a/common/src/chain/transaction/output/htlc.rs +++ b/common/src/chain/transaction/output/htlc.rs @@ -19,7 +19,7 @@ use hex::FromHex as _; use crypto::hash::{self, hash}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use serialization::{Decode, Encode}; use super::{timelock::OutputTimeLock, Destination}; @@ -47,8 +47,8 @@ impl HtlcSecret { Self { secret } } - pub fn new_from_rng(rng: &mut (impl Rng + CryptoRng)) -> Self { - let secret: [u8; HTLC_SECRET_SIZE] = std::array::from_fn(|_| rng.gen::()); + pub fn new_from_rng(rng: &mut impl CryptoRng) -> Self { + let secret: [u8; HTLC_SECRET_SIZE] = std::array::from_fn(|_| rng.random::()); Self { secret } } @@ -94,7 +94,7 @@ impl<'de> serde::Deserialize<'de> for HtlcSecret { } } -fixed_hash::construct_fixed_hash! { +utils::construct_fixed_hash! { #[derive(Encode, Decode)] pub struct HtlcSecretHash(20); } @@ -253,19 +253,30 @@ mod tests { assert_eq!(actual_deserialized_hash, hash); } + // Note: rustc_hex::FromHexError's Display implementation differs a bit depending on whether + // the crate's 'std' feature is enabled, so the expected values here may have to be changed + // whenever rustc_hex's configuration changes (which is controller by fixed_hash in this case). #[rstest] #[case( "00000000000000000000000000000000000000000000000000000000000000", - "Invalid input length" + "invalid length" )] - #[case("000000000000000000000000000000000invalid", "Invalid character")] + #[case("000000000000000000000000000000000invalid", "invalid character")] fn secret_hash_deserialize_invalid(#[case] hash_str: &str, #[case] expected_msg: &str) { let err = HtlcSecretHash::from_str(hash_str).unwrap_err(); - assert!(err.to_string().contains(expected_msg)); + let err_str = err.to_string().to_ascii_lowercase(); + assert!( + err_str.contains(expected_msg), + "err_str = {err_str}, expected_msg = {expected_msg}" + ); let hash_json_str = secret_hash_str_to_json(hash_str); let err = serde_json::from_str::(&hash_json_str).unwrap_err(); - assert!(err.to_string().contains(expected_msg)); + let err_str = err.to_string().to_ascii_lowercase(); + assert!( + err_str.contains(expected_msg), + "err_str = {err_str}, expected_msg = {expected_msg}" + ); } fn secret_hash_str_to_json(hash_str: &str) -> String { diff --git a/common/src/chain/transaction/printout.rs b/common/src/chain/transaction/printout.rs index dca96b30db..ace5e66d63 100644 --- a/common/src/chain/transaction/printout.rs +++ b/common/src/chain/transaction/printout.rs @@ -59,7 +59,14 @@ pub fn transaction_summary(tx: &Transaction, chain_config: &ChainConfig) -> Stri #[cfg(test)] mod tests { - use super::*; + use rstest::rstest; + + use crypto::{ + key::{KeyKind, PrivateKey}, + vrf::{VRFKeyKind, VRFPrivateKey}, + }; + use serialization::extras::non_empty_vec::DataOrNoVec; + use test_utils::random::{make_seedable_rng, Seed}; use crate::{ address::Address, @@ -79,15 +86,16 @@ mod tests { primitives::{per_thousand::PerThousand, Amount, Id, H256}, time_getter::TimeGetter, }; - use crypto::{ - key::{KeyKind, PrivateKey}, - vrf::{VRFKeyKind, VRFPrivateKey}, - }; - use serialization::extras::non_empty_vec::DataOrNoVec; + + use super::*; // This test is made so that the data can be viewed for evaluation purposes - #[test] - fn try_it_out() { + #[rstest] + #[trace] + #[case(Seed::from_entropy())] + fn try_it_out(#[case] seed: Seed) { + let mut rng = make_seedable_rng(seed); + let cfg = create_mainnet(); let (_vrf_priv_key, vrf_pub_key) = VRFPrivateKey::new_from_entropy(VRFKeyKind::Schnorrkel); @@ -138,7 +146,7 @@ mod tests { )), ), TxOutput::CreateStakePool( - PoolId::new(H256::random()), + PoolId::new(H256::random_using(&mut rng)), Box::new(StakePoolData::new( Amount::from_fixedpoint_str("1000.225", 11).unwrap(), Destination::AnyoneCanSpend, @@ -150,12 +158,15 @@ mod tests { ), TxOutput::ProduceBlockFromStake( Destination::AnyoneCanSpend, - PoolId::new(H256::random()), + PoolId::new(H256::random_using(&mut rng)), + ), + TxOutput::CreateDelegationId( + Destination::AnyoneCanSpend, + PoolId::new(H256::random_using(&mut rng)), ), - TxOutput::CreateDelegationId(Destination::AnyoneCanSpend, PoolId::new(H256::random())), TxOutput::DelegateStaking( Amount::from_fixedpoint_str("1.2", 11).unwrap(), - DelegationId::new(H256::random()), + DelegationId::new(H256::random_using(&mut rng)), ), TxOutput::IssueFungibleToken(Box::new(TokenIssuance::V1(TokenIssuanceV1 { token_ticker: "abc".to_owned().into_bytes(), @@ -168,7 +179,7 @@ mod tests { is_freezable: IsTokenFreezable::No, }))), TxOutput::IssueNft( - TokenId::new(H256::random()), + TokenId::new(H256::random_using(&mut rng)), Box::new(NftIssuance::V0(NftIssuanceV0 { metadata: Metadata { creator: Some(TokenCreator { @@ -186,7 +197,7 @@ mod tests { media_uri: DataOrNoVec::from(Some( "http://media.com".to_string().into_bytes(), )), - media_hash: H256::random().as_bytes().to_vec(), + media_hash: H256::random_using(&mut rng).as_bytes().to_vec(), }, })), Destination::AnyoneCanSpend, @@ -198,27 +209,30 @@ mod tests { 0, [ TxInput::Utxo(UtxoOutPoint::new( - OutPointSourceId::Transaction(Id::new(H256::random())), + OutPointSourceId::Transaction(Id::new(H256::random_using(&mut rng))), 2, )), TxInput::Utxo(UtxoOutPoint::new( - OutPointSourceId::Transaction(Id::new(H256::random())), + OutPointSourceId::Transaction(Id::new(H256::random_using(&mut rng))), 1, )), TxInput::Utxo(UtxoOutPoint::new( - OutPointSourceId::BlockReward(Id::new(H256::random())), + OutPointSourceId::BlockReward(Id::new(H256::random_using(&mut rng))), 1, )), TxInput::Account(AccountOutPoint::new( AccountNonce::new(15), AccountSpending::DelegationBalance( - Id::new(H256::random()), + Id::new(H256::random_using(&mut rng)), Amount::from_atoms(100000), ), )), TxInput::AccountCommand( AccountNonce::new(25), - AccountCommand::MintTokens(Id::new(H256::random()), Amount::from_atoms(100000)), + AccountCommand::MintTokens( + Id::new(H256::random_using(&mut rng)), + Amount::from_atoms(100000), + ), ), ] .to_vec(), diff --git a/common/src/chain/transaction/signature/inputsig/arbitrary_message/tests.rs b/common/src/chain/transaction/signature/inputsig/arbitrary_message/tests.rs index a1a05ab977..d919b0fe99 100644 --- a/common/src/chain/transaction/signature/inputsig/arbitrary_message/tests.rs +++ b/common/src/chain/transaction/signature/inputsig/arbitrary_message/tests.rs @@ -28,7 +28,7 @@ use crypto::{ hash::StreamHasher, key::{KeyKind, PrivateKey, PublicKey}, }; -use randomness::Rng; +use randomness::RngExt; use serialization::DecodeAll; use test_utils::{ assert_matches, @@ -53,7 +53,7 @@ fn sign_verify_supported_destinations(#[case] seed: Seed) { let chain_config = chain::config::create_testnet(); let (private_key, public_key) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); - let message: Vec = (20..40).map(|_| rng.gen()).collect(); + let message: Vec = (20..40).map(|_| rng.random()).collect(); let message_challenge = produce_message_challenge(&message); let destination_addr = Destination::PublicKeyHash(PublicKeyHash::from(&public_key)); @@ -85,12 +85,12 @@ fn produce_uniparty_signature_as_pub_key_hash_spending_matches_produce_uniparty_ let chain_config = chain::config::create_testnet(); let (private_key, public_key) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); - let message: Vec = (20..40).map(|_| rng.gen()).collect(); + let message: Vec = (20..40).map(|_| rng.random()).collect(); let message_challenge = produce_message_challenge(&message); let destination_addr = Destination::PublicKeyHash(PublicKeyHash::from(&public_key)); // Use the identical rng for both of the signer calls to be able to compare the signatures. - let signer_rng_seed = rng.gen(); + let signer_rng_seed = rng.random(); let sig1 = ArbitraryMessageSignature::produce_uniparty_signature( &private_key, @@ -123,10 +123,10 @@ fn sign_verify_unsupported_destination(#[case] seed: Seed) { let chain_config = chain::config::create_testnet(); let (private_key, public_key) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); - let message: Vec = (20..40).map(|_| rng.gen()).collect(); + let message: Vec = (20..40).map(|_| rng.random()).collect(); let message_challenge = produce_message_challenge(&message); - let random_raw_sig: Vec = (1..100).map(|_| rng.gen()).collect(); + let random_raw_sig: Vec = (1..100).map(|_| rng.random()).collect(); let random_sig = ArbitraryMessageSignature { raw_signature: random_raw_sig, }; @@ -194,7 +194,7 @@ fn verify_wrong_destination(#[case] seed: Seed) { let (private_key, public_key) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); let (_, public_key2) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); - let message: Vec = (20..40).map(|_| rng.gen()).collect(); + let message: Vec = (20..40).map(|_| rng.random()).collect(); let message_challenge = produce_message_challenge(&message); let dest_multisig = Destination::ClassicMultisig(PublicKeyHash::from(&public_key)); @@ -290,7 +290,7 @@ fn verify_corrupted_message(#[case] seed: Seed) { let chain_config = chain::config::create_testnet(); let (private_key, public_key) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); - let message: Vec = (20..40).map(|_| rng.gen()).collect(); + let message: Vec = (20..40).map(|_| rng.random()).collect(); let corrupted_message = with_random_bit_flipped(&message, &mut rng); let corrupted_message_challenge = produce_message_challenge(&corrupted_message); @@ -325,7 +325,7 @@ fn verify_corrupted_signature(#[case] seed: Seed) { let chain_config = chain::config::create_testnet(); let (private_key, public_key) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); - let message: Vec = (20..40).map(|_| rng.gen()).collect(); + let message: Vec = (20..40).map(|_| rng.random()).collect(); let message_challenge = produce_message_challenge(&message); let destination_addr = Destination::PublicKeyHash(PublicKeyHash::from(&public_key)); diff --git a/common/src/chain/transaction/signature/inputsig/authorize_pubkey_spend.rs b/common/src/chain/transaction/signature/inputsig/authorize_pubkey_spend.rs index f1bf2b232a..f267b424e4 100644 --- a/common/src/chain/transaction/signature/inputsig/authorize_pubkey_spend.rs +++ b/common/src/chain/transaction/signature/inputsig/authorize_pubkey_spend.rs @@ -74,7 +74,7 @@ mod test { use rstest::rstest; use crypto::key::{KeyKind, PrivateKey}; - use randomness::Rng; + use randomness::RngExt; use test_utils::random::Seed; use crate::{ @@ -150,7 +150,7 @@ mod test { destination.clone(), &tx, &input_commitments, - rng.gen_range(0..INPUTS_COUNT), + rng.random_range(0..INPUTS_COUNT), &mut rng, ) .unwrap(); @@ -190,7 +190,7 @@ mod test { destination.clone(), &tx, &input_commitments, - rng.gen_range(0..INPUTS_COUNT), + rng.random_range(0..INPUTS_COUNT), &mut rng, ) .unwrap(); @@ -230,7 +230,7 @@ mod test { .unwrap(); for sighash_type in sig_hash_types() { - let input = rng.gen_range(0..INPUTS_COUNT); + let input = rng.random_range(0..INPUTS_COUNT); let witness = StandardInputSignature::produce_uniparty_signature_for_input( &private_key, sighash_type, @@ -271,7 +271,7 @@ mod test { .unwrap(); for sighash_type in sig_hash_types() { - let input = rng.gen_range(0..INPUTS_COUNT); + let input = rng.random_range(0..INPUTS_COUNT); let witness = StandardInputSignature::produce_uniparty_signature_for_input( &private_key, sighash_type, diff --git a/common/src/chain/transaction/signature/inputsig/authorize_pubkeyhash_spend.rs b/common/src/chain/transaction/signature/inputsig/authorize_pubkeyhash_spend.rs index 6000ef9b10..1497489418 100644 --- a/common/src/chain/transaction/signature/inputsig/authorize_pubkeyhash_spend.rs +++ b/common/src/chain/transaction/signature/inputsig/authorize_pubkeyhash_spend.rs @@ -105,7 +105,7 @@ mod test { use rstest::rstest; use crypto::key::{KeyKind, PrivateKey}; - use randomness::Rng; + use randomness::RngExt; use test_utils::random::Seed; use crate::chain::{ @@ -179,7 +179,7 @@ mod test { destination.clone(), &tx, &input_commitments, - rng.gen_range(0..INPUTS_COUNT), + rng.random_range(0..INPUTS_COUNT), &mut rng, ) .unwrap(); @@ -221,7 +221,7 @@ mod test { destination.clone(), &tx, &input_commitments, - rng.gen_range(0..INPUTS_COUNT), + rng.random_range(0..INPUTS_COUNT), &mut rng, ) .unwrap(); @@ -264,7 +264,7 @@ mod test { .unwrap(); for sighash_type in sig_hash_types() { - let input = rng.gen_range(0..INPUTS_COUNT); + let input = rng.random_range(0..INPUTS_COUNT); let witness = StandardInputSignature::produce_uniparty_signature_for_input( &private_key, sighash_type, @@ -307,7 +307,7 @@ mod test { .unwrap(); for sighash_type in sig_hash_types() { - let input = rng.gen_range(0..INPUTS_COUNT); + let input = rng.random_range(0..INPUTS_COUNT); let witness = StandardInputSignature::produce_uniparty_signature_for_input( &private_key, sighash_type, diff --git a/common/src/chain/transaction/signature/inputsig/classical_multisig/authorize_classical_multisig.rs b/common/src/chain/transaction/signature/inputsig/classical_multisig/authorize_classical_multisig.rs index 436237bd6b..4f25b5d35e 100644 --- a/common/src/chain/transaction/signature/inputsig/classical_multisig/authorize_classical_multisig.rs +++ b/common/src/chain/transaction/signature/inputsig/classical_multisig/authorize_classical_multisig.rs @@ -270,7 +270,7 @@ mod tests { use std::num::NonZeroU8; use crypto::key::{KeyKind, PrivateKey}; - use randomness::{Rng, SliceRandom}; + use randomness::{RngExt as _, SliceRandom}; use rstest::rstest; use std::cmp::Ordering; use test_utils::random::{make_seedable_rng, Seed}; @@ -286,9 +286,9 @@ mod tests { let mut rng = make_seedable_rng(seed); let chain_config = create_mainnet(); - let min_required_signatures = (rng.gen::() % 10) + 1; + let min_required_signatures = (rng.random::() % 10) + 1; let min_required_signatures: NonZeroU8 = min_required_signatures.try_into().unwrap(); - let total_parties = (rng.gen::() % 5) + min_required_signatures.get(); + let total_parties = (rng.random::() % 5) + min_required_signatures.get(); let (priv_keys, pub_keys): (Vec<_>, Vec<_>) = (0..total_parties) .map(|_| PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr)) .unzip(); @@ -413,9 +413,9 @@ mod tests { let mut rng = make_seedable_rng(seed); let chain_config = create_mainnet(); - let min_required_signatures = (rng.gen::() % 10) + 2; // we need at least 2 signatures for this test + let min_required_signatures = (rng.random::() % 10) + 2; // we need at least 2 signatures for this test let min_required_signatures: NonZeroU8 = min_required_signatures.try_into().unwrap(); - let total_parties = (rng.gen::() % 5) + min_required_signatures.get(); + let total_parties = (rng.random::() % 5) + min_required_signatures.get(); let (priv_keys, pub_keys): (Vec<_>, Vec<_>) = (0..total_parties) .map(|_| PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr)) .unzip(); @@ -554,9 +554,9 @@ mod tests { let mut rng = make_seedable_rng(seed); let chain_config = create_mainnet(); - let min_required_signatures = (rng.gen::() % 10) + 1; + let min_required_signatures = (rng.random::() % 10) + 1; let min_required_signatures: NonZeroU8 = min_required_signatures.try_into().unwrap(); - let total_parties = (rng.gen::() % 5) + min_required_signatures.get(); + let total_parties = (rng.random::() % 5) + min_required_signatures.get(); let (priv_keys, pub_keys): (Vec<_>, Vec<_>) = (0..total_parties) .map(|_| PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr)) .unzip(); @@ -717,9 +717,9 @@ mod tests { let mut rng = make_seedable_rng(seed); let chain_config = create_mainnet(); - let min_required_signatures = (rng.gen::() % 10) + 2; // minimum is two, so that multiple signatures are required + let min_required_signatures = (rng.random::() % 10) + 2; // minimum is two, so that multiple signatures are required let min_required_signatures: NonZeroU8 = min_required_signatures.try_into().unwrap(); - let total_parties = (rng.gen::() % 5) + min_required_signatures.get(); + let total_parties = (rng.random::() % 5) + min_required_signatures.get(); let (priv_keys, pub_keys): (Vec<_>, Vec<_>) = (0..total_parties) .map(|_| PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr)) .unzip(); @@ -751,7 +751,7 @@ mod tests { let invalid_challenge = ClassicMultisigChallenge::decode(&mut encoded_challenge.as_slice()).unwrap(); - let key_index = rng.gen::() % total_parties; + let key_index = rng.random::() % total_parties; let private_key = &priv_keys[key_index as usize]; let sign_err = sign_classical_multisig_spending( @@ -775,7 +775,7 @@ mod tests { // Signing the same signature multiple times should fail { - let key_index = rng.gen::() % total_parties; + let key_index = rng.random::() % total_parties; let private_key = &priv_keys[key_index as usize]; let sign_result = sign_classical_multisig_spending( @@ -812,7 +812,7 @@ mod tests { // Making the signatures structurally invalid should make signing fail { - let key_index = rng.gen::() % total_parties; + let key_index = rng.random::() % total_parties; let private_key = &priv_keys[key_index as usize]; let sign_result = sign_classical_multisig_spending( @@ -861,7 +861,7 @@ mod tests { // Signing with a private key that doesn't match the public key in the challenge should fail { - let key_index = rng.gen::() % total_parties; + let key_index = rng.random::() % total_parties; let (new_random_private_key, _) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); @@ -886,12 +886,12 @@ mod tests { { // we need to be able to sign with at least 2 keys, so that we can botch the first signature assert!(min_required_signatures.get() > 1); - let key_index = rng.gen::() % total_parties; + let key_index = rng.random::() % total_parties; let private_key = &priv_keys[key_index as usize]; // Second key index to attempt to sign with let second_key_index = loop { - let index = rng.gen::() % total_parties; + let index = rng.random::() % total_parties; if index != key_index { break index; } diff --git a/common/src/chain/transaction/signature/inputsig/classical_multisig/multisig_partial_signature.rs b/common/src/chain/transaction/signature/inputsig/classical_multisig/multisig_partial_signature.rs index f87b780fcf..f7b294ecee 100644 --- a/common/src/chain/transaction/signature/inputsig/classical_multisig/multisig_partial_signature.rs +++ b/common/src/chain/transaction/signature/inputsig/classical_multisig/multisig_partial_signature.rs @@ -148,18 +148,17 @@ pub enum SigsVerifyResult { #[cfg(test)] mod tests { - use std::collections::BTreeMap; - use std::num::NonZeroU8; + use std::{collections::BTreeMap, num::NonZeroU8}; - use crypto::key::{KeyKind, PrivateKey, Signature}; - use randomness::{CryptoRng, Rng, SliceRandom}; use rstest::rstest; - use crate::chain::config::create_mainnet; - use crate::primitives::H256; + use crypto::key::{KeyKind, PrivateKey, Signature}; + use randomness::{CryptoRng, IndexedMutRandom as _, Rng, RngExt as _, SliceRandom}; use serialization::{DecodeAll, Encode}; use test_utils::random::{make_seedable_rng, Seed}; + use crate::{chain::config::create_mainnet, primitives::H256}; + use super::*; struct TestChallengeData { @@ -171,12 +170,12 @@ mod tests { } impl TestChallengeData { - fn new_random(rng: &mut (impl Rng + CryptoRng)) -> Self { + fn new_random(rng: &mut impl CryptoRng) -> Self { let chain_config = create_mainnet(); - let min_required_signatures = (rng.gen::() % 10) + 1; + let min_required_signatures = (rng.random::() % 10) + 1; let min_required_signatures: NonZeroU8 = min_required_signatures.try_into().unwrap(); - let total_parties = (rng.gen::() % 5) + min_required_signatures.get(); + let total_parties = (rng.random::() % 5) + min_required_signatures.get(); let (priv_keys, pub_keys): (Vec<_>, Vec<_>) = (0..total_parties) .map(|_| PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr)) .unzip(); @@ -350,7 +349,7 @@ mod tests { } } - fn check_wrong_key(rng: &mut (impl Rng + CryptoRng), data: &TestChallengeData) { + fn check_wrong_key(rng: &mut impl CryptoRng, data: &TestChallengeData) { let TestChallengeData { chain_config, challenge, diff --git a/common/src/chain/transaction/signature/sighash/hashable.rs b/common/src/chain/transaction/signature/sighash/hashable.rs index f8fdffcf2a..1c302eb46e 100644 --- a/common/src/chain/transaction/signature/sighash/hashable.rs +++ b/common/src/chain/transaction/signature/sighash/hashable.rs @@ -136,7 +136,7 @@ mod tests { use rstest::rstest; use crypto::hash::StreamHasher; - use randomness::{CryptoRng, Rng}; + use randomness::{CryptoRng, Rng, RngExt as _}; use test_utils::random::{make_seedable_rng, Seed}; use crate::{ @@ -153,7 +153,7 @@ mod tests { use super::*; fn generate_random_input(rng: &mut impl Rng) -> TxInput { - let outpoint = if rng.gen::() { + let outpoint = if rng.random::() { OutPointSourceId::Transaction(Id::new(H256::random_using(rng))) } else { OutPointSourceId::BlockReward(Id::new(H256::random_using(rng))) @@ -165,7 +165,7 @@ mod tests { fn do_test_hashable_inputs( inputs_count: usize, input_commitments_count: usize, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) { let inputs = (0..inputs_count).map(|_| generate_random_input(rng)).collect::>(); @@ -191,7 +191,7 @@ mod tests { let mut stream = DefaultHashAlgoStream::new(); - let index_to_hash = rng.gen_range(0..inputs.len()); + let index_to_hash = rng.random_range(0..inputs.len()); // Invalid input index assert!(hashable_inputs @@ -225,8 +225,8 @@ mod tests { fn signature_hashable_inputs(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let inputs_count = rng.gen_range(0..100); - let inputs_utxos_count = rng.gen_range(0..100); + let inputs_count = rng.random_range(0..100); + let inputs_utxos_count = rng.random_range(0..100); // invalid case do_test_hashable_inputs(inputs_count, inputs_utxos_count, &mut rng); @@ -297,7 +297,7 @@ mod tests { let mut rng = make_seedable_rng(seed); for sighash_type in sig_hash_types() { - let inputs_count = rng.gen_range(1..100); + let inputs_count = rng.random_range(1..100); let inputs = (0..inputs_count).map(|_| generate_random_input(&mut rng)).collect::>(); let inputs_utxos = generate_inputs_utxos(&mut rng, inputs_count); @@ -309,7 +309,7 @@ mod tests { inputs_utxos: &inputs_utxos_refs, }; - let input_index = rng.gen_range(0..inputs_count); + let input_index = rng.random_range(0..inputs_count); let hash_legacy: H256 = { let mut stream = DefaultHashAlgoStream::new(); diff --git a/common/src/chain/transaction/signature/tests/mod.rs b/common/src/chain/transaction/signature/tests/mod.rs index 21e1deed26..bb68702f1f 100644 --- a/common/src/chain/transaction/signature/tests/mod.rs +++ b/common/src/chain/transaction/signature/tests/mod.rs @@ -20,7 +20,7 @@ use rstest::rstest; use strum::IntoEnumIterator as _; use crypto::key::{KeyKind, PrivateKey}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, Rng, RngExt as _}; use serialization::{DecodeAll, Encode}; use test_utils::random::Seed; @@ -650,7 +650,7 @@ fn mutate_single_anyonecanpay(#[case] seed: Seed) { fn sign_mutate_then_verify( chain_config: &ChainConfig, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, private_key: &PrivateKey, sighash_type: SigHashType, destination: &Destination, @@ -708,7 +708,7 @@ fn check_change_flags( fn check_append_input( chain_config: &ChainConfig, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, original_tx: &SignedTransactionWithInputCommitments, destination: &Destination, input_index_to_check: usize, @@ -719,7 +719,7 @@ fn check_append_input( OutPointSourceId::Transaction(Id::::new(H256::random_using(rng))); let inputs_utxo = TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, ); let mut input_commitments = original_tx.input_commitments.clone(); @@ -778,7 +778,7 @@ fn check_mutate_witness( fn check_append_output( chain_config: &ChainConfig, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, original_tx: &SignedTransactionWithInputCommitments, destination: &Destination, input_index_to_check: usize, @@ -787,7 +787,7 @@ fn check_append_output( let mut tx_updater = MutableTransaction::from(&original_tx.tx); let (_, pub_key) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); tx_updater.outputs.push(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::PublicKey(pub_key), )); let tx = tx_updater.generate_tx().unwrap(); @@ -898,7 +898,7 @@ fn check_mutate_input_commitment( should_fail: bool, ) { let input_utxo = TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, ); let mut input_commitments = original_tx.input_commitments.clone(); @@ -958,7 +958,7 @@ fn mutate_each_input_commitment_check_same_input( ) { for input_index in 0..original_tx.input_commitments.len() { let input_utxo = TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, ); let mut input_commitments = original_tx.input_commitments.clone(); diff --git a/common/src/chain/transaction/signature/tests/sign_and_mutate.rs b/common/src/chain/transaction/signature/tests/sign_and_mutate.rs index f47dce6ebb..1f82205c58 100644 --- a/common/src/chain/transaction/signature/tests/sign_and_mutate.rs +++ b/common/src/chain/transaction/signature/tests/sign_and_mutate.rs @@ -33,7 +33,7 @@ use crate::{ primitives::{Amount, Id, H256}, }; use crypto::key::{KeyKind, PrivateKey}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, Rng, RngExt as _}; use test_utils::gen_different_value; use super::{add_value, utils::*}; @@ -883,8 +883,8 @@ fn mutate_first_input( let mutated_input = match updater.inputs.first().unwrap() { TxInput::Utxo(outpoint) => { - if rng.gen::() { - TxInput::Utxo(UtxoOutPoint::new(outpoint.source_id(), rng.gen())) + if rng.random::() { + TxInput::Utxo(UtxoOutPoint::new(outpoint.source_id(), rng.random())) } else { TxInput::Utxo(UtxoOutPoint::new( OutPointSourceId::Transaction(Id::::from(H256::random_using(rng))), @@ -893,12 +893,12 @@ fn mutate_first_input( } } TxInput::Account(outpoint) => { - if rng.gen::() { + if rng.random::() { TxInput::Account(AccountOutPoint::new( outpoint.nonce(), AccountSpending::DelegationBalance( DelegationId::new(H256::random_using(rng)), - Amount::from_atoms(rng.gen()), + Amount::from_atoms(rng.random()), ), )) } else { @@ -910,7 +910,7 @@ fn mutate_first_input( } } TxInput::AccountCommand(nonce, op) => { - if rng.gen::() { + if rng.random::() { TxInput::AccountCommand( *nonce, AccountCommand::ChangeTokenAuthority( @@ -944,7 +944,7 @@ fn mutate_first_input( } fn mutate_first_input_commitment( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tx: &SignedTransactionWithInputCommitments, ) -> SignedTransactionWithInputCommitments { let mut input_commitments = tx.input_commitments.clone(); diff --git a/common/src/chain/transaction/signature/tests/utils.rs b/common/src/chain/transaction/signature/tests/utils.rs index 79f7426d4b..f5e755d673 100644 --- a/common/src/chain/transaction/signature/tests/utils.rs +++ b/common/src/chain/transaction/signature/tests/utils.rs @@ -22,7 +22,7 @@ use crypto::{ key::{KeyKind, PrivateKey, PublicKey}, vrf::{VRFKeyKind, VRFPrivateKey, VRFPublicKey}, }; -use randomness::{seq::IteratorRandom as _, CryptoRng, Rng}; +use randomness::{seq::IteratorRandom as _, CryptoRng, Rng, RngExt as _}; use script::Script; use test_utils::{random::gen_random_bytes, random_ascii_alphanumeric_string}; @@ -53,27 +53,27 @@ use crate::{ primitives::{amount::UnsignedIntType, per_thousand::PerThousand, Amount, Id, H256}, }; -fn make_random_output_value(rng: &mut (impl Rng + CryptoRng)) -> OutputValue { - if rng.gen::() { - OutputValue::Coin(Amount::from_atoms(rng.gen())) +fn make_random_output_value(rng: &mut impl CryptoRng) -> OutputValue { + if rng.random::() { + OutputValue::Coin(Amount::from_atoms(rng.random())) } else { - OutputValue::TokenV1(H256(rng.gen()).into(), Amount::from_atoms(rng.gen())) + OutputValue::TokenV1(H256(rng.random()).into(), Amount::from_atoms(rng.random())) } } -fn make_random_destination(rng: &mut (impl Rng + CryptoRng)) -> Destination { +fn make_random_destination(rng: &mut impl CryptoRng) -> Destination { Destination::PublicKey(make_random_pub_key(rng)) } -fn make_random_pub_key(rng: &mut (impl Rng + CryptoRng)) -> PublicKey { +fn make_random_pub_key(rng: &mut impl CryptoRng) -> PublicKey { PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr).1 } -fn make_random_vrf_pub_key(rng: &mut (impl Rng + CryptoRng)) -> VRFPublicKey { +fn make_random_vrf_pub_key(rng: &mut impl CryptoRng) -> VRFPublicKey { VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel).1 } -pub fn generate_input_utxo_for_tag(rng: &mut (impl Rng + CryptoRng), tag: TxOutputTag) -> TxOutput { +pub fn generate_input_utxo_for_tag(rng: &mut impl CryptoRng, tag: TxOutputTag) -> TxOutput { match tag { TxOutputTag::Transfer => { TxOutput::Transfer(make_random_output_value(rng), make_random_destination(rng)) @@ -81,18 +81,18 @@ pub fn generate_input_utxo_for_tag(rng: &mut (impl Rng + CryptoRng), tag: TxOutp TxOutputTag::LockThenTransfer => TxOutput::LockThenTransfer( make_random_output_value(rng), make_random_destination(rng), - OutputTimeLock::ForBlockCount(rng.gen()), + OutputTimeLock::ForBlockCount(rng.random()), ), TxOutputTag::Burn => TxOutput::Burn(make_random_output_value(rng)), TxOutputTag::CreateStakePool => { let pool_id = PoolId::random_using(rng); let pool_data = StakePoolData::new( - Amount::from_atoms(rng.gen()), + Amount::from_atoms(rng.random()), make_random_destination(rng), make_random_vrf_pub_key(rng), make_random_destination(rng), - PerThousand::new(rng.gen_range(0..=1000)).unwrap(), - Amount::from_atoms(rng.gen()), + PerThousand::new(rng.random_range(0..=1000)).unwrap(), + Amount::from_atoms(rng.random()), ); TxOutput::CreateStakePool(pool_id, Box::new(pool_data)) } @@ -103,15 +103,15 @@ pub fn generate_input_utxo_for_tag(rng: &mut (impl Rng + CryptoRng), tag: TxOutp TxOutput::CreateDelegationId(make_random_destination(rng), PoolId::random_using(rng)) } TxOutputTag::DelegateStaking => TxOutput::DelegateStaking( - Amount::from_atoms(rng.gen()), + Amount::from_atoms(rng.random()), DelegationId::random_using(rng), ), TxOutputTag::IssueFungibleToken => { let issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(rng, 3..5).into_bytes(), - number_of_decimals: rng.gen(), + number_of_decimals: rng.random(), metadata_uri: random_ascii_alphanumeric_string(rng, 10..20).into_bytes(), - total_supply: TokenTotalSupply::Fixed(Amount::from_atoms(rng.gen())), + total_supply: TokenTotalSupply::Fixed(Amount::from_atoms(rng.random())), authority: make_random_destination(rng), is_freezable: IsTokenFreezable::Yes, }); @@ -141,7 +141,7 @@ pub fn generate_input_utxo_for_tag(rng: &mut (impl Rng + CryptoRng), tag: TxOutp let htlc = HashedTimelockContract { secret_hash: HtlcSecretHash::random_using(rng), spend_key: make_random_destination(rng), - refund_timelock: OutputTimeLock::ForBlockCount(rng.gen()), + refund_timelock: OutputTimeLock::ForBlockCount(rng.random()), refund_key: make_random_destination(rng), }; TxOutput::Htlc(make_random_output_value(rng), Box::new(htlc)) @@ -157,13 +157,13 @@ pub fn generate_input_utxo_for_tag(rng: &mut (impl Rng + CryptoRng), tag: TxOutp } } -pub fn generate_input_utxo(rng: &mut (impl Rng + CryptoRng)) -> TxOutput { +pub fn generate_input_utxo(rng: &mut impl CryptoRng) -> TxOutput { let tag = TxOutputTag::iter().choose(rng).unwrap(); generate_input_utxo_for_tag(rng, tag) } pub fn generate_input_commitment_for_tag( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tag: SighashInputCommitmentTag, ) -> SighashInputCommitment<'static> { match tag { @@ -174,7 +174,7 @@ pub fn generate_input_commitment_for_tag( } SighashInputCommitmentTag::ProduceBlockFromStakeUtxo => { let utxo = generate_input_utxo(rng); - let staker_balance = Amount::from_atoms(rng.gen::()); + let staker_balance = Amount::from_atoms(rng.random::()); SighashInputCommitment::ProduceBlockFromStakeUtxo { utxo: Cow::Owned(utxo), staker_balance, @@ -192,8 +192,8 @@ pub fn generate_input_commitment_for_tag( SighashInputCommitmentTag::ConcludeOrderAccountCommand => { let initially_asked = make_random_output_value(rng); let initially_given = make_random_output_value(rng); - let ask_balance = Amount::from_atoms(rng.gen()); - let give_balance = Amount::from_atoms(rng.gen()); + let ask_balance = Amount::from_atoms(rng.random()); + let give_balance = Amount::from_atoms(rng.random()); SighashInputCommitment::ConcludeOrderAccountCommand { initially_asked, @@ -205,27 +205,25 @@ pub fn generate_input_commitment_for_tag( } } -pub fn generate_input_commitment( - rng: &mut (impl Rng + CryptoRng), -) -> SighashInputCommitment<'static> { +pub fn generate_input_commitment(rng: &mut impl CryptoRng) -> SighashInputCommitment<'static> { let tag = SighashInputCommitmentTag::iter().choose(rng).unwrap(); generate_input_commitment_for_tag(rng, tag) } pub fn generate_input_commitments( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, input_count: usize, ) -> Vec> { (0..input_count).map(|_| generate_input_commitment(rng)).collect() } pub fn generate_inputs_utxos( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, input_count: usize, ) -> Vec> { (0..input_count) .map(|_| { - if rng.gen::() { + if rng.random::() { Some(generate_input_utxo(rng)) } else { None @@ -269,24 +267,24 @@ pub struct SignedTransactionWithInputCommitments { } pub fn generate_unsigned_tx( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, destination: &Destination, inputs_count: usize, outputs_count: usize, ) -> Result { let inputs = (0..inputs_count) .map(|_| { - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { TxInput::from_utxo( Id::::new(H256::random_using(rng)).into(), - rng.gen(), + rng.random(), ) } else { TxInput::from_account( - AccountNonce::new(rng.gen()), + AccountNonce::new(rng.random()), AccountSpending::DelegationBalance( DelegationId::new(H256::random_using(rng)), - Amount::from_atoms(rng.gen()), + Amount::from_atoms(rng.random()), ), ) } @@ -295,19 +293,19 @@ pub fn generate_unsigned_tx( let outputs = std::iter::from_fn(|| { Some(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen::())), + OutputValue::Coin(Amount::from_atoms(rng.random::())), destination.clone(), )) }) .take(outputs_count) .collect(); - let tx = Transaction::new(rng.gen(), inputs, outputs)?; + let tx = Transaction::new(rng.random(), inputs, outputs)?; Ok(tx) } pub fn sign_whole_tx( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tx: Transaction, input_commitments: &[SighashInputCommitment], private_key: &PrivateKey, @@ -337,7 +335,7 @@ pub fn sign_whole_tx( pub fn generate_and_sign_tx( chain_config: &ChainConfig, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, destination: &Destination, input_commitments: &[SighashInputCommitment], outputs_count: usize, @@ -364,7 +362,7 @@ pub fn generate_and_sign_tx( pub fn generate_signed_tx_with_input_commitments( chain_config: &ChainConfig, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, destination: &Destination, inputs_count: usize, outputs_count: usize, @@ -390,7 +388,7 @@ pub fn generate_signed_tx_with_input_commitments( } pub fn make_signature( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tx: &Transaction, input_commitments: &[SighashInputCommitment], input_num: usize, diff --git a/common/src/chain/transaction/signed_transaction.rs b/common/src/chain/transaction/signed_transaction.rs index 8958c1ef01..ac63708da9 100644 --- a/common/src/chain/transaction/signed_transaction.rs +++ b/common/src/chain/transaction/signed_transaction.rs @@ -150,7 +150,7 @@ impl OutputValuesHolder for SignedTransaction { mod tests { use crate::primitives::Amount; use rstest::rstest; - use test_utils::random::{make_seedable_rng, Rng, Seed}; + use test_utils::random::{make_seedable_rng, RngExt as _, Seed}; use super::*; @@ -222,21 +222,21 @@ mod tests { let mut rng = make_seedable_rng(seed); // The only reason a manual decode is done is to enforce witness rules, hence we double check that round-trip encoding works - let input_count = 1 + rng.gen::() % 10; + let input_count = rng.random_range(1..=10); let inputs = (0..input_count) .map(|_| { TxInput::from_utxo( Id::::new(H256::random_using(&mut rng)).into(), - rng.gen::() % 10, + rng.random::() % 10, ) }) .collect::>(); - let output_count = 1 + rng.gen::() % 10; + let output_count = rng.random_range(1..=10); let outputs = (0..output_count) .map(|_| { TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen::())), + OutputValue::Coin(Amount::from_atoms(rng.random::())), crate::chain::Destination::AnyoneCanSpend, ) }) @@ -244,15 +244,15 @@ mod tests { let witnesses = (0..input_count) .map(|_| { - let witness_size = 1 + rng.gen::() % 100; - let witness = (0..witness_size).map(|_| rng.gen::()).collect::>(); + let witness_size = rng.random_range(1..=100); + let witness = (0..witness_size).map(|_| rng.random::()).collect::>(); InputWitness::NoSignature(Some(witness)) }) .collect::>(); // Witness count that isn't equal to the input count let invalid_witness_count = loop { - let invalid_witness_count = rng.gen::() % input_count; + let invalid_witness_count = rng.random_range(0..input_count); if invalid_witness_count != witnesses.len() { break invalid_witness_count; } @@ -260,14 +260,14 @@ mod tests { let invalid_witnesses = (0..invalid_witness_count) .map(|_| { - let witness_size = 1 + rng.gen::() % 100; - let witness = (0..witness_size).map(|_| rng.gen::()).collect::>(); + let witness_size = rng.random_range(1..=100); + let witness = (0..witness_size).map(|_| rng.random::()).collect::>(); InputWitness::NoSignature(Some(witness)) }) .collect::>(); { - let flags = rng.gen::(); + let flags = rng.random::(); let tx = Transaction::new(flags, inputs, outputs).unwrap(); let signed_tx = SignedTransaction::new(tx, witnesses).unwrap(); diff --git a/common/src/chain/transaction/signed_transaction_intent.rs b/common/src/chain/transaction/signed_transaction_intent.rs index bfb4bb6d6c..e16a58550d 100644 --- a/common/src/chain/transaction/signed_transaction_intent.rs +++ b/common/src/chain/transaction/signed_transaction_intent.rs @@ -271,7 +271,7 @@ mod tests { use rstest::rstest; use crypto::key::{KeyKind, PrivateKey}; - use randomness::Rng; + use randomness::RngExt; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -310,7 +310,7 @@ mod tests { let chain_config = config::create_unit_test_config(); for _ in 0..10 { - let inputs_count = rng.gen_range(1..=10); + let inputs_count = rng.random_range(1..=10); let mut prv_keys = BTreeMap::new(); let (input_destinations, flipped_input_destinations): (Vec<_>, Vec<_>) = (0 @@ -324,7 +324,7 @@ mod tests { prv_keys.insert(pub_key_dest.clone(), prv_key.clone()); prv_keys.insert(pub_key_hash_dest.clone(), prv_key); - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { (pub_key_dest, pub_key_hash_dest) } else { (pub_key_hash_dest, pub_key_dest) @@ -335,7 +335,7 @@ mod tests { let (prv_key, pub_key) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); - let dest = if rng.gen_bool(0.5) { + let dest = if rng.random_bool(0.5) { Destination::PublicKey(pub_key) } else { Destination::PublicKeyHash((&pub_key).into()) @@ -348,7 +348,7 @@ mod tests { let tx_inputs = (0..inputs_count) .map(|_| { let tx_id = Id::new(H256::random_using(&mut rng)); - let idx = rng.gen_range(0..10); + let idx = rng.random_range(0..10); TxInput::from_utxo(OutPointSourceId::Transaction(tx_id), idx) }) .collect_vec(); @@ -359,7 +359,7 @@ mod tests { let expected_signed_message = SignedTransactionIntent::get_message_to_sign(&intent_str, &tx_id); // Use the same state of rng for all "produce_" calls to be able to compare the signatures. - let signer_rng_seed = rng.gen(); + let signer_rng_seed = rng.random(); let signed_intent1 = SignedTransactionIntent::produce_from_transaction( &tx, @@ -424,7 +424,7 @@ mod tests { } ); - let input_index_to_replace = rng.gen_range(0..input_destinations.len()); + let input_index_to_replace = rng.random_range(0..input_destinations.len()); let input_destinations_replaced = { let mut destinations = input_destinations.clone(); @@ -455,7 +455,7 @@ mod tests { fn invalid_destinations_count_test(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let total_destinations_count = rng.gen_range(2..=10); + let total_destinations_count = rng.random_range(2..=10); let input_destinations = (0..total_destinations_count) .map(|_| { @@ -468,7 +468,7 @@ mod tests { let tx_inputs = (0..total_destinations_count - 1) .map(|_| { let tx_id = Id::new(H256::random_using(&mut rng)); - let idx = rng.gen_range(0..10); + let idx = rng.random_range(0..10); TxInput::from_utxo(OutPointSourceId::Transaction(tx_id), idx) }) .collect_vec(); @@ -515,7 +515,7 @@ mod tests { fn unsupported_destination_when_signing_test(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let destinations_count = rng.gen_range(2..=10); + let destinations_count = rng.random_range(2..=10); let mut prv_keys = BTreeMap::new(); let orig_destinations = (0..destinations_count) @@ -531,7 +531,7 @@ mod tests { let tx_inputs = (0..destinations_count) .map(|_| { let tx_id = Id::new(H256::random_using(&mut rng)); - let idx = rng.gen_range(0..10); + let idx = rng.random_range(0..10); TxInput::from_utxo(OutPointSourceId::Transaction(tx_id), idx) }) .collect_vec(); @@ -545,7 +545,7 @@ mod tests { Destination::ScriptHash(Id::new(H256::random_using(&mut rng))), Destination::ClassicMultisig(PublicKeyHash::random_using(&mut rng)), ]; - let dest_index_to_replace = rng.gen_range(0..destinations_count); + let dest_index_to_replace = rng.random_range(0..destinations_count); for unsupported_destination in unsupported_destinations { let mut destinations = orig_destinations.clone(); diff --git a/common/src/primitives/amount/tests.rs b/common/src/primitives/amount/tests.rs index 0b46e9315b..366c89ae5c 100644 --- a/common/src/primitives/amount/tests.rs +++ b/common/src/primitives/amount/tests.rs @@ -15,7 +15,7 @@ use super::{signed::SignedIntType, *}; -use randomness::Rng; +use randomness::RngExt; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; @@ -175,8 +175,8 @@ fn bit_shifts() { #[case(Seed::from_entropy())] fn abs_diff_never_fails(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let a = Amount::from_atoms(rng.gen()); - let b = Amount::from_atoms(rng.gen()); + let a = Amount::from_atoms(rng.random()); + let b = Amount::from_atoms(rng.random()); let _ = a.abs_diff(b); } @@ -651,7 +651,7 @@ fn serde_serialization() { fn serde_serialization_randomized(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let amount: Amount = Amount::from_atoms(rng.gen()); + let amount: Amount = Amount::from_atoms(rng.random()); let serialized = serde_json::to_string(&amount).unwrap(); @@ -679,7 +679,7 @@ fn as_non_zero(#[case] seed: Seed) { assert_eq!(Amount::from_atoms(0).as_non_zero(), None); for _ in 0..100 { - let amount = Amount::from_atoms(rng.gen_range(1..=UnsignedIntType::MAX)); + let amount = Amount::from_atoms(rng.random_range(1..=UnsignedIntType::MAX)); assert_eq!(amount.as_non_zero(), Some(amount)); } } diff --git a/common/src/primitives/bech32_encoding/tests.rs b/common/src/primitives/bech32_encoding/tests.rs index bc4eae4562..e66b0dbd89 100644 --- a/common/src/primitives/bech32_encoding/tests.rs +++ b/common/src/primitives/bech32_encoding/tests.rs @@ -15,7 +15,7 @@ use bitcoin_bech32::WitnessProgram; use hex::FromHex; -use randomness::{distributions::Alphanumeric, make_pseudo_rng, Rng}; +use randomness::{distributions::Alphanumeric, make_pseudo_rng, Rng, RngExt as _}; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; @@ -228,14 +228,14 @@ fn check_bech32m_convertion_to_arbitraty_chosen_data( } fn bech32m_test_random_data(rng: &mut impl Rng, data_length: usize) { - let hrp_length = 1 + rng.gen::() % 10; + let hrp_length = rng.random_range(1..=10); let test_hrp = make_pseudo_rng() .sample_iter(&Alphanumeric) .take(hrp_length) .map(char::from) .collect::() .to_lowercase(); - let random_bytes: Vec = (0..data_length).map(|_| rng.gen::()).collect(); + let random_bytes: Vec = (0..data_length).map(|_| rng.random::()).collect(); let encoded_data = super::bech32m_encode(&test_hrp, &random_bytes).unwrap(); let decoded_data = super::bech32m_decode(encoded_data).unwrap(); @@ -248,7 +248,7 @@ fn bech32m_test_random_data(rng: &mut impl Rng, data_length: usize) { #[case(Seed::from_entropy())] fn bech32m_check_random_data_convertion_back_and_forth(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let data_length = rng.gen::() % 100; + let data_length = rng.random_range(0..100); bech32m_test_random_data(&mut rng, data_length); } @@ -257,8 +257,8 @@ fn bech32m_check_random_data_convertion_back_and_forth(#[case] seed: Seed) { #[case(Seed::from_entropy())] fn bech32m_hrp_is_empty(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let data_length = 10 + rng.gen::() % 100; - let random_bytes: Vec = (0..data_length).map(|_| rng.gen::()).collect(); + let data_length = 10 + rng.random_range(0..100); + let random_bytes: Vec = (0..data_length).map(|_| rng.random::()).collect(); assert_eq!( super::bech32m_encode("", random_bytes).unwrap_err(), diff --git a/common/src/primitives/id/mod.rs b/common/src/primitives/id/mod.rs index 114972631a..0fd19c1594 100644 --- a/common/src/primitives/id/mod.rs +++ b/common/src/primitives/id/mod.rs @@ -32,7 +32,7 @@ use crate::Uint256; pub use with_id::WithId; -fixed_hash::construct_fixed_hash! { +utils::construct_fixed_hash! { #[derive(Encode, Decode)] pub struct H256(32); } @@ -354,8 +354,8 @@ mod tests { #[test] fn hashes_stream_and_msg_identical() { - use randomness::{make_pseudo_rng, Rng}; - let random_bytes = make_pseudo_rng().gen::<[u8; H256::len_bytes()]>(); + use randomness::{make_pseudo_rng, RngExt as _}; + let random_bytes = make_pseudo_rng().random::<[u8; H256::len_bytes()]>(); let h1 = default_hash(random_bytes); let mut hash_stream = DefaultHashAlgoStream::new(); diff --git a/common/src/primitives/per_thousand.rs b/common/src/primitives/per_thousand.rs index d09b608172..f55f2fd890 100644 --- a/common/src/primitives/per_thousand.rs +++ b/common/src/primitives/per_thousand.rs @@ -15,7 +15,7 @@ use std::fmt::Display; -use randomness::Rng; +use randomness::{Rng, RngExt as _}; use rpc_description::HasValueHint; use serialization::{Decode, Encode, Error, Input}; use thiserror::Error; @@ -38,7 +38,7 @@ impl PerThousand { } pub fn new_from_rng(rng: &mut impl Rng) -> Self { - Self(rng.gen_range(0..=DENOMINATOR)) + Self(rng.random_range(0..=DENOMINATOR)) } pub fn value(&self) -> u16 { @@ -165,7 +165,7 @@ impl HasValueHint for PerThousand { mod tests { use super::*; - use randomness::Rng; + use randomness::RngExt; use rstest::rstest; use test_utils::random::Seed; @@ -191,7 +191,7 @@ mod tests { } // test an invalid value { - let value = rng.gen_range(1001..u16::MAX); + let value = rng.random_range(1001..u16::MAX); let per_thousand_str = Amount::into_fixedpoint_str(Amount::from_atoms(value as u128), 3); let per_thousand_str_percent = @@ -272,12 +272,12 @@ mod tests { assert!(PerThousand::new(u16::MAX).is_none()); { - let valid_value = rng.gen_range(0..=DENOMINATOR); + let valid_value = rng.random_range(0..=DENOMINATOR); assert_eq!(PerThousand::new(valid_value).unwrap().value(), valid_value); } { - let invalid_value = rng.gen_range(1001..=u16::MAX); + let invalid_value = rng.random_range(1001..=u16::MAX); assert!(PerThousand::new(invalid_value).is_none()); } } @@ -291,7 +291,7 @@ mod tests { let encoded_valid = PerThousand::new_from_rng(&mut rng).encode(); PerThousand::decode(&mut encoded_valid.as_slice()).unwrap(); - let encoded_invalid = rng.gen_range(1001..=u16::MAX).encode(); + let encoded_invalid = rng.random_range(1001..=u16::MAX).encode(); PerThousand::decode(&mut encoded_invalid.as_slice()).unwrap_err(); let mut encoded_1001: &[u8] = b"\xE9\x03"; @@ -479,7 +479,7 @@ mod tests { { // in range - let v = rng.gen_range(0..=DENOMINATOR); + let v = rng.random_range(0..=DENOMINATOR); // Serialize in all possible ways, and ensure it'll fail since it's larger than the max allowed value let v1 = serde_json::from_str::(&v.to_string()).unwrap(); @@ -501,7 +501,7 @@ mod tests { { // out of range - let v = rng.gen_range(DENOMINATOR + 1..u16::MAX); + let v = rng.random_range(DENOMINATOR + 1..u16::MAX); // Serialize in all possible ways, and ensure it'll fail since it's larger than the max allowed value let err1 = serde_json::from_str::(&v.to_string()).unwrap_err(); diff --git a/common/src/primitives/rational.rs b/common/src/primitives/rational.rs index 401aa33035..0bc8b9e02d 100644 --- a/common/src/primitives/rational.rs +++ b/common/src/primitives/rational.rs @@ -89,7 +89,7 @@ impl Display for Rational { #[cfg(test)] mod tests { use super::*; - use randomness::Rng; + use randomness::RngExt; use rstest::rstest; use test_utils::random::Seed; @@ -98,10 +98,10 @@ mod tests { #[case(Seed::from_entropy())] fn check_comparison_against_num(#[case] seed: Seed) { let mut rng = test_utils::random::make_seedable_rng(seed); - let a1 = rng.gen_range(1..u128::MAX); - let a2 = rng.gen_range(1..u128::MAX); - let b1 = rng.gen_range(1..u128::MAX); - let b2 = rng.gen_range(1..u128::MAX); + let a1 = rng.random_range(1..u128::MAX); + let a2 = rng.random_range(1..u128::MAX); + let b1 = rng.random_range(1..u128::MAX); + let b2 = rng.random_range(1..u128::MAX); let expected = num::rational::Ratio::::new_raw(a1, a2) @@ -120,10 +120,10 @@ mod tests { let a = Rational::new( Uint256::MAX, - Uint256::from_u128(rng.gen_range(1..u128::MAX)), + Uint256::from_u128(rng.random_range(1..u128::MAX)), ); let b = Rational::new( - Uint256::from_u128(rng.gen_range(1..u128::MAX)), + Uint256::from_u128(rng.random_range(1..u128::MAX)), Uint256::MAX, ); diff --git a/common/src/primitives/time.rs b/common/src/primitives/time.rs index 0bf3eee20f..c81f9505f3 100644 --- a/common/src/primitives/time.rs +++ b/common/src/primitives/time.rs @@ -192,7 +192,7 @@ mod tests { use rstest::rstest; use logging::log; - use randomness::Rng as _; + use randomness::RngExt as _; use test_utils::random::{make_seedable_rng, Seed}; use super::*; @@ -273,14 +273,14 @@ mod tests { let mut rng = make_seedable_rng(seed); for _ in 0..10 { - let year = rng.gen_range(1970..=3000); - let month = rng.gen_range(1..=12); + let year = rng.random_range(1970..=3000); + let month = rng.random_range(1..=12); let days_in_month = NaiveDate::from_ymd_opt(year, month, 1).unwrap().num_days_in_month(); - let day = rng.gen_range(1..=days_in_month); - let hour = rng.gen_range(0..24); - let min = rng.gen_range(0..60); - let sec = rng.gen_range(0..60); + let day = rng.random_range(1..=days_in_month); + let hour = rng.random_range(0..24); + let min = rng.random_range(0..60); + let sec = rng.random_range(0..60); let abs_time = DateTime::from_naive_utc_and_offset( NaiveDateTime::new( NaiveDate::from_ymd_opt(year, month, day.into()).unwrap(), @@ -294,7 +294,7 @@ mod tests { assert_eq!(abs_time_from_conversion, abs_time); // Only a whole number of seconds should be allowed. - let millis = rng.gen_range(1..1000); + let millis = rng.random_range(1..1000); let abs_time_with_millis = abs_time + Duration::from_millis(millis); assert!(Time::from_absolute_time(&abs_time_with_millis).is_none()); } diff --git a/common/src/size_estimation/tests.rs b/common/src/size_estimation/tests.rs index 74479055f3..3ddea28227 100644 --- a/common/src/size_estimation/tests.rs +++ b/common/src/size_estimation/tests.rs @@ -21,7 +21,7 @@ use rstest::rstest; use crypto::key::{KeyKind, PrivateKey}; use logging::log; -use randomness::Rng; +use randomness::RngExt; use serialization::Encode; use test_utils::random::{make_seedable_rng, Seed}; @@ -74,17 +74,17 @@ fn estimate_tx_size_basic( ) { let mut rng = make_seedable_rng(seed); - let num_inputs = rng.gen_range(inputs_range); + let num_inputs = rng.random_range(inputs_range); let inputs = (0..num_inputs) .map(|_| { TxInput::from_utxo( OutPointSourceId::Transaction(Id::random_using(&mut rng)), - rng.gen_range(0..100), + rng.random_range(0..100), ) }) .collect(); - let num_outputs = rng.gen_range(outputs_range); + let num_outputs = rng.random_range(outputs_range); let outputs = (0..num_outputs) .map(|_| { let destination = Destination::PublicKey( @@ -92,7 +92,7 @@ fn estimate_tx_size_basic( ); TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(1..10000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(1..10000))), destination, ) }) @@ -137,17 +137,17 @@ fn estimate_tx_size_different_sigs(#[case] seed: Seed) { let chain_config = create_unit_test_config(); - let num_inputs = rng.gen_range(1..10); + let num_inputs = rng.random_range(1..10); let inputs = (0..num_inputs) .map(|_| { TxInput::from_utxo( OutPointSourceId::Transaction(Id::random_using(&mut rng)), - rng.gen_range(0..100), + rng.random_range(0..100), ) }) .collect(); - let num_outputs = rng.gen_range(1..10); + let num_outputs = rng.random_range(1..10); let outputs = (0..num_outputs) .map(|_| { let destination = Destination::PublicKey( @@ -155,7 +155,7 @@ fn estimate_tx_size_different_sigs(#[case] seed: Seed) { ); TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(1..10000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(1..10000))), destination, ) }) @@ -166,7 +166,7 @@ fn estimate_tx_size_different_sigs(#[case] seed: Seed) { let tx = Transaction::new(0, inputs, outputs).unwrap(); let signatures_with_dests = (0..num_inputs) .map(|_| { - let (raw_sig, destination) = match rng.gen_range(0..3) { + let (raw_sig, destination) = match rng.random_range(0..3) { 0 => { let (prv_key, pub_key) = PrivateKey::new_from_rng(&mut rng, crypto::key::KeyKind::Secp256k1Schnorr); @@ -191,10 +191,10 @@ fn estimate_tx_size_different_sigs(#[case] seed: Seed) { } _ => { let max_sig_count: u8 = rng - .gen_range(2..=chain_config.max_classic_multisig_public_keys_count()) + .random_range(2..=chain_config.max_classic_multisig_public_keys_count()) .try_into() .unwrap(); - let min_sig_count = rng.gen_range(1..=max_sig_count); + let min_sig_count = rng.random_range(1..=max_sig_count); let keys = (0..max_sig_count) .map(|_| { @@ -213,7 +213,7 @@ fn estimate_tx_size_different_sigs(#[case] seed: Seed) { .unwrap(); let keys_with_indices = - keys.iter().enumerate().choose_multiple(&mut rng, min_sig_count as usize); + keys.iter().enumerate().sample(&mut rng, min_sig_count as usize); let mut spending = AuthorizedClassicalMultisigSpend::new_empty(challenge.clone()); @@ -252,10 +252,10 @@ fn estimate_tx_size_different_sigs(#[case] seed: Seed) { } }; - let (raw_sig, htlc_spend_tag) = match rng.gen_range(0..3) { + let (raw_sig, htlc_spend_tag) = match rng.random_range(0..3) { 0 => (raw_sig, None), 1 => { - let secret = HtlcSecret::new(rng.gen()); + let secret = HtlcSecret::new(rng.random()); let raw_sig = AuthorizedHashedTimelockContractSpend::Spend(secret, raw_sig).encode(); diff --git a/common/src/uint/impls.rs b/common/src/uint/impls.rs index a9812b3c9e..71b9501247 100644 --- a/common/src/uint/impls.rs +++ b/common/src/uint/impls.rs @@ -703,7 +703,7 @@ mod tests { use super::*; use crate::uint::BitArray; - use randomness::Rng; + use randomness::RngExt; use test_utils::random::{make_seedable_rng, Seed}; #[test] @@ -1126,7 +1126,7 @@ mod tests { fn uint256_from_uint128(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); for _ in 0..1000 { - let v = rng.gen::(); + let v = rng.random::(); let b1 = v << 64; let a1 = Uint256::from_u64(v as u64); let b2 = a1 << 64; @@ -1141,7 +1141,7 @@ mod tests { fn uint512_from_uint256(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); for _ in 0..1000 { - let v = rng.gen::(); + let v = rng.random::(); let a1 = v << 64; let b1 = Uint256::from_u128(a1) << (64 * 2); let a2 = Uint512::from_u64(v as u64); @@ -1198,7 +1198,7 @@ mod tests { let mut rng = make_seedable_rng(seed); for _ in 0..1000 { - let a = rng.gen::(); + let a = rng.random::(); let b = Uint128::from_u128(a); assert_eq!(a, b.into()); } @@ -1236,12 +1236,12 @@ mod tests { let mut rng = make_seedable_rng(seed); { let a = Uint128::MAX; - let b = rng.gen_range(1..u128::MAX).into(); + let b = rng.random_range(1..u128::MAX).into(); assert!(a.checked_add(&b).is_none()); assert!(b.checked_add(&a).is_none()); } { - let a: Uint128 = rng.gen::().into(); + let a: Uint128 = rng.random::().into(); let b = (Uint128::MAX - a).unwrap(); assert_eq!(a.checked_add(&b), Some(a.overflowing_add(&b).0)); } @@ -1254,12 +1254,12 @@ mod tests { let mut rng = make_seedable_rng(seed); { let a = Uint128::ZERO; - let b = rng.gen_range(1..u128::MAX).into(); + let b = rng.random_range(1..u128::MAX).into(); assert!(a.checked_sub(&b).is_none()); } { - let a = rng.gen::(); - let b: Uint128 = rng.gen_range(0..a).into(); + let a = rng.random::(); + let b: Uint128 = rng.random_range(0..a).into(); let a: Uint128 = a.into(); assert_eq!(a.checked_sub(&b), Some(a.unchecked_sub(&b))); assert_eq!(b.checked_sub(&a), None); @@ -1273,20 +1273,20 @@ mod tests { let mut rng = make_seedable_rng(seed); { let a = Uint128::MAX; - let b = rng.gen_range(2..u128::MAX).into(); + let b = rng.random_range(2..u128::MAX).into(); assert!(a.checked_mul(&b).is_none()); assert!(b.checked_mul(&a).is_none()); } { - let a: Uint128 = rng.gen::().into(); + let a: Uint128 = rng.random::().into(); let b = Uint128::ZERO; assert_eq!(a.checked_mul(&b), Some(Uint128::ZERO)); assert_eq!(b.checked_mul(&a), Some(Uint128::ZERO)); assert_eq!(b.checked_mul(&b), Some(Uint128::ZERO)); } { - let a = Uint128::from_u64(rng.gen::()); - let b = Uint128::from_u64(rng.gen::()); + let a = Uint128::from_u64(rng.random::()); + let b = Uint128::from_u64(rng.random::()); assert_eq!(a.checked_mul(&b), Some(a.widening_mul(&b).0)); } } @@ -1297,18 +1297,18 @@ mod tests { fn checked_div(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); { - let a: Uint128 = rng.gen::().into(); + let a: Uint128 = rng.random::().into(); let b = Uint128::ZERO; assert!(a.checked_div(&b).is_none()); } { let a = Uint128::ZERO; - let b: Uint128 = rng.gen::().into(); + let b: Uint128 = rng.random::().into(); assert_eq!(a.checked_div(&b), Some(Uint128::ZERO)); } { - let a: Uint128 = rng.gen::().into(); - let b: Uint128 = rng.gen::().into(); + let a: Uint128 = rng.random::().into(); + let b: Uint128 = rng.random::().into(); assert_eq!(a.checked_div(&b), Some(a.unchecked_div(&b))); } } diff --git a/common/tests/primitives_repo_consistency/main.rs b/common/tests/primitives_repo_consistency/main.rs index 06887afecd..78f6630e43 100644 --- a/common/tests/primitives_repo_consistency/main.rs +++ b/common/tests/primitives_repo_consistency/main.rs @@ -34,7 +34,7 @@ use common::{ primitives_converters::TryConvertInto as _, }; use crypto::{key::KeyKind, vrf::VRFKeyKind}; -use randomness::Rng as _; +use randomness::RngExt as _; use serialization::Encode; use test_utils::random::{make_seedable_rng, Seed}; @@ -411,7 +411,7 @@ fn test_id_encoding(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); for _ in 0..100 { - let ref_obj: RefCustomId = H256(rng.gen()).into(); + let ref_obj: RefCustomId = H256(rng.random()).into(); let test_obj = TestCustomId::new(ref_obj.to_hash().try_convert_into().unwrap()); let encoded_ref_obj = ref_obj.encode(); diff --git a/common/tests/primitives_repo_consistency/utils/makers.rs b/common/tests/primitives_repo_consistency/utils/makers.rs index 5fdb4937b1..dee91aa752 100644 --- a/common/tests/primitives_repo_consistency/utils/makers.rs +++ b/common/tests/primitives_repo_consistency/utils/makers.rs @@ -44,16 +44,16 @@ use crypto::{ key::{KeyKind, PrivateKey, PublicKey}, vrf::{VRFKeyKind, VRFPrivateKey, VRFPublicKey}, }; -use test_utils::random::{CryptoRng, IteratorRandom, Rng}; +use test_utils::random::{CryptoRng, IteratorRandom, RngExt as _}; pub fn make_random_destination_for_tag( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tag: DestinationTag, ) -> Destination { match tag { DestinationTag::AnyoneCanSpend => Destination::AnyoneCanSpend, DestinationTag::PublicKey => Destination::PublicKey(make_random_public_key(rng)), - DestinationTag::ScriptHash => Destination::ScriptHash(H256(rng.gen()).into()), + DestinationTag::ScriptHash => Destination::ScriptHash(H256(rng.random()).into()), DestinationTag::ClassicMultisig => { Destination::ClassicMultisig(make_random_public_key_hash(rng)) } @@ -63,135 +63,142 @@ pub fn make_random_destination_for_tag( } } -pub fn make_random_destination(rng: &mut (impl Rng + CryptoRng)) -> Destination { +pub fn make_random_destination(rng: &mut impl CryptoRng) -> Destination { let tag = DestinationTag::iter().choose(rng).unwrap(); make_random_destination_for_tag(rng, tag) } -pub fn make_random_public_key_hash(rng: &mut (impl Rng + CryptoRng)) -> PublicKeyHash { +pub fn make_random_public_key_hash(rng: &mut impl CryptoRng) -> PublicKeyHash { (&PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr).1).into() } -pub fn make_random_public_key_for_kind( - rng: &mut (impl Rng + CryptoRng), - kind: KeyKind, -) -> PublicKey { +pub fn make_random_public_key_for_kind(rng: &mut impl CryptoRng, kind: KeyKind) -> PublicKey { PrivateKey::new_from_rng(rng, kind).1 } -pub fn make_random_public_key(rng: &mut (impl Rng + CryptoRng)) -> PublicKey { +pub fn make_random_public_key(rng: &mut impl CryptoRng) -> PublicKey { let kind = KeyKind::iter().choose(rng).unwrap(); make_random_public_key_for_kind(rng, kind) } pub fn make_random_vrf_public_key_for_kind( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, kind: VRFKeyKind, ) -> VRFPublicKey { VRFPrivateKey::new_from_rng(rng, kind).1 } -pub fn make_random_vrf_public_key(rng: &mut (impl Rng + CryptoRng)) -> VRFPublicKey { +pub fn make_random_vrf_public_key(rng: &mut impl CryptoRng) -> VRFPublicKey { let kind = VRFKeyKind::iter().choose(rng).unwrap(); make_random_vrf_public_key_for_kind(rng, kind) } -pub fn make_random_bytes(rng: &mut (impl Rng + CryptoRng)) -> Vec { +pub fn make_random_bytes(rng: &mut impl CryptoRng) -> Vec { test_utils::random::gen_random_bytes(rng, 1, 20) } pub fn make_random_account_command_for_tag( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tag: AccountCommandTag, ) -> AccountCommand { match tag { AccountCommandTag::MintTokens => { - AccountCommand::MintTokens(H256(rng.gen()).into(), Amount::from_atoms(rng.gen())) + AccountCommand::MintTokens(H256(rng.random()).into(), Amount::from_atoms(rng.random())) } - AccountCommandTag::UnmintTokens => AccountCommand::UnmintTokens(H256(rng.gen()).into()), + AccountCommandTag::UnmintTokens => AccountCommand::UnmintTokens(H256(rng.random()).into()), AccountCommandTag::LockTokenSupply => { - AccountCommand::LockTokenSupply(H256(rng.gen()).into()) + AccountCommand::LockTokenSupply(H256(rng.random()).into()) } AccountCommandTag::FreezeToken => AccountCommand::FreezeToken( - H256(rng.gen()).into(), - if rng.gen::() { + H256(rng.random()).into(), + if rng.random::() { IsTokenUnfreezable::Yes } else { IsTokenUnfreezable::No }, ), - AccountCommandTag::UnfreezeToken => AccountCommand::UnfreezeToken(H256(rng.gen()).into()), + AccountCommandTag::UnfreezeToken => { + AccountCommand::UnfreezeToken(H256(rng.random()).into()) + } AccountCommandTag::ChangeTokenAuthority => AccountCommand::ChangeTokenAuthority( - H256(rng.gen()).into(), + H256(rng.random()).into(), make_random_destination(rng), ), - AccountCommandTag::ConcludeOrder => AccountCommand::ConcludeOrder(H256(rng.gen()).into()), + AccountCommandTag::ConcludeOrder => { + AccountCommand::ConcludeOrder(H256(rng.random()).into()) + } AccountCommandTag::FillOrder => AccountCommand::FillOrder( - H256(rng.gen()).into(), - Amount::from_atoms(rng.gen()), + H256(rng.random()).into(), + Amount::from_atoms(rng.random()), make_random_destination(rng), ), - AccountCommandTag::ChangeTokenMetadataUri => { - AccountCommand::ChangeTokenMetadataUri(H256(rng.gen()).into(), make_random_bytes(rng)) - } + AccountCommandTag::ChangeTokenMetadataUri => AccountCommand::ChangeTokenMetadataUri( + H256(rng.random()).into(), + make_random_bytes(rng), + ), } } -pub fn make_random_account_command(rng: &mut (impl Rng + CryptoRng)) -> AccountCommand { +pub fn make_random_account_command(rng: &mut impl CryptoRng) -> AccountCommand { let tag = AccountCommandTag::iter().choose(rng).unwrap(); make_random_account_command_for_tag(rng, tag) } -pub fn make_random_order_account_command(rng: &mut (impl Rng + CryptoRng)) -> OrderAccountCommand { +pub fn make_random_order_account_command(rng: &mut impl CryptoRng) -> OrderAccountCommand { let tag = OrderAccountCommandTag::iter().choose(rng).unwrap(); make_random_order_account_command_for_tag(rng, tag) } pub fn make_random_order_account_command_for_tag( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tag: OrderAccountCommandTag, ) -> OrderAccountCommand { match tag { - OrderAccountCommandTag::FillOrder => { - OrderAccountCommand::FillOrder(H256(rng.gen()).into(), Amount::from_atoms(rng.gen())) - } + OrderAccountCommandTag::FillOrder => OrderAccountCommand::FillOrder( + H256(rng.random()).into(), + Amount::from_atoms(rng.random()), + ), OrderAccountCommandTag::FreezeOrder => { - OrderAccountCommand::FreezeOrder(H256(rng.gen()).into()) + OrderAccountCommand::FreezeOrder(H256(rng.random()).into()) } OrderAccountCommandTag::ConcludeOrder => { - OrderAccountCommand::ConcludeOrder(H256(rng.gen()).into()) + OrderAccountCommand::ConcludeOrder(H256(rng.random()).into()) } } } pub fn make_random_outpoint_source_id_for_tag( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tag: OutPointSourceIdTag, ) -> OutPointSourceId { match tag { - OutPointSourceIdTag::Transaction => OutPointSourceId::Transaction(H256(rng.gen()).into()), - OutPointSourceIdTag::BlockReward => OutPointSourceId::BlockReward(H256(rng.gen()).into()), + OutPointSourceIdTag::Transaction => { + OutPointSourceId::Transaction(H256(rng.random()).into()) + } + OutPointSourceIdTag::BlockReward => { + OutPointSourceId::BlockReward(H256(rng.random()).into()) + } } } -pub fn make_random_outpoint_source_id(rng: &mut (impl Rng + CryptoRng)) -> OutPointSourceId { +pub fn make_random_outpoint_source_id(rng: &mut impl CryptoRng) -> OutPointSourceId { let tag = OutPointSourceIdTag::iter().choose(rng).unwrap(); make_random_outpoint_source_id_for_tag(rng, tag) } -pub fn make_random_utxo_outpoint(rng: &mut (impl Rng + CryptoRng)) -> UtxoOutPoint { - UtxoOutPoint::new(make_random_outpoint_source_id(rng), rng.gen()) +pub fn make_random_utxo_outpoint(rng: &mut impl CryptoRng) -> UtxoOutPoint { + UtxoOutPoint::new(make_random_outpoint_source_id(rng), rng.random()) } -pub fn make_random_tx_input_for_tag(rng: &mut (impl Rng + CryptoRng), tag: TxInputTag) -> TxInput { +pub fn make_random_tx_input_for_tag(rng: &mut impl CryptoRng, tag: TxInputTag) -> TxInput { match tag { TxInputTag::Utxo => TxInput::Utxo(make_random_utxo_outpoint(rng)), TxInputTag::Account => TxInput::Account(AccountOutPoint::new( - AccountNonce::new(rng.gen()), + AccountNonce::new(rng.random()), make_random_account_spending(rng), )), TxInputTag::AccountCommand => TxInput::AccountCommand( - AccountNonce::new(rng.gen()), + AccountNonce::new(rng.random()), make_random_account_command(rng), ), TxInputTag::OrderAccountCommand => { @@ -201,90 +208,92 @@ pub fn make_random_tx_input_for_tag(rng: &mut (impl Rng + CryptoRng), tag: TxInp } pub fn make_random_account_spending_for_tag( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tag: AccountSpendingTag, ) -> AccountSpending { match tag { AccountSpendingTag::DelegationBalance => AccountSpending::DelegationBalance( - H256(rng.gen()).into(), - Amount::from_atoms(rng.gen()), + H256(rng.random()).into(), + Amount::from_atoms(rng.random()), ), } } -pub fn make_random_account_spending(rng: &mut (impl Rng + CryptoRng)) -> AccountSpending { +pub fn make_random_account_spending(rng: &mut impl CryptoRng) -> AccountSpending { let tag = AccountSpendingTag::iter().choose(rng).unwrap(); make_random_account_spending_for_tag(rng, tag) } -pub fn make_random_account_outpoint(rng: &mut (impl Rng + CryptoRng)) -> AccountOutPoint { +pub fn make_random_account_outpoint(rng: &mut impl CryptoRng) -> AccountOutPoint { AccountOutPoint::new( - AccountNonce::new(rng.gen()), + AccountNonce::new(rng.random()), make_random_account_spending(rng), ) } pub fn make_random_output_value_for_tag( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tag: OutputValueTag, ) -> OutputValue { match tag { - OutputValueTag::Coin => OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValueTag::Coin => OutputValue::Coin(Amount::from_atoms(rng.random())), // Note: the other enum doesn't have the V0 variant, so we don't generate it here. OutputValueTag::TokenV0 | OutputValueTag::TokenV1 => { - OutputValue::TokenV1(H256(rng.gen()).into(), Amount::from_atoms(rng.gen())) + OutputValue::TokenV1(H256(rng.random()).into(), Amount::from_atoms(rng.random())) } } } -pub fn make_random_output_value(rng: &mut (impl Rng + CryptoRng)) -> OutputValue { +pub fn make_random_output_value(rng: &mut impl CryptoRng) -> OutputValue { let tag = OutputValueTag::iter().choose(rng).unwrap(); make_random_output_value_for_tag(rng, tag) } pub fn make_random_output_time_lock_for_tag( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tag: OutputTimeLockTag, ) -> OutputTimeLock { match tag { - OutputTimeLockTag::UntilHeight => OutputTimeLock::UntilHeight(BlockHeight::new(rng.gen())), + OutputTimeLockTag::UntilHeight => { + OutputTimeLock::UntilHeight(BlockHeight::new(rng.random())) + } OutputTimeLockTag::UntilTime => { - OutputTimeLock::UntilTime(BlockTimestamp::from_int_seconds(rng.gen())) + OutputTimeLock::UntilTime(BlockTimestamp::from_int_seconds(rng.random())) } - OutputTimeLockTag::ForSeconds => OutputTimeLock::ForSeconds(rng.gen()), - OutputTimeLockTag::ForBlockCount => OutputTimeLock::ForBlockCount(rng.gen()), + OutputTimeLockTag::ForSeconds => OutputTimeLock::ForSeconds(rng.random()), + OutputTimeLockTag::ForBlockCount => OutputTimeLock::ForBlockCount(rng.random()), } } -pub fn make_random_output_time_lock(rng: &mut (impl Rng + CryptoRng)) -> OutputTimeLock { +pub fn make_random_output_time_lock(rng: &mut impl CryptoRng) -> OutputTimeLock { let tag = OutputTimeLockTag::iter().choose(rng).unwrap(); make_random_output_time_lock_for_tag(rng, tag) } pub fn make_random_token_total_supply_for_tag( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tag: TokenTotalSupplyTag, ) -> TokenTotalSupply { match tag { TokenTotalSupplyTag::Unlimited => TokenTotalSupply::Unlimited, TokenTotalSupplyTag::Lockable => TokenTotalSupply::Lockable, - TokenTotalSupplyTag::Fixed => TokenTotalSupply::Fixed(Amount::from_atoms(rng.gen())), + TokenTotalSupplyTag::Fixed => TokenTotalSupply::Fixed(Amount::from_atoms(rng.random())), } } -pub fn make_random_token_total_supply(rng: &mut (impl Rng + CryptoRng)) -> TokenTotalSupply { +pub fn make_random_token_total_supply(rng: &mut impl CryptoRng) -> TokenTotalSupply { let tag = TokenTotalSupplyTag::iter().choose(rng).unwrap(); make_random_token_total_supply_for_tag(rng, tag) } -pub fn make_random_token_issuance_v1(rng: &mut (impl Rng + CryptoRng)) -> TokenIssuanceV1 { +pub fn make_random_token_issuance_v1(rng: &mut impl CryptoRng) -> TokenIssuanceV1 { TokenIssuanceV1 { token_ticker: make_random_bytes(rng), - number_of_decimals: rng.gen(), + number_of_decimals: rng.random(), metadata_uri: make_random_bytes(rng), total_supply: make_random_token_total_supply(rng), authority: make_random_destination(rng), - is_freezable: if rng.gen::() { + is_freezable: if rng.random::() { IsTokenFreezable::Yes } else { IsTokenFreezable::No @@ -293,7 +302,7 @@ pub fn make_random_token_issuance_v1(rng: &mut (impl Rng + CryptoRng)) -> TokenI } pub fn make_random_token_issuance_for_tag( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tag: TokenIssuanceTag, ) -> TokenIssuance { match tag { @@ -301,15 +310,15 @@ pub fn make_random_token_issuance_for_tag( } } -pub fn make_random_token_issuance(rng: &mut (impl Rng + CryptoRng)) -> TokenIssuance { +pub fn make_random_token_issuance(rng: &mut impl CryptoRng) -> TokenIssuance { let tag = TokenIssuanceTag::iter().choose(rng).unwrap(); make_random_token_issuance_for_tag(rng, tag) } -pub fn make_random_nft_issuance_v0(rng: &mut (impl Rng + CryptoRng)) -> NftIssuanceV0 { +pub fn make_random_nft_issuance_v0(rng: &mut impl CryptoRng) -> NftIssuanceV0 { NftIssuanceV0 { metadata: Metadata { - creator: if rng.gen::() { + creator: if rng.random::() { Some(TokenCreator { public_key: make_random_public_key(rng), }) @@ -319,17 +328,17 @@ pub fn make_random_nft_issuance_v0(rng: &mut (impl Rng + CryptoRng)) -> NftIssua name: make_random_bytes(rng), description: make_random_bytes(rng), ticker: make_random_bytes(rng), - icon_uri: if rng.gen::() { + icon_uri: if rng.random::() { Some(make_random_bytes(rng)).into() } else { None.into() }, - additional_metadata_uri: if rng.gen::() { + additional_metadata_uri: if rng.random::() { Some(make_random_bytes(rng)).into() } else { None.into() }, - media_uri: if rng.gen::() { + media_uri: if rng.random::() { Some(make_random_bytes(rng)).into() } else { None.into() @@ -340,7 +349,7 @@ pub fn make_random_nft_issuance_v0(rng: &mut (impl Rng + CryptoRng)) -> NftIssua } pub fn make_random_nft_issuance_for_tag( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tag: NftIssuanceTag, ) -> NftIssuance { match tag { @@ -348,23 +357,23 @@ pub fn make_random_nft_issuance_for_tag( } } -pub fn make_random_nft_issuance(rng: &mut (impl Rng + CryptoRng)) -> NftIssuance { +pub fn make_random_nft_issuance(rng: &mut impl CryptoRng) -> NftIssuance { let tag = NftIssuanceTag::iter().choose(rng).unwrap(); make_random_nft_issuance_for_tag(rng, tag) } -pub fn make_random_stake_pool_data(rng: &mut (impl Rng + CryptoRng)) -> StakePoolData { +pub fn make_random_stake_pool_data(rng: &mut impl CryptoRng) -> StakePoolData { StakePoolData::new( - Amount::from_atoms(rng.gen()), + Amount::from_atoms(rng.random()), make_random_destination(rng), make_random_vrf_public_key(rng), make_random_destination(rng), PerThousand::new_from_rng(rng), - Amount::from_atoms(rng.gen()), + Amount::from_atoms(rng.random()), ) } -pub fn make_random_order_data(rng: &mut (impl Rng + CryptoRng)) -> OrderData { +pub fn make_random_order_data(rng: &mut impl CryptoRng) -> OrderData { OrderData::new( make_random_destination(rng), make_random_output_value(rng), @@ -372,19 +381,16 @@ pub fn make_random_order_data(rng: &mut (impl Rng + CryptoRng)) -> OrderData { ) } -pub fn make_random_htlc(rng: &mut (impl Rng + CryptoRng)) -> HashedTimelockContract { +pub fn make_random_htlc(rng: &mut impl CryptoRng) -> HashedTimelockContract { HashedTimelockContract { - secret_hash: HtlcSecretHash(rng.gen()), + secret_hash: HtlcSecretHash(rng.random()), spend_key: make_random_destination(rng), refund_timelock: make_random_output_time_lock(rng), refund_key: make_random_destination(rng), } } -pub fn make_random_tx_output_for_tag( - rng: &mut (impl Rng + CryptoRng), - tag: TxOutputTag, -) -> TxOutput { +pub fn make_random_tx_output_for_tag(rng: &mut impl CryptoRng, tag: TxOutputTag) -> TxOutput { match tag { TxOutputTag::Transfer => { TxOutput::Transfer(make_random_output_value(rng), make_random_destination(rng)) @@ -396,23 +402,23 @@ pub fn make_random_tx_output_for_tag( ), TxOutputTag::Burn => TxOutput::Burn(make_random_output_value(rng)), TxOutputTag::CreateStakePool => TxOutput::CreateStakePool( - H256(rng.gen()).into(), + H256(rng.random()).into(), Box::new(make_random_stake_pool_data(rng)), ), TxOutputTag::ProduceBlockFromStake => { - TxOutput::ProduceBlockFromStake(make_random_destination(rng), H256(rng.gen()).into()) + TxOutput::ProduceBlockFromStake(make_random_destination(rng), H256(rng.random()).into()) } TxOutputTag::CreateDelegationId => { - TxOutput::CreateDelegationId(make_random_destination(rng), H256(rng.gen()).into()) + TxOutput::CreateDelegationId(make_random_destination(rng), H256(rng.random()).into()) } TxOutputTag::DelegateStaking => { - TxOutput::DelegateStaking(Amount::from_atoms(rng.gen()), H256(rng.gen()).into()) + TxOutput::DelegateStaking(Amount::from_atoms(rng.random()), H256(rng.random()).into()) } TxOutputTag::IssueFungibleToken => { TxOutput::IssueFungibleToken(Box::new(make_random_token_issuance(rng))) } TxOutputTag::IssueNft => TxOutput::IssueNft( - H256(rng.gen()).into(), + H256(rng.random()).into(), Box::new(make_random_nft_issuance(rng)), make_random_destination(rng), ), @@ -425,13 +431,13 @@ pub fn make_random_tx_output_for_tag( } } -pub fn make_random_tx_output(rng: &mut (impl Rng + CryptoRng)) -> TxOutput { +pub fn make_random_tx_output(rng: &mut impl CryptoRng) -> TxOutput { let tag = TxOutputTag::iter().choose(rng).unwrap(); make_random_tx_output_for_tag(rng, tag) } pub fn make_random_input_commitment_for_tag( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tag: SighashInputCommitmentTag, ) -> SighashInputCommitment<'static> { type CommTag = SighashInputCommitmentTag; @@ -442,7 +448,7 @@ pub fn make_random_input_commitment_for_tag( CommTag::Utxo => Comm::Utxo(Cow::Owned(make_random_tx_output(rng))), CommTag::ProduceBlockFromStakeUtxo => Comm::ProduceBlockFromStakeUtxo { utxo: Cow::Owned(make_random_tx_output(rng)), - staker_balance: Amount::from_atoms(rng.gen()), + staker_balance: Amount::from_atoms(rng.random()), }, CommTag::FillOrderAccountCommand => Comm::FillOrderAccountCommand { initially_asked: make_random_output_value(rng), @@ -451,8 +457,8 @@ pub fn make_random_input_commitment_for_tag( CommTag::ConcludeOrderAccountCommand => Comm::ConcludeOrderAccountCommand { initially_asked: make_random_output_value(rng), initially_given: make_random_output_value(rng), - ask_balance: Amount::from_atoms(rng.gen()), - give_balance: Amount::from_atoms(rng.gen()), + ask_balance: Amount::from_atoms(rng.random()), + give_balance: Amount::from_atoms(rng.random()), }, } } diff --git a/common/tests/primitives_repo_consistency/utils/mod.rs b/common/tests/primitives_repo_consistency/utils/mod.rs index 372185e0ec..d832f008ff 100644 --- a/common/tests/primitives_repo_consistency/utils/mod.rs +++ b/common/tests/primitives_repo_consistency/utils/mod.rs @@ -16,7 +16,7 @@ use itertools::Itertools as _; use rstest::rstest; -use randomness::{CryptoRng, Rng, SliceRandom}; +use randomness::{CryptoRng, RngExt as _, SliceRandom}; use serialization::Encode; use test_utils::random::{make_seedable_rng, Seed}; use utils::sorted::Sorted; @@ -30,7 +30,7 @@ struct CompactEncodedU128(#[codec(compact)] pub u128); /// will be created for each size. /// T is supposed to be u128 or smaller. pub fn make_test_values_for_compact_encoding( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, values_count: usize, ) -> Vec where @@ -63,7 +63,8 @@ where let max_val: u128 = T::max_value().into(); if max_val >= range_start { - let val = rng.gen_range(range_start..=std::cmp::min(max_val, range_end_inclusive)); + let val = + rng.random_range(range_start..=std::cmp::min(max_val, range_end_inclusive)); // Sanity check let encoded_size = CompactEncodedU128(val).encoded_size(); diff --git a/consensus/src/pos/effective_pool_balance.rs b/consensus/src/pos/effective_pool_balance.rs index 9c8a6bc5e0..0bc13ecc21 100644 --- a/consensus/src/pos/effective_pool_balance.rs +++ b/consensus/src/pos/effective_pool_balance.rs @@ -228,7 +228,7 @@ mod tests { use super::*; use common::{chain::CoinUnit, primitives::Amount}; - use randomness::Rng; + use randomness::RngExt; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; @@ -310,8 +310,8 @@ mod tests { let mut rng = make_seedable_rng(seed); let final_supply = Amount::from_atoms(600_000_000); - let pool_balance = Amount::from_atoms(rng.gen_range(2..final_supply.into_atoms())); - let pledge_amount = Amount::from_atoms(rng.gen_range(1..pool_balance.into_atoms())); + let pool_balance = Amount::from_atoms(rng.random_range(2..final_supply.into_atoms())); + let pledge_amount = Amount::from_atoms(rng.random_range(1..pool_balance.into_atoms())); let actual = effective_pool_balance_impl( pledge_amount, @@ -343,8 +343,8 @@ mod tests { ) { let mut rng = make_seedable_rng(seed); - let pool_balance = Amount::from_atoms(rng.gen_range(2..(final_supply.into_atoms() / K))); - let pledge_amount = Amount::from_atoms(rng.gen_range(1..pool_balance.into_atoms())); + let pool_balance = Amount::from_atoms(rng.random_range(2..(final_supply.into_atoms() / K))); + let pledge_amount = Amount::from_atoms(rng.random_range(1..pool_balance.into_atoms())); let actual = effective_pool_balance(pledge_amount, pool_balance, final_supply).unwrap(); let expected = effective_pool_balance_float_impl( @@ -370,8 +370,8 @@ mod tests { .unwrap(); let pool_balance = - Amount::from_atoms(rng.gen_range(cap.into_atoms()..final_supply.into_atoms())); - let pledge_amount = Amount::from_atoms(rng.gen_range(1..cap.into_atoms())); + Amount::from_atoms(rng.random_range(cap.into_atoms()..final_supply.into_atoms())); + let pledge_amount = Amount::from_atoms(rng.random_range(1..cap.into_atoms())); let expected = effective_pool_balance(pledge_amount, cap, final_supply).unwrap(); let actual = effective_pool_balance(pledge_amount, pool_balance, final_supply).unwrap(); @@ -388,8 +388,8 @@ mod tests { let cap = (final_supply / 100).unwrap(); let pool_balance = - Amount::from_atoms(rng.gen_range(cap.into_atoms()..final_supply.into_atoms())); - let pledge_amount = Amount::from_atoms(rng.gen_range(1..pool_balance.into_atoms())); + Amount::from_atoms(rng.random_range(cap.into_atoms()..final_supply.into_atoms())); + let pledge_amount = Amount::from_atoms(rng.random_range(1..pool_balance.into_atoms())); let _ = effective_pool_balance_impl( pledge_amount, @@ -408,7 +408,7 @@ mod tests { fn effective_balance_proportional(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let final_supply = - CoinUnit::from_coins(rng.gen_range(1_000_000..600_000_000)).to_amount_atoms(); + CoinUnit::from_coins(rng.random_range(1_000_000..600_000_000)).to_amount_atoms(); let pool_balance = (final_supply / 1000).unwrap(); let step = CoinUnit::from_coins(1000).to_amount_atoms().into_atoms(); @@ -438,14 +438,14 @@ mod tests { fn effective_balance_curve(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let final_supply = - CoinUnit::from_coins(rng.gen_range(10_000..600_000_000)).to_amount_atoms(); + CoinUnit::from_coins(rng.random_range(10_000..600_000_000)).to_amount_atoms(); let min_pool_balance = CoinUnit::from_coins(1).to_amount_atoms(); let max_pool_balance = (final_supply * (*POOL_SATURATION_LEVEL.numer())) .and_then(|v| v / *POOL_SATURATION_LEVEL.denom()) .unwrap(); let pool_balance = Amount::from_atoms( - rng.gen_range(min_pool_balance.into_atoms()..max_pool_balance.into_atoms()), + rng.random_range(min_pool_balance.into_atoms()..max_pool_balance.into_atoms()), ); let step = CoinUnit::from_coins(1000).to_amount_atoms().into_atoms(); diff --git a/consensus/src/pos/mod.rs b/consensus/src/pos/mod.rs index 18c845b9cd..ac221ccdb5 100644 --- a/consensus/src/pos/mod.rs +++ b/consensus/src/pos/mod.rs @@ -42,7 +42,7 @@ use common::{ use crypto::vrf::{VRFPrivateKey, VRFPublicKey, VRFReturn}; use logging::log; use pos_accounting::PoSAccountingView; -use randomness::{CryptoRng, Rng}; +use randomness::CryptoRng; use utils::ensure; use utxo::UtxosView; @@ -276,7 +276,7 @@ pub fn calc_pos_hash_from_prv_key( block_timestamp: BlockTimestamp, vrf_pub_key: &VRFPublicKey, vrf_prv_key: &VRFPrivateKey, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> Result { let vrf_data = produce_vrf_data( epoch_index, @@ -304,7 +304,7 @@ pub fn produce_vrf_data( sealed_epoch_randomness: &PoSRandomness, timestamp: BlockTimestamp, vrf_prv_key: &VRFPrivateKey, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> VRFReturn { let transcript = construct_transcript(epoch_index, &sealed_epoch_randomness.value(), timestamp) .with_rng(&mut *rng); @@ -324,7 +324,7 @@ pub fn find_timestamp_for_staking( pledge_amount: Amount, pool_balance: Amount, vrf_prv_key: &VRFPrivateKey, - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ) -> Result, ConsensusPoSError> { let vrf_pub_key = VRFPublicKey::from_private_key(vrf_prv_key); let target = compact_target_to_target(target)?; diff --git a/consensus/src/pos/target.rs b/consensus/src/pos/target.rs index 1a9473f120..9f2fdc79f6 100644 --- a/consensus/src/pos/target.rs +++ b/consensus/src/pos/target.rs @@ -241,14 +241,14 @@ mod tests { }; use crypto::vrf::{transcript::no_rng::VRFTranscript, VRFKeyKind, VRFPrivateKey}; use itertools::Itertools; - use randomness::{CryptoRng, Rng}; + use randomness::{CryptoRng, RngExt as _}; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; use super::*; fn make_block( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, prev_block: Id, timestamp: BlockTimestamp, target: Uint256, @@ -285,7 +285,7 @@ mod tests { } pub fn new_with_blocks( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, chain_config: &'a ChainConfig, timestamps: &[u64], ) -> Self { @@ -394,8 +394,8 @@ mod tests { let config = PoSChainConfigBuilder::new_for_unit_test().build(); { // average block time <= target block time - let prev_target = Uint256::from_u64(rng.gen::()); - let average_block_time = target_block_time.get() / rng.gen_range(1..10); + let prev_target = Uint256::from_u64(rng.random::()); + let average_block_time = target_block_time.get() / rng.random_range(1..10); let new_target = calculate_new_target(&config, &prev_target, average_block_time, target_block_time) .unwrap(); @@ -403,8 +403,8 @@ mod tests { } { // average block time >= target block time - let prev_target = Uint256::from_u64(rng.gen::()); - let average_block_time = target_block_time.get() * rng.gen_range(1..10); + let prev_target = Uint256::from_u64(rng.random::()); + let average_block_time = target_block_time.get() * rng.random_range(1..10); let new_target = calculate_new_target(&config, &prev_target, average_block_time, target_block_time) .unwrap(); @@ -688,8 +688,8 @@ mod tests { #[case(Seed::from_entropy())] fn calculate_target_required_test(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let target_limit_1 = Uint256::from_u64(rng.gen::()); - let target_limit_2 = Uint256::from_u64(rng.gen::()); + let target_limit_1 = Uint256::from_u64(rng.random::()); + let target_limit_2 = Uint256::from_u64(rng.random::()); let pos_config_1 = PoSChainConfigBuilder::new_for_unit_test() .targe_limit(target_limit_1) .block_count_to_average_for_blocktime(2) @@ -838,7 +838,7 @@ mod tests { #[case(Seed::from_entropy())] fn calculate_target_through_netupgrade(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let target_limit = Uint256::from_u64(rng.gen::()); + let target_limit = Uint256::from_u64(rng.random::()); let pos_config = PoSChainConfigBuilder::new_for_unit_test() .targe_limit(target_limit) .block_count_to_average_for_blocktime(3) @@ -937,7 +937,7 @@ mod tests { let current_hash = { let mut words = [0u64; 4]; for w in &mut words { - *w = rng.gen::(); + *w = rng.random::(); } Uint256(words) }; diff --git a/crypto/Cargo.toml b/crypto/Cargo.toml index 7e3af9d1cd..33f6ccd50a 100644 --- a/crypto/Cargo.toml +++ b/crypto/Cargo.toml @@ -23,9 +23,10 @@ num-derive.workspace = true num-traits.workspace = true num.workspace = true parity-scale-codec = { workspace = true, features = ["std"] } +rand_0_8.workspace = true ripemd.workspace = true schnorrkel.workspace = true -secp256k1 = { workspace = true, default-features = false, features = ["rand-std", "std", "rand"] } +secp256k1 = { workspace = true, default-features = false, features = ["std", "rand"] } serde = { workspace = true, features = ["derive"] } sha-1.workspace = true sha2.workspace = true diff --git a/crypto/src/ephemeral_e2e/mod.rs b/crypto/src/ephemeral_e2e/mod.rs index 713a43e0e7..3291e32cb1 100644 --- a/crypto/src/ephemeral_e2e/mod.rs +++ b/crypto/src/ephemeral_e2e/mod.rs @@ -15,12 +15,12 @@ pub mod error; -use serialization::DecodeAll; -use serialization::{Decode, Encode}; use zeroize::Zeroize; +use randomness::{adapters::Rng08Adapter, CryptoRng}; +use serialization::{Decode, DecodeAll, Encode}; + use crate::symkey; -use randomness::{CryptoRng, Rng}; use self::error::Error; @@ -46,9 +46,9 @@ pub struct EndToEndPrivateKey { } impl EndToEndPrivateKey { - pub fn new_from_rng(rng: &mut R) -> EndToEndPrivateKey { + pub fn new_from_rng(rng: &mut R) -> EndToEndPrivateKey { EndToEndPrivateKey { - key: x25519_dalek::ReusableSecret::random_from_rng(rng), + key: x25519_dalek::ReusableSecret::random_from_rng(Rng08Adapter(rng)), } } @@ -105,7 +105,7 @@ pub struct SharedSecret { } impl SharedSecret { - pub fn encode_then_encrypt( + pub fn encode_then_encrypt( &self, obj: &T, rng: &mut R, @@ -113,11 +113,7 @@ impl SharedSecret { obj.using_encoded(|encoded| self.encrypt(encoded, rng)) } - pub fn encrypt( - &self, - message: &[u8], - rng: &mut R, - ) -> Result, Error> { + pub fn encrypt(&self, message: &[u8], rng: &mut R) -> Result, Error> { let symkey = symkey::SymmetricKey::from_raw_key( symkey::SymmetricKeyKind::XChacha20Poly1305, &self.secret, @@ -158,6 +154,8 @@ impl SharedSecret { #[cfg(test)] mod tests { use rstest::rstest; + + use randomness::RngExt as _; use test_utils::random::{make_seedable_rng, Seed}; use super::*; @@ -179,14 +177,14 @@ mod tests { // One can decrypt their own cipher texts { { - let random_message: Vec = (0..100).map(|_| rng.gen()).collect(); + let random_message: Vec = (0..100).map(|_| rng.random()).collect(); let cipher_text = shared_secret1.encrypt(&random_message, &mut rng).unwrap(); let plain_text = shared_secret1.decrypt(&cipher_text).unwrap(); assert_eq!(random_message, plain_text); } { - let random_message: Vec = (0..100).map(|_| rng.gen()).collect(); + let random_message: Vec = (0..100).map(|_| rng.random()).collect(); let cipher_text = shared_secret2.encrypt(&random_message, &mut rng).unwrap(); let plain_text = shared_secret2.decrypt(&cipher_text).unwrap(); assert_eq!(random_message, plain_text); @@ -196,14 +194,14 @@ mod tests { // One can decrypt others' cipher texts { { - let random_message: Vec = (0..100).map(|_| rng.gen()).collect(); + let random_message: Vec = (0..100).map(|_| rng.random()).collect(); let cipher_text = shared_secret1.encrypt(&random_message, &mut rng).unwrap(); let plain_text = shared_secret2.decrypt(&cipher_text).unwrap(); assert_eq!(random_message, plain_text); } { - let random_message: Vec = (0..100).map(|_| rng.gen()).collect(); + let random_message: Vec = (0..100).map(|_| rng.random()).collect(); let cipher_text = shared_secret2.encrypt(&random_message, &mut rng).unwrap(); let plain_text = shared_secret1.decrypt(&cipher_text).unwrap(); assert_eq!(random_message, plain_text); @@ -257,17 +255,17 @@ mod tests { // One cannot decrypt others' tampered cipher texts { { - let random_message: Vec = (0..100).map(|_| rng.gen()).collect(); + let random_message: Vec = (0..100).map(|_| rng.random()).collect(); let mut cipher_text = shared_secret1.encrypt(&random_message, &mut rng).unwrap(); - let char_to_tamper_with = rng.gen_range(0..cipher_text.len()); + let char_to_tamper_with = rng.random_range(0..cipher_text.len()); cipher_text[char_to_tamper_with] = cipher_text[char_to_tamper_with].wrapping_add(1); shared_secret2.decrypt(&cipher_text).unwrap_err(); } { - let random_message: Vec = (0..100).map(|_| rng.gen()).collect(); + let random_message: Vec = (0..100).map(|_| rng.random()).collect(); let mut cipher_text = shared_secret2.encrypt(&random_message, &mut rng).unwrap(); - let char_to_tamper_with = rng.gen_range(0..cipher_text.len()); + let char_to_tamper_with = rng.random_range(0..cipher_text.len()); cipher_text[char_to_tamper_with] = cipher_text[char_to_tamper_with].wrapping_add(1); shared_secret1.decrypt(&cipher_text).unwrap_err(); } @@ -283,7 +281,7 @@ mod tests { .collect(); let mut cipher_text = shared_secret1.encode_then_encrypt(&obj, &mut rng).unwrap(); - let char_to_tamper_with = rng.gen_range(0..cipher_text.len()); + let char_to_tamper_with = rng.random_range(0..cipher_text.len()); cipher_text[char_to_tamper_with] = cipher_text[char_to_tamper_with].wrapping_add(1); shared_secret2.decrypt_then_decode::(&cipher_text).unwrap_err(); } @@ -296,7 +294,7 @@ mod tests { .collect(); let mut cipher_text = shared_secret2.encode_then_encrypt(&obj, &mut rng).unwrap(); - let char_to_tamper_with = rng.gen_range(0..cipher_text.len()); + let char_to_tamper_with = rng.random_range(0..cipher_text.len()); cipher_text[char_to_tamper_with] = cipher_text[char_to_tamper_with].wrapping_add(1); shared_secret1.decrypt_then_decode::(&cipher_text).unwrap_err(); } diff --git a/crypto/src/kdf/mod.rs b/crypto/src/kdf/mod.rs index 9220210400..240a2b4d71 100644 --- a/crypto/src/kdf/mod.rs +++ b/crypto/src/kdf/mod.rs @@ -16,7 +16,7 @@ use std::num::NonZeroUsize; use crate::util::eq::SliceEqualityCheckMethod; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use serialization::{Decode, Encode}; use self::argon2::Argon2Config; @@ -89,9 +89,9 @@ pub enum KdfChallenge { }, } -fn make_salt(rng: &mut R, len: NonZeroUsize) -> Vec { +fn make_salt(rng: &mut R, len: NonZeroUsize) -> Vec { let len = len.get(); - (0..len).map(|_| rng.gen::()).collect() + (0..len).map(|_| rng.random::()).collect() } /// Recalculate a previously hashed password to recover an encryption key @@ -129,7 +129,7 @@ pub fn hash_from_challenge( /// client/server applications. To use this for encryption, /// convert the result into a challenge using into_challenge(), /// which removes the hashed password. -pub fn hash_password( +pub fn hash_password( rng: &mut R, kdf_config: KdfConfig, password: &[u8], diff --git a/crypto/src/key/aux_data_provider.rs b/crypto/src/key/aux_data_provider.rs index 89cf430ec7..f55fbe87dd 100644 --- a/crypto/src/key/aux_data_provider.rs +++ b/crypto/src/key/aux_data_provider.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; pub trait Secp256k1SchnorrAuxDataProvider { /// Return BIP-340's "auxiliary random data" that will eventually be passed as the `data` parameter @@ -32,10 +32,10 @@ impl SigAuxDataProvider for T where T: Secp256k1SchnorrAuxDataProvider {} impl Secp256k1SchnorrAuxDataProvider for R where - R: Rng + CryptoRng, + R: CryptoRng, { fn get_secp256k1_schnorr_aux_data(&mut self) -> [u8; 32] { - self.gen() + self.random() } } diff --git a/crypto/src/key/extended.rs b/crypto/src/key/extended.rs index 748aaabf6e..3ca4e6e9da 100644 --- a/crypto/src/key/extended.rs +++ b/crypto/src/key/extended.rs @@ -23,7 +23,7 @@ use crate::key::secp256k1::extended_keys::{ Secp256k1ExtendedPrivateKey, Secp256k1ExtendedPublicKey, }; use crate::key::{PrivateKey, PublicKey}; -use randomness::{make_true_rng, CryptoRng, Rng}; +use randomness::{make_true_rng, CryptoRng}; use super::hdkd::chain_code::ChainCode; @@ -62,7 +62,7 @@ impl ExtendedPrivateKey { } pub fn new_from_rng( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, key_kind: ExtendedKeyKind, ) -> (ExtendedPrivateKey, ExtendedPublicKey) { match key_kind { @@ -185,14 +185,18 @@ impl Derivable for ExtendedPublicKey { #[cfg(test)] mod test { - use super::*; - use crate::key::hdkd::derivation_path::DerivationPath; + use std::str::FromStr; + use bip39::Mnemonic; use hex::ToHex; use rstest::rstest; - use std::str::FromStr; - use test_utils::random::make_seedable_rng; - use test_utils::random::Seed; + + use randomness::RngExt as _; + use test_utils::random::{make_seedable_rng, Seed}; + + use crate::key::hdkd::derivation_path::DerivationPath; + + use super::*; #[rstest] #[trace] @@ -202,8 +206,8 @@ mod test { let (sk, pk) = ExtendedPrivateKey::new_from_rng(&mut rng, ExtendedKeyKind::Secp256k1Schnorr); assert_eq!(sk.kind(), ExtendedKeyKind::Secp256k1Schnorr); - let msg_size = 1 + rng.gen::() % 10000; - let msg: Vec = (0..msg_size).map(|_| rng.gen::()).collect(); + let msg_size = rng.random_range(1..=10000); + let msg: Vec = (0..msg_size).map(|_| rng.random::()).collect(); let sig = sk.private_key().sign_message(&msg, &mut rng).unwrap(); assert!(pk.into_public_key().verify_message(&sig, &msg)); } diff --git a/crypto/src/key/hdkd/child_number.rs b/crypto/src/key/hdkd/child_number.rs index 5a96a81c76..bb9197f778 100644 --- a/crypto/src/key/hdkd/child_number.rs +++ b/crypto/src/key/hdkd/child_number.rs @@ -127,7 +127,7 @@ mod test { use crate::key::hdkd::child_number::ChildNumber; use crate::key::hdkd::u31; use crate::key::hdkd::u31::U31; - use randomness::RngCore; + use randomness::Rng; use rstest::rstest; use std::str::FromStr; use test_utils::random::make_seedable_rng; diff --git a/crypto/src/key/hdkd/derivation_path.rs b/crypto/src/key/hdkd/derivation_path.rs index a4d356c778..e999e6a806 100644 --- a/crypto/src/key/hdkd/derivation_path.rs +++ b/crypto/src/key/hdkd/derivation_path.rs @@ -138,7 +138,7 @@ impl fmt::Display for DerivationPath { #[cfg(test)] mod tests { use super::*; - use randomness::RngCore; + use randomness::Rng; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; use test_utils::{assert_encoded_eq, decode_from_hex}; diff --git a/crypto/src/key/mod.rs b/crypto/src/key/mod.rs index f62ce0cf0b..75090f223f 100644 --- a/crypto/src/key/mod.rs +++ b/crypto/src/key/mod.rs @@ -20,7 +20,7 @@ mod key_holder; pub mod secp256k1; pub mod signature; -use randomness::{make_true_rng, CryptoRng, Rng}; +use randomness::{make_true_rng, CryptoRng}; use serialization::{hex_encoded::HexEncoded, Decode, Encode}; use crate::key::{ @@ -83,10 +83,7 @@ impl PrivateKey { Self::new_from_rng(&mut make_true_rng(), key_kind) } - pub fn new_from_rng( - rng: &mut (impl Rng + CryptoRng), - key_kind: KeyKind, - ) -> (PrivateKey, PublicKey) { + pub fn new_from_rng(rng: &mut impl CryptoRng, key_kind: KeyKind) -> (PrivateKey, PublicKey) { match key_kind { KeyKind::Secp256k1Schnorr => { let k = Secp256k1PrivateKey::new(rng); @@ -178,10 +175,12 @@ impl TryFrom for Secp256k1PublicKey { #[cfg(test)] mod test { - use super::*; use rstest::rstest; - use test_utils::random::make_seedable_rng; - use test_utils::random::Seed; + + use randomness::RngExt as _; + use test_utils::random::{make_seedable_rng, Seed}; + + use super::*; #[rstest] #[trace] @@ -190,8 +189,8 @@ mod test { let mut rng = make_seedable_rng(seed); let (sk, pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); assert_eq!(sk.kind(), KeyKind::Secp256k1Schnorr); - let msg_size = 1 + rng.gen::() % 10000; - let msg: Vec = (0..msg_size).map(|_| rng.gen::()).collect(); + let msg_size = rng.random_range(1..=10000); + let msg: Vec = (0..msg_size).map(|_| rng.random::()).collect(); let sig = sk.sign_message(&msg, &mut rng).unwrap(); assert!(pk.verify_message(&sig, &msg)); } diff --git a/crypto/src/key/secp256k1/extended_keys.rs b/crypto/src/key/secp256k1/extended_keys.rs index 913d46173b..00acafb5f9 100644 --- a/crypto/src/key/secp256k1/extended_keys.rs +++ b/crypto/src/key/secp256k1/extended_keys.rs @@ -13,20 +13,27 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::key::hdkd::derivation_path::DerivationPath; -use crate::key::hdkd::{ - chain_code::ChainCode, - child_number::ChildNumber, - derivable::{Derivable, DerivationError}, -}; -use crate::key::secp256k1::{Secp256k1PrivateKey, Secp256k1PublicKey}; -use crate::util::{self, new_hmac_sha_512}; +use std::cmp::Ordering; + use hmac::{Hmac, Mac}; -use randomness::{CryptoRng, Rng}; use secp256k1; -use serialization::{Decode, Encode}; use sha2::Sha512; -use std::cmp::Ordering; + +use randomness::{adapters::Rng08Adapter, CryptoRng}; +use serialization::{Decode, Encode}; + +use crate::{ + key::{ + hdkd::{ + chain_code::ChainCode, + child_number::ChildNumber, + derivable::{Derivable, DerivationError}, + derivation_path::DerivationPath, + }, + secp256k1::{Secp256k1PrivateKey, Secp256k1PublicKey}, + }, + util::{self, new_hmac_sha_512}, +}; /// Given a tree of keys that are derived from a master key using BIP32 rules, this struct represents /// the private key at one of the nodes of this tree. @@ -78,14 +85,14 @@ impl Secp256k1ExtendedPrivateKey { }) } - pub fn new( + pub fn new( rng: &mut R, ) -> (Secp256k1ExtendedPrivateKey, Secp256k1ExtendedPublicKey) { // Create a new chain code let mut chain_code = [0u8; 32]; rng.fill_bytes(&mut chain_code); let chain_code = chain_code.into(); - let private_key = secp256k1::SecretKey::new(rng).into(); + let private_key = secp256k1::SecretKey::new(&mut Rng08Adapter(rng)).into(); // Generate a new private key let ext_priv = Secp256k1ExtendedPrivateKey { derivation_path: DerivationPath::empty(), diff --git a/crypto/src/key/secp256k1/mod.rs b/crypto/src/key/secp256k1/mod.rs index df3ed41f52..319e2eb486 100644 --- a/crypto/src/key/secp256k1/mod.rs +++ b/crypto/src/key/secp256k1/mod.rs @@ -15,14 +15,16 @@ pub mod extended_keys; +use secp256k1; +use zeroize::Zeroize; + +use randomness::{adapters::Rng08Adapter, CryptoRng}; +use serialization::{Decode, Encode}; + use crate::{ hash::{Blake2b32Stream, StreamHasher}, key::Secp256k1SchnorrAuxDataProvider, }; -use randomness::{CryptoRng, Rng}; -use secp256k1; -use serialization::{Decode, Encode}; -use zeroize::Zeroize; #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub enum Secp256k1KeyError { @@ -59,9 +61,9 @@ impl From for Secp256k1PrivateKey { } impl Secp256k1PrivateKey { - pub fn new(rng: &mut R) -> (Secp256k1PrivateKey, Secp256k1PublicKey) { + pub fn new(rng: &mut R) -> (Secp256k1PrivateKey, Secp256k1PublicKey) { let secp = secp256k1::Secp256k1::new(); - let (secret, public) = secp.generate_keypair(rng); + let (secret, public) = secp.generate_keypair(&mut Rng08Adapter(rng)); ( Secp256k1PrivateKey::from_native(secret), Secp256k1PublicKey::from_native(public), @@ -168,8 +170,7 @@ impl Secp256k1PublicKey { ) -> bool { // Hash the message let e = Blake2b32Stream::new().write(msg).finalize(); - let msg_hashed = - secp256k1::Message::from_digest_slice(e.as_slice()).expect("Blake2b32 is 32 bytes"); + let msg_hashed = secp256k1::Message::from_digest(e.into()); // Verify the signature self.verify_message_hashed(signature, &msg_hashed) } @@ -204,13 +205,15 @@ lazy_static::lazy_static! { #[cfg(test)] mod test { - use super::*; use hex::ToHex; use rstest::rstest; - use serialization::DecodeAll; - use serialization::Encode; + + use randomness::RngExt as _; + use serialization::{DecodeAll, Encode}; use test_utils::random::{make_seedable_rng, Seed}; + use super::*; + #[rstest] #[trace] #[case(Seed::from_entropy())] @@ -316,8 +319,8 @@ mod test { #[case(Seed::from_entropy())] fn sign_and_verify(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let msg_size = 1 + rng.gen::() % 10000; - let msg = (0..msg_size).map(|_| rng.gen::()).collect::>(); + let msg_size = rng.random_range(1..=10000); + let msg = (0..msg_size).map(|_| rng.random::()).collect::>(); let (sk, pk) = Secp256k1PrivateKey::new(&mut rng); let sig = sk.sign_message(&msg, &mut rng); assert!(pk.verify_message(&sig, &msg)); @@ -378,11 +381,11 @@ mod test { #[case(Seed::from_entropy())] fn deterministic(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let msg_size = 1 + rng.gen::() % 10000; - let msg = (0..msg_size).map(|_| rng.gen::()).collect::>(); + let msg_size = rng.random_range(1..=10000); + let msg = (0..msg_size).map(|_| rng.random::()).collect::>(); let (sk, pk) = Secp256k1PrivateKey::new(&mut rng); - let new_seed = rng.gen::(); + let new_seed = rng.random::(); let mut rng1 = make_seedable_rng(new_seed); let mut rng2 = make_seedable_rng(new_seed); let sig1 = sk.sign_message(&msg, &mut rng1); @@ -398,14 +401,14 @@ mod test { #[case(Seed::from_entropy())] fn mutate_message(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let msg_size = 1 + rng.gen::() % 10000; - let msg = (0..msg_size).map(|_| rng.gen::()).collect::>(); + let msg_size = rng.random_range(1..=10000); + let msg = (0..msg_size).map(|_| rng.random::()).collect::>(); let (sk, pk) = Secp256k1PrivateKey::new(&mut rng); let sig = sk.sign_message(&msg, &mut rng); assert!(pk.verify_message(&sig, &msg)); let mutated_message = { let mut m = msg; - let index = rng.gen::() % m.len(); + let index = rng.random_range(0..m.len()); m[index] = m[index].wrapping_add(1); m }; @@ -417,8 +420,8 @@ mod test { #[case(Seed::from_entropy())] fn different_public_key(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let msg_size = 1 + rng.gen::() % 10000; - let msg = (0..msg_size).map(|_| rng.gen::()).collect::>(); + let msg_size = rng.random_range(1..=10000); + let msg = (0..msg_size).map(|_| rng.random::()).collect::>(); let (sk, pk) = Secp256k1PrivateKey::new(&mut rng); let (_new_sk, new_pk) = Secp256k1PrivateKey::new(&mut rng); let sig = sk.sign_message(&msg, &mut rng); diff --git a/crypto/src/symkey/chacha20poly1305/mod.rs b/crypto/src/symkey/chacha20poly1305/mod.rs index a721164c9b..5437cd020c 100644 --- a/crypto/src/symkey/chacha20poly1305/mod.rs +++ b/crypto/src/symkey/chacha20poly1305/mod.rs @@ -16,7 +16,7 @@ use crate::symkey::Error; use chacha20poly1305::aead::{AeadInPlace, KeyInit}; use chacha20poly1305::{XChaCha20Poly1305, XNonce}; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use serialization::{Decode, Encode}; use zeroize::ZeroizeOnDrop; @@ -31,8 +31,8 @@ impl Chacha20poly1305Key { pub const KEY_LEN: usize = 32; #[allow(dead_code)] - pub fn new_from_rng(rng: &mut R) -> Self { - let k = rng.gen::<[u8; Self::KEY_LEN]>(); + pub fn new_from_rng(rng: &mut R) -> Self { + let k = rng.random::<[u8; Self::KEY_LEN]>(); Self { key_data: k.into() } } @@ -67,13 +67,13 @@ impl Chacha20poly1305Key { Ok(result) } - pub fn encrypt, R: Rng + CryptoRng>( + pub fn encrypt, R: CryptoRng>( &self, message: T, rng: &mut R, associated_data: &[u8], ) -> Result, Error> { - let nonce = rng.gen::<[u8; Self::NONCE_LEN]>(); + let nonce = rng.random::<[u8; Self::NONCE_LEN]>(); self.encrypt_with_nonce_and_aead(&nonce, message, associated_data) } @@ -162,8 +162,8 @@ mod test { fn encrypt_then_decrypt() { let mut rng = make_true_rng(); let key = Chacha20poly1305Key::new_from_rng(&mut rng); - let message_len = 1 + rng.gen::() % 10000; - let message = (0..message_len).map(|_| rng.gen::()).collect::>(); + let message_len = 1 + rng.random::() % 10000; + let message = (0..message_len).map(|_| rng.random::()).collect::>(); let encrypted = key.encrypt(&message, &mut rng, b"").unwrap(); let decrypted = key.decrypt(encrypted, None).unwrap(); assert_eq!(message, decrypted); @@ -173,10 +173,10 @@ mod test { fn encrypt_then_decrypt_with_associated_data() { let mut rng = make_true_rng(); let key = Chacha20poly1305Key::new_from_rng(&mut rng); - let message_len = 1 + rng.gen::() % 10000; - let aead_len = 1 + rng.gen::() % 10000; - let message = (0..message_len).map(|_| rng.gen::()).collect::>(); - let aead = (0..aead_len).map(|_| rng.gen::()).collect::>(); + let message_len = 1 + rng.random::() % 10000; + let aead_len = 1 + rng.random::() % 10000; + let message = (0..message_len).map(|_| rng.random::()).collect::>(); + let aead = (0..aead_len).map(|_| rng.random::()).collect::>(); let encrypted = key.encrypt(&message, &mut rng, &aead).unwrap(); let decrypted = key.decrypt(encrypted, Some(&aead)).unwrap(); assert_eq!(message, decrypted); @@ -186,8 +186,8 @@ mod test { fn decrypt_too_short_cipher_text() { let mut rng = make_true_rng(); let key = Chacha20poly1305Key::new_from_rng(&mut rng); - let cipher_text_len = rng.gen::() % Chacha20poly1305Key::NONCE_LEN; - let cipher_text = (0..cipher_text_len).map(|_| rng.gen::()).collect::>(); + let cipher_text_len = rng.random_range(0..Chacha20poly1305Key::NONCE_LEN); + let cipher_text = (0..cipher_text_len).map(|_| rng.random::()).collect::>(); let decrypt_err = key.decrypt(cipher_text, None).unwrap_err(); assert_eq!( decrypt_err, diff --git a/crypto/src/symkey/mod.rs b/crypto/src/symkey/mod.rs index 94a324a053..b347bad56f 100644 --- a/crypto/src/symkey/mod.rs +++ b/crypto/src/symkey/mod.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; mod chacha20poly1305; @@ -58,11 +58,11 @@ pub struct SymmetricKey { } impl SymmetricKey { - pub fn new(kind: SymmetricKeyKind, rng: &mut R) -> Self { + pub fn new(kind: SymmetricKeyKind, rng: &mut R) -> Self { let key = match kind { SymmetricKeyKind::XChacha20Poly1305 => { SymmetricKeyHolder::XChacha20Poly1305(Chacha20poly1305Key::new_from_array( - rng.gen::<[u8; Chacha20poly1305Key::KEY_LEN]>(), + rng.random::<[u8; Chacha20poly1305Key::KEY_LEN]>(), )) } }; @@ -78,7 +78,7 @@ impl SymmetricKey { Ok(Self { key }) } - pub fn encrypt( + pub fn encrypt( &self, message: &[u8], rng: &mut R, @@ -114,7 +114,7 @@ mod test { #[test] fn encode_then_decode_key_from_slice() { let mut rng = make_true_rng(); - let bytes = rng.gen::<[u8; Chacha20poly1305Key::KEY_LEN]>(); + let bytes = rng.random::<[u8; Chacha20poly1305Key::KEY_LEN]>(); let key = SymmetricKey::from_raw_key(SymmetricKeyKind::XChacha20Poly1305, &bytes).unwrap(); let encoded = key.encode(); let decoded = SymmetricKey::decode_all(&mut encoded.as_slice()).unwrap(); @@ -124,7 +124,7 @@ mod test { #[test] fn construct_key_from_slice_random_size() { let mut rng = make_true_rng(); - let bytes: Vec = (0..rng.gen_range(0..100)).map(|_| rng.gen::()).collect(); + let bytes: Vec = (0..rng.random_range(0..100)).map(|_| rng.random::()).collect(); let result = SymmetricKey::from_raw_key(SymmetricKeyKind::XChacha20Poly1305, bytes.as_slice()); if bytes.len() == Chacha20poly1305Key::KEY_LEN { @@ -153,8 +153,8 @@ mod test { fn encrypt_then_decrypt() { let mut rng = make_true_rng(); let key = SymmetricKey::new(SymmetricKeyKind::XChacha20Poly1305, &mut rng); - let message_len = 1 + rng.gen::() % 10000; - let message = (0..message_len).map(|_| rng.gen::()).collect::>(); + let message_len = 1 + rng.random::() % 10000; + let message = (0..message_len).map(|_| rng.random::()).collect::>(); let encrypted = key.encrypt(&message, &mut rng, None).unwrap(); let decrypted = key.decrypt(&encrypted, None).unwrap(); assert_eq!(message, decrypted); @@ -164,10 +164,10 @@ mod test { fn encrypt_then_decrypt_with_associated_data() { let mut rng = make_true_rng(); let key = SymmetricKey::new(SymmetricKeyKind::XChacha20Poly1305, &mut rng); - let message_len = 1 + rng.gen::() % 10000; - let aead_len = 1 + rng.gen::() % 10000; - let message = (0..message_len).map(|_| rng.gen::()).collect::>(); - let aead = (0..aead_len).map(|_| rng.gen::()).collect::>(); + let message_len = 1 + rng.random::() % 10000; + let aead_len = 1 + rng.random::() % 10000; + let message = (0..message_len).map(|_| rng.random::()).collect::>(); + let aead = (0..aead_len).map(|_| rng.random::()).collect::>(); let encrypted = key.encrypt(&message, &mut rng, Some(&aead)).unwrap(); let decrypted = key.decrypt(&encrypted, Some(&aead)).unwrap(); assert_eq!(message, decrypted); diff --git a/crypto/src/util/eq.rs b/crypto/src/util/eq.rs index e9f829dedd..7ce3d249e2 100644 --- a/crypto/src/util/eq.rs +++ b/crypto/src/util/eq.rs @@ -51,7 +51,7 @@ impl SliceEqualityCheckMethod { pub mod test { use rstest::rstest; - use randomness::Rng; + use randomness::RngExt; use test_utils::random::{make_seedable_rng, Seed}; use super::*; @@ -78,13 +78,13 @@ pub mod test { let normal = SliceEqualityCheckMethod::Normal; let timing_resistant = SliceEqualityCheckMethod::TimingResistant; - let data1_len = rng.gen_range(1..256); - let data3_len = rng.gen_range(1..256); + let data1_len = rng.random_range(1..256); + let data3_len = rng.random_range(1..256); - let data1: Vec = (0..data1_len).map(|_| rng.gen::()).collect(); + let data1: Vec = (0..data1_len).map(|_| rng.random::()).collect(); let data2: Vec = data1.clone(); let data3: Vec = loop { - let result = (0..data3_len).map(|_| rng.gen::()).collect(); + let result = (0..data3_len).map(|_| rng.random::()).collect(); if result != data1 { break result; } @@ -109,12 +109,12 @@ pub mod test { let normal = SliceEqualityCheckMethod::Normal; let timing_resistant = SliceEqualityCheckMethod::TimingResistant; - let data_len = rng.gen_range(1..256); + let data_len = rng.random_range(1..256); - let data1: Vec = (0..data_len).map(|_| rng.gen::()).collect(); + let data1: Vec = (0..data_len).map(|_| rng.random::()).collect(); let data2: Vec = data1.clone(); let data3: Vec = loop { - let result = (0..data_len).map(|_| rng.gen::()).collect(); + let result = (0..data_len).map(|_| rng.random::()).collect(); if result != data1 { break result; } @@ -140,9 +140,9 @@ pub mod test { let timing_resistant = SliceEqualityCheckMethod::TimingResistant; let empty_slice = b""; - let data_len = rng.gen_range(1..256); + let data_len = rng.random_range(1..256); - let data: Vec = (0..data_len).map(|_| rng.gen::()).collect(); + let data: Vec = (0..data_len).map(|_| rng.random::()).collect(); assert_eq!(data.len(), data_len); assert!(!normal.are_equal(empty_slice, &data)); diff --git a/crypto/src/util/mod.rs b/crypto/src/util/mod.rs index 1285799086..c538d2e938 100644 --- a/crypto/src/util/mod.rs +++ b/crypto/src/util/mod.rs @@ -58,7 +58,7 @@ pub fn to_key_and_chain_code( #[cfg(test)] mod test { use super::*; - use randomness::Rng; + use randomness::RngExt; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; @@ -69,9 +69,9 @@ mod test { fn mac_key_of_any_size(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let key_size = rng.gen_range(0..=1000); + let key_size = rng.random_range(0..=1000); - let key = (0..key_size).map(|_| rng.gen::()).collect::>(); + let key = (0..key_size).map(|_| rng.random::()).collect::>(); let _hmac = new_hmac_sha_512(&key); } diff --git a/crypto/src/vrf/mod.rs b/crypto/src/vrf/mod.rs index 96bb923466..3ab0219230 100644 --- a/crypto/src/vrf/mod.rs +++ b/crypto/src/vrf/mod.rs @@ -16,7 +16,7 @@ use hmac::{Hmac, Mac}; use sha2::Sha512; -use randomness::{make_true_rng, CryptoRng, Rng}; +use randomness::{make_true_rng, CryptoRng}; use serialization::{hex_encoded::HexEncoded, Decode, Encode}; use crate::{ @@ -111,7 +111,7 @@ impl VRFPrivateKey { } pub fn new_from_rng( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, key_kind: VRFKeyKind, ) -> (VRFPrivateKey, VRFPublicKey) { match key_kind { diff --git a/crypto/src/vrf/schnorrkel/data.rs b/crypto/src/vrf/schnorrkel/data.rs index 6f6ddac7b7..92c95fed7c 100644 --- a/crypto/src/vrf/schnorrkel/data.rs +++ b/crypto/src/vrf/schnorrkel/data.rs @@ -147,25 +147,27 @@ impl SchnorrkelVRFReturn { #[cfg(test)] mod tests { - use super::*; use hex::FromHex; - use randomness::{make_pseudo_rng, make_true_rng, Rng}; use schnorrkel::{signing_context, Keypair, PublicKey, SecretKey}; + + use randomness::{adapters::Rng08Adapter, make_pseudo_rng, make_true_rng, RngExt as _}; use serialization::{DecodeAll, Encode}; + use super::*; + #[test] fn serialization_of_result() { let mut csprng = make_true_rng(); - let keypair = Keypair::generate_with(&mut csprng); + let keypair = Keypair::generate_with(&mut Rng08Adapter(&mut csprng)); let mut rng = make_pseudo_rng(); - let label_size = 1 + rng.gen::() % 10000; - let label: Vec = (1..label_size).map(|_| rng.gen::()).collect(); + let label_size = rng.random_range(1..=10000); + let label: Vec = (1..label_size).map(|_| rng.random::()).collect(); let ctx = signing_context(&label); - let msg_size = 1 + rng.gen::() % 10000; - let msg: Vec = (1..msg_size).map(|_| rng.gen::()).collect(); + let msg_size = rng.random_range(1..=10000); + let msg: Vec = (1..msg_size).map(|_| rng.random::()).collect(); let (input_and_output, proof, _proof1batchable) = keypair.vrf_sign(ctx.bytes(&msg)); let preout = &input_and_output.to_preout(); diff --git a/crypto/src/vrf/schnorrkel/mod.rs b/crypto/src/vrf/schnorrkel/mod.rs index 48290c578d..221170a019 100644 --- a/crypto/src/vrf/schnorrkel/mod.rs +++ b/crypto/src/vrf/schnorrkel/mod.rs @@ -15,7 +15,7 @@ use schnorrkel::{derive::Derivation, Keypair}; -use randomness::{CryptoRng, Rng}; +use randomness::{adapters::Rng08Adapter, CryptoRng}; use serialization::{Decode, Encode}; use crate::key::hdkd::{ @@ -122,8 +122,8 @@ pub struct SchnorrkelPrivateKey { } impl SchnorrkelPrivateKey { - pub fn new(rng: &mut R) -> (SchnorrkelPrivateKey, SchnorrkelPublicKey) { - let sk = schnorrkel::SecretKey::generate_with(rng); + pub fn new(rng: &mut R) -> (SchnorrkelPrivateKey, SchnorrkelPublicKey) { + let sk = schnorrkel::SecretKey::generate_with(&mut Rng08Adapter(rng)); let pk = sk.to_public(); let sk = Self { key: sk }; let pk = SchnorrkelPublicKey { key: pk }; @@ -216,7 +216,7 @@ impl Decode for SchnorrkelPrivateKey { mod tests { use super::*; use hex::FromHex; - use randomness::{make_true_rng, RngCore}; + use randomness::{make_true_rng, Rng}; use schnorrkel::{signing_context, Keypair}; use serialization::{DecodeAll, Encode}; use test_utils::random::{make_seedable_rng, Seed}; @@ -265,7 +265,7 @@ mod tests { fn vrf_internal_simple() { let mut csprng = make_true_rng(); - let keypair1 = Keypair::generate_with(&mut csprng); + let keypair1 = Keypair::generate_with(&mut Rng08Adapter(&mut csprng)); let ctx = signing_context(b"yoo!"); let msg = b"meow"; @@ -299,7 +299,7 @@ mod tests { "VRF verification with incorrect message passed!" ); - let keypair2 = Keypair::generate_with(&mut csprng); + let keypair2 = Keypair::generate_with(&mut Rng08Adapter(&mut csprng)); assert!( keypair2.public.vrf_verify(ctx.bytes(msg), out1, &proof1).is_err(), "VRF verification with incorrect signer passed!" diff --git a/crypto/src/vrf/transcript/mod.rs b/crypto/src/vrf/transcript/mod.rs index f69dbad1e5..b961122c7a 100644 --- a/crypto/src/vrf/transcript/mod.rs +++ b/crypto/src/vrf/transcript/mod.rs @@ -20,17 +20,19 @@ pub mod with_rng; #[cfg(test)] mod tests { use rstest::rstest; + + use randomness::adapters::Rng08Adapter; use test_utils::random::{make_seedable_rng, Seed}; + use crate::vrf::transcript::with_rng::VRFTranscriptWithRng; + use super::{no_rng::VRFTranscript, traits::SignableTranscript}; #[rstest] #[trace] #[case(Seed::from_entropy())] fn ensure_both_with_and_without_rng_are_equivalent(#[case] seed: Seed) { - use randomness::Rng; - - use crate::vrf::transcript::with_rng::VRFTranscriptWithRng; + use rand_0_8::Rng as _; let no_rng_value = { let mut rng = make_seedable_rng(seed); @@ -39,7 +41,8 @@ mod tests { .attach_raw_data(b"abc", b"xyz") .attach_u64(b"rx42", 424242); - let mut generator = assembled_transcript.take().build_rng().finalize(&mut rng); + let mut generator = + assembled_transcript.take().build_rng().finalize(&mut Rng08Adapter(&mut rng)); (0..100).map(|_| generator.gen::()).collect::>() }; @@ -52,7 +55,8 @@ mod tests { .attach_raw_data(b"abc", b"xyz") .attach_u64(b"rx42", 424242); - let mut generator = assembled_transcript.take().build_rng().finalize(&mut rng2); + let mut generator = + assembled_transcript.take().build_rng().finalize(&mut Rng08Adapter(&mut rng2)); (0..100).map(|_| generator.gen::()).collect::>() }; diff --git a/crypto/src/vrf/transcript/no_rng.rs b/crypto/src/vrf/transcript/no_rng.rs index 5fb9ff2709..ffe941c8ad 100644 --- a/crypto/src/vrf/transcript/no_rng.rs +++ b/crypto/src/vrf/transcript/no_rng.rs @@ -13,6 +13,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use randomness::adapters::Rng08Adapter; + use super::{traits::SignableTranscript, with_rng::VRFTranscriptWithRng}; #[must_use] @@ -28,7 +30,7 @@ impl VRFTranscript { self.0 } - pub fn with_rng<'a, R: randomness::RngCore + randomness::CryptoRng + 'a>( + pub fn with_rng<'a, R: randomness::Rng + randomness::CryptoRng + 'a>( self, rng: R, ) -> VRFTranscriptWithRng<'a> { @@ -68,27 +70,33 @@ impl schnorrkel::context::SigningTranscript for VRFTranscript { nonce_seeds: &[&[u8]], rng: R, ) where - R: randomness::RngCore + randomness::CryptoRng, + R: rand_0_8::RngCore + rand_0_8::CryptoRng, { self.0.witness_bytes_rng(label, dest, nonce_seeds, rng) } fn witness_bytes(&self, label: &'static [u8], dest: &mut [u8], nonce_seeds: &[&[u8]]) { - self.witness_bytes_rng(label, dest, nonce_seeds, randomness::make_true_rng()) + self.witness_bytes_rng( + label, + dest, + nonce_seeds, + Rng08Adapter(randomness::make_true_rng()), + ) } } #[cfg(test)] mod tests { - use rand_chacha::ChaChaRng; - use randomness::{Rng, SeedableRng}; + use randomness::SeedableRng; use super::*; #[test] fn manual_vs_assembled() { + use rand_0_8::Rng as _; + // build first transcript by manually filling values let mut manual_transcript = merlin::Transcript::new(b"initial"); manual_transcript.append_message(b"abc", b"xyz"); @@ -100,11 +108,13 @@ mod tests { .attach_u64(b"rx42", 424242); // build a random number generator using each transcript and ensure they both arrive to the same values - let mut g1 = manual_transcript.build_rng().finalize(&mut ChaChaRng::from_seed([0u8; 32])); + let mut g1 = manual_transcript + .build_rng() + .finalize(&mut Rng08Adapter(&mut ChaChaRng::from_seed([0u8; 32]))); let mut g2 = assembled_transcript .0 .build_rng() - .finalize(&mut ChaChaRng::from_seed([0u8; 32])); + .finalize(&mut Rng08Adapter(&mut ChaChaRng::from_seed([0u8; 32]))); for _ in 0..100 { assert_eq!(g1.gen::(), g2.gen::()); diff --git a/crypto/src/vrf/transcript/with_rng.rs b/crypto/src/vrf/transcript/with_rng.rs index 7343c01016..e53e0e3c03 100644 --- a/crypto/src/vrf/transcript/with_rng.rs +++ b/crypto/src/vrf/transcript/with_rng.rs @@ -15,25 +15,21 @@ use std::sync::{Arc, Mutex}; -use randomness::{CryptoRng, RngCore}; +use randomness::{adapters::Rng08Adapter, CryptoRng}; use super::{no_rng::VRFTranscript, traits::SignableTranscript}; -pub trait RngCoreAndCrypto: RngCore + CryptoRng {} - -impl RngCoreAndCrypto for R where R: RngCore + CryptoRng {} - /// A transcript that produces deterministic vrf signatures based on the provided rng #[must_use] #[derive(Clone)] -pub struct VRFTranscriptWithRng<'a>(merlin::Transcript, Arc>); +pub struct VRFTranscriptWithRng<'a>(merlin::Transcript, Arc>); impl<'a> VRFTranscriptWithRng<'a> { - pub fn new(label: &'static [u8], rng: R) -> Self { + pub fn new(label: &'static [u8], rng: R) -> Self { Self(merlin::Transcript::new(label), Arc::new(Mutex::new(rng))) } - pub(crate) fn from_no_rng(transcript: VRFTranscript, rng: R) -> Self { + pub(crate) fn from_no_rng(transcript: VRFTranscript, rng: R) -> Self { VRFTranscriptWithRng(transcript.take(), Arc::new(Mutex::new(rng))) } @@ -75,24 +71,23 @@ impl schnorrkel::context::SigningTranscript for VRFTranscriptWithRng<'_> { nonce_seeds: &[&[u8]], rng: R, ) where - R: randomness::RngCore + randomness::CryptoRng, + R: rand_0_8::RngCore + rand_0_8::CryptoRng, { self.0.witness_bytes_rng(label, dest, nonce_seeds, rng) } fn witness_bytes(&self, label: &'static [u8], dest: &mut [u8], nonce_seeds: &[&[u8]]) { let mut r = self.1.lock().expect("Poisoned mutex"); - self.witness_bytes_rng(label, dest, nonce_seeds, &mut *r) + self.witness_bytes_rng(label, dest, nonce_seeds, Rng08Adapter(&mut *r)) } } #[cfg(test)] mod tests { - use rand_chacha::ChaChaRng; - - use randomness::{Rng, SeedableRng}; use rstest::rstest; + + use randomness::SeedableRng; use test_utils::random::{make_seedable_rng, Seed}; use super::*; @@ -101,6 +96,8 @@ mod tests { #[trace] #[case(Seed::from_entropy())] fn manual_vs_assembled(#[case] seed: Seed) { + use rand_0_8::Rng as _; + let mut rng = make_seedable_rng(seed); // build first transcript by manually filling values @@ -114,11 +111,13 @@ mod tests { .attach_u64(b"rx42", 424242); // build a random number generator using each transcript and ensure they both arrive to the same values - let mut g1 = manual_transcript.build_rng().finalize(&mut ChaChaRng::from_seed([0u8; 32])); + let mut g1 = manual_transcript + .build_rng() + .finalize(&mut Rng08Adapter(&mut ChaChaRng::from_seed([0u8; 32]))); let mut g2 = assembled_transcript .0 .build_rng() - .finalize(&mut ChaChaRng::from_seed([0u8; 32])); + .finalize(&mut Rng08Adapter(&mut ChaChaRng::from_seed([0u8; 32]))); for _ in 0..100 { assert_eq!(g1.gen::(), g2.gen::()); diff --git a/deny.toml b/deny.toml index 128ff2d3f9..0744d0b92d 100644 --- a/deny.toml +++ b/deny.toml @@ -50,8 +50,9 @@ ignore = [ # "bincode" is no longer maintained. "RUSTSEC-2025-0141", - # `rand` is unsound. - # Note: to fix the error we need to upgrade `rand` to either 0.9.3 or 0.10.1, which is non-trivial - # because some of our dependencies still use 0.8.x and earlier versions. + # `rand` is unsound. Note that this has been patched in versions 0.10.1, 0.9.3 and 0.8.6, but we still + # have one place where `rand` 0.7.x is used - it's a dependency of `probabilistic-collections` v0.7.0. + # But we don't use any code from `probabilistic-collections` that actually creates an RNG, so our code + # is still sound. "RUSTSEC-2026-0097" ] diff --git a/dns-server/src/crawler_p2p/crawler/mod.rs b/dns-server/src/crawler_p2p/crawler/mod.rs index abcb67ed39..0dfd83d6cb 100644 --- a/dns-server/src/crawler_p2p/crawler/mod.rs +++ b/dns-server/src/crawler_p2p/crawler/mod.rs @@ -591,7 +591,7 @@ impl Crawler { address_data.connect_now(self.now) && !self.banned_addresses.contains_key(&address.as_bannable()) }) - .choose_multiple(rng, MAX_CONNECTS_PER_HEARTBEAT); + .sample(rng, MAX_CONNECTS_PER_HEARTBEAT); for (address, address_data) in connecting_addresses { Self::change_address_state( diff --git a/dns-server/src/crawler_p2p/crawler/tests/mod.rs b/dns-server/src/crawler_p2p/crawler/tests/mod.rs index 3c10fac10d..72b21badc7 100644 --- a/dns-server/src/crawler_p2p/crawler/tests/mod.rs +++ b/dns-server/src/crawler_p2p/crawler/tests/mod.rs @@ -37,8 +37,8 @@ use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; use randomness::{ - seq::{IteratorRandom, SliceRandom}, - Rng, + seq::{IndexedRandom as _, IteratorRandom}, + RngExt as _, }; use mock_crawler::test_crawler; @@ -237,24 +237,24 @@ fn randomized(#[case] seed: Seed) { let chain_config = common::chain::config::create_mainnet(); - let nodes = (0..rng.gen_range(0..200)) + let nodes = (0..rng.random_range(0..200)) .map(|_| { - if rng.gen_bool(0.8) { + if rng.random_bool(0.8) { SocketAddr::V4(SocketAddrV4::new( - Ipv4Addr::new(rng.gen(), rng.gen(), rng.gen(), rng.gen()), + Ipv4Addr::new(rng.random(), rng.random(), rng.random(), rng.random()), chain_config.p2p_port(), )) } else { SocketAddr::V6(SocketAddrV6::new( Ipv6Addr::new( - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), + rng.random(), + rng.random(), + rng.random(), + rng.random(), + rng.random(), + rng.random(), + rng.random(), + rng.random(), ), chain_config.p2p_port(), 0, @@ -265,12 +265,12 @@ fn randomized(#[case] seed: Seed) { .map(SocketAddress::new) .collect::>(); - let reserved_count = rng.gen_range(0..5); - let reserved_nodes = nodes.choose_multiple(&mut rng, reserved_count).cloned().collect(); + let reserved_count = rng.random_range(0..5); + let reserved_nodes = nodes.sample(&mut rng, reserved_count).cloned().collect(); - let loaded_count = rng.gen_range(0..10); + let loaded_count = rng.random_range(0..10); let loaded_nodes = nodes - .choose_multiple(&mut rng, loaded_count) + .sample(&mut rng, loaded_count) .cloned() .map(|addr| { ( @@ -291,11 +291,11 @@ fn randomized(#[case] seed: Seed) { Time::from_duration_since_epoch(Duration::ZERO), ); - for _ in 0..rng.gen_range(0..100000) { - crawler.timer(Duration::from_secs(rng.gen_range(0..100)), &mut rng); + for _ in 0..rng.random_range(0..100000) { + crawler.timer(Duration::from_secs(rng.random_range(0..100)), &mut rng); // Randomly report a pending outbound connections as failed - if !crawler.pending_connects.is_empty() && rng.gen_bool(0.5) { + if !crawler.pending_connects.is_empty() && rng.random_bool(0.5) { let address = crawler.pending_connects.iter().choose(&mut rng).cloned().unwrap(); crawler.step( CrawlerEvent::ConnectionError { @@ -307,7 +307,7 @@ fn randomized(#[case] seed: Seed) { } // Randomly report a pending outbound connection as successful - if !crawler.pending_connects.is_empty() && rng.gen_bool(0.01) { + if !crawler.pending_connects.is_empty() && rng.random_bool(0.01) { let address = crawler.pending_connects.iter().choose(&mut rng).cloned().unwrap(); crawler.step( CrawlerEvent::Connected { @@ -319,7 +319,7 @@ fn randomized(#[case] seed: Seed) { } // Randomly report a pending outbound connection as successful to an incompatible node - if !crawler.pending_connects.is_empty() && rng.gen_bool(0.001) { + if !crawler.pending_connects.is_empty() && rng.random_bool(0.001) { let address = crawler.pending_connects.iter().choose(&mut rng).cloned().unwrap(); crawler.step( CrawlerEvent::Connected { @@ -331,13 +331,13 @@ fn randomized(#[case] seed: Seed) { } // Randomly report a pending disconnect request as complete - if !crawler.pending_disconnects.is_empty() && rng.gen_bool(0.1) { + if !crawler.pending_disconnects.is_empty() && rng.random_bool(0.1) { let peer_id = crawler.pending_disconnects.iter().choose(&mut rng).cloned().unwrap(); crawler.step(CrawlerEvent::Disconnected { peer_id }, &mut rng) } // Randomly send an address announcement request - if !crawler.peers.is_empty() && rng.gen_bool(0.01) { + if !crawler.peers.is_empty() && rng.random_bool(0.01) { let address = nodes.iter().choose(&mut rng).cloned().unwrap(); let sender = crawler.peers.keys().choose(&mut rng).cloned().unwrap(); crawler.step( @@ -346,7 +346,7 @@ fn randomized(#[case] seed: Seed) { ) } - if !crawler.peers.is_empty() && rng.gen_bool(0.001) { + if !crawler.peers.is_empty() && rng.random_bool(0.001) { let peer_id = crawler.peers.keys().choose(&mut rng).cloned().unwrap(); crawler.step(CrawlerEvent::Disconnected { peer_id }, &mut rng) } diff --git a/dns-server/src/crawler_p2p/crawler_manager/tests/mock_manager.rs b/dns-server/src/crawler_p2p/crawler_manager/tests/mock_manager.rs index 3d624ce1db..45adab2e14 100644 --- a/dns-server/src/crawler_p2p/crawler_manager/tests/mock_manager.rs +++ b/dns-server/src/crawler_p2p/crawler_manager/tests/mock_manager.rs @@ -24,7 +24,6 @@ use std::{ }; use async_trait::async_trait; -use randomness::Rng; use tokio::{ sync::{mpsc, oneshot}, task::JoinHandle, @@ -48,6 +47,7 @@ use p2p::{ }, P2pEventHandler, }; +use randomness::Rng; use test_utils::BasicTestTimeGetter; use utils::atomics::SeqCstAtomicBool; use utils_networking::IpOrSocketAddress; diff --git a/dns-server/src/dns_server/mod.rs b/dns-server/src/dns_server/mod.rs index 5a30d08531..96c1591359 100644 --- a/dns-server/src/dns_server/mod.rs +++ b/dns-server/src/dns_server/mod.rs @@ -43,7 +43,7 @@ use tokio::{net::UdpSocket, sync::mpsc}; use common::{chain::ChainConfig, primitives::per_thousand::PerThousand}; use logging::log; -use randomness::{make_pseudo_rng, Rng, SliceRandom}; +use randomness::{make_pseudo_rng, IndexedRandom as _, Rng, SliceRandom as _}; use utils::{atomics::RelaxedAtomicU32, make_config_setting, tokio_spawn}; use crate::{ @@ -309,11 +309,11 @@ impl AuthorityImpl { }); let mut selected_same_version_addrs = - same_version_addrs.choose_multiple(rng, count).cloned().collect::>(); + same_version_addrs.sample(rng, count).cloned().collect::>(); selected_same_version_addrs.shuffle(rng); let mut selected_other_version_addrs = - other_version_addrs.choose_multiple(rng, count).cloned().collect::>(); + other_version_addrs.sample(rng, count).cloned().collect::>(); selected_other_version_addrs.shuffle(rng); #[allow(clippy::float_arithmetic)] diff --git a/dns-server/src/dns_server/tests.rs b/dns-server/src/dns_server/tests.rs index 1251ff19dd..31e10a5c56 100644 --- a/dns-server/src/dns_server/tests.rs +++ b/dns-server/src/dns_server/tests.rs @@ -30,7 +30,7 @@ use common::{ primitives::{per_thousand::PerThousand, semver::SemVer}, }; use networking::test_helpers::TestAddressMaker; -use randomness::{Rng, SliceRandom}; +use randomness::{Rng, RngExt as _, SliceRandom}; use test_utils::{assert_matches_return_val, merge_btree_maps, random::Seed}; use crate::{ @@ -529,7 +529,7 @@ mod same_software_version_addr_selection_test { fn make_random_software_info(rng: &mut impl Rng) -> SoftwareInfo { SoftwareInfo { user_agent: "bogus".try_into().unwrap(), - version: SemVer::new(rng.gen(), rng.gen(), rng.gen()), + version: SemVer::new(rng.random(), rng.random(), rng.random()), } } diff --git a/mempool/src/pool/orphans/mod.rs b/mempool/src/pool/orphans/mod.rs index c85c0f1b00..710c6c02ae 100644 --- a/mempool/src/pool/orphans/mod.rs +++ b/mempool/src/pool/orphans/mod.rs @@ -18,7 +18,7 @@ use std::collections::{BTreeMap, BTreeSet}; use common::{chain::Transaction, primitives::Id}; use logging::log; use mempool_types::TxStatus; -use randomness::{make_pseudo_rng, Rng}; +use randomness::{make_pseudo_rng, RngExt as _}; use utils::{const_value::ConstValue, ensure}; use super::{OrphanPoolError, Time, TxDependency}; @@ -249,7 +249,7 @@ impl TxOrphanPool { let mut n_evicted = 0; while self.len() > max_size { - self.remove_at(InternalId::new(rng.gen_range(0..self.len()))); + self.remove_at(InternalId::new(rng.random_range(0..self.len()))); n_evicted += 1; } diff --git a/mempool/src/pool/orphans/test.rs b/mempool/src/pool/orphans/test.rs index bee3366c1d..3e0d328c0d 100644 --- a/mempool/src/pool/orphans/test.rs +++ b/mempool/src/pool/orphans/test.rs @@ -15,7 +15,8 @@ use std::time::Duration; -use super::*; +use rstest::rstest; + use common::{ chain::{ signature::inputsig::InputWitness, AccountNonce, AccountSpending, DelegationId, @@ -23,8 +24,9 @@ use common::{ }, primitives::{Amount, H256}, }; -use rstest::rstest; -use test_utils::random::{make_seedable_rng, Rng, Seed}; +use test_utils::random::{make_seedable_rng, Rng, RngExt as _, Seed}; + +use super::*; fn check_integrity(orphans: &TxOrphanPool) { let len = orphans.len(); @@ -54,21 +56,21 @@ fn check_integrity(orphans: &TxOrphanPool) { } fn random_peer_origin(rng: &mut impl Rng) -> RemoteTxOrigin { - RemoteTxOrigin::new(p2p_types::PeerId::from_u64(rng.gen_range(0u64..20))) + RemoteTxOrigin::new(p2p_types::PeerId::from_u64(rng.random_range(0u64..20))) } fn random_tx_entry(rng: &mut impl Rng) -> TxEntry { - let n_inputs = rng.gen_range(1..=10); + let n_inputs = rng.random_range(1..=10); let inputs: Vec<_> = (0..n_inputs) .map(|_| { - if rng.gen_bool(0.8) { - let source: Id = H256(rng.gen()).into(); - let output_index = rng.gen_range(0..=400); + if rng.random_bool(0.8) { + let source: Id = H256(rng.random()).into(); + let output_index = rng.random_range(0..=400); TxInput::from_utxo(source.into(), output_index) } else { - let nonce = AccountNonce::new(rng.gen()); - let delegation_id: DelegationId = H256(rng.gen()).into(); - let amount = Amount::from_atoms(rng.gen()); + let nonce = AccountNonce::new(rng.random()); + let delegation_id: DelegationId = H256(rng.random()).into(); + let amount = Amount::from_atoms(rng.random()); TxInput::from_account( nonce, AccountSpending::DelegationBalance(delegation_id, amount), @@ -80,7 +82,7 @@ fn random_tx_entry(rng: &mut impl Rng) -> TxEntry { let transaction = Transaction::new(0, inputs, Vec::new()).unwrap(); let signatures = vec![InputWitness::NoSignature(None); n_inputs]; let transaction = SignedTransaction::new(transaction, signatures).unwrap(); - let insertion_time = Duration::from_secs(rng.gen()); + let insertion_time = Duration::from_secs(rng.random()); let origin = random_peer_origin(rng); let options = crate::TxOptions::default_for(origin.into()); @@ -141,7 +143,7 @@ fn capacity_reached(#[case] seed: Seed) { assert_eq!(orphans.len(), config::DEFAULT_ORPHAN_POOL_CAPACITY); - for entry in (0..rng.gen_range(1..100)).map(|_| random_tx_entry(&mut rng)) { + for entry in (0..rng.random_range(1..100)).map(|_| random_tx_entry(&mut rng)) { let _ = orphans.insert_and_enforce_limits(entry, time); assert_eq!(orphans.len(), config::DEFAULT_ORPHAN_POOL_CAPACITY); } @@ -157,7 +159,7 @@ fn simulation(#[case] seed: Seed) { for _ in 0..300 { let len_before = orphans.len(); - match rng.gen_range(0..=4) { + match rng.random_range(0..=4) { // Insert a random tx 0..=1 => { let entry = random_tx_entry(&mut rng); @@ -174,7 +176,7 @@ fn simulation(#[case] seed: Seed) { if orphans.transactions.is_empty() { continue; } - let i = rng.gen_range(0..orphans.transactions.len()); + let i = rng.random_range(0..orphans.transactions.len()); let id = *orphans.transactions[i].tx_id(); assert!( orphans.entry(&id).map(|e| e.take()).is_some(), @@ -185,7 +187,7 @@ fn simulation(#[case] seed: Seed) { // Enforce size limits 3..=3 => { - let limit = rng.gen_range(0..=150); + let limit = rng.random_range(0..=150); orphans.enforce_max_size(limit); assert!(orphans.len() <= limit); assert!(orphans.len() <= len_before); diff --git a/mempool/src/pool/tests/orders_v1.rs b/mempool/src/pool/tests/orders_v1.rs index e801dc37a3..905b68c6f6 100644 --- a/mempool/src/pool/tests/orders_v1.rs +++ b/mempool/src/pool/tests/orders_v1.rs @@ -50,8 +50,8 @@ async fn non_orphans(#[case] seed: Seed) { let tokens_src_id: OutPointSourceId = split_utxo(&mut rng, &mut tf, tokens_outpoint, 2).into(); let coins_src_id: OutPointSourceId = split_utxo(&mut rng, &mut tf, coins_outpoint, 10).into(); - let initial_ask_amount = Amount::from_atoms(rng.gen_range(1000..2000)); - let initial_give_amount = Amount::from_atoms(rng.gen_range(1000..2000)); + let initial_ask_amount = Amount::from_atoms(rng.random_range(1000..2000)); + let initial_give_amount = Amount::from_atoms(rng.random_range(1000..2000)); let order_id = { let order_data = OrderData::new( Destination::AnyoneCanSpend, @@ -70,8 +70,8 @@ async fn non_orphans(#[case] seed: Seed) { tf.make_block_builder().add_transaction(tx).build_and_process(&mut rng).unwrap(); order_id }; - let another_order_initial_ask_amount = Amount::from_atoms(rng.gen_range(1000..2000)); - let another_order_initial_give_amount = Amount::from_atoms(rng.gen_range(1000..2000)); + let another_order_initial_ask_amount = Amount::from_atoms(rng.random_range(1000..2000)); + let another_order_initial_give_amount = Amount::from_atoms(rng.random_range(1000..2000)); let another_order_id = { let order_data = OrderData::new( Destination::AnyoneCanSpend, @@ -95,7 +95,7 @@ async fn non_orphans(#[case] seed: Seed) { &mut tf, order_id, token_id, - Amount::from_atoms(rng.gen_range(10..initial_ask_amount.into_atoms() / 10)), + Amount::from_atoms(rng.random_range(10..initial_ask_amount.into_atoms() / 10)), UtxoOutPoint::new(coins_src_id.clone(), 0), None, ); @@ -103,7 +103,7 @@ async fn non_orphans(#[case] seed: Seed) { &mut tf, order_id, token_id, - Amount::from_atoms(rng.gen_range(10..initial_ask_amount.into_atoms() / 10)), + Amount::from_atoms(rng.random_range(10..initial_ask_amount.into_atoms() / 10)), UtxoOutPoint::new(coins_src_id.clone(), 1), None, ); @@ -111,7 +111,7 @@ async fn non_orphans(#[case] seed: Seed) { &mut tf, order_id, token_id, - Amount::from_atoms(rng.gen_range(10..initial_ask_amount.into_atoms() / 10)), + Amount::from_atoms(rng.random_range(10..initial_ask_amount.into_atoms() / 10)), UtxoOutPoint::new(coins_src_id.clone(), 2), None, ); @@ -143,7 +143,9 @@ async fn non_orphans(#[case] seed: Seed) { &mut tf, another_order_id, token_id, - Amount::from_atoms(rng.gen_range(10..another_order_initial_ask_amount.into_atoms() / 10)), + Amount::from_atoms( + rng.random_range(10..another_order_initial_ask_amount.into_atoms() / 10), + ), UtxoOutPoint::new(coins_src_id.clone(), 7), None, ); @@ -439,8 +441,8 @@ async fn orphans_with_missing_utxo(#[case] seed: Seed) { let coins_src_id: OutPointSourceId = split_utxo(&mut rng, &mut tf, coins_outpoint, 10).into(); - let initial_ask_amount = Amount::from_atoms(rng.gen_range(1000..2000)); - let initial_give_amount = Amount::from_atoms(rng.gen_range(1000..2000)); + let initial_ask_amount = Amount::from_atoms(rng.random_range(1000..2000)); + let initial_give_amount = Amount::from_atoms(rng.random_range(1000..2000)); let order_id = { let order_data = OrderData::new( Destination::AnyoneCanSpend, @@ -472,7 +474,7 @@ async fn orphans_with_missing_utxo(#[case] seed: Seed) { &mut tf, order_id, token_id, - Amount::from_atoms(rng.gen_range(10..initial_ask_amount.into_atoms() / 10)), + Amount::from_atoms(rng.random_range(10..initial_ask_amount.into_atoms() / 10)), UtxoOutPoint::new(coins_src_id.clone(), 1), Some(UtxoOutPoint::new(missing_parent_tx_src_id.clone(), 0).into()), ); @@ -481,7 +483,7 @@ async fn orphans_with_missing_utxo(#[case] seed: Seed) { &mut tf, order_id, token_id, - Amount::from_atoms(rng.gen_range(10..initial_ask_amount.into_atoms() / 10)), + Amount::from_atoms(rng.random_range(10..initial_ask_amount.into_atoms() / 10)), UtxoOutPoint::new(coins_src_id.clone(), 2), Some(UtxoOutPoint::new(missing_parent_tx_src_id.clone(), 1).into()), ); @@ -718,8 +720,8 @@ async fn orphans_with_missing_order(#[case] seed: Seed) { let coins_src_id: OutPointSourceId = split_utxo(&mut rng, &mut tf, coins_outpoint, 10).into(); - let initial_ask_amount = Amount::from_atoms(rng.gen_range(1000..2000)); - let initial_give_amount = Amount::from_atoms(rng.gen_range(1000..2000)); + let initial_ask_amount = Amount::from_atoms(rng.random_range(1000..2000)); + let initial_give_amount = Amount::from_atoms(rng.random_range(1000..2000)); let order_creation_tx = { let fee_input = UtxoOutPoint::new(coins_src_id.clone(), 0); let coins_amount = tf.coin_amount_from_utxo(&fee_input); @@ -748,7 +750,7 @@ async fn orphans_with_missing_order(#[case] seed: Seed) { token_id, initial_ask_amount, initial_give_amount, - Amount::from_atoms(rng.gen_range(10..initial_ask_amount.into_atoms() / 10)), + Amount::from_atoms(rng.random_range(10..initial_ask_amount.into_atoms() / 10)), UtxoOutPoint::new(coins_src_id.clone(), 1), None, ); @@ -824,9 +826,7 @@ async fn orphans_with_missing_order(#[case] seed: Seed) { } } -fn create_test_framework_builder_with_orders_v1( - rng: &mut (impl Rng + CryptoRng), -) -> TestFrameworkBuilder { +fn create_test_framework_builder_with_orders_v1(rng: &mut impl CryptoRng) -> TestFrameworkBuilder { TestFramework::builder(rng).with_chain_config( common::chain::config::Builder::test_chain() .chainstate_upgrades( @@ -841,12 +841,12 @@ fn create_test_framework_builder_with_orders_v1( } fn issue_and_mint_token_from_genesis( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tf: &mut TestFramework, ) -> (TokenId, UtxoOutPoint, UtxoOutPoint) { let genesis_block_id = tf.genesis().get_id(); let utxo = UtxoOutPoint::new(genesis_block_id.into(), 0); - let to_mint = Amount::from_atoms(rng.gen_range(100..100_000_000)); + let to_mint = Amount::from_atoms(rng.random_range(100..100_000_000)); issue_and_mint_random_token_from_best_block( rng, diff --git a/mempool/src/pool/tests/orphans.rs b/mempool/src/pool/tests/orphans.rs index 6fcb11cb42..9d7a36102e 100644 --- a/mempool/src/pool/tests/orphans.rs +++ b/mempool/src/pool/tests/orphans.rs @@ -189,7 +189,7 @@ async fn orphan_conflicts_with_mempool_tx(#[case] seed: Seed) { &[100_000_000, 50_000_000], ); let tx0_outpt = OutPointSourceId::Transaction(tx0.transaction().get_id()); - let dangling = OutPointSourceId::Transaction(Id::new(H256(rng.gen()))); + let dangling = OutPointSourceId::Transaction(Id::new(H256(rng.random()))); let tx1a = make_tx(&mut rng, &[(tx0_outpt.clone(), 0)], &[80_000_000]); let tx1b = make_tx(&mut rng, &[(dangling, 0), (tx0_outpt, 0)], &[30_000_000]); @@ -215,13 +215,13 @@ async fn transaction_graph_subset_permutation(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut gen_origin = { - let seed = Seed::from_u64(rng.gen()); + let seed = Seed::from_u64(rng.random()); let mut rng = make_seedable_rng(seed); - move || RemoteTxOrigin::new(p2p_types::PeerId::from_u64(rng.gen_range(1..=4))) + move || RemoteTxOrigin::new(p2p_types::PeerId::from_u64(rng.random_range(1..=4))) }; // Generate a valid graph of transactions - let num_txs = rng.gen_range(15..90); + let num_txs = rng.random_range(15..90); let time = TimeGetter::default().get_time(); let full_tx_sequence: Vec<_> = generate_transaction_graph(&mut rng, time).take(num_txs).collect(); @@ -229,13 +229,13 @@ async fn transaction_graph_subset_permutation(#[case] seed: Seed) { // Pick a subset of these transactions, taking each with 90% probability. let tx_subseq_0: Vec<_> = - full_tx_sequence.iter().filter(|_| rng.gen_bool(0.9)).cloned().collect(); + full_tx_sequence.iter().filter(|_| rng.random_bool(0.9)).cloned().collect(); // Take the same subsequence but with randomly shuffled order. // This means some transactions will be temporarily in the orphan pool. let tx_subseq_1 = { let mut subseq = tx_subseq_0.clone(); - let salt = rng.gen::(); + let salt = rng.random::(); subseq.sort_unstable_by_key(|tx| hash_encoded(&(tx.tx_id(), salt))); subseq }; @@ -252,7 +252,7 @@ async fn transaction_graph_subset_permutation(#[case] seed: Seed) { let _ = mempool.add_transaction_with_origin(tx, gen_origin().into()).expect("tx add"); // Randomly perform 0, 1, or 2 work units - for _ in 0..rng.gen_range(0..=2) { + for _ in 0..rng.random_range(0..=2) { mempool.perform_work_unit(); } }); @@ -357,9 +357,9 @@ async fn orphan_scheduling(#[case] seed: Seed) { let genesis_id = tf.genesis().get_id(); let mut gen_origin = { - let seed = Seed::from_u64(rng.gen()); + let seed = Seed::from_u64(rng.random()); let mut rng = make_seedable_rng(seed); - move || RemoteTxOrigin::new(p2p_types::PeerId::from_u64(rng.gen_range(1..=4))) + move || RemoteTxOrigin::new(p2p_types::PeerId::from_u64(rng.random_range(1..=4))) }; // Set up the transactions, similar to the diamond test above diff --git a/mempool/src/pool/tx_pool/feerate_points.rs b/mempool/src/pool/tx_pool/feerate_points.rs index ec89169446..366cf4eb66 100644 --- a/mempool/src/pool/tx_pool/feerate_points.rs +++ b/mempool/src/pool/tx_pool/feerate_points.rs @@ -93,7 +93,7 @@ pub fn generate_equidistant_span(first: usize, last: usize, n: usize) -> Vec(), - DescendantScore::new(FeeRate::from_atoms_per_kb(rng.gen_range(0..1_000_000))), + rng.random_range(0..=usize::MAX), + DescendantScore::new(FeeRate::from_atoms_per_kb(rng.random_range(0..1_000_000))), ); } @@ -181,8 +181,8 @@ mod tests { fn test_find_interpolated_value_interpolation(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let mut map = BTreeMap::new(); - let min = rng.gen_range(0..1_000_000); - let max = rng.gen_range(min..2_000_000); + let min = rng.random_range(0..1_000_000); + let max = rng.random_range(min..2_000_000); map.insert(0, DescendantScore::new(FeeRate::from_atoms_per_kb(min))); map.insert(10, DescendantScore::new(FeeRate::from_atoms_per_kb(max))); diff --git a/mempool/src/pool/tx_pool/store/mem_usage.rs b/mempool/src/pool/tx_pool/store/mem_usage.rs index a146a0cd2f..1760857020 100644 --- a/mempool/src/pool/tx_pool/store/mem_usage.rs +++ b/mempool/src/pool/tx_pool/store/mem_usage.rs @@ -393,7 +393,7 @@ mod test { fn box_size(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let data: Vec = (0u32..rng.gen_range(0..=1000)).map(|_| rng.gen()).collect(); + let data: Vec = (0u32..rng.random_range(0..=1000)).map(|_| rng.random()).collect(); let box_data = Box::new(data.clone()); assert_eq!(total_memory_usage(&data), box_data.indirect_memory_usage()); } @@ -428,15 +428,15 @@ mod test { let mut tracker = MemUsageTracker::new(); let mut data: Tracked, NoOpDropPolicy> = Tracked::default(); - let len1 = rng.gen_range(0..=100); + let len1 = rng.random_range(0..=100); tracker.modify(&mut data, |data, _| { - data.extend((0..len1).map(|_| rng.gen::())) + data.extend((0..len1).map(|_| rng.random::())) }); assert_eq!(tracker.get_usage(), len1); - let len2 = rng.gen_range(0..=300); + let len2 = rng.random_range(0..=300); tracker.modify(&mut data, |data, _| { - data.extend((0..len2).map(|_| rng.gen::())) + data.extend((0..len2).map(|_| rng.random::())) }); assert_eq!(tracker.get_usage(), len1 + len2); } diff --git a/mempool/src/pool/tx_pool/tests/accumulator.rs b/mempool/src/pool/tx_pool/tests/accumulator.rs index 6e9031bec3..c5ff8896a8 100644 --- a/mempool/src/pool/tx_pool/tests/accumulator.rs +++ b/mempool/src/pool/tx_pool/tests/accumulator.rs @@ -48,7 +48,7 @@ fn fill_accumulator(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let tf = TestFramework::builder(&mut rng).build(); let genesis_id = tf.genesis().get_id(); - let size_limit = rng.gen_range(10_000..=200_000); + let size_limit = rng.random_range(10_000..=200_000); let mut accumulator = DefaultTxAccumulator::new(size_limit, genesis_id.into(), DUMMY_TIMESTAMP); @@ -58,7 +58,7 @@ fn fill_accumulator(#[case] seed: Seed) { while accumulator.transactions().encoded_size() + 15_000 <= size_limit { let tx = make_tx(&mut rng, &[(source, 0)], &[amount]); source = OutPointSourceId::Transaction(tx.transaction().get_id()); - amount -= rng.gen_range(1_000_000..=5_000_000); + amount -= rng.random_range(1_000_000..=5_000_000); accumulator.add_tx(tx, Fee::new(Amount::from_atoms(0))).unwrap(); assert!(!accumulator.done()); } @@ -162,7 +162,7 @@ async fn transaction_graph_respects_deps(#[case] seed: Seed) { let txs_by_id: BTreeMap<_, _> = txs.into_iter().map(|tx| (*tx.tx_id(), tx)).collect(); // Pick a number of transaction IDs to be explicitly requested by the user. - let user_tx_ids = txs_by_id.keys().filter(|_| rng.gen_bool(0.1)).copied().collect(); + let user_tx_ids = txs_by_id.keys().filter(|_| rng.random_bool(0.1)).copied().collect(); let accumulator = Box::new(DefaultTxAccumulator::new( 10_000_000, diff --git a/mempool/src/pool/tx_pool/tests/basic.rs b/mempool/src/pool/tx_pool/tests/basic.rs index f866234bf6..77f07df2c2 100644 --- a/mempool/src/pool/tx_pool/tests/basic.rs +++ b/mempool/src/pool/tx_pool/tests/basic.rs @@ -1269,7 +1269,7 @@ async fn mempool_full_mock(#[case] seed: Seed) -> anyhow::Result<()> { async fn mempool_full_real(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let num_txs = rng.gen_range(5..20); + let num_txs = rng.random_range(5..20); let time = TimeGetter::default().get_time(); let txs: Vec<_> = generate_transaction_graph(&mut rng, time).take(num_txs).collect(); @@ -1427,7 +1427,7 @@ async fn accepted_tx_size(#[case] seed: Seed, #[case] tx_size: usize, #[case] ac // size of the full transaction matches the size required by the test. let data_size = tx_size - 147; let data_size = data_size - serialization::Compact::(data_size as u64).encoded_size(); - let data = (0..data_size).map(|_| rng.gen()).collect(); + let data = (0..data_size).map(|_| rng.random()).collect(); let tx_builder = tx_builder.add_output(TxOutput::DataDeposit(data)); let transaction = tx_builder.build(); @@ -1471,7 +1471,7 @@ async fn initial_values(#[case] seed: Seed) { let mempool_config = MempoolConfig { min_tx_relay_fee_rate: FeeRate::from_atoms_per_kb( - rng.gen_range(100_000..100_000_000_000_000), + rng.random_range(100_000..100_000_000_000_000), ) .into(), }; @@ -1480,13 +1480,13 @@ async fn initial_values(#[case] seed: Seed) { let initial_fee_rate = TxPool::::get_initial_fee_rate(&mempool_config); - let fee_rate = tx_pool.get_fee_rate(rng.gen_range(1..100)); + let fee_rate = tx_pool.get_fee_rate(rng.random_range(1..100)); assert_eq!(initial_fee_rate, fee_rate); let initial_fee_rate_points = TxPool::::get_initial_fee_rate_points(&mempool_config).unwrap(); let fee_rate_points = tx_pool - .get_fee_rate_points(NonZeroUsize::new(rng.gen_range(1..100)).unwrap()) + .get_fee_rate_points(NonZeroUsize::new(rng.random_range(1..100)).unwrap()) .unwrap(); assert_eq!(initial_fee_rate_points, fee_rate_points); } diff --git a/mempool/src/pool/tx_pool/tests/replacement.rs b/mempool/src/pool/tx_pool/tests/replacement.rs index ce2c37515e..0d7ca2affb 100644 --- a/mempool/src/pool/tx_pool/tests/replacement.rs +++ b/mempool/src/pool/tx_pool/tests/replacement.rs @@ -14,12 +14,12 @@ // limitations under the License. use common::chain::output_value::OutputValue; -use randomness::{CryptoRng, Rng}; +use randomness::CryptoRng; use super::*; async fn test_replace_tx( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, original_fee: Fee, replacement_fee: Fee, ) -> Result<(), Error> { diff --git a/mempool/src/pool/tx_pool/tests/utils.rs b/mempool/src/pool/tx_pool/tests/utils.rs index e6da783530..98ad4cea9e 100644 --- a/mempool/src/pool/tx_pool/tests/utils.rs +++ b/mempool/src/pool/tx_pool/tests/utils.rs @@ -25,7 +25,7 @@ pub use logging::log; pub use rstest::rstest; pub use test_utils::{ mock_time_getter::mocked_time_getter_seconds, - random::{make_seedable_rng, CryptoRng, Rng, Seed}, + random::{make_seedable_rng, CryptoRng, RngExt as _, Seed}, }; pub use memory_usage_estimator::StoreMemoryUsageEstimator; @@ -219,7 +219,7 @@ fn output_coin_amount(output: &TxOutput) -> Amount { } pub fn make_tx( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, ins: &[(OutPointSourceId, u32)], outs: &[u128], ) -> SignedTransaction { @@ -241,7 +241,7 @@ pub fn make_tx( /// * The transaction fees may drop below minimum threshold. /// * In extreme, 0-value outputs may be generated. pub fn generate_transaction_graph( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, time: Time, ) -> impl Iterator + '_ { let tf = TestFramework::builder(rng).build(); @@ -251,8 +251,8 @@ pub fn generate_transaction_graph( )]; std::iter::from_fn(move || { - let n_inputs = rng.gen_range(1..=std::cmp::min(3, utxos.len())); - let n_outputs = rng.gen_range(1..=3); + let n_inputs = rng.random_range(1..=std::cmp::min(3, utxos.len())); + let n_outputs = rng.random_range(1..=3); let estimated_fee = get_relay_fee_from_tx_size(estimate_tx_size(n_inputs, n_outputs)); @@ -266,7 +266,7 @@ pub fn generate_transaction_graph( let mut input_count = 0; while input_count < n_inputs || total < estimated_fee.into_atoms() + min_valid_total_amount { - let (outpt, amt) = utxos.swap_remove(rng.gen_range(0..utxos.len())); + let (outpt, amt) = utxos.swap_remove(rng.random_range(0..utxos.len())); total += amt; builder = builder.add_input(outpt, empty_witness(rng)); input_count += 1; @@ -276,7 +276,7 @@ pub fn generate_transaction_graph( if total < min_valid_total_amount { break; } - let amt = rng.gen_range((total / 2)..(95 * total / 100)); + let amt = rng.random_range((total / 2)..(95 * total / 100)); total -= amt; builder = builder.add_output(TxOutput::Transfer( OutputValue::Coin(Amount::from_atoms(amt)), diff --git a/mempool/src/pool/work_queue/mod.rs b/mempool/src/pool/work_queue/mod.rs index c391489d3a..d64f9df858 100644 --- a/mempool/src/pool/work_queue/mod.rs +++ b/mempool/src/pool/work_queue/mod.rs @@ -18,7 +18,7 @@ use std::collections::{btree_map, BTreeMap, BTreeSet}; use p2p_types::PeerId; -use randomness::{self, Rng, SliceRandom}; +use randomness::{self, RngExt as _, SliceRandom}; /// Per-peer work schedule queue #[derive(Eq, PartialEq, Clone, Debug)] @@ -151,7 +151,7 @@ impl WorkQueue { // mutability issues, it's slightly awkward. We first push it at the end and then // swap it with a random other element in the vec. self.scheduled.push(peer); - let pos = randomness::make_pseudo_rng().gen_range(0..self.scheduled.len()); + let pos = randomness::make_pseudo_rng().random_range(0..self.scheduled.len()); let last = self.scheduled.len() - 1; self.scheduled.swap(pos, last); diff --git a/mempool/src/pool/work_queue/test.rs b/mempool/src/pool/work_queue/test.rs index 3c28a51e1f..32929b81cb 100644 --- a/mempool/src/pool/work_queue/test.rs +++ b/mempool/src/pool/work_queue/test.rs @@ -13,11 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -use super::*; -use logging::log; use rstest::rstest; + +use logging::log; +use randomness::{Rng, RngExt as _}; use test_utils::random::{make_seedable_rng, Seed}; +use super::*; + impl WorkQueue { fn check_integrity(&self) { let scheduled_set: BTreeSet<_> = self.scheduled.iter().copied().collect(); @@ -35,9 +38,9 @@ impl WorkQueue { } fn random_peer_queue(rng: &mut impl Rng) -> PeerQueue { - let mut pq = PeerQueue::new(rng.gen()); - let n_items = rng.gen_range(0..100); - pq.queue.extend((0..n_items).map(|_| rng.gen::())); + let mut pq = PeerQueue::new(rng.random()); + let n_items = rng.random_range(0..100); + pq.queue.extend((0..n_items).map(|_| rng.random::())); pq } @@ -94,9 +97,9 @@ impl PeerIdSupply { Self { active, next } } - fn gen(&mut self, rng: &mut impl Rng, extra: usize) -> PeerId { + fn random(&mut self, rng: &mut impl Rng, extra: usize) -> PeerId { self.active - .get(rng.gen_range(0..(self.active.len() + extra))) + .get(rng.random_range(0..(self.active.len() + extra))) .copied() .unwrap_or({ let peer = PeerId::from_u64(self.next); @@ -130,9 +133,9 @@ fn simulation(#[case] seed: Seed) { let mut processed = BTreeSet::new(); for _ in 0..500 { - match rng.gen_range(1..=6) { + match rng.random_range(1..=6) { 1..=3 => { - let peer = peer_supply.gen(&mut rng, 2); + let peer = peer_supply.random(&mut rng, 2); log::debug!("Inserting into peer{peer}'s queue: {next_item:03}"); wq.insert(peer, next_item); @@ -150,7 +153,7 @@ fn simulation(#[case] seed: Seed) { } } 6..=6 => { - let peer = peer_supply.gen(&mut rng, 1); + let peer = peer_supply.random(&mut rng, 1); log::debug!("Removing peer{peer}"); // Mark peer's work set as processed @@ -198,7 +201,7 @@ fn scheduling_fairness_full_queues(#[case] seed: Seed) { const MIN_WORK: usize = 100; let mut rng = make_seedable_rng(seed); - let num_peers: usize = rng.gen_range(2..=8); + let num_peers: usize = rng.random_range(2..=8); let peer1 = PeerId::from_u64(1); let mut next_item = 0u64; @@ -207,7 +210,7 @@ fn scheduling_fairness_full_queues(#[case] seed: Seed) { // Pre-populate the queue with at least MIN_ELEMS for each peer. We also fill the queue in // the peer-by-peer order and later observe if work for peers is interleaved. for peer in 1..=num_peers { - for _ in 0..rng.gen_range(MIN_WORK..(MIN_WORK + 100)) { + for _ in 0..rng.random_range(MIN_WORK..(MIN_WORK + 100)) { wq.insert(PeerId::from_u64(peer as u64), next_item); next_item += 1; wq.check_integrity(); @@ -220,7 +223,7 @@ fn scheduling_fairness_full_queues(#[case] seed: Seed) { for _ in 0..(MIN_WORK * num_peers) { // Peer 1 is a designated adversary trying to fill the queue at a high rate. // Despite this, it should not get any larger slice of time than other peers. - for _ in 0..rng.gen_range(0..4) { + for _ in 0..rng.random_range(0..4) { wq.insert(peer1, next_item); next_item += 1; } diff --git a/mintscript/src/tests/checkers.rs b/mintscript/src/tests/checkers.rs index d2c7d8f4c4..24160330dc 100644 --- a/mintscript/src/tests/checkers.rs +++ b/mintscript/src/tests/checkers.rs @@ -18,7 +18,7 @@ use std::borrow::Cow; use super::*; fn make_dummy_tx( - mut rng: impl Rng + CryptoRng, + mut rng: impl CryptoRng, privkeys: &[&PrivateKey], ) -> (SignedTransaction, Vec>) { // Create a simple single output transaction. We can afford to put dummy data @@ -28,8 +28,8 @@ fn make_dummy_tx( let n_inputs = privkeys.len(); let mut gen_value = { - let mut rng = make_seedable_rng(rng.gen()); - move || OutputValue::Coin(Amount::from_atoms(rng.gen_range(0..10_u128.pow(20)))) + let mut rng = make_seedable_rng(rng.random()); + move || OutputValue::Coin(Amount::from_atoms(rng.random_range(0..10_u128.pow(20)))) }; let utxos: Vec<_> = (0_usize..n_inputs) @@ -38,8 +38,8 @@ fn make_dummy_tx( let output = TxOutput::Burn(gen_value()); let inputs = (0..n_inputs).map(|_| { - let outpoint = OutPointSourceId::Transaction(Id::new(rng.gen())); - TxInput::from_utxo(outpoint, rng.gen_range(0u32..200)) + let outpoint = OutPointSourceId::Transaction(Id::new(rng.random())); + TxInput::from_utxo(outpoint, rng.random_range(0u32..200)) }); let input_commitments = utxos .iter() @@ -77,7 +77,7 @@ fn check_sig(#[case] seed: Seed) { use common::chain::signature::EvaluatedInputWitness; let mut rng = make_seedable_rng(seed); - let n_inputs = rng.gen_range(1..5); + let n_inputs = rng.random_range(1..5); let keypairs: Vec<_> = (0..n_inputs) .map(|_| PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr)) @@ -118,12 +118,12 @@ fn check_sig(#[case] seed: Seed) { } fn check_timelocks( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, timelock: OutputTimeLock, (utxo_height, spend_height, utxo_time, spend_time): (u64, u64, u64, u64), expected_ok: bool, ) { - let n_inputs = rng.gen_range(1..5); + let n_inputs = rng.random_range(1..5); let utxo_height = BlockHeight::new(utxo_height); let spend_height = BlockHeight::new(spend_height); let utxo_time = BlockTimestamp::from_int_seconds(utxo_time); @@ -195,10 +195,10 @@ fn check_timelocks_rand( ) { let mut rng = TestRng::new(seed); - let utxo_height = rng.gen_range(0..100_000); - let spend_dist = rng.gen_range(1..100_000); - let utxo_time = rng.gen_range(0..10_000_000); - let spend_delay = rng.gen_range(1..10_000_000); + let utxo_height = rng.random_range(0..100_000); + let spend_dist = rng.random_range(1..100_000); + let utxo_time = rng.random_range(0..10_000_000); + let spend_delay = rng.random_range(1..10_000_000); let ctx_info = ( utxo_height, utxo_height + spend_dist, @@ -216,7 +216,7 @@ fn check_timelocks_rand( fn timelock_rand_abs_height_ok(#[case] seed: Seed) { check_timelocks_rand( seed, - |r, h, d, _, _| tl_until_height(h + r.gen_range(0..=d)), + |r, h, d, _, _| tl_until_height(h + r.random_range(0..=d)), true, ) } @@ -227,7 +227,7 @@ fn timelock_rand_abs_height_ok(#[case] seed: Seed) { fn timelock_rand_abs_height_fail(#[case] seed: Seed) { check_timelocks_rand( seed, - |r, h, d, _, _| tl_until_height(h + d + r.gen_range(1..1_000)), + |r, h, d, _, _| tl_until_height(h + d + r.random_range(1..1_000)), false, ) } @@ -238,7 +238,7 @@ fn timelock_rand_abs_height_fail(#[case] seed: Seed) { fn timelock_rand_rel_height_ok(#[case] seed: Seed) { check_timelocks_rand( seed, - |r, _, d, _, _| tl_for_blocks(r.gen_range(0..=d)), + |r, _, d, _, _| tl_for_blocks(r.random_range(0..=d)), true, ) } @@ -249,7 +249,7 @@ fn timelock_rand_rel_height_ok(#[case] seed: Seed) { fn timelock_rand_rel_height_fail(#[case] seed: Seed) { check_timelocks_rand( seed, - |r, _, d, _, _| tl_for_blocks(d + r.gen_range(1..1_000)), + |r, _, d, _, _| tl_for_blocks(d + r.random_range(1..1_000)), false, ) } @@ -260,7 +260,7 @@ fn timelock_rand_rel_height_fail(#[case] seed: Seed) { fn timelock_rand_abs_time_ok(#[case] seed: Seed) { check_timelocks_rand( seed, - |r, _, _, t, d| tl_until_time(t + r.gen_range(0..=d)), + |r, _, _, t, d| tl_until_time(t + r.random_range(0..=d)), true, ) } @@ -271,7 +271,7 @@ fn timelock_rand_abs_time_ok(#[case] seed: Seed) { fn timelock_rand_abs_time_fail(#[case] seed: Seed) { check_timelocks_rand( seed, - |r, _, _, t, d| tl_until_time(t + d + r.gen_range(1..1_000)), + |r, _, _, t, d| tl_until_time(t + d + r.random_range(1..1_000)), false, ) } @@ -280,7 +280,11 @@ fn timelock_rand_abs_time_fail(#[case] seed: Seed) { #[trace] #[case(Seed::from_entropy())] fn timelock_rand_rel_time_ok(#[case] seed: Seed) { - check_timelocks_rand(seed, |r, _, _, _, d| tl_for_secs(r.gen_range(0..=d)), true) + check_timelocks_rand( + seed, + |r, _, _, _, d| tl_for_secs(r.random_range(0..=d)), + true, + ) } #[rstest::rstest] @@ -289,7 +293,7 @@ fn timelock_rand_rel_time_ok(#[case] seed: Seed) { fn timelock_rand_rel_time_fail(#[case] seed: Seed) { check_timelocks_rand( seed, - |r, _, _, _, d| tl_for_secs(d + r.gen_range(1..100_000)), + |r, _, _, _, d| tl_for_secs(d + r.random_range(1..100_000)), false, ) } diff --git a/mintscript/src/tests/hashlock_checker.rs b/mintscript/src/tests/hashlock_checker.rs index 0ed8284afc..d9efa538c3 100644 --- a/mintscript/src/tests/hashlock_checker.rs +++ b/mintscript/src/tests/hashlock_checker.rs @@ -88,8 +88,8 @@ fn check_hashlock_160_ok(#[case] preimage: &str, #[case] hash: &str) { fn check_hashlock_160_random_values_mismatch(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let preimage: [u8; 32] = std::array::from_fn(|_| rng.gen::()); - let hash: [u8; 20] = std::array::from_fn(|_| rng.gen::()); + let preimage: [u8; 32] = std::array::from_fn(|_| rng.random::()); + let hash: [u8; 20] = std::array::from_fn(|_| rng.random::()); let script = WitnessScript::hashlock(HashChallenge::Hash160(hash), preimage); diff --git a/mintscript/src/tests/mod.rs b/mintscript/src/tests/mod.rs index e71504b960..09dca89326 100644 --- a/mintscript/src/tests/mod.rs +++ b/mintscript/src/tests/mod.rs @@ -30,7 +30,7 @@ use common::{ }; use crypto::key::{KeyKind, PrivateKey, PublicKey}; use test_utils::random::{ - make_seedable_rng, randomness::SliceRandom, CryptoRng, Rng, Seed, TestRng, + make_seedable_rng, randomness::SliceRandom, CryptoRng, RngExt as _, Seed, TestRng, }; use utxo::{Utxo, UtxoSource}; diff --git a/mintscript/src/tests/script.rs b/mintscript/src/tests/script.rs index e64ee4ce6c..f47a278d06 100644 --- a/mintscript/src/tests/script.rs +++ b/mintscript/src/tests/script.rs @@ -16,6 +16,7 @@ use std::ops::RangeInclusive; use common::chain::signature::EvaluatedInputWitness; +use test_utils::random::Rng; use super::*; @@ -65,8 +66,8 @@ fn threshold_collect_satisfied( #[case] dissat_range: RangeInclusive, ) { let mut rng = make_seedable_rng(seed); - let n_sat = rng.gen_range(sat_range); - let n_dissat = rng.gen_range(dissat_range); + let n_sat = rng.random_range(sat_range); + let n_dissat = rng.random_range(dissat_range); let conds = generate_conds(&mut rng, n_sat, n_dissat); { @@ -78,12 +79,12 @@ fn threshold_collect_satisfied( } if n_sat > 0 { - let thresh = Threshold::new(rng.gen_range(0..n_sat), conds.clone()).unwrap(); + let thresh = Threshold::new(rng.random_range(0..n_sat), conds.clone()).unwrap(); assert_eq!(thresh.collect_satisfied(), Err(ThresholdError::Excessive)); } if n_dissat > 0 { - let required = rng.gen_range((n_sat + 1)..=conds.len()); + let required = rng.random_range((n_sat + 1)..=conds.len()); let thresh = Threshold::new(required, conds.clone()).unwrap(); assert_eq!( thresh.collect_satisfied(), @@ -99,9 +100,9 @@ fn threshold_collect_satisfied( #[case::rand(Seed::from_entropy(), 2..=100)] fn conjunction_matches_explicit(#[case] seed: Seed, #[case] size_range: RangeInclusive) { let mut rng = make_seedable_rng(seed); - let n = rng.gen_range(size_range); + let n = rng.random_range(size_range); - let conds: Vec<_> = (0..n).map(|_| ScriptCondition::from_bool(rng.gen_bool(0.8))).collect(); + let conds: Vec<_> = (0..n).map(|_| ScriptCondition::from_bool(rng.random_bool(0.8))).collect(); let thr_conj = WitnessScript::conjunction(conds.clone()); let thr_expl = WitnessScript::threshold(n, conds).unwrap(); diff --git a/networking/src/test_helpers.rs b/networking/src/test_helpers.rs index f6fb1fcbc5..e410a74a23 100644 --- a/networking/src/test_helpers.rs +++ b/networking/src/test_helpers.rs @@ -27,7 +27,7 @@ use std::{ net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, }; -use randomness::Rng; +use randomness::{Rng, RngExt as _}; use crate::transport::{ MpscChannelTransport, NoiseEncryptionAdapter, NoiseTcpTransport, TcpTransportSocket, @@ -105,14 +105,14 @@ pub struct TestAddressMaker {} impl TestAddressMaker { pub fn new_random_ipv6_addr(rng: &mut impl Rng) -> Ipv6Addr { Ipv6Addr::new( - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), + rng.random(), + rng.random(), + rng.random(), + rng.random(), + rng.random(), + rng.random(), + rng.random(), + rng.random(), ) } @@ -127,7 +127,7 @@ impl TestAddressMaker { } pub fn new_random_ipv4_addr(rng: &mut impl Rng) -> Ipv4Addr { - Ipv4Addr::new(rng.gen(), rng.gen(), rng.gen(), rng.gen()) + Ipv4Addr::new(rng.random(), rng.random(), rng.random(), rng.random()) } pub fn new_distinct_random_ipv4_addrs(count: usize, rng: &mut impl Rng) -> Vec { @@ -142,7 +142,7 @@ impl TestAddressMaker { pub fn new_random_address(rng: &mut impl Rng) -> SocketAddr { let ip = Self::new_random_ipv6_addr(rng); - SocketAddr::new(IpAddr::V6(ip), rng.gen()) + SocketAddr::new(IpAddr::V6(ip), rng.random()) } } diff --git a/networking/src/transport/impls/channel.rs b/networking/src/transport/impls/channel.rs index 9dec13edc6..b4ce8ffb42 100644 --- a/networking/src/transport/impls/channel.rs +++ b/networking/src/transport/impls/channel.rs @@ -328,7 +328,7 @@ pub enum MpscChannelTransportError { mod tests { use std::net::SocketAddrV4; - use randomness::Rng; + use randomness::RngExt; use test_utils::random::{gen_random_bytes, Seed}; use crate::transport::new_message_stream; @@ -354,7 +354,7 @@ mod tests { let server_stream = server_res.unwrap().0; let peer_stream = peer_res.unwrap(); - let message_size = rng.gen_range(128..1024); + let message_size = rng.random_range(128..1024); let message = gen_random_bytes(&mut rng, 1, message_size); let (_, mut peer_stream_writer) = diff --git a/networking/src/transport/message_codec.rs b/networking/src/transport/message_codec.rs index fc8118d570..a3d48473a8 100644 --- a/networking/src/transport/message_codec.rs +++ b/networking/src/transport/message_codec.rs @@ -110,7 +110,7 @@ impl Encoder for MessageCodec { #[cfg(test)] mod tests { - use randomness::Rng; + use randomness::RngExt; use serialization::{Decode, Encode}; use test_utils::random::Seed; @@ -130,17 +130,17 @@ mod tests { fn size_limit_encode(#[case] seed: Seed) { let mut rng = test_utils::random::make_seedable_rng(seed); - let message = TestMessage { data: rng.gen() }; + let message = TestMessage { data: rng.random() }; let mut buf = BytesMut::new(); // Encode to determine the serialized message length. - MessageCodec::new(Some(rng.gen_range(64..128))) + MessageCodec::new(Some(rng.random_range(64..128))) .encode(message.clone(), &mut buf) .unwrap(); assert!(buf.len() > size_of::()); let message_length = buf.len() - size_of::(); - let max_length = rng.gen_range(0..message_length); + let max_length = rng.random_range(0..message_length); let mut encoder = MessageCodec::new(Some(max_length)); let result = encoder.encode(message, &mut buf); assert_eq!( @@ -161,14 +161,14 @@ mod tests { fn size_limit_decode(#[case] seed: Seed) { let mut rng = test_utils::random::make_seedable_rng(seed); - let message = TestMessage { data: rng.gen() }; + let message = TestMessage { data: rng.random() }; let mut encoded = BytesMut::new(); - MessageCodec::new(Some(rng.gen_range(126..512))) + MessageCodec::new(Some(rng.random_range(126..512))) .encode(message, &mut encoded) .unwrap(); let message_length = encoded.len() - size_of::(); - let max_length = rng.gen_range(0..message_length); + let max_length = rng.random_range(0..message_length); let mut decoder = MessageCodec::::new(Some(max_length)); let result = decoder.decode(&mut encoded); assert_eq!( @@ -189,9 +189,9 @@ mod tests { fn roundtrip(#[case] seed: Seed) { let mut rng = test_utils::random::make_seedable_rng(seed); - let message = TestMessage { data: rng.gen() }; + let message = TestMessage { data: rng.random() }; - let mut encoder = MessageCodec::new(Some(rng.gen_range(128..2048))); + let mut encoder = MessageCodec::new(Some(rng.random_range(128..2048))); let mut buf = BytesMut::new(); encoder.encode(message.clone(), &mut buf).unwrap(); diff --git a/networking/src/transport/message_stream.rs b/networking/src/transport/message_stream.rs index b0c43ac11f..d678f9473d 100644 --- a/networking/src/transport/message_stream.rs +++ b/networking/src/transport/message_stream.rs @@ -119,7 +119,7 @@ where #[cfg(test)] mod tests { - use randomness::Rng; + use randomness::RngExt; use test_utils::random::{gen_random_bytes, make_seedable_rng, Seed}; use super::*; @@ -133,14 +133,14 @@ mod tests { async fn message_roundtrip(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let message_count = rng.gen_range(1..=20); + let message_count = rng.random_range(1..=20); let max_msg_size = 1000; let messages = (0..message_count) .map(|_| gen_random_bytes(&mut rng, 1, max_msg_size)) .collect::>(); - let buf_size = rng.gen_range(10..max_msg_size + 10); + let buf_size = rng.random_range(10..max_msg_size + 10); let (stream1, stream2) = tokio::io::duplex(buf_size); let (_, mut sender) = new_message_stream(stream1, None); diff --git a/node-gui/backend/src/account_id.rs b/node-gui/backend/src/account_id.rs index 9cf4247096..45b15b2061 100644 --- a/node-gui/backend/src/account_id.rs +++ b/node-gui/backend/src/account_id.rs @@ -50,7 +50,7 @@ mod tests { use super::*; use rstest::rstest; - use test_utils::random::{Rng, Seed}; + use test_utils::random::{RngExt as _, Seed}; #[rstest] #[trace] @@ -58,7 +58,7 @@ mod tests { fn test_json_valid(#[case] seed: Seed) { let mut rng = test_utils::random::make_seedable_rng(seed); - let id = AccountId::new(U31::from_u32_with_msb(rng.gen::()).0); + let id = AccountId::new(U31::from_u32_with_msb(rng.random::()).0); let id_json = serde_json::to_string(&id).unwrap(); let id_decoded = serde_json::from_str::(&id_json).unwrap(); @@ -73,7 +73,7 @@ mod tests { let mut rng = test_utils::random::make_seedable_rng(seed); - let str = rng.gen_range(MSB_BIT..u32::MAX).to_string(); + let str = rng.random_range(MSB_BIT..u32::MAX).to_string(); serde_json::from_str::(&str).unwrap_err(); } diff --git a/node-lib/src/config_files/mod.rs b/node-lib/src/config_files/mod.rs index 885ac259fa..2fbab6ce50 100644 --- a/node-lib/src/config_files/mod.rs +++ b/node-lib/src/config_files/mod.rs @@ -257,7 +257,7 @@ fn p2p_config(config: P2pConfigFile, options: &RunOptions) -> P2pConfigFile { mod tests { use std::io::Write; - use randomness::{distributions::Alphanumeric, make_pseudo_rng, Rng}; + use randomness::{distributions::Alphanumeric, make_pseudo_rng, RngExt as _}; use super::*; diff --git a/orders-accounting/src/tests/operations.rs b/orders-accounting/src/tests/operations.rs index 10dc1b347d..dbdd5cc5d1 100644 --- a/orders-accounting/src/tests/operations.rs +++ b/orders-accounting/src/tests/operations.rs @@ -15,13 +15,14 @@ use std::collections::{BTreeMap, BTreeSet}; +use rstest::rstest; + use accounting::GetDataResult; use common::{ chain::{output_value::OutputValue, tokens::TokenId, Destination, OrderId, OrdersVersion}, primitives::Amount, }; -use randomness::Rng; -use rstest::rstest; +use randomness::{Rng, RngExt as _}; use test_utils::random::{make_seedable_rng, Seed}; use crate::{ @@ -34,8 +35,8 @@ fn make_order_data(rng: &mut impl Rng) -> OrderData { let token_id = TokenId::random_using(rng); OrderData::new( Destination::AnyoneCanSpend, - OutputValue::Coin(Amount::from_atoms(rng.gen_range(1u128..1000))), - OutputValue::TokenV1(token_id, Amount::from_atoms(rng.gen_range(1u128..1000))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(1u128..1000))), + OutputValue::TokenV1(token_id, Amount::from_atoms(rng.random_range(1u128..1000))), ) } @@ -540,8 +541,8 @@ fn fill_order_partially_and_conclude(#[case] seed: Seed, #[case] version: Orders fn fill_order_must_converge(#[case] seed: Seed, #[case] version: OrdersVersion) { let mut rng = make_seedable_rng(seed); - let ask_atoms = rng.gen_range(1u128..1_000_000_000); - let give_atoms = rng.gen_range(1u128..1_000_000_000); + let ask_atoms = rng.random_range(1u128..1_000_000_000); + let give_atoms = rng.random_range(1u128..1_000_000_000); let ask_amount = Amount::from_atoms(ask_atoms); let give_amount = Amount::from_atoms(give_atoms); let fill_orders = test_utils::split_value(&mut rng, ask_atoms) @@ -724,8 +725,8 @@ fn fill_order_underbid(#[case] seed: Seed, #[case] version: OrdersVersion) { fn fill_orders_interrupted_by_v0_to_v1_fork(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let ask_atoms = rng.gen_range(1u128..1_000_000_000); - let give_atoms = rng.gen_range(1u128..1_000_000_000); + let ask_atoms = rng.random_range(1u128..1_000_000_000); + let give_atoms = rng.random_range(1u128..1_000_000_000); let ask_amount = Amount::from_atoms(ask_atoms); let give_amount = Amount::from_atoms(give_atoms); let fill_orders = test_utils::split_value(&mut rng, ask_atoms) @@ -733,7 +734,7 @@ fn fill_orders_interrupted_by_v0_to_v1_fork(#[case] seed: Seed) { .filter(|v| *v > 0) .collect::>(); let (fill_orders_v0, fill_orders_v1) = - fill_orders.split_at(rng.gen_range(1..=fill_orders.len())); + fill_orders.split_at(rng.random_range(1..=fill_orders.len())); let ask = OutputValue::Coin(ask_amount); let give = OutputValue::Coin(give_amount); diff --git a/p2p/src/net/default_backend/backend.rs b/p2p/src/net/default_backend/backend.rs index 2b08d3b0c0..e5c9946ef0 100644 --- a/p2p/src/net/default_backend/backend.rs +++ b/p2p/src/net/default_backend/backend.rs @@ -34,7 +34,7 @@ use common::{ use logging::log; use networking::transport::{ConnectedSocketInfo, TransportListener, TransportSocket}; use p2p_types::socket_address::SocketAddress; -use randomness::{make_pseudo_rng, Rng}; +use randomness::{make_pseudo_rng, RngExt as _}; use utils::{ atomics::SeqCstAtomicBool, eventhandler::EventsController, set_flag::SetFlag, shallow_clone::ShallowClone, tokio_spawn_in_current_tracing_span, @@ -227,7 +227,7 @@ where ) -> crate::Result<()> { match connection_res { Ok(socket) => { - let handshake_nonce = make_pseudo_rng().gen(); + let handshake_nonce = make_pseudo_rng().random(); self.create_pending_peer( socket, diff --git a/p2p/src/net/default_backend/types.rs b/p2p/src/net/default_backend/types.rs index 0a2507cd8d..33e9e5aede 100644 --- a/p2p/src/net/default_backend/types.rs +++ b/p2p/src/net/default_backend/types.rs @@ -432,7 +432,7 @@ mod tests { use networking::test_helpers::{get_two_connected_sockets, TestTransportChannel}; use networking::transport::{new_message_stream, MpscChannelTransport}; use p2p_types::services::Service; - use randomness::Rng; + use randomness::RngExt; use test_utils::random::Seed; use crate::{ @@ -466,74 +466,98 @@ mod tests { let messages = [ Message::Handshake(HandshakeMessage::Hello { - protocol_version: ProtocolVersion::new(rng.gen()), - network: MagicBytes::new([rng.gen(), rng.gen(), rng.gen(), rng.gen()]), + protocol_version: ProtocolVersion::new(rng.random()), + network: MagicBytes::new([rng.random(), rng.random(), rng.random(), rng.random()]), services: [Service::Blocks].as_slice().into(), user_agent: p2p_config.user_agent.clone(), software_version: SemVer { - major: rng.gen(), - minor: rng.gen(), - patch: rng.gen(), + major: rng.random(), + minor: rng.random(), + patch: rng.random(), }, receiver_address: Some( SocketAddr::new( - IpAddr::V4(Ipv4Addr::new(rng.gen(), rng.gen(), rng.gen(), rng.gen())), - rng.gen(), + IpAddr::V4(Ipv4Addr::new( + rng.random(), + rng.random(), + rng.random(), + rng.random(), + )), + rng.random(), ) .into(), ), - current_time: P2pTimestamp::from_int_seconds(rng.gen()), - handshake_nonce: rng.gen(), + current_time: P2pTimestamp::from_int_seconds(rng.random()), + handshake_nonce: rng.random(), }), Message::Handshake(HandshakeMessage::HelloAck { - protocol_version: ProtocolVersion::new(rng.gen()), - network: MagicBytes::new([rng.gen(), rng.gen(), rng.gen(), rng.gen()]), + protocol_version: ProtocolVersion::new(rng.random()), + network: MagicBytes::new([rng.random(), rng.random(), rng.random(), rng.random()]), services: [Service::Blocks].as_slice().into(), user_agent: p2p_config.user_agent.clone(), software_version: SemVer { - major: rng.gen(), - minor: rng.gen(), - patch: rng.gen(), + major: rng.random(), + minor: rng.random(), + patch: rng.random(), }, receiver_address: Some( SocketAddr::new( - IpAddr::V4(Ipv4Addr::new(rng.gen(), rng.gen(), rng.gen(), rng.gen())), - rng.gen(), + IpAddr::V4(Ipv4Addr::new( + rng.random(), + rng.random(), + rng.random(), + rng.random(), + )), + rng.random(), ) .into(), ), - current_time: P2pTimestamp::from_int_seconds(rng.gen()), + current_time: P2pTimestamp::from_int_seconds(rng.random()), }), - Message::PingRequest(PingRequest { nonce: rng.gen() }), - Message::PingResponse(PingResponse { nonce: rng.gen() }), - Message::NewTransaction(Id::new(rng.gen())), + Message::PingRequest(PingRequest { + nonce: rng.random(), + }), + Message::PingResponse(PingResponse { + nonce: rng.random(), + }), + Message::NewTransaction(Id::new(rng.random())), Message::HeaderListRequest(HeaderListRequest::new(Locator::new(vec![ - Id::new(rng.gen()), - Id::new(rng.gen()), + Id::new(rng.random()), + Id::new(rng.random()), ]))), Message::HeaderList(HeaderList::new(vec![block.header().clone()])), Message::BlockListRequest(BlockListRequest::new(vec![ - Id::new(rng.gen()), - Id::new(rng.gen()), + Id::new(rng.random()), + Id::new(rng.random()), ])), Message::BlockResponse(BlockResponse::new(block.clone())), - Message::TransactionRequest(Id::new(rng.gen())), - Message::TransactionResponse(TransactionResponse::NotFound(Id::new(rng.gen()))), + Message::TransactionRequest(Id::new(rng.random())), + Message::TransactionResponse(TransactionResponse::NotFound(Id::new(rng.random()))), Message::TransactionResponse(TransactionResponse::Found( block.transactions()[0].clone(), )), Message::AnnounceAddrRequest(AnnounceAddrRequest { address: SocketAddr::new( - IpAddr::V4(Ipv4Addr::new(rng.gen(), rng.gen(), rng.gen(), rng.gen())), - rng.gen(), + IpAddr::V4(Ipv4Addr::new( + rng.random(), + rng.random(), + rng.random(), + rng.random(), + )), + rng.random(), ) .into(), }), Message::AddrListRequest(AddrListRequest {}), Message::AddrListResponse(AddrListResponse { addresses: vec![SocketAddr::new( - IpAddr::V4(Ipv4Addr::new(rng.gen(), rng.gen(), rng.gen(), rng.gen())), - rng.gen(), + IpAddr::V4(Ipv4Addr::new( + rng.random(), + rng.random(), + rng.random(), + rng.random(), + )), + rng.random(), ) .into()], }), diff --git a/p2p/src/peer_manager/addr_list_response_cache.rs b/p2p/src/peer_manager/addr_list_response_cache.rs index 6210b04506..e08f9ef213 100644 --- a/p2p/src/peer_manager/addr_list_response_cache.rs +++ b/p2p/src/peer_manager/addr_list_response_cache.rs @@ -20,7 +20,7 @@ use std::{ }; use common::primitives::time::Time; -use randomness::Rng; +use randomness::{Rng, RngExt as _}; use super::{peer_context::PeerContext, peerdb::salt::Salt}; @@ -110,7 +110,7 @@ impl AddrListResponseCache { fn new_expiration_time_from_now(now: Time, rng: &mut impl Rng) -> Time { let min_secs = EXPIRATION_INTERVAL_MIN.as_secs(); let max_secs = EXPIRATION_INTERVAL_MAX.as_secs(); - let secs = rng.gen_range(min_secs..=max_secs); + let secs = rng.random_range(min_secs..=max_secs); (now + Duration::from_secs(secs)).expect("Unexpected time overflow") } } diff --git a/p2p/src/peer_manager/dns_seed.rs b/p2p/src/peer_manager/dns_seed.rs index fa95132f70..b3dd05f138 100644 --- a/p2p/src/peer_manager/dns_seed.rs +++ b/p2p/src/peer_manager/dns_seed.rs @@ -20,13 +20,13 @@ use async_trait::async_trait; use common::chain::ChainConfig; use logging::log; use p2p_types::{peer_address::PeerAddress, socket_address::SocketAddress}; -use randomness::{seq::IteratorRandom, RngCore}; +use randomness::{seq::IteratorRandom, Rng}; use crate::config::P2pConfig; #[async_trait] pub trait DnsSeed: Send + Sync { - async fn obtain_addresses(&self, rng: &mut (dyn RngCore + Send)) -> Vec; + async fn obtain_addresses(&self, rng: &mut (dyn Rng + Send)) -> Vec; } pub struct DefaultDnsSeed { @@ -48,7 +48,7 @@ const MAX_DNS_RECORDS: usize = 10; #[async_trait] impl DnsSeed for DefaultDnsSeed { - async fn obtain_addresses(&self, rng: &mut (dyn RngCore + Send)) -> Vec { + async fn obtain_addresses(&self, rng: &mut (dyn Rng + Send)) -> Vec { let dns_seeds = self.chain_config.dns_seeds(); if dns_seeds.is_empty() { @@ -74,7 +74,7 @@ impl DnsSeed for DefaultDnsSeed { ) }) // Randomize selection because records can be sorted by type (A and AAAA) - .choose_multiple(rng, MAX_DNS_RECORDS) + .sample(rng, MAX_DNS_RECORDS) .into_iter() .for_each(|addr| { addresses.push(addr); diff --git a/p2p/src/peer_manager/mod.rs b/p2p/src/peer_manager/mod.rs index 74c8d43878..f0b831c0ea 100644 --- a/p2p/src/peer_manager/mod.rs +++ b/p2p/src/peer_manager/mod.rs @@ -44,7 +44,7 @@ use common::{ use logging::log; use networking::types::ConnectionDirection; use p2p_types::{bannable_address::BannableAddress, socket_address::SocketAddress, IsGlobalIp}; -use randomness::{seq::IteratorRandom, BoxedRngMutexWrapper, Rng, RngCore}; +use randomness::{seq::IteratorRandom, BoxedRngMutexWrapper, Rng, RngExt as _}; use utils::{ bloom_filters::rolling_bloom_filter::RollingBloomFilter, debug_panic_or_log, ensure, set_flag::SetFlag, @@ -210,7 +210,7 @@ where dns_seed: Box, /// An RNG used to generate various delays when dealing with peers. - rng: std::sync::Mutex>, + rng: std::sync::Mutex>, /// The time when PeerManager was initialized. init_time: Time, @@ -249,7 +249,7 @@ where peer_mgr_event_receiver: mpsc::UnboundedReceiver, time_getter: TimeGetter, peerdb_storage: S, - rng: impl RngCore + Send + 'static, + rng: impl Rng + Send + 'static, ) -> crate::Result { Self::new_generic( networking_enabled, @@ -276,7 +276,7 @@ where peerdb_storage: S, observer: Option>, dns_seed: Box, - mut rng: impl RngCore + Send + 'static, + mut rng: impl Rng + Send + 'static, ) -> crate::Result { let peerdb = peerdb::PeerDb::new( &chain_config, @@ -320,15 +320,15 @@ where } fn lock_rng( - rng: &std::sync::Mutex>, - ) -> std::sync::MutexGuard<'_, Box> { + rng: &std::sync::Mutex>, + ) -> std::sync::MutexGuard<'_, Box> { rng.lock().expect("poisoned mutex") } fn choose_next_feeler_connection_time( p2p_config: &P2pConfig, now: Time, - rng: &mut impl RngCore, + rng: &mut impl Rng, ) -> Time { let delay = p2p_config .peer_manager_config @@ -1642,7 +1642,7 @@ where self.peerdb.peer_discovered(address); if !self.peerdb.is_address_banned_or_discouraged(&address.as_bannable()) { - let peer_ids = self.subscribed_to_peer_addresses.iter().cloned().choose_multiple( + let peer_ids = self.subscribed_to_peer_addresses.iter().cloned().sample( Self::lock_rng(&self.rng).deref_mut(), PEER_ADDRESS_RESEND_COUNT, ); @@ -1685,7 +1685,7 @@ where None } }) - .choose_multiple(&mut BoxedRngMutexWrapper::new(&self.rng), max_addr_count) + .sample(&mut BoxedRngMutexWrapper::new(&self.rng), max_addr_count) }, &mut BoxedRngMutexWrapper::new(&self.rng), ) @@ -2146,7 +2146,7 @@ where } } None => { - let nonce = Self::lock_rng(&self.rng).gen(); + let nonce = Self::lock_rng(&self.rng).random(); Self::send_peer_message( &mut self.peer_connectivity_handle, *peer_id, diff --git a/p2p/src/peer_manager/peerdb/address_data/tests.rs b/p2p/src/peer_manager/peerdb/address_data/tests.rs index 7c7cc4cea7..89f2b7cd2f 100644 --- a/p2p/src/peer_manager/peerdb/address_data/tests.rs +++ b/p2p/src/peer_manager/peerdb/address_data/tests.rs @@ -19,11 +19,10 @@ use strum::IntoEnumIterator as _; use logging::log; use randomness::{ distributions::{Distribution, WeightedIndex}, - rngs::StepRng, seq::IteratorRandom as _, - Rng, + RngExt as _, }; -use test_utils::random::{make_seedable_rng, Seed}; +use test_utils::random::{make_seedable_rng, Seed, StepRng}; use super::*; @@ -41,8 +40,8 @@ fn randomized(#[case] seed: Seed) { let weights = WeightedIndex::new(weights).unwrap(); for _ in 0..100 { - let was_reachable = rng.gen_bool(0.2); - let reserved = rng.gen_bool(0.1); + let was_reachable = rng.random_bool(0.2); + let reserved = rng.random_bool(0.1); let mut address_data = AddressData::new(was_reachable, reserved, started_at); diff --git a/p2p/src/peer_manager/peerdb/address_tables/table.rs b/p2p/src/peer_manager/peerdb/address_tables/table.rs index d8a1861385..1a592a9945 100644 --- a/p2p/src/peer_manager/peerdb/address_tables/table.rs +++ b/p2p/src/peer_manager/peerdb/address_tables/table.rs @@ -263,19 +263,19 @@ pub mod test_utils { net::{Ipv4Addr, SocketAddr, SocketAddrV4}, }; - use randomness::Rng; + use randomness::{Rng, RngExt as _}; use super::*; pub fn make_random_address(rng: &mut impl Rng) -> SocketAddress { let addr_v4 = SocketAddrV4::new( - Ipv4Addr::new(rng.gen(), rng.gen(), rng.gen(), rng.gen()), + Ipv4Addr::new(rng.random(), rng.random(), rng.random(), rng.random()), // Note: addresses with zero port are never considered discoverable // (PeerAddress::.as_discoverable_socket_address always returns None for them), // so some test may malfunction if such an address is generated. // On the other hand, in general, it doesn't make much sense to produce random socket // addresses with zero port, so we disable it on this level. - rng.gen_range(1..=u16::MAX), + rng.random_range(1..=u16::MAX), ); SocketAddress::new(SocketAddr::V4(addr_v4)) } diff --git a/p2p/src/peer_manager/peerdb/mod.rs b/p2p/src/peer_manager/peerdb/mod.rs index d5224a0226..4698426605 100644 --- a/p2p/src/peer_manager/peerdb/mod.rs +++ b/p2p/src/peer_manager/peerdb/mod.rs @@ -41,7 +41,7 @@ use std::{ use common::{chain::ChainConfig, primitives::time::Time, time_getter::TimeGetter}; use logging::log; use p2p_types::{bannable_address::BannableAddress, socket_address::SocketAddress}; -use randomness::{seq::IteratorRandom, Rng, SliceRandom}; +use randomness::{seq::IteratorRandom, Rng, RngExt as _, SliceRandom}; use crate::{config::P2pConfig, net::types::OutboundPeerRole}; @@ -248,10 +248,10 @@ impl PeerDb { // To do so, we first select "count" addresses of each kind, shuffle the results and then // iteratively choose addresses from one of the vectors based on a randomly generated value. let mut selected_new = - self.address_tables.new_addresses().filter(filter).choose_multiple(rng, count); + self.address_tables.new_addresses().filter(filter).sample(rng, count); selected_new.shuffle(rng); let mut selected_tried = - self.address_tables.tried_addresses().filter(filter).choose_multiple(rng, count); + self.address_tables.tried_addresses().filter(filter).sample(rng, count); selected_tried.shuffle(rng); let mut selected_new_iter = selected_new.into_iter().peekable(); @@ -266,7 +266,7 @@ impl PeerDb { (false, false) => { break; } - (true, true) => rng.gen_bool(0.5), + (true, true) => rng.random_bool(0.5), _ => have_new, }; diff --git a/p2p/src/peer_manager/peerdb/salt.rs b/p2p/src/peer_manager/peerdb/salt.rs index a0f7098f9e..a80fbc9652 100644 --- a/p2p/src/peer_manager/peerdb/salt.rs +++ b/p2p/src/peer_manager/peerdb/salt.rs @@ -15,7 +15,7 @@ use std::hash::{Hash, Hasher}; -use randomness::Rng; +use randomness::{Rng, RngExt as _}; use serialization::{Decode, Encode}; /// A random number that is generated once and then mixed into certain hashes in the peer manager. @@ -28,7 +28,7 @@ impl Salt { } pub fn new_random(rng: &mut impl Rng) -> Self { - Self(rng.gen::()) + Self(rng.random::()) } pub fn mix_with(&self, data: T) -> Self { diff --git a/p2p/src/peer_manager/peerdb/tests.rs b/p2p/src/peer_manager/peerdb/tests.rs index 7fc6dec7f7..191682a35a 100644 --- a/p2p/src/peer_manager/peerdb/tests.rs +++ b/p2p/src/peer_manager/peerdb/tests.rs @@ -31,7 +31,7 @@ use ::test_utils::{ use common::{chain::config::create_unit_test_config, primitives::time::Time}; use networking::test_helpers::TestAddressMaker; use p2p_types::socket_addr_ext::SocketAddrExt; -use randomness::{seq::IteratorRandom as _, Rng}; +use randomness::{seq::IteratorRandom as _, Rng, RngExt as _}; use crate::{ ban_config::BanConfig, @@ -954,7 +954,7 @@ fn new_tried_addr_selection_frequency() { let mut total_selected_new_addrs = 0; let mut total_selected_tried_addrs = 0; for _ in 0..100 { - let count_to_select = rng.gen_range(count_to_select_range.clone()); + let count_to_select = rng.random_range(count_to_select_range.clone()); let selected_addrs = peerdb.select_non_reserved_outbound_addresses( &empty_addr_groups_set, &|_| true, @@ -1023,7 +1023,7 @@ where for (idx, item) in items.iter().enumerate() { let is_last = idx == items.len() - 1; - if rng.gen::() % 2 == 0 || (is_last && first.is_empty()) { + if rng.random::() % 2 == 0 || (is_last && first.is_empty()) { first.insert(item.clone()); } else { second.insert(item.clone()); diff --git a/p2p/src/peer_manager/peers_eviction/mod.rs b/p2p/src/peer_manager/peers_eviction/mod.rs index 10dd4647d8..bce604cb05 100644 --- a/p2p/src/peer_manager/peers_eviction/mod.rs +++ b/p2p/src/peer_manager/peers_eviction/mod.rs @@ -16,7 +16,7 @@ use std::{collections::BTreeMap, hash::Hasher, time::Duration}; use common::primitives::time::Time; -use randomness::{seq::IteratorRandom, Rng}; +use randomness::{seq::IteratorRandom, Rng, RngExt as _}; use utils::make_config_setting; use crate::{net::types::PeerRole, types::peer_id::PeerId}; @@ -76,7 +76,7 @@ pub struct RandomState(u64, u64); impl RandomState { pub fn new(rng: &mut R) -> Self { - Self(rng.gen(), rng.gen()) + Self(rng.random(), rng.random()) } fn get_hash(&self, value: &A) -> u64 { diff --git a/p2p/src/peer_manager/peers_eviction/tests.rs b/p2p/src/peer_manager/peers_eviction/tests.rs index de86853c28..e15d7bad28 100644 --- a/p2p/src/peer_manager/peers_eviction/tests.rs +++ b/p2p/src/peer_manager/peers_eviction/tests.rs @@ -29,14 +29,14 @@ fn shuffle_vec(mut vec: Vec, rng: &mut impl Rng) -> Vec { // Make a random non-banned-or-discouraged candidate. fn random_candidate(peer_role: PeerRole, rng: &mut impl Rng) -> EvictionCandidate { EvictionCandidate { - age: Duration::from_secs(rng.gen_range(0..10000)), + age: Duration::from_secs(rng.random_range(0..10000)), peer_id: PeerId::new(), - net_group_keyed: NetGroupKeyed(rng.gen()), - ping_min: rng.gen_range(0..100), + net_group_keyed: NetGroupKeyed(rng.random()), + ping_min: rng.random_range(0..100), peer_role, - last_tip_block_time: Some(Time::from_secs_since_epoch(rng.gen_range(0..10000))), - last_tx_time: Some(Time::from_secs_since_epoch(rng.gen_range(0..10000))), - expecting_blocks_since: Some(Time::from_secs_since_epoch(rng.gen_range(0..10000))), + last_tip_block_time: Some(Time::from_secs_since_epoch(rng.random_range(0..10000))), + last_tx_time: Some(Time::from_secs_since_epoch(rng.random_range(0..10000))), + expecting_blocks_since: Some(Time::from_secs_since_epoch(rng.random_range(0..10000))), is_banned_or_discouraged: false, } } @@ -392,7 +392,7 @@ mod inbound { for _ in 0..10 { for test in tests { - let count = rng.gen_range(0..150usize); + let count = rng.random_range(0..150usize); let mut candidates = (0..count) .map(|_| random_candidate(PeerRole::Inbound, &mut rng)) .collect::>(); @@ -940,7 +940,7 @@ mod discouraged_candidate { let mut rng = test_utils::random::make_seedable_rng(seed); let config: PeerManagerConfig = Default::default(); let preserve_count = max_preserve_count(peer_role, &config); - let now = Time::from_secs_since_epoch(rng.gen_range(0..10000)); + let now = Time::from_secs_since_epoch(rng.random_range(0..10000)); for _i in 0..5 { for candidates_count in [preserve_count - 1, preserve_count + 1] { @@ -951,7 +951,7 @@ mod discouraged_candidate { let normally_evicted_peer_id = select_for_eviction(peer_role, candidates.clone(), &config, now, &mut rng); - let discouraged_candidate_idx = rng.gen_range(0..candidates_count); + let discouraged_candidate_idx = rng.random_range(0..candidates_count); let discouraged_peer_id = candidates[discouraged_candidate_idx].peer_id; let candidates = { let mut candidates = candidates; diff --git a/p2p/src/peer_manager/tests/addr_list_response_caching.rs b/p2p/src/peer_manager/tests/addr_list_response_caching.rs index a0ea4a17fb..66af4d4f56 100644 --- a/p2p/src/peer_manager/tests/addr_list_response_caching.rs +++ b/p2p/src/peer_manager/tests/addr_list_response_caching.rs @@ -27,7 +27,7 @@ use networking::{ }; use p2p_test_utils::expect_recv; use p2p_types::peer_address::PeerAddress; -use randomness::{Rng, RngCore}; +use randomness::{Rng, RngExt as _}; use test_utils::{ assert_matches_return_val, random::{make_seedable_rng, Seed}, @@ -82,7 +82,7 @@ async fn basic_test(#[case] seed: Seed) { &chain_config, &p2p_config, &time_getter, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer1_address = TestAddressMaker::new_random_address(&mut rng); @@ -275,12 +275,12 @@ fn setup_peer_mgr( chain_config: &Arc, p2p_config: &Arc, time_getter: &BasicTestTimeGetter, - mut rng: impl RngCore + Send + 'static, + mut rng: impl Rng + Send + 'static, ) -> ( PeerManager, UnboundedReceiver, ) { - let mut another_rng = make_seedable_rng(rng.gen()); + let mut another_rng = make_seedable_rng(rng.random()); let (mut peer_mgr, _conn_event_sender, _peer_mgr_event_sender, cmd_receiver, _) = make_standalone_peer_manager( diff --git a/p2p/src/peer_manager/tests/addresses.rs b/p2p/src/peer_manager/tests/addresses.rs index b85aa348c0..3e1e6d7026 100644 --- a/p2p/src/peer_manager/tests/addresses.rs +++ b/p2p/src/peer_manager/tests/addresses.rs @@ -19,8 +19,6 @@ use std::{ time::Duration, }; -use logging::log; -use randomness::Rng; use rstest::rstest; use tokio::sync::mpsc::{error::TryRecvError, UnboundedReceiver, UnboundedSender}; @@ -28,6 +26,7 @@ use common::{ chain::{self, config, ChainConfig}, primitives::user_agent::mintlayer_core_user_agent, }; +use logging::log; use networking::test_helpers::{ TestAddressMaker, TestTransportChannel, TestTransportMaker, TestTransportTcp, }; @@ -39,6 +38,7 @@ use p2p_test_utils::{expect_future_val, expect_no_recv}; use p2p_types::{ peer_address::PeerAddress, socket_addr_ext::SocketAddrExt, socket_address::SocketAddress, }; +use randomness::{Rng, RngExt as _}; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -101,7 +101,7 @@ where Arc::clone(&config), p2p_config, time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -189,7 +189,7 @@ fn test_addr_list_handling_inbound(#[case] seed: Seed) { peer_mgr_event_receiver, time_getter.get_time_getter(), peerdb_inmemory_store(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .unwrap(); @@ -281,7 +281,7 @@ fn test_addr_list_handling_outbound(#[case] seed: Seed) { peer_mgr_event_receiver, time_getter.get_time_getter(), peerdb_inmemory_store(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .unwrap(); @@ -399,7 +399,7 @@ async fn resend_own_addresses(#[case] seed: Seed) { peer_mgr_event_receiver, time_getter.get_time_getter(), peerdb_inmemory_store(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .unwrap(); @@ -515,7 +515,7 @@ async fn connect_to_predefined_address_if_dns_seed_is_empty(#[case] seed: Seed) peerdb_inmemory_store(), None, Box::new(TestDnsSeed::new(Arc::new(Mutex::new(Vec::new())))), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .unwrap(); @@ -586,7 +586,7 @@ async fn dont_connect_to_predefined_address_if_dns_seed_is_non_empty(#[case] see Box::new(TestDnsSeed::new(Arc::new(Mutex::new(vec![ seeded_peer_address, ])))), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .unwrap(); @@ -660,7 +660,7 @@ async fn connect_to_predefined_address_if_dns_seed_returned_bogus_address(#[case Box::new(TestDnsSeed::new(Arc::new(Mutex::new(vec![ seeded_peer_address, ])))), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .unwrap(); @@ -762,7 +762,7 @@ async fn dont_use_dns_seed_if_connections_exist(#[case] seed: Seed) { Box::new(TestDnsSeed::new(Arc::new(Mutex::new(vec![ seeded_peer_address, ])))), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .unwrap(); diff --git a/p2p/src/peer_manager/tests/ban.rs b/p2p/src/peer_manager/tests/ban.rs index 154b22fbeb..eb2ee53c93 100644 --- a/p2p/src/peer_manager/tests/ban.rs +++ b/p2p/src/peer_manager/tests/ban.rs @@ -20,7 +20,7 @@ use rstest::rstest; use common::{chain::config, primitives::user_agent::mintlayer_core_user_agent}; use networking::test_helpers::{TestAddressMaker, TestTransportMaker, TestTransportTcp}; use p2p_test_utils::{expect_no_recv, expect_recv, wait_for_no_recv}; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ random::{make_seedable_rng, Seed}, BasicTestTimeGetter, @@ -90,7 +90,7 @@ async fn dont_auto_ban_connected_peer(#[case] seed: Seed) { Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_mgr_join_handle = tokio_spawn_in_current_tracing_span( @@ -159,7 +159,7 @@ async fn disconnect_manually_banned_peer(#[case] seed: Seed) { Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_mgr_join_handle = tokio_spawn_in_current_tracing_span( @@ -250,7 +250,7 @@ async fn reject_incoming_connection_from_banned_peer(#[case] seed: Seed) { Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_addrs = make_non_colliding_addresses_for_peer_db_in_distinct_addr_groups( @@ -346,7 +346,7 @@ async fn no_outgoing_connection_to_banned_peer(#[case] seed: Seed) { Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_addrs = make_non_colliding_addresses_for_peer_db_in_distinct_addr_groups( @@ -433,7 +433,7 @@ async fn banned_address_is_not_announced(#[case] seed: Seed) { Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let addrs = make_non_colliding_addresses_for_peer_db_in_distinct_addr_groups( @@ -559,7 +559,7 @@ async fn banned_address_not_in_addr_response(#[case] seed: Seed) { Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let addrs = make_non_colliding_addresses_for_peer_db_in_distinct_addr_groups( diff --git a/p2p/src/peer_manager/tests/connections.rs b/p2p/src/peer_manager/tests/connections.rs index fbc3fd1275..d89e497b49 100644 --- a/p2p/src/peer_manager/tests/connections.rs +++ b/p2p/src/peer_manager/tests/connections.rs @@ -38,7 +38,7 @@ use networking::test_helpers::{ use networking::transport::{MpscChannelTransport, NoiseTcpTransport, TcpTransportSocket}; use p2p_test_utils::{expect_no_recv, expect_recv, run_with_timeout}; use p2p_types::socket_address::SocketAddress; -use randomness::Rng; +use randomness::{Rng, RngExt as _}; use test_utils::{ random::{make_seedable_rng, Seed}, BasicTestTimeGetter, @@ -103,7 +103,7 @@ where A::make_transport(), A::make_address().into(), Arc::clone(&config), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -182,14 +182,14 @@ where A::make_transport(), addr1, Arc::new(config::create_unit_test_config()), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; let (mut pm2, _shutdown_sender, _subscribers_sender) = make_peer_manager::( A::make_transport(), addr2, Arc::new(config::Builder::test_chain().magic_bytes(MagicBytes::new([1, 2, 3, 4])).build()), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -263,8 +263,13 @@ async fn test_peer_manager_connect( let mut rng = make_seedable_rng(seed); let config = Arc::new(config::create_unit_test_config()); - let (mut peer_manager, _shutdown_sender, _subscribers_sender) = - make_peer_manager::(transport, bind_addr, config, make_seedable_rng(rng.gen())).await; + let (mut peer_manager, _shutdown_sender, _subscribers_sender) = make_peer_manager::( + transport, + bind_addr, + config, + make_seedable_rng(rng.random()), + ) + .await; peer_manager.try_connect(remote_addr, None, PeerRole::OutboundManual).unwrap(); @@ -333,14 +338,14 @@ where A::make_transport(), addr1, Arc::clone(&config), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; let (mut pm2, _shutdown_sender, _subscribers_sender) = make_peer_manager::( A::make_transport(), addr2, config, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -411,14 +416,14 @@ where A::make_transport(), addr1, Arc::clone(&config), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; let (mut pm2, _shutdown_sender, _subscribers_sender) = make_peer_manager::( A::make_transport(), addr2, config, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -476,14 +481,14 @@ where A::make_transport(), addr1, Arc::clone(&config), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; let (mut pm2, _shutdown_sender, _subscribers_sender) = make_peer_manager::( A::make_transport(), addr2, Arc::new(config::Builder::test_chain().magic_bytes(MagicBytes::new([1, 2, 3, 4])).build()), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -550,14 +555,14 @@ where A::make_transport(), addr1, Arc::clone(&config), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; let (mut pm2, _shutdown_sender, _subscribers_sender) = make_peer_manager::( A::make_transport(), addr2, config, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -625,14 +630,14 @@ where A::make_transport(), addr1, Arc::new(config::create_unit_test_config()), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; let (mut pm2, _shutdown_sender, _subscribers_sender) = make_peer_manager::( A::make_transport(), addr2, Arc::new(config::Builder::test_chain().magic_bytes(MagicBytes::new([1, 2, 3, 4])).build()), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -713,14 +718,14 @@ where A::make_transport(), addr1, Arc::new(config::create_unit_test_config()), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; let (mut pm2, _shutdown_sender, _subscribers_sender) = make_peer_manager::( A::make_transport(), addr2, Arc::new(config::create_unit_test_config()), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -789,14 +794,14 @@ where A::make_transport(), addr1, Arc::clone(&config), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; let (mut pm2, _shutdown_sender, _subscribers_sender) = make_peer_manager::( A::make_transport(), addr2, Arc::clone(&config), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -1053,7 +1058,7 @@ async fn connection_timeout_rpc_notified( peer_mgr_event_receiver, time_getter, peerdb_inmemory_store(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .unwrap(); @@ -1168,7 +1173,7 @@ where Arc::clone(&chain_config), p2p_config_1, time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -1213,7 +1218,7 @@ where Arc::clone(&chain_config), p2p_config_2, time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -1338,7 +1343,7 @@ where Arc::clone(&chain_config), p2p_config_1, time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -1383,7 +1388,7 @@ where Arc::clone(&chain_config), p2p_config_2, time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -1415,7 +1420,7 @@ where Arc::clone(&chain_config), p2p_config_3, time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -1561,7 +1566,7 @@ async fn discovered_node_2_groups(#[case] seed: Seed) { Arc::clone(&chain_config), p2p_config_1, time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -1607,7 +1612,7 @@ async fn discovered_node_2_groups(#[case] seed: Seed) { Arc::clone(&chain_config), p2p_config_2, time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -1640,7 +1645,7 @@ async fn discovered_node_2_groups(#[case] seed: Seed) { Arc::clone(&chain_config), p2p_config_3, time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -1737,7 +1742,7 @@ async fn discovered_node_separate_groups(#[case] seed: Seed) { Arc::clone(&chain_config), p2p_config_1, time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -1783,7 +1788,7 @@ async fn discovered_node_separate_groups(#[case] seed: Seed) { Arc::clone(&chain_config), p2p_config_2, time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -1816,7 +1821,7 @@ async fn discovered_node_separate_groups(#[case] seed: Seed) { Arc::clone(&chain_config), p2p_config_3, time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -1897,7 +1902,7 @@ async fn feeler_connections_test_impl(seed: Seed) { peer_mgr_event_receiver, time_getter.get_time_getter(), peerdb_inmemory_store(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .unwrap(); @@ -1983,7 +1988,7 @@ async fn feeler_connections_test_impl(seed: Seed) { let addr = expect_cmd_connect_to_one_of(&cmd, &mut addresses); let is_last_addr = addresses.is_empty(); let should_succeed = { - let rand_bool = rng.gen_bool(0.5); + let rand_bool = rng.random_bool(0.5); if is_last_addr { if !had_successful_feelers { true @@ -2227,7 +2232,7 @@ async fn reject_connection_to_existing_ip(#[case] seed: Seed) { Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_addrs = make_non_colliding_addresses_for_peer_db_in_distinct_addr_groups( @@ -2378,7 +2383,7 @@ async fn feeler_connection_to_ip_address_of_inbound_peer(#[case] seed: Seed) { Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_addr = TestAddressMaker::new_random_address(&mut rng); diff --git a/p2p/src/peer_manager/tests/discouragement.rs b/p2p/src/peer_manager/tests/discouragement.rs index 5bf2813012..0146c9b00b 100644 --- a/p2p/src/peer_manager/tests/discouragement.rs +++ b/p2p/src/peer_manager/tests/discouragement.rs @@ -20,7 +20,7 @@ use rstest::rstest; use common::{chain::config, primitives::user_agent::mintlayer_core_user_agent}; use networking::test_helpers::{TestAddressMaker, TestTransportMaker, TestTransportTcp}; use p2p_test_utils::{expect_no_recv, expect_recv, wait_for_no_recv}; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ random::{make_seedable_rng, Seed}, BasicTestTimeGetter, @@ -90,7 +90,7 @@ async fn discourage_connected_peer(#[case] seed: Seed) { Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_mgr_join_handle = tokio_spawn_in_current_tracing_span( @@ -219,7 +219,7 @@ async fn dont_reject_incoming_connection_from_discouraged_peer_if_limit_not_reac Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_addr: SocketAddress = TestAddressMaker::new_random_address(&mut rng).into(); @@ -296,7 +296,7 @@ async fn reject_incoming_connection_from_discouraged_peer_if_limit_reached(#[cas Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_addrs = make_non_colliding_addresses_for_peer_db_in_distinct_addr_groups( @@ -419,7 +419,7 @@ async fn no_outgoing_connection_to_discouraged_peer(#[case] seed: Seed) { Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_addrs = make_non_colliding_addresses_for_peer_db_in_distinct_addr_groups( @@ -505,7 +505,7 @@ async fn discouraged_address_is_not_announced(#[case] seed: Seed) { Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let addrs = make_non_colliding_addresses_for_peer_db_in_distinct_addr_groups( @@ -630,7 +630,7 @@ async fn discouraged_address_not_in_addr_response(#[case] seed: Seed) { Arc::clone(&p2p_config), vec![bind_addr], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let addrs = make_non_colliding_addresses_for_peer_db_in_distinct_addr_groups( diff --git a/p2p/src/peer_manager/tests/eviction.rs b/p2p/src/peer_manager/tests/eviction.rs index 4d3b65832b..78a1029750 100644 --- a/p2p/src/peer_manager/tests/eviction.rs +++ b/p2p/src/peer_manager/tests/eviction.rs @@ -25,7 +25,7 @@ use common::{ use logging::log; use networking::test_helpers::{TestTransportMaker, TestTransportTcp}; use p2p_test_utils::{expect_no_recv, expect_recv}; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ random::{make_seedable_rng, Seed}, BasicTestTimeGetter, @@ -159,7 +159,7 @@ mod dont_evict_if_blocks_in_flight { Arc::clone(&p2p_config), vec![bind_address], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let addr_count = 3; diff --git a/p2p/src/peer_manager/tests/mod.rs b/p2p/src/peer_manager/tests/mod.rs index edc11f6ee5..01ff85da88 100644 --- a/p2p/src/peer_manager/tests/mod.rs +++ b/p2p/src/peer_manager/tests/mod.rs @@ -40,7 +40,7 @@ use common::{chain::ChainConfig, time_getter::TimeGetter}; use networking::transport::TcpTransportSocket; use p2p_test_utils::expect_recv; use p2p_types::socket_address::SocketAddress; -use randomness::{Rng, RngCore}; +use randomness::{Rng, RngExt as _}; use test_utils::assert_matches_return_val; use crate::{ @@ -69,7 +69,7 @@ async fn make_peer_manager_custom( chain_config: Arc, p2p_config: Arc, time_getter: TimeGetter, - rng: impl RngCore + Send + 'static, + rng: impl Rng + Send + 'static, ) -> ( PeerManager, UnboundedSender, @@ -122,7 +122,7 @@ async fn make_peer_manager( transport: T::Transport, bind_address: SocketAddress, chain_config: Arc, - rng: impl RngCore + Send + 'static, + rng: impl Rng + Send + 'static, ) -> ( PeerManager, oneshot::Sender<()>, @@ -155,7 +155,7 @@ pub fn make_standalone_peer_manager( p2p_config: Arc, bind_addresses: Vec, time_getter: TimeGetter, - rng: impl RngCore + Send + 'static, + rng: impl Rng + Send + 'static, ) -> ( PeerManager, mpsc::UnboundedSender, @@ -205,7 +205,7 @@ async fn run_peer_manager( chain_config: Arc, p2p_config: Arc, time_getter: TimeGetter, - rng: impl RngCore + Send + 'static, + rng: impl Rng + Send + 'static, ) -> ( UnboundedSender, oneshot::Sender<()>, @@ -253,7 +253,7 @@ async fn send_and_sync( }) .unwrap(); - let sent_nonce = rng.gen(); + let sent_nonce = rng.random(); conn_event_sender .send(ConnectivityEvent::Message { peer_id, diff --git a/p2p/src/peer_manager/tests/peer_types.rs b/p2p/src/peer_manager/tests/peer_types.rs index 3ec031f183..87581e347f 100644 --- a/p2p/src/peer_manager/tests/peer_types.rs +++ b/p2p/src/peer_manager/tests/peer_types.rs @@ -24,7 +24,7 @@ use p2p_types::{ services::{Service, Services}, PeerId, }; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ random::{make_seedable_rng, Seed}, BasicTestTimeGetter, @@ -94,7 +94,7 @@ fn validate_services(#[case] seed: Seed) { peer_mgr_event_receiver, time_getter.get_time_getter(), peerdb_inmemory_store(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .unwrap(); diff --git a/p2p/src/peer_manager/tests/ping.rs b/p2p/src/peer_manager/tests/ping.rs index 2be667fd24..c3d0a082e8 100644 --- a/p2p/src/peer_manager/tests/ping.rs +++ b/p2p/src/peer_manager/tests/ping.rs @@ -23,7 +23,7 @@ use networking::{ transport::TcpTransportSocket, }; use p2p_test_utils::expect_recv; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ assert_matches, assert_matches_return_val, random::{make_seedable_rng, Seed}, @@ -103,7 +103,7 @@ async fn ping_timeout(#[case] seed: Seed) { peer_mgr_event_receiver, time_getter.get_time_getter(), peerdb_inmemory_store(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .unwrap(); diff --git a/p2p/src/peer_manager/tests/unsuccessful_connection_counter_update.rs b/p2p/src/peer_manager/tests/unsuccessful_connection_counter_update.rs index 7b412a870c..a27281cd9c 100644 --- a/p2p/src/peer_manager/tests/unsuccessful_connection_counter_update.rs +++ b/p2p/src/peer_manager/tests/unsuccessful_connection_counter_update.rs @@ -32,7 +32,7 @@ use logging::log; use networking::test_helpers::{TestAddressMaker, TestTransportMaker, TestTransportTcp}; use p2p_test_utils::{expect_no_recv, expect_recv}; use p2p_types::socket_address::SocketAddress; -use randomness::Rng; +use randomness::RngExt; use test_utils::{ assert_matches, assert_matches_return_val, random::{make_seedable_rng, Seed}, @@ -99,7 +99,7 @@ async fn auto_connection_fails_peer_state_becomes_disconnected( let mut rng = make_seedable_rng(seed); let chain_config = Arc::new(config::create_unit_test_config()); - let feeler_connections_interval = Duration::from_secs(rng.gen_range(1..100)); + let feeler_connections_interval = Duration::from_secs(rng.random_range(1..100)); let p2p_config = make_p2p_config_for_auto_connection(conn_type, feeler_connections_interval); let time_getter = BasicTestTimeGetter::new(); @@ -115,7 +115,7 @@ async fn auto_connection_fails_peer_state_becomes_disconnected( Arc::clone(&p2p_config), vec![bind_address], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_address: SocketAddress = TestAddressMaker::new_random_address(&mut rng).into(); @@ -154,7 +154,7 @@ async fn auto_connection_fails_peer_state_becomes_disconnected( add_reserved_peer(&peer_mgr_event_sender, peer_address.socket_addr().into()).await; } - let num_iterations = rng.gen_range(5..10); + let num_iterations = rng.random_range(5..10); let mut last_connect_after = Time::from_duration_since_epoch(Duration::ZERO); for i in 0..num_iterations { @@ -233,7 +233,7 @@ async fn auto_connection_fails_peer_state_becomes_disconnected( ); // An inbound connection shouldn't change the outcome even if it's successful. - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { log::debug!("Accepting an extra inbound connection"); inbound_full_relay_peer_connected_and_disconnected( @@ -306,7 +306,7 @@ async fn auto_connection_fails_peer_state_becomes_unreachable( let mut rng = make_seedable_rng(seed); let chain_config = Arc::new(config::create_unit_test_config()); - let feeler_connections_interval = Duration::from_secs(rng.gen_range(1..100)); + let feeler_connections_interval = Duration::from_secs(rng.random_range(1..100)); let p2p_config = make_p2p_config_for_auto_connection(conn_type, feeler_connections_interval); let time_getter = BasicTestTimeGetter::new(); @@ -322,7 +322,7 @@ async fn auto_connection_fails_peer_state_becomes_unreachable( Arc::clone(&p2p_config), vec![bind_address], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_address: SocketAddress = TestAddressMaker::new_random_address(&mut rng).into(); @@ -403,7 +403,7 @@ async fn auto_connection_fails_peer_state_becomes_unreachable( ); // An inbound connection shouldn't change the outcome even if it's successful. - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { log::debug!("Accepting an extra inbound connection"); inbound_full_relay_peer_connected_and_disconnected( @@ -494,7 +494,7 @@ async fn manual_connection_fails(#[case] seed: Seed, #[values(false, true)] make Arc::clone(&p2p_config), vec![bind_address], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_address: SocketAddress = TestAddressMaker::new_random_address(&mut rng).into(); @@ -529,7 +529,7 @@ async fn manual_connection_fails(#[case] seed: Seed, #[values(false, true)] make expect_no_peer_state(&peer_mgr_event_sender, peer_address).await; } - let num_iterations = rng.gen_range(5..10); + let num_iterations = rng.random_range(5..10); let mut erase_after = None; let now = time_getter.get_time_getter().get_time(); @@ -561,7 +561,7 @@ async fn manual_connection_fails(#[case] seed: Seed, #[values(false, true)] make .await; // An inbound connection shouldn't change the outcome even if it's successful. - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { log::debug!("Accepting an extra inbound connection"); inbound_full_relay_peer_connected_and_disconnected( @@ -647,7 +647,7 @@ async fn auto_connection_without_peer_activity( Arc::clone(&p2p_config), vec![bind_address], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_address: SocketAddress = TestAddressMaker::new_random_address(&mut rng).into(); @@ -686,7 +686,7 @@ async fn auto_connection_without_peer_activity( add_reserved_peer(&peer_mgr_event_sender, peer_address.socket_addr().into()).await; } - let num_iterations = rng.gen_range(5..10); + let num_iterations = rng.random_range(5..10); let mut last_connect_after = Time::from_duration_since_epoch(Duration::ZERO); for i in 0..num_iterations { @@ -766,7 +766,7 @@ async fn auto_connection_without_peer_activity( // An inbound or manual connection without peer activity shouldn't affect connections_without_activity_count. // Same for a failed outbound connection. - let extra_outbound_connection_failed = match rng.gen_range(0..4) { + let extra_outbound_connection_failed = match rng.random_range(0..4) { 0 => { log::debug!("Accepting an extra inbound connection"); @@ -858,7 +858,7 @@ async fn feeler_connection_without_peer_activity(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let chain_config = Arc::new(config::create_unit_test_config()); - let feeler_connections_interval = Duration::from_secs(rng.gen_range(1..100)); + let feeler_connections_interval = Duration::from_secs(rng.random_range(1..100)); let p2p_config = make_p2p_config_for_auto_connection(AutoConnType::Feeler, feeler_connections_interval); let time_getter = BasicTestTimeGetter::new(); @@ -875,7 +875,7 @@ async fn feeler_connection_without_peer_activity(#[case] seed: Seed) { Arc::clone(&p2p_config), vec![bind_address], time_getter.get_time_getter(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ); let peer_address: SocketAddress = TestAddressMaker::new_random_address(&mut rng).into(); diff --git a/p2p/src/peer_manager/tests/whitelist.rs b/p2p/src/peer_manager/tests/whitelist.rs index af2c742231..45a41ad460 100644 --- a/p2p/src/peer_manager/tests/whitelist.rs +++ b/p2p/src/peer_manager/tests/whitelist.rs @@ -27,7 +27,7 @@ use networking::{ types::ConnectionDirection, }; use p2p_types::{bannable_address::BannableAddress, socket_address::SocketAddress}; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ random::{make_seedable_rng, Seed}, BasicTestTimeGetter, @@ -97,7 +97,7 @@ where Arc::clone(&chain_config), Arc::clone(&p2p_config), Default::default(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -107,7 +107,7 @@ where Arc::clone(&chain_config), Arc::clone(&p2p_config), Default::default(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -189,7 +189,7 @@ where A::make_transport(), addr1, Arc::clone(&chain_config), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -240,7 +240,7 @@ where peer_receiver, time_getter.get_time_getter(), db, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .unwrap(); @@ -332,7 +332,7 @@ fn manual_ban_overrides_whitelisting(#[case] seed: Seed) { peer_receiver, time_getter.get_time_getter(), peerdb_inmemory_store(), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .unwrap(); diff --git a/p2p/src/sync/peer/pending_transactions.rs b/p2p/src/sync/peer/pending_transactions.rs index 3822d29b05..2d93f27c18 100644 --- a/p2p/src/sync/peer/pending_transactions.rs +++ b/p2p/src/sync/peer/pending_transactions.rs @@ -59,7 +59,7 @@ mod tests { use common::primitives::H256; use rstest::rstest; - use test_utils::random::{make_seedable_rng, Rng, Seed}; + use test_utils::random::{make_seedable_rng, RngExt as _, Seed}; #[rstest] #[trace] @@ -140,7 +140,7 @@ mod tests { tokio::time::pause(); // Spawn a task with a timeout - let timeout_duration = Duration::from_secs(rng.gen_range(1..120)); + let timeout_duration = Duration::from_secs(rng.random_range(1..120)); let test_task = tokio::spawn(async move { let txs = PendingTransactions::new(); tokio::time::timeout(timeout_duration, txs.due()).await diff --git a/p2p/src/sync/tests/ban_scores.rs b/p2p/src/sync/tests/ban_scores.rs index 7be2e4e2ee..6ada9c448c 100644 --- a/p2p/src/sync/tests/ban_scores.rs +++ b/p2p/src/sync/tests/ban_scores.rs @@ -27,7 +27,7 @@ use common::{ use consensus::{ConsensusPoSError, ConsensusVerificationError}; use mempool::error::MempoolPolicyError; use p2p_test_utils::create_n_blocks; -use randomness::Rng; +use randomness::RngExt; use test_utils::random::{make_seedable_rng, Seed}; use utils::tokio_spawn_in_current_tracing_span; @@ -129,7 +129,7 @@ async fn receive_header_with_invalid_parent_block(#[case] seed: Seed) { empty_witness(&mut rng), ) .add_output(TxOutput::Burn(OutputValue::Coin(Amount::from_atoms( - rng.gen_range(100_000..200_000), + rng.random_range(100_000..200_000), )))) .build(); let valid_child_block = tf diff --git a/p2p/src/sync/tests/block_list_request.rs b/p2p/src/sync/tests/block_list_request.rs index 59e354c2f5..197581ab6e 100644 --- a/p2p/src/sync/tests/block_list_request.rs +++ b/p2p/src/sync/tests/block_list_request.rs @@ -23,7 +23,7 @@ use common::{ }; use logging::log; use p2p_test_utils::create_n_blocks; -use randomness::Rng; +use randomness::RngExt; use test_utils::{random::Seed, BasicTestTimeGetter}; use crate::{ @@ -143,7 +143,7 @@ async fn valid_request(#[case] seed: Seed) { .with_chain_config(chain_config.as_ref().clone()) .build(); // Import several blocks. - let num_blocks = rng.gen_range(2..10); + let num_blocks = rng.random_range(2..10); let blocks = create_n_blocks(&mut rng, &mut tf, num_blocks); for block in blocks.clone() { tf.process_block(block, BlockSource::Local).unwrap().unwrap(); diff --git a/p2p/src/sync/tests/block_response.rs b/p2p/src/sync/tests/block_response.rs index 4d2f53ac6d..8155827dcc 100644 --- a/p2p/src/sync/tests/block_response.rs +++ b/p2p/src/sync/tests/block_response.rs @@ -27,7 +27,7 @@ use common::{ }; use logging::log; use p2p_test_utils::create_n_blocks; -use randomness::Rng; +use randomness::RngExt; use test_utils::{ random::{shuffle_until_different, Seed}, BasicTestTimeGetter, @@ -98,7 +98,7 @@ async fn valid_response(#[case] seed: Seed) { let mut tf = TestFramework::builder(&mut rng) .with_chain_config(chain_config.as_ref().clone()) .build(); - let num_blocks = rng.gen_range(2..10); + let num_blocks = rng.random_range(2..10); let blocks = create_n_blocks(&mut rng, &mut tf, num_blocks); let mut node = TestNode::builder(protocol_version) @@ -181,7 +181,7 @@ async fn block_responses_in_wrong_order(#[case] seed: Seed) { let mut tf = TestFramework::builder(&mut rng) .with_chain_config(chain_config.as_ref().clone()) .build(); - let num_blocks = rng.gen_range(2..10); + let num_blocks = rng.random_range(2..10); log::debug!("Generating {num_blocks} blocks"); let blocks = create_n_blocks(&mut rng, &mut tf, num_blocks); diff --git a/p2p/src/sync/tests/header_list_request.rs b/p2p/src/sync/tests/header_list_request.rs index b0156075b9..0fb5307547 100644 --- a/p2p/src/sync/tests/header_list_request.rs +++ b/p2p/src/sync/tests/header_list_request.rs @@ -24,7 +24,7 @@ use common::{ primitives::{user_agent::mintlayer_core_user_agent, Idable}, }; use logging::log; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ assert_matches_return_val, random::{make_seedable_rng, Seed}, @@ -222,7 +222,7 @@ async fn locator_must_be_from_peers_known_best_block(#[case] seed: Seed) { let node_blocks_count = 10; let msg_header_count_limit = 5; - let common_blocks_count = rng.gen_range(0..=msg_header_count_limit); + let common_blocks_count = rng.random_range(0..=msg_header_count_limit); let peer_specific_blocks_count = msg_header_count_limit - common_blocks_count; log::debug!("common_blocks_count = {common_blocks_count}"); diff --git a/p2p/src/sync/tests/header_list_response.rs b/p2p/src/sync/tests/header_list_response.rs index 3a6a19ed02..0aeee888c1 100644 --- a/p2p/src/sync/tests/header_list_response.rs +++ b/p2p/src/sync/tests/header_list_response.rs @@ -25,7 +25,7 @@ use common::{ }; use logging::log; use p2p_test_utils::create_n_blocks; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -283,9 +283,9 @@ async fn header_check_happens_before_checking_if_blocks_were_requested( let chain_config = Arc::new(common::chain::config::create_unit_test_config()); let time_getter = BasicTestTimeGetter::new(); - let node_blocks_count = rng.gen_range(1..3); - let branch1_len = rng.gen_range(3..5); - let branch2_len = rng.gen_range(3..5); + let node_blocks_count = rng.random_range(1..3); + let branch1_len = rng.random_range(3..5); + let branch2_len = rng.random_range(3..5); log::debug!( "node_blocks_count = {}, branch1_len = {}, branch2_len = {}", @@ -320,7 +320,7 @@ async fn header_check_happens_before_checking_if_blocks_were_requested( let chain_config = if make_branch2_invalid { let branch2_invalid_header_idx = - rng.gen_range(0..std::cmp::min(branch1_blocks.len(), branch2_blocks.len())); + rng.random_range(0..std::cmp::min(branch1_blocks.len(), branch2_blocks.len())); // To make one of the headers on branch2 invalid, specify a checkpoint referring to // a block on branch1. @@ -441,10 +441,10 @@ async fn extending_invalidated_chain_should_fail_at_header_check( let chain_config = Arc::new(common::chain::config::create_unit_test_config()); let time_getter = BasicTestTimeGetter::new(); - let common_blocks_count = rng.gen_range(1..3); - let branch1_blocks_count = rng.gen_range(3..5); - let branch2_known_blocks_count = rng.gen_range(1..3); - let branch2_unknown_blocks_count = rng.gen_range(1..3); + let common_blocks_count = rng.random_range(1..3); + let branch1_blocks_count = rng.random_range(3..5); + let branch2_known_blocks_count = rng.random_range(1..3); + let branch2_unknown_blocks_count = rng.random_range(1..3); log::debug!( "common blk = {}, branch1 blk = {}, branch2 known blk = {}, branch2 unknown blk = {}", @@ -505,7 +505,7 @@ async fn extending_invalidated_chain_should_fail_at_header_check( if invalidate_branch2 { let block_id_to_invalidate = - branch2_known_blocks[rng.gen_range(0..branch2_known_blocks.len())].get_id(); + branch2_known_blocks[rng.random_range(0..branch2_known_blocks.len())].get_id(); node.chainstate() .call_mut(move |cs| cs.invalidate_block(&block_id_to_invalidate)) .await @@ -515,7 +515,8 @@ async fn extending_invalidated_chain_should_fail_at_header_check( let peer = node.connect_peer(PeerId::new(), protocol_version).await; - let branch2_first_known_block_to_send_idx = rng.gen_range(0..=branch2_known_blocks.len()); + let branch2_first_known_block_to_send_idx = + rng.random_range(0..=branch2_known_blocks.len()); let branch2_headers = branch2_known_blocks[branch2_first_known_block_to_send_idx..] .iter() .chain(branch2_unknown_blocks.iter()) diff --git a/p2p/src/sync/tests/helpers/mod.rs b/p2p/src/sync/tests/helpers/mod.rs index 964e01f044..d095fb37ba 100644 --- a/p2p/src/sync/tests/helpers/mod.rs +++ b/p2p/src/sync/tests/helpers/mod.rs @@ -49,7 +49,7 @@ use mempool::{event::TransactionProcessed, MempoolConfig, MempoolHandle, Mempool use networking::transport::TcpTransportSocket; use p2p_test_utils::{expect_future_val, expect_no_recv, expect_recv, SHORT_TIMEOUT}; use p2p_types::{bannable_address::BannableAddress, socket_address::SocketAddress}; -use randomness::Rng; +use randomness::{Rng, RngExt as _}; use subsystem::{ManagerJoinHandle, ShutdownTrigger}; use test_utils::random::Seed; use utils::{atomics::SeqCstAtomicBool, tokio_spawn_in_current_tracing_span}; @@ -949,7 +949,7 @@ pub async fn make_new_top_blocks_return_headers( ) -> Vec { assert!(count > 0); - let new_rng = test_utils::random::make_seedable_rng(Seed::from_u64(rng.gen())); + let new_rng = test_utils::random::make_seedable_rng(Seed::from_u64(rng.random())); chainstate .call_mut(move |cs| { diff --git a/p2p/src/sync/tests/network_sync.rs b/p2p/src/sync/tests/network_sync.rs index f8302b7209..939b8b7374 100644 --- a/p2p/src/sync/tests/network_sync.rs +++ b/p2p/src/sync/tests/network_sync.rs @@ -26,7 +26,7 @@ use common::{ use logging::log; use p2p_test_utils::{create_n_blocks, run_with_timeout, MEDIUM_TIMEOUT}; use p2p_types::PeerId; -use randomness::Rng; +use randomness::RngExt; use test_utils::{ mock_time_getter::mocked_time_getter_seconds, random::{make_seedable_rng, Seed}, @@ -128,7 +128,7 @@ async fn basic(#[case] seed: Seed) { for _ in 0..15 { let mut top_block_id = None; - for _ in 0..rng.gen_range(1..2) { + for _ in 0..rng.random_range(1..2) { top_block_id = Some( make_new_top_blocks( &chainstate1, @@ -332,7 +332,7 @@ async fn block_announcement_disconnected_headers(#[case] seed: Seed) { custom_disconnection_reason_for_banning: Default::default(), }); - let initial_block_count = rng.gen_range(1..=MAX_REQUEST_BLOCKS_COUNT); + let initial_block_count = rng.random_range(1..=MAX_REQUEST_BLOCKS_COUNT); let initial_blocks = make_new_blocks( &chain_config, @@ -387,7 +387,7 @@ async fn block_announcement_disconnected_headers(#[case] seed: Seed) { nodes.delay_block_sync_messages_from_node(1, true); let new_block_count = - rng.gen_range(MAX_REQUEST_BLOCKS_COUNT..=MAX_REQUEST_BLOCKS_COUNT * 4); + rng.random_range(MAX_REQUEST_BLOCKS_COUNT..=MAX_REQUEST_BLOCKS_COUNT * 4); log::debug!("Starting to produce new blocks"); let mut best_block_id = None; @@ -665,7 +665,8 @@ async fn process_block_interference1(#[case] seed: Seed) { )) .await; - tokio::time::sleep(Duration::from_millis(rng.gen_range(1..10))).await; + tokio::time::sleep(Duration::from_millis(rng.random_range(1..10))) + .await; } }; @@ -792,7 +793,8 @@ async fn process_block_interference2(#[case] seed: Seed) { )) .await; - tokio::time::sleep(Duration::from_millis(rng.gen_range(1..10))).await; + tokio::time::sleep(Duration::from_millis(rng.random_range(1..10))) + .await; } }; @@ -881,9 +883,9 @@ async fn no_infinite_stalling_when_first_locator_cant_locate(#[case] seed: Seed) // peer-specific blocks will be bigger than 16; this means the first locators that the // peers will send each other won't be able to locate any blocks. let msg_header_count_limit: usize = 5; - let common_blocks_count = rng.gen_range(5..8); - let node1_extra_blocks_count = rng.gen_range(18..22); - let node2_extra_blocks_count = rng.gen_range(18..22); + let common_blocks_count = rng.random_range(5..8); + let node1_extra_blocks_count = rng.random_range(18..22); + let node2_extra_blocks_count = rng.random_range(18..22); log::debug!( "common blocks: {}, node1 extra blocks: {}, node2 extra blocks: {}", @@ -903,7 +905,7 @@ async fn no_infinite_stalling_when_first_locator_cant_locate(#[case] seed: Seed) ); let genesis_ts_secs = chain_config.genesis_block().timestamp().as_int_seconds(); let cur_time = Arc::new(SeqCstAtomicU64::new( - rng.gen_range(genesis_ts_secs..genesis_ts_secs * 2), + rng.random_range(genesis_ts_secs..genesis_ts_secs * 2), )); let time_getter = mocked_time_getter_seconds(cur_time); diff --git a/p2p/src/sync/tests/no_discouragement_after_tx_reorg.rs b/p2p/src/sync/tests/no_discouragement_after_tx_reorg.rs index 0e36b8e2d1..af8a4e3dbb 100644 --- a/p2p/src/sync/tests/no_discouragement_after_tx_reorg.rs +++ b/p2p/src/sync/tests/no_discouragement_after_tx_reorg.rs @@ -42,13 +42,13 @@ use common::{ }; use crypto::{ key::{KeyKind, PrivateKey}, - vrf::{transcript::with_rng::RngCoreAndCrypto, VRFKeyKind, VRFPrivateKey}, + vrf::{VRFKeyKind, VRFPrivateKey}, }; use logging::log; use mempool::{FeeRate, MempoolConfig}; use orders_accounting::OrdersAccountingDB; use p2p_types::PeerId; -use randomness::Rng; +use randomness::{CryptoRng, RngExt as _}; use test_utils::{ assert_matches, random::{gen_random_bytes, Seed}, @@ -81,18 +81,18 @@ async fn no_discouragement_after_tx_reorg(#[case] seed: Seed) { let pool_id = tfxt.create_pool(); let token_id = tfxt.issue_token(); - let token_mint_amount1 = Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); + let token_mint_amount1 = Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); let token_outpoint1 = tfxt.mint_token(token_id, token_mint_amount1, AccountNonce::new(0)); - let token_mint_amount2 = Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); + let token_mint_amount2 = Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); let token_outpoint2 = tfxt.mint_token(token_id, token_mint_amount2, AccountNonce::new(1)); - let token_mint_amount3 = Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); + let token_mint_amount3 = Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); let token_outpoint3 = tfxt.mint_token(token_id, token_mint_amount3, AccountNonce::new(2)); - let order_ask_amount = Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); - let order_give_amount = Amount::from_atoms( - tfxt.rng - .gen_range((token_mint_amount1.into_atoms() / 2)..token_mint_amount1.into_atoms()), - ); + let order_ask_amount = Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); + let order_give_amount = + Amount::from_atoms(tfxt.rng.random_range( + (token_mint_amount1.into_atoms() / 2)..token_mint_amount1.into_atoms(), + )); let order_id = tfxt.create_order( order_ask_amount, order_give_amount, @@ -100,11 +100,12 @@ async fn no_discouragement_after_tx_reorg(#[case] seed: Seed) { token_outpoint1, ); - let another_order1_ask_amount = Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); - let another_order1_give_amount = Amount::from_atoms( - tfxt.rng - .gen_range((token_mint_amount2.into_atoms() / 2)..token_mint_amount2.into_atoms()), - ); + let another_order1_ask_amount = + Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); + let another_order1_give_amount = + Amount::from_atoms(tfxt.rng.random_range( + (token_mint_amount2.into_atoms() / 2)..token_mint_amount2.into_atoms(), + )); let another_order1_id = tfxt.create_order( another_order1_ask_amount, another_order1_give_amount, @@ -112,23 +113,25 @@ async fn no_discouragement_after_tx_reorg(#[case] seed: Seed) { token_outpoint2, ); let another_order1_ask_amount_to_fill = - Amount::from_atoms(tfxt.rng.gen_range(100..another_order1_ask_amount.into_atoms())); + Amount::from_atoms(tfxt.rng.random_range(100..another_order1_ask_amount.into_atoms())); - let another_order2_ask_amount = Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); - let another_order2_give_amount = Amount::from_atoms( - tfxt.rng - .gen_range((token_mint_amount3.into_atoms() / 2)..token_mint_amount3.into_atoms()), - ); + let another_order2_ask_amount = + Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); + let another_order2_give_amount = + Amount::from_atoms(tfxt.rng.random_range( + (token_mint_amount3.into_atoms() / 2)..token_mint_amount3.into_atoms(), + )); - let delegate_amount = Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); + let delegate_amount = Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); let delg_id = tfxt.create_delegation(pool_id); tfxt.delegate(delg_id, delegate_amount); let another_delg_id = tfxt.create_delegation(pool_id); - let another_delegate_amount = Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); + let another_delegate_amount = + Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); let another_minted_token1_amount = - Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); + Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); let another_minted_token1_id = tfxt.issue_token(); let another_minted_token1_outpoint = tfxt.mint_token( another_minted_token1_id, @@ -136,10 +139,10 @@ async fn no_discouragement_after_tx_reorg(#[case] seed: Seed) { AccountNonce::new(0), ); let another_minted_token1_amount_to_unmint = - Amount::from_atoms(tfxt.rng.gen_range(0..another_minted_token1_amount.into_atoms())); + Amount::from_atoms(tfxt.rng.random_range(0..another_minted_token1_amount.into_atoms())); let another_minted_token2_amount = - Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); + Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); let another_minted_token2_id = tfxt.issue_token(); tfxt.mint_token( another_minted_token2_id, @@ -148,7 +151,7 @@ async fn no_discouragement_after_tx_reorg(#[case] seed: Seed) { ); let another_minted_token3_amount = - Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); + Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); let another_minted_token3_id = tfxt.issue_token(); tfxt.mint_token( another_minted_token3_id, @@ -156,7 +159,7 @@ async fn no_discouragement_after_tx_reorg(#[case] seed: Seed) { AccountNonce::new(0), ); - let frozen_token_amount = Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); + let frozen_token_amount = Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); let frozen_token_id = tfxt.issue_token(); tfxt.mint_token(frozen_token_id, frozen_token_amount, AccountNonce::new(0)); tfxt.freeze_token(frozen_token_id, AccountNonce::new(1)); @@ -174,10 +177,11 @@ async fn no_discouragement_after_tx_reorg(#[case] seed: Seed) { let another_pool_pledge = tfxt .rng - .gen_range(MIN_STAKE_POOL_PLEDGE_ATOMS..(MIN_STAKE_POOL_PLEDGE_ATOMS * 10)); + .random_range(MIN_STAKE_POOL_PLEDGE_ATOMS..(MIN_STAKE_POOL_PLEDGE_ATOMS * 10)); - let another_token_mint_mount = Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); - let htlc_coins_amount = Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000)); + let another_token_mint_mount = + Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); + let htlc_coins_amount = Amount::from_atoms(tfxt.rng.random_range(1000..1_000_000_000)); // Transactions to check. Note that the main case is withdrawal from a delegation, which caused the issue originally. // But we also check other transaction types. @@ -191,7 +195,9 @@ async fn no_discouragement_after_tx_reorg(#[case] seed: Seed) { InputWitness::NoSignature(None), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000))), + OutputValue::Coin(Amount::from_atoms( + tfxt.rng.random_range(1000..1_000_000_000), + )), Destination::AnyoneCanSpend, )) .build(), @@ -201,9 +207,11 @@ async fn no_discouragement_after_tx_reorg(#[case] seed: Seed) { InputWitness::NoSignature(None), ) .add_output(TxOutput::LockThenTransfer( - OutputValue::Coin(Amount::from_atoms(tfxt.rng.gen_range(1000..1_000_000_000))), + OutputValue::Coin(Amount::from_atoms( + tfxt.rng.random_range(1000..1_000_000_000), + )), Destination::AnyoneCanSpend, - OutputTimeLock::ForBlockCount(tfxt.rng.gen_range(0..10)), + OutputTimeLock::ForBlockCount(tfxt.rng.random_range(0..10)), )) .build(), TransactionBuilder::new() @@ -212,7 +220,7 @@ async fn no_discouragement_after_tx_reorg(#[case] seed: Seed) { InputWitness::NoSignature(None), ) .add_output(TxOutput::Burn(OutputValue::Coin(Amount::from_atoms( - tfxt.rng.gen_range(1000..1_000_000_000), + tfxt.rng.random_range(1000..1_000_000_000), )))) .build(), TransactionBuilder::new() @@ -393,7 +401,7 @@ async fn no_discouragement_after_tx_reorg(#[case] seed: Seed) { } struct TestFixture { - rng: Box, + rng: Box, tfrm: TestFramework, last_used_genesis_output_idx: u32, } @@ -409,7 +417,7 @@ impl TestFixture { common::chain::config::create_unit_test_config_builder() .genesis_custom(Genesis::new( "abc".to_owned(), - BlockTimestamp::from_int_seconds(rng.gen_range(1000..1_000_000_000)), + BlockTimestamp::from_int_seconds(rng.random_range(1000..1_000_000_000)), vec![ TxOutput::LockThenTransfer( OutputValue::Coin(Amount::from_atoms(GENESIS_OUTPUT_ATOMS)), @@ -554,7 +562,7 @@ impl TestFixture { token_ticker: random_ascii_alphanumeric_string(&mut self.rng, 1..max_ticker_len) .as_bytes() .to_vec(), - number_of_decimals: self.rng.gen_range(1..max_dec_count), + number_of_decimals: self.rng.random_range(1..max_dec_count), metadata_uri: random_ascii_alphanumeric_string(&mut self.rng, 1..max_uri_len) .as_bytes() .to_vec(), diff --git a/p2p/src/tests/bad_time_diff.rs b/p2p/src/tests/bad_time_diff.rs index ccd33f6a9e..a0341434d7 100644 --- a/p2p/src/tests/bad_time_diff.rs +++ b/p2p/src/tests/bad_time_diff.rs @@ -26,7 +26,7 @@ use networking::{ transport::{new_message_stream, TransportListener, TransportSocket}, }; use p2p_test_utils::run_with_timeout; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -88,7 +88,7 @@ where TTM::make_address().into(), protocol_version.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -224,7 +224,7 @@ where TTM::make_address().into(), protocol_version.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; diff --git a/p2p/src/tests/connection_lockup_when_socket_not_read.rs b/p2p/src/tests/connection_lockup_when_socket_not_read.rs index b12837a3cb..c1c311df1d 100644 --- a/p2p/src/tests/connection_lockup_when_socket_not_read.rs +++ b/p2p/src/tests/connection_lockup_when_socket_not_read.rs @@ -29,7 +29,7 @@ use networking::{ transport::{new_message_stream, TransportSocket}, }; use p2p_test_utils::run_with_timeout; -use randomness::Rng; +use randomness::RngExt; use serialization::Encode as _; use test_utils::{ assert_matches, assert_matches_return_val, @@ -141,7 +141,7 @@ async fn no_connection_lockup_when_socket_not_read(#[case] seed: Seed) { TestTransportChannel::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -343,7 +343,7 @@ async fn timeout_when_socket_not_read( TestTransportChannel::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; diff --git a/p2p/src/tests/correct_handshake.rs b/p2p/src/tests/correct_handshake.rs index 99ffdcf0d5..cb2cea1ca7 100644 --- a/p2p/src/tests/correct_handshake.rs +++ b/p2p/src/tests/correct_handshake.rs @@ -25,7 +25,7 @@ use networking::{ transport::{new_message_stream, TransportListener, TransportSocket}, }; use p2p_test_utils::run_with_timeout; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -63,7 +63,7 @@ where TTM::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -165,7 +165,7 @@ where TTM::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; diff --git a/p2p/src/tests/disable_networking.rs b/p2p/src/tests/disable_networking.rs index c5f5ced450..587893d51c 100644 --- a/p2p/src/tests/disable_networking.rs +++ b/p2p/src/tests/disable_networking.rs @@ -21,7 +21,7 @@ use chainstate::ChainstateConfig; use logging::log; use networking::test_helpers::{TestTransportChannel, TestTransportMaker}; use p2p_test_utils::run_with_timeout; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ random::{make_seedable_rng, Seed}, BasicTestTimeGetter, @@ -69,7 +69,7 @@ async fn disable_networking_impl(seed: Seed) { TestTransportChannel::make_address().into(), TEST_PROTOCOL_VERSION.into(), Some("test_node"), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -83,7 +83,7 @@ async fn disable_networking_impl(seed: Seed) { TestTransportChannel::make_address().into(), TEST_PROTOCOL_VERSION.into(), Some("other_node1"), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -97,7 +97,7 @@ async fn disable_networking_impl(seed: Seed) { TestTransportChannel::make_address().into(), TEST_PROTOCOL_VERSION.into(), Some("other_node2"), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; diff --git a/p2p/src/tests/disconnect_on_will_disconnect_msg.rs b/p2p/src/tests/disconnect_on_will_disconnect_msg.rs index c51b25ae27..e36097ba66 100644 --- a/p2p/src/tests/disconnect_on_will_disconnect_msg.rs +++ b/p2p/src/tests/disconnect_on_will_disconnect_msg.rs @@ -25,7 +25,7 @@ use networking::{ transport::{new_message_stream, TransportSocket}, }; use p2p_test_utils::run_with_timeout; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -65,7 +65,7 @@ where TTM::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; diff --git a/p2p/src/tests/helpers/mod.rs b/p2p/src/tests/helpers/mod.rs index efaaff8555..bd33e78b95 100644 --- a/p2p/src/tests/helpers/mod.rs +++ b/p2p/src/tests/helpers/mod.rs @@ -26,7 +26,7 @@ use tokio::sync::mpsc::UnboundedSender; use logging::log; use networking::transport::TransportSocket; use p2p_types::{bannable_address::BannableAddress, socket_address::SocketAddress, PeerId}; -use randomness::RngCore; +use randomness::Rng; use test_utils::BasicTestTimeGetter; use crate::{ @@ -240,7 +240,7 @@ impl TestDnsSeed { #[async_trait] impl DnsSeed for TestDnsSeed { - async fn obtain_addresses(&self, _rng: &mut (dyn RngCore + Send)) -> Vec { + async fn obtain_addresses(&self, _rng: &mut (dyn Rng + Send)) -> Vec { self.addresses.lock().unwrap().clone() } } diff --git a/p2p/src/tests/helpers/test_node.rs b/p2p/src/tests/helpers/test_node.rs index f625abeeb9..c1ccad42ef 100644 --- a/p2p/src/tests/helpers/test_node.rs +++ b/p2p/src/tests/helpers/test_node.rs @@ -37,7 +37,7 @@ use mempool::MempoolConfig; use networking::transport::{TransportListener, TransportSocket}; use p2p_test_utils::SHORT_TIMEOUT; use p2p_types::{p2p_event::P2pEventHandler, socket_address::SocketAddress, PeerId}; -use randomness::RngCore; +use randomness::Rng; use storage_inmemory::InMemory; use subsystem::ShutdownTrigger; use utils::{atomics::SeqCstAtomicBool, tokio_spawn_in_tracing_span}; @@ -121,7 +121,7 @@ where bind_address: SocketAddress, protocol_version: ProtocolVersion, node_name: Option<&str>, - rng: impl RngCore + Send + 'static, + rng: impl Rng + Send + 'static, ) -> Self { let socket = transport.bind(vec![bind_address.socket_addr()]).await.unwrap(); let local_address = socket.local_addresses().unwrap()[0]; diff --git a/p2p/src/tests/incorrect_handshake.rs b/p2p/src/tests/incorrect_handshake.rs index 64d4d4818c..c0ba502a2e 100644 --- a/p2p/src/tests/incorrect_handshake.rs +++ b/p2p/src/tests/incorrect_handshake.rs @@ -25,7 +25,7 @@ use networking::{ transport::{new_message_stream, TransportListener, TransportSocket}, }; use p2p_test_utils::run_with_timeout; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -61,7 +61,7 @@ where TTM::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -165,7 +165,7 @@ where TTM::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -265,7 +265,7 @@ where TTM::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; diff --git a/p2p/src/tests/min_peer_software_version.rs b/p2p/src/tests/min_peer_software_version.rs index fff53a06a8..90457cfe83 100644 --- a/p2p/src/tests/min_peer_software_version.rs +++ b/p2p/src/tests/min_peer_software_version.rs @@ -29,7 +29,7 @@ use networking::{ }; use p2p_test_utils::run_with_timeout; use p2p_types::socket_address::SocketAddress; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -174,7 +174,7 @@ async fn outbound_manual_connection(#[case] seed: Seed, test_params: TestParams) TestTransportChannel::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -288,7 +288,7 @@ async fn outbound_auto_connection(#[case] seed: Seed, test_params: TestParams) { TestTransportChannel::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -407,7 +407,7 @@ async fn inbound_connection(#[case] seed: Seed, test_params: TestParams) { TestTransportChannel::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; diff --git a/p2p/src/tests/misbehavior.rs b/p2p/src/tests/misbehavior.rs index 81f9c631c3..f04319835d 100644 --- a/p2p/src/tests/misbehavior.rs +++ b/p2p/src/tests/misbehavior.rs @@ -25,7 +25,7 @@ use networking::{ transport::{new_message_stream, TransportSocket}, }; use p2p_test_utils::run_with_timeout; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -61,7 +61,7 @@ where TTM::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; diff --git a/p2p/src/tests/peer_discovery_on_stale_tip.rs b/p2p/src/tests/peer_discovery_on_stale_tip.rs index 85d9440dea..e09ba322e6 100644 --- a/p2p/src/tests/peer_discovery_on_stale_tip.rs +++ b/p2p/src/tests/peer_discovery_on_stale_tip.rs @@ -24,7 +24,7 @@ use logging::log; use networking::test_helpers::{TestTransportChannel, TestTransportMaker}; use p2p_test_utils::{run_with_timeout, SHORT_TIMEOUT}; use p2p_types::socket_address::SocketAddress; -use randomness::{Rng as _, RngCore}; +use randomness::{Rng, RngExt as _}; use test_utils::{ random::{make_seedable_rng, Seed}, BasicTestTimeGetter, @@ -158,7 +158,7 @@ async fn peer_discovery_on_stale_tip_impl( i + 1, initial_block.clone(), &format!("node{i}"), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await, ); @@ -222,7 +222,7 @@ async fn peer_discovery_on_stale_tip_impl( new_node_idx, initial_block.clone(), "new_node", - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; let new_node_addr = *new_node.local_address(); @@ -370,7 +370,7 @@ async fn new_full_relay_connections_on_stale_tip_impl(seed: Seed) { 0, Some(initial_block.clone()), "main", - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; let main_node_address = *main_node.local_address(); @@ -386,7 +386,7 @@ async fn new_full_relay_connections_on_stale_tip_impl(seed: Seed) { i + 1, Some(initial_block.clone()), &format!("extra{i}"), - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await, ); @@ -533,7 +533,7 @@ async fn start_node( node_index: usize, initial_block: Option, name: &str, - rng: impl RngCore + Send + 'static, + rng: impl Rng + Send + 'static, ) -> TestNode { let node = TestNode::::start( true, diff --git a/p2p/src/tests/peer_mgr_events.rs b/p2p/src/tests/peer_mgr_events.rs index db6dc366fa..fcad9ea66d 100644 --- a/p2p/src/tests/peer_mgr_events.rs +++ b/p2p/src/tests/peer_mgr_events.rs @@ -29,7 +29,7 @@ use networking::{ }; use p2p_test_utils::{run_with_timeout, MEDIUM_TIMEOUT, SHORT_TIMEOUT}; use p2p_types::peer_address::PeerAddress; -use randomness::{seq::IteratorRandom as _, Rng}; +use randomness::{seq::IteratorRandom as _, Rng, RngExt as _}; use test_utils::{ assert_matches, random::{gen_random_alnum_string, make_seedable_rng, Seed}, @@ -98,7 +98,7 @@ async fn first_sync_message_received_must_be_sent( TestTransportChannel::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -186,17 +186,17 @@ async fn first_sync_message_received_must_be_sent( address: random_peer_addr(&mut rng), }) } - PeerManagerMessageTag::PingRequest => { - Message::PingRequest(PingRequest { nonce: rng.gen() }) - } + PeerManagerMessageTag::PingRequest => Message::PingRequest(PingRequest { + nonce: rng.random(), + }), PeerManagerMessageTag::AddrListResponse => { Message::AddrListResponse(AddrListResponse { addresses: vec![random_peer_addr(&mut rng)], }) } - PeerManagerMessageTag::PingResponse => { - Message::PingResponse(PingResponse { nonce: rng.gen() }) - } + PeerManagerMessageTag::PingResponse => Message::PingResponse(PingResponse { + nonce: rng.random(), + }), PeerManagerMessageTag::WillDisconnect => { Message::WillDisconnect(WillDisconnectMessage { reason: gen_random_alnum_string(&mut rng, 10, 20), @@ -260,7 +260,7 @@ async fn first_sync_message_received_must_be_sent_only_once(#[case] seed: Seed) TestTransportChannel::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -295,7 +295,7 @@ async fn first_sync_message_received_must_be_sent_only_once(#[case] seed: Seed) connect_result_receiver.await.unwrap().unwrap(); for _ in 5..10 { - let msg = if rng.gen_bool(0.5) { + let msg = if rng.random_bool(0.5) { Message::HeaderListRequest(HeaderListRequest::new(Locator::new(vec![ Id::random_using(&mut rng), ]))) @@ -327,8 +327,8 @@ async fn first_sync_message_received_must_be_sent_only_once(#[case] seed: Seed) fn random_peer_addr(rng: &mut impl Rng) -> PeerAddress { SocketAddr::V4(SocketAddrV4::new( - Ipv4Addr::new(rng.gen(), rng.gen(), rng.gen(), rng.gen()), - rng.gen(), + Ipv4Addr::new(rng.random(), rng.random(), rng.random(), rng.random()), + rng.random(), )) .into() } diff --git a/p2p/src/tests/same_handshake_nonce.rs b/p2p/src/tests/same_handshake_nonce.rs index 50a78591b8..793160b8a5 100644 --- a/p2p/src/tests/same_handshake_nonce.rs +++ b/p2p/src/tests/same_handshake_nonce.rs @@ -25,7 +25,7 @@ use networking::{ transport::{new_message_stream, TransportListener, TransportSocket}, }; use p2p_test_utils::run_with_timeout; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -65,7 +65,7 @@ where TTM::make_address().into(), protocol_version.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; diff --git a/p2p/src/tests/unsupported_message.rs b/p2p/src/tests/unsupported_message.rs index d201035f85..f0bd0f21b4 100644 --- a/p2p/src/tests/unsupported_message.rs +++ b/p2p/src/tests/unsupported_message.rs @@ -22,7 +22,7 @@ use networking::{ transport::{new_message_stream, TransportSocket as _}, }; use p2p_test_utils::run_with_timeout; -use randomness::Rng as _; +use randomness::RngExt as _; use serialization::{Decode, Encode}; use test_utils::{ assert_matches, assert_matches_return_val, @@ -85,7 +85,7 @@ async fn unsupported_message_impl(seed: Seed, make_msg_too_big: bool) { TestTransportChannel::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; diff --git a/p2p/src/tests/unsupported_version.rs b/p2p/src/tests/unsupported_version.rs index a37d67d86e..0e39bf3ad3 100644 --- a/p2p/src/tests/unsupported_version.rs +++ b/p2p/src/tests/unsupported_version.rs @@ -25,7 +25,7 @@ use networking::{ transport::{new_message_stream, TransportListener, TransportSocket}, }; use p2p_test_utils::run_with_timeout; -use randomness::Rng as _; +use randomness::RngExt as _; use test_utils::{ assert_matches, random::{make_seedable_rng, Seed}, @@ -60,7 +60,7 @@ where TTM::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -160,7 +160,7 @@ where TTM::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; @@ -251,7 +251,7 @@ where TTM::make_address().into(), TEST_PROTOCOL_VERSION.into(), None, - make_seedable_rng(rng.gen()), + make_seedable_rng(rng.random()), ) .await; diff --git a/p2p/test-utils/src/lib.rs b/p2p/test-utils/src/lib.rs index bc1b882265..9dbab2f776 100644 --- a/p2p/test-utils/src/lib.rs +++ b/p2p/test-utils/src/lib.rs @@ -36,7 +36,7 @@ use common::{ use logging::log; use mempool::{MempoolConfig, MempoolHandle, MempoolInit}; use subsystem::{ManagerJoinHandle, ShutdownTrigger}; -use test_utils::random::{CryptoRng, Rng}; +use test_utils::random::CryptoRng; use crate::panic_handling::get_panic_notification; @@ -104,11 +104,7 @@ pub fn start_subsystems_generic( // TODO: unify block creation utilities in p2p tests (others are in p2p/src/sync/tests/helpers, // may be in some other places too). -pub fn create_n_blocks( - rng: &mut (impl Rng + CryptoRng), - tf: &mut TestFramework, - n: usize, -) -> Vec { +pub fn create_n_blocks(rng: &mut impl CryptoRng, tf: &mut TestFramework, n: usize) -> Vec { assert!(n > 0); let mut blocks = Vec::with_capacity(n); diff --git a/pos-accounting/src/pool/helpers.rs b/pos-accounting/src/pool/helpers.rs index a3c98dd5c5..17fa532f16 100644 --- a/pos-accounting/src/pool/helpers.rs +++ b/pos-accounting/src/pool/helpers.rs @@ -17,13 +17,13 @@ use common::{ chain::DelegationId, primitives::{Amount, H256}, }; -use randomness::Rng; +use randomness::{Rng, RngExt as _}; use crate::{pool::operations::DelegateStakingUndo, PoSAccountingUndo}; pub fn random_undo_for_test(rng: &mut impl Rng) -> PoSAccountingUndo { let delegation_target: DelegationId = H256::random_using(rng).into(); - let amount_to_delegate = Amount::from_atoms(rng.gen_range(0..100_000)); + let amount_to_delegate = Amount::from_atoms(rng.random_range(0..100_000)); // TODO: return other undo types PoSAccountingUndo::DelegateStaking(DelegateStakingUndo { diff --git a/pos-accounting/src/pool/tests/mod.rs b/pos-accounting/src/pool/tests/mod.rs index 489fba475b..012e19306b 100644 --- a/pos-accounting/src/pool/tests/mod.rs +++ b/pos-accounting/src/pool/tests/mod.rs @@ -23,7 +23,7 @@ use crypto::{ key::{KeyKind, PrivateKey}, vrf::{VRFKeyKind, VRFPrivateKey}, }; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use crate::{ error::Error, storage::in_memory::InMemoryPoSAccounting, DelegationData, @@ -43,19 +43,19 @@ fn new_delegation_id(v: u64) -> DelegationId { DelegationId::new(H256::from_low_u64_be(v)) } -fn new_pub_key_destination(rng: &mut (impl Rng + CryptoRng)) -> Destination { +fn new_pub_key_destination(rng: &mut impl CryptoRng) -> Destination { let (_, pub_key) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); Destination::PublicKey(pub_key) } fn create_pool_data( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, decommission_destination: Destination, pledged_amount: Amount, ) -> PoolData { let (_, vrf_pk) = VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel); - let margin_ratio = PerThousand::new(rng.gen_range(0..1000)).unwrap(); - let cost_per_block = Amount::from_atoms(rng.gen_range(0..1000)); + let margin_ratio = PerThousand::new(rng.random_range(0..1000)).unwrap(); + let cost_per_block = Amount::from_atoms(rng.random_range(0..1000)); PoolData::new( decommission_destination, pledged_amount, @@ -67,7 +67,7 @@ fn create_pool_data( } fn create_pool( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, op: &mut impl PoSAccountingOperations, pledged_amount: Amount, ) -> Result<(PoolId, PoolData, PoSAccountingUndo), Error> { @@ -79,7 +79,7 @@ fn create_pool( } fn create_delegation_id( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, op: &mut impl PoSAccountingOperations, target_pool: PoolId, ) -> Result<(DelegationId, Destination, PoSAccountingUndo), Error> { @@ -90,7 +90,7 @@ fn create_delegation_id( } fn create_storage_with_pool( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, pledged_amount: Amount, ) -> (PoolId, PoolData, InMemoryPoSAccounting) { let pool_id = new_pool_id(rng.next_u64()); @@ -108,7 +108,7 @@ fn create_storage_with_pool( } fn create_storage_with_pool_and_delegation( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, pledged_amount: Amount, delegated_amount: Amount, ) -> ( diff --git a/pos-accounting/src/pool/tests/simulation_tests.rs b/pos-accounting/src/pool/tests/simulation_tests.rs index bd9e63f358..0b89d5e03d 100644 --- a/pos-accounting/src/pool/tests/simulation_tests.rs +++ b/pos-accounting/src/pool/tests/simulation_tests.rs @@ -13,13 +13,14 @@ // See the License for the specific language governing permissions and // limitations under the License. +use rstest::rstest; +use strum::EnumCount as _; + use common::{ chain::{DelegationId, Destination, PoolId}, primitives::Amount, }; -use randomness::{CryptoRng, Rng}; -use rstest::rstest; -use strum::EnumCount as _; +use randomness::{CryptoRng, Rng, RngExt as _}; use test_utils::random::{make_seedable_rng, Seed}; use super::create_pool_data; @@ -34,7 +35,7 @@ use crate::{ fn get_random_pool_id(rng: &mut impl Rng, storage: &InMemoryPoSAccounting) -> Option { let all_pool_data = storage.all_pool_data(); (!all_pool_data.is_empty()) - .then(|| *all_pool_data.iter().nth(rng.gen_range(0..all_pool_data.len())).unwrap().0) + .then(|| *all_pool_data.iter().nth(rng.random_range(0..all_pool_data.len())).unwrap().0) } fn get_random_delegation_data( @@ -45,7 +46,7 @@ fn get_random_delegation_data( (!all_delegation_data.is_empty()).then(|| { all_delegation_data .iter() - .nth(rng.gen_range(0..all_delegation_data.len())) + .nth(rng.random_range(0..all_delegation_data.len())) .map(|(id, data)| (*id, data.clone())) .unwrap() }) @@ -59,7 +60,7 @@ fn get_random_delegation_balance( (!all_delegation_balances.is_empty()).then(|| { all_delegation_balances .iter() - .nth(rng.gen_range(0..all_delegation_balances.len())) + .nth(rng.random_range(0..all_delegation_balances.len())) .map(|(id, balance)| (*id, *balance)) .unwrap() }) @@ -73,7 +74,7 @@ fn simulation_test_delta(#[case] seed: Seed) { let mut storage = InMemoryPoSAccounting::new(); let mut undos = Vec::::new(); - let iterations_count = rng.gen_range(100..1000); + let iterations_count = rng.random_range(100..1000); for _ in 0..iterations_count { // collecting following random items every time is not efficient, because only single one of them might be used; @@ -98,7 +99,7 @@ fn simulation_test_delta(#[case] seed: Seed) { } fn perform_random_operation( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, op: &mut (impl PoSAccountingOperations + PoSAccountingView), undos: &mut Vec, random_pool: Option, @@ -109,10 +110,10 @@ fn perform_random_operation( // and the following match needs to be updated assert_eq!(PoSAccountingUndo::COUNT, 7); - match rng.gen_range(0..11) { + match rng.random_range(0..11) { // create new pool 0..=1 => { - let pledge_amount = Amount::from_atoms(rng.gen_range(1000..10_000)); + let pledge_amount = Amount::from_atoms(rng.random_range(1000..10_000)); let pool_data = create_pool_data(rng, Destination::AnyoneCanSpend, pledge_amount); let pool_id = PoolId::random_using(rng); @@ -142,7 +143,7 @@ fn perform_random_operation( if let Some((delegation_id, delegation_data)) = random_delegation { // it's possible that after decommission pool the delegations are still there if op.pool_exists(*delegation_data.source_pool()).unwrap() { - let amount_to_delegate = Amount::from_atoms(rng.gen_range(1000..10_000)); + let amount_to_delegate = Amount::from_atoms(rng.random_range(1000..10_000)); let undo = op.delegate_staking(delegation_id, amount_to_delegate).unwrap(); undos.push(undo); @@ -152,7 +153,8 @@ fn perform_random_operation( // spend share from delegation 7 => { if let Some((delegation_id, balance)) = random_delegation_balance { - let amount_to_spent = Amount::from_atoms(rng.gen_range(1..=balance.into_atoms())); + let amount_to_spent = + Amount::from_atoms(rng.random_range(1..=balance.into_atoms())); let undo = op.spend_share_from_delegation_id(delegation_id, amount_to_spent).unwrap(); @@ -162,7 +164,7 @@ fn perform_random_operation( // increase staker reward 8..=9 => { if let Some(pool_id) = random_pool { - let amount_to_add = Amount::from_atoms(rng.gen_range(1000..10_000)); + let amount_to_add = Amount::from_atoms(rng.random_range(1000..10_000)); let undo = op.increase_staker_rewards(pool_id, amount_to_add).unwrap(); undos.push(undo); diff --git a/pos-accounting/src/pool/tests/undo_tests.rs b/pos-accounting/src/pool/tests/undo_tests.rs index aed37fe708..e60a21c66c 100644 --- a/pos-accounting/src/pool/tests/undo_tests.rs +++ b/pos-accounting/src/pool/tests/undo_tests.rs @@ -16,7 +16,7 @@ use std::collections::BTreeMap; use common::{chain::Destination, primitives::Amount}; -use randomness::RngCore; +use randomness::Rng; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; diff --git a/randomness/Cargo.toml b/randomness/Cargo.toml index e011307142..51045b5556 100644 --- a/randomness/Cargo.toml +++ b/randomness/Cargo.toml @@ -7,6 +7,8 @@ license.workspace = true [dependencies] rand.workspace = true +rand_core.workspace = true +rand_0_8.workspace = true [dev-dependencies] static_assertions.workspace = true diff --git a/randomness/src/adapters.rs b/randomness/src/adapters.rs new file mode 100644 index 0000000000..096042e8e1 --- /dev/null +++ b/randomness/src/adapters.rs @@ -0,0 +1,39 @@ +// Copyright (c) 2026 RBB S.r.l +// opensource@mintlayer.org +// SPDX-License-Identifier: MIT +// Licensed under the MIT License; +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://github.com/mintlayer/mintlayer-core/blob/master/LICENSE +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/// An adapter that implements `rand` v0.8's `RngCore` and `CryptoRng` if the wrapped type implements +/// `Rng` and `CryptoRng` respectively. +pub struct Rng08Adapter(pub R); + +impl rand_0_8::RngCore for Rng08Adapter { + fn next_u32(&mut self) -> u32 { + self.0.next_u32() + } + + fn next_u64(&mut self) -> u64 { + self.0.next_u64() + } + + fn fill_bytes(&mut self, dest: &mut [u8]) { + self.0.fill_bytes(dest) + } + + fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand_0_8::Error> { + self.0.fill_bytes(dest); + Ok(()) + } +} + +impl rand_0_8::CryptoRng for Rng08Adapter {} diff --git a/randomness/src/lib.rs b/randomness/src/lib.rs index 4bf415059b..652d2a15f7 100644 --- a/randomness/src/lib.rs +++ b/randomness/src/lib.rs @@ -13,28 +13,40 @@ // See the License for the specific language governing permissions and // limitations under the License. +pub mod adapters; + use std::sync::Mutex; -pub use rand::prelude::SliceRandom; -pub use rand::{seq, CryptoRng, Rng, RngCore, SeedableRng}; +pub use rand::prelude::{IndexedMutRandom, IndexedRandom, SliceRandom}; +pub use rand::{seq, CryptoRng, Rng, RngExt, SeedableRng, TryCryptoRng, TryRng}; pub mod distributions { - pub use rand::distributions::{ - Alphanumeric, DistString, Distribution, Standard, WeightedIndex, + pub use rand::distr::{ + weighted::WeightedIndex, Alphanumeric, Distribution, SampleString, StandardUniform, }; pub mod uniform { - pub use rand::distributions::uniform::SampleRange; + pub use rand::distr::uniform::SampleRange; } } pub mod rngs { - pub use rand::rngs::mock::StepRng; - pub use rand::rngs::OsRng; + pub use rand::rngs::SysRng; +} + +pub mod rand_core_utils { + pub use rand_core::utils::*; } #[must_use] -pub fn make_true_rng() -> impl Rng + CryptoRng { - rand::rngs::StdRng::from_entropy() +pub fn make_true_rng() -> impl CryptoRng { + // Note: the old call `StdRng::from_entropy()` from rand v0.8.x that we used to have here would + // also panic on RNG creation failure. In either case, the possible failure comes from `getrandom`, + // which states in its docs (https://docs.rs/getrandom/latest/getrandom/#error-handling) + // that the failure is highly unlikely and that after the first successful call one can be + // reasonably confident that no failure will occur. So panicking on failure is reasonable + // behavior here. + // TODO: it's still better to propagate the error, to fail gracefully in such a situation. + rand::rngs::StdRng::try_from_rng(&mut rand::rngs::SysRng).expect("RNG creation failed") } #[must_use] @@ -42,7 +54,7 @@ pub fn make_pseudo_rng() -> impl Rng { rand::rngs::ThreadRng::default() } -/// A wrapper over `Mutex>` that implements `RngCore` and `CryptoRng` if `R` does the same. +/// A wrapper over `Mutex>` that implements `Rng` and `CryptoRng` if `R` does the same. /// /// This can be passed to a function that accept `impl Rng`, to avoid the need to lock the mutex /// for the entire duration of the function call. @@ -56,58 +68,71 @@ impl<'a, R: ?Sized> BoxedRngMutexWrapper<'a, R> { } } -impl<'a, R: RngCore + ?Sized> RngCore for BoxedRngMutexWrapper<'a, R> { - fn next_u32(&mut self) -> u32 { - self.0.lock().expect("poisoned mutex").next_u32() - } +impl<'a, R: Rng + ?Sized> TryRng for BoxedRngMutexWrapper<'a, R> { + type Error = std::convert::Infallible; - fn next_u64(&mut self) -> u64 { - self.0.lock().expect("poisoned mutex").next_u64() + fn try_next_u32(&mut self) -> Result { + Ok(self.0.lock().expect("poisoned mutex").next_u32()) } - fn fill_bytes(&mut self, dest: &mut [u8]) { - self.0.lock().expect("poisoned mutex").fill_bytes(dest) + fn try_next_u64(&mut self) -> Result { + Ok(self.0.lock().expect("poisoned mutex").next_u64()) } - fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> { - self.0.lock().expect("poisoned mutex").try_fill_bytes(dest) + fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Self::Error> { + self.0.lock().expect("poisoned mutex").fill_bytes(dest); + Ok(()) } } -impl<'a, R: CryptoRng> CryptoRng for BoxedRngMutexWrapper<'a, R> {} +// Note: `CryptoRng` is implemented automatically for all `R: TryCryptoRng`. +impl<'a, R: TryCryptoRng> TryCryptoRng + for BoxedRngMutexWrapper<'a, R> +{ +} #[cfg(test)] mod tests { use static_assertions::{assert_impl_all, assert_not_impl_any}; + use crate::adapters::*; + use super::*; - // `DumbRng` implements `RngCore` but not `CryptoRng`. + // `NonCryptoRngType` implements `Rng` but not `CryptoRng`. #[allow(dead_code)] - struct DumbRng; + struct NonCryptoRngType; - impl RngCore for DumbRng { - fn next_u32(&mut self) -> u32 { - 0 - } + impl TryRng for NonCryptoRngType { + type Error = std::convert::Infallible; - fn next_u64(&mut self) -> u64 { - 0 + fn try_next_u32(&mut self) -> Result { + Ok(0) } - fn fill_bytes(&mut self, dest: &mut [u8]) { - dest.fill(0); + fn try_next_u64(&mut self) -> Result { + Ok(0) } - fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> { + fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Self::Error> { dest.fill(0); Ok(()) } } - assert_impl_all!(BoxedRngMutexWrapper<'static, DumbRng>: RngCore); - assert_not_impl_any!(BoxedRngMutexWrapper<'static, DumbRng>: CryptoRng); + #[allow(dead_code)] + type CryptoRngType = rand::rngs::StdRng; + + // Sanity checks + assert_impl_all!(CryptoRngType: Rng, CryptoRng); + assert_impl_all!(NonCryptoRngType: Rng); + assert_not_impl_any!(NonCryptoRngType: CryptoRng); + + assert_impl_all!(BoxedRngMutexWrapper<'static, NonCryptoRngType>: Rng); + assert_not_impl_any!(BoxedRngMutexWrapper<'static, NonCryptoRngType>: CryptoRng); + assert_impl_all!(BoxedRngMutexWrapper<'static, CryptoRngType>: Rng, CryptoRng); - // Note: `ThreadRng` actually implements `CryptoRng`, even though we use it in `make_pseudo_rng`. - assert_impl_all!(BoxedRngMutexWrapper<'static, rand::rngs::ThreadRng>: RngCore, CryptoRng); + assert_impl_all!(Rng08Adapter: rand_0_8::RngCore); + assert_not_impl_any!(Rng08Adapter: rand_0_8::CryptoRng); + assert_impl_all!(Rng08Adapter: rand_0_8::Rng, rand_0_8::CryptoRng); } diff --git a/rpc/src/rpc_creds.rs b/rpc/src/rpc_creds.rs index 3ad508385e..a5382534a4 100644 --- a/rpc/src/rpc_creds.rs +++ b/rpc/src/rpc_creds.rs @@ -19,7 +19,7 @@ use std::{ }; use logging::log; -use randomness::{distributions::DistString, make_true_rng, CryptoRng, Rng}; +use randomness::{distributions::SampleString, make_true_rng, CryptoRng}; use utils::cookie::COOKIE_FILENAME; const COOKIE_PASSWORD_LEN: usize = 32; @@ -33,7 +33,7 @@ pub struct RpcCreds { cookie_file: Option, } -fn gen_password(rng: &mut (impl Rng + CryptoRng), len: usize) -> String { +fn gen_password(rng: &mut impl CryptoRng, len: usize) -> String { randomness::distributions::Alphanumeric.sample_string(rng, len) } diff --git a/rpc/tests/basic/main.rs b/rpc/tests/basic/main.rs index 9516f340ec..b9ba591d7d 100644 --- a/rpc/tests/basic/main.rs +++ b/rpc/tests/basic/main.rs @@ -15,13 +15,16 @@ use std::{collections::BTreeMap, net::SocketAddr, path::PathBuf}; -use jsonrpsee::core::client::{ClientT, SubscriptionClientT}; -use jsonrpsee::rpc_params; -use randomness::{ - distributions::{Alphanumeric, DistString}, - Rng, +use jsonrpsee::{ + core::client::{ClientT, SubscriptionClientT}, + rpc_params, }; use rstest::rstest; + +use randomness::{ + distributions::{Alphanumeric, SampleString}, + Rng, RngExt as _, +}; use test_utils::random::{make_seedable_rng, Seed}; use rpc::{ @@ -166,7 +169,7 @@ async fn http_request(rpc: &Rpc, rpc_auth: RpcAuthData) -> anyhow::Result<()> { } fn gen_random_string(rng: &mut impl Rng, not_equal_to: &str) -> String { - let len = rng.gen_range(1..20); + let len = rng.random_range(1..20); loop { let val = Alphanumeric.sample_string(rng, len); if not_equal_to != val { diff --git a/serialization/core/Cargo.toml b/serialization/core/Cargo.toml index 27864e0538..be4db84a6e 100644 --- a/serialization/core/Cargo.toml +++ b/serialization/core/Cargo.toml @@ -9,6 +9,10 @@ rust-version.workspace = true parity-scale-codec = { workspace = true, features = ["derive", "chain-error", "std"] } [dev-dependencies] +randomness = { path = "../../randomness" } +test-utils = { path = "../../test-utils" } + arraytools.workspace = true hex-literal.workspace = true rand.workspace = true +rstest.workspace = true diff --git a/serialization/core/tests/complex_types.rs b/serialization/core/tests/complex_types.rs index dc78336165..d71bed5a06 100644 --- a/serialization/core/tests/complex_types.rs +++ b/serialization/core/tests/complex_types.rs @@ -15,9 +15,13 @@ mod utils; -use rand::Rng; -use serialization_core::{Decode, DecodeAll, Encode}; use std::collections::BTreeMap; + +use rstest::rstest; + +use randomness::RngExt as _; +use serialization_core::{Decode, DecodeAll, Encode}; +use test_utils::random::{make_seedable_rng, Seed}; use utils::{OptionWrapper, SimpleWrapper}; #[test] @@ -61,9 +65,11 @@ fn test_enum_codec_index() { } } -#[test] -fn test_scale_structures() { - let mut rng = rand::thread_rng(); +#[rstest] +#[trace] +#[case(test_utils::random::Seed::from_entropy())] +fn test_scale_structures(#[case] seed: Seed) { + let mut rng = make_seedable_rng(seed); #[derive(Debug, Clone, PartialEq, Eq, Encode, Decode)] enum TestEnum { @@ -99,20 +105,20 @@ fn test_scale_structures() { let mut btree_map = BTreeMap::new(); for _ in 0..1024 { btree_map.insert( - format!("Tom Sawyer {}", rng.gen::()), + format!("Tom Sawyer {}", rng.random::()), "The Adventure of Tom Sawyer is a novel by Mark Twain.".to_string(), ); btree_map.insert( - format!("Tin-tin {}", rng.gen::()), + format!("Tin-tin {}", rng.random::()), "Life is rather like a tin of sardines - we're all of us looking for the key." .to_string(), ); btree_map.insert( - format!("Red Planet {}", rng.gen::()), + format!("Red Planet {}", rng.random::()), "In Red Planet, the only thing thicker than the Martian atmosphere (which is breathable, by the way)".to_string(), ); btree_map.insert( - format!("Romeo and Juliet {}", rng.gen::()), + format!("Romeo and Juliet {}", rng.random::()), "Good night, good night! parting is such sweet sorrow. ".to_string(), ); } @@ -120,7 +126,7 @@ fn test_scale_structures() { let mut field_btree_map_string = BTreeMap::new(); for _ in 0..1024 { field_btree_map_string.insert( - rng.gen::(), + rng.random::(), "The Adventure of Tom Sawyer is a novel by Mark Twain.".to_string(), ); } @@ -128,18 +134,18 @@ fn test_scale_structures() { let mut field_btree_map_bytes = BTreeMap::new(); for _ in 0..1024 { field_btree_map_bytes.insert( - rng.gen::(), + rng.random::(), vec![ - rng.gen::(), - rng.gen::(), - rng.gen::(), - rng.gen::(), - rng.gen::(), - rng.gen::(), - rng.gen::(), - rng.gen::(), - rng.gen::(), - rng.gen::(), + rng.random::(), + rng.random::(), + rng.random::(), + rng.random::(), + rng.random::(), + rng.random::(), + rng.random::(), + rng.random::(), + rng.random::(), + rng.random::(), ], ); } diff --git a/serialization/core/tests/containers.rs b/serialization/core/tests/containers.rs index 61a157f51a..cb64da789c 100644 --- a/serialization/core/tests/containers.rs +++ b/serialization/core/tests/containers.rs @@ -15,9 +15,13 @@ mod utils; -use rand::Rng; -use serialization_core::{DecodeAll, Encode}; use std::collections::BTreeMap; + +use rstest::rstest; + +use randomness::RngExt as _; +use serialization_core::{DecodeAll, Encode}; +use test_utils::random::{make_seedable_rng, Seed}; use utils::SimpleWrapper; #[test] @@ -91,25 +95,27 @@ fn test_scale_vectors() { assert_eq!(dec, Some(SimpleWrapper(vector))); } -#[test] -fn test_scale_btree_map() { - let mut rng = rand::thread_rng(); +#[rstest] +#[trace] +#[case(test_utils::random::Seed::from_entropy())] +fn test_scale_btree_map(#[case] seed: Seed) { + let mut rng = make_seedable_rng(seed); let mut btree_map = BTreeMap::new(); for _ in 0..1024 { btree_map.insert( - format!("Office Space {}", rng.gen::()), + format!("Office Space {}", rng.random::()), "Deals with real issues in the workplace.".to_string(), ); btree_map.insert( - format!("Pulp Fiction {}", rng.gen::()), + format!("Pulp Fiction {}", rng.random::()), "Masterpiece.".to_string(), ); btree_map.insert( - format!("The Godfather {}", rng.gen::()), + format!("The Godfather {}", rng.random::()), "Very enjoyable.".to_string(), ); btree_map.insert( - format!("The Blues Brothers {}", rng.gen::()), + format!("The Blues Brothers {}", rng.random::()), "Eye lyked it a lot.".to_string(), ); } diff --git a/storage/backend-test-suite/src/frontend.rs b/storage/backend-test-suite/src/frontend.rs index d14761edb2..146c8d3cd1 100644 --- a/storage/backend-test-suite/src/frontend.rs +++ b/storage/backend-test-suite/src/frontend.rs @@ -18,7 +18,7 @@ use crate::prelude::*; -use test_utils::random::{gen_random_bytes, make_seedable_rng, Rng}; +use test_utils::random::{gen_random_bytes, make_seedable_rng, RngExt as _}; mod iter_sort_preserving_numbers { use serialization::{Decode, Encode}; @@ -55,7 +55,7 @@ mod iter_sort_preserving_numbers { let test_values = (0..100) .map(|_| CompoundKey1 { - main_part: OrderPreservingValue::new(rng.gen::()), + main_part: OrderPreservingValue::new(rng.random::()), aux_part: gen_random_bytes(&mut rng, 1, 100), }) .collect::>(); @@ -72,7 +72,7 @@ mod iter_sort_preserving_numbers { v1.main_part.inner().cmp(&v2.main_part.inner()) }); - let i = rng.gen_range(0..test_values.len() - 1); + let i = rng.random_range(0..test_values.len() - 1); let item = &sorted_test_values[i]; let expected_ge_items = &sorted_test_values[i..]; @@ -122,7 +122,7 @@ mod iter_sort_preserving_numbers { let test_values = (0..100) .map(|_| { ( - OrderPreservingValue::new(rng.gen::()), + OrderPreservingValue::new(rng.random::()), gen_random_bytes(&mut rng, 1, 100), ) }) @@ -140,7 +140,7 @@ mod iter_sort_preserving_numbers { v1.0.inner().cmp(&v2.0.inner()) }); - let i = rng.gen_range(0..test_values.len() - 1); + let i = rng.random_range(0..test_values.len() - 1); let item = &sorted_test_values[i]; let expected_ge_items = &sorted_test_values[i..]; diff --git a/storage/failing/src/backend.rs b/storage/failing/src/backend.rs index f8578bdbcf..aa67579452 100644 --- a/storage/failing/src/backend.rs +++ b/storage/failing/src/backend.rs @@ -19,7 +19,7 @@ use std::{ }; use storage_core::{backend, Data, DbMapId}; -use test_utils::random::{Rng, Seed, TestRng}; +use test_utils::random::{RngExt as _, Seed, TestRng}; use utils::{atomics::AcqRelAtomicU32, shallow_clone::ShallowClone}; use crate::{ErrorGeneration, FailureConfig}; @@ -92,7 +92,7 @@ impl FailingImpl { } fn make_rng_impl(rng: &Mutex) -> TestRng { - TestRng::new(Seed(rng.lock().expect("lock poisoned").gen())) + TestRng::new(Seed(rng.lock().expect("lock poisoned").random())) } fn make_rw_tx_state<'a>( diff --git a/storage/failing/src/config/mod.rs b/storage/failing/src/config/mod.rs index e26161eba5..05f7a175bd 100644 --- a/storage/failing/src/config/mod.rs +++ b/storage/failing/src/config/mod.rs @@ -16,7 +16,7 @@ use std::collections::BTreeMap; use storage_core::{error::Recoverable as StorageError, DbMapId}; -use test_utils::random::{IteratorRandom, Rng}; +use test_utils::random::{IteratorRandom, Rng, RngExt as _}; use utils::ensure; pub mod builder; @@ -130,7 +130,7 @@ impl ErrorGeneration { } pub fn generate(&self, rng: &mut impl Rng) -> Option { - ensure!(rng.gen_bool(self.probability.into())); + ensure!(rng.random_bool(self.probability.into())); self.errors.generate(rng) } } diff --git a/storage/lmdb/src/resize_tests.rs b/storage/lmdb/src/resize_tests.rs index a8ee330317..a8c95288c2 100644 --- a/storage/lmdb/src/resize_tests.rs +++ b/storage/lmdb/src/resize_tests.rs @@ -19,13 +19,13 @@ use rstest::rstest; use memsize::MemSize; use storage_core::backend::{Backend, BackendImpl, ReadOps, SharedBackendImpl, TxRw, WriteOps}; -use test_utils::random::{make_seedable_rng, CryptoRng, Rng, Seed}; +use test_utils::random::{make_seedable_rng, CryptoRng, RngExt as _, Seed}; use super::*; #[must_use] fn create_random_data_map_with_target_byte_size( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, required_size: usize, key_max_size: usize, val_max_size: usize, @@ -35,10 +35,10 @@ fn create_random_data_map_with_target_byte_size( let mut total_size = 0; while total_size < required_size { - let key_size = 1 + rng.gen::() % key_max_size; - let key = (0..key_size).map(|_| rng.gen::()).collect::>(); - let val_size = 1 + rng.gen::() % val_max_size; - let val = (0..val_size).map(|_| rng.gen::()).collect::>(); + let key_size = rng.random_range(1..=key_max_size); + let key = (0..key_size).map(|_| rng.random::()).collect::>(); + let val_size = rng.random_range(1..=val_max_size); + let val = (0..val_size).map(|_| rng.random::()).collect::>(); result.insert(key, val); total_size += key_size; diff --git a/storage/src/order_preserving_value.rs b/storage/src/order_preserving_value.rs index 80afb40035..3f344d2a50 100644 --- a/storage/src/order_preserving_value.rs +++ b/storage/src/order_preserving_value.rs @@ -77,7 +77,7 @@ mod tests { use test_utils::random::{ make_seedable_rng, randomness::{self, distributions::Distribution}, - Rng, Seed, + Rng, RngExt as _, Seed, }; use super::*; @@ -86,10 +86,10 @@ mod tests { where T: Ord + Debug + Wrappable, OrderPreservingValue: Encode + Decode, - randomness::distributions::Standard: Distribution, + randomness::distributions::StandardUniform: Distribution, { - let val16_1 = OrderPreservingValue::new(rng.gen::()); - let val16_2 = OrderPreservingValue::new(rng.gen::()); + let val16_1 = OrderPreservingValue::new(rng.random::()); + let val16_2 = OrderPreservingValue::new(rng.random::()); let val16_1_encoded = val16_1.encode(); let val16_2_encoded = val16_2.encode(); diff --git a/supply-chain/config.toml b/supply-chain/config.toml index 9948fd0c47..6cb1496f13 100644 --- a/supply-chain/config.toml +++ b/supply-chain/config.toml @@ -1005,7 +1005,7 @@ version = "1.0.17" criteria = "safe-to-deploy" [[exemptions.proptest]] -version = "1.6.0" +version = "1.11.0" criteria = "safe-to-deploy" [[exemptions.protobuf]] @@ -1060,14 +1060,30 @@ criteria = "safe-to-deploy" version = "0.7.3" criteria = "safe-to-deploy" +[[exemptions.rand]] +version = "0.8.6" +criteria = "safe-to-deploy" + +[[exemptions.rand]] +version = "0.9.4" +criteria = "safe-to-deploy" + [[exemptions.rand_chacha]] version = "0.2.2" criteria = "safe-to-deploy" +[[exemptions.rand_chacha]] +version = "0.10.0" +criteria = "safe-to-deploy" + [[exemptions.rand_core]] version = "0.5.1" criteria = "safe-to-deploy" +[[exemptions.rand_core]] +version = "0.10.1" +criteria = "safe-to-deploy" + [[exemptions.rand_hc]] version = "0.2.0" criteria = "safe-to-deploy" diff --git a/supply-chain/imports.lock b/supply-chain/imports.lock index 6a46c48cd7..cdd5b3c6fb 100644 --- a/supply-chain/imports.lock +++ b/supply-chain/imports.lock @@ -3074,6 +3074,18 @@ who = "Chris Fallin " criteria = "safe-to-deploy" delta = "0.3.29 -> 0.3.32" +[[audits.bytecode-alliance.audits.rand]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.10.0 -> 0.10.1" +notes = "Minor logging-based updated fixing a recent advisory for the crate." + +[[audits.bytecode-alliance.audits.rand_xorshift]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.3.0 -> 0.4.0" +notes = "Minor updates for a new `rand` crate version, nothing awry." + [[audits.bytecode-alliance.audits.sha1]] who = "Andrew Brown " criteria = "safe-to-deploy" @@ -3156,6 +3168,15 @@ Crate is sound, albeit leaky, and not actively malicious. Probably not the best crate to use in practice but it's suitable for testing dependencies. """ +[[audits.bytecode-alliance.audits.unarray]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +version = "0.1.4" +notes = """ +Crate is sound, albeit leaky, and not actively malicious. Probably not the best +crate to use in practice but it's suitable for testing dependencies. +""" + [[audits.bytecode-alliance.audits.vcpkg]] who = "Pat Hickey " criteria = "safe-to-deploy" @@ -4148,6 +4169,16 @@ who = "David Cook " criteria = "safe-to-deploy" version = "0.9.0" +[[audits.isrg.audits.chacha20]] +who = "David Cook " +criteria = "safe-to-deploy" +version = "0.10.0" + +[[audits.isrg.audits.cpufeatures]] +who = "David Cook " +criteria = "safe-to-deploy" +delta = "0.2.17 -> 0.3.0" + [[audits.isrg.audits.fiat-crypto]] who = "David Cook " criteria = "safe-to-deploy" @@ -4273,6 +4304,11 @@ who = "Tim Geoghegan " criteria = "safe-to-deploy" delta = "0.9.1 -> 0.9.2" +[[audits.isrg.audits.rand]] +who = "David Cook " +criteria = "safe-to-deploy" +delta = "0.9.2 -> 0.10.0" + [[audits.isrg.audits.rand_chacha]] who = "David Cook " criteria = "safe-to-deploy" diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index bd68d454e1..2eba055919 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -25,8 +25,7 @@ use std::{collections::BTreeMap, convert::Infallible}; use hex::ToHex; use itertools::Itertools; -use randomness::distributions::uniform::SampleRange; -use randomness::Rng; +use randomness::{distributions::uniform::SampleRange, Rng, RngExt as _}; pub use basic_test_time_getter::BasicTestTimeGetter; @@ -82,7 +81,7 @@ where pub fn get_random_non_ascii_alphanumeric_byte(rng: &mut impl Rng) -> u8 { for _ in 0..1000 { - let random_byte = rng.gen::(); + let random_byte = rng.random::(); if !random_byte.is_ascii_alphanumeric() { return random_byte; } @@ -95,18 +94,18 @@ pub fn random_ascii_alphanumeric_string>( rng: &mut impl Rng, range_len: R, ) -> String { - use randomness::distributions::{Alphanumeric, DistString}; + use randomness::distributions::{Alphanumeric, SampleString}; if range_len.is_empty() { return String::new(); } - let len = rng.gen_range(range_len); + let len = rng.random_range(range_len); Alphanumeric.sample_string(rng, len) } pub fn gen_text_with_non_ascii(c: u8, rng: &mut impl Rng, max_len: usize) -> Vec { assert!(!c.is_ascii_alphanumeric()); - let text_len = 1 + rng.gen::() % max_len; - let random_index_to_replace = rng.gen::() % text_len; + let text_len = rng.random_range(1..=max_len); + let random_index_to_replace = rng.random_range(0..text_len); let token_ticker: Vec = (0..text_len) .map(|idx| { if idx != random_index_to_replace { @@ -138,10 +137,10 @@ where pub fn split_value(rng: &mut impl Rng, value: u128) -> Vec { let mut numbers = vec![0, value]; - let n = rng.gen_range(0..10); + let n = rng.random_range(0..10); if value > 1 && n > 0 { - numbers.extend((0..=n).map(|_| rng.gen_range(1..value)).collect::>()); + numbers.extend((0..=n).map(|_| rng.random_range(1..value)).collect::>()); numbers.sort(); } @@ -239,7 +238,7 @@ mod tests { assert_eq!(vec![0], split_value(&mut rng, 0)); assert_eq!(vec![1], split_value(&mut rng, 1)); - let value = rng.gen::(); + let value = rng.random::(); let result = split_value(&mut rng, value); assert_eq!(value, result.iter().sum()); } diff --git a/test-utils/src/random.rs b/test-utils/src/random.rs index 7b59266462..6275c0ba9e 100644 --- a/test-utils/src/random.rs +++ b/test-utils/src/random.rs @@ -13,23 +13,24 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::{num::ParseIntError, str::FromStr}; +use std::{convert::Infallible, num::ParseIntError, str::FromStr}; use rand_chacha::ChaChaRng; -use randomness::SliceRandom as _; -pub use randomness::{self, seq::IteratorRandom, CryptoRng, Rng, RngCore, SeedableRng}; +use randomness::{rand_core_utils, IndexedRandom as _, TryCryptoRng, TryRng}; + +pub use randomness::{self, seq::IteratorRandom, CryptoRng, Rng, RngExt, SeedableRng}; #[derive(Debug, Copy, Clone)] pub struct Seed(pub u64); impl Seed { pub fn from_entropy() -> Self { - Seed(randomness::make_true_rng().gen::()) + Seed(randomness::make_true_rng().random::()) } pub fn from_entropy_and_print(test_name: &str) -> Self { - let result = Seed(randomness::make_true_rng().gen::()); + let result = Seed(randomness::make_true_rng().random::()); result.print_with_decoration(test_name); result } @@ -62,9 +63,9 @@ impl From for Seed { } } -impl randomness::distributions::Distribution for randomness::distributions::Standard { +impl randomness::distributions::Distribution for randomness::distributions::StandardUniform { fn sample(&self, rng: &mut R) -> Seed { - let new_seed = rng.gen::(); + let new_seed = rng.random::(); Seed::from_u64(new_seed) } } @@ -77,8 +78,8 @@ impl TestRng { Self(ChaChaRng::seed_from_u64(seed.as_u64())) } - pub fn random(rng: &mut (impl Rng + CryptoRng)) -> Self { - Self::new(Seed(rng.gen())) + pub fn random(rng: &mut impl CryptoRng) -> Self { + Self::new(Seed(rng.random())) } pub fn from_entropy() -> Self { @@ -86,28 +87,26 @@ impl TestRng { } } -impl RngCore for TestRng { - fn next_u32(&mut self) -> u32 { - self.0.next_u32() - } +impl TryRng for TestRng { + type Error = Infallible; - fn next_u64(&mut self) -> u64 { - self.0.next_u64() + fn try_next_u32(&mut self) -> Result { + self.0.try_next_u32() } - fn fill_bytes(&mut self, dest: &mut [u8]) { - self.0.fill_bytes(dest) + fn try_next_u64(&mut self) -> Result { + self.0.try_next_u64() } - fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand_chacha::rand_core::Error> { + fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Self::Error> { self.0.try_fill_bytes(dest) } } -impl CryptoRng for TestRng {} +impl TryCryptoRng for TestRng {} #[must_use] -pub fn make_seedable_rng(seed: Seed) -> impl Rng + CryptoRng { +pub fn make_seedable_rng(seed: Seed) -> impl CryptoRng { TestRng::new(seed) } @@ -120,7 +119,7 @@ pub fn shuffle_until_different(slice: &mut [T], rng: &mut (impl Rng + ?Sized) let mut swapped = false; for i in (1..slice.len()).rev() { - let other_idx = rng.gen_range(0..(i + 1)); + let other_idx = rng.random_range(0..(i + 1)); if other_idx != i { slice.swap(i, other_idx); swapped = true; @@ -138,8 +137,8 @@ pub fn shuffle_until_different(slice: &mut [T], rng: &mut (impl Rng + ?Sized) pub fn flip_random_bit(data: &mut [u8], rng: &mut (impl Rng + ?Sized)) { assert!(!data.is_empty()); - let byte_idx = rng.gen_range(0..data.len()); - let bit_idx = rng.gen_range(0..8); + let byte_idx = rng.random_range(0..data.len()); + let bit_idx = rng.random_range(0..8); let bit_mask = (1 << bit_idx) as u8; let byte = &mut data[byte_idx]; @@ -153,7 +152,7 @@ pub fn with_random_bit_flipped(data: &[u8], rng: &mut (impl Rng + ?Sized)) -> Ve } pub fn gen_random_bytes(rng: &mut (impl Rng + ?Sized), min_len: usize, max_len: usize) -> Vec { - let data_length = rng.gen_range(min_len..=max_len); + let data_length = rng.random_range(min_len..=max_len); let mut bytes = vec![0; data_length]; rng.fill_bytes(&mut bytes); bytes @@ -165,9 +164,9 @@ pub fn gen_random_alnum_string( min_len: usize, max_len: usize, ) -> String { - let len = rng.gen_range(min_len..=max_len); + let len = rng.random_range(min_len..=max_len); - rng.sample_iter::(randomness::distributions::Standard) + rng.sample_iter::(randomness::distributions::StandardUniform) .filter(|ch| ch.is_alphanumeric()) .take(len) .collect() @@ -187,8 +186,8 @@ pub fn gen_random_spaces( '\u{2029}', // paragraph separator '\u{3000}', // ideographic space ]; - let count = rng.gen_range(min_count..=max_count); - SPACES.choose_multiple(rng, count).copied() + let count = rng.random_range(min_count..=max_count); + SPACES.sample(rng, count).copied() } /// Collect the strings from the passed iterator into a single string, surrounding them with @@ -210,6 +209,38 @@ pub fn collect_string_with_random_spaces<'a>( result } +// This is a replacement for `rand::rngs::mock::StepRng`, which was deprecated in rand 0.9.x and +// removed in 0.10.x. +#[derive(Debug, Clone)] +pub struct StepRng { + initial: u64, + increment: u64, +} + +impl StepRng { + pub fn new(initial: u64, increment: u64) -> Self { + StepRng { initial, increment } + } +} + +impl TryRng for StepRng { + type Error = std::convert::Infallible; + + fn try_next_u32(&mut self) -> Result { + self.try_next_u64().map(|val| val as u32) + } + + fn try_next_u64(&mut self) -> Result { + let result = self.initial; + self.initial = self.initial.wrapping_add(self.increment); + Ok(result) + } + + fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Self::Error> { + rand_core_utils::fill_bytes_via_next_word(dest, || self.try_next_u64()) + } +} + #[cfg(test)] mod tests { use regex::Regex; @@ -240,7 +271,7 @@ mod tests { fn flip_random_bit_test(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let data: Vec = (1..20).map(|_| rng.gen()).collect(); + let data: Vec = (1..20).map(|_| rng.random()).collect(); let data_with_flipped_bit = with_random_bit_flipped(&data, &mut rng); assert_eq!(data.len(), data_with_flipped_bit.len()); assert_ne!(data, data_with_flipped_bit); diff --git a/test-utils/src/test_dir.rs b/test-utils/src/test_dir.rs index 996b3eaafa..87cfaf2595 100644 --- a/test-utils/src/test_dir.rs +++ b/test-utils/src/test_dir.rs @@ -28,14 +28,14 @@ use std::{ }; use crate::random::Seed; -use randomness::Rng; +use randomness::RngExt; fn backoff_delays(seed: Seed) -> impl Iterator { // Random exponential backoff starting at 1ms with max 10 attempts let mut rng = crate::random::make_seedable_rng(seed); let mut delay = Duration::from_millis(1); std::iter::from_fn(move || { - let item = rng.gen_range(Duration::ZERO..delay); + let item = rng.random_range(Duration::ZERO..delay); delay *= 2; Some(item) }) @@ -87,8 +87,8 @@ impl TestRoot { // Create the top-level directory if it does not exist already fs::create_dir_all(top_path.as_ref())?; - for delay in backoff_delays(Seed::from_u64(rng.gen())) { - let path = top_path.as_ref().join(format!("run_{:08x}", rng.gen::())); + for delay in backoff_delays(Seed::from_u64(rng.random())) { + let path = top_path.as_ref().join(format!("run_{:08x}", rng.random::())); // Attempt to create the candidate directory match try_create_dir(&path)? { diff --git a/test-utils/src/token_utils.rs b/test-utils/src/token_utils.rs index ca5eb72000..96dcd90582 100644 --- a/test-utils/src/token_utils.rs +++ b/test-utils/src/token_utils.rs @@ -27,12 +27,12 @@ use common::{ primitives::{amount, Amount}, }; use crypto::key::{KeyKind, PrivateKey}; -use randomness::{seq::IteratorRandom as _, CryptoRng, Rng}; +use randomness::{seq::IteratorRandom as _, CryptoRng, Rng, RngExt as _}; use serialization::extras::non_empty_vec::DataOrNoVec; use crate::random_ascii_alphanumeric_string; -pub fn random_creator(rng: &mut (impl Rng + CryptoRng)) -> TokenCreator { +pub fn random_creator(rng: &mut impl CryptoRng) -> TokenCreator { let (_, public_key) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); TokenCreator::from(public_key) } @@ -44,8 +44,8 @@ pub fn random_token_issuance(chain_config: &ChainConfig, rng: &mut impl Rng) -> TokenIssuanceV0 { token_ticker: random_ascii_alphanumeric_string(rng, 1..max_ticker_len).as_bytes().to_vec(), - amount_to_issue: Amount::from_atoms(rng.gen_range(1..u128::MAX)), - number_of_decimals: rng.gen_range(1..max_dec_count), + amount_to_issue: Amount::from_atoms(rng.random_range(1..u128::MAX)), + number_of_decimals: rng.random_range(1..max_dec_count), metadata_uri: random_ascii_alphanumeric_string(rng, 1..max_uri_len).as_bytes().to_vec(), } } @@ -63,14 +63,14 @@ pub fn random_token_issuance_v1_with_min_supply( let supply = match TokenTotalSupplyTag::iter().choose(rng).expect("cannot fail") { TokenTotalSupplyTag::Fixed => { let max_supply = std::cmp::max(min_supply * 2, 1_000_000); - let supply = Amount::from_atoms(rng.gen_range(min_supply..=max_supply)); + let supply = Amount::from_atoms(rng.random_range(min_supply..=max_supply)); TokenTotalSupply::Fixed(supply) } TokenTotalSupplyTag::Lockable => TokenTotalSupply::Lockable, TokenTotalSupplyTag::Unlimited => TokenTotalSupply::Unlimited, }; - let is_freezable = if rng.gen::() { + let is_freezable = if rng.random::() { IsTokenFreezable::Yes } else { IsTokenFreezable::No @@ -78,7 +78,7 @@ pub fn random_token_issuance_v1_with_min_supply( TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(rng, 1..max_ticker_len).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..max_dec_count), + number_of_decimals: rng.random_range(1..max_dec_count), metadata_uri: random_ascii_alphanumeric_string(rng, 1..max_uri_len).as_bytes().to_vec(), total_supply: supply, is_freezable, @@ -94,10 +94,7 @@ pub fn random_token_issuance_v1( random_token_issuance_v1_with_min_supply(chain_config, authority, 1, rng) } -pub fn random_nft_issuance( - chain_config: &ChainConfig, - rng: &mut (impl Rng + CryptoRng), -) -> NftIssuanceV0 { +pub fn random_nft_issuance(chain_config: &ChainConfig, rng: &mut impl CryptoRng) -> NftIssuanceV0 { let max_desc_len = chain_config.token_max_description_len(); let max_name_len = chain_config.token_max_name_len(); let max_ticker_len = chain_config.token_max_ticker_len(); diff --git a/tokens-accounting/src/operations.rs b/tokens-accounting/src/operations.rs index 8100586a8a..cdecceacc8 100644 --- a/tokens-accounting/src/operations.rs +++ b/tokens-accounting/src/operations.rs @@ -13,6 +13,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use strum::EnumCount; + use accounting::DataDeltaUndo; use common::{ chain::{ @@ -21,9 +23,8 @@ use common::{ }, primitives::{Amount, H256}, }; -use randomness::Rng; +use randomness::{Rng, RngExt as _}; use serialization::{Decode, Encode}; -use strum::EnumCount; use crate::{data::TokenData, error::Result}; @@ -98,7 +99,7 @@ pub enum TokenAccountingUndo { pub fn random_undo_for_test(rng: &mut impl Rng) -> TokenAccountingUndo { let id: TokenId = H256::random_using(rng).into(); - let amount_to_add = Amount::from_atoms(rng.gen_range(0..100_000)); + let amount_to_add = Amount::from_atoms(rng.random_range(0..100_000)); // TODO: return other undo types TokenAccountingUndo::MintTokens(MintTokenUndo { id, amount_to_add }) diff --git a/tokens-accounting/src/tests/operations_tests.rs b/tokens-accounting/src/tests/operations_tests.rs index 914157ae5c..1356adf77d 100644 --- a/tokens-accounting/src/tests/operations_tests.rs +++ b/tokens-accounting/src/tests/operations_tests.rs @@ -15,6 +15,8 @@ use std::collections::BTreeMap; +use rstest::rstest; + use common::{ chain::{ tokens::{ @@ -25,8 +27,7 @@ use common::{ }, primitives::Amount, }; -use randomness::Rng; -use rstest::rstest; +use randomness::{Rng, RngExt as _}; use test_utils::{ random::{make_seedable_rng, Seed}, random_ascii_alphanumeric_string, @@ -40,7 +41,7 @@ use crate::{ fn make_token_data(rng: &mut impl Rng, supply: TokenTotalSupply, locked: bool) -> TokenData { TokenData::FungibleToken(FungibleTokenData::new_unchecked( random_ascii_alphanumeric_string(rng, 1..5).as_bytes().to_vec(), - rng.gen_range(1..18), + rng.random_range(1..18), random_ascii_alphanumeric_string(rng, 1..1024).as_bytes().to_vec(), supply, locked, @@ -56,7 +57,7 @@ fn make_token_issuance( ) -> TokenIssuance { TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(rng, 1..5).as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(rng, 1..1024).as_bytes().to_vec(), total_supply: supply, is_freezable: freezable, @@ -180,7 +181,7 @@ fn mint_token_and_flush(#[case] seed: Seed) { let token_data = make_token_data(&mut rng, TokenTotalSupply::Unlimited, false); let token_id = TokenId::random_using(&mut rng); - let amount_to_mint = Amount::from_atoms(rng.gen_range(1..1000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(1..1000)); let mut storage = InMemoryTokensAccounting::from_values( BTreeMap::from_iter([(token_id, token_data.clone())]), @@ -256,7 +257,7 @@ fn mint_token_unlimited_max(#[case] seed: Seed) { fn mint_token_multiple_times_and_over_supply(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let total_supply = Amount::from_atoms(rng.gen_range(100..100_000)); + let total_supply = Amount::from_atoms(rng.random_range(100..100_000)); let token_data = make_token_data(&mut rng, TokenTotalSupply::Fixed(total_supply), false); let token_id = TokenId::random_using(&mut rng); @@ -283,7 +284,7 @@ fn mint_token_multiple_times_and_over_supply(#[case] seed: Seed) { ); // Try to mint over total supply - let exceed_supply_by = Amount::from_atoms(rng.gen_range(1..100)); + let exceed_supply_by = Amount::from_atoms(rng.random_range(1..100)); assert_eq!( cache.mint_tokens(token_id, exceed_supply_by), Err(crate::Error::MintExceedsSupplyLimit( @@ -302,7 +303,7 @@ fn mint_token_undo(#[case] seed: Seed) { let token_data = make_token_data(&mut rng, TokenTotalSupply::Unlimited, false); let token_id = TokenId::random_using(&mut rng); - let amount_to_mint = Amount::from_atoms(rng.gen_range(1..1000)); + let amount_to_mint = Amount::from_atoms(rng.random_range(1..1000)); let storage = InMemoryTokensAccounting::from_values( BTreeMap::from_iter([(token_id, token_data.clone())]), @@ -342,8 +343,8 @@ fn unmint_token_and_flush(#[case] seed: Seed) { let token_data = make_token_data(&mut rng, TokenTotalSupply::Unlimited, false); let token_id = TokenId::random_using(&mut rng); - let amount_to_mint = Amount::from_atoms(rng.gen_range(2..1000)); - let amount_to_unmint = Amount::from_atoms(rng.gen_range(1..amount_to_mint.into_atoms())); + let amount_to_mint = Amount::from_atoms(rng.random_range(2..1000)); + let amount_to_unmint = Amount::from_atoms(rng.random_range(1..amount_to_mint.into_atoms())); let mut storage = InMemoryTokensAccounting::from_values( BTreeMap::from_iter([(token_id, token_data.clone())]), @@ -382,8 +383,8 @@ fn unmint_token_undo(#[case] seed: Seed) { let token_data = make_token_data(&mut rng, TokenTotalSupply::Unlimited, false); let token_id = TokenId::random_using(&mut rng); - let amount_to_mint = Amount::from_atoms(rng.gen_range(2..1000)); - let amount_to_unmint = Amount::from_atoms(rng.gen_range(1..amount_to_mint.into_atoms())); + let amount_to_mint = Amount::from_atoms(rng.random_range(2..1000)); + let amount_to_unmint = Amount::from_atoms(rng.random_range(1..amount_to_mint.into_atoms())); let storage = InMemoryTokensAccounting::from_values( BTreeMap::from_iter([(token_id, token_data.clone())]), @@ -421,7 +422,7 @@ fn unmint_token_undo(#[case] seed: Seed) { fn unmint_token_multiple_times_and_over_minted(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let total_supply = Amount::from_atoms(rng.gen_range(100..100_000)); + let total_supply = Amount::from_atoms(rng.random_range(100..100_000)); let token_data = make_token_data(&mut rng, TokenTotalSupply::Fixed(total_supply), false); let token_id = TokenId::random_using(&mut rng); let amount_minted = total_supply; @@ -459,7 +460,7 @@ fn unmint_token_multiple_times_and_over_minted(#[case] seed: Seed) { ); // Try to unmint over circulating supply - let exceed_minted_by = Amount::from_atoms(rng.gen_range(1..100)); + let exceed_minted_by = Amount::from_atoms(rng.random_range(1..100)); assert_eq!( cache.unmint_tokens(token_id, exceed_minted_by), Err(crate::Error::NotEnoughCirculatingSupplyToUnmint( @@ -552,8 +553,8 @@ fn lock_supply_and_try_mint_unmint(#[case] seed: Seed) { let token_data = make_token_data(&mut rng, TokenTotalSupply::Lockable, false); let token_id = TokenId::random_using(&mut rng); - let amount_to_mint = Amount::from_atoms(rng.gen_range(2..1000)); - let amount_to_unmint = Amount::from_atoms(rng.gen_range(1..amount_to_mint.into_atoms())); + let amount_to_mint = Amount::from_atoms(rng.random_range(2..1000)); + let amount_to_unmint = Amount::from_atoms(rng.random_range(1..amount_to_mint.into_atoms())); let storage = InMemoryTokensAccounting::from_values( BTreeMap::from_iter([(token_id, token_data.clone())]), @@ -590,8 +591,8 @@ fn lock_supply_undo_mint_unmint(#[case] seed: Seed) { let token_data = make_token_data(&mut rng, TokenTotalSupply::Lockable, false); let token_id = TokenId::random_using(&mut rng); - let amount_to_mint = Amount::from_atoms(rng.gen_range(2..1000)); - let amount_to_unmint = Amount::from_atoms(rng.gen_range(1..amount_to_mint.into_atoms())); + let amount_to_mint = Amount::from_atoms(rng.random_range(2..1000)); + let amount_to_unmint = Amount::from_atoms(rng.random_range(1..amount_to_mint.into_atoms())); let storage = InMemoryTokensAccounting::from_values( BTreeMap::from_iter([(token_id, token_data.clone())]), diff --git a/utils/Cargo.toml b/utils/Cargo.toml index ebf94e9d19..2173f3ab73 100644 --- a/utils/Cargo.toml +++ b/utils/Cargo.toml @@ -16,6 +16,7 @@ anyhow.workspace = true clap = { workspace = true, features = ["env", "string", "derive"] } directories.workspace = true fix-hidden-lifetime-bug.workspace = true +fixed-hash.workspace = true heck.workspace = true num-traits.workspace = true parity-scale-codec.workspace = true @@ -41,6 +42,7 @@ loom.workspace = true [features] tokio-console = ["logging/tokio-console"] +dev = [] # used by fixed-hash [[bench]] name = "benches" diff --git a/utils/src/bloom_filters/bloom_filter.rs b/utils/src/bloom_filters/bloom_filter.rs index 5f23c5ae90..4577b9dc2e 100644 --- a/utils/src/bloom_filters/bloom_filter.rs +++ b/utils/src/bloom_filters/bloom_filter.rs @@ -16,7 +16,8 @@ use std::{fmt::Debug, hash::Hash}; use probabilistic_collections::SipHasherBuilder; -use randomness::Rng; + +use randomness::{Rng, RngExt as _}; /// A space-efficient probabilistic data structure to test for membership in a set. pub struct BloomFilter(probabilistic_collections::bloom::BloomFilter); @@ -32,8 +33,8 @@ impl BloomFilter { size, fpp, [ - SipHasherBuilder::from_seed(rng.gen(), rng.gen()), - SipHasherBuilder::from_seed(rng.gen(), rng.gen()), + SipHasherBuilder::from_seed(rng.random(), rng.random()), + SipHasherBuilder::from_seed(rng.random(), rng.random()), ], ), ) diff --git a/utils/src/bloom_filters/tests.rs b/utils/src/bloom_filters/tests.rs index 91f358cc7a..7ff20e782b 100644 --- a/utils/src/bloom_filters/tests.rs +++ b/utils/src/bloom_filters/tests.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use randomness::Rng; +use randomness::RngExt; use test_utils::random::Seed; use super::rolling_bloom_filter::RollingBloomFilter; @@ -29,7 +29,7 @@ fn test_rolling_bloom_filter(#[case] seed: Seed) { filter.insert(&i, &mut rng); // Last 100 must be remembered, select random number from all recently added - let num = rng.gen_range((i.saturating_sub(99))..=i); + let num = rng.random_range((i.saturating_sub(99))..=i); assert!(filter.contains(&num), "not found {num}, i: {i}"); } @@ -59,7 +59,7 @@ fn test_rolling_bloom_filter_2(#[case] seed: Seed) { filter.insert(&i, &mut rng); // Last 1000 must be remembered, select random number from all recently added - let num = rng.gen_range((i.saturating_sub(999))..=i); + let num = rng.random_range((i.saturating_sub(999))..=i); assert!(filter.contains(&num), "not found {num}, i: {i}"); } diff --git a/utils/src/default_data_dir.rs b/utils/src/default_data_dir.rs index a3c6c328ea..2b7084e740 100644 --- a/utils/src/default_data_dir.rs +++ b/utils/src/default_data_dir.rs @@ -86,7 +86,7 @@ pub fn prepare_data_dir PathBuf>( mod test { use std::io::{Read, Write}; - use randomness::{make_pseudo_rng, Rng}; + use randomness::{make_pseudo_rng, RngExt as _}; use tempfile::TempDir; use super::*; @@ -128,7 +128,7 @@ mod test { // Now let's use the data directory let file_path = supposed_default_dir.join("SomeFile.txt"); - let file_data: Vec = (0..1024).map(|_| make_pseudo_rng().gen::()).collect(); + let file_data: Vec = (0..1024).map(|_| make_pseudo_rng().random::()).collect(); { let mut file = std::fs::File::create(&file_path).unwrap(); file.write_all(&file_data).unwrap(); @@ -222,7 +222,7 @@ mod test { // Now let's use the data directory let file_path = supposed_custom_dir.join("SomeFile.txt"); - let file_data: Vec = (0..1024).map(|_| make_pseudo_rng().gen::()).collect(); + let file_data: Vec = (0..1024).map(|_| make_pseudo_rng().random::()).collect(); { let mut file = std::fs::File::create(&file_path).unwrap(); file.write_all(&file_data).unwrap(); diff --git a/utils/src/exp_rand/mod.rs b/utils/src/exp_rand/mod.rs index 72d88b7b2a..5f92d27b7e 100644 --- a/utils/src/exp_rand/mod.rs +++ b/utils/src/exp_rand/mod.rs @@ -13,13 +13,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -use randomness::Rng; +use randomness::{Rng, RngExt as _}; /// Returns a value sampled from an exponential distribution with a mean of 1.0. /// /// The result will be in the range (0, max], where max = -ln(f64::MIN_POSITIVE) ~= 708.396418532264. pub fn exponential_rand(rng: &mut impl Rng) -> f64 { - let mut random_f64 = rng.gen::(); + let mut random_f64 = rng.random::(); // The generated number will be in the range [0, 1). Turn it into (0, 1) to avoid // infinity when taking the logarithm. if random_f64 == 0.0 { diff --git a/utils/src/exp_rand/test.rs b/utils/src/exp_rand/test.rs index 8f9025789d..eee2735708 100644 --- a/utils/src/exp_rand/test.rs +++ b/utils/src/exp_rand/test.rs @@ -15,9 +15,8 @@ use super::*; -use randomness::rngs::StepRng; use rstest::rstest; -use test_utils::random::{make_seedable_rng, Seed}; +use test_utils::random::{make_seedable_rng, Seed, StepRng}; #[rstest] #[trace] diff --git a/utils/src/fixed_hash.rs b/utils/src/fixed_hash.rs new file mode 100644 index 0000000000..8790305d69 --- /dev/null +++ b/utils/src/fixed_hash.rs @@ -0,0 +1,122 @@ +// Copyright (c) 2026 RBB S.r.l +// opensource@mintlayer.org +// SPDX-License-Identifier: MIT +// Licensed under the MIT License; +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://github.com/mintlayer/mintlayer-core/blob/master/LICENSE +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub use fixed_hash::construct_fixed_hash as construct_fixed_hash_orig; + +/// A macro that wraps the namesake one from `fixed_hash` (which is compiled with its `rand` feature +/// disabled) and adds custom RNG-related methods to the generated type. +/// +/// It's a temporary workaround to avoid creating an RNG adapter every time `random_using` is +/// called. Once `fixed_hash` is updated to use `rand` v0.10, this wrapper can be removed. +#[macro_export] +macro_rules! construct_fixed_hash { + ( $(#[$attr:meta])* $visibility:vis struct $name:ident ( $n_bytes:expr ); ) => { + $crate::fixed_hash::construct_fixed_hash_orig! { + $(#[$attr])* + $visibility struct $name($n_bytes); + } + + $crate::impl_rand_for_fixed_hash!($name); + } +} + +// This is basically a copy of the similar macro in the fixed_hash src, except that here we use +// RNG primitives from `randomness` and omit the `randomize` and `random` methods that would create +// a new RNG on the fly (mainly because the RNG that they were creating originally is no longer +// infallible). +#[macro_export] +#[doc(hidden)] +macro_rules! impl_rand_for_fixed_hash { + ( $name:ident ) => { + impl randomness::distributions::Distribution<$name> + for randomness::distributions::StandardUniform + { + fn sample(&self, rng: &mut R) -> $name { + use randomness::RngExt as _; + + let mut ret = $name::zero(); + for byte in ret.as_bytes_mut().iter_mut() { + *byte = rng.random(); + } + ret + } + } + + impl $name { + pub fn randomize_using(&mut self, rng: &mut R) + where + R: randomness::Rng + ?Sized, + { + use randomness::distributions::Distribution; + *self = randomness::distributions::StandardUniform.sample(rng); + } + + pub fn random_using(rng: &mut R) -> Self + where + R: randomness::Rng + ?Sized, + { + let mut ret = Self::zero(); + ret.randomize_using(rng); + ret + } + } + }; +} + +#[cfg(test)] +mod tests { + use std::collections::BTreeSet; + + use rstest::rstest; + + use randomness::RngExt as _; + use serialization::{Decode, Encode}; + use test_utils::random::{make_seedable_rng, Seed}; + + construct_fixed_hash! { + #[derive(Encode, Decode)] + pub struct TestHash(32); + } + + #[rstest] + #[trace] + #[case(Seed::from_entropy())] + fn basic_test(#[case] seed: Seed) { + let mut rng = make_seedable_rng(seed); + + // Check some basic stuff coming from the original macro. + let hash = TestHash::repeat_byte(0xAB); + assert_eq!(hash.as_bytes(), &[0xAB; 32]); + // Note: we actually want to call `clone` here, to make sure it's callable. + #[allow(clippy::clone_on_copy)] + let hash_clone = hash.clone(); + let hash_copy = hash; + assert_eq!(hash_clone, hash); + assert_eq!(hash_copy, hash); + + // Check rng calls + let random_hash1 = rng.random::(); + let random_hash2 = TestHash::random_using(&mut rng); + let random_hash3 = { + let mut random_hash = hash; + random_hash.randomize_using(&mut rng); + assert_ne!(random_hash, hash); + random_hash + }; + + let random_hashes = BTreeSet::from([random_hash1, random_hash2, random_hash3]); + assert_eq!(random_hashes.len(), 3); + } +} diff --git a/utils/src/lib.rs b/utils/src/lib.rs index 5fb21994a3..796f7651ea 100644 --- a/utils/src/lib.rs +++ b/utils/src/lib.rs @@ -33,6 +33,7 @@ pub mod ensure; pub mod env_utils; pub mod eventhandler; pub mod exp_rand; +pub mod fixed_hash; pub mod graph_traversals; pub mod iter; pub mod log_utils; diff --git a/utils/src/maybe_encrypted.rs b/utils/src/maybe_encrypted.rs index 0f2c657a09..1eb64112a4 100644 --- a/utils/src/maybe_encrypted.rs +++ b/utils/src/maybe_encrypted.rs @@ -107,7 +107,7 @@ impl MaybeEncrypted { #[cfg(test)] mod tests { use crypto::symkey::SymmetricKeyKind; - use randomness::Rng; + use randomness::RngExt; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; @@ -134,7 +134,7 @@ mod tests { #[case(Seed::from_entropy())] fn test_new_plain_and_back_decrypted_error(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let value = rng.gen::(); + let value = rng.random::(); let maybe_encrypted = MaybeEncrypted::new(&value, &None); let key = SymmetricKey::new(SymmetricKeyKind::XChacha20Poly1305, &mut rng); @@ -148,7 +148,7 @@ mod tests { #[case(Seed::from_entropy())] fn test_new_encrypted_and_back(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let value = rng.gen::(); + let value = rng.random::(); let key = SymmetricKey::new(SymmetricKeyKind::XChacha20Poly1305, &mut rng); let key = Some(key); let maybe_encrypted = MaybeEncrypted::new(&value, &key); @@ -161,7 +161,7 @@ mod tests { #[case(Seed::from_entropy())] fn test_new_encrypted_and_back_no_key_error(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let value = rng.gen::(); + let value = rng.random::(); let key = SymmetricKey::new(SymmetricKeyKind::XChacha20Poly1305, &mut rng); let key = Some(key); let maybe_encrypted = MaybeEncrypted::new(&value, &key); @@ -174,7 +174,7 @@ mod tests { #[case(Seed::from_entropy())] fn test_new_encrypted_and_back_different_key_error(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let value = rng.gen::(); + let value = rng.random::(); let key = SymmetricKey::new(SymmetricKeyKind::XChacha20Poly1305, &mut rng); let key = Some(key); let maybe_encrypted = MaybeEncrypted::new(&value, &key); @@ -193,9 +193,9 @@ mod tests { #[case(Seed::from_entropy())] fn test_wrong_encode_decode(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let value = rng.gen::(); + let value = rng.random::(); - let optional_key = if rng.gen::() { + let optional_key = if rng.random::() { Some(SymmetricKey::new( SymmetricKeyKind::XChacha20Poly1305, &mut rng, diff --git a/utxo/src/storage/test.rs b/utxo/src/storage/test.rs index 0ff8300ac7..ae121e5434 100644 --- a/utxo/src/storage/test.rs +++ b/utxo/src/storage/test.rs @@ -31,13 +31,13 @@ use common::{ primitives::{BlockHeight, Id, Idable, H256}, }; use itertools::Itertools; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use rstest::rstest; use std::collections::BTreeMap; use test_utils::random::{make_seedable_rng, Seed}; fn create_transactions( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, inputs: Vec, max_num_of_outputs: usize, num_of_txs: usize, @@ -50,7 +50,7 @@ fn create_transactions( .chunks(input_size) .map(|inputs| { let outputs = if max_num_of_outputs > 1 { - let rnd = rng.gen_range(1..max_num_of_outputs); + let rnd = rng.random_range(1..max_num_of_outputs); create_tx_outputs(rng, rnd as u32) } else { vec![] @@ -67,7 +67,7 @@ fn create_transactions( } fn create_block( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, prev_block_id: Id, inputs: Vec, max_num_of_outputs: usize, @@ -87,7 +87,7 @@ fn create_block( /// populate the db with random values, for testing. /// returns a tuple of the best block id and the outpoints (for spending) fn initialize_db( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, tx_outputs_size: u32, ) -> (UtxosDBInMemoryImpl, Vec) { let best_block_id: Id = Id::new(H256::random_using(rng)); @@ -113,7 +113,7 @@ fn initialize_db( } fn create_utxo_entries( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, num_of_utxos: u8, ) -> BTreeMap { let mut map = BTreeMap::new(); @@ -273,7 +273,7 @@ fn try_spend_tx_with_no_outputs(#[case] seed: Seed) { let (db_impl, _) = initialize_db(&mut rng, tx_outputs_size); let db = UtxosDB::new(&db_impl); - let tx_inputs: Vec = (0..rng.gen_range(num_of_txs..20)) + let tx_inputs: Vec = (0..rng.random_range(num_of_txs..20)) .map(|i| { let id: Id = Id::new(H256::random_using(&mut rng)); let id = OutPointSourceId::BlockReward(id); @@ -316,7 +316,7 @@ fn test_batch_write(#[case] seed: Seed) { // randomly get a key for checking let keys = utxos.container.keys().collect_vec(); - let key_index = rng.gen_range(0..keys.len()); + let key_index = rng.random_range(0..keys.len()); let outpoint = keys[key_index].clone(); // test the get_utxo diff --git a/utxo/src/tests/mod.rs b/utxo/src/tests/mod.rs index 29c7ede10a..5499f90aa8 100644 --- a/utxo/src/tests/mod.rs +++ b/utxo/src/tests/mod.rs @@ -37,7 +37,7 @@ use common::{ primitives::{Amount, BlockHeight, Compact, Id, Idable, H256}, }; use crypto::vrf::VRFKeyKind; -use randomness::{seq, CryptoRng, Rng}; +use randomness::{seq, CryptoRng, Rng, RngExt as _}; use test_utils::{ random::{make_seedable_rng, Seed}, UnwrapInfallible as _, @@ -79,7 +79,7 @@ fn make_create_delegation_output() -> TxOutput { /// `result_flags` - the result ( dirty/not, fresh/not ) after calling the `add_utxo` method. /// `op_result` - the result of calling `add_utxo` method, whether it succeeded or not. fn check_add_utxo( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, cache_presence: Presence, cache_flags: Option<(IsFresh, IsDirty)>, possible_overwrite: bool, @@ -112,7 +112,7 @@ fn check_add_utxo( /// `cache_flags` - The flags of a utxo entry in a cache. /// `result_flags` - the result ( dirty/not, fresh/not ) after performing `spend_utxo`. fn check_spend_utxo( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, parent_presence: Presence, cache_presence: Presence, cache_flags: Option<(IsFresh, IsDirty)>, @@ -176,7 +176,7 @@ fn check_spend_utxo( /// `result` - The result of the parent after performing the `batch_write`. /// `result_flags` - the pair of `result`, indicating whether it is dirty/not, fresh/not or nothing at all. fn check_write_utxo( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, parent_presence: Presence, child_presence: Presence, result: Result, @@ -238,7 +238,7 @@ fn check_write_utxo( /// Checks the `get_mut_utxo` method behavior. fn check_get_mut_utxo( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, parent_presence: Presence, cache_presence: Presence, result_presence: Presence, @@ -916,10 +916,10 @@ fn check_tx_spend_undo_spend_from_account(#[case] seed: Seed) { // spend from an account in a transaction let input = TxInput::from_account( - AccountNonce::new(rng.gen()), + AccountNonce::new(rng.random()), AccountSpending::DelegationBalance( DelegationId::new(H256::random_using(&mut rng)), - Amount::from_atoms(rng.gen()), + Amount::from_atoms(rng.random()), ), ); let tx = Transaction::new(0x00, vec![input], create_tx_outputs(&mut rng, 1)).unwrap(); diff --git a/utxo/src/tests/simulation.rs b/utxo/src/tests/simulation.rs index a331792e7e..f35f6bbc4a 100644 --- a/utxo/src/tests/simulation.rs +++ b/utxo/src/tests/simulation.rs @@ -18,7 +18,7 @@ use std::convert::Infallible; use rstest::rstest; use common::chain::UtxoOutPoint; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use test_utils::{ random::{make_seedable_rng, Seed}, UnwrapInfallible as _, @@ -74,7 +74,7 @@ fn cache_simulation_test( /// 5. Flush the child into current cache /// 6. Consume the current cache, and return it fn simulation_step>( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, all_outputs: &mut Vec, parent_cache: &UtxosCache

, iterations_per_cache: usize, @@ -114,7 +114,7 @@ fn simulation_step>( // Perform random modification on a cache (add new, spend existing, uncache), tracking the coverage fn populate_cache>( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, cache: &mut UtxosCache

, iterations_count: usize, prev_result: &[UtxoOutPoint], @@ -130,15 +130,15 @@ fn populate_cache>( for i in 0..iterations_count { //select outpoint and utxo from existing or create new - let flip = rng.gen_range(0..3); + let flip = rng.random_range(0..3); let (outpoint, utxo) = if flip == 0 && prev_result.len() > 1 { - let outpoint_idx = rng.gen_range(0..prev_result.len()); + let outpoint_idx = rng.random_range(0..prev_result.len()); (prev_result[outpoint_idx].clone(), None) } else if flip == 1 && result.len() > 1 { - let outpoint_idx = rng.gen_range(0..result.len()); + let outpoint_idx = rng.random_range(0..result.len()); (result[outpoint_idx].clone(), None) } else { - let block_height = rng.gen_range(0..iterations_count); + let block_height = rng.random_range(0..iterations_count); let (utxo, outpoint) = create_utxo(rng, block_height.try_into().unwrap()); result.push(outpoint.clone()); @@ -150,18 +150,18 @@ fn populate_cache>( assert!(cache.spend_utxo(&outpoint).is_ok()); spent_an_entry = true; } else if utxo.is_some() { - let possible_overwrite = rng.gen::(); + let possible_overwrite = rng.random::(); assert!(cache.add_utxo(&outpoint, utxo.unwrap(), possible_overwrite).is_ok()); added_an_entry = true; } // every 10 iterations call uncache if i % 10 == 0 { - if rng.gen::() && prev_result.len() > 1 { - let idx = rng.gen_range(0..prev_result.len()); + if rng.random::() && prev_result.len() > 1 { + let idx = rng.random_range(0..prev_result.len()); let _ = cache.uncache(&prev_result[idx]); } else if result.len() > 1 { - let idx = rng.gen_range(0..result.len()); + let idx = rng.random_range(0..result.len()); let _ = cache.uncache(&result[idx]); } removed_an_entry = true; diff --git a/utxo/src/tests/simulation_with_undo.rs b/utxo/src/tests/simulation_with_undo.rs index f50e1833fa..de2f39c5ab 100644 --- a/utxo/src/tests/simulation_with_undo.rs +++ b/utxo/src/tests/simulation_with_undo.rs @@ -21,7 +21,7 @@ use common::{ chain::{block::BlockReward, OutPointSourceId, Transaction, TxInput, UtxoOutPoint}, primitives::{BlockHeight, Id, Idable, H256}, }; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use test_utils::{ random::{make_seedable_rng, Seed}, UnwrapInfallible as _, @@ -91,7 +91,7 @@ fn cache_simulation_with_undo( /// 5. Flush the child into current cache /// 6. Consume the current cache, and return it fn simulation_step>( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, all_outputs: &mut ResultWithUndo, parent_cache: &UtxosCache

, iterations_per_cache: usize, @@ -133,7 +133,7 @@ fn simulation_step>( } fn populate_cache_with_undo>( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, cache: &mut UtxosCache

, iterations_count: usize, prev_result: &mut ResultWithUndo, @@ -142,13 +142,13 @@ fn populate_cache_with_undo>( let mut result: ResultWithUndo = Default::default(); for _ in 0..iterations_count { - let i = rng.gen_range(0..usize::MAX); + let i = rng.random_range(0..usize::MAX); // create new utxo if i % 20 < 19 { //create utxo from block reward if i % 20 < 10 { let reward = BlockReward::new(create_tx_outputs(rng, 1)); - let block_height = BlockHeight::new(rng.gen_range(0..iterations_count as u64)); + let block_height = BlockHeight::new(rng.random_range(0..iterations_count as u64)); let block_id = Id::new(H256::random_using(rng)); cache .add_utxos_from_block_reward( @@ -165,12 +165,12 @@ fn populate_cache_with_undo>( //spend random utxo in a transaction //get random outpoint from existing outpoints - let outpoint = if rng.gen::() && !prev_result.utxo_outpoints.is_empty() { - let outpoint_idx = rng.gen_range(0..prev_result.utxo_outpoints.len()); + let outpoint = if rng.random::() && !prev_result.utxo_outpoints.is_empty() { + let outpoint_idx = rng.random_range(0..prev_result.utxo_outpoints.len()); //this outpoint will be spent so remove strait away prev_result.utxo_outpoints.remove(outpoint_idx) } else if !result.utxo_outpoints.is_empty() { - let outpoint_idx = rng.gen_range(0..result.utxo_outpoints.len()); + let outpoint_idx = rng.random_range(0..result.utxo_outpoints.len()); //this outpoint will be spent so remove strait away result.utxo_outpoints.remove(outpoint_idx) } else { @@ -182,7 +182,7 @@ fn populate_cache_with_undo>( let tx = Transaction::new(0x00, vec![input], create_tx_outputs(rng, 1)).unwrap(); //spent the transaction - let block_height = BlockHeight::new(rng.gen_range(0..iterations_count as u64)); + let block_height = BlockHeight::new(rng.random_range(0..iterations_count as u64)); let undo = cache.connect_transaction(&tx, UtxoSource::Blockchain(block_height)).unwrap(); @@ -200,7 +200,7 @@ fn populate_cache_with_undo>( } else if !result.outpoints_with_undo.is_empty() { //undo random transaction spending from current utxo set - let idx = rng.gen_range(0..result.utxo_outpoints.len()); + let idx = rng.random_range(0..result.utxo_outpoints.len()); let outpoint = result.utxo_outpoints.remove(idx); //spend new utxo diff --git a/utxo/src/tests/test_helper.rs b/utxo/src/tests/test_helper.rs index b2096c36d7..974052e29d 100644 --- a/utxo/src/tests/test_helper.rs +++ b/utxo/src/tests/test_helper.rs @@ -15,10 +15,8 @@ use std::convert::Infallible; -use crate::{ - utxo_entry::{IsDirty, IsFresh, UtxoEntry}, - Utxo, UtxosCache, UtxosView, -}; +use itertools::Itertools; + use common::{ chain::{ output_value::OutputValue, Destination, GenBlock, OutPointSourceId, Transaction, TxInput, @@ -27,9 +25,12 @@ use common::{ primitives::{Amount, BlockHeight, Id, H256}, }; use crypto::key::{KeyKind, PrivateKey}; -use itertools::Itertools; -use randomness::{seq, CryptoRng, Rng}; +use randomness::{seq, CryptoRng, Rng, RngExt as _}; +use crate::{ + utxo_entry::{IsDirty, IsFresh, UtxoEntry}, + Utxo, UtxosCache, UtxosView, +}; struct EmptyUtxosView { best_block_hash: Id, } @@ -67,10 +68,10 @@ pub enum Presence { Spent, } -pub fn create_tx_outputs(rng: &mut (impl Rng + CryptoRng), size: u32) -> Vec { +pub fn create_tx_outputs(rng: &mut impl CryptoRng, size: u32) -> Vec { let mut tx_outputs = vec![]; for _ in 0..size { - let random_amt = rng.gen_range(1..u128::MAX); + let random_amt = rng.random_range(1..u128::MAX); let (_, pub_key) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); tx_outputs.push(TxOutput::Transfer( OutputValue::Coin(Amount::from_atoms(random_amt)), @@ -108,20 +109,20 @@ pub fn convert_to_utxo( (outpoint, utxo) } -pub fn create_utxo(rng: &mut (impl Rng + CryptoRng), block_height: u64) -> (Utxo, UtxoOutPoint) { - let random_value = rng.gen_range(0..u128::MAX); +pub fn create_utxo(rng: &mut impl CryptoRng, block_height: u64) -> (Utxo, UtxoOutPoint) { + let random_value = rng.random_range(0..u128::MAX); let is_block_reward = random_value % 3 == 0; inner_create_utxo(rng, is_block_reward, Some(block_height)) } -pub fn create_utxo_for_mempool(rng: &mut (impl Rng + CryptoRng)) -> (Utxo, UtxoOutPoint) { - let random_value = rng.gen_range(0..u128::MAX); +pub fn create_utxo_for_mempool(rng: &mut impl CryptoRng) -> (Utxo, UtxoOutPoint) { + let random_value = rng.random_range(0..u128::MAX); let is_block_reward = random_value % 3 == 0; inner_create_utxo(rng, is_block_reward, None) } pub fn create_utxo_from_reward( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, block_height: u64, ) -> (Utxo, UtxoOutPoint) { inner_create_utxo(rng, true, Some(block_height)) @@ -129,12 +130,12 @@ pub fn create_utxo_from_reward( /// returns a tuple of utxo and outpoint, for testing. fn inner_create_utxo( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, is_block_reward: bool, block_height: Option, ) -> (Utxo, UtxoOutPoint) { // just a random value generated, and also a random `is_block_reward` value. - let output_value = rng.gen_range(0..u128::MAX); + let output_value = rng.random_range(0..u128::MAX); let (_, pub_key) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); let output = TxOutput::Transfer( OutputValue::Coin(Amount::from_atoms(output_value)), @@ -171,13 +172,13 @@ fn inner_create_utxo( /// `cache_flags` - sets the entry of the utxo (fresh/not, dirty/not) /// `outpoint` - optional key to be used, rather than a randomly generated one. pub fn insert_single_entry

( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, cache: &mut UtxosCache

, cache_presence: Presence, cache_flags: Option<(IsFresh, IsDirty)>, outpoint: Option, ) -> (Utxo, UtxoOutPoint) { - let rng_height = rng.gen_range(0..(u64::MAX - 1)); + let rng_height = rng.random_range(0..(u64::MAX - 1)); let (utxo, outpoint_x) = create_utxo(rng, rng_height); let outpoint = outpoint.unwrap_or(outpoint_x); let key = &outpoint; diff --git a/wallet/src/account/output_cache/tests.rs b/wallet/src/account/output_cache/tests.rs index 5cfcbfef66..2dcc368b4e 100644 --- a/wallet/src/account/output_cache/tests.rs +++ b/wallet/src/account/output_cache/tests.rs @@ -29,7 +29,7 @@ use common::{ AccountOutPoint, ChainstateUpgradeBuilder, OrderData, TokenIdGenerationVersion, }, }; -use randomness::{seq::IteratorRandom as _, Rng}; +use randomness::{seq::IteratorRandom as _, Rng, RngExt as _}; use test_utils::random::{make_seedable_rng, Seed}; use wallet_types::wallet_tx::TxStateTag; @@ -52,7 +52,7 @@ fn diamond_unconfirmed_descendants(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let chain_config = create_unit_test_config(); - let best_block_height = BlockHeight::new(rng.gen()); + let best_block_height = BlockHeight::new(rng.random()); let mut output_cache = OutputCache::empty(); // A @@ -63,11 +63,11 @@ fn diamond_unconfirmed_descendants(#[case] seed: Seed) { InputWitness::NoSignature(None), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -88,7 +88,7 @@ fn diamond_unconfirmed_descendants(#[case] seed: Seed) { empty_witness(&mut rng), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -109,7 +109,7 @@ fn diamond_unconfirmed_descendants(#[case] seed: Seed) { empty_witness(&mut rng), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -134,7 +134,7 @@ fn diamond_unconfirmed_descendants(#[case] seed: Seed) { empty_witness(&mut rng), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -185,7 +185,7 @@ fn update_conflicting_txs_parent_and_child(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let chain_config = create_unit_test_config(); - let best_block_height = BlockHeight::new(rng.gen()); + let best_block_height = BlockHeight::new(rng.random()); let mut output_cache = OutputCache::empty(); let token_id = TokenId::random_using(&mut rng); @@ -197,7 +197,7 @@ fn update_conflicting_txs_parent_and_child(#[case] seed: Seed) { InputWitness::NoSignature(None), ) .add_output(TxOutput::Transfer( - OutputValue::TokenV1(token_id, Amount::from_atoms(rng.gen())), + OutputValue::TokenV1(token_id, Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -210,7 +210,7 @@ fn update_conflicting_txs_parent_and_child(#[case] seed: Seed) { WalletTx::Tx(TxData::new( tx_a, TxState::Confirmed( - BlockHeight::new(rng.gen()), + BlockHeight::new(rng.random()), BlockTimestamp::from_int_seconds(0), 0, ), @@ -225,7 +225,7 @@ fn update_conflicting_txs_parent_and_child(#[case] seed: Seed) { empty_witness(&mut rng), ) .add_output(TxOutput::Transfer( - OutputValue::TokenV1(token_id, Amount::from_atoms(rng.gen())), + OutputValue::TokenV1(token_id, Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -246,7 +246,7 @@ fn update_conflicting_txs_parent_and_child(#[case] seed: Seed) { empty_witness(&mut rng), ) .add_output(TxOutput::Transfer( - OutputValue::TokenV1(token_id, Amount::from_atoms(rng.gen())), + OutputValue::TokenV1(token_id, Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -308,7 +308,7 @@ fn update_conflicting_txs_frozen_token_only_in_outputs(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let chain_config = create_unit_test_config(); - let best_block_height = BlockHeight::new(rng.gen()); + let best_block_height = BlockHeight::new(rng.random()); let mut output_cache = OutputCache::empty(); let token_id = TokenId::random_using(&mut rng); @@ -320,15 +320,15 @@ fn update_conflicting_txs_frozen_token_only_in_outputs(#[case] seed: Seed) { ) // Note: only coin outputs here .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -341,7 +341,7 @@ fn update_conflicting_txs_frozen_token_only_in_outputs(#[case] seed: Seed) { WalletTx::Tx(TxData::new( tx_a, TxState::Confirmed( - BlockHeight::new(rng.gen()), + BlockHeight::new(rng.random()), BlockTimestamp::from_int_seconds(0), 0, ), @@ -399,8 +399,8 @@ fn update_conflicting_txs_frozen_token_only_in_outputs(#[case] seed: Seed) { ) .add_output(TxOutput::CreateOrder(Box::new(OrderData::new( Destination::AnyoneCanSpend, - OutputValue::TokenV1(token_id, Amount::from_atoms(rng.gen())), - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::TokenV1(token_id, Amount::from_atoms(rng.random())), + OutputValue::Coin(Amount::from_atoms(rng.random())), )))) .build(); let tx_b3_id = tx_b3.transaction().get_id(); @@ -460,7 +460,7 @@ fn update_conflicting_txs_frozen_token_only_in_outputs(#[case] seed: Seed) { fn token_id_in_add_tx(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let fork_height = BlockHeight::new(rng.gen_range(1000..1_000_000)); + let fork_height = BlockHeight::new(rng.random_range(1000..1_000_000)); let chain_config = create_unit_test_config_builder() .chainstate_upgrades( common::chain::NetUpgrades::initialize(vec![ @@ -485,10 +485,10 @@ fn token_id_in_add_tx(#[case] seed: Seed) { let tx = TransactionBuilder::new() .add_input( TxInput::Account(AccountOutPoint::new( - AccountNonce::new(rng.gen()), + AccountNonce::new(rng.random()), AccountSpending::DelegationBalance( Id::random_using(&mut rng), - Amount::from_atoms(rng.gen()), + Amount::from_atoms(rng.random()), ), )), InputWitness::NoSignature(None), @@ -500,7 +500,7 @@ fn token_id_in_add_tx(#[case] seed: Seed) { .add_output(TxOutput::IssueFungibleToken(Box::new(TokenIssuance::V1( TokenIssuanceV1 { token_ticker: "XXXX".as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: "http://uri".as_bytes().to_vec(), total_supply: common::chain::tokens::TokenTotalSupply::Unlimited, authority: Destination::AnyoneCanSpend, @@ -514,9 +514,9 @@ fn token_id_in_add_tx(#[case] seed: Seed) { // Tx block height is before the fork, best block height is after the fork. // Expecting V0 token id. { - let tx_block_height = BlockHeight::new(rng.gen_range(0..fork_height.into_int())); + let tx_block_height = BlockHeight::new(rng.random_range(0..fork_height.into_int())); let best_block_height = - BlockHeight::new(rng.gen_range(fork_height.into_int()..fork_height.into_int() * 2)); + BlockHeight::new(rng.random_range(fork_height.into_int()..fork_height.into_int() * 2)); let mut output_cache = OutputCache::empty(); let wallet_tx = WalletTx::Tx(TxData::new( @@ -553,8 +553,8 @@ fn token_id_in_add_tx(#[case] seed: Seed) { // Expecting V1 token id. { let tx_block_height = - BlockHeight::new(rng.gen_range(fork_height.into_int()..fork_height.into_int() * 2)); - let best_block_height = BlockHeight::new(rng.gen_range(0..fork_height.into_int())); + BlockHeight::new(rng.random_range(fork_height.into_int()..fork_height.into_int() * 2)); + let best_block_height = BlockHeight::new(rng.random_range(0..fork_height.into_int())); let mut output_cache = OutputCache::empty(); let wallet_tx = WalletTx::Tx(TxData::new( @@ -588,14 +588,14 @@ fn token_id_in_add_tx(#[case] seed: Seed) { // Best block height is the fork height minus 2 or less. // Expecting V0 token id. { - let best_block_height = if rng.gen_bool(0.5) { + let best_block_height = if rng.random_bool(0.5) { fork_height.prev_height().unwrap().prev_height().unwrap() } else { - BlockHeight::new(rng.gen_range(0..fork_height.into_int() - 2)) + BlockHeight::new(rng.random_range(0..fork_height.into_int() - 2)) }; let mut output_cache = OutputCache::empty(); - let wallet_tx = WalletTx::Tx(TxData::new(tx.clone(), TxState::Inactive(rng.gen()))); + let wallet_tx = WalletTx::Tx(TxData::new(tx.clone(), TxState::Inactive(rng.random()))); output_cache .add_tx( &chain_config, @@ -623,14 +623,14 @@ fn token_id_in_add_tx(#[case] seed: Seed) { // Best block height is the fork height minus 1 or bigger. // Expecting V0 token id. { - let best_block_height = if rng.gen_bool(0.5) { + let best_block_height = if rng.random_bool(0.5) { fork_height.prev_height().unwrap() } else { - BlockHeight::new(rng.gen_range(fork_height.into_int()..fork_height.into_int() * 2)) + BlockHeight::new(rng.random_range(fork_height.into_int()..fork_height.into_int() * 2)) }; let mut output_cache = OutputCache::empty(); - let wallet_tx = WalletTx::Tx(TxData::new(tx.clone(), TxState::Inactive(rng.gen()))); + let wallet_tx = WalletTx::Tx(TxData::new(tx.clone(), TxState::Inactive(rng.random()))); output_cache .add_tx( &chain_config, @@ -664,7 +664,7 @@ fn abandon_transaction(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let chain_config = create_unit_test_config(); - let best_block_height = BlockHeight::new(rng.gen()); + let best_block_height = BlockHeight::new(rng.random()); let mut output_cache = OutputCache::empty(); let genesis_tx_id = Id::::random_using(&mut rng); @@ -674,7 +674,7 @@ fn abandon_transaction(#[case] seed: Seed) { InputWitness::NoSignature(None), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -695,7 +695,7 @@ fn abandon_transaction(#[case] seed: Seed) { empty_witness(&mut rng), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -716,7 +716,7 @@ fn abandon_transaction(#[case] seed: Seed) { empty_witness(&mut rng), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -756,7 +756,7 @@ fn abandon_transaction_in_mempool_fail(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let chain_config = create_unit_test_config(); - let best_block_height = BlockHeight::new(rng.gen()); + let best_block_height = BlockHeight::new(rng.random()); let mut output_cache = OutputCache::empty(); let genesis_tx_id = Id::::random_using(&mut rng); @@ -766,7 +766,7 @@ fn abandon_transaction_in_mempool_fail(#[case] seed: Seed) { InputWitness::NoSignature(None), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -789,7 +789,7 @@ fn abandon_transaction_in_mempool_fail(#[case] seed: Seed) { empty_witness(&mut rng), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -832,7 +832,7 @@ fn test_add_tx_state_transitions_logic(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let chain_config = create_unit_test_config(); - let best_block_height = BlockHeight::new(rng.gen()); + let best_block_height = BlockHeight::new(rng.random()); let mut output_cache = OutputCache::empty(); let genesis_tx_id = Id::::random_using(&mut rng); @@ -842,7 +842,7 @@ fn test_add_tx_state_transitions_logic(#[case] seed: Seed) { InputWitness::NoSignature(None), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::AnyoneCanSpend, )) .build(); @@ -922,10 +922,16 @@ fn orders_state_update(#[case] seed: Seed) { let conclude_key1 = Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)); let conclude_key2 = Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)); - let coins1 = OutputValue::Coin(Amount::from_atoms(rng.gen_range(1000..100_1000))); - let coins2 = OutputValue::Coin(Amount::from_atoms(rng.gen_range(1000..100_1000))); - let tokens1 = OutputValue::TokenV1(token_id, Amount::from_atoms(rng.gen_range(1000..100_1000))); - let tokens2 = OutputValue::TokenV1(token_id, Amount::from_atoms(rng.gen_range(1000..100_1000))); + let coins1 = OutputValue::Coin(Amount::from_atoms(rng.random_range(1000..100_1000))); + let coins2 = OutputValue::Coin(Amount::from_atoms(rng.random_range(1000..100_1000))); + let tokens1 = OutputValue::TokenV1( + token_id, + Amount::from_atoms(rng.random_range(1000..100_1000)), + ); + let tokens2 = OutputValue::TokenV1( + token_id, + Amount::from_atoms(rng.random_range(1000..100_1000)), + ); let parent_tx_1_id = Id::::random_using(&mut rng); let order1_creation_tx = TransactionBuilder::new() @@ -940,15 +946,15 @@ fn orders_state_update(#[case] seed: Seed) { )))) .build(); let order1_creation_tx_id = order1_creation_tx.transaction().get_id(); - let order1_creation_timestamp = BlockTimestamp::from_int_seconds(rng.gen_range(0..10)); + let order1_creation_timestamp = BlockTimestamp::from_int_seconds(rng.random_range(0..10)); let order1_id = make_order_id(order1_creation_tx.inputs()).unwrap(); - let order1_creation_tx_confirmation_height = BlockHeight::new(rng.gen_range(0..10)); + let order1_creation_tx_confirmation_height = BlockHeight::new(rng.random_range(0..10)); let mut output_cache = OutputCache::empty(); // Create order 1 - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { add_random_transfer_tx(&mut output_cache, &chain_config, &mut rng); } @@ -962,13 +968,13 @@ fn orders_state_update(#[case] seed: Seed) { TxState::Confirmed( order1_creation_tx_confirmation_height, order1_creation_timestamp, - rng.gen_range(0..10), + rng.random_range(0..10), ), )), ) .unwrap(); - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { add_random_transfer_tx(&mut output_cache, &chain_config, &mut rng); } @@ -1012,12 +1018,12 @@ fn orders_state_update(#[case] seed: Seed) { order2_creation_tx_id.into(), WalletTx::Tx(TxData::new( order2_creation_tx, - TxState::Inactive(rng.gen()), + TxState::Inactive(rng.random()), )), ) .unwrap(); - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { add_random_transfer_tx(&mut output_cache, &chain_config, &mut rng); } @@ -1046,7 +1052,7 @@ fn orders_state_update(#[case] seed: Seed) { .add_input( TxInput::OrderAccountCommand(OrderAccountCommand::FillOrder( order1_id, - Amount::from_atoms(rng.gen_range(100..200)), + Amount::from_atoms(rng.random_range(100..200)), )), InputWitness::NoSignature(None), ) @@ -1061,15 +1067,15 @@ fn orders_state_update(#[case] seed: Seed) { WalletTx::Tx(TxData::new( order1_fill_tx, TxState::Confirmed( - BlockHeight::new(rng.gen_range(20..30)), - BlockTimestamp::from_int_seconds(rng.gen_range(20..30)), - rng.gen_range(0..10), + BlockHeight::new(rng.random_range(20..30)), + BlockTimestamp::from_int_seconds(rng.random_range(20..30)), + rng.random_range(0..10), ), )), ) .unwrap(); - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { add_random_transfer_tx(&mut output_cache, &chain_config, &mut rng); } @@ -1088,7 +1094,7 @@ fn orders_state_update(#[case] seed: Seed) { .add_input( TxInput::OrderAccountCommand(OrderAccountCommand::FillOrder( order2_id, - Amount::from_atoms(rng.gen_range(100..200)), + Amount::from_atoms(rng.random_range(100..200)), )), InputWitness::NoSignature(None), ) @@ -1100,11 +1106,11 @@ fn orders_state_update(#[case] seed: Seed) { &chain_config, BlockHeight::new(40), order2_fill_tx_id.into(), - WalletTx::Tx(TxData::new(order2_fill_tx, TxState::Inactive(rng.gen()))), + WalletTx::Tx(TxData::new(order2_fill_tx, TxState::Inactive(rng.random()))), ) .unwrap(); - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { add_random_transfer_tx(&mut output_cache, &chain_config, &mut rng); } @@ -1135,15 +1141,15 @@ fn orders_state_update(#[case] seed: Seed) { WalletTx::Tx(TxData::new( order1_freeze_tx, TxState::Confirmed( - BlockHeight::new(rng.gen_range(40..50)), - BlockTimestamp::from_int_seconds(rng.gen_range(40..50)), - rng.gen_range(0..10), + BlockHeight::new(rng.random_range(40..50)), + BlockTimestamp::from_int_seconds(rng.random_range(40..50)), + rng.random_range(0..10), ), )), ) .unwrap(); - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { add_random_transfer_tx(&mut output_cache, &chain_config, &mut rng); } @@ -1172,11 +1178,14 @@ fn orders_state_update(#[case] seed: Seed) { &chain_config, BlockHeight::new(60), order2_freeze_tx_id.into(), - WalletTx::Tx(TxData::new(order2_freeze_tx, TxState::Inactive(rng.gen()))), + WalletTx::Tx(TxData::new( + order2_freeze_tx, + TxState::Inactive(rng.random()), + )), ) .unwrap(); - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { add_random_transfer_tx(&mut output_cache, &chain_config, &mut rng); } @@ -1208,15 +1217,15 @@ fn orders_state_update(#[case] seed: Seed) { WalletTx::Tx(TxData::new( order1_conclude_tx, TxState::Confirmed( - BlockHeight::new(rng.gen_range(60..70)), - BlockTimestamp::from_int_seconds(rng.gen_range(60..70)), - rng.gen_range(0..10), + BlockHeight::new(rng.random_range(60..70)), + BlockTimestamp::from_int_seconds(rng.random_range(60..70)), + rng.random_range(0..10), ), )), ) .unwrap(); - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { add_random_transfer_tx(&mut output_cache, &chain_config, &mut rng); } @@ -1247,12 +1256,12 @@ fn orders_state_update(#[case] seed: Seed) { order2_conclude_tx_id.into(), WalletTx::Tx(TxData::new( order2_conclude_tx, - TxState::Inactive(rng.gen()), + TxState::Inactive(rng.random()), )), ) .unwrap(); - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { add_random_transfer_tx(&mut output_cache, &chain_config, &mut rng); } @@ -1276,11 +1285,11 @@ fn add_random_transfer_tx( let random_block_id = Id::::random_using(&mut rng); let tx = TransactionBuilder::new() .add_input( - TxInput::from_utxo(random_tx_id.into(), rng.gen()), + TxInput::from_utxo(random_tx_id.into(), rng.random()), InputWitness::NoSignature(None), ) .add_output(TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), )) .build(); @@ -1288,20 +1297,20 @@ fn add_random_transfer_tx( let tx_state = match TxStateTag::iter().choose(&mut rng).unwrap() { TxStateTag::Confirmed => TxState::Confirmed( - BlockHeight::new(rng.gen_range(0..100)), - BlockTimestamp::from_int_seconds(rng.gen_range(0..100)), - rng.gen_range(0..100), + BlockHeight::new(rng.random_range(0..100)), + BlockTimestamp::from_int_seconds(rng.random_range(0..100)), + rng.random_range(0..100), ), - TxStateTag::InMempool => TxState::InMempool(rng.gen()), + TxStateTag::InMempool => TxState::InMempool(rng.random()), TxStateTag::Conflicted => TxState::Conflicted(random_block_id), - TxStateTag::Inactive => TxState::Inactive(rng.gen()), + TxStateTag::Inactive => TxState::Inactive(rng.random()), TxStateTag::Abandoned => TxState::Abandoned, }; output_cache .add_tx( chain_config, - BlockHeight::new(rng.gen_range(0..100)), + BlockHeight::new(rng.random_range(0..100)), tx_id.into(), WalletTx::Tx(TxData::new(tx, tx_state)), ) diff --git a/wallet/src/account/utxo_selector/mod.rs b/wallet/src/account/utxo_selector/mod.rs index f431a271d6..5b4d0c8471 100644 --- a/wallet/src/account/utxo_selector/mod.rs +++ b/wallet/src/account/utxo_selector/mod.rs @@ -22,7 +22,7 @@ use common::{ chain::{TxInput, TxOutput}, primitives::{amount::SignedAmount, Amount}, }; -use randomness::{make_pseudo_rng, Rng, SliceRandom}; +use randomness::{make_pseudo_rng, Rng, RngExt as _, SliceRandom}; use utils::ensure; const TOTAL_TRIES: u32 = 100_000; @@ -446,7 +446,7 @@ fn approximate_best_subset( //because there may be some privacy improvement by making //the selection random. let rand_bool = if n_pass == 0 { - rng.gen::() + rng.random::() } else { !current_solution_included[i] }; diff --git a/wallet/src/account/utxo_selector/tests.rs b/wallet/src/account/utxo_selector/tests.rs index f1fdcfe6a6..4a358bfe9b 100644 --- a/wallet/src/account/utxo_selector/tests.rs +++ b/wallet/src/account/utxo_selector/tests.rs @@ -73,8 +73,8 @@ fn test_knapsack_solver_not_enough(#[case] seed: Seed) { let mut groups = vec![]; let mut target_value = Amount::ZERO; - for _ in 0..rng.gen_range(1..100) { - let value = Amount::from_atoms(rng.gen_range(1..100)); + for _ in 0..rng.random_range(1..100) { + let value = Amount::from_atoms(rng.random_range(1..100)); add_output(value, &mut groups); target_value = (target_value + value).expect("can't overflow"); } @@ -105,9 +105,9 @@ fn test_knapsack_solver_max_weight(#[case] seed: Seed) { let mut groups = vec![]; let mut target_value = Amount::ZERO; - let num_inputs = rng.gen_range(1..100); + let num_inputs = rng.random_range(1..100); for _ in 0..num_inputs { - let value = Amount::from_atoms(rng.gen_range(1..100)); + let value = Amount::from_atoms(rng.random_range(1..100)); add_output(value, &mut groups); target_value = (target_value + value).expect("can't overflow"); } @@ -134,13 +134,13 @@ fn test_knapsack_solver_max_weight(#[case] seed: Seed) { fn test_knapsack_solver_exact_solution(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let target_value = Amount::from_atoms(rng.gen_range(1..100)); + let target_value = Amount::from_atoms(rng.random_range(1..100)); let mut groups = vec![]; - for _ in 0..rng.gen_range(0..100) { + for _ in 0..rng.random_range(0..100) { // add values different from the target_value - let mut value = Amount::from_atoms(rng.gen_range(1..100)); + let mut value = Amount::from_atoms(rng.random_range(1..100)); while value == target_value { - value = Amount::from_atoms(rng.gen_range(1..100)); + value = Amount::from_atoms(rng.random_range(1..100)); } add_output(value, &mut groups); } @@ -173,13 +173,13 @@ fn test_knapsack_solver_exact_solution_multiple_utxos(#[case] seed: Seed) { let mut groups = vec![]; let mut target_value = Amount::ZERO; - for _ in 0..rng.gen_range(1..100) { - let value = Amount::from_atoms(rng.gen_range(1..100)); + for _ in 0..rng.random_range(1..100) { + let value = Amount::from_atoms(rng.random_range(1..100)); add_output(value, &mut groups); // randomly add to the target_value so we know there is an exact match from a subset of the // groups - if rng.gen::() || target_value == Amount::ZERO { + if rng.random::() || target_value == Amount::ZERO { target_value = (target_value + value).expect("can't overflow"); } } @@ -230,7 +230,7 @@ fn test_knapsack_solver_not_exact_solution(#[case] seed: Seed) { // cannot make 9 from [1,2,5] will use lowest larger value which is 10 let target_value = Amount::from_atoms(9); - let pay_fees = if rng.gen::() { + let pay_fees = if rng.random::() { PayFee::PayFeeWithThisCurrency } else { PayFee::DoNotPayFeeWithThisCurrency @@ -267,13 +267,13 @@ fn test_knapsack_solver_not_exact_solution(#[case] seed: Seed) { fn test_bnb_solver_exact_solution(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let target_value = Amount::from_atoms(rng.gen_range(1..100)); + let target_value = Amount::from_atoms(rng.random_range(1..100)); let mut groups = vec![]; - for _ in 0..rng.gen_range(0..100) { + for _ in 0..rng.random_range(0..100) { // add values different from the target_value - let mut value = Amount::from_atoms(rng.gen_range(1..100)); + let mut value = Amount::from_atoms(rng.random_range(1..100)); while value == target_value { - value = Amount::from_atoms(rng.gen_range(1..100)); + value = Amount::from_atoms(rng.random_range(1..100)); } add_output(value, &mut groups); } @@ -304,9 +304,9 @@ fn test_bnb_solver_max_weight(#[case] seed: Seed) { let mut groups = vec![]; let mut target_value = Amount::ZERO; - let num_inputs = rng.gen_range(1..100); + let num_inputs = rng.random_range(1..100); for _ in 0..num_inputs { - let value = Amount::from_atoms(rng.gen_range(1..100)); + let value = Amount::from_atoms(rng.random_range(1..100)); add_output(value, &mut groups); target_value = (target_value + value).expect("can't overflow"); } @@ -334,13 +334,13 @@ fn test_bnb_solver_exact_solution_multiple_utxos(#[case] seed: Seed) { let mut groups = vec![]; let mut target_value = Amount::ZERO; - for _ in 0..rng.gen_range(1..100) { - let value = Amount::from_atoms(rng.gen_range(1..100)); + for _ in 0..rng.random_range(1..100) { + let value = Amount::from_atoms(rng.random_range(1..100)); add_output(value, &mut groups); // randomly add to the target_value so we know there is an exact match from a subset of the // groups - if rng.gen::() || target_value == Amount::ZERO { + if rng.random::() || target_value == Amount::ZERO { target_value = (target_value + value).expect("can't overflow"); } } @@ -391,13 +391,13 @@ fn test_bnb_solver_not_exact_solution_fail() { fn test_srd_solver_find_solution(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let target_value = Amount::from_atoms(rng.gen_range(1..100)); + let target_value = Amount::from_atoms(rng.random_range(1..100)); let mut groups = vec![]; - for _ in 0..rng.gen_range(0..100) { + for _ in 0..rng.random_range(0..100) { // add values different from the target_value - let mut value = Amount::from_atoms(rng.gen_range(1..100)); + let mut value = Amount::from_atoms(rng.random_range(1..100)); while value == target_value { - value = Amount::from_atoms(rng.gen_range(1..100)); + value = Amount::from_atoms(rng.random_range(1..100)); } add_output(value, &mut groups); } @@ -428,9 +428,9 @@ fn test_srd_solver_max_weight(#[case] seed: Seed) { let mut groups = vec![]; let mut target_value = Amount::ZERO; - let num_inputs = rng.gen_range(1..100); + let num_inputs = rng.random_range(1..100); for _ in 0..num_inputs { - let value = Amount::from_atoms(rng.gen_range(1..100)); + let value = Amount::from_atoms(rng.random_range(1..100)); add_output(value, &mut groups); target_value = (target_value + value).expect("can't overflow"); } diff --git a/wallet/src/signer/tests/generic_fixed_signature_tests.rs b/wallet/src/signer/tests/generic_fixed_signature_tests.rs index 8a1dda2331..352a5c4d45 100644 --- a/wallet/src/signer/tests/generic_fixed_signature_tests.rs +++ b/wallet/src/signer/tests/generic_fixed_signature_tests.rs @@ -60,7 +60,7 @@ use crypto::{ vrf::{VRFPrivateKey, VRFPublicKey}, }; use logging::log; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use serialization::{extras::non_empty_vec::DataOrNoVec, Encode as _}; use test_utils::{assert_matches_return_val, random_ascii_alphanumeric_string}; use wallet_storage::{DefaultBackend, Store, TransactionRwUnlocked, Transactional}; @@ -125,17 +125,17 @@ lazy_static::lazy_static! { }; } -pub async fn test_fixed_signatures_generic( - rng: &mut (impl Rng + CryptoRng), - make_signer: MkS, -) where +pub async fn test_fixed_signatures_generic(rng: &mut impl CryptoRng, make_signer: MkS) +where MkS: Fn(Arc, U31) -> S, S: Signer, { - let sighash_input_commitment_version_fork_height = BlockHeight::new(rng.gen_range(1..100_000)); + let sighash_input_commitment_version_fork_height = + BlockHeight::new(rng.random_range(1..100_000)); // The height shouldn't matter as long as it's below the fork - let tx_block_height = - BlockHeight::new(rng.gen_range(0..sighash_input_commitment_version_fork_height.into_int())); + let tx_block_height = BlockHeight::new( + rng.random_range(0..sighash_input_commitment_version_fork_height.into_int()), + ); let chain_config = Arc::new( chain::config::Builder::new(ChainType::Regtest) @@ -360,7 +360,7 @@ pub async fn test_fixed_signatures_generic( // currency matters. initially_given: OutputValue::TokenV1( token_id, - Amount::from_atoms(rng.gen_range(100..200)), + Amount::from_atoms(rng.random_range(100..200)), ), }, ); @@ -368,7 +368,7 @@ pub async fn test_fixed_signatures_generic( token_id, // Note: this info doesn't influence the signature and can be random. TokenAdditionalInfo { - num_decimals: rng.gen_range(1..10), + num_decimals: rng.random_range(1..10), ticker: random_ascii_alphanumeric_string(rng, 5..10).into_bytes(), }, ); @@ -436,7 +436,7 @@ pub async fn test_fixed_signatures_generic( /// 3) htlc inputs; /// 4) v1 input commitments. pub async fn test_fixed_signatures_generic2( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, input_commitments_version: SighashInputCommitmentVersion, make_signer: MkS, ) where @@ -445,10 +445,10 @@ pub async fn test_fixed_signatures_generic2( { // The actual heights don't matter as long as tx block height is at the correct side of the fork. let (sighash_input_commitment_version_fork_height, tx_block_height) = { - let fork_height = rng.gen_range(1000..2000); + let fork_height = rng.random_range(1000..2000); let tx_block_height = match input_commitments_version { - SighashInputCommitmentVersion::V0 => rng.gen_range(1..fork_height), - SighashInputCommitmentVersion::V1 => rng.gen_range(fork_height..fork_height * 2), + SighashInputCommitmentVersion::V0 => rng.random_range(1..fork_height), + SighashInputCommitmentVersion::V1 => rng.random_range(fork_height..fork_height * 2), }; ( BlockHeight::new(fork_height), @@ -641,10 +641,10 @@ pub async fn test_fixed_signatures_generic2( OrderAdditionalInfo { // Note: the amounts in initially_asked and initially_given aren't used by the signers when handling // v0 FillOrder, only the currencies matter. - initially_asked: OutputValue::Coin(Amount::from_atoms(rng.gen_range(100..200))), + initially_asked: OutputValue::Coin(Amount::from_atoms(rng.random_range(100..200))), initially_given: OutputValue::TokenV1( token_id, - Amount::from_atoms(rng.gen_range(100..200)), + Amount::from_atoms(rng.random_range(100..200)), ), ask_balance: Amount::from_atoms(50), give_balance: Amount::from_atoms(100), @@ -665,8 +665,8 @@ pub async fn test_fixed_signatures_generic2( initially_asked: OutputValue::TokenV1(token_id, Amount::from_atoms(300)), initially_given: OutputValue::Coin(Amount::from_atoms(150)), // Note: ask_balance/give_balance aren't used by the signers when handling v1 FillOrder. - ask_balance: Amount::from_atoms(rng.gen_range(100..200)), - give_balance: Amount::from_atoms(rng.gen_range(100..200)), + ask_balance: Amount::from_atoms(rng.random_range(100..200)), + give_balance: Amount::from_atoms(rng.random_range(100..200)), }; let concluded_order_v0_info = match input_commitments_version { SighashInputCommitmentVersion::V0 => { @@ -676,7 +676,7 @@ pub async fn test_fixed_signatures_generic2( // (both v0 and v1), only the currency matters. initially_given: OutputValue::TokenV1( token_id, - Amount::from_atoms(rng.gen_range(100..200)), + Amount::from_atoms(rng.random_range(100..200)), ), ask_balance: Amount::from_atoms(55), give_balance: Amount::from_atoms(110), @@ -699,7 +699,7 @@ pub async fn test_fixed_signatures_generic2( // (both v0 and v1), only the currency matters. initially_given: OutputValue::TokenV1( token_id, - Amount::from_atoms(rng.gen_range(100..200)), + Amount::from_atoms(rng.random_range(100..200)), ), ask_balance: Amount::from_atoms(110), give_balance: Amount::from_atoms(55), @@ -718,13 +718,13 @@ pub async fn test_fixed_signatures_generic2( }; let frozen_order_info = OrderAdditionalInfo { // Note: the amounts aren't used by the signers when handling FreezeOrder. - initially_asked: OutputValue::Coin(Amount::from_atoms(rng.gen_range(100..200))), + initially_asked: OutputValue::Coin(Amount::from_atoms(rng.random_range(100..200))), initially_given: OutputValue::TokenV1( token_id, - Amount::from_atoms(rng.gen_range(100..200)), + Amount::from_atoms(rng.random_range(100..200)), ), - ask_balance: Amount::from_atoms(rng.gen_range(100..200)), - give_balance: Amount::from_atoms(rng.gen_range(100..200)), + ask_balance: Amount::from_atoms(rng.random_range(100..200)), + give_balance: Amount::from_atoms(rng.random_range(100..200)), }; let delegation_id1 = DelegationId::new(hash_encoded(&"some delegation 1")); @@ -905,7 +905,7 @@ pub async fn test_fixed_signatures_generic2( token_id, // Note: token info doesn't influence the signature and can be random. TokenAdditionalInfo { - num_decimals: rng.gen_range(1..10), + num_decimals: rng.random_range(1..10), ticker: random_ascii_alphanumeric_string(rng, 5..10).into_bytes(), }, ); @@ -1145,7 +1145,7 @@ pub async fn test_fixed_signatures_generic2( /// Another fixed signature test. The main difference from test_fixed_signatures_generic2 is that /// we have removed the input commitments V0 and orders V0 pub async fn test_fixed_signatures_generic_no_legacy( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, make_signer: MkS, ) where MkS: Fn(Arc, U31) -> S, @@ -1153,8 +1153,8 @@ pub async fn test_fixed_signatures_generic_no_legacy( { // The actual heights don't matter as long as tx block height is at the correct side of the fork. let (sighash_input_commitment_version_fork_height, tx_block_height) = { - let fork_height = rng.gen_range(1000..2000); - let tx_block_height = rng.gen_range(fork_height..fork_height * 2); + let fork_height = rng.random_range(1000..2000); + let tx_block_height = rng.random_range(fork_height..fork_height * 2); ( BlockHeight::new(fork_height), @@ -1344,8 +1344,8 @@ pub async fn test_fixed_signatures_generic_no_legacy( initially_asked: OutputValue::TokenV1(token_id, Amount::from_atoms(300)), initially_given: OutputValue::Coin(Amount::from_atoms(150)), // Note: ask_balance/give_balance aren't used by the signers when handling v1 FillOrder. - ask_balance: Amount::from_atoms(rng.gen_range(100..200)), - give_balance: Amount::from_atoms(rng.gen_range(100..200)), + ask_balance: Amount::from_atoms(rng.random_range(100..200)), + give_balance: Amount::from_atoms(rng.random_range(100..200)), }; let concluded_order_v1_info = OrderAdditionalInfo { // Note: in commitments v1, we commit to all values for ConcludeOrder, @@ -1357,13 +1357,13 @@ pub async fn test_fixed_signatures_generic_no_legacy( }; let frozen_order_info = OrderAdditionalInfo { // Note: the amounts aren't used by the signers when handling FreezeOrder. - initially_asked: OutputValue::Coin(Amount::from_atoms(rng.gen_range(100..200))), + initially_asked: OutputValue::Coin(Amount::from_atoms(rng.random_range(100..200))), initially_given: OutputValue::TokenV1( token_id, - Amount::from_atoms(rng.gen_range(100..200)), + Amount::from_atoms(rng.random_range(100..200)), ), - ask_balance: Amount::from_atoms(rng.gen_range(100..200)), - give_balance: Amount::from_atoms(rng.gen_range(100..200)), + ask_balance: Amount::from_atoms(rng.random_range(100..200)), + give_balance: Amount::from_atoms(rng.random_range(100..200)), }; let delegation_id1 = DelegationId::new(hash_encoded(&"some delegation 1")); @@ -1530,7 +1530,7 @@ pub async fn test_fixed_signatures_generic_no_legacy( token_id, // Note: token info doesn't influence the signature and can be random. TokenAdditionalInfo { - num_decimals: rng.gen_range(1..10), + num_decimals: rng.random_range(1..10), ticker: random_ascii_alphanumeric_string(rng, 5..10).into_bytes(), }, ); @@ -1678,7 +1678,7 @@ pub async fn test_fixed_signatures_generic_no_legacy( // We also add one non-htlc input (pool decommissioning), so that signatures differ for different // input commitment versions. pub async fn test_fixed_signatures_generic_htlc_refunding( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, input_commitments_version: SighashInputCommitmentVersion, make_signer: MkS, ) where @@ -1687,10 +1687,10 @@ pub async fn test_fixed_signatures_generic_htlc_refunding( { // The actual heights don't matter as long as tx block height is at the correct side of the fork. let (sighash_input_commitment_version_fork_height, tx_block_height) = { - let fork_height = rng.gen_range(1000..2000); + let fork_height = rng.random_range(1000..2000); let tx_block_height = match input_commitments_version { - SighashInputCommitmentVersion::V0 => rng.gen_range(1..fork_height), - SighashInputCommitmentVersion::V1 => rng.gen_range(fork_height..fork_height * 2), + SighashInputCommitmentVersion::V0 => rng.random_range(1..fork_height), + SighashInputCommitmentVersion::V1 => rng.random_range(fork_height..fork_height * 2), }; ( BlockHeight::new(fork_height), diff --git a/wallet/src/signer/tests/generic_tests.rs b/wallet/src/signer/tests/generic_tests.rs index 0f21c305f6..a4e63c8d38 100644 --- a/wallet/src/signer/tests/generic_tests.rs +++ b/wallet/src/signer/tests/generic_tests.rs @@ -52,7 +52,7 @@ use crypto::{ vrf::VRFPrivateKey, }; use logging::log; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, Rng, RngExt as _}; use serialization::extras::non_empty_vec::DataOrNoVec; use test_utils::{ random::{gen_random_bytes, make_seedable_rng}, @@ -98,7 +98,7 @@ pub fn sign_message_test_params( } pub async fn test_sign_message_generic( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, message_to_sign: MessageToSign, make_signer: MkS1, make_another_signer: Option, @@ -116,11 +116,11 @@ pub async fn test_sign_message_generic( let mut make_message = { // Note: can't pass rng to the closure without knowing its exact type, so we create a new one. - let mut rng = make_seedable_rng(rng.gen()); + let mut rng = make_seedable_rng(rng.random()); move || { let msg = match &message_to_sign { MessageToSign::Random => { - vec![rng.r#gen::(), rng.r#gen::(), rng.r#gen::()] + vec![rng.random::(), rng.random::(), rng.random::()] } MessageToSign::Predefined(msg) => msg.clone(), }; @@ -197,7 +197,7 @@ pub async fn test_sign_message_generic( } pub async fn test_sign_transaction_intent_generic( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, make_signer: MkS1, make_another_signer: Option, ) where @@ -220,9 +220,9 @@ pub async fn test_sign_transaction_intent_generic( .unwrap(); let standalone_pk_destination = Destination::PublicKey(standalone_pk); - let inputs: Vec = (0..rng.gen_range(3..6)) + let inputs: Vec = (0..rng.random_range(3..6)) .map(|_| { - let source_id = if rng.gen_bool(0.5) { + let source_id = if rng.random_bool(0.5) { Id::::new(H256::random_using(rng)).into() } else { Id::::new(H256::random_using(rng)).into() @@ -238,7 +238,7 @@ pub async fn test_sign_transaction_intent_generic( .unwrap() .1 .into_object(); - if rng.gen::() { + if rng.random::() { pkh_destination } else { let pkh = match pkh_destination { @@ -256,13 +256,15 @@ pub async fn test_sign_transaction_intent_generic( 0, inputs, vec![TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), account.get_new_address(&mut db_tx, KeyPurpose::Change).unwrap().1.into_object(), )], ) .unwrap(); - let intent: String = [rng.gen::(), rng.gen::(), rng.gen::()].iter().collect(); + let intent: String = [rng.random::(), rng.random::(), rng.random::()] + .iter() + .collect(); log::debug!("Generated intent: `{intent}`"); let expected_signed_message = SignedTransactionIntent::get_message_to_sign(&intent, &tx.get_id()); @@ -303,7 +305,7 @@ pub async fn test_sign_transaction_intent_generic( // cannot sign when there is a random destination let (_, random_pk) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); let random_pk_destination = Destination::PublicKey(random_pk); - input_destinations[rng.gen_range(0..num_inputs)] = random_pk_destination; + input_destinations[rng.random_range(0..num_inputs)] = random_pk_destination; let err = signer .sign_transaction_intent( @@ -320,7 +322,7 @@ pub async fn test_sign_transaction_intent_generic( } pub async fn test_sign_transaction_generic( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, input_commitments_version: SighashInputCommitmentVersion, make_signer: MkS1, make_another_signer: Option, @@ -332,10 +334,10 @@ pub async fn test_sign_transaction_generic( S2: Signer, { let (sighash_input_commitment_version_fork_height, tx_block_height) = { - let fork_height = rng.gen_range(100..100_000); + let fork_height = rng.random_range(100..100_000); let tx_block_height = match input_commitments_version { - SighashInputCommitmentVersion::V0 => rng.gen_range(1..fork_height), - SighashInputCommitmentVersion::V1 => rng.gen_range(fork_height..fork_height * 2), + SighashInputCommitmentVersion::V0 => rng.random_range(1..fork_height), + SighashInputCommitmentVersion::V1 => rng.random_range(fork_height..fork_height * 2), }; ( BlockHeight::new(fork_height), @@ -379,8 +381,8 @@ pub async fn test_sign_transaction_generic( .unwrap(); let standalone_pk_destination = Destination::PublicKey(standalone_pk.clone()); - let coin_input_amounts: Vec = (0..rng.gen_range(2..7)) - .map(|_| Amount::from_atoms(rng.gen_range(100..1000))) + let coin_input_amounts: Vec = (0..rng.random_range(2..7)) + .map(|_| Amount::from_atoms(rng.random_range(100..1000))) .collect(); let total_coin_input_amount = @@ -388,7 +390,7 @@ pub async fn test_sign_transaction_generic( let decommissioned_pool_id = PoolId::new(H256::random_using(rng)); let decommissioned_pool_balance = Amount::from_atoms( - rng.gen_range(100..200) + rng.random_range(100..200) + chain_config.fungible_token_issuance_fee().into_atoms() + chain_config.nft_issuance_fee(tx_block_height).into_atoms() * 2 + chain_config.token_supply_change_fee(tx_block_height).into_atoms() * 3 @@ -400,14 +402,14 @@ pub async fn test_sign_transaction_generic( let decommissioned_pool_data = PoolData { utxo_outpoint: UtxoOutPoint::new(Id::::random_using(rng).into(), 1), creation_block: BlockInfo { - height: BlockHeight::new(rng.gen()), - timestamp: BlockTimestamp::from_int_seconds(rng.gen()), + height: BlockHeight::new(rng.random()), + timestamp: BlockTimestamp::from_int_seconds(rng.random()), }, decommission_key: destination_from_account(&mut account, &mut db_tx, rng), stake_destination: random_destination(rng), vrf_public_key: VRFPrivateKey::new_from_rng(rng, crypto::vrf::VRFKeyKind::Schnorrkel).1, margin_ratio_per_thousand: PerThousand::new_from_rng(rng), - cost_per_block: Amount::from_atoms(rng.gen_range(100..200)), + cost_per_block: Amount::from_atoms(rng.random_range(100..200)), }; let produce_block_from_stake_utxo = @@ -429,7 +431,7 @@ pub async fn test_sign_transaction_generic( let inputs: Vec = (0..utxos.len()) .map(|_| { - let source_id = if rng.gen_bool(0.5) { + let source_id = if rng.random_bool(0.5) { Id::::new(H256::random_using(rng)).into() } else { Id::::new(H256::random_using(rng)).into() @@ -474,18 +476,18 @@ pub async fn test_sign_transaction_generic( let multisig_dest = Destination::ClassicMultisig(multisig_hash1); - let source_id: OutPointSourceId = if rng.gen_bool(0.5) { + let source_id: OutPointSourceId = if rng.random_bool(0.5) { Id::::new(H256::random_using(rng)).into() } else { Id::::new(H256::random_using(rng)).into() }; let multisig_input = TxInput::from_utxo(source_id.clone(), rng.next_u32()); let multisig_utxo = TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen_range(100..200))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(100..200))), multisig_dest.clone(), ); - let pub_key1_or_2 = if rng.gen_bool(0.5) { + let pub_key1_or_2 = if rng.random_bool(0.5) { log::debug!("pub_key1_or_2 is pub_key1"); pub_key1.clone() } else { @@ -493,7 +495,7 @@ pub async fn test_sign_transaction_generic( pub_key2.clone() }; let pub_key1_or_2_is_key1 = pub_key1_or_2 == pub_key1; - let dest1_or_2 = if rng.gen_bool(0.5) { + let dest1_or_2 = if rng.random_bool(0.5) { log::debug!("dest1_or_2 is pub key"); Destination::PublicKey(pub_key1_or_2) } else { @@ -501,7 +503,7 @@ pub async fn test_sign_transaction_generic( Destination::PublicKeyHash((&pub_key1_or_2).into()) }; - let spend_htlc = rng.gen_bool(0.5); + let spend_htlc = rng.random_bool(0.5); let htlc_secret = HtlcSecret::new_from_rng(rng); // Note: in "first_account_can_sign_htlc", "sign" actually means "at least partially sign". @@ -514,7 +516,7 @@ pub async fn test_sign_transaction_generic( pub_key1_or_2_is_key1, ) } else { - let (refund_dest, first_account_can_sign_htlc) = if rng.gen_bool(0.5) { + let (refund_dest, first_account_can_sign_htlc) = if rng.random_bool(0.5) { log::debug!("htlc will be refunded, single sig"); (dest1_or_2, pub_key1_or_2_is_key1) @@ -546,25 +548,25 @@ pub async fn test_sign_transaction_generic( let htlc = HashedTimelockContract { secret_hash: htlc_secret.hash(), spend_key: htlc_spend_dest, - refund_timelock: OutputTimeLock::UntilHeight(BlockHeight::new(rng.gen_range(100..200))), + refund_timelock: OutputTimeLock::UntilHeight(BlockHeight::new(rng.random_range(100..200))), refund_key: htlc_refund_dest, }; let htlc_input = TxInput::from_utxo(source_id, rng.next_u32()); let htlc_utxo = TxOutput::Htlc( - OutputValue::Coin(Amount::from_atoms(rng.gen::() as u128)), + OutputValue::Coin(Amount::from_atoms(rng.random::() as u128)), Box::new(htlc.clone()), ); let token_id = TokenId::new(H256::random_using(rng)); - let token_mint_amount = Amount::from_atoms(rng.gen_range(100..200)); + let token_mint_amount = Amount::from_atoms(rng.random_range(100..200)); - let coin_transfer_amount = total_coin_input_amount.div(rng.gen_range(10..20)).unwrap(); + let coin_transfer_amount = total_coin_input_amount.div(rng.random_range(10..20)).unwrap(); let coin_lock_then_transfer_amount = - total_coin_input_amount.div(rng.gen_range(10..20)).unwrap(); - let coin_burn_amount = total_coin_input_amount.div(rng.gen_range(10..20)).unwrap(); - let delegate_staking_amount = total_coin_input_amount.div(rng.gen_range(10..20)).unwrap(); - let htlc_transfer_amount = total_coin_input_amount.div(rng.gen_range(10..20)).unwrap(); + total_coin_input_amount.div(rng.random_range(10..20)).unwrap(); + let coin_burn_amount = total_coin_input_amount.div(rng.random_range(10..20)).unwrap(); + let delegate_staking_amount = total_coin_input_amount.div(rng.random_range(10..20)).unwrap(); + let htlc_transfer_amount = total_coin_input_amount.div(rng.random_range(10..20)).unwrap(); let filled_order1_id = OrderId::new(H256::random_using(rng)); let filled_order2_id = OrderId::new(H256::random_using(rng)); @@ -592,10 +594,10 @@ pub async fn test_sign_transaction_generic( let mut acc_inputs = vec![ TxInput::Account(AccountOutPoint::new( - AccountNonce::new(rng.gen_range(0..100)), + AccountNonce::new(rng.random_range(0..100)), AccountSpending::DelegationBalance( DelegationId::new(H256::random_using(rng)), - Amount::from_atoms(rng.gen_range(100..200)), + Amount::from_atoms(rng.random_range(100..200)), ), )), TxInput::AccountCommand( @@ -646,7 +648,9 @@ pub async fn test_sign_transaction_generic( AccountCommand::FillOrder( filled_order1_id, Amount::from_atoms( - rng.gen_range(1..filled_order1_info.initially_asked.amount().into_atoms()), + rng.random_range( + 1..filled_order1_info.initially_asked.amount().into_atoms(), + ), ), Destination::AnyoneCanSpend, ), @@ -658,7 +662,7 @@ pub async fn test_sign_transaction_generic( filled_order2_info.initially_asked.amount(), token_mint_amount, ); - let token_amount_to_fill = rng.gen_range(1..token_max_fill.into_atoms()); + let token_amount_to_fill = rng.random_range(1..token_max_fill.into_atoms()); acc_inputs.extend([ TxInput::OrderAccountCommand(OrderAccountCommand::ConcludeOrder(concluded_order2_id)), TxInput::OrderAccountCommand(OrderAccountCommand::FreezeOrder(frozen_order_id)), @@ -680,20 +684,20 @@ pub async fn test_sign_transaction_generic( let created_pool_id = PoolId::new(H256::random_using(rng)); let delegation_id = DelegationId::new(H256::random_using(rng)); let pool_data = StakePoolData::new( - Amount::from_atoms(rng.gen_range(100..200)), + Amount::from_atoms(rng.random_range(100..200)), Destination::PublicKey(dest_pub.clone()), vrf_public_key, Destination::PublicKey(dest_pub.clone()), PerThousand::new_from_rng(rng), - Amount::from_atoms(rng.gen_range(10..100)), + Amount::from_atoms(rng.random_range(10..100)), ); let token_issuance = TokenIssuance::V1(TokenIssuanceV1 { token_ticker: random_ascii_alphanumeric_string(rng, 2..10).into_bytes(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: random_ascii_alphanumeric_string(rng, 10..20).into_bytes(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::PublicKey(dest_pub.clone()), - is_freezable: if rng.gen_bool(0.5) { + is_freezable: if rng.random_bool(0.5) { IsTokenFreezable::Yes } else { IsTokenFreezable::No @@ -730,8 +734,8 @@ pub async fn test_sign_transaction_generic( let created_order_data = OrderData::new( Destination::PublicKey(dest_pub.clone()), - OutputValue::Coin(Amount::from_atoms(rng.gen_range(100..200))), - OutputValue::TokenV1(token_id, Amount::from_atoms(rng.gen_range(100..200))), + OutputValue::Coin(Amount::from_atoms(rng.random_range(100..200))), + OutputValue::TokenV1(token_id, Amount::from_atoms(rng.random_range(100..200))), ); let outputs = vec![ @@ -739,7 +743,7 @@ pub async fn test_sign_transaction_generic( OutputValue::TokenV1( token_id, Amount::from_atoms( - rng.gen_range(1..=(token_mint_amount.into_atoms() - token_amount_to_fill)), + rng.random_range(1..=(token_mint_amount.into_atoms() - token_amount_to_fill)), ), ), Destination::PublicKey(dest_pub.clone()), @@ -848,7 +852,7 @@ pub async fn test_sign_transaction_generic( let tokens_additional_info = TokensAdditionalInfo::new().with_info( token_id, TokenAdditionalInfo { - num_decimals: rng.gen_range(5..10), + num_decimals: rng.random_range(5..10), ticker: random_ascii_alphanumeric_string(rng, 5..10).into_bytes(), }, ); @@ -999,10 +1003,10 @@ fn random_order_info( min_balance: u128, rng: &mut impl Rng, ) -> OrderAdditionalInfo { - let initially_asked = rng.gen_range(min_initial_value..=max_initial_value); - let initially_given = rng.gen_range(min_initial_value..=max_initial_value); - let ask_balance = rng.gen_range(min_balance..=initially_asked); - let give_balance = rng.gen_range(min_balance..=initially_given); + let initially_asked = rng.random_range(min_initial_value..=max_initial_value); + let initially_given = rng.random_range(min_initial_value..=max_initial_value); + let ask_balance = rng.random_range(min_balance..=initially_asked); + let give_balance = rng.random_range(min_balance..=initially_given); OrderAdditionalInfo { initially_asked: ask_currency.into_output_value(Amount::from_atoms(initially_asked)), @@ -1012,7 +1016,7 @@ fn random_order_info( } } -fn random_destination(rng: &mut (impl Rng + CryptoRng)) -> Destination { +fn random_destination(rng: &mut impl CryptoRng) -> Destination { let (_sk, pk) = PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr); Destination::PublicKey(pk) } @@ -1022,7 +1026,7 @@ fn destination_from_account( db_tx: &mut impl TransactionRwUnlocked, rng: &mut impl Rng, ) -> Destination { - let purpose = if rng.gen_bool(0.5) { + let purpose = if rng.random_bool(0.5) { KeyPurpose::ReceiveFunds } else { KeyPurpose::Change diff --git a/wallet/src/wallet/tests.rs b/wallet/src/wallet/tests.rs index 1ef8e95ab6..7ae607c63c 100644 --- a/wallet/src/wallet/tests.rs +++ b/wallet/src/wallet/tests.rs @@ -43,7 +43,7 @@ use crypto::{ }, vrf::transcript::no_rng::VRFTranscript, }; -use randomness::{CryptoRng, Rng, SliceRandom}; +use randomness::{CryptoRng, Rng, RngExt as _, SliceRandom}; use serialization::{extras::non_empty_vec::DataOrNoVec, hex::HexEncode, Encode}; use storage::raw::DbMapId; use test_utils::{ @@ -96,21 +96,21 @@ where *wallet.get_best_block().first_key_value().unwrap().1 } -fn gen_random_password(rng: &mut (impl Rng + CryptoRng)) -> String { - (0..rng.gen_range(1..100)).map(|_| rng.gen::()).collect() +fn gen_random_password(rng: &mut impl CryptoRng) -> String { + (0..rng.random_range(1..100)).map(|_| rng.random::()).collect() } -fn gen_random_transfer(rng: &mut (impl Rng + CryptoRng), amount: Amount) -> TxOutput { +fn gen_random_transfer(rng: &mut impl CryptoRng, amount: Amount) -> TxOutput { let destination = Destination::PublicKey( crypto::key::PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr).1, ); - match rng.gen::() { + match rng.random::() { true => TxOutput::Transfer(OutputValue::Coin(amount), destination), false => { - let lock_for_blocks = rng.gen_range(0..1000); - let current_block_height = BlockHeight::new(rng.gen_range(0..1000)); - let seconds_between_blocks = rng.gen_range(1..1000); - let current_timestamp = BlockTimestamp::from_int_seconds(rng.gen_range(0..1000)); + let lock_for_blocks = rng.random_range(0..1000); + let current_block_height = BlockHeight::new(rng.random_range(0..1000)); + let seconds_between_blocks = rng.random_range(1..1000); + let current_timestamp = BlockTimestamp::from_int_seconds(rng.random_range(0..1000)); gen_random_lock_then_transfer( rng, amount, @@ -125,7 +125,7 @@ fn gen_random_transfer(rng: &mut (impl Rng + CryptoRng), amount: Amount) -> TxOu } fn gen_random_lock_then_transfer( - rng: &mut (impl Rng + CryptoRng), + rng: &mut impl CryptoRng, amount: Amount, destination: Destination, lock_for_blocks: u64, @@ -133,7 +133,7 @@ fn gen_random_lock_then_transfer( seconds_between_blocks: u64, current_timestamp: BlockTimestamp, ) -> TxOutput { - match rng.gen_range(0..4) { + match rng.random_range(0..4) { 0 => TxOutput::LockThenTransfer( OutputValue::Coin(amount), destination, @@ -562,7 +562,7 @@ async fn wallet_migration_to_v2(#[case] seed: Seed) { ); txs.insert( id.encode(), - (0..rng.gen_range(1..10)).map(|_| rng.gen::()).collect(), + (0..rng.random_range(1..10)).map(|_| rng.random::()).collect(), ); } @@ -618,7 +618,7 @@ async fn wallet_seed_phrase_retrieval(#[case] seed: Seed) { assert!(seed_phrase.is_none()); } - let wallet_passphrase: Option = if rng.gen::() { + let wallet_passphrase: Option = if rng.random::() { Some(gen_random_password(&mut rng)) } else { None @@ -891,7 +891,7 @@ async fn wallet_balance_genesis(#[case] seed: Seed) { async fn locked_wallet_balance_works(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); let chain_type = ChainType::Mainnet; - let genesis_amount = Amount::from_atoms(rng.gen_range(1..10000)); + let genesis_amount = Amount::from_atoms(rng.random_range(1..10000)); let chain_config = Arc::new(create_mainnet()); let address = get_address( &chain_config, @@ -1242,7 +1242,7 @@ async fn locked_wallet_accounts_creation_fail(#[case] seed: Seed) { // Need at least one address used from the previous account in order to create a new account // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 1..NETWORK_FEE + 10000)); + let block1_amount = Amount::from_atoms(rng.random_range(NETWORK_FEE + 1..NETWORK_FEE + 10000)); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; let password = Some(gen_random_password(&mut rng)); wallet.encrypt_wallet(&password).unwrap(); @@ -1256,7 +1256,7 @@ async fn locked_wallet_accounts_creation_fail(#[case] seed: Seed) { )) ); - let name: String = (0..rng.gen_range(0..10)).map(|_| rng.gen::()).collect(); + let name: String = (0..rng.random_range(0..10)).map(|_| rng.random::()).collect(); // success after unlock wallet.unlock_wallet(&password.unwrap()).unwrap(); @@ -1288,8 +1288,8 @@ async fn wallet_recover_new_account(#[case] seed: Seed) { let mut total_amounts = BTreeMap::new(); let mut last_account_index = DEFAULT_ACCOUNT_INDEX; let mut blocks = vec![]; - for idx in 0..rng.gen_range(1..100) { - let tx_amount1 = Amount::from_atoms(rng.gen_range(1..10)); + for idx in 0..rng.random_range(1..100) { + let tx_amount1 = Amount::from_atoms(rng.random_range(1..10)); total_amounts .entry(last_account_index) .and_modify(|amount: &mut Amount| *amount = (*amount + tx_amount1).unwrap()) @@ -1313,7 +1313,7 @@ async fn wallet_recover_new_account(#[case] seed: Seed) { ) .await; - if rng.gen_bool(0.2) { + if rng.random_bool(0.2) { last_account_index = wallet.create_next_account(None).await.unwrap().0; } blocks.push(block); @@ -1354,7 +1354,7 @@ async fn locked_wallet_cant_sign_transaction(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 1..NETWORK_FEE + 10000)); + let block1_amount = Amount::from_atoms(rng.random_range(NETWORK_FEE + 1..NETWORK_FEE + 10000)); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; let password = Some(gen_random_password(&mut rng)); @@ -1366,7 +1366,7 @@ async fn locked_wallet_cant_sign_transaction(#[case] seed: Seed) { let new_output = TxOutput::Transfer( OutputValue::Coin(Amount::from_atoms( - rng.gen_range(1..=block1_amount.into_atoms() - NETWORK_FEE), + rng.random_range(1..=block1_amount.into_atoms() - NETWORK_FEE), )), Destination::AnyoneCanSpend, ); @@ -1390,7 +1390,7 @@ async fn locked_wallet_cant_sign_transaction(#[case] seed: Seed) { // success after unlock wallet.unlock_wallet(&password.unwrap()).unwrap(); - if rng.gen::() { + if rng.random::() { wallet .create_transaction_to_addresses( DEFAULT_ACCOUNT_INDEX, @@ -1475,15 +1475,15 @@ async fn locked_wallet_standalone_keys( wallet.encrypt_wallet(&password).unwrap(); } - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 1..NETWORK_FEE + 10000)); + let block1_amount = Amount::from_atoms(rng.random_range(NETWORK_FEE + 1..NETWORK_FEE + 10000)); - let standalone_destination = if rng.gen::() { + let standalone_destination = if rng.random::() { Destination::PublicKey(standalone_pk) } else { Destination::PublicKeyHash((&standalone_pk).into()) }; - if rng.gen::() { + if rng.random::() { // test that wallet will recognise a destination belonging to a standalone key in a block // reward let _ = create_block_with_reward_address( @@ -1543,7 +1543,7 @@ async fn locked_wallet_standalone_keys( let new_output = TxOutput::Transfer( OutputValue::Coin(Amount::from_atoms( - rng.gen_range(1..=block1_amount.into_atoms() - NETWORK_FEE), + rng.random_range(1..=block1_amount.into_atoms() - NETWORK_FEE), )), Destination::AnyoneCanSpend, ); @@ -1591,7 +1591,7 @@ async fn wallet_get_transaction(#[case] seed: Seed) { let mut wallet = create_wallet(chain_config.clone()).await; // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(100000..1000000)); + let block1_amount = Amount::from_atoms(rng.random_range(100000..1000000)); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; let coin_balance = get_coin_balance(&wallet); @@ -1653,7 +1653,7 @@ async fn wallet_list_mainchain_transactions(#[case] seed: Seed) { let mut wallet = create_wallet(chain_config.clone()).await; // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(100000..1000000)); + let block1_amount = Amount::from_atoms(rng.random_range(100000..1000000)); let (addr, _) = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; let dest = addr.into_object(); @@ -1744,7 +1744,7 @@ async fn wallet_transactions_with_fees(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(30000000..50000000)); + let block1_amount = Amount::from_atoms(rng.random_range(30000000..50000000)); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; let coin_balance = get_coin_balance(&wallet); @@ -1779,9 +1779,9 @@ async fn wallet_transactions_with_fees(#[case] seed: Seed) { // make a transaction with multiple outputs to the same address so we can later sweep them all // again - let feerate = FeeRate::from_amount_per_kb(Amount::from_atoms(rng.gen_range(1..1000))); + let feerate = FeeRate::from_amount_per_kb(Amount::from_atoms(rng.random_range(1..1000))); - let num_outputs = rng.gen_range(1..1000); + let num_outputs = rng.random_range(1..1000); let (_, pk) = PrivateKey::new_from_rng(&mut rng, KeyKind::Secp256k1Schnorr); // Max LockThenTransfer size let max_output = TxOutput::LockThenTransfer( @@ -1791,7 +1791,7 @@ async fn wallet_transactions_with_fees(#[case] seed: Seed) { ); let max_output_size = serialization::Encode::encoded_size(&max_output); let reserve_for_fee = feerate.compute_fee(max_output_size * num_outputs * 2).unwrap(); - let amount_to_transfer_per_output = Amount::from_atoms(rng.gen_range( + let amount_to_transfer_per_output = Amount::from_atoms(rng.random_range( NETWORK_FEE ..=((block1_amount.into_atoms() - NETWORK_FEE - reserve_for_fee.into_atoms()) / (num_outputs * 2) as u128), @@ -1870,7 +1870,7 @@ async fn wallet_transactions_with_fees(#[case] seed: Seed) { let account1 = wallet.create_next_account(None).await.unwrap().0; let address2 = wallet.get_new_address(account1).unwrap().1.into_object(); - let feerate = FeeRate::from_amount_per_kb(Amount::from_atoms(rng.gen_range(1..1000))); + let feerate = FeeRate::from_amount_per_kb(Amount::from_atoms(rng.random_range(1..1000))); let SignedTxWithFees { tx, fees } = wallet .create_sweep_transaction( DEFAULT_ACCOUNT_INDEX, @@ -1940,7 +1940,7 @@ async fn spend_from_user_specified_utxos(#[case] seed: Seed) { let mut wallet = create_wallet(chain_config.clone()).await; // Generate a new block which sends reward to the wallet - let utxo_amount = Amount::from_atoms(rng.gen_range(100..10000)); + let utxo_amount = Amount::from_atoms(rng.random_range(100..10000)); let reward_outputs = (0..10) .map(|idx| { let address = get_address( @@ -1971,7 +1971,7 @@ async fn spend_from_user_specified_utxos(#[case] seed: Seed) { WithLocked::Unlocked, ) .unwrap(); - let burn_amount = Amount::from_atoms(rng.gen_range(1..utxo_amount.into_atoms())); + let burn_amount = Amount::from_atoms(rng.random_range(1..utxo_amount.into_atoms())); { let missing_utxo = @@ -2000,7 +2000,7 @@ async fn spend_from_user_specified_utxos(#[case] seed: Seed) { let selected_utxos = utxos .iter() .map(|(outpoint, _)| outpoint) - .take(rng.gen_range(1..utxos.len())) + .take(rng.random_range(1..utxos.len())) .cloned() .collect_vec(); @@ -2078,7 +2078,8 @@ async fn create_stake_pool_and_list_pool_ids(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; let pool_ids = wallet.get_pools(DEFAULT_ACCOUNT_INDEX, WalletPoolsFilter::All).unwrap(); @@ -2277,7 +2278,8 @@ async fn create_stake_pool_for_different_wallet_and_list_pool_ids(#[case] seed: assert_eq!(coin_balance2, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let (_, block1) = create_block(&chain_config, &mut wallet1, vec![], block1_amount, 0).await; scan_wallet(&mut wallet2, BlockHeight::new(0), vec![block1]).await; @@ -2293,8 +2295,9 @@ async fn create_stake_pool_for_different_wallet_and_list_pool_ids(#[case] seed: let pool_amount = block1_amount; let margin_ratio_per_thousand = PerThousand::new_from_rng(&mut rng); - let cost_per_block = - Amount::from_atoms(rng.gen_range(0..10) * 10_u128.pow(chain_config.coin_decimals() as u32)); + let cost_per_block = Amount::from_atoms( + rng.random_range(0..10) * 10_u128.pow(chain_config.coin_decimals() as u32), + ); let decommission_dest = wallet1.get_new_address(DEFAULT_ACCOUNT_INDEX).unwrap().1.into_object(); @@ -2547,7 +2550,8 @@ async fn reset_keys_after_failed_transaction(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; let coin_balance = get_coin_balance(&wallet); @@ -2601,7 +2605,7 @@ async fn send_to_unknown_delegation(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let delegation_amount = Amount::from_atoms(rng.gen_range(2..100)); + let delegation_amount = Amount::from_atoms(rng.random_range(2..100)); let block1_amount = delegation_amount; let block_height = 0; let (_, block) = create_block( @@ -2778,7 +2782,7 @@ async fn create_spend_from_delegations(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let delegation_amount = Amount::from_atoms(rng.gen_range(2..100)); + let delegation_amount = Amount::from_atoms(rng.random_range(2..100)); let block1_amount = (chain_config.min_stake_pool_pledge() + delegation_amount).unwrap(); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; @@ -3037,7 +3041,7 @@ async fn issue_and_transfer_tokens(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // True for fungible, false for NFT - let issue_fungible_token = rng.gen::(); + let issue_fungible_token = rng.random::(); let issuance_fee = if issue_fungible_token { chain_config.fungible_token_issuance_fee() @@ -3048,7 +3052,7 @@ async fn issue_and_transfer_tokens(#[case] seed: Seed) { let some_coins = 100; // Generate a new block which sends reward to the issuing wallet. let mut block1_amount = (Amount::from_atoms( - rng.gen_range(NETWORK_FEE + some_coins..NETWORK_FEE + some_coins * 100), + rng.random_range(NETWORK_FEE + some_coins..NETWORK_FEE + some_coins * 100), ) + issuance_fee) .unwrap(); @@ -3060,7 +3064,7 @@ async fn issue_and_transfer_tokens(#[case] seed: Seed) { let token_authority_and_destination = wallet.get_new_address(DEFAULT_ACCOUNT_INDEX).unwrap().1; // Issue token randomly from wallet2 to wallet1 or wallet1 to wallet2 - let (random_issuing_wallet, other_wallet) = if rng.gen::() { + let (random_issuing_wallet, other_wallet) = if rng.random::() { (&mut wallet, &mut wallet2) } else { (&mut wallet2, &mut wallet) @@ -3080,9 +3084,9 @@ async fn issue_and_transfer_tokens(#[case] seed: Seed) { assert_eq!(coin_balance, block1_amount); let amount_fraction = (block1_amount.into_atoms() - NETWORK_FEE) / 10; - let mut token_amount_to_issue = Amount::from_atoms(rng.gen_range(1..amount_fraction)); + let mut token_amount_to_issue = Amount::from_atoms(rng.random_range(1..amount_fraction)); - let mut number_of_decimals = rng.gen_range(1..18); + let mut number_of_decimals = rng.random_range(1..18); let token_ticker = "XXXX".as_bytes().to_vec(); let (issued_token_id, token_issuance_transactions) = if issue_fungible_token { let token_issuance = TokenIssuanceV1 { @@ -3250,7 +3254,7 @@ async fn issue_and_transfer_tokens(#[case] seed: Seed) { assert_eq!(*token_amount, token_amount_to_issue); let tokens_to_transfer = - Amount::from_atoms(rng.gen_range(1..=token_amount_to_issue.into_atoms())); + Amount::from_atoms(rng.random_range(1..=token_amount_to_issue.into_atoms())); let some_other_address = PublicKeyHash::from_low_u64_be(1); let new_output = TxOutput::Transfer( @@ -3311,10 +3315,9 @@ async fn issue_and_transfer_tokens(#[case] seed: Seed) { (token_amount_to_issue - tokens_to_transfer).expect("") ); - let not_enough_tokens_to_transfer = - Amount::from_atoms(rng.gen_range( - token_amount_to_issue.into_atoms()..=token_amount_to_issue.into_atoms() + 100, - )); + let not_enough_tokens_to_transfer = Amount::from_atoms(rng.random_range( + token_amount_to_issue.into_atoms()..=token_amount_to_issue.into_atoms() + 100, + )); let some_other_address = PublicKeyHash::from_low_u64_be(1); let new_output = TxOutput::Transfer( @@ -3366,9 +3369,10 @@ async fn check_tokens_v0_are_ignored(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = (Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) - + chain_config.fungible_token_issuance_fee()) - .unwrap(); + let block1_amount = + (Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) + + chain_config.fungible_token_issuance_fee()) + .unwrap(); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; @@ -3377,7 +3381,7 @@ async fn check_tokens_v0_are_ignored(#[case] seed: Seed) { let address2 = wallet.get_new_address(DEFAULT_ACCOUNT_INDEX).unwrap().1; let token_ticker = "XXXX".as_bytes().to_vec(); - let number_of_decimals = rng.gen_range(1..18); + let number_of_decimals = rng.random_range(1..18); let result = wallet .create_transaction_to_addresses( DEFAULT_ACCOUNT_INDEX, @@ -3387,7 +3391,7 @@ async fn check_tokens_v0_are_ignored(#[case] seed: Seed) { token_ticker, number_of_decimals, metadata_uri: "http://uri".as_bytes().to_vec(), - amount_to_issue: Amount::from_atoms(rng.gen_range(1..10000)), + amount_to_issue: Amount::from_atoms(rng.random_range(1..10000)), }, )))), address2.into_object(), @@ -3427,20 +3431,21 @@ async fn freeze_and_unfreeze_tokens(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = (Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) - + (chain_config.fungible_token_issuance_fee() * 4).unwrap()) - .unwrap(); + let block1_amount = + (Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) + + (chain_config.fungible_token_issuance_fee() * 4).unwrap()) + .unwrap(); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; let coin_balance = get_coin_balance(&wallet); assert_eq!(coin_balance, block1_amount); - let fixed_max_amount = Amount::from_atoms(rng.gen_range(1..100000)); + let fixed_max_amount = Amount::from_atoms(rng.random_range(1..100000)); let address2 = wallet.get_new_address(DEFAULT_ACCOUNT_INDEX).unwrap().1; let token_issuance = TokenIssuanceV1 { token_ticker: "XXXX".as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: "http://uri".as_bytes().to_vec(), total_supply: common::chain::tokens::TokenTotalSupply::Fixed(fixed_max_amount), authority: address2.as_object().clone(), @@ -3485,7 +3490,7 @@ async fn freeze_and_unfreeze_tokens(#[case] seed: Seed) { .get_token_unconfirmed_info(DEFAULT_ACCOUNT_INDEX, token_info.clone()) .unwrap(); - let amount_to_mint = Amount::from_atoms(rng.gen_range(1..=fixed_max_amount.into_atoms())); + let amount_to_mint = Amount::from_atoms(rng.random_range(1..=fixed_max_amount.into_atoms())); let mint_tx = wallet .mint_tokens( DEFAULT_ACCOUNT_INDEX, @@ -3621,7 +3626,7 @@ async fn freeze_and_unfreeze_tokens(#[case] seed: Seed) { .unwrap() .tx; - let tokens_to_transfer = Amount::from_atoms(rng.gen_range(1..=amount_to_mint.into_atoms())); + let tokens_to_transfer = Amount::from_atoms(rng.random_range(1..=amount_to_mint.into_atoms())); let some_other_address = PublicKeyHash::from_low_u64_be(1); let new_output = TxOutput::Transfer( OutputValue::TokenV1(issued_token_id, tokens_to_transfer), @@ -3744,20 +3749,21 @@ async fn change_token_supply_fixed(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = (Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) - + chain_config.fungible_token_issuance_fee()) - .unwrap(); + let block1_amount = + (Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) + + chain_config.fungible_token_issuance_fee()) + .unwrap(); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; let coin_balance = get_coin_balance(&wallet); assert_eq!(coin_balance, block1_amount); - let fixed_max_amount = Amount::from_atoms(rng.gen_range(1..100000)); + let fixed_max_amount = Amount::from_atoms(rng.random_range(1..100000)); let address2 = wallet.get_new_address(DEFAULT_ACCOUNT_INDEX).unwrap().1; let token_issuance = TokenIssuanceV1 { token_ticker: "XXXX".as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: "http://uri".as_bytes().to_vec(), total_supply: common::chain::tokens::TokenTotalSupply::Fixed(fixed_max_amount), authority: address2.as_object().clone(), @@ -3816,7 +3822,8 @@ async fn change_token_supply_fixed(#[case] seed: Seed) { Amount::ZERO, ); - let token_amount_to_mint = Amount::from_atoms(rng.gen_range(1..=fixed_max_amount.into_atoms())); + let token_amount_to_mint = + Amount::from_atoms(rng.random_range(1..=fixed_max_amount.into_atoms())); let mint_transaction = wallet .mint_tokens( DEFAULT_ACCOUNT_INDEX, @@ -3839,7 +3846,7 @@ async fn change_token_supply_fixed(#[case] seed: Seed) { // Try to mint more then the fixed maximum let leftover = (fixed_max_amount - token_amount_to_mint).unwrap(); let token_amount_to_mint_more_than_maximum = - (leftover + Amount::from_atoms(rng.gen_range(1..1000))).unwrap(); + (leftover + Amount::from_atoms(rng.random_range(1..1000))).unwrap(); let err = wallet .mint_tokens( DEFAULT_ACCOUNT_INDEX, @@ -3937,7 +3944,7 @@ async fn change_token_supply_fixed(#[case] seed: Seed) { ); let token_amount_to_unmint = - Amount::from_atoms(rng.gen_range(1..=token_amount_to_mint.into_atoms())); + Amount::from_atoms(rng.random_range(1..=token_amount_to_mint.into_atoms())); let unmint_transaction = wallet .unmint_tokens( DEFAULT_ACCOUNT_INDEX, @@ -4011,9 +4018,10 @@ async fn change_token_supply_unlimited(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = (Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) - + chain_config.fungible_token_issuance_fee()) - .unwrap(); + let block1_amount = + (Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) + + chain_config.fungible_token_issuance_fee()) + .unwrap(); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; @@ -4023,7 +4031,7 @@ async fn change_token_supply_unlimited(#[case] seed: Seed) { let address2 = wallet.get_new_address(DEFAULT_ACCOUNT_INDEX).unwrap().1; let token_issuance = TokenIssuanceV1 { token_ticker: "XXXX".as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: "http://uri".as_bytes().to_vec(), total_supply: common::chain::tokens::TokenTotalSupply::Unlimited, authority: address2.as_object().clone(), @@ -4083,7 +4091,7 @@ async fn change_token_supply_unlimited(#[case] seed: Seed) { Amount::ZERO, ); - let token_amount_to_mint = Amount::from_atoms(rng.gen_range(1..10000)); + let token_amount_to_mint = Amount::from_atoms(rng.random_range(1..10000)); let mint_transaction = wallet .mint_tokens( DEFAULT_ACCOUNT_INDEX, @@ -4144,7 +4152,7 @@ async fn change_token_supply_unlimited(#[case] seed: Seed) { ); let token_amount_to_unmint = - Amount::from_atoms(rng.gen_range(1..=token_amount_to_mint.into_atoms())); + Amount::from_atoms(rng.random_range(1..=token_amount_to_mint.into_atoms())); let unmint_transaction = wallet .unmint_tokens( DEFAULT_ACCOUNT_INDEX, @@ -4217,9 +4225,10 @@ async fn change_and_lock_token_supply_lockable(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = (Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) - + chain_config.fungible_token_issuance_fee()) - .unwrap(); + let block1_amount = + (Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) + + chain_config.fungible_token_issuance_fee()) + .unwrap(); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; @@ -4229,7 +4238,7 @@ async fn change_and_lock_token_supply_lockable(#[case] seed: Seed) { let address2 = wallet.get_new_address(DEFAULT_ACCOUNT_INDEX).unwrap().1; let token_issuance = TokenIssuanceV1 { token_ticker: "XXXX".as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: "http://uri".as_bytes().to_vec(), total_supply: common::chain::tokens::TokenTotalSupply::Lockable, authority: address2.as_object().clone(), @@ -4289,7 +4298,7 @@ async fn change_and_lock_token_supply_lockable(#[case] seed: Seed) { Amount::ZERO, ); - let token_amount_to_mint = Amount::from_atoms(rng.gen_range(2..100)); + let token_amount_to_mint = Amount::from_atoms(rng.random_range(2..100)); let mint_transaction = wallet .mint_tokens( DEFAULT_ACCOUNT_INDEX, @@ -4349,7 +4358,7 @@ async fn change_and_lock_token_supply_lockable(#[case] seed: Seed) { ); let token_amount_to_unmint = - Amount::from_atoms(rng.gen_range(1..=token_amount_to_mint.into_atoms())); + Amount::from_atoms(rng.random_range(1..=token_amount_to_mint.into_atoms())); let unmint_transaction = wallet .unmint_tokens( DEFAULT_ACCOUNT_INDEX, @@ -4486,7 +4495,8 @@ async fn lock_then_transfer(#[case] seed: Seed) { let timestamp = chain_config.genesis_block().timestamp().add_int_seconds(10).unwrap(); // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let address = get_address( &chain_config, MNEMONIC, @@ -4506,7 +4516,7 @@ async fn lock_then_transfer(#[case] seed: Seed) { ) .unwrap(); - let seconds_between_blocks = rng.gen_range(10..100); + let seconds_between_blocks = rng.random_range(10..100); let block1_id = block1.get_id(); // not important that it is not the actual median wallet.set_median_time(timestamp).unwrap(); @@ -4522,8 +4532,8 @@ async fn lock_then_transfer(#[case] seed: Seed) { let destination = address2.into_object(); let amount_fraction = (block1_amount.into_atoms() - NETWORK_FEE) / 10; - let block_count_lock = rng.gen_range(1..10); - let amount_to_lock_then_transfer = Amount::from_atoms(rng.gen_range(1..amount_fraction)); + let block_count_lock = rng.random_range(1..10); + let amount_to_lock_then_transfer = Amount::from_atoms(rng.random_range(1..amount_fraction)); let new_output = gen_random_lock_then_transfer( &mut rng, amount_to_lock_then_transfer, @@ -4626,12 +4636,13 @@ async fn wallet_multiple_transactions_in_single_block(#[case] seed: Seed) { let mut wallet = create_wallet(chain_config.clone()).await; - let blocks_to_add = rng.gen_range(1..10); + let blocks_to_add = rng.random_range(1..10); let mut amounts = vec![]; for i in 0..blocks_to_add { // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 1..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 1..NETWORK_FEE + 10000)); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, i as u64).await; amounts.push(block1_amount); } @@ -4645,7 +4656,7 @@ async fn wallet_multiple_transactions_in_single_block(#[case] seed: Seed) { let mut total_change = Amount::ZERO; for block_amount in amounts { - let amount_to_transfer = rng.gen_range(1..=block_amount.into_atoms()); + let amount_to_transfer = rng.random_range(1..=block_amount.into_atoms()); let amount_to_transfer = Amount::from_atoms(amount_to_transfer); let change = (block_amount - amount_to_transfer).unwrap(); @@ -4710,13 +4721,13 @@ async fn wallet_scan_multiple_transactions_from_mempool(#[case] seed: Seed) { let coin_balance = get_coin_balance(&wallet); assert_eq!(coin_balance, Amount::ZERO); - let num_transactions_to_scan_from_mempool = rng.gen_range(1..5); + let num_transactions_to_scan_from_mempool = rng.random_range(1..5); let total_num_transactions: u32 = num_transactions_to_scan_from_mempool + 1; // Generate a new block which sends reward to the wallet // with enough coins for the total transactions - let block1_amount = Amount::from_atoms(rng.gen_range( + let block1_amount = Amount::from_atoms(rng.random_range( (NETWORK_FEE + 1) * (total_num_transactions as u128) ..=(NETWORK_FEE + 1) * (total_num_transactions as u128) + 10000, )); @@ -4731,7 +4742,7 @@ async fn wallet_scan_multiple_transactions_from_mempool(#[case] seed: Seed) { let mut total_amount = block1_amount; for idx in 1..(num_transactions_to_scan_from_mempool - 1) { - let amount_to_transfer = Amount::from_atoms(rng.gen_range( + let amount_to_transfer = Amount::from_atoms(rng.random_range( 1..=(total_amount.into_atoms() - (num_transactions_to_scan_from_mempool - idx) as u128), )); let change = (total_amount - amount_to_transfer).unwrap(); @@ -4778,7 +4789,7 @@ async fn wallet_scan_multiple_transactions_from_mempool(#[case] seed: Seed) { } assert!(total_amount.into_atoms() > 1); - let amount_to_transfer = rng.gen_range(1..total_amount.into_atoms()); + let amount_to_transfer = rng.random_range(1..total_amount.into_atoms()); let amount_to_keep = (total_amount - Amount::from_atoms(amount_to_transfer)).unwrap(); // Last transaction doesn't have wallets's outputs so the wallet will need to identify it by @@ -4905,11 +4916,11 @@ async fn wallet_abandon_transactions(#[case] seed: Seed) { let coin_balance = get_coin_balance(&wallet); assert_eq!(coin_balance, Amount::ZERO); - let total_num_transactions: u32 = rng.gen_range(1..5); + let total_num_transactions: u32 = rng.random_range(1..5); // Generate a new block which sends reward to the wallet // with enough coins for the total transactions - let block1_amount = Amount::from_atoms(rng.gen_range( + let block1_amount = Amount::from_atoms(rng.random_range( (NETWORK_FEE + 1) * (total_num_transactions as u128) ..=(NETWORK_FEE + 1) * (total_num_transactions as u128) + 10000, )); @@ -4924,9 +4935,9 @@ async fn wallet_abandon_transactions(#[case] seed: Seed) { let mut total_amount = block1_amount; for idx in 0..total_num_transactions { - let amount_to_transfer = Amount::from_atoms( - rng.gen_range(1..=(total_amount.into_atoms() - (total_num_transactions - idx) as u128)), - ); + let amount_to_transfer = Amount::from_atoms(rng.random_range( + 1..=(total_amount.into_atoms() - (total_num_transactions - idx) as u128), + )); let change = (total_amount - amount_to_transfer).unwrap(); let address = get_address( @@ -4982,7 +4993,7 @@ async fn wallet_abandon_transactions(#[case] seed: Seed) { assert_eq!(abandonable_transactions.len(), transactions.len()); - let txs_to_abandon = rng.gen_range(0..total_num_transactions) as usize; + let txs_to_abandon = rng.random_range(0..total_num_transactions) as usize; let (txs_to_keep, txs_to_abandon) = transactions.split_at(txs_to_abandon); assert!(!txs_to_abandon.is_empty()); @@ -5051,7 +5062,7 @@ async fn wallet_address_usage(#[case] seed: Seed) { assert_eq!(usage.last_issued(), None); // issue some new address - let addresses_to_issue = rng.gen_range(1..10); + let addresses_to_issue = rng.random_range(1..10); for _ in 0..=addresses_to_issue { let _ = wallet.get_new_address(DEFAULT_ACCOUNT_INDEX).unwrap(); } @@ -5092,7 +5103,7 @@ async fn wallet_set_lookahead_size(#[case] seed: Seed) { assert_eq!(usage.last_issued(), None); // issue some new address - let addresses_to_issue = rng.gen_range(1..10); + let addresses_to_issue = rng.random_range(1..10); for _ in 0..=addresses_to_issue { let _ = wallet.get_new_address(DEFAULT_ACCOUNT_INDEX).unwrap(); } @@ -5119,7 +5130,7 @@ async fn wallet_set_lookahead_size(#[case] seed: Seed) { let coins = get_coin_balance_for_acc(&wallet, DEFAULT_ACCOUNT_INDEX); assert_eq!(coins, block1_amount); - let less_than_last_used = rng.gen_range(1..=last_used); + let less_than_last_used = rng.random_range(1..=last_used); let err = wallet.set_lookahead_size(less_than_last_used, false).unwrap_err(); assert_eq!( err, @@ -5137,7 +5148,7 @@ async fn wallet_set_lookahead_size(#[case] seed: Seed) { assert_eq!(usage.last_used(), None); assert_eq!(usage.last_issued(), None); - let more_than_last_used = rng.gen_range(last_used + 1..100); + let more_than_last_used = rng.random_range(last_used + 1..100); wallet.set_lookahead_size(more_than_last_used, false).unwrap(); scan_wallet(&mut wallet, BlockHeight::new(0), vec![block1.clone()]).await; @@ -5167,7 +5178,8 @@ async fn decommission_pool_wrong_account(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; let pool_ids = wallet.get_pools(acc_0_index, WalletPoolsFilter::All).unwrap(); @@ -5271,7 +5283,8 @@ async fn decommission_pool_request_wrong_account(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; let pool_ids = wallet.get_pools(acc_0_index, WalletPoolsFilter::All).unwrap(); @@ -5366,7 +5379,8 @@ async fn sign_decommission_pool_request_between_accounts(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let (addr, _) = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; let utxo = make_address_output(addr.clone().into_object(), block1_amount); @@ -5500,7 +5514,8 @@ async fn sign_decommission_pool_request_cold_wallet(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let _ = create_block(&chain_config, &mut hot_wallet, vec![], block1_amount, 0).await; let pool_ids = hot_wallet.get_pools(DEFAULT_ACCOUNT_INDEX, WalletPoolsFilter::All).unwrap(); @@ -5616,7 +5631,8 @@ async fn filter_pools(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let _ = create_block(&chain_config, &mut wallet1, vec![], block1_amount, 0).await; let _ = create_block(&chain_config, &mut wallet2, vec![], block1_amount, 0).await; @@ -5709,7 +5725,8 @@ async fn sign_send_request_cold_wallet(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the cold wallet address - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let reward_output = make_address_output(cold_wallet_address.clone().into_object(), block1_amount); let block1 = Block::new( @@ -5824,7 +5841,8 @@ async fn test_not_exhaustion_of_keys(#[case] seed: Seed) { let address = wallet.get_new_address(DEFAULT_ACCOUNT_INDEX).unwrap().1; // Generate a new block which sends reward to the cold wallet address - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let reward_output = make_address_output(address.clone().into_object(), block1_amount); let block1 = Block::new( vec![], @@ -5899,7 +5917,8 @@ async fn test_add_standalone_multisig(#[case] seed: Seed) { Address::new(&chain_config, Destination::ClassicMultisig(multisig_hash)).unwrap(); // Generate a new block which sends reward to the new multisig address - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let output = make_address_output(multisig_address.clone().into_object(), block1_amount); let tx = @@ -6009,7 +6028,8 @@ async fn create_htlc_and_spend(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let _ = create_block(&chain_config, &mut wallet1, vec![], block1_amount, 0).await; let coin_balance = get_coin_balance(&wallet1); @@ -6155,7 +6175,8 @@ async fn create_htlc_and_refund(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); + let block1_amount = + Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)); let _ = create_block(&chain_config, &mut wallet1, vec![], block1_amount, 0).await; let coin_balance = get_coin_balance(&wallet1); @@ -6319,9 +6340,10 @@ async fn create_order(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = (Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) - + chain_config.fungible_token_issuance_fee()) - .unwrap(); + let block1_amount = + (Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) + + chain_config.fungible_token_issuance_fee()) + .unwrap(); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; @@ -6376,7 +6398,7 @@ async fn create_order(#[case] seed: Seed) { .get_token_unconfirmed_info(DEFAULT_ACCOUNT_INDEX, token_info.clone()) .unwrap(); - let token_amount_to_mint = Amount::from_atoms(rng.gen_range(2..100)); + let token_amount_to_mint = Amount::from_atoms(rng.random_range(2..100)); let mint_transaction = wallet .mint_tokens( DEFAULT_ACCOUNT_INDEX, @@ -6459,9 +6481,10 @@ async fn create_order_and_conclude(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = (Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) - + chain_config.fungible_token_issuance_fee()) - .unwrap(); + let block1_amount = + (Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) + + chain_config.fungible_token_issuance_fee()) + .unwrap(); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; @@ -6516,7 +6539,7 @@ async fn create_order_and_conclude(#[case] seed: Seed) { .get_token_unconfirmed_info(DEFAULT_ACCOUNT_INDEX, token_info.clone()) .unwrap(); - let token_amount_to_mint = Amount::from_atoms(rng.gen_range(2..100)); + let token_amount_to_mint = Amount::from_atoms(rng.random_range(2..100)); let mint_transaction = wallet .mint_tokens( DEFAULT_ACCOUNT_INDEX, @@ -6661,9 +6684,10 @@ async fn create_order_fill_completely_conclude(#[case] seed: Seed) { assert_eq!(get_coin_balance(&wallet2), Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = (Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) - + chain_config.fungible_token_issuance_fee()) - .unwrap(); + let block1_amount = + (Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) + + chain_config.fungible_token_issuance_fee()) + .unwrap(); let (_, block1) = create_block(&chain_config, &mut wallet1, vec![], block1_amount, 0).await; scan_wallet(&mut wallet2, BlockHeight::new(0), vec![block1]).await; @@ -7054,9 +7078,10 @@ async fn create_order_fill_partially_conclude(#[case] seed: Seed) { assert_eq!(get_coin_balance(&wallet2), Amount::ZERO); // Generate a new block which sends reward to the wallet - let block1_amount = (Amount::from_atoms(rng.gen_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) - + chain_config.fungible_token_issuance_fee()) - .unwrap(); + let block1_amount = + (Amount::from_atoms(rng.random_range(NETWORK_FEE + 100..NETWORK_FEE + 10000)) + + chain_config.fungible_token_issuance_fee()) + .unwrap(); let (_, block1) = create_block(&chain_config, &mut wallet1, vec![], block1_amount, 0).await; scan_wallet(&mut wallet2, BlockHeight::new(0), vec![block1]).await; @@ -7389,7 +7414,7 @@ async fn conflicting_delegation_account_nonce(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let delegation_amount = Amount::from_atoms(rng.gen_range(10..100)); + let delegation_amount = Amount::from_atoms(rng.random_range(10..100)); let block1_amount = (chain_config.min_stake_pool_pledge() + delegation_amount).unwrap(); let (_, block1) = create_block(&chain_config, &mut wallet1, vec![], block1_amount, 0).await; scan_wallet(&mut wallet2, BlockHeight::new(0), vec![block1]).await; @@ -7694,7 +7719,7 @@ async fn conflicting_delegation_account_nonce_same_wallet(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let delegation_amount = Amount::from_atoms(rng.gen_range(2..100)); + let delegation_amount = Amount::from_atoms(rng.random_range(2..100)); let block1_amount = (chain_config.min_stake_pool_pledge() + delegation_amount).unwrap(); let _ = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; @@ -8239,7 +8264,7 @@ async fn conflicting_delegation_account_nonce_multiple_inputs(#[case] seed: Seed assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let delegation_amount = Amount::from_atoms(rng.gen_range(10..100)); + let delegation_amount = Amount::from_atoms(rng.random_range(10..100)); let block1_amount = (chain_config.min_stake_pool_pledge() + delegation_amount).unwrap(); let (_, block1) = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; scan_wallet(&mut wallet2, BlockHeight::new(0), vec![block1]).await; @@ -8529,7 +8554,7 @@ async fn conflicting_delegation_account_with_reorg(#[case] seed: Seed) { assert_eq!(coin_balance, Amount::ZERO); // Generate a new block which sends reward to the wallet - let delegation_amount = Amount::from_atoms(rng.gen_range(10..100)); + let delegation_amount = Amount::from_atoms(rng.random_range(10..100)); let block1_amount = (chain_config.min_stake_pool_pledge() + delegation_amount).unwrap(); let (_, block1) = create_block(&chain_config, &mut wallet, vec![], block1_amount, 0).await; scan_wallet(&mut wallet2, BlockHeight::new(0), vec![block1]).await; @@ -8767,7 +8792,7 @@ async fn rollback_utxos_after_abandon(#[case] seed: Seed) { let mut wallet = create_wallet(chain_config.clone()).await; // Generate a new block which sends reward to the wallet - let utxo_amount = Amount::from_atoms(rng.gen_range(100..10000)); + let utxo_amount = Amount::from_atoms(rng.random_range(100..10000)); let reward_outputs = (0..10) .map(|idx| { let address = get_address( @@ -8803,7 +8828,7 @@ async fn rollback_utxos_after_abandon(#[case] seed: Seed) { let selected_utxos = utxos .iter() .map(|(outpoint, _)| outpoint) - .take(rng.gen_range(1..utxos.len())) + .take(rng.random_range(1..utxos.len())) .cloned() .collect_vec(); @@ -8899,17 +8924,17 @@ async fn token_id_generation_v1_uses_first_tx_input(#[case] seed: Seed) { let needed_balance = ((chain_config.fungible_token_issuance_fee() + chain_config.nft_issuance_fee(BlockHeight::zero())) .unwrap() - + Amount::from_atoms(rng.gen_range(NETWORK_FEE * 2..NETWORK_FEE * 10))) + + Amount::from_atoms(rng.random_range(NETWORK_FEE * 2..NETWORK_FEE * 10))) .unwrap(); let generated_blocks_count = { - let min_blocks = rng.gen_range(1..5); + let min_blocks = rng.random_range(1..5); let mut generated_blocks_count = 0; let mut cur_balance = Amount::ZERO; while generated_blocks_count < min_blocks || cur_balance < needed_balance { let block_amount = Amount::from_atoms( - rng.gen_range(needed_balance.into_atoms() / 10..needed_balance.into_atoms()), + rng.random_range(needed_balance.into_atoms() / 10..needed_balance.into_atoms()), ); let _ = create_block( @@ -8950,7 +8975,7 @@ async fn token_id_generation_v1_uses_first_tx_input(#[case] seed: Seed) { { let token_issuance = TokenIssuanceV1 { token_ticker: "XXXX".as_bytes().to_vec(), - number_of_decimals: rng.gen_range(1..18), + number_of_decimals: rng.random_range(1..18), metadata_uri: "http://uri".as_bytes().to_vec(), total_supply: common::chain::tokens::TokenTotalSupply::Unlimited, authority: token_authority_and_destination.as_object().clone(), diff --git a/wallet/storage/src/internal/password.rs b/wallet/storage/src/internal/password.rs index 353ed3083b..e990439361 100644 --- a/wallet/storage/src/internal/password.rs +++ b/wallet/storage/src/internal/password.rs @@ -103,7 +103,7 @@ pub fn challenge_to_sym_key( #[cfg(test)] mod test { - use randomness::Rng; + use randomness::RngExt; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; @@ -115,7 +115,8 @@ mod test { fn test_password_to_challenge_and_back(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let password: String = (0..rng.gen_range(1..100)).map(|_| rng.gen::()).collect(); + let password: String = + (0..rng.random_range(1..100)).map(|_| rng.random::()).collect(); let (original_key, kdf_challenge) = password_to_sym_key(&password).unwrap(); let reconstructed_key = challenge_to_sym_key(&password, kdf_challenge).unwrap(); diff --git a/wallet/storage/src/internal/test.rs b/wallet/storage/src/internal/test.rs index 404cc6f7d4..af2ef5e01a 100644 --- a/wallet/storage/src/internal/test.rs +++ b/wallet/storage/src/internal/test.rs @@ -21,13 +21,13 @@ use crate::{ use crypto::key::extended::{ExtendedKeyKind, ExtendedPrivateKey}; use crypto::vrf::ExtendedVRFPrivateKey; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, RngExt as _}; use rstest::rstest; use test_utils::random::{make_seedable_rng, Seed}; use wallet_types::keys::RootKeys; -fn gen_random_password(rng: &mut (impl Rng + CryptoRng)) -> String { - (0..rng.gen_range(1..100)).map(|_| rng.gen::()).collect() +fn gen_random_password(rng: &mut impl CryptoRng) -> String { + (0..rng.random_range(1..100)).map(|_| rng.random::()).collect() } #[test] @@ -53,7 +53,7 @@ fn compare_encrypt_and_decrypt_root_key(#[case] seed: Seed) { let mut store = Store::new(DefaultBackend::new_in_memory()).unwrap(); let (xpriv_key, _xpub_key) = ExtendedPrivateKey::new_from_rng(&mut rng, ExtendedKeyKind::Secp256k1Schnorr); - let seed_bytes: Vec = (0..64).map(|_| rng.gen::()).collect(); + let seed_bytes: Vec = (0..64).map(|_| rng.random::()).collect(); let vrf_key = ExtendedVRFPrivateKey::new_master( seed_bytes.as_slice(), crypto::vrf::VRFKeyKind::Schnorrkel, diff --git a/wallet/types/src/generic_transaction.rs b/wallet/types/src/generic_transaction.rs index 75376a3042..7d0cbb8a7e 100644 --- a/wallet/types/src/generic_transaction.rs +++ b/wallet/types/src/generic_transaction.rs @@ -68,7 +68,7 @@ mod tests { primitives::{Amount, Id}, }; use serialization::Encode; - use test_utils::random::{gen_random_bytes, make_seedable_rng, Rng, Seed}; + use test_utils::random::{gen_random_bytes, make_seedable_rng, RngExt as _, Seed}; use super::*; @@ -79,12 +79,12 @@ mod tests { let mut rng = make_seedable_rng(seed); let tx = Transaction::new( - rng.gen(), + rng.random(), vec![TxInput::Utxo(UtxoOutPoint::new( OutPointSourceId::Transaction(Id::random_using(&mut rng)), - rng.r#gen(), + rng.random(), ))], - vec![TxOutput::Burn(OutputValue::Coin(Amount::from_atoms(rng.r#gen())))], + vec![TxOutput::Burn(OutputValue::Coin(Amount::from_atoms(rng.random())))], ) .unwrap(); diff --git a/wallet/types/src/seed_phrase.rs b/wallet/types/src/seed_phrase.rs index b4a78eeff3..22fffd3520 100644 --- a/wallet/types/src/seed_phrase.rs +++ b/wallet/types/src/seed_phrase.rs @@ -147,7 +147,7 @@ impl Decode for SeedPhrase { mod tests { use super::*; use hex::FromHex; - use randomness::Rng; + use randomness::RngExt; use rstest::rstest; use serialization::DecodeAll; @@ -157,7 +157,7 @@ mod tests { fn seed_phrase_encode_decode(#[case] seed: test_utils::random::Seed) { let mut rng = test_utils::random::make_seedable_rng(seed); - let entropy = rng.gen::<[u8; MNEMONIC_24_WORDS_ENTROPY_SIZE]>(); + let entropy = rng.random::<[u8; MNEMONIC_24_WORDS_ENTROPY_SIZE]>(); let seed_phrase = SeedPhrase::new(zeroize::Zeroizing::new( bip39::Mnemonic::from_entropy(&entropy).unwrap(), diff --git a/wallet/wallet-cli-commands/src/helper_types.rs b/wallet/wallet-cli-commands/src/helper_types.rs index 27c6588e34..0101f9b62f 100644 --- a/wallet/wallet-cli-commands/src/helper_types.rs +++ b/wallet/wallet-cli-commands/src/helper_types.rs @@ -828,7 +828,7 @@ mod tests { address::pubkeyhash::PublicKeyHash, chain::{self, tokens::TokenId, Destination}, }; - use randomness::Rng; + use randomness::RngExt; use test_utils::{ assert_matches, assert_matches_return_val, random::{make_seedable_rng, Seed}, @@ -846,7 +846,7 @@ mod tests { let mut rng = make_seedable_rng(seed); for _ in 0..10 { - let args_count = rng.gen_range(1..5); + let args_count = rng.random_range(1..5); let args = (0..args_count) .map(|_| gen_random_alnum_string(&mut rng, 1, 5)) .collect::>(); @@ -905,7 +905,7 @@ mod tests { for _ in 0..10 { let h256 = H256::random_using(&mut rng); - let idx = rng.gen::(); + let idx = rng.random::(); for tag in ["tx", "Tx", "tX"] { let parsed_outpoint: UtxoOutPoint = @@ -928,7 +928,7 @@ mod tests { let err = CliUtxoOutPoint::from_str(&format!("foo({h256:x},{idx})")).unwrap_err(); assert_eq!(err, ParseError::UnknownSourceIdType("foo".to_owned())); - let tag = if rng.gen_bool(0.5) { "tx" } else { "block" }; + let tag = if rng.random_bool(0.5) { "tx" } else { "block" }; // Sanity check CliUtxoOutPoint::from_str(&format!("{tag}({h256:x},{idx})")).unwrap(); @@ -960,8 +960,8 @@ mod tests { let pkh = PublicKeyHash::random_using(&mut rng); let addr = Address::new(&chain_config, Destination::PublicKeyHash(pkh)).unwrap(); let amount = DecimalAmount::from_uint_decimal( - rng.gen_range(0..=u128::MAX), - rng.gen_range(0..=u8::MAX), + rng.random_range(0..=u128::MAX), + rng.random_range(0..=u8::MAX), ); for tag in ["transfer", "Transfer", "traNSfer"] { @@ -1029,8 +1029,8 @@ mod tests { let pkh = PublicKeyHash::random_using(&mut rng); let addr = Address::new(&chain_config, Destination::PublicKeyHash(pkh)).unwrap(); let amount = DecimalAmount::from_uint_decimal( - rng.gen_range(0..=u128::MAX), - rng.gen_range(0..=u8::MAX), + rng.random_range(0..=u128::MAX), + rng.random_range(0..=u8::MAX), ); for tag in ["transfer", "Transfer", "traNSfer"] { @@ -1111,7 +1111,7 @@ mod tests { let mut rng = make_seedable_rng(seed); for _ in 0..10 { - let token_number_of_decimals = rng.gen_range(0..20); + let token_number_of_decimals = rng.random_range(0..20); for tag in ["unlimited", "Unlimited", "unLImited"] { let parsed_supply = CliTokenTotalSupply::from_str(tag) @@ -1130,8 +1130,8 @@ mod tests { } let decimal_amount = DecimalAmount::from_uint_decimal( - rng.gen_range(0..=1_000_000_000_000), - rng.gen_range(0..=token_number_of_decimals), + rng.random_range(0..=1_000_000_000_000), + rng.random_range(0..=token_number_of_decimals), ); for tag in ["fixed", "Fixed", "fIXed"] { @@ -1175,10 +1175,10 @@ mod tests { assert_eq!(err, ParseError::InvalidInputFormat); let decimal_amount_with_too_many_decimals = { - let mut mantissa = rng.gen_range(0..=1_000_000_000_000); + let mut mantissa = rng.random_range(0..=1_000_000_000_000); // Make sure that the number has indeed more decimals than `token_number_of_decimals`. if mantissa % 10 == 0 { - mantissa += rng.gen_range(1..=9); + mantissa += rng.random_range(1..=9); } DecimalAmount::from_uint_decimal(mantissa, token_number_of_decimals + 1) }; @@ -1207,7 +1207,7 @@ mod tests { let mut rng = make_seedable_rng(seed); for _ in 0..10 { - let u64_val = rng.gen::(); + let u64_val = rng.random::(); for tag in ["block_count", "Block_count", "blocK_Count"] { let parsed_timelock: OutputTimeLock = @@ -1227,22 +1227,22 @@ mod tests { assert_eq!(parsed_timelock, OutputTimeLock::UntilHeight(u64_val.into())); } - let year = rng.gen_range(1970..=3000); - let month = rng.gen_range(1..=12); + let year = rng.random_range(1970..=3000); + let month = rng.random_range(1..=12); let days_in_month = NaiveDate::from_ymd_opt(year, month, 1).unwrap().num_days_in_month(); - let day = rng.gen_range(1..=days_in_month); - let hour = rng.gen_range(0..24); - let min = rng.gen_range(0..60); - let sec = rng.gen_range(0..60); + let day = rng.random_range(1..=days_in_month); + let hour = rng.random_range(0..24); + let min = rng.random_range(0..60); + let sec = rng.random_range(0..60); let expected_time = NaiveDateTime::new( NaiveDate::from_ymd_opt(year, month, day.into()).unwrap(), NaiveTime::from_hms_opt(hour, min, sec).unwrap(), ); let expected_time_utc = DateTime::from_naive_utc_and_offset(expected_time, Utc); - let tz_hours = rng.gen_range(0..24); - let tz_mins = rng.gen_range(0..60); - let tz_positive = rng.gen_bool(0.5); + let tz_hours = rng.random_range(0..24); + let tz_mins = rng.random_range(0..60); + let tz_positive = rng.random_bool(0.5); let expected_time_with_tz = { let offset = Duration::from_secs(tz_hours * 3600 + tz_mins * 60); if tz_positive { @@ -1282,7 +1282,7 @@ mod tests { ); } - let sec_frac = rng.gen_range(1..1000); + let sec_frac = rng.random_range(1..1000); let err = CliOutputTimeLock::from_str(&format!( "until_time({datetime_base_str}.{sec_frac}Z)" )) diff --git a/wallet/wallet-cli-lib/tests/basic.rs b/wallet/wallet-cli-lib/tests/basic.rs index 64e0fb6021..e910e75cc6 100644 --- a/wallet/wallet-cli-lib/tests/basic.rs +++ b/wallet/wallet-cli-lib/tests/basic.rs @@ -18,7 +18,7 @@ mod cli_test_framework; use rstest::rstest; use common::{address::Address, chain::PoolId, primitives::H256}; -use randomness::Rng; +use randomness::RngExt; use test_utils::random::{make_seedable_rng, Seed}; use utils::app_version_with_git_info; @@ -106,8 +106,8 @@ async fn produce_blocks_decommission_genesis_pool(#[case] seed: Seed) { assert!(test .exec(&format!( "staking-create-pool 40000 {} 0.{} {}", - rng.gen_range(0..100), - rng.gen_range(1..100), + rng.random_range(0..100), + rng.random_range(1..100), address, ),) .contains("The transaction was submitted successfully with ID")); @@ -132,8 +132,8 @@ async fn produce_blocks_decommission_genesis_pool(#[case] seed: Seed) { assert!(test .exec(&format!( "staking-create-pool 40000 {} 0.{} {}", - rng.gen_range(0..100), - rng.gen_range(1..100), + rng.random_range(0..100), + rng.random_range(1..100), address, ),) .contains("The transaction was submitted successfully with ID")); diff --git a/wallet/wallet-cli-lib/tests/cli_test_framework.rs b/wallet/wallet-cli-lib/tests/cli_test_framework.rs index 5d50f4a73f..417fd22f6a 100644 --- a/wallet/wallet-cli-lib/tests/cli_test_framework.rs +++ b/wallet/wallet-cli-lib/tests/cli_test_framework.rs @@ -13,16 +13,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -use common::chain::ChainConfig; -use randomness::Rng; -use tokio::task::JoinHandle; -use wallet_rpc_lib::types::NodeInterface; - use std::{ sync::{mpsc, Arc}, time::Duration, }; +use tokio::task::JoinHandle; + +use common::chain::ChainConfig; +use randomness::Rng; use subsystem::{ManagerJoinHandle, ShutdownTrigger}; use test_utils::test_dir::TestRoot; use wallet_cli_lib::{ @@ -30,6 +29,7 @@ use wallet_cli_lib::{ console::{ConsoleInput, ConsoleOutput}, errors::WalletCliError, }; +use wallet_rpc_lib::types::NodeInterface; use wallet_test_node::{ create_chain_config, default_chain_config_options, start_node, COLD_WALLET_MENEMONIC, RPC_PASSWORD, RPC_USERNAME, diff --git a/wallet/wallet-controller/src/helpers/tests.rs b/wallet/wallet-controller/src/helpers/tests.rs index 63de01ad68..c5e011712a 100644 --- a/wallet/wallet-controller/src/helpers/tests.rs +++ b/wallet/wallet-controller/src/helpers/tests.rs @@ -46,7 +46,7 @@ use common::{ primitives::{per_thousand::PerThousand, Amount, BlockHeight, Id, Idable}, }; use node_comm::node_traits::MockNodeInterface; -use randomness::{Rng, SliceRandom as _}; +use randomness::{Rng, RngExt as _, SliceRandom as _}; use test_utils::random::{gen_random_alnum_string, gen_random_bytes, make_seedable_rng, Seed}; use wallet::{ wallet::test_helpers::{create_wallet_with_mnemonic, scan_wallet}, @@ -98,7 +98,7 @@ mod tx_to_partially_signed_tx_general_test { // Transfer to a destination belonging to the wallet. let token0_transfer_utxo_dest = wallet_new_dest(&mut wallet); let token0_transfer_utxo = TxOutput::Transfer( - OutputValue::TokenV1(random_token_ids[0], Amount::from_atoms(rng.gen())), + OutputValue::TokenV1(random_token_ids[0], Amount::from_atoms(rng.random())), token0_transfer_utxo_dest.clone(), ); let tx_with_token0_transfer = tx_with_outputs(vec![token0_transfer_utxo.clone()]); @@ -109,21 +109,25 @@ mod tx_to_partially_signed_tx_general_test { let token1_transfer_utxo_dest = Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)); let token1_transfer_utxo = TxOutput::Transfer( - OutputValue::TokenV1(random_token_ids[1], Amount::from_atoms(rng.gen())), + OutputValue::TokenV1(random_token_ids[1], Amount::from_atoms(rng.random())), token1_transfer_utxo_dest.clone(), ); - let token1_transfer_outpoint = - UtxoOutPoint::new(Id::::random_using(&mut rng).into(), rng.gen()); + let token1_transfer_outpoint = UtxoOutPoint::new( + Id::::random_using(&mut rng).into(), + rng.random(), + ); let lock_then_transfer_utxo_dest = Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)); let lock_then_transfer_utxo = TxOutput::LockThenTransfer( - OutputValue::TokenV1(random_token_ids[2], Amount::from_atoms(rng.gen())), + OutputValue::TokenV1(random_token_ids[2], Amount::from_atoms(rng.random())), lock_then_transfer_utxo_dest.clone(), - OutputTimeLock::ForBlockCount(rng.gen()), + OutputTimeLock::ForBlockCount(rng.random()), + ); + let lock_then_transfer_outpoint = UtxoOutPoint::new( + Id::::random_using(&mut rng).into(), + rng.random(), ); - let lock_then_transfer_outpoint = - UtxoOutPoint::new(Id::::random_using(&mut rng).into(), rng.gen()); let delegation_dest = wallet_new_dest(&mut wallet); let tx_with_delegation = SignedTransaction::new( @@ -131,7 +135,7 @@ mod tx_to_partially_signed_tx_general_test { 0, vec![TxInput::Utxo(UtxoOutPoint::new( Id::::random_using(&mut rng).into(), - rng.r#gen(), + rng.random(), ))], vec![TxOutput::CreateDelegationId( delegation_dest.clone(), @@ -147,17 +151,17 @@ mod tx_to_partially_signed_tx_general_test { // This pool's info will be cached inside the wallet because the decommission destination // belongs to it. let known_pool_id = PoolId::random_using(&mut rng); - let known_pool_staker_balance = Amount::from_atoms(rng.gen()); + let known_pool_staker_balance = Amount::from_atoms(rng.random()); let known_pool_decommission_dest = wallet_new_dest(&mut wallet); let tx_with_pool_creation = tx_with_outputs(vec![TxOutput::CreateStakePool( known_pool_id, Box::new(StakePoolData::new( - Amount::from_atoms(rng.r#gen()), + Amount::from_atoms(rng.random()), Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), random_vrf_pub_key(&mut rng), known_pool_decommission_dest.clone(), - PerThousand::new(rng.gen_range(0..=1000)).unwrap(), - Amount::from_atoms(rng.r#gen()), + PerThousand::new(rng.random_range(0..=1000)).unwrap(), + Amount::from_atoms(rng.random()), )), )]); @@ -202,19 +206,19 @@ mod tx_to_partially_signed_tx_general_test { known_pool_id, ); let pool_id_for_known_create_pool_utxo = PoolId::random_using(&mut rng); - let pool_staker_balance_for_known_create_pool_utxo = Amount::from_atoms(rng.gen()); + let pool_staker_balance_for_known_create_pool_utxo = Amount::from_atoms(rng.random()); let pool_decommission_dest_for_known_create_pool_utxo = wallet_new_dest(&mut wallet); // This utxo will be cached inside the wallet because the decommission destination // belongs to it. let known_create_pool_utxo = TxOutput::CreateStakePool( pool_id_for_known_create_pool_utxo, Box::new(StakePoolData::new( - Amount::from_atoms(rng.r#gen()), + Amount::from_atoms(rng.random()), Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), random_vrf_pub_key(&mut rng), pool_decommission_dest_for_known_create_pool_utxo.clone(), - PerThousand::new(rng.gen_range(0..=1000)).unwrap(), - Amount::from_atoms(rng.r#gen()), + PerThousand::new(rng.random_range(0..=1000)).unwrap(), + Amount::from_atoms(rng.random()), )), ); blocks.push( @@ -242,24 +246,28 @@ mod tx_to_partially_signed_tx_general_test { // Note: the wallet doesn't check that the secret and the secret hash are consistent. let htlc_secret = HtlcSecret::new_from_rng(&mut rng); let create_htlc_utxo = TxOutput::Htlc( - OutputValue::TokenV1(random_token_ids[8], Amount::from_atoms(rng.gen())), + OutputValue::TokenV1(random_token_ids[8], Amount::from_atoms(rng.random())), Box::new(HashedTimelockContract { secret_hash: HtlcSecretHash::random_using(&mut rng), spend_key: htlc_spend_key.clone(), - refund_timelock: OutputTimeLock::ForBlockCount(rng.gen()), + refund_timelock: OutputTimeLock::ForBlockCount(rng.random()), refund_key: htlc_refund_key.clone(), }), ); - let create_htlc_outpoint = - UtxoOutPoint::new(Id::::random_using(&mut rng).into(), rng.gen()); + let create_htlc_outpoint = UtxoOutPoint::new( + Id::::random_using(&mut rng).into(), + rng.random(), + ); let coins_utxo_dest = Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)); let coins_utxo = TxOutput::Transfer( - OutputValue::Coin(Amount::from_atoms(rng.gen())), + OutputValue::Coin(Amount::from_atoms(rng.random())), coins_utxo_dest.clone(), ); - let coins_outpoint = - UtxoOutPoint::new(Id::::random_using(&mut rng).into(), rng.gen()); + let coins_outpoint = UtxoOutPoint::new( + Id::::random_using(&mut rng).into(), + rng.random(), + ); let pool_id_for_unknown_create_pool_utxo = PoolId::random_using(&mut rng); let pool_decommission_dest_for_unknown_create_pool_utxo = @@ -267,17 +275,19 @@ mod tx_to_partially_signed_tx_general_test { let unknown_create_pool_utxo = TxOutput::CreateStakePool( pool_id_for_unknown_create_pool_utxo, Box::new(StakePoolData::new( - Amount::from_atoms(rng.r#gen()), + Amount::from_atoms(rng.random()), Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), random_vrf_pub_key(&mut rng), pool_decommission_dest_for_unknown_create_pool_utxo.clone(), - PerThousand::new(rng.gen_range(0..=1000)).unwrap(), - Amount::from_atoms(rng.r#gen()), + PerThousand::new(rng.random_range(0..=1000)).unwrap(), + Amount::from_atoms(rng.random()), )), ); - let unknown_create_pool_outpoint = - UtxoOutPoint::new(Id::::random_using(&mut rng).into(), rng.gen()); - let staker_balance_for_pool_for_unknown_create_pool_utxo = Amount::from_atoms(rng.gen()); + let unknown_create_pool_outpoint = UtxoOutPoint::new( + Id::::random_using(&mut rng).into(), + rng.random(), + ); + let staker_balance_for_pool_for_unknown_create_pool_utxo = Amount::from_atoms(rng.random()); let pool_id_for_unknown_produce_block_from_stake_utxo = PoolId::random_using(&mut rng); let pool_decommission_dest_for_unknown_produce_block_from_stake_utxo = @@ -286,12 +296,14 @@ mod tx_to_partially_signed_tx_general_test { Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), pool_id_for_unknown_produce_block_from_stake_utxo, ); - let unknown_produce_block_from_stake_outpoint = - UtxoOutPoint::new(Id::::random_using(&mut rng).into(), rng.gen()); + let unknown_produce_block_from_stake_outpoint = UtxoOutPoint::new( + Id::::random_using(&mut rng).into(), + rng.random(), + ); let staker_balance_for_pool_for_unknown_produce_block_from_stake_utxo = - Amount::from_atoms(rng.gen()); + Amount::from_atoms(rng.random()); - let use_htlc_secret = rng.gen_bool(0.5); + let use_htlc_secret = rng.random_bool(0.5); let expected_htlc_dest = if use_htlc_secret { htlc_spend_key } else { @@ -355,10 +367,10 @@ mod tx_to_partially_signed_tx_general_test { ), ( TxInput::Account(AccountOutPoint::new( - AccountNonce::new(rng.r#gen()), + AccountNonce::new(rng.random()), AccountSpending::DelegationBalance( delegation_id, - Amount::from_atoms(rng.r#gen()), + Amount::from_atoms(rng.random()), ), )), None, @@ -367,10 +379,10 @@ mod tx_to_partially_signed_tx_general_test { ), ( TxInput::AccountCommand( - AccountNonce::new(rng.r#gen()), + AccountNonce::new(rng.random()), AccountCommand::MintTokens( wallet_tokens[0].id, - Amount::from_atoms(rng.r#gen()), + Amount::from_atoms(rng.random()), ), ), None, @@ -379,7 +391,7 @@ mod tx_to_partially_signed_tx_general_test { ), ( TxInput::AccountCommand( - AccountNonce::new(rng.r#gen()), + AccountNonce::new(rng.random()), AccountCommand::UnmintTokens(wallet_tokens[1].id), ), None, @@ -388,7 +400,7 @@ mod tx_to_partially_signed_tx_general_test { ), ( TxInput::AccountCommand( - AccountNonce::new(rng.r#gen()), + AccountNonce::new(rng.random()), AccountCommand::LockTokenSupply(wallet_tokens[2].id), ), None, @@ -397,7 +409,7 @@ mod tx_to_partially_signed_tx_general_test { ), ( TxInput::AccountCommand( - AccountNonce::new(rng.r#gen()), + AccountNonce::new(rng.random()), AccountCommand::FreezeToken( wallet_tokens[3].id, random_is_token_unfreezable(&mut rng), @@ -409,7 +421,7 @@ mod tx_to_partially_signed_tx_general_test { ), ( TxInput::AccountCommand( - AccountNonce::new(rng.r#gen()), + AccountNonce::new(rng.random()), AccountCommand::UnfreezeToken(wallet_tokens[4].id), ), None, @@ -418,7 +430,7 @@ mod tx_to_partially_signed_tx_general_test { ), ( TxInput::AccountCommand( - AccountNonce::new(rng.r#gen()), + AccountNonce::new(rng.random()), AccountCommand::ChangeTokenAuthority( wallet_tokens[5].id, Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), @@ -430,7 +442,7 @@ mod tx_to_partially_signed_tx_general_test { ), ( TxInput::AccountCommand( - AccountNonce::new(rng.r#gen()), + AccountNonce::new(rng.random()), AccountCommand::ChangeTokenMetadataUri( wallet_tokens[6].id, gen_random_alnum_string(&mut rng, 10, 20).into_bytes(), @@ -442,7 +454,7 @@ mod tx_to_partially_signed_tx_general_test { ), ( TxInput::AccountCommand( - AccountNonce::new(rng.r#gen()), + AccountNonce::new(rng.random()), AccountCommand::ConcludeOrder(wallet_orders[0].id), ), None, @@ -451,10 +463,10 @@ mod tx_to_partially_signed_tx_general_test { ), ( TxInput::AccountCommand( - AccountNonce::new(rng.r#gen()), + AccountNonce::new(rng.random()), AccountCommand::FillOrder( wallet_orders[1].id, - Amount::from_atoms(rng.r#gen()), + Amount::from_atoms(rng.random()), fill_order_v0_dest.clone(), ), ), @@ -473,7 +485,7 @@ mod tx_to_partially_signed_tx_general_test { ( TxInput::OrderAccountCommand(OrderAccountCommand::FillOrder( wallet_orders[3].id, - Amount::from_atoms(rng.r#gen()), + Amount::from_atoms(rng.random()), )), None, Some(Destination::AnyoneCanSpend), @@ -505,27 +517,27 @@ mod tx_to_partially_signed_tx_general_test { let outputs = vec![ TxOutput::Transfer( - OutputValue::TokenV1(random_token_ids[9], Amount::from_atoms(rng.r#gen())), + OutputValue::TokenV1(random_token_ids[9], Amount::from_atoms(rng.random())), Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), ), TxOutput::LockThenTransfer( - OutputValue::TokenV1(random_token_ids[10], Amount::from_atoms(rng.r#gen())), + OutputValue::TokenV1(random_token_ids[10], Amount::from_atoms(rng.random())), Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), - OutputTimeLock::ForBlockCount(rng.r#gen()), + OutputTimeLock::ForBlockCount(rng.random()), ), TxOutput::Burn(OutputValue::TokenV1( random_token_ids[11], - Amount::from_atoms(rng.r#gen()), + Amount::from_atoms(rng.random()), )), TxOutput::CreateStakePool( PoolId::random_using(&mut rng), Box::new(StakePoolData::new( - Amount::from_atoms(rng.r#gen()), + Amount::from_atoms(rng.random()), Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), random_vrf_pub_key(&mut rng), Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), - PerThousand::new(rng.gen_range(0..=1000)).unwrap(), - Amount::from_atoms(rng.r#gen()), + PerThousand::new(rng.random_range(0..=1000)).unwrap(), + Amount::from_atoms(rng.random()), )), ), TxOutput::CreateDelegationId( @@ -533,12 +545,12 @@ mod tx_to_partially_signed_tx_general_test { PoolId::random_using(&mut rng), ), TxOutput::DelegateStaking( - Amount::from_atoms(rng.r#gen()), + Amount::from_atoms(rng.random()), DelegationId::random_using(&mut rng), ), TxOutput::IssueFungibleToken(Box::new(TokenIssuance::V1(TokenIssuanceV1 { token_ticker: gen_random_alnum_string(&mut rng, 10, 20).into_bytes(), - number_of_decimals: rng.r#gen(), + number_of_decimals: rng.random(), metadata_uri: gen_random_alnum_string(&mut rng, 10, 20).into_bytes(), total_supply: TokenTotalSupply::Unlimited, authority: Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), @@ -551,18 +563,18 @@ mod tx_to_partially_signed_tx_general_test { ), TxOutput::DataDeposit(gen_random_bytes(&mut rng, 10, 20)), TxOutput::Htlc( - OutputValue::TokenV1(random_token_ids[12], Amount::from_atoms(rng.r#gen())), + OutputValue::TokenV1(random_token_ids[12], Amount::from_atoms(rng.random())), Box::new(HashedTimelockContract { secret_hash: HtlcSecretHash::random_using(&mut rng), spend_key: Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), - refund_timelock: OutputTimeLock::ForBlockCount(rng.r#gen()), + refund_timelock: OutputTimeLock::ForBlockCount(rng.random()), refund_key: Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), }), ), TxOutput::CreateOrder(Box::new(OrderData::new( Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), - OutputValue::TokenV1(random_token_ids[13], Amount::from_atoms(rng.r#gen())), - OutputValue::TokenV1(random_token_ids[14], Amount::from_atoms(rng.r#gen())), + OutputValue::TokenV1(random_token_ids[13], Amount::from_atoms(rng.random())), + OutputValue::TokenV1(random_token_ids[14], Amount::from_atoms(rng.random())), ))), ]; @@ -625,7 +637,7 @@ mod tx_to_partially_signed_tx_general_test { best_block_height: BlockHeight::new(last_height), best_block_id: last_block_id.into(), best_block_timestamp: block_timestamp, - median_time: BlockTimestamp::from_int_seconds(rng.gen()), + median_time: BlockTimestamp::from_int_seconds(rng.random()), is_initial_block_download: false, }; @@ -722,7 +734,7 @@ mod tx_to_partially_signed_tx_general_test { for _ in 0..tokens_count { let tx_inputs = vec![TxInput::Utxo(UtxoOutPoint::new( Id::::random_using(rng).into(), - rng.r#gen(), + rng.random(), ))]; let id = make_token_id(chain_config, BlockHeight::new(0), &tx_inputs).unwrap(); let authority = wallet_new_dest(wallet); @@ -778,13 +790,14 @@ mod tx_to_partially_signed_tx_general_test { for curencies in curencies { let tx_inputs = vec![TxInput::Utxo(UtxoOutPoint::new( Id::::random_using(rng).into(), - rng.r#gen(), + rng.random(), ))]; let id = make_order_id(&tx_inputs).unwrap(); - let initially_asked = curencies.ask.into_output_value(Amount::from_atoms(rng.gen())); - let initially_given = curencies.give.into_output_value(Amount::from_atoms(rng.gen())); - let ask_balance = Amount::from_atoms(rng.gen()); - let give_balance = Amount::from_atoms(rng.gen()); + let initially_asked = curencies.ask.into_output_value(Amount::from_atoms(rng.random())); + let initially_given = + curencies.give.into_output_value(Amount::from_atoms(rng.random())); + let ask_balance = Amount::from_atoms(rng.random()); + let give_balance = Amount::from_atoms(rng.random()); let conclude_key = wallet_new_dest(wallet); result.push(TestOrderData { @@ -833,7 +846,7 @@ mod tx_to_partially_signed_tx_general_test { initially_given: RpcOutputValue::from_output_value(&data.initially_given).unwrap(), give_balance: data.give_balance, ask_balance: data.ask_balance, - nonce: Some(AccountNonce::new(rng.gen())), + nonce: Some(AccountNonce::new(rng.random())), is_frozen: false, } } @@ -880,11 +893,11 @@ async fn tx_to_partially_signed_tx_htlc_input_with_known_utxo_test( // Note: the wallet doesn't check that the secret and the secret hash are consistent. let htlc_secret = HtlcSecret::new_from_rng(&mut rng); let create_htlc_output = TxOutput::Htlc( - OutputValue::TokenV1(token_id, Amount::from_atoms(rng.gen())), + OutputValue::TokenV1(token_id, Amount::from_atoms(rng.random())), Box::new(HashedTimelockContract { secret_hash: HtlcSecretHash::random_using(&mut rng), spend_key: htlc_spend_key.clone(), - refund_timelock: OutputTimeLock::ForBlockCount(rng.gen()), + refund_timelock: OutputTimeLock::ForBlockCount(rng.random()), refund_key: htlc_refund_key.clone(), }), ); @@ -901,7 +914,7 @@ async fn tx_to_partially_signed_tx_htlc_input_with_known_utxo_test( } else { vec![] }, - Amount::from_atoms(rng.gen()), + Amount::from_atoms(rng.random()), Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), 0, ) @@ -926,7 +939,7 @@ async fn tx_to_partially_signed_tx_htlc_input_with_known_utxo_test( best_block_height: BlockHeight::new(last_height), best_block_id: last_block.get_id().into(), best_block_timestamp: last_block.timestamp(), - median_time: BlockTimestamp::from_int_seconds(rng.gen()), + median_time: BlockTimestamp::from_int_seconds(rng.random()), is_initial_block_download: false, }; @@ -989,7 +1002,7 @@ async fn tx_to_partially_signed_tx_htlc_input_with_known_utxo_test( async fn fetch_token_infos_test(#[case] seed: Seed) { let mut rng = make_seedable_rng(seed); - let tokens_count = rng.gen_range(10..20); + let tokens_count = rng.random_range(10..20); let tokens_data = (0..tokens_count) .map(|_| { use crate::tests::test_utils::random_token_data_with_id_and_authority; @@ -1039,9 +1052,9 @@ fn make_rpc_token_info(data: &TestTokenData, rng: &mut impl Rng) -> RPCTokenInfo token_ticker: data.ticker.clone().into(), number_of_decimals: data.num_decimals, metadata_uri: data.metadata_uri.clone().into(), - circulating_supply: Amount::from_atoms(rng.gen()), + circulating_supply: Amount::from_atoms(rng.random()), total_supply: data.total_supply.into(), - is_locked: rng.gen(), + is_locked: rng.random(), frozen: random_rpc_is_token_frozen(rng), authority: data.authority.clone(), }) diff --git a/wallet/wallet-controller/src/lib.rs b/wallet/wallet-controller/src/lib.rs index 1fb599d7d0..24324f0888 100644 --- a/wallet/wallet-controller/src/lib.rs +++ b/wallet/wallet-controller/src/lib.rs @@ -88,7 +88,7 @@ pub use node_comm::{ handles_client::WalletHandlesClient, make_cold_wallet_rpc_client, make_rpc_client, rpc_client::NodeRpcClient, }; -use randomness::{make_pseudo_rng, make_true_rng, Rng}; +use randomness::{make_pseudo_rng, make_true_rng, RngExt as _}; #[cfg(feature = "ledger")] use wallet::signer::ledger_signer::LedgerSignerProvider; #[cfg(feature = "trezor")] @@ -1558,7 +1558,7 @@ where } // Reset the timer with a new random interval between 2 and 5 minutes - let sleep_interval_sec = make_pseudo_rng().gen_range(120..=300); + let sleep_interval_sec = make_pseudo_rng().random_range(120..=300); *rebroadcast_txs_again_at = (get_time() + Duration::from_secs(sleep_interval_sec)) .expect("Sleep intervals cannot be this large"); } diff --git a/wallet/wallet-controller/src/mnemonic.rs b/wallet/wallet-controller/src/mnemonic.rs index a006be48ab..131f1aa487 100644 --- a/wallet/wallet-controller/src/mnemonic.rs +++ b/wallet/wallet-controller/src/mnemonic.rs @@ -15,7 +15,7 @@ pub use bip39::{Error, Language, Mnemonic}; -use randomness::Rng; +use randomness::RngExt as _; use wallet_types::seed_phrase::MNEMONIC_24_WORDS_ENTROPY_SIZE; use zeroize::Zeroize; diff --git a/wallet/wallet-controller/src/sync/tests/mod.rs b/wallet/wallet-controller/src/sync/tests/mod.rs index 1591461c62..dce552b248 100644 --- a/wallet/wallet-controller/src/sync/tests/mod.rs +++ b/wallet/wallet-controller/src/sync/tests/mod.rs @@ -45,7 +45,7 @@ use node_comm::{ rpc_client::NodeRpcError, }; use p2p_types::{bannable_address::BannableAddress, socket_address::SocketAddress}; -use randomness::{seq::IteratorRandom, CryptoRng, Rng}; +use randomness::{seq::IteratorRandom, CryptoRng, RngExt as _}; use test_utils::random::{make_seedable_rng, Seed}; use utils_networking::IpOrSocketAddress; use wallet::wallet_events::WalletEventsNoOp; @@ -194,7 +194,7 @@ struct MockNode { } impl MockNode { - fn new(rng: &mut (impl Rng + CryptoRng)) -> Self { + fn new(rng: &mut impl CryptoRng) -> Self { let tf = Arc::new(Mutex::new(TestFramework::builder(rng).build())); Self { tf } } @@ -455,7 +455,7 @@ impl NodeInterface for MockNode { } } -fn create_chain(node: &MockNode, rng: &mut (impl Rng + CryptoRng), parent: u64, count: usize) { +fn create_chain(node: &MockNode, rng: &mut impl CryptoRng, parent: u64, count: usize) { let mut tf = node.tf.lock().unwrap(); let parent_id = tf.chainstate.get_block_id_from_height(parent.into()).unwrap().unwrap(); tf.create_chain(&parent_id, count, rng).unwrap(); @@ -600,7 +600,7 @@ async fn account_out_of_sync(#[case] seed: Seed) { let _ = sync_once(&chain_config, &node, &mut wallet, &WalletEventsNoOp).await; wait_new_tip(&node, &mut new_tip_rx).await; - let reset_to = rng.gen_range(1..9); + let reset_to = rng.random_range(1..9); wallet.reset_unused_account_to_height(reset_to); // Build new blocks diff --git a/wallet/wallet-controller/src/tests/compose_transaction_tests.rs b/wallet/wallet-controller/src/tests/compose_transaction_tests.rs index 4a5626b6d3..7e16786e14 100644 --- a/wallet/wallet-controller/src/tests/compose_transaction_tests.rs +++ b/wallet/wallet-controller/src/tests/compose_transaction_tests.rs @@ -36,7 +36,7 @@ use common::{ primitives::{Amount, BlockHeight, Id, Idable}, }; use node_comm::{mock::ClonableMockNodeInterface, node_traits::MockNodeInterface}; -use randomness::Rng; +use randomness::RngExt as _; use test_utils::{ assert_matches_return_val, random::{gen_random_alnum_string, make_seedable_rng, Seed}, @@ -74,9 +74,9 @@ async fn general_test(#[case] seed: Seed, #[case] use_htlc_secret: bool) { let token3_id = TokenId::random_using(&mut rng); let token4_id = TokenId::random_using(&mut rng); - let token1_amount = Amount::from_atoms(rng.gen_range(1000..2000)); - let token2_amount = Amount::from_atoms(rng.gen_range(1000..2000)); - let block_reward_amount = Amount::from_atoms(rng.gen_range(1000..2000)); + let token1_amount = Amount::from_atoms(rng.random_range(1000..2000)); + let token2_amount = Amount::from_atoms(rng.random_range(1000..2000)); + let block_reward_amount = Amount::from_atoms(rng.random_range(1000..2000)); let token1_tx_output_dest = wallet_new_dest(&mut wallet); let token1_tx_output = TxOutput::Transfer( @@ -103,19 +103,21 @@ async fn general_test(#[case] seed: Seed, #[case] use_htlc_secret: bool) { let last_height = 1; let token1_outpoint = UtxoOutPoint::new(tx_with_token1_id.into(), 0); - let token2_outpoint = - UtxoOutPoint::new(Id::::random_using(&mut rng).into(), rng.gen()); + let token2_outpoint = UtxoOutPoint::new( + Id::::random_using(&mut rng).into(), + rng.random(), + ); - let token4_num_decimals = rng.gen_range(1..20); + let token4_num_decimals = rng.random_range(1..20); let token4_ticker = gen_random_alnum_string(&mut rng, 5, 10); - let created_order_coin_give_amount = Amount::from_atoms(rng.gen_range(1000..2000)); + let created_order_coin_give_amount = Amount::from_atoms(rng.random_range(1000..2000)); let create_order_output = TxOutput::CreateOrder(Box::new(OrderData::new( Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)), - OutputValue::TokenV1(token3_id, Amount::from_atoms(rng.gen())), + OutputValue::TokenV1(token3_id, Amount::from_atoms(rng.random())), OutputValue::Coin(created_order_coin_give_amount), ))); - let htlc_amount = Amount::from_atoms(rng.gen_range(1000..2000)); + let htlc_amount = Amount::from_atoms(rng.random_range(1000..2000)); let htlc_spend_key = Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)); let htlc_refund_key = Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)); // Note: the wallet doesn't check that the secret and the secret hash are consistent. @@ -125,21 +127,24 @@ async fn general_test(#[case] seed: Seed, #[case] use_htlc_secret: bool) { Box::new(HashedTimelockContract { secret_hash: HtlcSecretHash::random_using(&mut rng), spend_key: htlc_spend_key.clone(), - refund_timelock: OutputTimeLock::ForBlockCount(rng.gen()), + refund_timelock: OutputTimeLock::ForBlockCount(rng.random()), refund_key: htlc_refund_key.clone(), }), ); - let create_htlc_outpoint = - UtxoOutPoint::new(Id::::random_using(&mut rng).into(), rng.gen()); + let create_htlc_outpoint = UtxoOutPoint::new( + Id::::random_using(&mut rng).into(), + rng.random(), + ); let coins_outpoint = UtxoOutPoint::new(Id::::random_using(&mut rng).into(), 0); - let coins_outpoint_amount = - (created_order_coin_give_amount + Amount::from_atoms(rng.gen_range(1000..2000))).unwrap(); + let coins_outpoint_amount = (created_order_coin_give_amount + + Amount::from_atoms(rng.random_range(1000..2000))) + .unwrap(); let coins_utxo_dest = Destination::PublicKeyHash(PublicKeyHash::random_using(&mut rng)); let coins_utxo = TxOutput::LockThenTransfer( OutputValue::Coin(coins_outpoint_amount), coins_utxo_dest.clone(), - OutputTimeLock::ForBlockCount(rng.gen()), + OutputTimeLock::ForBlockCount(rng.random()), ); let node_mock = { @@ -167,7 +172,7 @@ async fn general_test(#[case] seed: Seed, #[case] use_htlc_secret: bool) { best_block_height: BlockHeight::new(last_height), best_block_id: last_block.get_id().into(), best_block_timestamp: last_block.timestamp(), - median_time: BlockTimestamp::from_int_seconds(rng.gen()), + median_time: BlockTimestamp::from_int_seconds(rng.random()), is_initial_block_download: false, }; diff --git a/wallet/wallet-controller/src/tests/test_utils.rs b/wallet/wallet-controller/src/tests/test_utils.rs index 0f2c853915..ea0196e478 100644 --- a/wallet/wallet-controller/src/tests/test_utils.rs +++ b/wallet/wallet-controller/src/tests/test_utils.rs @@ -34,7 +34,7 @@ use crypto::{ key::{KeyKind, PrivateKey, PublicKey}, vrf::{VRFKeyKind, VRFPrivateKey, VRFPublicKey}, }; -use randomness::{CryptoRng, Rng}; +use randomness::{CryptoRng, Rng, RngExt as _}; use test_utils::random::{gen_random_alnum_string, gen_random_bytes}; use wallet::{signer::SignerProvider, wallet::test_helpers::scan_wallet, DefaultWallet, Wallet}; use wallet_types::account_info::DEFAULT_ACCOUNT_INDEX; @@ -86,28 +86,28 @@ pub fn random_rpc_ft_info_with_id_ticker_decimals( token_ticker: ticker.into(), number_of_decimals: num_decimals, metadata_uri: gen_random_alnum_string(rng, 10, 20).into(), - circulating_supply: Amount::from_atoms(rng.gen()), + circulating_supply: Amount::from_atoms(rng.random()), total_supply: RPCTokenTotalSupply::Unlimited, - is_locked: rng.gen_bool(0.5), + is_locked: rng.random_bool(0.5), frozen: random_rpc_is_token_frozen(rng), authority: Destination::PublicKeyHash(PublicKeyHash::random_using(rng)), } } pub fn random_rpc_is_token_frozen(rng: &mut impl Rng) -> RPCIsTokenFrozen { - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { RPCIsTokenFrozen::NotFrozen { - freezable: rng.gen(), + freezable: rng.random(), } } else { RPCIsTokenFrozen::Frozen { - unfreezable: rng.gen(), + unfreezable: rng.random(), } } } pub fn random_is_token_freezable(rng: &mut impl Rng) -> IsTokenFreezable { - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { IsTokenFreezable::Yes } else { IsTokenFreezable::No @@ -115,7 +115,7 @@ pub fn random_is_token_freezable(rng: &mut impl Rng) -> IsTokenFreezable { } pub fn random_is_token_unfreezable(rng: &mut impl Rng) -> IsTokenUnfreezable { - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { IsTokenUnfreezable::Yes } else { IsTokenUnfreezable::No @@ -123,14 +123,14 @@ pub fn random_is_token_unfreezable(rng: &mut impl Rng) -> IsTokenUnfreezable { } pub fn random_token_total_supply(rng: &mut impl Rng) -> TokenTotalSupply { - match rng.gen_range(0..3) { - 0 => TokenTotalSupply::Fixed(Amount::from_atoms(rng.gen())), + match rng.random_range(0..3) { + 0 => TokenTotalSupply::Fixed(Amount::from_atoms(rng.random())), 1 => TokenTotalSupply::Lockable, _ => TokenTotalSupply::Unlimited, } } -pub fn random_nft_issuance(rng: &mut (impl Rng + CryptoRng)) -> NftIssuance { +pub fn random_nft_issuance(rng: &mut impl CryptoRng) -> NftIssuance { NftIssuance::V0(NftIssuanceV0 { metadata: Metadata { creator: Some(TokenCreator { @@ -151,11 +151,11 @@ pub fn wallet_new_dest(wallet: &mut DefaultWallet) -> Destination { wallet.get_new_address(DEFAULT_ACCOUNT_INDEX).unwrap().1.into_object() } -pub fn random_pub_key(rng: &mut (impl Rng + CryptoRng)) -> PublicKey { +pub fn random_pub_key(rng: &mut impl CryptoRng) -> PublicKey { PrivateKey::new_from_rng(rng, KeyKind::Secp256k1Schnorr).1 } -pub fn random_vrf_pub_key(rng: &mut (impl Rng + CryptoRng)) -> VRFPublicKey { +pub fn random_vrf_pub_key(rng: &mut impl CryptoRng) -> VRFPublicKey { VRFPrivateKey::new_from_rng(rng, VRFKeyKind::Schnorrkel).1 } @@ -211,7 +211,7 @@ pub fn random_token_data_with_id_and_authority( ) -> TestTokenData { TestTokenData { id: token_id, - num_decimals: rng.gen_range(1..20), + num_decimals: rng.random_range(1..20), ticker: gen_random_alnum_string(rng, 5, 10), metadata_uri: gen_random_alnum_string(rng, 5, 10), total_supply: random_token_total_supply(rng), @@ -238,7 +238,7 @@ pub fn random_order_currencies_with_token( rng: &mut impl Rng, token_id: TokenId, ) -> OrderCurrencies { - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { OrderCurrencies { ask: Currency::Coin, give: Currency::Token(token_id), diff --git a/wallet/wallet-rpc-lib/tests/utils.rs b/wallet/wallet-rpc-lib/tests/utils.rs index ea7722cfa2..38a8d2a8ba 100644 --- a/wallet/wallet-rpc-lib/tests/utils.rs +++ b/wallet/wallet-rpc-lib/tests/utils.rs @@ -23,18 +23,18 @@ use common::{ }, primitives::BlockHeight, }; +use randomness::Rng; use rpc::RpcAuthData; use test_utils::{test_dir::TestRoot, test_root}; use wallet::signer::software_signer::SoftwareSignerProvider; use wallet_controller::NodeRpcClient; use wallet_rpc_lib::{config::WalletServiceConfig, types::AccountArg, WalletHandle, WalletService}; use wallet_test_node::{RPC_PASSWORD, RPC_USERNAME}; +use wallet_types::{seed_phrase::StoreSeedPhrase, wallet_type::WalletType}; -pub use randomness::Rng; pub use rpc::test_support::{ClientT, Subscription, SubscriptionClientT}; pub use serde_json::Value as JsonValue; pub use test_utils::random::{make_seedable_rng, Seed}; -use wallet_types::{seed_phrase::StoreSeedPhrase, wallet_type::WalletType}; pub const ACCOUNT0_ARG: AccountArg = AccountArg(0); pub const ACCOUNT1_ARG: AccountArg = AccountArg(1); diff --git a/wallet/wallet-test-node/src/lib.rs b/wallet/wallet-test-node/src/lib.rs index 930f85d533..a9f348c6ad 100644 --- a/wallet/wallet-test-node/src/lib.rs +++ b/wallet/wallet-test-node/src/lib.rs @@ -21,7 +21,7 @@ use std::{net::SocketAddr, sync::Arc, time::Duration}; use crypto::{key::PublicKey, vrf::VRFPublicKey}; use hex::FromHex; -use randomness::Rng; +use randomness::{Rng, RngExt as _}; use blockprod::{rpc::BlockProductionRpcServer, test_blockprod_config}; use chainstate::{ @@ -106,7 +106,7 @@ fn create_custom_regtest_genesis(rng: &mut impl Rng) -> Genesis { ); // Must be less than the current time, otherwise block production will not work properly - let genesis_timestamp = rng.gen_range(1685000000..1685030000); + let genesis_timestamp = rng.random_range(1685000000..1685030000); Genesis::new( String::new(), diff --git a/wasm-wrappers/Cargo.toml b/wasm-wrappers/Cargo.toml index e5ada60133..13f2b21039 100644 --- a/wasm-wrappers/Cargo.toml +++ b/wasm-wrappers/Cargo.toml @@ -26,8 +26,11 @@ itertools.workspace = true serde.workspace = true thiserror.workspace = true -# This crate is required for rand to work with wasm. See: https://docs.rs/getrandom/latest/getrandom/#webassembly-support -getrandom = { version = "0.2", features = ["js"] } +# This is required for `rand` to work with wasm. See: https://docs.rs/getrandom/latest/getrandom/#webassembly-support +# Note that technically we use 2 differeent versions of `rand` (0.8 and 0.10) which depend on different versions of +# `getrandom` (0.2 and 0.4 respectively). In reality though, only RNGs from 0.10 will be created. +getrandom_0_2 = { version = "0.2", package = "getrandom", features = ["js"] } +getrandom_0_4 = { version = "0.4", package = "getrandom", features = ["wasm_js"] } gloo-utils = "0.2" js-sys = "0.3" tsify = "0.5" diff --git a/wasm-wrappers/src/tests.rs b/wasm-wrappers/src/tests.rs index 468117a377..61be8140df 100644 --- a/wasm-wrappers/src/tests.rs +++ b/wasm-wrappers/src/tests.rs @@ -15,7 +15,7 @@ use rstest::rstest; -use randomness::Rng; +use randomness::RngExt; use test_utils::random::{make_seedable_rng, Seed}; use super::*; @@ -31,8 +31,8 @@ fn sign_and_verify(#[case] seed: Seed) { let public_key = public_key_from_private_key(&key).unwrap(); - let message_size = 1 + rng.gen::() % 10000; - let message: Vec = (0..message_size).map(|_| rng.gen::()).collect(); + let message_size = rng.random_range(1..=10000); + let message: Vec = (0..message_size).map(|_| rng.random::()).collect(); let signature = sign_message_for_spending(&key, &message).unwrap(); @@ -45,7 +45,7 @@ fn sign_and_verify(#[case] seed: Seed) { { // Tamper with the message let mut tampered_message = message.clone(); - let tamper_bit_index = rng.gen::() % message_size; + let tamper_bit_index = rng.random_range(0..message_size); tampered_message[tamper_bit_index] = tampered_message[tamper_bit_index].wrapping_add(1); let verification_result = verify_signature_for_spending(&public_key, &signature, &tampered_message).unwrap(); @@ -55,7 +55,7 @@ fn sign_and_verify(#[case] seed: Seed) { // Tamper with the signature let mut tampered_signature = signature.clone(); // Ignore the first byte because the it is the key kind - let tamper_bit_index = 1 + rng.gen::() % (signature.len() - 1); + let tamper_bit_index = rng.random_range(1..signature.len()); tampered_signature[tamper_bit_index] = tampered_signature[tamper_bit_index].wrapping_add(1); let verification_result = verify_signature_for_spending(&public_key, &tampered_signature, &message).unwrap();