@@ -6,8 +6,8 @@ use std::{
66
77use  bdk_chain:: { 
88    bitcoin:: { Address ,  Network ,  OutPoint ,  ScriptBuf ,  Txid } , 
9-     indexed_tx_graph:: { IndexedAdditions ,  IndexedTxGraph } , 
10-     keychain:: LocalChangeSet , 
9+     indexed_tx_graph:: { self ,  IndexedTxGraph } , 
10+     keychain:: WalletChangeSet , 
1111    local_chain:: { CheckPoint ,  LocalChain } , 
1212    Append ,  ConfirmationTimeAnchor , 
1313} ; 
@@ -62,20 +62,20 @@ pub struct ScanOptions {
6262fn  main ( )  -> anyhow:: Result < ( ) >  { 
6363    let  ( args,  keymap,  index,  db,  init_changeset)  = example_cli:: init :: < 
6464        EsploraCommands , 
65-         LocalChangeSet < Keychain ,  ConfirmationTimeAnchor > , 
65+         WalletChangeSet < Keychain ,  ConfirmationTimeAnchor > , 
6666    > ( DB_MAGIC ,  DB_PATH ) ?; 
6767
6868    // Contruct `IndexedTxGraph` and `LocalChain` with our initial changeset. They are wrapped in 
6969    // `Mutex` to display how they can be used in a multithreaded context. Technically the mutexes 
7070    // aren't strictly needed here. 
7171    let  graph = Mutex :: new ( { 
7272        let  mut  graph = IndexedTxGraph :: new ( index) ; 
73-         graph. apply_additions ( init_changeset. indexed_additions ) ; 
73+         graph. apply_changeset ( init_changeset. index_tx_graph ) ; 
7474        graph
7575    } ) ; 
7676    let  chain = Mutex :: new ( { 
7777        let  mut  chain = LocalChain :: default ( ) ; 
78-         chain. apply_changeset ( & init_changeset. chain_changeset ) ; 
78+         chain. apply_changeset ( & init_changeset. chain ) ; 
7979        chain
8080    } ) ; 
8181
@@ -84,7 +84,7 @@ fn main() -> anyhow::Result<()> {
8484        Network :: Testnet  => "https://blockstream.info/testnet/api" , 
8585        Network :: Regtest  => "http://localhost:3002" , 
8686        Network :: Signet  => "https://mempool.space/signet/api" , 
87-         _ => panic ! ( "unsuported  network" ) , 
87+         _ => panic ! ( "unsupported  network" ) , 
8888    } ; 
8989
9090    let  client = esplora_client:: Builder :: new ( esplora_url) . build_blocking ( ) ?; 
@@ -116,7 +116,7 @@ fn main() -> anyhow::Result<()> {
116116
117117    // This is where we will accumulate changes of `IndexedTxGraph` and `LocalChain` and persist 
118118    // these changes as a batch at the end. 
119-     let  mut  changeset = LocalChangeSet :: < Keychain ,  ConfirmationTimeAnchor > :: default ( ) ; 
119+     let  mut  changeset = WalletChangeSet :: < Keychain ,  ConfirmationTimeAnchor > :: default ( ) ; 
120120
121121    // Prepare the `IndexedTxGraph` update based on whether we are scanning or syncing. 
122122    // Scanning: We are iterating through spks of all keychains and scanning for transactions for 
@@ -135,7 +135,7 @@ fn main() -> anyhow::Result<()> {
135135                . index 
136136                . spks_of_all_keychains ( ) 
137137                . into_iter ( ) 
138-                 // This `map` is purely for printing to stdout . 
138+                 // This `map` is purely for logging . 
139139                . map ( |( keychain,  iter) | { 
140140                    let  mut  first = true ; 
141141                    let  spk_iter = iter. inspect ( move  |( i,  _) | { 
@@ -145,7 +145,7 @@ fn main() -> anyhow::Result<()> {
145145                        } 
146146                        eprint ! ( "{} " ,  i) ; 
147147                        // Flush early to ensure we print at every iteration. 
148-                         let  _ = io:: stdout ( ) . flush ( ) ; 
148+                         let  _ = io:: stderr ( ) . flush ( ) ; 
149149                    } ) ; 
150150                    ( keychain,  spk_iter) 
151151                } ) 
@@ -173,7 +173,7 @@ fn main() -> anyhow::Result<()> {
173173                    . expect ( "mutex must not be poisoned" ) 
174174                    . index 
175175                    . reveal_to_target_multi ( & keychain_indices_update) ; 
176-                 LocalChangeSet :: from ( IndexedAdditions :: from ( index_additions) ) 
176+                 WalletChangeSet :: from ( indexed_tx_graph :: ChangeSet :: from ( index_additions) ) 
177177            } ) ; 
178178
179179            graph_update
@@ -217,6 +217,8 @@ fn main() -> anyhow::Result<()> {
217217                        . collect :: < Vec < _ > > ( ) ; 
218218                    spks = Box :: new ( spks. chain ( all_spks. into_iter ( ) . map ( |( index,  script) | { 
219219                        eprintln ! ( "scanning {:?}" ,  index) ; 
220+                         // Flush early to ensure we print at every iteration. 
221+                         let  _ = io:: stderr ( ) . flush ( ) ; 
220222                        script
221223                    } ) ) ) ; 
222224                } 
@@ -232,6 +234,8 @@ fn main() -> anyhow::Result<()> {
232234                            Address :: from_script( & script,  args. network) . unwrap( ) , 
233235                            index
234236                        ) ; 
237+                         // Flush early to ensure we print at every iteration. 
238+                         let  _ = io:: stderr ( ) . flush ( ) ; 
235239                        script
236240                    } ) ) ) ; 
237241                } 
@@ -253,6 +257,8 @@ fn main() -> anyhow::Result<()> {
253257                                    "Checking if outpoint {} (value: {}) has been spent" , 
254258                                    utxo. outpoint,  utxo. txout. value
255259                                ) ; 
260+                                 // Flush early to ensure we print at every iteration. 
261+                                 let  _ = io:: stderr ( ) . flush ( ) ; 
256262                            } ) 
257263                            . map ( |utxo| utxo. outpoint ) , 
258264                    ) ; 
@@ -264,11 +270,13 @@ fn main() -> anyhow::Result<()> {
264270                    let  unconfirmed_txids = graph
265271                        . graph ( ) 
266272                        . list_chain_txs ( & * chain,  chain_tip) 
267-                         . filter ( |canonical_tx| !canonical_tx. observed_as . is_confirmed ( ) ) 
268-                         . map ( |canonical_tx| canonical_tx. node . txid ) 
273+                         . filter ( |canonical_tx| !canonical_tx. chain_position . is_confirmed ( ) ) 
274+                         . map ( |canonical_tx| canonical_tx. tx_node . txid ) 
269275                        . collect :: < Vec < Txid > > ( ) ; 
270276                    txids = Box :: new ( unconfirmed_txids. into_iter ( ) . inspect ( |txid| { 
271277                        eprintln ! ( "Checking if {} is confirmed yet" ,  txid) ; 
278+                         // Flush early to ensure we print at every iteration. 
279+                         let  _ = io:: stderr ( ) . flush ( ) ; 
272280                    } ) ) ; 
273281                } 
274282            } 
@@ -284,15 +292,29 @@ fn main() -> anyhow::Result<()> {
284292
285293    println ! ( ) ; 
286294
287-     // Up to this point, we have only created a `TxGraph` update, but not an update for our 
288-     // `ChainOracle` implementation (`LocalChain`). The `TxGraph` update may contain chain anchors, 
289-     // so we need the corresponding blocks to exist in our `LocalChain`. Here, we find the heights 
290-     // of missing blocks in `LocalChain`. 
291-     // 
292-     // Getting the local chain tip is only for printing to stdout. 
295+     // We apply the `TxGraph` update, and append the resultant changes to `changeset` 
296+     // (for persistance) 
297+     changeset. append ( { 
298+         let  indexed_graph_additions = graph. lock ( ) . unwrap ( ) . apply_update ( graph_update) ; 
299+         WalletChangeSet :: from ( indexed_graph_additions) 
300+     } ) ; 
301+ 
302+     // Now that we're done updating the `TxGraph`, it's time to update the `LocalChain`! 
303+     // We want the `LocalChain` to have data about all the anchors in the `TxGraph` - for this 
304+     // reason, we want retrieve the heights of the newly added anchors, and fetch the corresponding 
305+     // blocks. 
306+ 
307+     // We get the heights of all the anchors introduced by the changeset, and the local chain tip. 
308+     // Note that the latter is only used for logging. 
293309    let  ( missing_block_heights,  tip)  = { 
294310        let  chain = & * chain. lock ( ) . unwrap ( ) ; 
295-         let  heights_to_fetch = graph_update. missing_heights ( chain) . collect :: < Vec < _ > > ( ) ; 
311+         let  heights_to_fetch = changeset
312+             . index_tx_graph 
313+             . graph 
314+             . anchors 
315+             . iter ( ) 
316+             . map ( |( a,  _) | a. confirmation_height ) 
317+             . collect :: < Vec < _ > > ( ) ; 
296318        let  tip = chain. tip ( ) ; 
297319        ( heights_to_fetch,  tip) 
298320    } ; 
@@ -307,15 +329,11 @@ fn main() -> anyhow::Result<()> {
307329
308330    println ! ( "new tip: {}" ,  chain_update. tip. height( ) ) ; 
309331
310-     // We apply the `LocalChain` and `TxGraph` updates , and append the resultant changes to 
311-     // `changeset`  (for persistance). 
332+     // We apply the `LocalChain` update , and append the resultant changes to `changeset`  
333+     // (for persistance). 
312334    changeset. append ( { 
313335        let  chain_additions = chain. lock ( ) . unwrap ( ) . apply_update ( chain_update) ?; 
314-         LocalChangeSet :: from ( chain_additions) 
315-     } ) ; 
316-     changeset. append ( { 
317-         let  indexed_graph_additions = graph. lock ( ) . unwrap ( ) . apply_update ( graph_update) ; 
318-         LocalChangeSet :: from ( indexed_graph_additions) 
336+         WalletChangeSet :: from ( chain_additions) 
319337    } ) ; 
320338
321339    // We persist `changeset`. 
0 commit comments