@@ -386,15 +386,9 @@ impl<N: Network> Service<N> {
386386 Command :: StreamFrom { sender, start_height, response } => {
387387 self . ensure_no_subscriber ( ) ?;
388388 self . subscriber = Some ( sender) ;
389- if matches ! ( start_height, BlockNumberOrTag :: Latest ) {
390- let result = self . handle_live ( ) . await ;
391- info ! ( "Starting live stream" ) ;
392- let _ = response. send ( result) ;
393- } else {
394- info ! ( start_height = ?start_height, "Starting streaming from" ) ;
395- let result = self . handle_sync ( start_height) . await ;
396- let _ = response. send ( result) ;
397- }
389+ info ! ( start_height = ?start_height, "Starting streaming from" ) ;
390+ let result = self . handle_sync ( start_height) . await ;
391+ let _ = response. send ( result) ;
398392 }
399393 Command :: Unsubscribe { response } => {
400394 self . handle_unsubscribe ( ) ;
@@ -1078,6 +1072,44 @@ mod tests {
10781072 Ok ( ( ) )
10791073 }
10801074
1075+ #[ tokio:: test]
1076+ async fn stream_from_latest_starts_at_tip_not_confirmed ( ) -> anyhow:: Result < ( ) > {
1077+ let anvil = Anvil :: new ( ) . try_spawn ( ) ?;
1078+
1079+ let provider = ProviderBuilder :: new ( ) . connect ( anvil. endpoint ( ) . as_str ( ) ) . await ?;
1080+ provider. anvil_mine ( Option :: Some ( 20 ) , Option :: None ) . await ?;
1081+
1082+ let block_confirmations = 5 ;
1083+
1084+ let client = BlockRangeScanner :: new ( )
1085+ . with_block_confirmations ( block_confirmations)
1086+ . connect_ws :: < Ethereum > ( anvil. ws_endpoint_url ( ) )
1087+ . await ?
1088+ . run ( ) ?;
1089+
1090+ let expected_blocks = 10 ;
1091+ let mut receiver =
1092+ client. stream_from ( BlockNumberOrTag :: Latest ) . await ?. take ( expected_blocks) ;
1093+
1094+ let latest_head = provider. get_block_number ( ) . await ?;
1095+ provider. anvil_mine ( Option :: Some ( expected_blocks as u64 ) , Option :: None ) . await ?;
1096+
1097+ let mut block_range_start = 0 ;
1098+
1099+ while let Some ( BlockRangeMessage :: Data ( range) ) = receiver. next ( ) . await {
1100+ if block_range_start == 0 {
1101+ block_range_start = * range. start ( ) ;
1102+ assert_eq ! ( * range. start( ) , latest_head) ;
1103+ }
1104+
1105+ assert_eq ! ( block_range_start, * range. start( ) ) ;
1106+ assert ! ( * range. end( ) >= * range. start( ) ) ;
1107+ block_range_start = * range. end ( ) + 1 ;
1108+ }
1109+
1110+ Ok ( ( ) )
1111+ }
1112+
10811113 #[ tokio:: test]
10821114 async fn live_mode_respects_block_confirmations ( ) -> anyhow:: Result < ( ) > {
10831115 let anvil = Anvil :: new ( ) . try_spawn ( ) ?;
0 commit comments