@@ -3492,9 +3492,13 @@ where
34923492 }
34933493
34943494 macro_rules! check_total_value {
3495- ( $payment_data: expr, $payment_preimage: expr) => { {
3495+ ( $payment_data: expr, $payment_preimage: expr, $is_keysend : expr ) => { {
34963496 let mut payment_claimable_generated = false ;
3497- let purpose = || {
3497+ let purpose = if $is_keysend {
3498+ events:: PaymentPurpose :: SpontaneousPayment (
3499+ $payment_preimage. expect( "Should never call check_total_value with $is_keysend as true but no preimage" )
3500+ )
3501+ } else {
34983502 events:: PaymentPurpose :: InvoicePayment {
34993503 payment_preimage: $payment_preimage,
35003504 payment_secret: $payment_data. payment_secret,
@@ -3510,7 +3514,7 @@ where
35103514 . or_insert_with( || {
35113515 committed_to_claimable = true ;
35123516 ClaimablePayment {
3513- purpose: purpose( ) , htlcs: Vec :: new( ) , onion_fields: None ,
3517+ purpose: purpose. clone ( ) , htlcs: Vec :: new( ) , onion_fields: None ,
35143518 }
35153519 } ) ;
35163520 if let Some ( earlier_fields) = & mut claimable_payment. onion_fields {
@@ -3521,7 +3525,7 @@ where
35213525 claimable_payment. onion_fields = Some ( onion_fields) ;
35223526 }
35233527 let ref mut htlcs = & mut claimable_payment. htlcs;
3524- if htlcs. len ( ) == 1 {
3528+ if ! htlcs. is_empty ( ) && !$is_keysend {
35253529 if let OnionPayload :: Spontaneous ( _) = htlcs[ 0 ] . onion_payload {
35263530 log_trace!( self . logger, "Failing new HTLC with payment_hash {} as we already had an existing keysend HTLC with the same payment hash" , log_bytes!( payment_hash. 0 ) ) ;
35273531 fail_htlc!( claimable_htlc, payment_hash) ;
@@ -3532,17 +3536,12 @@ where
35323536 for htlc in htlcs. iter( ) {
35333537 total_value += htlc. sender_intended_value;
35343538 earliest_expiry = cmp:: min( earliest_expiry, htlc. cltv_expiry) ;
3535- match & htlc. onion_payload {
3536- OnionPayload :: Invoice { .. } => {
3537- if htlc. total_msat != $payment_data. total_msat {
3538- log_trace!( self . logger, "Failing HTLCs with payment_hash {} as the HTLCs had inconsistent total values (eg {} and {})" ,
3539- log_bytes!( payment_hash. 0 ) , $payment_data. total_msat, htlc. total_msat) ;
3540- total_value = msgs:: MAX_VALUE_MSAT ;
3541- }
3542- if total_value >= msgs:: MAX_VALUE_MSAT { break ; }
3543- } ,
3544- _ => unreachable!( ) ,
3539+ if htlc. total_msat != $payment_data. total_msat {
3540+ log_trace!( self . logger, "Failing HTLCs with payment_hash {} as the HTLCs had inconsistent total values (eg {} and {})" ,
3541+ log_bytes!( payment_hash. 0 ) , $payment_data. total_msat, htlc. total_msat) ;
3542+ total_value = msgs:: MAX_VALUE_MSAT ;
35453543 }
3544+ if total_value >= msgs:: MAX_VALUE_MSAT { break ; }
35463545 }
35473546 // The condition determining whether an MPP is complete must
35483547 // match exactly the condition used in `timer_tick_occurred`
@@ -3563,7 +3562,7 @@ where
35633562 new_events. push( events:: Event :: PaymentClaimable {
35643563 receiver_node_id: Some ( receiver_node_id) ,
35653564 payment_hash,
3566- purpose: purpose ( ) ,
3565+ purpose,
35673566 amount_msat,
35683567 via_channel_id: Some ( prev_channel_id) ,
35693568 via_user_channel_id: Some ( prev_user_channel_id) ,
@@ -3611,40 +3610,44 @@ where
36113610 fail_htlc ! ( claimable_htlc, payment_hash) ;
36123611 }
36133612 }
3614- check_total_value ! ( payment_data, payment_preimage) ;
3613+ check_total_value ! ( payment_data, payment_preimage, false ) ;
36153614 } ,
36163615 OnionPayload :: Spontaneous ( preimage) => {
3617- let mut claimable_payments = self . claimable_payments . lock ( ) . unwrap ( ) ;
3618- if claimable_payments. pending_claiming_payments . contains_key ( & payment_hash) {
3619- fail_htlc ! ( claimable_htlc, payment_hash) ;
3620- }
3621- match claimable_payments. claimable_payments . entry ( payment_hash) {
3622- hash_map:: Entry :: Vacant ( e) => {
3623- let amount_msat = claimable_htlc. value ;
3624- claimable_htlc. total_value_received = Some ( amount_msat) ;
3625- let claim_deadline = Some ( claimable_htlc. cltv_expiry - HTLC_FAIL_BACK_BUFFER ) ;
3626- let purpose = events:: PaymentPurpose :: SpontaneousPayment ( preimage) ;
3627- e. insert ( ClaimablePayment {
3628- purpose : purpose. clone ( ) ,
3629- onion_fields : Some ( onion_fields. clone ( ) ) ,
3630- htlcs : vec ! [ claimable_htlc] ,
3631- } ) ;
3632- let prev_channel_id = prev_funding_outpoint. to_channel_id ( ) ;
3633- new_events. push ( events:: Event :: PaymentClaimable {
3634- receiver_node_id : Some ( receiver_node_id) ,
3635- payment_hash,
3636- amount_msat,
3637- purpose,
3638- via_channel_id : Some ( prev_channel_id) ,
3639- via_user_channel_id : Some ( prev_user_channel_id) ,
3640- claim_deadline,
3641- onion_fields : Some ( onion_fields) ,
3642- } ) ;
3643- } ,
3644- hash_map:: Entry :: Occupied ( _) => {
3645- log_trace ! ( self . logger, "Failing new keysend HTLC with payment_hash {} for a duplicative payment hash" , log_bytes!( payment_hash. 0 ) ) ;
3616+ if let Some ( payment_data) = payment_data {
3617+ check_total_value ! ( payment_data, Some ( preimage) , true ) ;
3618+ } else {
3619+ let mut claimable_payments = self . claimable_payments . lock ( ) . unwrap ( ) ;
3620+ if claimable_payments. pending_claiming_payments . contains_key ( & payment_hash) {
36463621 fail_htlc ! ( claimable_htlc, payment_hash) ;
36473622 }
3623+ match claimable_payments. claimable_payments . entry ( payment_hash) {
3624+ hash_map:: Entry :: Vacant ( e) => {
3625+ let amount_msat = claimable_htlc. value ;
3626+ claimable_htlc. total_value_received = Some ( amount_msat) ;
3627+ let claim_deadline = Some ( claimable_htlc. cltv_expiry - HTLC_FAIL_BACK_BUFFER ) ;
3628+ let purpose = events:: PaymentPurpose :: SpontaneousPayment ( preimage) ;
3629+ e. insert ( ClaimablePayment {
3630+ purpose : purpose. clone ( ) ,
3631+ onion_fields : Some ( onion_fields. clone ( ) ) ,
3632+ htlcs : vec ! [ claimable_htlc] ,
3633+ } ) ;
3634+ let prev_channel_id = prev_funding_outpoint. to_channel_id ( ) ;
3635+ new_events. push ( events:: Event :: PaymentClaimable {
3636+ receiver_node_id : Some ( receiver_node_id) ,
3637+ payment_hash,
3638+ amount_msat,
3639+ purpose,
3640+ via_channel_id : Some ( prev_channel_id) ,
3641+ via_user_channel_id : Some ( prev_user_channel_id) ,
3642+ claim_deadline,
3643+ onion_fields : Some ( onion_fields) ,
3644+ } ) ;
3645+ } ,
3646+ hash_map:: Entry :: Occupied ( _) => {
3647+ log_trace ! ( self . logger, "Failing new keysend HTLC with payment_hash {} for a duplicative payment hash" , log_bytes!( payment_hash. 0 ) ) ;
3648+ fail_htlc ! ( claimable_htlc, payment_hash) ;
3649+ }
3650+ }
36483651 }
36493652 }
36503653 }
@@ -3663,7 +3666,7 @@ where
36633666 log_bytes!( payment_hash. 0 ) , payment_data. total_msat, inbound_payment. get( ) . min_value_msat. unwrap( ) ) ;
36643667 fail_htlc ! ( claimable_htlc, payment_hash) ;
36653668 } else {
3666- let payment_claimable_generated = check_total_value ! ( payment_data, inbound_payment. get( ) . payment_preimage) ;
3669+ let payment_claimable_generated = check_total_value ! ( payment_data, inbound_payment. get( ) . payment_preimage, false ) ;
36673670 if payment_claimable_generated {
36683671 inbound_payment. remove_entry ( ) ;
36693672 }
@@ -4138,12 +4141,16 @@ where
41384141 /// event matches your expectation. If you fail to do so and call this method, you may provide
41394142 /// the sender "proof-of-payment" when they did not fulfill the full expected payment.
41404143 ///
4144+ /// To accept multi-part keysend payments you must set [`UserConfig::accept_mpp_keysend`] to
4145+ /// true.
4146+ ///
41414147 /// [`Event::PaymentClaimable`]: crate::events::Event::PaymentClaimable
41424148 /// [`Event::PaymentClaimable::claim_deadline`]: crate::events::Event::PaymentClaimable::claim_deadline
41434149 /// [`Event::PaymentClaimed`]: crate::events::Event::PaymentClaimed
41444150 /// [`process_pending_events`]: EventsProvider::process_pending_events
41454151 /// [`create_inbound_payment`]: Self::create_inbound_payment
41464152 /// [`create_inbound_payment_for_hash`]: Self::create_inbound_payment_for_hash
4153+ /// [`UserConfig::accept_mpp_keysend`]: crate::util::config::UserConfig::accept_mpp_keysend
41474154 pub fn claim_funds ( & self , payment_preimage : PaymentPreimage ) {
41484155 let payment_hash = PaymentHash ( Sha256 :: hash ( & payment_preimage. 0 ) . into_inner ( ) ) ;
41494156
@@ -4204,9 +4211,9 @@ where
42044211 expected_amt_msat = htlc. total_value_received ;
42054212
42064213 if let OnionPayload :: Spontaneous ( _) = & htlc. onion_payload {
4207- // We don't currently support MPP for spontaneous payments, so just check
4214+ // If the user chooses not to support MPP for spontaneous payments, just check
42084215 // that there's one payment here and move on.
4209- if sources. len ( ) != 1 {
4216+ if ! self . default_configuration . accept_mpp_keysend && sources. len ( ) != 1 {
42104217 log_error ! ( self . logger, "Somehow ended up with an MPP spontaneous payment - this should not be reachable!" ) ;
42114218 debug_assert ! ( false ) ;
42124219 valid_mpp = false ;
0 commit comments