@@ -63,7 +63,7 @@ pub struct KeychainTxOutIndex<K> {
6363 inner : SpkTxOutIndex < ( K , u32 ) > ,
6464 // descriptors of each keychain
6565 keychains : BTreeMap < K , Descriptor < DescriptorPublicKey > > ,
66- // last stored indexes
66+ // last revealed indexes
6767 last_revealed : BTreeMap < K , u32 > ,
6868 // lookahead settings for each keychain
6969 lookahead : BTreeMap < K , u32 > ,
@@ -381,40 +381,39 @@ impl<K: Clone + Ord + Debug> KeychainTxOutIndex<K> {
381381 let has_wildcard = descriptor. has_wildcard ( ) ;
382382
383383 let target_index = if has_wildcard { target_index } else { 0 } ;
384- let next_store_index = self . next_store_index ( keychain) ;
385384 let next_reveal_index = self . last_revealed . get ( keychain) . map_or ( 0 , |v| * v + 1 ) ;
386385 let lookahead = self . lookahead . get ( keychain) . map_or ( 0 , |v| * v) ;
387386
388- // if we can reveal new indexes, the latest revealed index goes here
389- let mut revealed_index = None ;
387+ debug_assert_eq ! (
388+ next_reveal_index + lookahead,
389+ self . next_store_index( keychain)
390+ ) ;
391+
392+ // if we need to reveal new indices, the latest revealed index goes here
393+ let mut reveal_to_index = None ;
390394
391- // if the target is already surpassed, we have nothing to reveal
392- if next_reveal_index <= target_index
393- // if the target is already stored (due to lookahead), this can be our newly revealed index
394- && target_index < next_reveal_index + lookahead
395- {
396- revealed_index = Some ( target_index) ;
395+ // if the target is not yet revealed, but is already stored (due to lookahead), we need to
396+ // set the `reveal_to_index` as target here (as the `for` loop below only updates
397+ // `reveal_to_index` for indexes that are NOT stored)
398+ if next_reveal_index <= target_index && target_index < next_reveal_index + lookahead {
399+ reveal_to_index = Some ( target_index) ;
397400 }
398401
399402 // we range over indexes that are not stored
400403 let range = next_reveal_index + lookahead..=target_index + lookahead;
401-
402404 for ( new_index, new_spk) in range_descriptor_spks ( Cow :: Borrowed ( descriptor) , range) {
403- // no need to store if already stored
404- if new_index >= next_store_index {
405- let _inserted = self
406- . inner
407- . insert_spk ( ( keychain. clone ( ) , new_index) , new_spk) ;
408- debug_assert ! ( _inserted, "must not have existing spk" , ) ;
409- }
405+ let _inserted = self
406+ . inner
407+ . insert_spk ( ( keychain. clone ( ) , new_index) , new_spk) ;
408+ debug_assert ! ( _inserted, "must not have existing spk" , ) ;
410409
411410 // everything after `target_index` is stored for lookahead only
412411 if new_index <= target_index {
413- revealed_index = Some ( new_index) ;
412+ reveal_to_index = Some ( new_index) ;
414413 }
415414 }
416415
417- match revealed_index {
416+ match reveal_to_index {
418417 Some ( index) => {
419418 let _old_index = self . last_revealed . insert ( keychain. clone ( ) , index) ;
420419 debug_assert ! ( _old_index < Some ( index) ) ;
0 commit comments