@@ -4294,7 +4294,6 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4294
4294
let mut expected_amt_msat = None ;
4295
4295
let mut valid_mpp = true ;
4296
4296
let mut errs = Vec :: new ( ) ;
4297
- let mut claimed_any_htlcs = false ;
4298
4297
let mut channel_state_lock = self . channel_state . lock ( ) . unwrap ( ) ;
4299
4298
let channel_state = & mut * channel_state_lock;
4300
4299
for htlc in sources. iter ( ) {
@@ -4344,13 +4343,14 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4344
4343
}
4345
4344
if valid_mpp {
4346
4345
for htlc in sources. drain ( ..) {
4347
- match self . claim_funds_from_hop ( & mut channel_state_lock, htlc. prev_hop , payment_preimage) {
4346
+ match self . claim_funds_from_hop ( & mut channel_state_lock, htlc. prev_hop , payment_preimage,
4347
+ |_| Some ( MonitorUpdateCompletionAction :: PaymentClaimed { payment_hash } ) )
4348
+ {
4348
4349
ClaimFundsFromHop :: MonitorUpdateFail ( pk, err, _) => {
4349
4350
if let msgs:: ErrorAction :: IgnoreError = err. err . action {
4350
4351
// We got a temporary failure updating monitor, but will claim the
4351
4352
// HTLC when the monitor updating is restored (or on chain).
4352
4353
log_error ! ( self . logger, "Temporary failure claiming HTLC, treating as success: {}" , err. err. err) ;
4353
- claimed_any_htlcs = true ;
4354
4354
} else { errs. push ( ( pk, err) ) ; }
4355
4355
} ,
4356
4356
ClaimFundsFromHop :: PrevHopForceClosed => unreachable ! ( "We already checked for channel existence, we can't fail here!" ) ,
@@ -4360,7 +4360,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4360
4360
// available to be claimed. Thus, it does not make sense to set
4361
4361
// `claimed_any_htlcs`.
4362
4362
} ,
4363
- ClaimFundsFromHop :: Success ( _) => claimed_any_htlcs = true ,
4363
+ ClaimFundsFromHop :: Success ( _) => { } ,
4364
4364
}
4365
4365
}
4366
4366
}
@@ -4377,22 +4377,17 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4377
4377
}
4378
4378
}
4379
4379
4380
- let PendingClaimingPayment { amount_msat, payment_purpose : purpose, receiver_node_id } =
4381
- self . pending_claimed_payments . lock ( ) . unwrap ( ) . remove ( & payment_hash) . unwrap ( ) ;
4382
- if claimed_any_htlcs {
4383
- self . pending_events . lock ( ) . unwrap ( ) . push ( events:: Event :: PaymentClaimed {
4384
- payment_hash, purpose, amount_msat, receiver_node_id : Some ( receiver_node_id) ,
4385
- } ) ;
4386
- }
4387
-
4388
4380
// Now we can handle any errors which were generated.
4389
4381
for ( counterparty_node_id, err) in errs. drain ( ..) {
4390
4382
let res: Result < ( ) , _ > = Err ( err) ;
4391
4383
let _ = handle_error ! ( self , res, counterparty_node_id) ;
4392
4384
}
4393
4385
}
4394
4386
4395
- fn claim_funds_from_hop ( & self , channel_state_lock : & mut MutexGuard < ChannelHolder < <K :: Target as KeysInterface >:: Signer > > , prev_hop : HTLCPreviousHopData , payment_preimage : PaymentPreimage ) -> ClaimFundsFromHop {
4387
+ fn claim_funds_from_hop < ComplFunc : FnOnce ( Option < u64 > ) -> Option < MonitorUpdateCompletionAction > > ( & self ,
4388
+ channel_state_lock : & mut MutexGuard < ChannelHolder < <K :: Target as KeysInterface >:: Signer > > ,
4389
+ prev_hop : HTLCPreviousHopData , payment_preimage : PaymentPreimage , completion_action : ComplFunc )
4390
+ -> ClaimFundsFromHop {
4396
4391
//TODO: Delay the claimed_funds relaying just like we do outbound relay!
4397
4392
4398
4393
let chan_id = prev_hop. outpoint . to_channel_id ( ) ;
@@ -4407,6 +4402,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4407
4402
log_given_level ! ( self . logger, if e == ChannelMonitorUpdateStatus :: PermanentFailure { Level :: Error } else { Level :: Debug } ,
4408
4403
"Failed to update channel monitor with preimage {:?}: {:?}" ,
4409
4404
payment_preimage, e) ;
4405
+ self . handle_monitor_update_completion_actions ( completion_action ( Some ( htlc_value_msat) ) ) ;
4410
4406
return ClaimFundsFromHop :: MonitorUpdateFail (
4411
4407
chan. get ( ) . get_counterparty_node_id ( ) ,
4412
4408
handle_monitor_update_res ! ( self , e, chan, RAACommitmentOrder :: CommitmentFirst , false , msgs. is_some( ) ) . unwrap_err ( ) ,
@@ -4429,6 +4425,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4429
4425
}
4430
4426
} ) ;
4431
4427
}
4428
+ self . handle_monitor_update_completion_actions ( completion_action ( Some ( htlc_value_msat) ) ) ;
4432
4429
return ClaimFundsFromHop :: Success ( htlc_value_msat) ;
4433
4430
} else {
4434
4431
return ClaimFundsFromHop :: DuplicateClaim ;
@@ -4448,10 +4445,14 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4448
4445
if drop {
4449
4446
chan. remove_entry ( ) ;
4450
4447
}
4448
+ self . handle_monitor_update_completion_actions ( completion_action ( None ) ) ;
4451
4449
return ClaimFundsFromHop :: MonitorUpdateFail ( counterparty_node_id, res, None ) ;
4452
4450
} ,
4453
4451
}
4454
- } else { return ClaimFundsFromHop :: PrevHopForceClosed }
4452
+ } else {
4453
+ self . handle_monitor_update_completion_actions ( completion_action ( None ) ) ;
4454
+ return ClaimFundsFromHop :: PrevHopForceClosed
4455
+ }
4455
4456
}
4456
4457
4457
4458
fn finalize_claims ( & self , mut sources : Vec < HTLCSource > ) {
@@ -4524,13 +4525,24 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4524
4525
} ,
4525
4526
HTLCSource :: PreviousHopData ( hop_data) => {
4526
4527
let prev_outpoint = hop_data. outpoint ;
4527
- let res = self . claim_funds_from_hop ( & mut channel_state_lock, hop_data, payment_preimage) ;
4528
- let claimed_htlc = if let ClaimFundsFromHop :: DuplicateClaim = res { false } else { true } ;
4529
- let htlc_claim_value_msat = match res {
4530
- ClaimFundsFromHop :: MonitorUpdateFail ( _, _, amt_opt) => amt_opt,
4531
- ClaimFundsFromHop :: Success ( amt) => Some ( amt) ,
4532
- _ => None ,
4533
- } ;
4528
+ let res = self . claim_funds_from_hop ( & mut channel_state_lock, hop_data, payment_preimage,
4529
+ |htlc_claim_value_msat| {
4530
+ if let Some ( forwarded_htlc_value) = forwarded_htlc_value_msat {
4531
+ let fee_earned_msat = if let Some ( claimed_htlc_value) = htlc_claim_value_msat {
4532
+ Some ( claimed_htlc_value - forwarded_htlc_value)
4533
+ } else { None } ;
4534
+
4535
+ let prev_channel_id = Some ( prev_outpoint. to_channel_id ( ) ) ;
4536
+ let next_channel_id = Some ( next_channel_id) ;
4537
+
4538
+ Some ( MonitorUpdateCompletionAction :: SurfaceEvent { event : events:: Event :: PaymentForwarded {
4539
+ fee_earned_msat,
4540
+ claim_from_onchain_tx : from_onchain,
4541
+ prev_channel_id,
4542
+ next_channel_id,
4543
+ } } )
4544
+ } else { None }
4545
+ } ) ;
4534
4546
if let ClaimFundsFromHop :: PrevHopForceClosed = res {
4535
4547
let preimage_update = ChannelMonitorUpdate {
4536
4548
update_id : CLOSED_CHANNEL_UPDATE_ID ,
@@ -4561,25 +4573,6 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4561
4573
let result: Result < ( ) , _ > = Err ( err) ;
4562
4574
let _ = handle_error ! ( self , result, pk) ;
4563
4575
}
4564
-
4565
- if claimed_htlc {
4566
- if let Some ( forwarded_htlc_value) = forwarded_htlc_value_msat {
4567
- let fee_earned_msat = if let Some ( claimed_htlc_value) = htlc_claim_value_msat {
4568
- Some ( claimed_htlc_value - forwarded_htlc_value)
4569
- } else { None } ;
4570
-
4571
- let mut pending_events = self . pending_events . lock ( ) . unwrap ( ) ;
4572
- let prev_channel_id = Some ( prev_outpoint. to_channel_id ( ) ) ;
4573
- let next_channel_id = Some ( next_channel_id) ;
4574
-
4575
- pending_events. push ( events:: Event :: PaymentForwarded {
4576
- fee_earned_msat,
4577
- claim_from_onchain_tx : from_onchain,
4578
- prev_channel_id,
4579
- next_channel_id,
4580
- } ) ;
4581
- }
4582
- }
4583
4576
} ,
4584
4577
}
4585
4578
}
0 commit comments