|
48 | 48 |
|
49 | 49 | #[cfg(test)]
|
50 | 50 | mod tests {
|
51 |
| - use crate::{CommitteeMemberSol, CommitteeSol, KeyManager}; |
52 |
| - use alloy::{providers::WalletProvider, sol_types::SolValue}; |
| 51 | + use super::deploy_key_manager_contract; |
| 52 | + use crate::{CommitteeMemberSol, CommitteeSol, KeyManager, KeyManager::CommitteeCreated}; |
| 53 | + use alloy::{ |
| 54 | + eips::BlockNumberOrTag, |
| 55 | + node_bindings::Anvil, |
| 56 | + providers::{Provider, ProviderBuilder, WalletProvider}, |
| 57 | + rpc::types::Filter, |
| 58 | + sol_types::{SolEvent, SolValue}, |
| 59 | + transports::ws::WsConnect, |
| 60 | + }; |
| 61 | + use futures::StreamExt; |
53 | 62 | use rand::prelude::*;
|
54 | 63 |
|
55 | 64 | #[tokio::test]
|
@@ -93,4 +102,62 @@ mod tests {
|
93 | 102 | .abi_encode_sequence()
|
94 | 103 | );
|
95 | 104 | }
|
| 105 | + |
| 106 | + #[tokio::test] |
| 107 | + async fn test_event_stream() { |
| 108 | + let anvil = Anvil::new().spawn(); |
| 109 | + let wallet = anvil.wallet().unwrap(); |
| 110 | + let provider = ProviderBuilder::new() |
| 111 | + .wallet(wallet) |
| 112 | + .connect_http(anvil.endpoint_url()); |
| 113 | + let pubsub_provider = ProviderBuilder::new() |
| 114 | + .connect_pubsub_with(WsConnect::new(anvil.ws_endpoint_url())) |
| 115 | + .await |
| 116 | + .unwrap(); |
| 117 | + assert_eq!( |
| 118 | + pubsub_provider.get_chain_id().await.unwrap(), |
| 119 | + provider.get_chain_id().await.unwrap() |
| 120 | + ); |
| 121 | + |
| 122 | + let manager = provider.default_signer_address(); |
| 123 | + let km_addr = deploy_key_manager_contract(&provider, manager) |
| 124 | + .await |
| 125 | + .unwrap(); |
| 126 | + let contract = KeyManager::new(km_addr, &provider); |
| 127 | + |
| 128 | + // setup event stream |
| 129 | + let filter = Filter::new() |
| 130 | + .address(km_addr) |
| 131 | + .event(KeyManager::CommitteeCreated::SIGNATURE) |
| 132 | + .from_block(BlockNumberOrTag::Latest); |
| 133 | + let mut events = pubsub_provider |
| 134 | + .subscribe_logs(&filter) |
| 135 | + .await |
| 136 | + .unwrap() |
| 137 | + .into_stream(); |
| 138 | + |
| 139 | + // register some committees on the contract, which emit events |
| 140 | + let rng = &mut rand::rng(); |
| 141 | + let c0_timestamp = rng.random::<u64>(); |
| 142 | + for i in 0..5 { |
| 143 | + let members = (0..5) |
| 144 | + .map(|_| CommitteeMemberSol::random()) |
| 145 | + .collect::<Vec<_>>(); |
| 146 | + let timestamp = c0_timestamp + 1000 * i; |
| 147 | + |
| 148 | + let _tx_receipt = contract |
| 149 | + .setNextCommittee(timestamp, members.clone()) |
| 150 | + .send() |
| 151 | + .await |
| 152 | + .unwrap() |
| 153 | + .get_receipt() |
| 154 | + .await |
| 155 | + .unwrap(); |
| 156 | + |
| 157 | + // Read the corresponding event |
| 158 | + let log = events.next().await.unwrap(); |
| 159 | + let typed_log = log.log_decode_validate::<CommitteeCreated>().unwrap(); |
| 160 | + assert_eq!(typed_log.data().id, i); |
| 161 | + } |
| 162 | + } |
96 | 163 | }
|
0 commit comments