@@ -314,8 +314,11 @@ where
314314 type TxsOfSpkIndex = ( u32 , Vec < esplora_client:: Tx > , HashSet < Txid > ) ;
315315
316316 let mut update = TxUpdate :: < ConfirmationBlockTime > :: default ( ) ;
317- let mut last_index = Option :: < u32 > :: None ;
318317 let mut last_active_index = Option :: < u32 > :: None ;
318+ // Use consecutive_unused so unused count drives stop gap.
319+ let mut consecutive_unused = 0usize ;
320+ // Treat stop_gap = 0 as 1 while preserving original semantics for other values.
321+ let gap_limit = stop_gap. max ( 1 ) ;
319322
320323 loop {
321324 let handles = keychain_spks
@@ -352,8 +355,10 @@ where
352355 }
353356
354357 for ( index, txs, evicted) in handles. try_collect :: < Vec < TxsOfSpkIndex > > ( ) . await ? {
355- last_index = Some ( index) ;
356- if !txs. is_empty ( ) {
358+ if txs. is_empty ( ) {
359+ consecutive_unused = consecutive_unused. saturating_add ( 1 ) ;
360+ } else {
361+ consecutive_unused = 0 ;
357362 last_active_index = Some ( index) ;
358363 }
359364 for tx in txs {
@@ -368,13 +373,7 @@ where
368373 . extend ( evicted. into_iter ( ) . map ( |txid| ( txid, start_time) ) ) ;
369374 }
370375
371- let last_index = last_index. expect ( "Must be set since handles wasn't empty." ) ;
372- let gap_limit_reached = if let Some ( i) = last_active_index {
373- last_index >= i. saturating_add ( stop_gap as u32 )
374- } else {
375- last_index + 1 >= stop_gap as u32
376- } ;
377- if gap_limit_reached {
376+ if consecutive_unused >= gap_limit {
378377 break ;
379378 }
380379 }
@@ -596,7 +595,10 @@ mod test {
596595 let res = chain_update ( & client, & latest_blocks, & cp, & anchors) . await ;
597596 use esplora_client:: Error ;
598597 assert ! (
599- matches!( * res. unwrap_err( ) , Error :: HeaderHashNotFound ( hash) if hash == genesis_hash) ,
598+ matches!(
599+ * res. unwrap_err( ) ,
600+ Error :: HeaderHashNotFound ( hash) if hash == genesis_hash
601+ ) ,
600602 "`chain_update` should error if it can't connect to the local CP" ,
601603 ) ;
602604
0 commit comments