@@ -355,15 +355,15 @@ impl Wallet {
355355 ..Default :: default ( )
356356 } ;
357357
358- let tx_graph = make_indexed_graph (
359- & mut stage,
360- Default :: default ( ) ,
358+ let index = make_keychain_index (
361359 Default :: default ( ) ,
362360 descriptor,
363361 change_descriptor,
364362 params. lookahead ,
365363 params. use_spk_cache ,
366364 ) ?;
365+ stage. indexer . merge ( index. initial_changeset ( ) ) ;
366+ let tx_graph = IndexedTxGraph :: new ( index) ;
367367
368368 Ok ( Wallet {
369369 signers,
@@ -559,10 +559,9 @@ impl Wallet {
559559 . map ( |( op, _) | op)
560560 . collect ( ) ;
561561
562- let mut stage = ChangeSet :: default ( ) ;
562+ let stage = ChangeSet :: default ( ) ;
563563
564- let tx_graph = make_indexed_graph (
565- & mut stage,
564+ let tx_graph = make_loaded_indexed_graph (
566565 changeset. tx_graph ,
567566 changeset. indexer ,
568567 descriptor,
@@ -2828,8 +2827,50 @@ fn new_local_utxo(
28282827 }
28292828}
28302829
2831- fn make_indexed_graph (
2832- stage : & mut ChangeSet ,
2830+ fn make_keychain_index (
2831+ indexer_changeset : chain:: keychain_txout:: ChangeSet ,
2832+ descriptor : ExtendedDescriptor ,
2833+ change_descriptor : Option < ExtendedDescriptor > ,
2834+ lookahead : u32 ,
2835+ use_spk_cache : bool ,
2836+ ) -> Result < KeychainTxOutIndex < KeychainKind > , DescriptorError > {
2837+ let mut idx = KeychainTxOutIndex :: from_changeset ( lookahead, use_spk_cache, indexer_changeset) ;
2838+
2839+ let descriptor_inserted = idx
2840+ . insert_descriptor ( KeychainKind :: External , descriptor)
2841+ . expect ( "already checked to be a unique, wildcard, non-multipath descriptor" ) ;
2842+ assert ! (
2843+ descriptor_inserted,
2844+ "this must be the first time we are seeing this descriptor"
2845+ ) ;
2846+
2847+ let change_descriptor = match change_descriptor {
2848+ Some ( change_descriptor) => change_descriptor,
2849+ None => return Ok ( idx) ,
2850+ } ;
2851+
2852+ let change_descriptor_inserted = idx
2853+ . insert_descriptor ( KeychainKind :: Internal , change_descriptor)
2854+ . map_err ( |e| {
2855+ use bdk_chain:: indexer:: keychain_txout:: InsertDescriptorError ;
2856+ match e {
2857+ InsertDescriptorError :: DescriptorAlreadyAssigned { .. } => {
2858+ crate :: descriptor:: error:: Error :: ExternalAndInternalAreTheSame
2859+ }
2860+ InsertDescriptorError :: KeychainAlreadyAssigned { .. } => {
2861+ unreachable ! ( "this is the first time we're assigning internal" )
2862+ }
2863+ }
2864+ } ) ?;
2865+ assert ! (
2866+ change_descriptor_inserted,
2867+ "this must be the first time we are seeing this descriptor"
2868+ ) ;
2869+
2870+ Ok ( idx)
2871+ }
2872+
2873+ fn make_loaded_indexed_graph (
28332874 tx_graph_changeset : chain:: tx_graph:: ChangeSet < ConfirmationBlockTime > ,
28342875 indexer_changeset : chain:: keychain_txout:: ChangeSet ,
28352876 descriptor : ExtendedDescriptor ,
@@ -2838,50 +2879,25 @@ fn make_indexed_graph(
28382879 use_spk_cache : bool ,
28392880) -> Result < IndexedTxGraph < ConfirmationBlockTime , KeychainTxOutIndex < KeychainKind > > , DescriptorError >
28402881{
2841- let ( indexed_graph, changeset ) = IndexedTxGraph :: from_changeset (
2882+ let ( indexed_graph, reindex_changeset ) = IndexedTxGraph :: from_changeset (
28422883 chain:: indexed_tx_graph:: ChangeSet {
28432884 tx_graph : tx_graph_changeset,
28442885 indexer : indexer_changeset,
28452886 } ,
2846- |idx_cs| -> Result < KeychainTxOutIndex < KeychainKind > , DescriptorError > {
2847- let mut idx = KeychainTxOutIndex :: from_changeset ( lookahead, use_spk_cache, idx_cs) ;
2848-
2849- let descriptor_inserted = idx
2850- . insert_descriptor ( KeychainKind :: External , descriptor)
2851- . expect ( "already checked to be a unique, wildcard, non-multipath descriptor" ) ;
2852- assert ! (
2853- descriptor_inserted,
2854- "this must be the first time we are seeing this descriptor"
2855- ) ;
2856-
2857- let change_descriptor = match change_descriptor {
2858- Some ( change_descriptor) => change_descriptor,
2859- None => return Ok ( idx) ,
2860- } ;
2861-
2862- let change_descriptor_inserted = idx
2863- . insert_descriptor ( KeychainKind :: Internal , change_descriptor)
2864- . map_err ( |e| {
2865- use bdk_chain:: indexer:: keychain_txout:: InsertDescriptorError ;
2866- match e {
2867- InsertDescriptorError :: DescriptorAlreadyAssigned { .. } => {
2868- crate :: descriptor:: error:: Error :: ExternalAndInternalAreTheSame
2869- }
2870- InsertDescriptorError :: KeychainAlreadyAssigned { .. } => {
2871- unreachable ! ( "this is the first time we're assigning internal" )
2872- }
2873- }
2874- } ) ?;
2875- assert ! (
2876- change_descriptor_inserted,
2877- "this must be the first time we are seeing this descriptor"
2878- ) ;
2879-
2880- Ok ( idx)
2887+ |idx_cs| {
2888+ make_keychain_index (
2889+ idx_cs,
2890+ descriptor,
2891+ change_descriptor,
2892+ lookahead,
2893+ use_spk_cache,
2894+ )
28812895 } ,
28822896 ) ?;
2883- stage. tx_graph . merge ( changeset. tx_graph ) ;
2884- stage. indexer . merge ( changeset. indexer ) ;
2897+ debug_assert ! (
2898+ reindex_changeset. is_empty( ) ,
2899+ "loading a wallet should not stage new changes"
2900+ ) ;
28852901 Ok ( indexed_graph)
28862902}
28872903
0 commit comments