@@ -4287,7 +4287,6 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4287
4287
let mut expected_amt_msat = None ;
4288
4288
let mut valid_mpp = true ;
4289
4289
let mut errs = Vec :: new ( ) ;
4290
- let mut claimed_any_htlcs = false ;
4291
4290
let mut channel_state_lock = self . channel_state . lock ( ) . unwrap ( ) ;
4292
4291
let channel_state = & mut * channel_state_lock;
4293
4292
for htlc in sources. iter ( ) {
@@ -4337,13 +4336,14 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4337
4336
}
4338
4337
if valid_mpp {
4339
4338
for htlc in sources. drain ( ..) {
4340
- match self . claim_funds_from_hop ( & mut channel_state_lock, htlc. prev_hop , payment_preimage) {
4339
+ match self . claim_funds_from_hop ( & mut channel_state_lock, htlc. prev_hop , payment_preimage,
4340
+ |_| Some ( MonitorUpdateCompletionAction :: PaymentClaimed { payment_hash } ) )
4341
+ {
4341
4342
ClaimFundsFromHop :: MonitorUpdateFail ( pk, err, _) => {
4342
4343
if let msgs:: ErrorAction :: IgnoreError = err. err . action {
4343
4344
// We got a temporary failure updating monitor, but will claim the
4344
4345
// HTLC when the monitor updating is restored (or on chain).
4345
4346
log_error ! ( self . logger, "Temporary failure claiming HTLC, treating as success: {}" , err. err. err) ;
4346
- claimed_any_htlcs = true ;
4347
4347
} else { errs. push ( ( pk, err) ) ; }
4348
4348
} ,
4349
4349
ClaimFundsFromHop :: PrevHopForceClosed => unreachable ! ( "We already checked for channel existence, we can't fail here!" ) ,
@@ -4353,7 +4353,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4353
4353
// available to be claimed. Thus, it does not make sense to set
4354
4354
// `claimed_any_htlcs`.
4355
4355
} ,
4356
- ClaimFundsFromHop :: Success ( _) => claimed_any_htlcs = true ,
4356
+ ClaimFundsFromHop :: Success ( _) => { } ,
4357
4357
}
4358
4358
}
4359
4359
}
@@ -4370,22 +4370,17 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4370
4370
}
4371
4371
}
4372
4372
4373
- let PendingClaimingPayment { amount_msat, payment_purpose : purpose, receiver_node_id } =
4374
- self . pending_claimed_payments . lock ( ) . unwrap ( ) . remove ( & payment_hash) . unwrap ( ) ;
4375
- if claimed_any_htlcs {
4376
- self . pending_events . lock ( ) . unwrap ( ) . push ( events:: Event :: PaymentClaimed {
4377
- payment_hash, purpose, amount_msat, receiver_node_id : Some ( receiver_node_id) ,
4378
- } ) ;
4379
- }
4380
-
4381
4373
// Now we can handle any errors which were generated.
4382
4374
for ( counterparty_node_id, err) in errs. drain ( ..) {
4383
4375
let res: Result < ( ) , _ > = Err ( err) ;
4384
4376
let _ = handle_error ! ( self , res, counterparty_node_id) ;
4385
4377
}
4386
4378
}
4387
4379
4388
- fn claim_funds_from_hop ( & self , channel_state_lock : & mut MutexGuard < ChannelHolder < <K :: Target as KeysInterface >:: Signer > > , prev_hop : HTLCPreviousHopData , payment_preimage : PaymentPreimage ) -> ClaimFundsFromHop {
4380
+ fn claim_funds_from_hop < ComplFunc : FnOnce ( Option < u64 > ) -> Option < MonitorUpdateCompletionAction > > ( & self ,
4381
+ channel_state_lock : & mut MutexGuard < ChannelHolder < <K :: Target as KeysInterface >:: Signer > > ,
4382
+ prev_hop : HTLCPreviousHopData , payment_preimage : PaymentPreimage , completion_action : ComplFunc )
4383
+ -> ClaimFundsFromHop {
4389
4384
//TODO: Delay the claimed_funds relaying just like we do outbound relay!
4390
4385
4391
4386
let chan_id = prev_hop. outpoint . to_channel_id ( ) ;
@@ -4400,6 +4395,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4400
4395
log_given_level ! ( self . logger, if e == ChannelMonitorUpdateStatus :: PermanentFailure { Level :: Error } else { Level :: Debug } ,
4401
4396
"Failed to update channel monitor with preimage {:?}: {:?}" ,
4402
4397
payment_preimage, e) ;
4398
+ self . handle_monitor_update_completion_actions ( completion_action ( Some ( htlc_value_msat) ) ) ;
4403
4399
return ClaimFundsFromHop :: MonitorUpdateFail (
4404
4400
chan. get ( ) . get_counterparty_node_id ( ) ,
4405
4401
handle_monitor_update_res ! ( self , e, chan, RAACommitmentOrder :: CommitmentFirst , false , msgs. is_some( ) ) . unwrap_err ( ) ,
@@ -4422,6 +4418,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4422
4418
}
4423
4419
} ) ;
4424
4420
}
4421
+ self . handle_monitor_update_completion_actions ( completion_action ( Some ( htlc_value_msat) ) ) ;
4425
4422
return ClaimFundsFromHop :: Success ( htlc_value_msat) ;
4426
4423
} else {
4427
4424
return ClaimFundsFromHop :: DuplicateClaim ;
@@ -4441,10 +4438,14 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4441
4438
if drop {
4442
4439
chan. remove_entry ( ) ;
4443
4440
}
4441
+ self . handle_monitor_update_completion_actions ( completion_action ( None ) ) ;
4444
4442
return ClaimFundsFromHop :: MonitorUpdateFail ( counterparty_node_id, res, None ) ;
4445
4443
} ,
4446
4444
}
4447
- } else { return ClaimFundsFromHop :: PrevHopForceClosed }
4445
+ } else {
4446
+ self . handle_monitor_update_completion_actions ( completion_action ( None ) ) ;
4447
+ return ClaimFundsFromHop :: PrevHopForceClosed
4448
+ }
4448
4449
}
4449
4450
4450
4451
fn finalize_claims ( & self , mut sources : Vec < HTLCSource > ) {
@@ -4517,13 +4518,24 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4517
4518
} ,
4518
4519
HTLCSource :: PreviousHopData ( hop_data) => {
4519
4520
let prev_outpoint = hop_data. outpoint ;
4520
- let res = self . claim_funds_from_hop ( & mut channel_state_lock, hop_data, payment_preimage) ;
4521
- let claimed_htlc = if let ClaimFundsFromHop :: DuplicateClaim = res { false } else { true } ;
4522
- let htlc_claim_value_msat = match res {
4523
- ClaimFundsFromHop :: MonitorUpdateFail ( _, _, amt_opt) => amt_opt,
4524
- ClaimFundsFromHop :: Success ( amt) => Some ( amt) ,
4525
- _ => None ,
4526
- } ;
4521
+ let res = self . claim_funds_from_hop ( & mut channel_state_lock, hop_data, payment_preimage,
4522
+ |htlc_claim_value_msat| {
4523
+ if let Some ( forwarded_htlc_value) = forwarded_htlc_value_msat {
4524
+ let fee_earned_msat = if let Some ( claimed_htlc_value) = htlc_claim_value_msat {
4525
+ Some ( claimed_htlc_value - forwarded_htlc_value)
4526
+ } else { None } ;
4527
+
4528
+ let prev_channel_id = Some ( prev_outpoint. to_channel_id ( ) ) ;
4529
+ let next_channel_id = Some ( next_channel_id) ;
4530
+
4531
+ Some ( MonitorUpdateCompletionAction :: SurfaceEvent { event : events:: Event :: PaymentForwarded {
4532
+ fee_earned_msat,
4533
+ claim_from_onchain_tx : from_onchain,
4534
+ prev_channel_id,
4535
+ next_channel_id,
4536
+ } } )
4537
+ } else { None }
4538
+ } ) ;
4527
4539
if let ClaimFundsFromHop :: PrevHopForceClosed = res {
4528
4540
let preimage_update = ChannelMonitorUpdate {
4529
4541
update_id : CLOSED_CHANNEL_UPDATE_ID ,
@@ -4554,25 +4566,6 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4554
4566
let result: Result < ( ) , _ > = Err ( err) ;
4555
4567
let _ = handle_error ! ( self , result, pk) ;
4556
4568
}
4557
-
4558
- if claimed_htlc {
4559
- if let Some ( forwarded_htlc_value) = forwarded_htlc_value_msat {
4560
- let fee_earned_msat = if let Some ( claimed_htlc_value) = htlc_claim_value_msat {
4561
- Some ( claimed_htlc_value - forwarded_htlc_value)
4562
- } else { None } ;
4563
-
4564
- let mut pending_events = self . pending_events . lock ( ) . unwrap ( ) ;
4565
- let prev_channel_id = Some ( prev_outpoint. to_channel_id ( ) ) ;
4566
- let next_channel_id = Some ( next_channel_id) ;
4567
-
4568
- pending_events. push ( events:: Event :: PaymentForwarded {
4569
- fee_earned_msat,
4570
- claim_from_onchain_tx : from_onchain,
4571
- prev_channel_id,
4572
- next_channel_id,
4573
- } ) ;
4574
- }
4575
- }
4576
4569
} ,
4577
4570
}
4578
4571
}
0 commit comments