@@ -4,7 +4,8 @@ use crate::{
4
4
} ;
5
5
6
6
use crate :: payment:: payment_store:: {
7
- PaymentDetails , PaymentDetailsUpdate , PaymentDirection , PaymentStatus , PaymentStore ,
7
+ PaymentDetails , PaymentDetailsUpdate , PaymentDirection , PaymentKind , PaymentStatus ,
8
+ PaymentStore ,
8
9
} ;
9
10
10
11
use crate :: io:: {
@@ -17,6 +18,7 @@ use lightning::chain::chaininterface::ConfirmationTarget;
17
18
use lightning:: events:: { ClosureReason , PaymentPurpose } ;
18
19
use lightning:: events:: { Event as LdkEvent , PaymentFailureReason } ;
19
20
use lightning:: impl_writeable_tlv_based_enum;
21
+ use lightning:: ln:: channelmanager:: PaymentId ;
20
22
use lightning:: ln:: { ChannelId , PaymentHash } ;
21
23
use lightning:: routing:: gossip:: NodeId ;
22
24
use lightning:: util:: errors:: APIError ;
@@ -410,7 +412,8 @@ where
410
412
onion_fields : _,
411
413
counterparty_skimmed_fee_msat,
412
414
} => {
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) {
414
417
if info. status == PaymentStatus :: Succeeded {
415
418
log_info ! (
416
419
self . logger,
@@ -422,7 +425,7 @@ where
422
425
423
426
let update = PaymentDetailsUpdate {
424
427
status : Some ( PaymentStatus :: Failed ) ,
425
- ..PaymentDetailsUpdate :: new ( payment_hash )
428
+ ..PaymentDetailsUpdate :: new ( payment_id )
426
429
} ;
427
430
self . payment_store . update ( & update) . unwrap_or_else ( |e| {
428
431
log_error ! ( self . logger, "Failed to access payment store: {}" , e) ;
@@ -431,17 +434,22 @@ where
431
434
return ;
432
435
}
433
436
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
+ )
441
448
} )
442
- } )
443
- } )
444
- . unwrap_or ( 0 ) ;
449
+ . unwrap_or ( 0 )
450
+ } ,
451
+ _ => 0 ,
452
+ } ;
445
453
446
454
if counterparty_skimmed_fee_msat > max_total_opening_fee_msat {
447
455
log_info ! (
@@ -455,7 +463,7 @@ where
455
463
456
464
let update = PaymentDetailsUpdate {
457
465
status : Some ( PaymentStatus :: Failed ) ,
458
- ..PaymentDetailsUpdate :: new ( payment_hash )
466
+ ..PaymentDetailsUpdate :: new ( payment_id )
459
467
} ;
460
468
self . payment_store . update ( & update) . unwrap_or_else ( |e| {
461
469
log_error ! ( self . logger, "Failed to access payment store: {}" , e) ;
@@ -516,7 +524,7 @@ where
516
524
517
525
let update = PaymentDetailsUpdate {
518
526
status : Some ( PaymentStatus :: Failed ) ,
519
- ..PaymentDetailsUpdate :: new ( payment_hash )
527
+ ..PaymentDetailsUpdate :: new ( payment_id )
520
528
} ;
521
529
self . payment_store . update ( & update) . unwrap_or_else ( |e| {
522
530
log_error ! ( self . logger, "Failed to access payment store: {}" , e) ;
@@ -538,6 +546,7 @@ where
538
546
hex_utils:: to_string( & payment_hash. 0 ) ,
539
547
amount_msat,
540
548
) ;
549
+ let payment_id = PaymentId ( payment_hash. 0 ) ;
541
550
match purpose {
542
551
PaymentPurpose :: Bolt11InvoicePayment {
543
552
payment_preimage,
@@ -549,7 +558,7 @@ where
549
558
secret : Some ( Some ( payment_secret) ) ,
550
559
amount_msat : Some ( Some ( amount_msat) ) ,
551
560
status : Some ( PaymentStatus :: Succeeded ) ,
552
- ..PaymentDetailsUpdate :: new ( payment_hash )
561
+ ..PaymentDetailsUpdate :: new ( payment_id )
553
562
} ;
554
563
match self . payment_store . update ( & update) {
555
564
Ok ( true ) => ( ) ,
@@ -591,14 +600,16 @@ where
591
600
return ;
592
601
} ,
593
602
PaymentPurpose :: SpontaneousPayment ( preimage) => {
594
- let payment = PaymentDetails {
595
- preimage : Some ( preimage) ,
603
+ let kind = PaymentKind :: Spontaneous {
596
604
hash : payment_hash,
597
- secret : None ,
605
+ preimage : Some ( preimage) ,
606
+ } ;
607
+ let payment = PaymentDetails {
608
+ id : payment_id,
609
+ kind,
598
610
amount_msat : Some ( amount_msat) ,
599
611
direction : PaymentDirection :: Inbound ,
600
612
status : PaymentStatus :: Succeeded ,
601
- lsp_fee_limits : None ,
602
613
} ;
603
614
604
615
match self . payment_store . insert ( payment) {
@@ -631,14 +642,32 @@ where
631
642
panic ! ( "Failed to push to event queue" ) ;
632
643
} ) ;
633
644
} ,
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| {
642
671
log_info ! (
643
672
self . logger,
644
673
"Successfully sent payment of {}msat{} from \
@@ -652,15 +681,16 @@ where
652
681
hex_utils:: to_string( & payment_hash. 0 ) ,
653
682
hex_utils:: to_string( & payment_preimage. 0 )
654
683
) ;
655
- }
684
+ } ) ;
685
+
656
686
self . event_queue
657
687
. add_event ( Event :: PaymentSuccessful { payment_hash, fee_paid_msat } )
658
688
. unwrap_or_else ( |e| {
659
689
log_error ! ( self . logger, "Failed to push to event queue: {}" , e) ;
660
690
panic ! ( "Failed to push to event queue" ) ;
661
691
} ) ;
662
692
} ,
663
- LdkEvent :: PaymentFailed { payment_hash, reason, .. } => {
693
+ LdkEvent :: PaymentFailed { payment_id , payment_hash, reason, .. } => {
664
694
log_info ! (
665
695
self . logger,
666
696
"Failed to send payment to payment hash {:?} due to {:?}." ,
@@ -670,7 +700,7 @@ where
670
700
671
701
let update = PaymentDetailsUpdate {
672
702
status : Some ( PaymentStatus :: Failed ) ,
673
- ..PaymentDetailsUpdate :: new ( payment_hash )
703
+ ..PaymentDetailsUpdate :: new ( payment_id )
674
704
} ;
675
705
self . payment_store . update ( & update) . unwrap_or_else ( |e| {
676
706
log_error ! ( self . logger, "Failed to access payment store: {}" , e) ;
0 commit comments