@@ -60,7 +60,7 @@ use crate::io;
6060use crate :: ln:: features:: InvoiceRequestFeatures ;
6161use crate :: ln:: msgs:: DecodeError ;
6262use 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 } ;
6464use crate :: offers:: parse:: { ParseError , ParsedMessage , SemanticError } ;
6565use crate :: offers:: payer:: { PayerContents , PayerTlvStream , PayerTlvStreamRef } ;
6666use crate :: util:: ser:: { HighZeroBytesDroppedBigSize , SeekReadable , WithoutLength , Writeable , Writer } ;
@@ -283,8 +283,17 @@ impl InvoiceRequest {
283283 /// must be greater than or equal to [`Offer::amount`], converted if necessary.
284284 ///
285285 /// [`chain`]: Self::chain
286- pub fn amount_msats ( & self ) -> Option < u64 > {
286+ pub fn amount_msats ( & self ) -> u64 {
287287 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+ } )
288297 }
289298
290299 /// Features pertaining to requesting an invoice.
@@ -533,7 +542,7 @@ mod tests {
533542 assert_eq ! ( invoice_request. bytes, buffer. as_slice( ) ) ;
534543 assert_eq ! ( invoice_request. metadata( ) , & [ 1 ; 32 ] ) ;
535544 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 ) ;
537546 assert_eq ! ( invoice_request. features( ) , & InvoiceRequestFeatures :: empty( ) ) ;
538547 assert_eq ! ( invoice_request. quantity( ) , None ) ;
539548 assert_eq ! ( invoice_request. payer_id( ) , payer_pubkey( ) ) ;
@@ -694,7 +703,7 @@ mod tests {
694703 . build ( ) . unwrap ( )
695704 . sign ( payer_sign) . unwrap ( ) ;
696705 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 ) ;
698707 assert_eq ! ( tlv_stream. amount, Some ( 1000 ) ) ;
699708
700709 let invoice_request = OfferBuilder :: new ( "foo" . into ( ) , recipient_pubkey ( ) )
@@ -706,7 +715,7 @@ mod tests {
706715 . build ( ) . unwrap ( )
707716 . sign ( payer_sign) . unwrap ( ) ;
708717 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 ) ;
710719 assert_eq ! ( tlv_stream. amount, Some ( 1000 ) ) ;
711720
712721 let invoice_request = OfferBuilder :: new ( "foo" . into ( ) , recipient_pubkey ( ) )
@@ -717,7 +726,7 @@ mod tests {
717726 . build ( ) . unwrap ( )
718727 . sign ( payer_sign) . unwrap ( ) ;
719728 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 ) ;
721730 assert_eq ! ( tlv_stream. amount, Some ( 1001 ) ) ;
722731
723732 match OfferBuilder :: new ( "foo" . into ( ) , recipient_pubkey ( ) )
@@ -838,9 +847,21 @@ mod tests {
838847 . build ( ) . unwrap ( )
839848 . sign ( payer_sign) . unwrap ( ) ;
840849 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 ) ;
842851 assert_eq ! ( tlv_stream. amount, Some ( 10_000 ) ) ;
843852
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+
844865 match OfferBuilder :: new ( "foo" . into ( ) , recipient_pubkey ( ) )
845866 . amount_msats ( 1000 )
846867 . supported_quantity ( Quantity :: Bounded ( ten) )
@@ -863,7 +884,7 @@ mod tests {
863884 . build ( ) . unwrap ( )
864885 . sign ( payer_sign) . unwrap ( ) ;
865886 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 ) ;
867888 assert_eq ! ( tlv_stream. amount, Some ( 2_000 ) ) ;
868889
869890 match OfferBuilder :: new ( "foo" . into ( ) , recipient_pubkey ( ) )
0 commit comments