@@ -60,7 +60,7 @@ use crate::io;
60
60
use crate :: ln:: features:: InvoiceRequestFeatures ;
61
61
use crate :: ln:: msgs:: DecodeError ;
62
62
use crate :: offers:: merkle:: { SignError , SignatureTlvStream , SignatureTlvStreamRef , self } ;
63
- use crate :: offers:: offer:: { Offer , OfferContents , OfferTlvStream , OfferTlvStreamRef } ;
63
+ use crate :: offers:: offer:: { Amount , Offer , OfferContents , OfferTlvStream , OfferTlvStreamRef } ;
64
64
use crate :: offers:: parse:: { ParseError , ParsedMessage , SemanticError } ;
65
65
use crate :: offers:: payer:: { PayerContents , PayerTlvStream , PayerTlvStreamRef } ;
66
66
use crate :: util:: ser:: { HighZeroBytesDroppedBigSize , SeekReadable , WithoutLength , Writeable , Writer } ;
@@ -283,8 +283,17 @@ impl InvoiceRequest {
283
283
/// must be greater than or equal to [`Offer::amount`], converted if necessary.
284
284
///
285
285
/// [`chain`]: Self::chain
286
- pub fn amount_msats ( & self ) -> Option < u64 > {
286
+ pub fn amount_msats ( & self ) -> u64 {
287
287
self . contents . amount_msats
288
+ . unwrap_or_else ( || {
289
+ let offer_amount_msats = match self . contents . offer . amount ( ) {
290
+ None => 0 ,
291
+ Some ( & Amount :: Bitcoin { amount_msats } ) => amount_msats,
292
+ Some ( & Amount :: Currency { .. } ) => unreachable ! ( ) ,
293
+ } ;
294
+
295
+ offer_amount_msats * self . quantity ( ) . unwrap_or ( 1 )
296
+ } )
288
297
}
289
298
290
299
/// Features pertaining to requesting an invoice.
@@ -533,7 +542,7 @@ mod tests {
533
542
assert_eq ! ( invoice_request. bytes, buffer. as_slice( ) ) ;
534
543
assert_eq ! ( invoice_request. metadata( ) , & [ 1 ; 32 ] ) ;
535
544
assert_eq ! ( invoice_request. chain( ) , ChainHash :: using_genesis_block( Network :: Bitcoin ) ) ;
536
- assert_eq ! ( invoice_request. amount_msats( ) , None ) ;
545
+ assert_eq ! ( invoice_request. amount_msats( ) , 1000 ) ;
537
546
assert_eq ! ( invoice_request. features( ) , & InvoiceRequestFeatures :: empty( ) ) ;
538
547
assert_eq ! ( invoice_request. quantity( ) , None ) ;
539
548
assert_eq ! ( invoice_request. payer_id( ) , payer_pubkey( ) ) ;
@@ -694,7 +703,7 @@ mod tests {
694
703
. build ( ) . unwrap ( )
695
704
. sign ( payer_sign) . unwrap ( ) ;
696
705
let ( _, _, tlv_stream, _) = invoice_request. as_tlv_stream ( ) ;
697
- assert_eq ! ( invoice_request. amount_msats( ) , Some ( 1000 ) ) ;
706
+ assert_eq ! ( invoice_request. amount_msats( ) , 1000 ) ;
698
707
assert_eq ! ( tlv_stream. amount, Some ( 1000 ) ) ;
699
708
700
709
let invoice_request = OfferBuilder :: new ( "foo" . into ( ) , recipient_pubkey ( ) )
@@ -706,7 +715,7 @@ mod tests {
706
715
. build ( ) . unwrap ( )
707
716
. sign ( payer_sign) . unwrap ( ) ;
708
717
let ( _, _, tlv_stream, _) = invoice_request. as_tlv_stream ( ) ;
709
- assert_eq ! ( invoice_request. amount_msats( ) , Some ( 1000 ) ) ;
718
+ assert_eq ! ( invoice_request. amount_msats( ) , 1000 ) ;
710
719
assert_eq ! ( tlv_stream. amount, Some ( 1000 ) ) ;
711
720
712
721
let invoice_request = OfferBuilder :: new ( "foo" . into ( ) , recipient_pubkey ( ) )
@@ -717,7 +726,7 @@ mod tests {
717
726
. build ( ) . unwrap ( )
718
727
. sign ( payer_sign) . unwrap ( ) ;
719
728
let ( _, _, tlv_stream, _) = invoice_request. as_tlv_stream ( ) ;
720
- assert_eq ! ( invoice_request. amount_msats( ) , Some ( 1001 ) ) ;
729
+ assert_eq ! ( invoice_request. amount_msats( ) , 1001 ) ;
721
730
assert_eq ! ( tlv_stream. amount, Some ( 1001 ) ) ;
722
731
723
732
match OfferBuilder :: new ( "foo" . into ( ) , recipient_pubkey ( ) )
@@ -838,9 +847,21 @@ mod tests {
838
847
. build ( ) . unwrap ( )
839
848
. sign ( payer_sign) . unwrap ( ) ;
840
849
let ( _, _, tlv_stream, _) = invoice_request. as_tlv_stream ( ) ;
841
- assert_eq ! ( invoice_request. amount_msats( ) , Some ( 10_000 ) ) ;
850
+ assert_eq ! ( invoice_request. amount_msats( ) , 10_000 ) ;
842
851
assert_eq ! ( tlv_stream. amount, Some ( 10_000 ) ) ;
843
852
853
+ let invoice_request = OfferBuilder :: new ( "foo" . into ( ) , recipient_pubkey ( ) )
854
+ . amount_msats ( 1000 )
855
+ . supported_quantity ( Quantity :: Bounded ( ten) )
856
+ . build ( ) . unwrap ( )
857
+ . request_invoice ( vec ! [ 1 ; 32 ] , payer_pubkey ( ) ) . unwrap ( )
858
+ . quantity ( 10 ) . unwrap ( )
859
+ . build ( ) . unwrap ( )
860
+ . sign ( payer_sign) . unwrap ( ) ;
861
+ let ( _, _, tlv_stream, _) = invoice_request. as_tlv_stream ( ) ;
862
+ assert_eq ! ( invoice_request. amount_msats( ) , 10_000 ) ;
863
+ assert_eq ! ( tlv_stream. amount, None ) ;
864
+
844
865
match OfferBuilder :: new ( "foo" . into ( ) , recipient_pubkey ( ) )
845
866
. amount_msats ( 1000 )
846
867
. supported_quantity ( Quantity :: Bounded ( ten) )
@@ -863,7 +884,7 @@ mod tests {
863
884
. build ( ) . unwrap ( )
864
885
. sign ( payer_sign) . unwrap ( ) ;
865
886
let ( _, _, tlv_stream, _) = invoice_request. as_tlv_stream ( ) ;
866
- assert_eq ! ( invoice_request. amount_msats( ) , Some ( 2_000 ) ) ;
887
+ assert_eq ! ( invoice_request. amount_msats( ) , 2_000 ) ;
867
888
assert_eq ! ( tlv_stream. amount, Some ( 2_000 ) ) ;
868
889
869
890
match OfferBuilder :: new ( "foo" . into ( ) , recipient_pubkey ( ) )
0 commit comments