@@ -215,10 +215,13 @@ pub const DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA: u64 = 18;
215
215
/// * `D`: exactly one `Description` or `DescriptionHash`
216
216
/// * `H`: exactly one `PaymentHash`
217
217
/// * `T`: the timestamp is set
218
+ /// * `C`: the CLTV expiry is set
219
+ /// * `S`: the payment secret is set
220
+ /// * `M`: payment metadata is set
218
221
///
219
222
/// This is not exported to bindings users as we likely need to manually select one set of boolean type parameters.
220
223
#[ derive( Eq , PartialEq , Debug , Clone ) ]
221
- pub struct InvoiceBuilder < D : tb:: Bool , H : tb:: Bool , T : tb:: Bool , C : tb:: Bool , S : tb:: Bool > {
224
+ pub struct InvoiceBuilder < D : tb:: Bool , H : tb:: Bool , T : tb:: Bool , C : tb:: Bool , S : tb:: Bool , M : tb :: Bool > {
222
225
currency : Currency ,
223
226
amount : Option < u64 > ,
224
227
si_prefix : Option < SiPrefix > ,
@@ -231,6 +234,7 @@ pub struct InvoiceBuilder<D: tb::Bool, H: tb::Bool, T: tb::Bool, C: tb::Bool, S:
231
234
phantom_t : core:: marker:: PhantomData < T > ,
232
235
phantom_c : core:: marker:: PhantomData < C > ,
233
236
phantom_s : core:: marker:: PhantomData < S > ,
237
+ phantom_m : core:: marker:: PhantomData < M > ,
234
238
}
235
239
236
240
/// Represents a syntactically and semantically correct lightning BOLT11 invoice.
@@ -484,7 +488,7 @@ pub mod constants {
484
488
pub const TAG_FEATURES : u8 = 5 ;
485
489
}
486
490
487
- impl InvoiceBuilder < tb:: False , tb:: False , tb:: False , tb:: False , tb:: False > {
491
+ impl InvoiceBuilder < tb:: False , tb:: False , tb:: False , tb:: False , tb:: False , tb :: False > {
488
492
/// Construct new, empty `InvoiceBuilder`. All necessary fields have to be filled first before
489
493
/// `InvoiceBuilder::build(self)` becomes available.
490
494
pub fn new ( currrency : Currency ) -> Self {
@@ -501,14 +505,15 @@ impl InvoiceBuilder<tb::False, tb::False, tb::False, tb::False, tb::False> {
501
505
phantom_t : core:: marker:: PhantomData ,
502
506
phantom_c : core:: marker:: PhantomData ,
503
507
phantom_s : core:: marker:: PhantomData ,
508
+ phantom_m : core:: marker:: PhantomData ,
504
509
}
505
510
}
506
511
}
507
512
508
- impl < D : tb:: Bool , H : tb:: Bool , T : tb:: Bool , C : tb:: Bool , S : tb:: Bool > InvoiceBuilder < D , H , T , C , S > {
513
+ impl < D : tb:: Bool , H : tb:: Bool , T : tb:: Bool , C : tb:: Bool , S : tb:: Bool , M : tb :: Bool > InvoiceBuilder < D , H , T , C , S , M > {
509
514
/// Helper function to set the completeness flags.
510
- fn set_flags < DN : tb:: Bool , HN : tb:: Bool , TN : tb:: Bool , CN : tb:: Bool , SN : tb:: Bool > ( self ) -> InvoiceBuilder < DN , HN , TN , CN , SN > {
511
- InvoiceBuilder :: < DN , HN , TN , CN , SN > {
515
+ fn set_flags < DN : tb:: Bool , HN : tb:: Bool , TN : tb:: Bool , CN : tb:: Bool , SN : tb:: Bool , MN : tb :: Bool > ( self ) -> InvoiceBuilder < DN , HN , TN , CN , SN , MN > {
516
+ InvoiceBuilder :: < DN , HN , TN , CN , SN , MN > {
512
517
currency : self . currency ,
513
518
amount : self . amount ,
514
519
si_prefix : self . si_prefix ,
@@ -521,6 +526,7 @@ impl<D: tb::Bool, H: tb::Bool, T: tb::Bool, C: tb::Bool, S: tb::Bool> InvoiceBui
521
526
phantom_t : core:: marker:: PhantomData ,
522
527
phantom_c : core:: marker:: PhantomData ,
523
528
phantom_s : core:: marker:: PhantomData ,
529
+ phantom_m : core:: marker:: PhantomData ,
524
530
}
525
531
}
526
532
@@ -565,7 +571,7 @@ impl<D: tb::Bool, H: tb::Bool, T: tb::Bool, C: tb::Bool, S: tb::Bool> InvoiceBui
565
571
}
566
572
}
567
573
568
- impl < D : tb:: Bool , H : tb:: Bool , C : tb:: Bool , S : tb:: Bool > InvoiceBuilder < D , H , tb:: True , C , S > {
574
+ impl < D : tb:: Bool , H : tb:: Bool , C : tb:: Bool , S : tb:: Bool , M : tb :: Bool > InvoiceBuilder < D , H , tb:: True , C , S , M > {
569
575
/// Builds a `RawInvoice` if no `CreationError` occurred while construction any of the fields.
570
576
pub fn build_raw ( self ) -> Result < RawInvoice , CreationError > {
571
577
@@ -598,9 +604,9 @@ impl<D: tb::Bool, H: tb::Bool, C: tb::Bool, S: tb::Bool> InvoiceBuilder<D, H, tb
598
604
}
599
605
}
600
606
601
- impl < H : tb:: Bool , T : tb:: Bool , C : tb:: Bool , S : tb:: Bool > InvoiceBuilder < tb:: False , H , T , C , S > {
607
+ impl < H : tb:: Bool , T : tb:: Bool , C : tb:: Bool , S : tb:: Bool , M : tb :: Bool > InvoiceBuilder < tb:: False , H , T , C , S , M > {
602
608
/// Set the description. This function is only available if no description (hash) was set.
603
- pub fn description ( mut self , description : String ) -> InvoiceBuilder < tb:: True , H , T , C , S > {
609
+ pub fn description ( mut self , description : String ) -> InvoiceBuilder < tb:: True , H , T , C , S , M > {
604
610
match Description :: new ( description) {
605
611
Ok ( d) => self . tagged_fields . push ( TaggedField :: Description ( d) ) ,
606
612
Err ( e) => self . error = Some ( e) ,
@@ -609,7 +615,7 @@ impl<H: tb::Bool, T: tb::Bool, C: tb::Bool, S: tb::Bool> InvoiceBuilder<tb::Fals
609
615
}
610
616
611
617
/// Set the description hash. This function is only available if no description (hash) was set.
612
- pub fn description_hash ( mut self , description_hash : sha256:: Hash ) -> InvoiceBuilder < tb:: True , H , T , C , S > {
618
+ pub fn description_hash ( mut self , description_hash : sha256:: Hash ) -> InvoiceBuilder < tb:: True , H , T , C , S , M > {
613
619
self . tagged_fields . push ( TaggedField :: DescriptionHash ( Sha256 ( description_hash) ) ) ;
614
620
self . set_flags ( )
615
621
}
@@ -627,18 +633,18 @@ impl<H: tb::Bool, T: tb::Bool, C: tb::Bool, S: tb::Bool> InvoiceBuilder<tb::Fals
627
633
}
628
634
}
629
635
630
- impl < D : tb:: Bool , T : tb:: Bool , C : tb:: Bool , S : tb:: Bool > InvoiceBuilder < D , tb:: False , T , C , S > {
636
+ impl < D : tb:: Bool , T : tb:: Bool , C : tb:: Bool , S : tb:: Bool , M : tb :: Bool > InvoiceBuilder < D , tb:: False , T , C , S , M > {
631
637
/// Set the payment hash. This function is only available if no payment hash was set.
632
- pub fn payment_hash ( mut self , hash : sha256:: Hash ) -> InvoiceBuilder < D , tb:: True , T , C , S > {
638
+ pub fn payment_hash ( mut self , hash : sha256:: Hash ) -> InvoiceBuilder < D , tb:: True , T , C , S , M > {
633
639
self . tagged_fields . push ( TaggedField :: PaymentHash ( Sha256 ( hash) ) ) ;
634
640
self . set_flags ( )
635
641
}
636
642
}
637
643
638
- impl < D : tb:: Bool , H : tb:: Bool , C : tb:: Bool , S : tb:: Bool > InvoiceBuilder < D , H , tb:: False , C , S > {
644
+ impl < D : tb:: Bool , H : tb:: Bool , C : tb:: Bool , S : tb:: Bool , M : tb :: Bool > InvoiceBuilder < D , H , tb:: False , C , S , M > {
639
645
/// Sets the timestamp to a specific [`SystemTime`].
640
646
#[ cfg( feature = "std" ) ]
641
- pub fn timestamp ( mut self , time : SystemTime ) -> InvoiceBuilder < D , H , tb:: True , C , S > {
647
+ pub fn timestamp ( mut self , time : SystemTime ) -> InvoiceBuilder < D , H , tb:: True , C , S , M > {
642
648
match PositiveTimestamp :: from_system_time ( time) {
643
649
Ok ( t) => self . timestamp = Some ( t) ,
644
650
Err ( e) => self . error = Some ( e) ,
@@ -649,7 +655,7 @@ impl<D: tb::Bool, H: tb::Bool, C: tb::Bool, S: tb::Bool> InvoiceBuilder<D, H, tb
649
655
650
656
/// Sets the timestamp to a duration since the Unix epoch, dropping the subsecond part (which
651
657
/// is not representable in BOLT 11 invoices).
652
- pub fn duration_since_epoch ( mut self , time : Duration ) -> InvoiceBuilder < D , H , tb:: True , C , S > {
658
+ pub fn duration_since_epoch ( mut self , time : Duration ) -> InvoiceBuilder < D , H , tb:: True , C , S , M > {
653
659
match PositiveTimestamp :: from_duration_since_epoch ( time) {
654
660
Ok ( t) => self . timestamp = Some ( t) ,
655
661
Err ( e) => self . error = Some ( e) ,
@@ -660,34 +666,81 @@ impl<D: tb::Bool, H: tb::Bool, C: tb::Bool, S: tb::Bool> InvoiceBuilder<D, H, tb
660
666
661
667
/// Sets the timestamp to the current system time.
662
668
#[ cfg( feature = "std" ) ]
663
- pub fn current_timestamp ( mut self ) -> InvoiceBuilder < D , H , tb:: True , C , S > {
669
+ pub fn current_timestamp ( mut self ) -> InvoiceBuilder < D , H , tb:: True , C , S , M > {
664
670
let now = PositiveTimestamp :: from_system_time ( SystemTime :: now ( ) ) ;
665
671
self . timestamp = Some ( now. expect ( "for the foreseeable future this shouldn't happen" ) ) ;
666
672
self . set_flags ( )
667
673
}
668
674
}
669
675
670
- impl < D : tb:: Bool , H : tb:: Bool , T : tb:: Bool , S : tb:: Bool > InvoiceBuilder < D , H , T , tb:: False , S > {
676
+ impl < D : tb:: Bool , H : tb:: Bool , T : tb:: Bool , S : tb:: Bool , M : tb :: Bool > InvoiceBuilder < D , H , T , tb:: False , S , M > {
671
677
/// Sets `min_final_cltv_expiry_delta`.
672
- pub fn min_final_cltv_expiry_delta ( mut self , min_final_cltv_expiry_delta : u64 ) -> InvoiceBuilder < D , H , T , tb:: True , S > {
678
+ pub fn min_final_cltv_expiry_delta ( mut self , min_final_cltv_expiry_delta : u64 ) -> InvoiceBuilder < D , H , T , tb:: True , S , M > {
673
679
self . tagged_fields . push ( TaggedField :: MinFinalCltvExpiryDelta ( MinFinalCltvExpiryDelta ( min_final_cltv_expiry_delta) ) ) ;
674
680
self . set_flags ( )
675
681
}
676
682
}
677
683
678
- impl < D : tb:: Bool , H : tb:: Bool , T : tb:: Bool , C : tb:: Bool > InvoiceBuilder < D , H , T , C , tb:: False > {
684
+ impl < D : tb:: Bool , H : tb:: Bool , T : tb:: Bool , C : tb:: Bool , M : tb :: Bool > InvoiceBuilder < D , H , T , C , tb:: False , M > {
679
685
/// Sets the payment secret and relevant features.
680
- pub fn payment_secret ( mut self , payment_secret : PaymentSecret ) -> InvoiceBuilder < D , H , T , C , tb:: True > {
681
- let mut features = InvoiceFeatures :: empty ( ) ;
682
- features. set_variable_length_onion_required ( ) ;
683
- features. set_payment_secret_required ( ) ;
686
+ pub fn payment_secret ( mut self , payment_secret : PaymentSecret ) -> InvoiceBuilder < D , H , T , C , tb:: True , M > {
687
+ let mut found_features = false ;
688
+ for field in self . tagged_fields . iter_mut ( ) {
689
+ if let TaggedField :: Features ( f) = field {
690
+ found_features = true ;
691
+ f. set_variable_length_onion_required ( ) ;
692
+ f. set_payment_secret_required ( ) ;
693
+ }
694
+ }
684
695
self . tagged_fields . push ( TaggedField :: PaymentSecret ( payment_secret) ) ;
685
- self . tagged_fields . push ( TaggedField :: Features ( features) ) ;
696
+ if !found_features {
697
+ let mut features = InvoiceFeatures :: empty ( ) ;
698
+ features. set_variable_length_onion_required ( ) ;
699
+ features. set_payment_secret_required ( ) ;
700
+ self . tagged_fields . push ( TaggedField :: Features ( features) ) ;
701
+ }
702
+ self . set_flags ( )
703
+ }
704
+ }
705
+
706
+ impl < D : tb:: Bool , H : tb:: Bool , T : tb:: Bool , C : tb:: Bool , S : tb:: Bool > InvoiceBuilder < D , H , T , C , S , tb:: False > {
707
+ /// Sets the payment metadata.
708
+ ///
709
+ /// By default features are set to *optionally* allow the sender to include the payment metadata.
710
+ /// If you wish to require that the sender include the metadata (and fail to parse the invoice if
711
+ /// they don't support payment metadata fields), you need to call
712
+ /// [`InvoiceBuilder::require_payment_metadata`] after this.
713
+ pub fn payment_metadata ( mut self , payment_metadata : Vec < u8 > ) -> InvoiceBuilder < D , H , T , C , S , tb:: True > {
714
+ self . tagged_fields . push ( TaggedField :: PaymentMetadata ( payment_metadata) ) ;
715
+ let mut found_features = false ;
716
+ for field in self . tagged_fields . iter_mut ( ) {
717
+ if let TaggedField :: Features ( f) = field {
718
+ found_features = true ;
719
+ f. set_payment_metadata_optional ( ) ;
720
+ }
721
+ }
722
+ if !found_features {
723
+ let mut features = InvoiceFeatures :: empty ( ) ;
724
+ features. set_payment_metadata_optional ( ) ;
725
+ self . tagged_fields . push ( TaggedField :: Features ( features) ) ;
726
+ }
686
727
self . set_flags ( )
687
728
}
688
729
}
689
730
690
- impl < D : tb:: Bool , H : tb:: Bool , T : tb:: Bool , C : tb:: Bool > InvoiceBuilder < D , H , T , C , tb:: True > {
731
+ impl < D : tb:: Bool , H : tb:: Bool , T : tb:: Bool , C : tb:: Bool , S : tb:: Bool > InvoiceBuilder < D , H , T , C , S , tb:: True > {
732
+ /// Sets the payment secret and relevant features.
733
+ pub fn require_payment_metadata ( mut self ) -> InvoiceBuilder < D , H , T , C , S , tb:: True > {
734
+ for field in self . tagged_fields . iter_mut ( ) {
735
+ if let TaggedField :: Features ( f) = field {
736
+ f. set_payment_metadata_required ( ) ;
737
+ }
738
+ }
739
+ self
740
+ }
741
+ }
742
+
743
+ impl < D : tb:: Bool , H : tb:: Bool , T : tb:: Bool , C : tb:: Bool , M : tb:: Bool > InvoiceBuilder < D , H , T , C , tb:: True , M > {
691
744
/// Sets the `basic_mpp` feature as optional.
692
745
pub fn basic_mpp ( mut self ) -> Self {
693
746
for field in self . tagged_fields . iter_mut ( ) {
@@ -699,7 +752,7 @@ impl<D: tb::Bool, H: tb::Bool, T: tb::Bool, C: tb::Bool> InvoiceBuilder<D, H, T,
699
752
}
700
753
}
701
754
702
- impl InvoiceBuilder < tb:: True , tb:: True , tb:: True , tb:: True , tb:: True > {
755
+ impl < M : tb :: Bool > InvoiceBuilder < tb:: True , tb:: True , tb:: True , tb:: True , tb:: True , M > {
703
756
/// Builds and signs an invoice using the supplied `sign_function`. This function MAY NOT fail
704
757
/// and MUST produce a recoverable signature valid for the given hash and if applicable also for
705
758
/// the included payee public key.
0 commit comments