@@ -4147,7 +4147,6 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4147
4147
let mut expected_amt_msat = None ;
4148
4148
let mut valid_mpp = true ;
4149
4149
let mut errs = Vec :: new ( ) ;
4150
- let mut claimed_any_htlcs = false ;
4151
4150
let mut channel_state_lock = self . channel_state . lock ( ) . unwrap ( ) ;
4152
4151
let channel_state = & mut * channel_state_lock;
4153
4152
for htlc in sources. iter ( ) {
@@ -4197,13 +4196,14 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4197
4196
}
4198
4197
if valid_mpp {
4199
4198
for htlc in sources. drain ( ..) {
4200
- match self . claim_funds_from_hop ( & mut channel_state_lock, htlc. prev_hop , payment_preimage) {
4199
+ match self . claim_funds_from_hop ( & mut channel_state_lock, htlc. prev_hop , payment_preimage,
4200
+ |_| Some ( MonitorUpdateCompletionAction :: PaymentClaimed { payment_hash } ) )
4201
+ {
4201
4202
ClaimFundsFromHop :: MonitorUpdateFail ( pk, err, _) => {
4202
4203
if let msgs:: ErrorAction :: IgnoreError = err. err . action {
4203
4204
// We got a temporary failure updating monitor, but will claim the
4204
4205
// HTLC when the monitor updating is restored (or on chain).
4205
4206
log_error ! ( self . logger, "Temporary failure claiming HTLC, treating as success: {}" , err. err. err) ;
4206
- claimed_any_htlcs = true ;
4207
4207
} else { errs. push ( ( pk, err) ) ; }
4208
4208
} ,
4209
4209
ClaimFundsFromHop :: PrevHopForceClosed => unreachable ! ( "We already checked for channel existence, we can't fail here!" ) ,
@@ -4213,7 +4213,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4213
4213
// available to be claimed. Thus, it does not make sense to set
4214
4214
// `claimed_any_htlcs`.
4215
4215
} ,
4216
- ClaimFundsFromHop :: Success ( _) => claimed_any_htlcs = true ,
4216
+ ClaimFundsFromHop :: Success ( _) => { } ,
4217
4217
}
4218
4218
}
4219
4219
}
@@ -4230,22 +4230,17 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4230
4230
}
4231
4231
}
4232
4232
4233
- let PendingClaimingPayment { amount_msat, payment_purpose : purpose, receiver_node_id } =
4234
- self . pending_claimed_payments . lock ( ) . unwrap ( ) . remove ( & payment_hash) . unwrap ( ) ;
4235
- if claimed_any_htlcs {
4236
- self . pending_events . lock ( ) . unwrap ( ) . push ( events:: Event :: PaymentClaimed {
4237
- payment_hash, purpose, amount_msat, receiver_node_id : Some ( receiver_node_id) ,
4238
- } ) ;
4239
- }
4240
-
4241
4233
// Now we can handle any errors which were generated.
4242
4234
for ( counterparty_node_id, err) in errs. drain ( ..) {
4243
4235
let res: Result < ( ) , _ > = Err ( err) ;
4244
4236
let _ = handle_error ! ( self , res, counterparty_node_id) ;
4245
4237
}
4246
4238
}
4247
4239
4248
- fn claim_funds_from_hop ( & self , channel_state_lock : & mut MutexGuard < ChannelHolder < <K :: Target as KeysInterface >:: Signer > > , prev_hop : HTLCPreviousHopData , payment_preimage : PaymentPreimage ) -> ClaimFundsFromHop {
4240
+ fn claim_funds_from_hop < ComplFunc : FnOnce ( Option < u64 > ) -> Option < MonitorUpdateCompletionAction > > ( & self ,
4241
+ channel_state_lock : & mut MutexGuard < ChannelHolder < <K :: Target as KeysInterface >:: Signer > > ,
4242
+ prev_hop : HTLCPreviousHopData , payment_preimage : PaymentPreimage , completion_action : ComplFunc )
4243
+ -> ClaimFundsFromHop {
4249
4244
//TODO: Delay the claimed_funds relaying just like we do outbound relay!
4250
4245
4251
4246
let chan_id = prev_hop. outpoint . to_channel_id ( ) ;
@@ -4260,6 +4255,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4260
4255
log_given_level ! ( self . logger, if e == ChannelMonitorUpdateStatus :: PermanentFailure { Level :: Error } else { Level :: Debug } ,
4261
4256
"Failed to update channel monitor with preimage {:?}: {:?}" ,
4262
4257
payment_preimage, e) ;
4258
+ self . handle_monitor_update_completion_actions ( completion_action ( Some ( htlc_value_msat) ) ) ;
4263
4259
return ClaimFundsFromHop :: MonitorUpdateFail (
4264
4260
chan. get ( ) . get_counterparty_node_id ( ) ,
4265
4261
handle_monitor_update_res ! ( self , e, chan, RAACommitmentOrder :: CommitmentFirst , false , msgs. is_some( ) ) . unwrap_err ( ) ,
@@ -4282,6 +4278,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4282
4278
}
4283
4279
} ) ;
4284
4280
}
4281
+ self . handle_monitor_update_completion_actions ( completion_action ( Some ( htlc_value_msat) ) ) ;
4285
4282
return ClaimFundsFromHop :: Success ( htlc_value_msat) ;
4286
4283
} else {
4287
4284
return ClaimFundsFromHop :: DuplicateClaim ;
@@ -4301,10 +4298,14 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4301
4298
if drop {
4302
4299
chan. remove_entry ( ) ;
4303
4300
}
4301
+ self . handle_monitor_update_completion_actions ( completion_action ( None ) ) ;
4304
4302
return ClaimFundsFromHop :: MonitorUpdateFail ( counterparty_node_id, res, None ) ;
4305
4303
} ,
4306
4304
}
4307
- } else { return ClaimFundsFromHop :: PrevHopForceClosed }
4305
+ } else {
4306
+ self . handle_monitor_update_completion_actions ( completion_action ( None ) ) ;
4307
+ return ClaimFundsFromHop :: PrevHopForceClosed
4308
+ }
4308
4309
}
4309
4310
4310
4311
fn finalize_claims ( & self , mut sources : Vec < HTLCSource > ) {
@@ -4377,13 +4378,24 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4377
4378
} ,
4378
4379
HTLCSource :: PreviousHopData ( hop_data) => {
4379
4380
let prev_outpoint = hop_data. outpoint ;
4380
- let res = self . claim_funds_from_hop ( & mut channel_state_lock, hop_data, payment_preimage) ;
4381
- let claimed_htlc = if let ClaimFundsFromHop :: DuplicateClaim = res { false } else { true } ;
4382
- let htlc_claim_value_msat = match res {
4383
- ClaimFundsFromHop :: MonitorUpdateFail ( _, _, amt_opt) => amt_opt,
4384
- ClaimFundsFromHop :: Success ( amt) => Some ( amt) ,
4385
- _ => None ,
4386
- } ;
4381
+ let res = self . claim_funds_from_hop ( & mut channel_state_lock, hop_data, payment_preimage,
4382
+ |htlc_claim_value_msat| {
4383
+ if let Some ( forwarded_htlc_value) = forwarded_htlc_value_msat {
4384
+ let fee_earned_msat = if let Some ( claimed_htlc_value) = htlc_claim_value_msat {
4385
+ Some ( claimed_htlc_value - forwarded_htlc_value)
4386
+ } else { None } ;
4387
+
4388
+ let prev_channel_id = Some ( prev_outpoint. to_channel_id ( ) ) ;
4389
+ let next_channel_id = Some ( next_channel_id) ;
4390
+
4391
+ Some ( MonitorUpdateCompletionAction :: SurfaceEvent { event : events:: Event :: PaymentForwarded {
4392
+ fee_earned_msat,
4393
+ claim_from_onchain_tx : from_onchain,
4394
+ prev_channel_id,
4395
+ next_channel_id,
4396
+ } } )
4397
+ } else { None }
4398
+ } ) ;
4387
4399
if let ClaimFundsFromHop :: PrevHopForceClosed = res {
4388
4400
let preimage_update = ChannelMonitorUpdate {
4389
4401
update_id : CLOSED_CHANNEL_UPDATE_ID ,
@@ -4414,25 +4426,6 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4414
4426
let result: Result < ( ) , _ > = Err ( err) ;
4415
4427
let _ = handle_error ! ( self , result, pk) ;
4416
4428
}
4417
-
4418
- if claimed_htlc {
4419
- if let Some ( forwarded_htlc_value) = forwarded_htlc_value_msat {
4420
- let fee_earned_msat = if let Some ( claimed_htlc_value) = htlc_claim_value_msat {
4421
- Some ( claimed_htlc_value - forwarded_htlc_value)
4422
- } else { None } ;
4423
-
4424
- let mut pending_events = self . pending_events . lock ( ) . unwrap ( ) ;
4425
- let prev_channel_id = Some ( prev_outpoint. to_channel_id ( ) ) ;
4426
- let next_channel_id = Some ( next_channel_id) ;
4427
-
4428
- pending_events. push ( events:: Event :: PaymentForwarded {
4429
- fee_earned_msat,
4430
- claim_from_onchain_tx : from_onchain,
4431
- prev_channel_id,
4432
- next_channel_id,
4433
- } ) ;
4434
- }
4435
- }
4436
4429
} ,
4437
4430
}
4438
4431
}
0 commit comments