@@ -3958,7 +3958,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
39583958 }
39593959 }
39603960
3961- fn claim_funds_internal ( & self , mut channel_state_lock : MutexGuard < ChannelHolder < Signer > > , source : HTLCSource , payment_preimage : PaymentPreimage , forwarded_htlc_value_msat : Option < u64 > , from_onchain : bool ) {
3961+ fn claim_funds_internal ( & self , mut channel_state_lock : MutexGuard < ChannelHolder < Signer > > , source : HTLCSource , payment_preimage : PaymentPreimage , forwarded_htlc_value_msat : Option < u64 > , from_onchain : bool , next_channel_id : [ u8 ; 32 ] ) {
39623962 match source {
39633963 HTLCSource :: OutboundRoute { session_priv, payment_id, path, .. } => {
39643964 mem:: drop ( channel_state_lock) ;
@@ -4049,12 +4049,14 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
40494049 } else { None } ;
40504050
40514051 let mut pending_events = self . pending_events . lock ( ) . unwrap ( ) ;
4052+ let prev_channel_id = Some ( prev_outpoint. to_channel_id ( ) ) ;
4053+ let next_channel_id = Some ( next_channel_id) ;
40524054
4053- let source_channel_id = Some ( prev_outpoint. to_channel_id ( ) ) ;
40544055 pending_events. push ( events:: Event :: PaymentForwarded {
4055- source_channel_id,
40564056 fee_earned_msat,
40574057 claim_from_onchain_tx : from_onchain,
4058+ prev_channel_id,
4059+ next_channel_id,
40584060 } ) ;
40594061 }
40604062 }
@@ -4507,7 +4509,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
45074509 hash_map:: Entry :: Vacant ( _) => return Err ( MsgHandleErrInternal :: send_err_msg_no_close ( "Failed to find corresponding channel" . to_owned ( ) , msg. channel_id ) )
45084510 }
45094511 } ;
4510- self . claim_funds_internal ( channel_lock, htlc_source, msg. payment_preimage . clone ( ) , Some ( forwarded_htlc_value) , false ) ;
4512+ self . claim_funds_internal ( channel_lock, htlc_source, msg. payment_preimage . clone ( ) , Some ( forwarded_htlc_value) , false , msg . channel_id ) ;
45114513 Ok ( ( ) )
45124514 }
45134515
@@ -4827,48 +4829,50 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
48274829 let mut failed_channels = Vec :: new ( ) ;
48284830 let mut pending_monitor_events = self . chain_monitor . release_pending_monitor_events ( ) ;
48294831 let has_pending_monitor_events = !pending_monitor_events. is_empty ( ) ;
4830- for monitor_event in pending_monitor_events. drain ( ..) {
4831- match monitor_event {
4832- MonitorEvent :: HTLCEvent ( htlc_update) => {
4833- if let Some ( preimage) = htlc_update. payment_preimage {
4834- log_trace ! ( self . logger, "Claiming HTLC with preimage {} from our monitor" , log_bytes!( preimage. 0 ) ) ;
4835- self . claim_funds_internal ( self . channel_state . lock ( ) . unwrap ( ) , htlc_update. source , preimage, htlc_update. onchain_value_satoshis . map ( |v| v * 1000 ) , true ) ;
4836- } else {
4837- log_trace ! ( self . logger, "Failing HTLC with hash {} from our monitor" , log_bytes!( htlc_update. payment_hash. 0 ) ) ;
4838- self . fail_htlc_backwards_internal ( self . channel_state . lock ( ) . unwrap ( ) , htlc_update. source , & htlc_update. payment_hash , HTLCFailReason :: Reason { failure_code : 0x4000 | 8 , data : Vec :: new ( ) } ) ;
4839- }
4840- } ,
4841- MonitorEvent :: CommitmentTxConfirmed ( funding_outpoint) |
4842- MonitorEvent :: UpdateFailed ( funding_outpoint) => {
4843- let mut channel_lock = self . channel_state . lock ( ) . unwrap ( ) ;
4844- let channel_state = & mut * channel_lock;
4845- let by_id = & mut channel_state. by_id ;
4846- let pending_msg_events = & mut channel_state. pending_msg_events ;
4847- if let hash_map:: Entry :: Occupied ( chan_entry) = by_id. entry ( funding_outpoint. to_channel_id ( ) ) {
4848- let mut chan = remove_channel ! ( self , channel_state, chan_entry) ;
4849- failed_channels. push ( chan. force_shutdown ( false ) ) ;
4850- if let Ok ( update) = self . get_channel_update_for_broadcast ( & chan) {
4851- pending_msg_events. push ( events:: MessageSendEvent :: BroadcastChannelUpdate {
4852- msg : update
4832+ for ( funding_outpoint, mut monitor_events) in pending_monitor_events. drain ( ..) {
4833+ for monitor_event in monitor_events. drain ( ..) {
4834+ match monitor_event {
4835+ MonitorEvent :: HTLCEvent ( htlc_update) => {
4836+ if let Some ( preimage) = htlc_update. payment_preimage {
4837+ log_trace ! ( self . logger, "Claiming HTLC with preimage {} from our monitor" , log_bytes!( preimage. 0 ) ) ;
4838+ self . claim_funds_internal ( self . channel_state . lock ( ) . unwrap ( ) , htlc_update. source , preimage, htlc_update. onchain_value_satoshis . map ( |v| v * 1000 ) , true , funding_outpoint. to_channel_id ( ) ) ;
4839+ } else {
4840+ log_trace ! ( self . logger, "Failing HTLC with hash {} from our monitor" , log_bytes!( htlc_update. payment_hash. 0 ) ) ;
4841+ self . fail_htlc_backwards_internal ( self . channel_state . lock ( ) . unwrap ( ) , htlc_update. source , & htlc_update. payment_hash , HTLCFailReason :: Reason { failure_code : 0x4000 | 8 , data : Vec :: new ( ) } ) ;
4842+ }
4843+ } ,
4844+ MonitorEvent :: CommitmentTxConfirmed ( funding_outpoint) |
4845+ MonitorEvent :: UpdateFailed ( funding_outpoint) => {
4846+ let mut channel_lock = self . channel_state . lock ( ) . unwrap ( ) ;
4847+ let channel_state = & mut * channel_lock;
4848+ let by_id = & mut channel_state. by_id ;
4849+ let pending_msg_events = & mut channel_state. pending_msg_events ;
4850+ if let hash_map:: Entry :: Occupied ( chan_entry) = by_id. entry ( funding_outpoint. to_channel_id ( ) ) {
4851+ let mut chan = remove_channel ! ( self , channel_state, chan_entry) ;
4852+ failed_channels. push ( chan. force_shutdown ( false ) ) ;
4853+ if let Ok ( update) = self . get_channel_update_for_broadcast ( & chan) {
4854+ pending_msg_events. push ( events:: MessageSendEvent :: BroadcastChannelUpdate {
4855+ msg : update
4856+ } ) ;
4857+ }
4858+ let reason = if let MonitorEvent :: UpdateFailed ( _) = monitor_event {
4859+ ClosureReason :: ProcessingError { err : "Failed to persist ChannelMonitor update during chain sync" . to_string ( ) }
4860+ } else {
4861+ ClosureReason :: CommitmentTxConfirmed
4862+ } ;
4863+ self . issue_channel_close_events ( & chan, reason) ;
4864+ pending_msg_events. push ( events:: MessageSendEvent :: HandleError {
4865+ node_id : chan. get_counterparty_node_id ( ) ,
4866+ action : msgs:: ErrorAction :: SendErrorMessage {
4867+ msg : msgs:: ErrorMessage { channel_id : chan. channel_id ( ) , data : "Channel force-closed" . to_owned ( ) }
4868+ } ,
48534869 } ) ;
48544870 }
4855- let reason = if let MonitorEvent :: UpdateFailed ( _) = monitor_event {
4856- ClosureReason :: ProcessingError { err : "Failed to persist ChannelMonitor update during chain sync" . to_string ( ) }
4857- } else {
4858- ClosureReason :: CommitmentTxConfirmed
4859- } ;
4860- self . issue_channel_close_events ( & chan, reason) ;
4861- pending_msg_events. push ( events:: MessageSendEvent :: HandleError {
4862- node_id : chan. get_counterparty_node_id ( ) ,
4863- action : msgs:: ErrorAction :: SendErrorMessage {
4864- msg : msgs:: ErrorMessage { channel_id : chan. channel_id ( ) , data : "Channel force-closed" . to_owned ( ) }
4865- } ,
4866- } ) ;
4867- }
4868- } ,
4869- MonitorEvent :: UpdateCompleted { funding_txo, monitor_update_id } => {
4870- self . channel_monitor_updated ( & funding_txo, monitor_update_id) ;
4871- } ,
4871+ } ,
4872+ MonitorEvent :: UpdateCompleted { funding_txo, monitor_update_id } => {
4873+ self . channel_monitor_updated ( & funding_txo, monitor_update_id) ;
4874+ } ,
4875+ }
48724876 }
48734877 }
48744878
0 commit comments