@@ -4,7 +4,8 @@ use crate::{
44} ;
55
66use crate :: payment:: 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 ) => ( ) ,
@@ -591,14 +600,16 @@ where
591600 return ;
592601 } ,
593602 PaymentPurpose :: SpontaneousPayment ( preimage) => {
594- let payment = PaymentDetails {
595- preimage : Some ( preimage) ,
603+ let kind = PaymentKind :: Spontaneous {
596604 hash : payment_hash,
597- secret : None ,
605+ preimage : Some ( preimage) ,
606+ } ;
607+ let payment = PaymentDetails {
608+ id : payment_id,
609+ kind,
598610 amount_msat : Some ( amount_msat) ,
599611 direction : PaymentDirection :: Inbound ,
600612 status : PaymentStatus :: Succeeded ,
601- lsp_fee_limits : None ,
602613 } ;
603614
604615 match self . payment_store . insert ( payment) {
@@ -631,14 +642,32 @@ where
631642 panic ! ( "Failed to push to event queue" ) ;
632643 } ) ;
633644 } ,
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- } ) ;
645+ LdkEvent :: PaymentSent {
646+ payment_id,
647+ payment_preimage,
648+ payment_hash,
649+ fee_paid_msat,
650+ ..
651+ } => {
652+ let payment_id = if let Some ( id) = payment_id {
653+ id
654+ } else {
655+ debug_assert ! ( false , "payment_id should always be set." ) ;
656+ return ;
657+ } ;
658+
659+ let update = PaymentDetailsUpdate {
660+ preimage : Some ( Some ( payment_preimage) ) ,
661+ status : Some ( PaymentStatus :: Succeeded ) ,
662+ ..PaymentDetailsUpdate :: new ( payment_id)
663+ } ;
664+
665+ self . payment_store . update ( & update) . unwrap_or_else ( |e| {
666+ log_error ! ( self . logger, "Failed to access payment store: {}" , e) ;
667+ panic ! ( "Failed to access payment store" ) ;
668+ } ) ;
669+
670+ self . payment_store . get ( & payment_id) . map ( |payment| {
642671 log_info ! (
643672 self . logger,
644673 "Successfully sent payment of {}msat{} from \
@@ -652,15 +681,16 @@ where
652681 hex_utils:: to_string( & payment_hash. 0 ) ,
653682 hex_utils:: to_string( & payment_preimage. 0 )
654683 ) ;
655- }
684+ } ) ;
685+
656686 self . event_queue
657687 . add_event ( Event :: PaymentSuccessful { payment_hash, fee_paid_msat } )
658688 . unwrap_or_else ( |e| {
659689 log_error ! ( self . logger, "Failed to push to event queue: {}" , e) ;
660690 panic ! ( "Failed to push to event queue" ) ;
661691 } ) ;
662692 } ,
663- LdkEvent :: PaymentFailed { payment_hash, reason, .. } => {
693+ LdkEvent :: PaymentFailed { payment_id , payment_hash, reason, .. } => {
664694 log_info ! (
665695 self . logger,
666696 "Failed to send payment to payment hash {:?} due to {:?}." ,
@@ -670,7 +700,7 @@ where
670700
671701 let update = PaymentDetailsUpdate {
672702 status : Some ( PaymentStatus :: Failed ) ,
673- ..PaymentDetailsUpdate :: new ( payment_hash )
703+ ..PaymentDetailsUpdate :: new ( payment_id )
674704 } ;
675705 self . payment_store . update ( & update) . unwrap_or_else ( |e| {
676706 log_error ! ( self . logger, "Failed to access payment store: {}" , e) ;
0 commit comments