@@ -395,6 +395,23 @@ where C::Target: chain::Filter,
395
395
self . monitors . read ( ) . unwrap ( ) . keys ( ) . map ( |outpoint| * outpoint) . collect ( )
396
396
}
397
397
398
+ #[ cfg( not( c_bindings) ) ]
399
+ /// Lists the pending updates for each [`ChannelMonitor`] (by `OutPoint` being monitored).
400
+ pub fn list_pending_monitor_updates ( & self ) -> HashMap < OutPoint , Vec < MonitorUpdateId > > {
401
+ self . monitors . read ( ) . unwrap ( ) . iter ( ) . map ( |( outpoint, holder) | {
402
+ ( * outpoint, holder. pending_monitor_updates . lock ( ) . unwrap ( ) . clone ( ) )
403
+ } ) . collect ( )
404
+ }
405
+
406
+ #[ cfg( c_bindings) ]
407
+ /// Lists the pending updates for each [`ChannelMonitor`] (by `OutPoint` being monitored).
408
+ pub fn list_pending_monitor_updates ( & self ) -> Vec < ( OutPoint , Vec < MonitorUpdateId > ) > {
409
+ self . monitors . read ( ) . unwrap ( ) . iter ( ) . map ( |( outpoint, holder) | {
410
+ ( * outpoint, holder. pending_monitor_updates . lock ( ) . unwrap ( ) . clone ( ) )
411
+ } ) . collect ( )
412
+ }
413
+
414
+
398
415
#[ cfg( test) ]
399
416
pub fn remove_monitor ( & self , funding_txo : & OutPoint ) -> ChannelMonitor < ChannelSigner > {
400
417
self . monitors . write ( ) . unwrap ( ) . remove ( funding_txo) . unwrap ( ) . monitor
@@ -798,7 +815,22 @@ mod tests {
798
815
// Note that updates is a HashMap so the ordering here is actually random. This shouldn't
799
816
// fail either way but if it fails intermittently it's depending on the ordering of updates.
800
817
let mut update_iter = updates. iter ( ) ;
801
- nodes[ 1 ] . chain_monitor . chain_monitor . channel_monitor_updated ( * funding_txo, update_iter. next ( ) . unwrap ( ) . clone ( ) ) . unwrap ( ) ;
818
+ let next_update = update_iter. next ( ) . unwrap ( ) . clone ( ) ;
819
+ // Should contain next_update when pending updates listed.
820
+ #[ cfg( not( c_bindings) ) ]
821
+ assert ! ( nodes[ 1 ] . chain_monitor. chain_monitor. list_pending_monitor_updates( ) . get( funding_txo)
822
+ . unwrap( ) . contains( & next_update) ) ;
823
+ #[ cfg( c_bindings) ]
824
+ assert ! ( nodes[ 1 ] . chain_monitor. chain_monitor. list_pending_monitor_updates( ) . iter( )
825
+ . find( |( txo, _) | txo == funding_txo) . unwrap( ) . 1 . contains( & next_update) ) ;
826
+ nodes[ 1 ] . chain_monitor . chain_monitor . channel_monitor_updated ( * funding_txo, next_update. clone ( ) ) . unwrap ( ) ;
827
+ // Should not contain the previously pending next_update when pending updates listed.
828
+ #[ cfg( not( c_bindings) ) ]
829
+ assert ! ( !nodes[ 1 ] . chain_monitor. chain_monitor. list_pending_monitor_updates( ) . get( funding_txo)
830
+ . unwrap( ) . contains( & next_update) ) ;
831
+ #[ cfg( c_bindings) ]
832
+ assert ! ( !nodes[ 1 ] . chain_monitor. chain_monitor. list_pending_monitor_updates( ) . iter( )
833
+ . find( |( txo, _) | txo == funding_txo) . unwrap( ) . 1 . contains( & next_update) ) ;
802
834
assert ! ( nodes[ 1 ] . chain_monitor. release_pending_monitor_events( ) . is_empty( ) ) ;
803
835
assert ! ( nodes[ 1 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
804
836
nodes[ 1 ] . chain_monitor . chain_monitor . channel_monitor_updated ( * funding_txo, update_iter. next ( ) . unwrap ( ) . clone ( ) ) . unwrap ( ) ;
0 commit comments