Skip to content

Commit fd483ae

Browse files
committed
Remove Option from InvoiceRequest::amount_msats
If an InvoiceRequest::amount_msats is None, the expected amount can be determined by the offer. Remove Option from the its return type and use the value from the offer instead, taking into account the quantity. Note, InvoiceRequest::amount_msats must be set if the offer uses an Amount::Currency.
1 parent 776bd30 commit fd483ae

File tree

1 file changed

+29
-8
lines changed

1 file changed

+29
-8
lines changed

lightning/src/offers/invoice_request.rs

+29-8
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ use crate::io;
6060
use crate::ln::features::InvoiceRequestFeatures;
6161
use crate::ln::msgs::DecodeError;
6262
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};
6464
use crate::offers::parse::{ParseError, ParsedMessage, SemanticError};
6565
use crate::offers::payer::{PayerContents, PayerTlvStream, PayerTlvStreamRef};
6666
use 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

Comments
 (0)