@@ -4300,7 +4300,6 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4300
4300
let mut expected_amt_msat = None ;
4301
4301
let mut valid_mpp = true ;
4302
4302
let mut errs = Vec :: new ( ) ;
4303
- let mut claimed_any_htlcs = false ;
4304
4303
let mut channel_state_lock = self . channel_state . lock ( ) . unwrap ( ) ;
4305
4304
let channel_state = & mut * channel_state_lock;
4306
4305
for htlc in sources. iter ( ) {
@@ -4350,13 +4349,14 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4350
4349
}
4351
4350
if valid_mpp {
4352
4351
for htlc in sources. drain ( ..) {
4353
- match self . claim_funds_from_hop ( & mut channel_state_lock, htlc. prev_hop , payment_preimage) {
4352
+ match self . claim_funds_from_hop ( & mut channel_state_lock, htlc. prev_hop , payment_preimage,
4353
+ |_| Some ( MonitorUpdateCompletionAction :: PaymentClaimed { payment_hash } ) )
4354
+ {
4354
4355
ClaimFundsFromHop :: MonitorUpdateFail ( pk, err, _) => {
4355
4356
if let msgs:: ErrorAction :: IgnoreError = err. err . action {
4356
4357
// We got a temporary failure updating monitor, but will claim the
4357
4358
// HTLC when the monitor updating is restored (or on chain).
4358
4359
log_error ! ( self . logger, "Temporary failure claiming HTLC, treating as success: {}" , err. err. err) ;
4359
- claimed_any_htlcs = true ;
4360
4360
} else { errs. push ( ( pk, err) ) ; }
4361
4361
} ,
4362
4362
ClaimFundsFromHop :: PrevHopForceClosed => unreachable ! ( "We already checked for channel existence, we can't fail here!" ) ,
@@ -4366,7 +4366,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4366
4366
// available to be claimed. Thus, it does not make sense to set
4367
4367
// `claimed_any_htlcs`.
4368
4368
} ,
4369
- ClaimFundsFromHop :: Success ( _) => claimed_any_htlcs = true ,
4369
+ ClaimFundsFromHop :: Success ( _) => { } ,
4370
4370
}
4371
4371
}
4372
4372
}
@@ -4382,22 +4382,17 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4382
4382
}
4383
4383
}
4384
4384
4385
- let ClaimingPayment { amount_msat, payment_purpose : purpose, receiver_node_id } =
4386
- self . pending_claimed_payments . lock ( ) . unwrap ( ) . remove ( & payment_hash) . unwrap ( ) ;
4387
- if claimed_any_htlcs {
4388
- self . pending_events . lock ( ) . unwrap ( ) . push ( events:: Event :: PaymentClaimed {
4389
- payment_hash, purpose, amount_msat, receiver_node_id : Some ( receiver_node_id) ,
4390
- } ) ;
4391
- }
4392
-
4393
4385
// Now we can handle any errors which were generated.
4394
4386
for ( counterparty_node_id, err) in errs. drain ( ..) {
4395
4387
let res: Result < ( ) , _ > = Err ( err) ;
4396
4388
let _ = handle_error ! ( self , res, counterparty_node_id) ;
4397
4389
}
4398
4390
}
4399
4391
4400
- fn claim_funds_from_hop ( & self , channel_state_lock : & mut MutexGuard < ChannelHolder < <K :: Target as KeysInterface >:: Signer > > , prev_hop : HTLCPreviousHopData , payment_preimage : PaymentPreimage ) -> ClaimFundsFromHop {
4392
+ fn claim_funds_from_hop < ComplFunc : FnOnce ( Option < u64 > ) -> Option < MonitorUpdateCompletionAction > > ( & self ,
4393
+ channel_state_lock : & mut MutexGuard < ChannelHolder < <K :: Target as KeysInterface >:: Signer > > ,
4394
+ prev_hop : HTLCPreviousHopData , payment_preimage : PaymentPreimage , completion_action : ComplFunc )
4395
+ -> ClaimFundsFromHop {
4401
4396
//TODO: Delay the claimed_funds relaying just like we do outbound relay!
4402
4397
4403
4398
let chan_id = prev_hop. outpoint . to_channel_id ( ) ;
@@ -4412,6 +4407,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4412
4407
log_given_level ! ( self . logger, if e == ChannelMonitorUpdateStatus :: PermanentFailure { Level :: Error } else { Level :: Debug } ,
4413
4408
"Failed to update channel monitor with preimage {:?}: {:?}" ,
4414
4409
payment_preimage, e) ;
4410
+ self . handle_monitor_update_completion_actions ( completion_action ( Some ( htlc_value_msat) ) ) ;
4415
4411
return ClaimFundsFromHop :: MonitorUpdateFail (
4416
4412
chan. get ( ) . get_counterparty_node_id ( ) ,
4417
4413
handle_monitor_update_res ! ( self , e, chan, RAACommitmentOrder :: CommitmentFirst , false , msgs. is_some( ) ) . unwrap_err ( ) ,
@@ -4434,6 +4430,7 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4434
4430
}
4435
4431
} ) ;
4436
4432
}
4433
+ self . handle_monitor_update_completion_actions ( completion_action ( Some ( htlc_value_msat) ) ) ;
4437
4434
return ClaimFundsFromHop :: Success ( htlc_value_msat) ;
4438
4435
} else {
4439
4436
return ClaimFundsFromHop :: DuplicateClaim ;
@@ -4453,10 +4450,14 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4453
4450
if drop {
4454
4451
chan. remove_entry ( ) ;
4455
4452
}
4453
+ self . handle_monitor_update_completion_actions ( completion_action ( None ) ) ;
4456
4454
return ClaimFundsFromHop :: MonitorUpdateFail ( counterparty_node_id, res, None ) ;
4457
4455
} ,
4458
4456
}
4459
- } else { return ClaimFundsFromHop :: PrevHopForceClosed }
4457
+ } else {
4458
+ self . handle_monitor_update_completion_actions ( completion_action ( None ) ) ;
4459
+ return ClaimFundsFromHop :: PrevHopForceClosed
4460
+ }
4460
4461
}
4461
4462
4462
4463
fn finalize_claims ( & self , mut sources : Vec < HTLCSource > ) {
@@ -4529,13 +4530,24 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4529
4530
} ,
4530
4531
HTLCSource :: PreviousHopData ( hop_data) => {
4531
4532
let prev_outpoint = hop_data. outpoint ;
4532
- let res = self . claim_funds_from_hop ( & mut channel_state_lock, hop_data, payment_preimage) ;
4533
- let claimed_htlc = if let ClaimFundsFromHop :: DuplicateClaim = res { false } else { true } ;
4534
- let htlc_claim_value_msat = match res {
4535
- ClaimFundsFromHop :: MonitorUpdateFail ( _, _, amt_opt) => amt_opt,
4536
- ClaimFundsFromHop :: Success ( amt) => Some ( amt) ,
4537
- _ => None ,
4538
- } ;
4533
+ let res = self . claim_funds_from_hop ( & mut channel_state_lock, hop_data, payment_preimage,
4534
+ |htlc_claim_value_msat| {
4535
+ if let Some ( forwarded_htlc_value) = forwarded_htlc_value_msat {
4536
+ let fee_earned_msat = if let Some ( claimed_htlc_value) = htlc_claim_value_msat {
4537
+ Some ( claimed_htlc_value - forwarded_htlc_value)
4538
+ } else { None } ;
4539
+
4540
+ let prev_channel_id = Some ( prev_outpoint. to_channel_id ( ) ) ;
4541
+ let next_channel_id = Some ( next_channel_id) ;
4542
+
4543
+ Some ( MonitorUpdateCompletionAction :: SurfaceEvent { event : events:: Event :: PaymentForwarded {
4544
+ fee_earned_msat,
4545
+ claim_from_onchain_tx : from_onchain,
4546
+ prev_channel_id,
4547
+ next_channel_id,
4548
+ } } )
4549
+ } else { None }
4550
+ } ) ;
4539
4551
if let ClaimFundsFromHop :: PrevHopForceClosed = res {
4540
4552
let preimage_update = ChannelMonitorUpdate {
4541
4553
update_id : CLOSED_CHANNEL_UPDATE_ID ,
@@ -4566,25 +4578,6 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
4566
4578
let result: Result < ( ) , _ > = Err ( err) ;
4567
4579
let _ = handle_error ! ( self , result, pk) ;
4568
4580
}
4569
-
4570
- if claimed_htlc {
4571
- if let Some ( forwarded_htlc_value) = forwarded_htlc_value_msat {
4572
- let fee_earned_msat = if let Some ( claimed_htlc_value) = htlc_claim_value_msat {
4573
- Some ( claimed_htlc_value - forwarded_htlc_value)
4574
- } else { None } ;
4575
-
4576
- let mut pending_events = self . pending_events . lock ( ) . unwrap ( ) ;
4577
- let prev_channel_id = Some ( prev_outpoint. to_channel_id ( ) ) ;
4578
- let next_channel_id = Some ( next_channel_id) ;
4579
-
4580
- pending_events. push ( events:: Event :: PaymentForwarded {
4581
- fee_earned_msat,
4582
- claim_from_onchain_tx : from_onchain,
4583
- prev_channel_id,
4584
- next_channel_id,
4585
- } ) ;
4586
- }
4587
- }
4588
4581
} ,
4589
4582
}
4590
4583
}
0 commit comments