Skip to content

Commit 7384507

Browse files
committed
Refactor for clarity and improve error handling
This commit fixes a handful of minor comments/nits that include: - Updates to set the `bip21` crates default-features to false, to minimize dependencies. - Enable the `std` feature since we use/benefit from it. - In `receive` return `InvoiceCreationFailed` or `OfferCreationFailed` when creating an invoice or offer. Rather than silently logging the error. - Also in `receive` we first check if an amount is specified, and if not, return an error and abort. - Pass in `Config` to `UnifiedQrPayment` struct to use the users config network. - In `send` instead of checking each network for the `NetworkChecked` URI, we pass in the `Config::Network`. - Simplifed param parsing in `deserialize_temp` by directly finding the key and parsing the corresponding value. - General documentation fixes. - In parsing tests, moved longer invoice/offer strings into. variables that start with expected_ for clarity.
1 parent e8f9f2b commit 7384507

File tree

3 files changed

+70
-46
lines changed

3 files changed

+70
-46
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ reqwest = { version = "0.11", default-features = false, features = ["json", "rus
6161
rusqlite = { version = "0.28.0", features = ["bundled"] }
6262
bitcoin = "0.30.2"
6363
bip39 = "2.0.0"
64-
bip21 = "0.3.1"
64+
bip21 = { version = "0.3.1", features = ["std"], default-features = false }
6565

6666
rand = "0.8.5"
6767
chrono = { version = "0.4", default-features = false, features = ["clock"] }

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,6 +1085,7 @@ impl Node {
10851085
self.onchain_payment().into(),
10861086
self.bolt11_payment().into(),
10871087
self.bolt12_payment().into(),
1088+
Arc::clone(&self.config),
10881089
Arc::clone(&self.logger),
10891090
)
10901091
}
@@ -1099,6 +1100,7 @@ impl Node {
10991100
self.onchain_payment(),
11001101
self.bolt11_payment(),
11011102
self.bolt12_payment(),
1103+
Arc::clone(&self.config),
11021104
Arc::clone(&self.logger),
11031105
))
11041106
}

src/payment/unified_qr.rs

Lines changed: 67 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,17 @@
1616
use crate::error::Error;
1717
use crate::logger::{log_error, FilesystemLogger, Logger};
1818
use crate::payment::{Bolt11Payment, Bolt12Payment, OnchainPayment};
19+
use crate::Config;
1920

2021
use lightning::ln::channelmanager::PaymentId;
22+
use lightning::offers::offer::Offer;
2123
use lightning_invoice::Bolt11Invoice;
2224

23-
use bitcoin::address::{NetworkChecked, NetworkUnchecked};
24-
use bitcoin::{Amount, Network, Txid};
25-
2625
use bip21::de::ParamKind;
2726
use bip21::{DeserializationError, DeserializeParams, Param, SerializeParams};
28-
use lightning::offers::offer::Offer;
27+
use bitcoin::address::{NetworkChecked, NetworkUnchecked};
28+
use bitcoin::{Amount, Txid};
29+
2930
use std::sync::Arc;
3031
use std::vec::IntoIter;
3132

@@ -50,30 +51,40 @@ pub struct UnifiedQrPayment {
5051
onchain_payment: Arc<OnchainPayment>,
5152
bolt11_invoice: Arc<Bolt11Payment>,
5253
bolt12_payment: Arc<Bolt12Payment>,
54+
config: Arc<Config>,
5355
logger: Arc<FilesystemLogger>,
5456
}
5557

