Skip to content

Commit b8601f4

Browse files
committed
Invoice request parsing from bech32 strings
Implement Bech32Encode for InvoiceRequest, which supports creating and parsing QR codes for the merchant-pays-user (e.g., refund, ATM) flow.
1 parent 2cb1ef7 commit b8601f4

File tree

1 file changed

+26
-1
lines changed

1 file changed

+26
-1
lines changed

lightning/src/offers/invoice_request.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,13 @@ use bitcoin::network::constants::Network;
5454
use bitcoin::secp256k1::{Message, PublicKey, self};
5555
use bitcoin::secp256k1::schnorr::Signature;
5656
use core::convert::TryFrom;
57+
use core::str::FromStr;
5758
use crate::io;
5859
use crate::ln::features::OfferFeatures;
5960
use crate::ln::msgs::DecodeError;
6061
use crate::offers::merkle::{SignatureTlvStream, SignatureTlvStreamRef, self};
6162
use crate::offers::offer::{Amount, Offer, OfferContents, OfferTlvStream, OfferTlvStreamRef, SendInvoiceOfferContents};
62-
use crate::offers::parse::{ParseError, ParsedMessage, SemanticError};
63+
use crate::offers::parse::{Bech32Encode, ParseError, ParsedMessage, SemanticError};
6364
use crate::offers::payer::{PayerContents, PayerTlvStream, PayerTlvStreamRef};
6465
use crate::util::ser::{HighZeroBytesDroppedBigSize, SeekReadable, WithoutLength, Writeable, Writer};
6566

@@ -323,6 +324,12 @@ impl InvoiceRequestContents {
323324
}
324325
}
325326

327+
impl AsRef<[u8]> for InvoiceRequest {
328+
fn as_ref(&self) -> &[u8] {
329+
&self.bytes
330+
}
331+
}
332+
326333
impl Writeable for InvoiceRequest {
327334
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
328335
WithoutLength(&self.bytes).write(writer)
@@ -353,6 +360,10 @@ tlv_stream!(InvoiceRequestTlvStream, InvoiceRequestTlvStreamRef, 80..160, {
353360
(89, payer_note: (String, WithoutLength)),
354361
});
355362

363+
impl Bech32Encode for InvoiceRequest {
364+
const BECH32_HRP: &'static str = "lnr";
365+
}
366+
356367
type FullInvoiceRequestTlvStream =
357368
(PayerTlvStream, OfferTlvStream, InvoiceRequestTlvStream, SignatureTlvStream);
358369

@@ -375,6 +386,14 @@ type PartialInvoiceRequestTlvStreamRef<'a> = (
375386
InvoiceRequestTlvStreamRef<'a>,
376387
);
377388

389+
impl FromStr for InvoiceRequest {
390+
type Err = ParseError;
391+
392+
fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
393+
InvoiceRequest::from_bech32_str(s)
394+
}
395+
}
396+
378397
impl TryFrom<ParsedMessage<FullInvoiceRequestTlvStream>> for InvoiceRequest {
379398
type Error = ParseError;
380399

@@ -460,6 +479,12 @@ impl TryFrom<PartialInvoiceRequestTlvStream> for InvoiceRequestContents {
460479
}
461480
}
462481

482+
impl core::fmt::Display for InvoiceRequest {
483+
fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> {
484+
self.fmt_bech32_str(f)
485+
}
486+
}
487+
463488
#[cfg(test)]
464489
mod tests {
465490
use super::InvoiceRequest;

0 commit comments

Comments
 (0)