@@ -93,10 +93,13 @@ where C::Target: chain::Filter,
93
93
/// [`chain::Watch::release_pending_monitor_events`]: ../trait.Watch.html#tymethod.release_pending_monitor_events
94
94
/// [`chain::Filter`]: ../trait.Filter.html
95
95
pub fn block_connected ( & self , header : & BlockHeader , txdata : & TransactionData , height : u32 ) {
96
+ let mut dependent_txdata = Vec :: new ( ) ;
96
97
let monitors = self . monitors . read ( ) . unwrap ( ) ;
97
98
for monitor in monitors. values ( ) {
98
99
let mut txn_outputs = monitor. block_connected ( header, txdata, height, & * self . broadcaster , & * self . fee_estimator , & * self . logger ) ;
99
100
101
+ // Register any new outputs with the chain source for filtering, storing any dependent
102
+ // transactions from within the block that previously had not been included in txdata.
100
103
if let Some ( ref chain_source) = self . chain_source {
101
104
let block_hash = header. block_hash ( ) ;
102
105
for ( txid, outputs) in txn_outputs. drain ( ..) {
@@ -109,13 +112,21 @@ where C::Target: chain::Filter,
109
112
outpoint : OutPoint { txid, index : * idx as u16 } ,
110
113
script_pubkey : output. script_pubkey . clone ( ) ,
111
114
} ;
112
- if let Some ( ( index , tx ) ) = chain_source. register_output ( output) {
113
- self . block_connected ( header , & [ ( index , & tx ) ] , height ) ;
115
+ if let Some ( tx ) = chain_source. register_output ( output) {
116
+ dependent_txdata . push ( tx ) ;
114
117
}
115
118
}
116
119
}
117
120
}
118
121
}
122
+
123
+ // Recursively call for any dependent transactions that were identified by the chain source.
124
+ if !dependent_txdata. is_empty ( ) {
125
+ dependent_txdata. sort_unstable_by_key ( |( index, _tx) | * index) ;
126
+ dependent_txdata. dedup_by_key ( |( index, _tx) | * index) ;
127
+ let txdata: Vec < _ > = dependent_txdata. iter ( ) . map ( |( index, tx) | ( * index, tx) ) . collect ( ) ;
128
+ self . block_connected ( header, & txdata, height) ;
129
+ }
119
130
}
120
131
121
132
/// Dispatches to per-channel monitors, which are responsible for updating their on-chain view
0 commit comments