5658
impl UnifiedQrPayment {
5759
pub(crate) fn new(
5860
onchain_payment: Arc<OnchainPayment>, bolt11_invoice: Arc<Bolt11Payment>,
59-
bolt12_payment: Arc<Bolt12Payment>, logger: Arc<FilesystemLogger>,
61+
bolt12_payment: Arc<Bolt12Payment>, config: Arc<Config>, logger: Arc<FilesystemLogger>,
6062
) -> Self {
61-
Self { onchain_payment, bolt11_invoice, bolt12_payment, logger }
63+
Self { onchain_payment, bolt11_invoice, bolt12_payment, config, logger }
6264
}
6365

6466
/// Generates a URI with an on-chain address, [BOLT 11] invoice and [BOLT 12] offer.
6567
///
6668
/// The URI allows users to send the payment request allowing the wallet to decide
6769
/// which payment method to use. This enables a fallback mechanism: older wallets
6870
/// can always pay using the provided on-chain address, while newer wallets will
69-
/// typically opt to use the provided invoice.
71+
/// typically opt to use the provided BOLT11 invoice or BOLT12 offer.
72+
///
73+
/// # Parameters
74+
/// - `amount_sats`: The amount to be received, specified in satoshis.
75+
/// - `message`: A description or note associated with the payment.
76+
/// This message is visible to the payee and can provide context or details about the payment.
77+
/// - `expiry_sec`: The expiration time for the payment, specified in seconds.
7078
///
71-
/// Returns a URI `String` if successful or an `Error` if there was an issue generating
72-
/// the on-chain address or lightning invoice.
79+
/// # Return Value
80+
/// - **Success**: Returns a URI string.
81+
/// - **Error**: Returns an error if there was an issue generating the on-chain address or
82+
/// lightning invoice.
7383
///
74-
/// The error types that may be returned are:
84+
/// # Error Types
7585
/// - `Error::WalletOperationFailed` if there is an issue generating the on-chain address.
76-
/// - `Error::InvoiceCreationFailed` if there is an issue generating the BOLT 11 invoice.
86+
/// - `Error::InvoiceCreationFailed` if there is an issue generating the BOLT11 invoice.
87+
/// - `Error::OfferCreationFailed` if there is an issue generating the BOLT12 offer.
7788
///
7889
/// The generated URI can then be given to a QR code library.
7990
///
@@ -90,15 +101,15 @@ impl UnifiedQrPayment {
90101
Ok(offer) => Some(offer),
91102
Err(e) => {
92103
log_error!(self.logger, "Failed to create offer: {}", e);
93-
None
104+
return Err(Error::OfferCreationFailed);
94105
},
95106
};
96107

97108
let bolt11_invoice = match self.bolt11_invoice.receive(amount_msats, message, expiry_sec) {
98109
Ok(invoice) => Some(invoice),
99110
Err(e) => {
100111
log_error!(self.logger, "Failed to create invoice {}", e);
101-
None
112+
return Err(Error::InvoiceCreationFailed);
102113
},
103114
};
104115

@@ -124,36 +135,39 @@ impl UnifiedQrPayment {
124135
let uri: bip21::Uri<NetworkUnchecked, Extras> =
125136
uri_str.parse().map_err(|_| Error::InvalidUri)?;
126137

127-
let uri = uri
128-
.clone()
129-
.require_network(Network::Bitcoin)
130-
.or_else(|_| uri.clone().require_network(Network::Testnet))
131-
.or_else(|_| uri.clone().require_network(Network::Regtest))
132-
.or_else(|_| uri.clone().require_network(Network::Signet))
133-
.map_err(|_| Error::InvalidNetwork)?;
138+
let uri_network_checked =
139+
uri.clone().require_network(self.config.network).map_err(|_| Error::InvalidNetwork)?;
134140

135-
if let Some(offer) = uri.extras.bolt12_offer {
141+
if let Some(offer) = uri_network_checked.extras.bolt12_offer {
136142
match self.bolt12_payment.send(&offer, None) {
137143
Ok(payment_id) => return Ok(QrPaymentResult::Bolt12 { payment_id }),
138-
Err(e) => log_error!(self.logger, "Failed to send BOLT12 offer: {:?}", e),
144+
Err(e) => log_error!(self.logger, "Failed to send BOLT12 offer: {:?}. This is part of a unified QR code payment. Falling back to the BOLT11 invoice.", e),
139145
}
140146
}
141147

142-
if let Some(invoice) = uri.extras.bolt11_invoice {
148+
if let Some(invoice) = uri_network_checked.extras.bolt11_invoice {
143149
match self.bolt11_invoice.send(&invoice) {
144150
Ok(payment_id) => return Ok(QrPaymentResult::Bolt11 { payment_id }),
145-
Err(e) => log_error!(self.logger, "Failed to send BOLT11 invoice: {:?}", e),
151+
Err(e) => log_error!(self.logger, "Failed to send BOLT11 invoice: {:?}. This is part of a unified QR code payment. Falling back to the on-chain transaction.", e),
146152
}
147153
}
148154

149-
let txid = self
150-
.onchain_payment
151-
.send_to_address(&uri.address, uri.amount.unwrap_or_default().to_sat())?;
155+
let amount = match uri_network_checked.amount {
156+
Some(amount) => amount,
157+
None => {
158+
log_error!(self.logger, "No amount specified in the URI. Aborting the payment.");
159+
return Err(Error::InvalidAmount);
160+
},
161+
};
162+
163+
let txid =
164+
self.onchain_payment.send_to_address(&uri_network_checked.address, amount.to_sat())?;
165+
152166
Ok(QrPaymentResult::Onchain { txid })
153167
}
154168
}
155169

156-
/// `QrPaymentResult` represents the result of a payment made using a [BIP 21] QR code.
170+
/// Represents the result of a payment made using a [BIP 21] QR code.
157171
///
158172
/// After a successful on-chain transaction, the transaction ID ([`Txid`]) is returned.
159173
/// For BOLT11 and BOLT12 payments, the corresponding [`PaymentId`] is returned.
@@ -246,22 +260,22 @@ impl<'a> bip21::de::DeserializationState<'a> for DeserializationState {
246260
"lightning" => {
247261
let bolt11_value =
248262
String::try_from(value).map_err(|_| Error::UriParameterParsingFailed)?;
249-
for param in bolt11_value.split('&') {
250-
if let Ok(invoice) = param.parse::<Bolt11Invoice>() {
251-
self.bolt11_invoice = Some(invoice);
252-
}
263+
if let Ok(invoice) = bolt11_value.parse::<Bolt11Invoice>() {
264+
self.bolt11_invoice = Some(invoice);
265+
Ok(bip21::de::ParamKind::Known)
266+
} else {
267+
Ok(bip21::de::ParamKind::Unknown)
253268
}
254-
Ok(bip21::de::ParamKind::Known)
255269
},
256270
"lno" => {
257271
let bolt12_value =
258272
String::try_from(value).map_err(|_| Error::UriParameterParsingFailed)?;
259-
for param in bolt12_value.split('&') {
260-
if let Ok(offer) = param.parse::<Offer>() {
261-
self.bolt12_offer = Some(offer);
262-
}
273+
if let Ok(offer) = bolt12_value.parse::<Offer>() {
274+
self.bolt12_offer = Some(offer);
275+
Ok(bip21::de::ParamKind::Known)
276+
} else {
277+
Ok(bip21::de::ParamKind::Unknown)
263278
}
264-
Ok(bip21::de::ParamKind::Known)
265279
},
266280
_ => Ok(bip21::de::ParamKind::Unknown),
267281
}
@@ -286,6 +300,7 @@ mod tests {
286300
#[test]
287301
fn parse_uri() {
288302
let uri_test1 = "BITCOIN:TB1QRSCD05XNY6QZ63TF9GJELGVK6D3UDJFEKK62VU?amount=1&message=Test%20message&lightning=LNTB1000M1PNXWM7MDQ523JHXAPQD4JHXUMPVAJSNP4QWP9QD2JFP8DUZ46JQG5LTKVDH04YG52G6UF2YAXP8H7YZPZM3DM5PP5KUP7YT429UP9Z4ACPA60R7WETSTL66549MG05P0JN0C4L2NCC40SSP5R0LH86DJCL0NK8HZHNZHX92VVUAAVNE48Z5RVKVY5DKTRQ0DMP7S9QYYSGQCQPCXQRRAQYR59FGN2VVC5R6DS0AZMETH493ZU56H0WSVMGYCW9LEPZ032PGQNZMQ6XKVEH90Z02C0NH3J5QGDAWCS2YC2ZNP22J0ZD0PPF78N4QQQEXTYS2";
303+
let expected_bolt11_invoice_1 = "LNTB1000M1PNXWM7MDQ523JHXAPQD4JHXUMPVAJSNP4QWP9QD2JFP8DUZ46JQG5LTKVDH04YG52G6UF2YAXP8H7YZPZM3DM5PP5KUP7YT429UP9Z4ACPA60R7WETSTL66549MG05P0JN0C4L2NCC40SSP5R0LH86DJCL0NK8HZHNZHX92VVUAAVNE48Z5RVKVY5DKTRQ0DMP7S9QYYSGQCQPCXQRRAQYR59FGN2VVC5R6DS0AZMETH493ZU56H0WSVMGYCW9LEPZ032PGQNZMQ6XKVEH90Z02C0NH3J5QGDAWCS2YC2ZNP22J0ZD0PPF78N4QQQEXTYS2";
289304
let parsed_uri = uri_test1
290305
.parse::<bip21::Uri<NetworkUnchecked, Extras>>()
291306
.expect("Failed Parsing")
@@ -300,21 +315,25 @@ mod tests {
300315
.unwrap()
301316
);
302317

303-
assert_eq!(Amount::from_sat(100000000), Amount::from(parsed_uri.amount.unwrap()));
318+
assert_eq!(Amount::from_sat(100_000_000), Amount::from(parsed_uri.amount.unwrap()));
304319

305320
if let Some(invoice) = parsed_uri.extras.bolt11_invoice {
306-
assert_eq!(invoice, Bolt11Invoice::from_str("LNTB1000M1PNXWM7MDQ523JHXAPQD4JHXUMPVAJSNP4QWP9QD2JFP8DUZ46JQG5LTKVDH04YG52G6UF2YAXP8H7YZPZM3DM5PP5KUP7YT429UP9Z4ACPA60R7WETSTL66549MG05P0JN0C4L2NCC40SSP5R0LH86DJCL0NK8HZHNZHX92VVUAAVNE48Z5RVKVY5DKTRQ0DMP7S9QYYSGQCQPCXQRRAQYR59FGN2VVC5R6DS0AZMETH493ZU56H0WSVMGYCW9LEPZ032PGQNZMQ6XKVEH90Z02C0NH3J5QGDAWCS2YC2ZNP22J0ZD0PPF78N4QQQEXTYS2").unwrap());
321+
assert_eq!(invoice, Bolt11Invoice::from_str(expected_bolt11_invoice_1).unwrap());
307322
} else {
308323
panic!("No Lightning invoice found");
309324
}
310325

311326
let uri_with_offer = "BITCOIN:BCRT1QM0NW9S05QDPGC6F52FPKA9U6Q6VWTT5WVS30R2?amount=0.001&message=asdf&lightning=LNBCRT1M1PNGMY98DQ8V9EKGESNP4QDH5SL00QK4842UZMZVJVX2NLUZT4E6P2ZC2DLAGCU565TP42AUDYPP5XD0PRS5CRDLZVU8DNQQU08W9F4YP0XRXW06ZSHCLCHZU9X28HSSSSP5ES30JG9J4VK2CRW80YXTLRJU2M097TXMFTHR00VC5V0LGKVMURRQ9QYYSGQCQPCXQRRAQRZJQ0Q0K9CDYFSVZAJ5V3PDWYWDMHLEYCVD7TG0SVMY4AM4P6GQZJZ5XQQQQYQQX2QQQUQQQQLGQQQQQQQQFQWDQZX24PSHN68A9D4X4HD89F3XVC7DGGRDTFCA5WH4KZ546GSRTJVACA34QQ3DZ9W4JHLJD3XZRW44RA0RET6RDSRJCEZQC6AXANX6QPHZKHJK&lno=LNO1QGSQVGNWGCG35Z6EE2H3YCZRADDM72XRFUA9UVE2RLRM9DEU7XYFZRCYZPGTGRDWMGU44QPYUXLHLLMLWN4QSPQ97HSSQZSYV9EKGESSWCPK7JRAAUZ6574TSTVFJFSE20LSFWH8G9GTPFHL4RRJN23VX4TH35SRWKCNQ6S8R9ZW9HU5RXMPXVYCJVK2KY3NTEA8VXZTMWJF4NAJCCAQZQ7YZ7KDDZ600LAW2S2E7Q6XDYLPSMLMV4YAY0QXX5NC8QH05JRNUYQPQCAHK8Y5KQ8H9X624LS6A9GWFTGKYYPUZVUKKM93DWETTL8A7NE84L7SNHCSGR006EACQRQP8YWY6WPS0TS";
327+
let expected_bolt11_invoice_2 = "LNBCRT1M1PNGMY98DQ8V9EKGESNP4QDH5SL00QK4842UZMZVJVX2NLUZT4E6P2ZC2DLAGCU565TP42AUDYPP5XD0PRS5CRDLZVU8DNQQU08W9F4YP0XRXW06ZSHCLCHZU9X28HSSSSP5ES30JG9J4VK2CRW80YXTLRJU2M097TXMFTHR00VC5V0LGKVMURRQ9QYYSGQCQPCXQRRAQRZJQ0Q0K9CDYFSVZAJ5V3PDWYWDMHLEYCVD7TG0SVMY4AM4P6GQZJZ5XQQQQYQQX2QQQUQQQQLGQQQQQQQQFQWDQZX24PSHN68A9D4X4HD89F3XVC7DGGRDTFCA5WH4KZ546GSRTJVACA34QQ3DZ9W4JHLJD3XZRW44RA0RET6RDSRJCEZQC6AXANX6QPHZKHJK";
328+
let expected_bolt12_offer_2 = "LNO1QGSQVGNWGCG35Z6EE2H3YCZRADDM72XRFUA9UVE2RLRM9DEU7XYFZRCYZPGTGRDWMGU44QPYUXLHLLMLWN4QSPQ97HSSQZSYV9EKGESSWCPK7JRAAUZ6574TSTVFJFSE20LSFWH8G9GTPFHL4RRJN23VX4TH35SRWKCNQ6S8R9ZW9HU5RXMPXVYCJVK2KY3NTEA8VXZTMWJF4NAJCCAQZQ7YZ7KDDZ600LAW2S2E7Q6XDYLPSMLMV4YAY0QXX5NC8QH05JRNUYQPQCAHK8Y5KQ8H9X624LS6A9GWFTGKYYPUZVUKKM93DWETTL8A7NE84L7SNHCSGR006EACQRQP8YWY6WPS0TS";
312329
let parsed_uri_with_offer = uri_with_offer
313330
.parse::<bip21::Uri<NetworkUnchecked, Extras>>()
314331
.expect("Failed Parsing")
315332
.require_network(Network::Regtest)
316333
.expect("Invalid Network");
317334

335+
assert_eq!(Amount::from_sat(100_000), Amount::from(parsed_uri_with_offer.amount.unwrap()));
336+
318337
assert_eq!(
319338
parsed_uri_with_offer.address,
320339
bitcoin::Address::from_str("BCRT1QM0NW9S05QDPGC6F52FPKA9U6Q6VWTT5WVS30R2")
@@ -324,18 +343,19 @@ mod tests {
324343
);
325344

326345
if let Some(invoice) = parsed_uri_with_offer.extras.bolt11_invoice {
327-
assert_eq!(invoice, Bolt11Invoice::from_str("LNBCRT1M1PNGMY98DQ8V9EKGESNP4QDH5SL00QK4842UZMZVJVX2NLUZT4E6P2ZC2DLAGCU565TP42AUDYPP5XD0PRS5CRDLZVU8DNQQU08W9F4YP0XRXW06ZSHCLCHZU9X28HSSSSP5ES30JG9J4VK2CRW80YXTLRJU2M097TXMFTHR00VC5V0LGKVMURRQ9QYYSGQCQPCXQRRAQRZJQ0Q0K9CDYFSVZAJ5V3PDWYWDMHLEYCVD7TG0SVMY4AM4P6GQZJZ5XQQQQYQQX2QQQUQQQQLGQQQQQQQQFQWDQZX24PSHN68A9D4X4HD89F3XVC7DGGRDTFCA5WH4KZ546GSRTJVACA34QQ3DZ9W4JHLJD3XZRW44RA0RET6RDSRJCEZQC6AXANX6QPHZKHJK").unwrap());
346+
assert_eq!(invoice, Bolt11Invoice::from_str(expected_bolt11_invoice_2).unwrap());
328347
} else {
329348
panic!("No invoice found.")
330349
}
331350

332351
if let Some(offer) = parsed_uri_with_offer.extras.bolt12_offer {
333-
assert_eq!(offer, Offer::from_str("LNO1QGSQVGNWGCG35Z6EE2H3YCZRADDM72XRFUA9UVE2RLRM9DEU7XYFZRCYZPGTGRDWMGU44QPYUXLHLLMLWN4QSPQ97HSSQZSYV9EKGESSWCPK7JRAAUZ6574TSTVFJFSE20LSFWH8G9GTPFHL4RRJN23VX4TH35SRWKCNQ6S8R9ZW9HU5RXMPXVYCJVK2KY3NTEA8VXZTMWJF4NAJCCAQZQ7YZ7KDDZ600LAW2S2E7Q6XDYLPSMLMV4YAY0QXX5NC8QH05JRNUYQPQCAHK8Y5KQ8H9X624LS6A9GWFTGKYYPUZVUKKM93DWETTL8A7NE84L7SNHCSGR006EACQRQP8YWY6WPS0TS").unwrap());
352+
assert_eq!(offer, Offer::from_str(expected_bolt12_offer_2).unwrap());
334353
} else {
335354
panic!("No offer found.");
336355
}
337356

338357
let zeus_test = "bitcoin:TB1QQ32G6LM2XKT0U2UGASH5DC4CFT3JTPEW65PZZ5?lightning=LNTB500U1PN89HH6PP5MA7K6DRM5SYVD05NTXMGSRNM728J7EHM8KV6VC96YNLKN7G7VDYQDQQCQZRCXQR8Q7SP5HU30L0EEXKYYPQSQYEZELZWUPT62HLJ0KV2662CALGPAML50QPXQ9QXPQYSGQDKTVFXEC8H2DG2GY3C95ETAJ0QKX50XAUCU304PPFV2SQVGFHZ6RMZWJV8MC3M0LXF3GW852C5VSK0DELK0JHLYUTYZDF7QKNAMT4PQQQN24WM&amount=0.0005";
358+
let expected_bolt11_invoice_3 = "LNTB500U1PN89HH6PP5MA7K6DRM5SYVD05NTXMGSRNM728J7EHM8KV6VC96YNLKN7G7VDYQDQQCQZRCXQR8Q7SP5HU30L0EEXKYYPQSQYEZELZWUPT62HLJ0KV2662CALGPAML50QPXQ9QXPQYSGQDKTVFXEC8H2DG2GY3C95ETAJ0QKX50XAUCU304PPFV2SQVGFHZ6RMZWJV8MC3M0LXF3GW852C5VSK0DELK0JHLYUTYZDF7QKNAMT4PQQQN24WM";
339359
let uri_test2 = zeus_test
340360
.parse::<bip21::Uri<NetworkUnchecked, Extras>>()
341361
.expect("Failed Parsing")
@@ -351,13 +371,14 @@ mod tests {
351371
);
352372

353373
if let Some(invoice) = uri_test2.extras.bolt11_invoice {
354-
assert_eq!(invoice, Bolt11Invoice::from_str("LNTB500U1PN89HH6PP5MA7K6DRM5SYVD05NTXMGSRNM728J7EHM8KV6VC96YNLKN7G7VDYQDQQCQZRCXQR8Q7SP5HU30L0EEXKYYPQSQYEZELZWUPT62HLJ0KV2662CALGPAML50QPXQ9QXPQYSGQDKTVFXEC8H2DG2GY3C95ETAJ0QKX50XAUCU304PPFV2SQVGFHZ6RMZWJV8MC3M0LXF3GW852C5VSK0DELK0JHLYUTYZDF7QKNAMT4PQQQN24WM").unwrap());
374+
assert_eq!(invoice, Bolt11Invoice::from_str(expected_bolt11_invoice_3).unwrap());
355375
} else {
356376
panic!("No invoice found.");
357377
}
358378
assert_eq!(Amount::from(uri_test2.amount.unwrap()), Amount::from_sat(50000));
359379

360380
let muun_test = "bitcoin:bc1q6fmtam67h8wxfwtpumhazhtwyrh3uf039n058zke9xt5hr4ljzwsdcm2pj?amount=0.01&lightning=lnbc10m1pn8g2j4pp575tg4wt8jwgu2lvtk3aj6hy7mc6tnupw07wwkxcvyhtt3wlzw0zsdqqcqzzgxqyz5vqrzjqwnvuc0u4txn35cafc7w94gxvq5p3cu9dd95f7hlrh0fvs46wpvhdv6dzdeg0ww2eyqqqqryqqqqthqqpysp5fkd3k2rzvwdt2av068p58evf6eg50q0eftfhrpugaxkuyje4d25q9qrsgqqkfmnn67s5g6hadrcvf5h0l7p92rtlkwrfqdvc7uuf6lew0czxksvqhyux3zjrl3tlakwhtvezwl24zshnfumukwh0yntqsng9z6glcquvw7kc";
381+
let expected_bolt11_invoice_4 = "lnbc10m1pn8g2j4pp575tg4wt8jwgu2lvtk3aj6hy7mc6tnupw07wwkxcvyhtt3wlzw0zsdqqcqzzgxqyz5vqrzjqwnvuc0u4txn35cafc7w94gxvq5p3cu9dd95f7hlrh0fvs46wpvhdv6dzdeg0ww2eyqqqqryqqqqthqqpysp5fkd3k2rzvwdt2av068p58evf6eg50q0eftfhrpugaxkuyje4d25q9qrsgqqkfmnn67s5g6hadrcvf5h0l7p92rtlkwrfqdvc7uuf6lew0czxksvqhyux3zjrl3tlakwhtvezwl24zshnfumukwh0yntqsng9z6glcquvw7kc";
361382
let uri_test3 = muun_test
362383
.parse::<bip21::Uri<NetworkUnchecked, Extras>>()
363384
.expect("Failed Parsing")
@@ -374,13 +395,14 @@ mod tests {
374395
);
375396

376397
if let Some(invoice) = uri_test3.extras.bolt11_invoice {
377-
assert_eq!(invoice, Bolt11Invoice::from_str("lnbc10m1pn8g2j4pp575tg4wt8jwgu2lvtk3aj6hy7mc6tnupw07wwkxcvyhtt3wlzw0zsdqqcqzzgxqyz5vqrzjqwnvuc0u4txn35cafc7w94gxvq5p3cu9dd95f7hlrh0fvs46wpvhdv6dzdeg0ww2eyqqqqryqqqqthqqpysp5fkd3k2rzvwdt2av068p58evf6eg50q0eftfhrpugaxkuyje4d25q9qrsgqqkfmnn67s5g6hadrcvf5h0l7p92rtlkwrfqdvc7uuf6lew0czxksvqhyux3zjrl3tlakwhtvezwl24zshnfumukwh0yntqsng9z6glcquvw7kc").unwrap());
398+
assert_eq!(invoice, Bolt11Invoice::from_str(expected_bolt11_invoice_4).unwrap());
378399
} else {
379400
panic!("No invoice found");
380401
}
381402
assert_eq!(Amount::from(uri_test3.amount.unwrap()), Amount::from_sat(1_000_000));
382403

383404
let muun_test_no_amount = "bitcoin:bc1qwe94y974pjl9kg5afg8tmsc0nz4hct04u78hdhukxvnnphgu48hs9lx3k5?lightning=lnbc1pn8g249pp5f6ytj32ty90jhvw69enf30hwfgdhyymjewywcmfjevflg6s4z86qdqqcqzzgxqyz5vqrzjqwnvuc0u4txn35cafc7w94gxvq5p3cu9dd95f7hlrh0fvs46wpvhdfjjzh2j9f7ye5qqqqryqqqqthqqpysp5mm832athgcal3m7h35sc29j63lmgzvwc5smfjh2es65elc2ns7dq9qrsgqu2xcje2gsnjp0wn97aknyd3h58an7sjj6nhcrm40846jxphv47958c6th76whmec8ttr2wmg6sxwchvxmsc00kqrzqcga6lvsf9jtqgqy5yexa";
405+
let expected_bolt11_invoice_5 = "lnbc1pn8g249pp5f6ytj32ty90jhvw69enf30hwfgdhyymjewywcmfjevflg6s4z86qdqqcqzzgxqyz5vqrzjqwnvuc0u4txn35cafc7w94gxvq5p3cu9dd95f7hlrh0fvs46wpvhdfjjzh2j9f7ye5qqqqryqqqqthqqpysp5mm832athgcal3m7h35sc29j63lmgzvwc5smfjh2es65elc2ns7dq9qrsgqu2xcje2gsnjp0wn97aknyd3h58an7sjj6nhcrm40846jxphv47958c6th76whmec8ttr2wmg6sxwchvxmsc00kqrzqcga6lvsf9jtqgqy5yexa";
384406
let uri_test4 = muun_test_no_amount
385407
.parse::<bip21::Uri<NetworkUnchecked, Extras>>()
386408
.expect("Failed Parsing")
@@ -394,7 +416,7 @@ mod tests {
394416
.unwrap()
395417
);
396418
if let Some(invoice) = uri_test4.extras.bolt11_invoice {
397-
assert_eq!(invoice, Bolt11Invoice::from_str("lnbc1pn8g249pp5f6ytj32ty90jhvw69enf30hwfgdhyymjewywcmfjevflg6s4z86qdqqcqzzgxqyz5vqrzjqwnvuc0u4txn35cafc7w94gxvq5p3cu9dd95f7hlrh0fvs46wpvhdfjjzh2j9f7ye5qqqqryqqqqthqqpysp5mm832athgcal3m7h35sc29j63lmgzvwc5smfjh2es65elc2ns7dq9qrsgqu2xcje2gsnjp0wn97aknyd3h58an7sjj6nhcrm40846jxphv47958c6th76whmec8ttr2wmg6sxwchvxmsc00kqrzqcga6lvsf9jtqgqy5yexa").unwrap());
419+
assert_eq!(invoice, Bolt11Invoice::from_str(expected_bolt11_invoice_5).unwrap());
398420
} else {
399421
panic!("No invoice found");
400422
}

0 commit comments

Comments
 (0)