@@ -4,7 +4,8 @@ use crate::{
4
4
} ;
5
5
6
6
use crate :: 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 ) => ( ) ,
@@ -592,13 +601,14 @@ where
592
601
} ,
593
602
PaymentPurpose :: SpontaneousPayment ( preimage) => {
594
603
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
+ } ,
598
609
amount_msat : Some ( amount_msat) ,
599
610
direction : PaymentDirection :: Inbound ,
600
611
status : PaymentStatus :: Succeeded ,
601
- lsp_fee_limits : None ,
602
612
} ;
603
613
604
614
match self . payment_store . insert ( payment) {
@@ -631,14 +641,32 @@ where
631
641
panic ! ( "Failed to push to event queue" ) ;
632
642
} ) ;
633
643
} ,
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| {
642
670
log_info ! (
643
671
self . logger,
644
672
"Successfully sent payment of {}msat{} from \
@@ -652,15 +680,16 @@ where
652
680
hex_utils:: to_string( & payment_hash. 0 ) ,
653
681
hex_utils:: to_string( & payment_preimage. 0 )
654
682
) ;
655
- }
683
+ } ) ;
684
+
656
685
self . event_queue
657
686
. add_event ( Event :: PaymentSuccessful { payment_hash, fee_paid_msat } )
658
687
. unwrap_or_else ( |e| {
659
688
log_error ! ( self . logger, "Failed to push to event queue: {}" , e) ;
660
689
panic ! ( "Failed to push to event queue" ) ;
661
690
} ) ;
662
691
} ,
663
- LdkEvent :: PaymentFailed { payment_hash, reason, .. } => {
692
+ LdkEvent :: PaymentFailed { payment_id , payment_hash, reason, .. } => {
664
693
log_info ! (
665
694
self . logger,
666
695
"Failed to send payment to payment hash {:?} due to {:?}." ,
@@ -670,7 +699,7 @@ where
670
699
671
700
let update = PaymentDetailsUpdate {
672
701
status : Some ( PaymentStatus :: Failed ) ,
673
- ..PaymentDetailsUpdate :: new ( payment_hash )
702
+ ..PaymentDetailsUpdate :: new ( payment_id )
674
703
} ;
675
704
self . payment_store . update ( & update) . unwrap_or_else ( |e| {
676
705
log_error ! ( self . logger, "Failed to access payment store: {}" , e) ;
0 commit comments