Skip to content

Commit 7bfb39f

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 7d407f8 commit 7bfb39f

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, SemanticError};
63+
use crate::offers::parse::{Bech32Encode, ParseError, 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)
@@ -355,6 +362,10 @@ tlv_stream!(InvoiceRequestTlvStream, InvoiceRequestTlvStreamRef, 80..160, {
355362

356363
try_from_tlv_stream_bytes!(FullInvoiceRequestTlvStream, ParsedInvoiceRequest);
357364

365+
impl Bech32Encode for InvoiceRequest {
366+
const BECH32_HRP: &'static str = "lnr";
367+
}
368+
358369
struct ParsedInvoiceRequest(Vec<u8>, FullInvoiceRequestTlvStream);
359370

360371
type FullInvoiceRequestTlvStream =
@@ -379,6 +390,14 @@ type PartialInvoiceRequestTlvStreamRef<'a> = (
379390
InvoiceRequestTlvStreamRef<'a>,
380391
);
381392

393+
impl FromStr for InvoiceRequest {
394+
type Err = ParseError;
395+
396+
fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
397+
InvoiceRequest::from_bech32_str(s)
398+
}
399+
}
400+
382401
impl TryFrom<ParsedInvoiceRequest> for InvoiceRequest {
383402
type Error = ParseError;
384403

@@ -462,6 +481,12 @@ impl TryFrom<PartialInvoiceRequestTlvStream> for InvoiceRequestContents {
462481
}
463482
}
464483

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

0 commit comments

Comments
 (0)