Skip to content

Commit 787bbdf

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 34a226e commit 787bbdf

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

@@ -317,6 +318,12 @@ impl InvoiceRequestContents {
317318
}
318319
}
319320

321+
impl AsRef<[u8]> for InvoiceRequest {
322+
fn as_ref(&self) -> &[u8] {
323+
&self.bytes
324+
}
325+
}
326+
320327
impl Writeable for InvoiceRequest {
321328
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
322329
WithoutLength(&self.bytes).write(writer)
@@ -349,6 +356,10 @@ tlv_stream!(InvoiceRequestTlvStream, InvoiceRequestTlvStreamRef, 80..160, {
349356

350357
try_from_tlv_stream_bytes!(FullInvoiceRequestTlvStream, ParsedInvoiceRequest);
351358

359+
impl Bech32Encode for InvoiceRequest {
360+
const BECH32_HRP: &'static str = "lnr";
361+
}
362+
352363
struct ParsedInvoiceRequest(Vec<u8>, FullInvoiceRequestTlvStream);
353364

354365
type FullInvoiceRequestTlvStream =
@@ -373,6 +384,14 @@ type PartialInvoiceRequestTlvStreamRef<'a> = (
373384
InvoiceRequestTlvStreamRef<'a>,
374385
);
375386

387+
impl FromStr for InvoiceRequest {
388+
type Err = ParseError;
389+
390+
fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
391+
InvoiceRequest::from_bech32_str(s)
392+
}
393+
}
394+
376395
impl TryFrom<ParsedInvoiceRequest> for InvoiceRequest {
377396
type Error = ParseError;
378397

@@ -457,6 +476,12 @@ impl TryFrom<PartialInvoiceRequestTlvStream> for InvoiceRequestContents {
457476
}
458477
}
459478

479+
impl core::fmt::Display for InvoiceRequest {
480+
fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> {
481+
self.fmt_bech32_str(f)
482+
}
483+
}
484+
460485
#[cfg(test)]
461486
mod tests {
462487
use super::InvoiceRequest;

0 commit comments

Comments
 (0)