From 46d4795f41905f2474575ac50a6f47e157518fe5 Mon Sep 17 00:00:00 2001 From: Roman Krasiuk Date: Mon, 26 Jun 2023 10:13:09 +0300 Subject: [PATCH] feat: log & receipt test generators (#3357) --- .../interfaces/src/test_utils/generators.rs | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/crates/interfaces/src/test_utils/generators.rs b/crates/interfaces/src/test_utils/generators.rs index 137996046..dfcdf39a0 100644 --- a/crates/interfaces/src/test_utils/generators.rs +++ b/crates/interfaces/src/test_utils/generators.rs @@ -3,9 +3,9 @@ use rand::{ distributions::uniform::SampleRange, rngs::StdRng, seq::SliceRandom, thread_rng, SeedableRng, }; use reth_primitives::{ - proofs, sign_message, Account, Address, BlockNumber, Bytes, Header, SealedBlock, SealedHeader, - Signature, StorageEntry, Transaction, TransactionKind, TransactionSigned, TxLegacy, H160, H256, - U256, + proofs, sign_message, Account, Address, BlockNumber, Bytes, Header, Log, Receipt, SealedBlock, + SealedHeader, Signature, StorageEntry, Transaction, TransactionKind, TransactionSigned, + TxLegacy, H160, H256, U256, }; use secp256k1::{KeyPair, Message as SecpMessage, Secp256k1, SecretKey, SECP256K1}; use std::{ @@ -326,6 +326,37 @@ pub fn random_contract_account_range( accounts } +/// Generate random receipt for transaction +pub fn random_receipt( + rng: &mut R, + transaction: &TransactionSigned, + logs_count: Option, +) -> Receipt { + let success = rng.gen::(); + let logs_count = logs_count.unwrap_or_else(|| rng.gen::()); + Receipt { + tx_type: transaction.tx_type(), + success, + cumulative_gas_used: rng.gen_range(0..=transaction.gas_limit()), + logs: if success { + (0..logs_count).map(|_| random_log(rng, None, None)).collect() + } else { + vec![] + }, + } +} + +/// Generate random log +pub fn random_log(rng: &mut R, address: Option
, topics_count: Option) -> Log { + let data_byte_count = rng.gen::(); + let topics_count = topics_count.unwrap_or_else(|| rng.gen::()); + Log { + address: address.unwrap_or_else(|| rng.gen()), + topics: (0..topics_count).map(|_| rng.gen()).collect(), + data: Bytes::from((0..data_byte_count).map(|_| rng.gen::()).collect::>()), + } +} + #[cfg(test)] mod test { use std::str::FromStr;