@@ -25,13 +25,11 @@ impl EventScannerBuilder<Historic> {
2525 /// Validates that the maximum of `from_block` and `to_block` does not exceed
2626 /// the latest block on the chain.
2727 ///
28- /// # Panics
29- ///
30- /// If to or from block > latest block
31- ///
3228 /// # Errors
3329 ///
34- /// Returns an error if the provider connection fails
30+ /// Returns an error if:
31+ /// - The provider connection fails
32+ /// - The specified block range exceeds the latest block on the chain
3533 pub async fn connect < N : Network > (
3634 self ,
3735 provider : impl IntoRobustProvider < N > ,
@@ -46,7 +44,9 @@ impl EventScannerBuilder<Historic> {
4644
4745 let max_block = from_num. max ( to_num) ;
4846
49- assert ! ( ( max_block <= latest_block) , "Invalid historical block range" ) ;
47+ if max_block > latest_block {
48+ return Err ( ScannerError :: BlockExceedsLatest ( max_block, latest_block) ) ;
49+ }
5050
5151 Ok ( scanner)
5252 }
@@ -133,34 +133,68 @@ mod tests {
133133 }
134134
135135 #[ tokio:: test]
136- #[ should_panic( expected = "Invalid historical block range" ) ]
137- async fn test_from_block_above_latest_panics ( ) {
136+ async fn test_from_block_above_latest_returns_error ( ) {
138137 let anvil = Anvil :: new ( ) . try_spawn ( ) . unwrap ( ) ;
139138 let provider = ProviderBuilder :: new ( ) . connect_http ( anvil. endpoint_url ( ) ) ;
140139
141140 let latest_block = provider. get_block_number ( ) . await . unwrap ( ) ;
142141
143- let _scanner = EventScannerBuilder :: historic ( )
142+ let result = EventScannerBuilder :: historic ( )
144143 . from_block ( latest_block + 100 )
145144 . to_block ( latest_block)
146145 . connect ( provider)
147- . await
148- . unwrap ( ) ;
146+ . await ;
147+
148+ match result {
149+ Err ( ScannerError :: BlockExceedsLatest ( max, latest) ) => {
150+ assert_eq ! ( max, latest_block + 100 ) ;
151+ assert_eq ! ( latest, latest_block) ;
152+ }
153+ _ => panic ! ( "Expected BlockExceedsLatest error" ) ,
154+ }
149155 }
150156
151157 #[ tokio:: test]
152- #[ should_panic( expected = "Invalid historical block range" ) ]
153- async fn test_to_block_above_latest_panics ( ) {
158+ async fn test_to_block_above_latest_returns_error ( ) {
154159 let anvil = Anvil :: new ( ) . try_spawn ( ) . unwrap ( ) ;
155160 let provider = ProviderBuilder :: new ( ) . connect_http ( anvil. endpoint_url ( ) ) ;
156161
157162 let latest_block = provider. get_block_number ( ) . await . unwrap ( ) ;
158163
159- let _scanner = EventScannerBuilder :: historic ( )
164+ let result = EventScannerBuilder :: historic ( )
160165 . from_block ( 0 )
161166 . to_block ( latest_block + 100 )
162167 . connect ( provider)
163- . await
164- . unwrap ( ) ;
168+ . await ;
169+
170+ match result {
171+ Err ( ScannerError :: BlockExceedsLatest ( max, latest) ) => {
172+ assert_eq ! ( max, latest_block + 100 ) ;
173+ assert_eq ! ( latest, latest_block) ;
174+ }
175+ _ => panic ! ( "Expected BlockExceedsLatest error" ) ,
176+ }
177+ }
178+
179+ #[ tokio:: test]
180+ async fn test_to_and_from_block_above_latest_returns_error ( ) {
181+ let anvil = Anvil :: new ( ) . try_spawn ( ) . unwrap ( ) ;
182+ let provider = ProviderBuilder :: new ( ) . connect_http ( anvil. endpoint_url ( ) ) ;
183+
184+ let latest_block = provider. get_block_number ( ) . await . unwrap ( ) ;
185+
186+ let result = EventScannerBuilder :: historic ( )
187+ . to_block ( latest_block + 50 )
188+ . to_block ( latest_block + 100 )
189+ . connect ( provider)
190+ . await ;
191+
192+ match result {
193+ Err ( ScannerError :: BlockExceedsLatest ( max, latest) ) => {
194+ assert_eq ! ( max, latest_block + 100 ) ;
195+ assert_eq ! ( latest, latest_block) ;
196+ }
197+ _ => panic ! ( "Expected BlockExceedsLatest error" ) ,
198+ }
165199 }
166200}
0 commit comments