@@ -4,7 +4,8 @@ use crate::{
44} ;
55
66use crate :: payment:: store:: {
7- PaymentDetails , PaymentDetailsUpdate , PaymentDirection , PaymentStatus , PaymentStore ,
7+ PaymentDetails , PaymentDetailsUpdate , PaymentDirection , PaymentKind , PaymentStatus ,
8+ PaymentStore ,
89} ;
910
1011use crate :: io:: {
@@ -17,6 +18,7 @@ use lightning::chain::chaininterface::ConfirmationTarget;
1718use lightning:: events:: { ClosureReason , PaymentPurpose } ;
1819use lightning:: events:: { Event as LdkEvent , PaymentFailureReason } ;
1920use lightning:: impl_writeable_tlv_based_enum;
21+ use lightning:: ln:: channelmanager:: PaymentId ;
2022use lightning:: ln:: { ChannelId , PaymentHash } ;
2123use lightning:: routing:: gossip:: NodeId ;
2224use lightning:: util:: errors:: APIError ;
@@ -410,7 +412,8 @@ where
410412 onion_fields : _,
411413 counterparty_skimmed_fee_msat,
412414 } => {
413- if let Some ( info) = self . payment_store . get ( & payment_hash) {
415+ let payment_id = PaymentId ( payment_hash. 0 ) ;
416+ if let Some ( info) = self . payment_store . get ( & payment_id) {
414417 if info. status == PaymentStatus :: Succeeded {
415418 log_info ! (
416419 self . logger,
@@ -422,7 +425,7 @@ where
422425
423426 let update = PaymentDetailsUpdate {
424427 status : Some ( PaymentStatus :: Failed ) ,
425- ..PaymentDetailsUpdate :: new ( payment_hash )
428+ ..PaymentDetailsUpdate :: new ( payment_id )
426429 } ;
427430 self . payment_store . update ( & update) . unwrap_or_else ( |e| {
428431 log_error ! ( self . logger, "Failed to access payment store: {}" , e) ;
@@ -431,17 +434,22 @@ where
431434 return ;
432435 }
433436
434- let max_total_opening_fee_msat = info
435- . lsp_fee_limits
436- . and_then ( |l| {
437- l. max_total_opening_fee_msat . or_else ( || {
438- l. max_proportional_opening_fee_ppm_msat . and_then ( |max_prop_fee| {
439- // If it's a variable amount payment, compute the actual fee.
440- compute_opening_fee ( amount_msat, 0 , max_prop_fee)
437+ let max_total_opening_fee_msat = match info. kind {
438+ PaymentKind :: Bolt11Jit { lsp_fee_limits, .. } => {
439+ lsp_fee_limits
440+ . max_total_opening_fee_msat
441+ . or_else ( || {
442+ lsp_fee_limits. max_proportional_opening_fee_ppm_msat . and_then (
443+ |max_prop_fee| {
444+ // If it's a variable amount payment, compute the actual fee.
445+ compute_opening_fee ( amount_msat, 0 , max_prop_fee)
446+ } ,
447+ )
441448 } )
442- } )
443- } )
444- . unwrap_or ( 0 ) ;
449+ . unwrap_or ( 0 )
450+ } ,
451+ _ => 0 ,
452+ } ;
445453
446454 if counterparty_skimmed_fee_msat > max_total_opening_fee_msat {
447455 log_info ! (
@@ -455,7 +463,7 @@ where
455463
456464 let update = PaymentDetailsUpdate {
457465 status : Some ( PaymentStatus :: Failed ) ,
458- ..PaymentDetailsUpdate :: new ( payment_hash )
466+ ..PaymentDetailsUpdate :: new ( payment_id )
459467 } ;
460468 self . payment_store . update ( & update) . unwrap_or_else ( |e| {
461469 log_error ! ( self . logger, "Failed to access payment store: {}" , e) ;
@@ -516,7 +524,7 @@ where
516524
517525 let update = PaymentDetailsUpdate {
518526 status : Some ( PaymentStatus :: Failed ) ,
519- ..PaymentDetailsUpdate :: new ( payment_hash )
527+ ..PaymentDetailsUpdate :: new ( payment_id )
520528 } ;
521529 self . payment_store . update ( & update) . unwrap_or_else ( |e| {
522530 log_error ! ( self . logger, "Failed to access payment store: {}" , e) ;
@@ -538,6 +546,7 @@ where
538546 hex_utils:: to_string( & payment_hash. 0 ) ,
539547 amount_msat,
540548 ) ;
549+ let payment_id = PaymentId ( payment_hash. 0 ) ;
541550 match purpose {
542551 PaymentPurpose :: Bolt11InvoicePayment {
543552 payment_preimage,
@@ -549,7 +558,7 @@ where
549558 secret : Some ( Some ( payment_secret) ) ,
550559 amount_msat : Some ( Some ( amount_msat) ) ,
551560 status : Some ( PaymentStatus :: Succeeded ) ,
552- ..PaymentDetailsUpdate :: new ( payment_hash )
561+ ..PaymentDetailsUpdate :: new ( payment_id )
553562 } ;
554563 match self . payment_store . update ( & update) {
555564 Ok ( true ) => ( ) ,
@@ -592,13 +601,14 @@ where
592601 } ,
593602 PaymentPurpose :: SpontaneousPayment ( preimage) => {
594603 let payment = PaymentDetails {
595- preimage : Some ( preimage) ,
596- hash : payment_hash,
597- secret : None ,
604+ id : payment_id,
605+ kind : PaymentKind :: Spontaneous {
606+ hash : payment_hash,
607+ preimage : Some ( preimage) ,
608+ } ,
598609 amount_msat : Some ( amount_msat) ,
599610 direction : PaymentDirection :: Inbound ,
600611 status : PaymentStatus :: Succeeded ,
601- lsp_fee_limits : None ,
602612 } ;
603613
604614 match self . payment_store . insert ( payment) {
@@ -631,14 +641,32 @@ where
631641 panic ! ( "Failed to push to event queue" ) ;
632642 } ) ;
633643 } ,
634- LdkEvent :: PaymentSent { payment_preimage, payment_hash, fee_paid_msat, .. } => {
635- if let Some ( mut payment) = self . payment_store . get ( & payment_hash) {
636- payment. preimage = Some ( payment_preimage) ;
637- payment. status = PaymentStatus :: Succeeded ;
638- self . payment_store . insert ( payment. clone ( ) ) . unwrap_or_else ( |e| {
639- log_error ! ( self . logger, "Failed to access payment store: {}" , e) ;
640- panic ! ( "Failed to access payment store" ) ;
641- } ) ;
644+ LdkEvent :: PaymentSent {
645+ payment_id,
646+ payment_preimage,
647+ payment_hash,
648+ fee_paid_msat,
649+ ..
650+ } => {
651+ let payment_id = if let Some ( id) = payment_id {
652+ id
653+ } else {
654+ debug_assert ! ( false , "payment_id should always be set." ) ;
655+ return ;
656+ } ;
657+
658+ let update = PaymentDetailsUpdate {
659+ preimage : Some ( Some ( payment_preimage) ) ,
660+ status : Some ( PaymentStatus :: Succeeded ) ,
661+ ..PaymentDetailsUpdate :: new ( payment_id)
662+ } ;
663+
664+ self . payment_store . update ( & update) . unwrap_or_else ( |e| {
665+ log_error ! ( self . logger, "Failed to access payment store: {}" , e) ;
666+ panic ! ( "Failed to access payment store" ) ;
667+ } ) ;
668+
669+ self . payment_store . get ( & payment_id) . map ( |payment| {
642670 log_info ! (
643671 self . logger,
644672 "Successfully sent payment of {}msat{} from \
@@ -652,15 +680,16 @@ where
652680 hex_utils:: to_string( & payment_hash. 0 ) ,
653681 hex_utils:: to_string( & payment_preimage. 0 )
654682 ) ;
655- }
683+ } ) ;
684+
656685 self . event_queue
657686 . add_event ( Event :: PaymentSuccessful { payment_hash, fee_paid_msat } )
658687 . unwrap_or_else ( |e| {
659688 log_error ! ( self . logger, "Failed to push to event queue: {}" , e) ;
660689 panic ! ( "Failed to push to event queue" ) ;
661690 } ) ;
662691 } ,
663- LdkEvent :: PaymentFailed { payment_hash, reason, .. } => {
692+ LdkEvent :: PaymentFailed { payment_id , payment_hash, reason, .. } => {
664693 log_info ! (
665694 self . logger,
666695 "Failed to send payment to payment hash {:?} due to {:?}." ,
@@ -670,7 +699,7 @@ where
670699
671700 let update = PaymentDetailsUpdate {
672701 status : Some ( PaymentStatus :: Failed ) ,
673- ..PaymentDetailsUpdate :: new ( payment_hash )
702+ ..PaymentDetailsUpdate :: new ( payment_id )
674703 } ;
675704 self . payment_store . update ( & update) . unwrap_or_else ( |e| {
676705 log_error ! ( self . logger, "Failed to access payment store: {}" , e) ;
0 commit comments