Skip to content

Commit 6d16f55

Browse files
committed
docs: fix README
1 parent 276d0b7 commit 6d16f55

File tree

2 files changed

+41
-38
lines changed

2 files changed

+41
-38
lines changed

README.md

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
Event Scanner is a Rust library for streaming EVM-based smart contract events. It is built on top of the [`alloy`](https://github.com/alloy-rs/alloy) ecosystem and focuses on in-memory scanning without a backing database. Applications provide event filters; the scanner takes care of fetching historical ranges, bridging into live streaming mode, all whilst delivering the events as streams of data.
1212

1313
---
14-
1514

1615
## Table of Contents
1716

@@ -76,8 +75,8 @@ async fn run_scanner(
7675
.connect_ws::<Ethereum>(ws_url).await?;
7776

7877
let filter = EventFilter::new()
79-
.with_contract_address(contract)
80-
.with_event(MyContract::SomeEvent::SIGNATURE);
78+
.contract_address(contract)
79+
.event(MyContract::SomeEvent::SIGNATURE);
8180

8281
let mut stream = scanner.subscribe(filter);
8382

@@ -118,6 +117,7 @@ let scanner = EventScanner::sync()
118117

119118
// Latest mode (recent blocks only)
120119
let scanner = EventScanner::latest()
120+
.count(100)
121121
.block_read_limit(500)
122122
.connect_ws::<Ethereum>(ws_url).await?;
123123
```
@@ -142,23 +142,23 @@ Create an `EventFilter` for each event stream you wish to process. The filter sp
142142
```rust
143143
// Track a SPECIFIC event from a SPECIFIC contract
144144
let specific_filter = EventFilter::new()
145-
.with_contract_address(*counter_contract.address())
146-
.with_event(Counter::CountIncreased::SIGNATURE);
145+
.contract_address(*counter_contract.address())
146+
.event(Counter::CountIncreased::SIGNATURE);
147147

148148
// Track a multiple events from a SPECIFIC contract
149149
let specific_filter = EventFilter::new()
150-
.with_contract_address(*counter_contract.address())
151-
.with_event(Counter::CountIncreased::SIGNATURE)
152-
.with_event(Counter::CountDecreased::SIGNATURE);
150+
.contract_address(*counter_contract.address())
151+
.event(Counter::CountIncreased::SIGNATURE)
152+
.event(Counter::CountDecreased::SIGNATURE);
153153

154154
// Track a SPECIFIC event from a ALL contracts
155155
let specific_filter = EventFilter::new()
156-
.with_event(Counter::CountIncreased::SIGNATURE);
156+
.event(Counter::CountIncreased::SIGNATURE);
157157

158158
// Track ALL events from a SPECIFIC contracts
159159
let all_contract_events_filter = EventFilter::new()
160-
.with_contract_address(*counter_contract.address())
161-
.with_contract_address(*other_counter_contract.address());
160+
.contract_address(*counter_contract.address())
161+
.contract_address(*other_counter_contract.address());
162162

163163
// Track ALL events from ALL contracts in the block range
164164
let all_events_filter = EventFilter::new();
@@ -185,32 +185,31 @@ See integration tests under `tests/live_mode`, `tests/historic_mode`, and `tests
185185

186186
### Scanning Latest Events
187187

188-
`scan_latest` collects the most recent matching events for each registered stream.
188+
Scanner mode that collects a specified number of the most recent matching events for each registered stream.
189189

190190
- It does not enter live mode; it scans a block range and then returns.
191191
- Each registered stream receives at most `count` logs in a single message, chronologically ordered.
192192

193193
Basic usage:
194194

195195
```rust
196-
use alloy::{eips::BlockNumberOrTag, network::Ethereum};
197-
use event_scanner::{EventFilter, event_scanner::{EventScanner, EventScannerMessage}};
196+
use alloy::{network::Ethereum, primitives::Address, transports::http::reqwest::Url};
197+
use event_scanner::{EventFilter, EventScanner, Message};
198198
use tokio_stream::StreamExt;
199199

200-
async fn latest_example(ws_url: alloy::transports::http::reqwest::Url, addr: alloy::primitives::Address) -> eyre::Result<()> {
201-
let mut client = EventScanner::new().connect_ws::<Ethereum>(ws_url).await?;
200+
async fn latest_events(ws_url: Url, addr: Address) -> anyhow::Result<()> {
201+
let mut scanner = EventScanner::latest().count(10).connect_ws::<Ethereum>(ws_url).await?;
202202

203-
let filter = EventFilter::new().with_contract_address(addr);
204-
let mut stream = client.subscribe(filter);
203+
let filter = EventFilter::new().contract_address(addr);
204+
205+
let mut stream = scanner.subscribe(filter);
205206

206207
// Collect the latest 10 events across Earliest..=Latest
207-
client.scan_latest(10).await?;
208+
scanner.start().await?;
208209

209210
// Expect a single message with up to 10 logs, then the stream ends
210-
while let Some(msg) = stream.next().await {
211-
if let EventScannerMessage::Data(logs) = msg {
212-
println!("Latest logs: {}", logs.len());
213-
}
211+
while let Some(Message::Data(logs)) = stream.next().await {
212+
println!("Latest logs: {}", logs.len());
214213
}
215214

216215
Ok(())
@@ -221,30 +220,33 @@ Restricting to a specific block range:
221220

222221
```rust
223222
// Collect the latest 5 events between blocks [1_000_000, 1_100_000]
224-
client
225-
.scan_latest_in_range(5, BlockNumberOrTag::Number(1_000_000), BlockNumberOrTag::Number(1_100_000))
223+
let mut scanner = EventScanner::latest()
224+
.count(5)
225+
.from_block(1_000_000)
226+
.to_block(1_100_000)
227+
.connect_ws::<Ethereum>(ws_url).await?;
226228
.await?;
227229
```
228230

229231
The scanner periodically checks the tip to detect reorgs. On reorg, the scanner emits `ScannerStatus::ReorgDetected`, resets to the updated tip, and restarts the scan. Final delivery to log listeners is in chronological order.
230232

231233
Notes:
232234

233-
- Ensure you create streams via `subscribe()` before calling `scan_latest*` so listeners are registered.
235+
- Ensure you create streams via `subscribe()` before calling `start` so listeners are registered.
234236
<!-- TODO: uncomment once implemented - The function returns after delivering the messages; to continuously stream new blocks, use `scan_latest_then_live`. -->
235237

236238
---
237239

238240
## Examples
239241

240-
- `examples/simple_counter` – minimal live-mode scanner using `EventScanner::live()`
242+
- `examples/live_scanning` – minimal live-mode scanner using `EventScanner::live()`
241243
- `examples/historical_scanning` – demonstrates replaying historical data using `EventScanner::historic()`
242244
- `examples/latest_events_scanning` – demonstrates scanning the latest events using `EventScanner::latest()`
243245

244246
Run an example with:
245247

246248
```bash
247-
RUST_LOG=info cargo run -p simple_counter
249+
RUST_LOG=info cargo run -p live_scanning
248250
# or
249251
RUST_LOG=info cargo run -p historical_scanning
250252
```

tests/latest_events/basic.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ macro_rules! decrease {
3838
}
3939

4040
#[tokio::test]
41-
async fn scan_latest_exact_count_returns_last_events_in_order() -> anyhow::Result<()> {
41+
async fn latest_scanner_exact_count_returns_last_events_in_order() -> anyhow::Result<()> {
4242
let count = 5;
4343
let setup = setup_latest_scanner(None, None, count, None, None).await?;
4444
let contract = setup.contract;
@@ -68,7 +68,7 @@ async fn scan_latest_exact_count_returns_last_events_in_order() -> anyhow::Resul
6868
}
6969

7070
#[tokio::test]
71-
async fn scan_latest_fewer_available_than_count_returns_all() -> anyhow::Result<()> {
71+
async fn latest_scanner_fewer_available_than_count_returns_all() -> anyhow::Result<()> {
7272
let count = 5;
7373
let setup = setup_latest_scanner(None, None, count, None, None).await?;
7474
let contract = setup.contract;
@@ -90,7 +90,7 @@ async fn scan_latest_fewer_available_than_count_returns_all() -> anyhow::Result<
9090
}
9191

9292
#[tokio::test]
93-
async fn scan_latest_no_events_returns_empty() -> anyhow::Result<()> {
93+
async fn latest_scanner_no_events_returns_empty() -> anyhow::Result<()> {
9494
let count = 5;
9595
let setup = setup_latest_scanner(None, None, count, None, None).await?;
9696
let scanner = setup.scanner;
@@ -107,7 +107,7 @@ async fn scan_latest_no_events_returns_empty() -> anyhow::Result<()> {
107107
}
108108

109109
#[tokio::test]
110-
async fn scan_latest_respects_range_subset() -> anyhow::Result<()> {
110+
async fn latest_scanner_respects_range_subset() -> anyhow::Result<()> {
111111
let (anvil, provider, contract, default_filter) = setup_common(None, None).await?;
112112
// Mine 6 events, one per tx (auto-mined), then manually mint 2 empty blocks to widen range
113113
_ = increase!(contract);
@@ -144,7 +144,8 @@ async fn scan_latest_respects_range_subset() -> anyhow::Result<()> {
144144
}
145145

146146
#[tokio::test]
147-
async fn scan_latest_multiple_listeners_to_same_event_receive_same_results() -> anyhow::Result<()> {
147+
async fn latest_scanner_multiple_listeners_to_same_event_receive_same_results() -> anyhow::Result<()>
148+
{
148149
let count = 5;
149150
let setup = setup_latest_scanner(None, None, count, None, None).await?;
150151
let contract = setup.contract;
@@ -181,7 +182,7 @@ async fn scan_latest_multiple_listeners_to_same_event_receive_same_results() ->
181182
}
182183

183184
#[tokio::test]
184-
async fn scan_latest_different_filters_receive_different_results() -> anyhow::Result<()> {
185+
async fn latest_scanner_different_filters_receive_different_results() -> anyhow::Result<()> {
185186
let count = 3;
186187
let setup = setup_latest_scanner(None, None, count, None, None).await?;
187188
let contract = setup.contract;
@@ -228,7 +229,7 @@ async fn scan_latest_different_filters_receive_different_results() -> anyhow::Re
228229
}
229230

230231
#[tokio::test]
231-
async fn scan_latest_mixed_events_and_filters_return_correct_streams() -> anyhow::Result<()> {
232+
async fn latest_scanner_mixed_events_and_filters_return_correct_streams() -> anyhow::Result<()> {
232233
let count = 2;
233234
let setup = setup_latest_scanner(None, None, count, None, None).await?;
234235
let contract = setup.contract;
@@ -271,7 +272,7 @@ async fn scan_latest_mixed_events_and_filters_return_correct_streams() -> anyhow
271272
}
272273

273274
#[tokio::test]
274-
async fn scan_latest_cross_contract_filtering() -> anyhow::Result<()> {
275+
async fn latest_scanner_cross_contract_filtering() -> anyhow::Result<()> {
275276
// Manual setup to deploy two contracts
276277
let count = 5;
277278
let setup = setup_latest_scanner(None, None, count, None, None).await?;
@@ -305,7 +306,7 @@ async fn scan_latest_cross_contract_filtering() -> anyhow::Result<()> {
305306
}
306307

307308
#[tokio::test]
308-
async fn scan_latest_large_gaps_and_empty_ranges() -> anyhow::Result<()> {
309+
async fn latest_scanner_large_gaps_and_empty_ranges() -> anyhow::Result<()> {
309310
// Manual setup to mine empty blocks
310311
let (anvil, provider, contract, default_filter) = setup_common(None, None).await?;
311312

@@ -340,7 +341,7 @@ async fn scan_latest_large_gaps_and_empty_ranges() -> anyhow::Result<()> {
340341
}
341342

342343
#[tokio::test]
343-
async fn scan_latest_boundary_range_single_block() -> anyhow::Result<()> {
344+
async fn latest_scanner_boundary_range_single_block() -> anyhow::Result<()> {
344345
let (anvil, provider, contract, default_filter) = setup_common(None, None).await?;
345346

346347
_ = increase!(contract);

0 commit comments

Comments
 (0)