Skip to content

Commit fc59d4d

Browse files
committed
Added unit tests for receipt leaf api
1 parent 64b8c9f commit fc59d4d

File tree

4 files changed

+285
-128
lines changed

4 files changed

+285
-128
lines changed

mp2-common/src/eth.rs

+74-38
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,6 @@ mod test {
720720
types::BlockNumber,
721721
};
722722
use hashbrown::HashMap;
723-
use tokio::task::JoinSet;
724723

725724
use crate::{
726725
mpt_sequential::utils::nibbles_to_bytes,
@@ -860,9 +859,6 @@ mod test {
860859

861860
#[tokio::test]
862861
async fn test_receipt_query() -> Result<()> {
863-
let rpc = ProviderBuilder::new()
864-
.on_anvil_with_config(|anvil| Anvil::fork(anvil, get_sepolia_url()));
865-
866862
// Make a contract that emits events so we can pick up on them
867863
sol! {
868864
#[allow(missing_docs)]
@@ -889,44 +885,84 @@ mod test {
889885
}
890886
}
891887
}
888+
889+
sol! {
890+
#[allow(missing_docs)]
891+
// solc v0.8.26; solc Counter.sol --via-ir --optimize --bin
892+
#[sol(rpc, abi, bytecode="6080604052348015600e575f80fd5b506102288061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c8063488814e01461004e5780637229db15146100585780638381f58a14610062578063d09de08a14610080575b5f80fd5b61005661008a565b005b6100606100f8565b005b61006a610130565b6040516100779190610165565b60405180910390f35b610088610135565b005b5f547fbe3cbcfa5d4a62a595b4a15f51de63c11797bbef2ff687873efb0bb2852ee20f60405160405180910390a26100c0610135565b5f547fbe3cbcfa5d4a62a595b4a15f51de63c11797bbef2ff687873efb0bb2852ee20f60405160405180910390a26100f6610135565b565b5f547fbe3cbcfa5d4a62a595b4a15f51de63c11797bbef2ff687873efb0bb2852ee20f60405160405180910390a261012e610135565b565b5f5481565b5f80815480929190610146906101ab565b9190505550565b5f819050919050565b61015f8161014d565b82525050565b5f6020820190506101785f830184610156565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6101b58261014d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036101e7576101e661017e565b5b60018201905091905056fea26469706673582212203b7602644bfff2df89c2fe9498cd533326876859a0df7b96ac10be1fdc09c3a064736f6c634300081a0033")]
893+
894+
contract OtherEmitter {
895+
uint256 public number;
896+
event otherEvent(uint256 indexed num);
897+
898+
function otherEmit() public {
899+
emit otherEvent(number);
900+
increment();
901+
}
902+
903+
function twoEmits() public {
904+
emit otherEvent(number);
905+
increment();
906+
emit otherEvent(number);
907+
increment();
908+
}
909+
910+
function increment() public {
911+
number++;
912+
}
913+
}
914+
}
915+
916+
// Spin up a local node.
917+
918+
let rpc = ProviderBuilder::new()
919+
.with_recommended_fillers()
920+
.on_anvil_with_config(|anvil| Anvil::arg(anvil, "--no-mining"));
921+
922+
// Turn on auto mining to deploy the contracts
923+
rpc.anvil_set_auto_mine(true).await.unwrap();
924+
892925
// Deploy the contract using anvil
893-
let contract = EventEmitter::deploy(rpc.clone()).await?;
926+
let event_contract = EventEmitter::deploy(rpc.root()).await.unwrap();
894927

895-
let tx_reqs = (0..10)
896-
.map(|i| match i % 2 {
897-
0 => contract.testEmit().into_transaction_request(),
898-
1 => contract.twoEmits().into_transaction_request(),
928+
// Deploy the contract using anvil
929+
let other_contract = OtherEmitter::deploy(rpc.root()).await.unwrap();
930+
931+
// Disable auto mining so we can ensure that all the transaction appear in the same block
932+
rpc.anvil_set_auto_mine(false).await.unwrap();
933+
934+
let mut pending_tx_builders = vec![];
935+
for i in 0..25 {
936+
let tx_req = match i % 4 {
937+
0 => event_contract.testEmit().into_transaction_request(),
938+
1 => event_contract.twoEmits().into_transaction_request(),
939+
2 => other_contract.otherEmit().into_transaction_request(),
940+
3 => other_contract.twoEmits().into_transaction_request(),
899941
_ => unreachable!(),
900-
})
901-
.collect::<Vec<_>>();
902-
let mut join_set = JoinSet::new();
903-
904-
tx_reqs.into_iter().for_each(|tx_req| {
905-
let rpc_clone = rpc.clone();
906-
join_set.spawn(async move {
907-
rpc_clone
908-
.anvil_auto_impersonate_account(true)
909-
.await
910-
.unwrap();
911-
let sender_address = Address::random();
912-
let balance = U256::from(1e18 as u64);
913-
rpc_clone
914-
.anvil_set_balance(sender_address, balance)
915-
.await
916-
.unwrap();
917-
rpc_clone
918-
.send_transaction(tx_req.with_from(sender_address))
919-
.await
920-
.unwrap()
921-
.watch()
922-
.await
923-
.unwrap()
924-
});
925-
});
942+
};
943+
944+
let sender_address = Address::random();
945+
let funding = U256::from(1e18 as u64);
946+
rpc.anvil_set_balance(sender_address, funding)
947+
.await
948+
.unwrap();
949+
rpc.anvil_auto_impersonate_account(true).await.unwrap();
950+
let new_req = tx_req.with_from(sender_address);
951+
let tx_req_final = rpc
952+
.fill(new_req)
953+
.await
954+
.unwrap()
955+
.as_builder()
956+
.unwrap()
957+
.clone();
958+
pending_tx_builders.push(rpc.send_transaction(tx_req_final).await.unwrap());
959+
}
960+
961+
rpc.anvil_mine(Some(U256::from(1u8)), None).await.unwrap();
926962

927-
let hashes = join_set.join_all().await;
928963
let mut transactions = Vec::new();
929-
for hash in hashes.into_iter() {
964+
for pending in pending_tx_builders.into_iter() {
965+
let hash = pending.watch().await.unwrap();
930966
transactions.push(rpc.get_transaction_by_hash(hash).await.unwrap().unwrap());
931967
}
932968

@@ -936,7 +972,7 @@ mod test {
936972
let all_events = EventEmitter::abi::events();
937973

938974
let events = all_events.get("testEvent").unwrap();
939-
let receipt_query = ReceiptQuery::new(*contract.address(), events[0].clone());
975+
let receipt_query = ReceiptQuery::new(*event_contract.address(), events[0].clone());
940976

941977
let block = rpc
942978
.get_block(

mp2-test/src/mpt_sequential.rs

+39-34
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use eth_trie::{EthTrie, MemoryDB, Trie};
1111
use mp2_common::eth::{ReceiptProofInfo, ReceiptQuery};
1212
use rand::{thread_rng, Rng};
1313
use std::sync::Arc;
14-
use tokio::task::JoinSet;
1514

1615
/// Simply the maximum number of nibbles a key can have.
1716
const MAX_KEY_NIBBLE_LEN: usize = 64;
@@ -112,50 +111,56 @@ pub fn generate_receipt_proofs() -> Vec<ReceiptProofInfo> {
112111
rt.block_on(async {
113112
// Spin up a local node.
114113

115-
let rpc = ProviderBuilder::new().on_anvil_with_config(|anvil| Anvil::block_time(anvil, 1));
114+
let rpc = ProviderBuilder::new()
115+
.with_recommended_fillers()
116+
.on_anvil_with_config(|anvil| Anvil::arg(anvil, "--no-mining"));
117+
118+
// Turn on auto mining to deploy the contracts
119+
rpc.anvil_set_auto_mine(true).await.unwrap();
116120

117121
// Deploy the contract using anvil
118-
let event_contract = EventEmitter::deploy(rpc.clone()).await.unwrap();
122+
let event_contract = EventEmitter::deploy(rpc.root()).await.unwrap();
119123

120124
// Deploy the contract using anvil
121-
let other_contract = OtherEmitter::deploy(rpc.clone()).await.unwrap();
125+
let other_contract = OtherEmitter::deploy(rpc.root()).await.unwrap();
126+
127+
// Disable auto mining so we can ensure that all the transaction appear in the same block
128+
rpc.anvil_set_auto_mine(false).await.unwrap();
122129

123-
let tx_reqs = (0..25)
124-
.map(|i| match i % 4 {
130+
// Send a bunch of transactions, some of which are related to the event we are testing for.
131+
let mut pending_tx_builders = vec![];
132+
for i in 0..25 {
133+
let tx_req = match i % 4 {
125134
0 => event_contract.testEmit().into_transaction_request(),
126135
1 => event_contract.twoEmits().into_transaction_request(),
127136
2 => other_contract.otherEmit().into_transaction_request(),
128137
3 => other_contract.twoEmits().into_transaction_request(),
129138
_ => unreachable!(),
130-
})
131-
.collect::<Vec<_>>();
132-
let mut join_set = JoinSet::new();
133-
tx_reqs.into_iter().for_each(|tx_req| {
134-
let rpc_clone = rpc.clone();
135-
join_set.spawn(async move {
136-
let sender_address = Address::random();
137-
let funding = U256::from(1e18 as u64);
138-
rpc_clone
139-
.anvil_set_balance(sender_address, funding)
140-
.await
141-
.unwrap();
142-
rpc_clone
143-
.anvil_auto_impersonate_account(true)
144-
.await
145-
.unwrap();
146-
rpc_clone
147-
.send_transaction(tx_req.with_from(sender_address))
148-
.await
149-
.unwrap()
150-
.watch()
151-
.await
152-
.unwrap()
153-
});
154-
});
155-
156-
let hashes = join_set.join_all().await;
139+
};
140+
141+
let sender_address = Address::random();
142+
let funding = U256::from(1e18 as u64);
143+
rpc.anvil_set_balance(sender_address, funding)
144+
.await
145+
.unwrap();
146+
rpc.anvil_auto_impersonate_account(true).await.unwrap();
147+
let new_req = tx_req.with_from(sender_address);
148+
let tx_req_final = rpc
149+
.fill(new_req)
150+
.await
151+
.unwrap()
152+
.as_builder()
153+
.unwrap()
154+
.clone();
155+
pending_tx_builders.push(rpc.send_transaction(tx_req_final).await.unwrap());
156+
}
157+
158+
// Mine a block, it should include all the transactions created above.
159+
rpc.anvil_mine(Some(U256::from(1u8)), None).await.unwrap();
160+
157161
let mut transactions = Vec::new();
158-
for hash in hashes.into_iter() {
162+
for pending in pending_tx_builders.into_iter() {
163+
let hash = pending.watch().await.unwrap();
159164
transactions.push(rpc.get_transaction_by_hash(hash).await.unwrap().unwrap());
160165
}
161166

0 commit comments

Comments
 (0)