6f21af72dbed019a8af1caf214c0d6a0f3ab9677
[rust-lightning] / lightning-invoice / src / lib.rs
1 #![deny(rustdoc::broken_intra_doc_links)]
2 #![deny(rustdoc::private_intra_doc_links)]
3
4 #![deny(missing_docs)]
5 #![deny(non_upper_case_globals)]
6 #![deny(non_camel_case_types)]
7 #![deny(non_snake_case)]
8 #![deny(unused_mut)]
9
10 #![cfg_attr(docsrs, feature(doc_auto_cfg))]
11
12 #![cfg_attr(feature = "strict", deny(warnings))]
13 #![cfg_attr(all(not(feature = "std"), not(test)), no_std)]
14
15 //! This crate provides data structures to represent
16 //! [lightning BOLT11](https://github.com/lightning/bolts/blob/master/11-payment-encoding.md)
17 //! invoices and functions to create, encode and decode these. If you just want to use the standard
18 //! en-/decoding functionality this should get you started:
19 //!
20 //!   * For parsing use `str::parse::<Bolt11Invoice>(&self)` (see [`Bolt11Invoice::from_str`])
21 //!   * For constructing invoices use the [`InvoiceBuilder`]
22 //!   * For serializing invoices use the [`Display`]/[`ToString`] traits
23 //!
24 //! [`Bolt11Invoice::from_str`]: crate::Bolt11Invoice#impl-FromStr
25
26 #[cfg(not(any(feature = "std", feature = "no-std")))]
27 compile_error!("at least one of the `std` or `no-std` features must be enabled");
28
29 pub mod payment;
30 pub mod utils;
31
32 extern crate bech32;
33 #[macro_use] extern crate lightning;
34 extern crate num_traits;
35 extern crate secp256k1;
36 extern crate alloc;
37 #[cfg(any(test, feature = "std"))]
38 extern crate core;
39 #[cfg(feature = "serde")]
40 extern crate serde;
41
42 #[cfg(feature = "std")]
43 use std::time::SystemTime;
44
45 use bech32::u5;
46 use bitcoin::{Address, Network, PubkeyHash, ScriptHash};
47 use bitcoin::address::{Payload, WitnessProgram, WitnessVersion};
48 use bitcoin::hashes::{Hash, sha256};
49 use lightning::ln::features::Bolt11InvoiceFeatures;
50 use lightning::util::invoice::construct_invoice_preimage;
51
52 use secp256k1::PublicKey;
53 use secp256k1::{Message, Secp256k1};
54 use secp256k1::ecdsa::RecoverableSignature;
55
56 use core::cmp::Ordering;
57 use core::fmt::{Display, Formatter, self};
58 use core::iter::FilterMap;
59 use core::num::ParseIntError;
60 use core::ops::Deref;
61 use core::slice::Iter;
62 use core::time::Duration;
63 use core::str;
64
65 #[cfg(feature = "serde")]
66 use serde::{Deserialize, Deserializer,Serialize, Serializer, de::Error};
67
68 #[doc(no_inline)]
69 pub use lightning::ln::PaymentSecret;
70 #[doc(no_inline)]
71 pub use lightning::routing::router::{RouteHint, RouteHintHop};
72 #[doc(no_inline)]
73 pub use lightning::routing::gossip::RoutingFees;
74 use lightning::util::string::UntrustedString;
75
76 mod de;
77 mod ser;
78 mod tb;
79
80 mod prelude {
81         #[cfg(feature = "hashbrown")]
82         extern crate hashbrown;
83
84         pub use alloc::{vec, vec::Vec, string::String};
85         #[cfg(not(feature = "hashbrown"))]
86         pub use std::collections::{HashMap, hash_map};
87         #[cfg(feature = "hashbrown")]
88         pub use self::hashbrown::{HashMap, HashSet, hash_map};
89
90         pub use alloc::string::ToString;
91 }
92
93 use crate::prelude::*;
94
95 /// Errors that indicate what is wrong with the invoice. They have some granularity for debug
96 /// reasons, but should generally result in an "invalid BOLT11 invoice" message for the user.
97 #[allow(missing_docs)]
98 #[derive(PartialEq, Eq, Debug, Clone)]
99 pub enum Bolt11ParseError {
100         Bech32Error(bech32::Error),
101         ParseAmountError(ParseIntError),
102         MalformedSignature(secp256k1::Error),
103         BadPrefix,
104         UnknownCurrency,
105         UnknownSiPrefix,
106         MalformedHRP,
107         TooShortDataPart,
108         UnexpectedEndOfTaggedFields,
109         DescriptionDecodeError(str::Utf8Error),
110         PaddingError,
111         IntegerOverflowError,
112         InvalidSegWitProgramLength,
113         InvalidPubKeyHashLength,
114         InvalidScriptHashLength,
115         InvalidRecoveryId,
116         InvalidSliceLength(String),
117
118         /// Not an error, but used internally to signal that a part of the invoice should be ignored
119         /// according to BOLT11
120         Skip,
121 }
122
123 /// Indicates that something went wrong while parsing or validating the invoice. Parsing errors
124 /// should be mostly seen as opaque and are only there for debugging reasons. Semantic errors
125 /// like wrong signatures, missing fields etc. could mean that someone tampered with the invoice.
126 #[derive(PartialEq, Eq, Debug, Clone)]
127 pub enum ParseOrSemanticError {
128         /// The invoice couldn't be decoded
129         ParseError(Bolt11ParseError),
130
131         /// The invoice could be decoded but violates the BOLT11 standard
132         SemanticError(crate::Bolt11SemanticError),
133 }
134
135 /// The number of bits used to represent timestamps as defined in BOLT 11.
136 const TIMESTAMP_BITS: usize = 35;
137
138 /// The maximum timestamp as [`Duration::as_secs`] since the Unix epoch allowed by [`BOLT 11`].
139 ///
140 /// [BOLT 11]: https://github.com/lightning/bolts/blob/master/11-payment-encoding.md
141 pub const MAX_TIMESTAMP: u64 = (1 << TIMESTAMP_BITS) - 1;
142
143 /// Default expiry time as defined by [BOLT 11].
144 ///
145 /// [BOLT 11]: https://github.com/lightning/bolts/blob/master/11-payment-encoding.md
146 pub const DEFAULT_EXPIRY_TIME: u64 = 3600;
147
148 /// Default minimum final CLTV expiry as defined by [BOLT 11].
149 ///
150 /// Note that this is *not* the same value as rust-lightning's minimum CLTV expiry, which is
151 /// provided in [`MIN_FINAL_CLTV_EXPIRY_DELTA`].
152 ///
153 /// [BOLT 11]: https://github.com/lightning/bolts/blob/master/11-payment-encoding.md
154 /// [`MIN_FINAL_CLTV_EXPIRY_DELTA`]: lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA
155 pub const DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA: u64 = 18;
156
157 /// Builder for [`Bolt11Invoice`]s. It's the most convenient and advised way to use this library. It
158 /// ensures that only a semantically and syntactically correct invoice can be built using it.
159 ///
160 /// ```
161 /// extern crate secp256k1;
162 /// extern crate lightning;
163 /// extern crate lightning_invoice;
164 /// extern crate bitcoin;
165 ///
166 /// use bitcoin::hashes::Hash;
167 /// use bitcoin::hashes::sha256;
168 ///
169 /// use secp256k1::Secp256k1;
170 /// use secp256k1::SecretKey;
171 ///
172 /// use lightning::ln::PaymentSecret;
173 ///
174 /// use lightning_invoice::{Currency, InvoiceBuilder};
175 ///
176 /// # #[cfg(not(feature = "std"))]
177 /// # fn main() {}
178 /// # #[cfg(feature = "std")]
179 /// # fn main() {
180 /// let private_key = SecretKey::from_slice(
181 ///             &[
182 ///                     0xe1, 0x26, 0xf6, 0x8f, 0x7e, 0xaf, 0xcc, 0x8b, 0x74, 0xf5, 0x4d, 0x26, 0x9f,
183 ///                     0xe2, 0x06, 0xbe, 0x71, 0x50, 0x00, 0xf9, 0x4d, 0xac, 0x06, 0x7d, 0x1c, 0x04,
184 ///             0xa8, 0xca, 0x3b, 0x2d, 0xb7, 0x34
185 ///     ][..]
186 ///     ).unwrap();
187 ///
188 /// let payment_hash = sha256::Hash::from_slice(&[0; 32][..]).unwrap();
189 /// let payment_secret = PaymentSecret([42u8; 32]);
190 ///
191 /// let invoice = InvoiceBuilder::new(Currency::Bitcoin)
192 ///     .description("Coins pls!".into())
193 ///     .payment_hash(payment_hash)
194 ///     .payment_secret(payment_secret)
195 ///     .current_timestamp()
196 ///     .min_final_cltv_expiry_delta(144)
197 ///     .build_signed(|hash| {
198 ///             Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)
199 ///     })
200 ///     .unwrap();
201 ///
202 /// assert!(invoice.to_string().starts_with("lnbc1"));
203 /// # }
204 /// ```
205 ///
206 /// # Type parameters
207 /// The two parameters `D` and `H` signal if the builder already contains the correct amount of the
208 /// given field:
209 ///  * `D`: exactly one [`TaggedField::Description`] or [`TaggedField::DescriptionHash`]
210 ///  * `H`: exactly one [`TaggedField::PaymentHash`]
211 ///  * `T`: the timestamp is set
212 ///  * `C`: the CLTV expiry is set
213 ///  * `S`: the payment secret is set
214 ///  * `M`: payment metadata is set
215 ///
216 /// This is not exported to bindings users as we likely need to manually select one set of boolean type parameters.
217 #[derive(Eq, PartialEq, Debug, Clone)]
218 pub struct InvoiceBuilder<D: tb::Bool, H: tb::Bool, T: tb::Bool, C: tb::Bool, S: tb::Bool, M: tb::Bool> {
219         currency: Currency,
220         amount: Option<u64>,
221         si_prefix: Option<SiPrefix>,
222         timestamp: Option<PositiveTimestamp>,
223         tagged_fields: Vec<TaggedField>,
224         error: Option<CreationError>,
225
226         phantom_d: core::marker::PhantomData<D>,
227         phantom_h: core::marker::PhantomData<H>,
228         phantom_t: core::marker::PhantomData<T>,
229         phantom_c: core::marker::PhantomData<C>,
230         phantom_s: core::marker::PhantomData<S>,
231         phantom_m: core::marker::PhantomData<M>,
232 }
233
234 /// Represents a syntactically and semantically correct lightning BOLT11 invoice.
235 ///
236 /// There are three ways to construct a `Bolt11Invoice`:
237 ///  1. using [`InvoiceBuilder`]
238 ///  2. using [`Bolt11Invoice::from_signed`]
239 ///  3. using `str::parse::<Bolt11Invoice>(&str)` (see [`Bolt11Invoice::from_str`])
240 ///
241 /// [`Bolt11Invoice::from_str`]: crate::Bolt11Invoice#impl-FromStr
242 #[derive(Eq, PartialEq, Debug, Clone, Hash, Ord, PartialOrd)]
243 pub struct Bolt11Invoice {
244         signed_invoice: SignedRawBolt11Invoice,
245 }
246
247 /// Represents the description of an invoice which has to be either a directly included string or
248 /// a hash of a description provided out of band.
249 ///
250 /// This is not exported to bindings users as we don't have a good way to map the reference lifetimes making this
251 /// practically impossible to use safely in languages like C.
252 #[derive(Eq, PartialEq, Debug, Clone, Ord, PartialOrd)]
253 pub enum Bolt11InvoiceDescription<'f> {
254         /// Reference to the directly supplied description in the invoice
255         Direct(&'f Description),
256
257         /// Reference to the description's hash included in the invoice
258         Hash(&'f Sha256),
259 }
260
261 impl<'f> Display for Bolt11InvoiceDescription<'f> {
262         fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
263                 match self {
264                         Bolt11InvoiceDescription::Direct(desc) => write!(f, "{}", desc.0),
265                         Bolt11InvoiceDescription::Hash(hash) => write!(f, "{}", hash.0),
266                 }
267         }
268 }
269
270 /// Represents a signed [`RawBolt11Invoice`] with cached hash. The signature is not checked and may be
271 /// invalid.
272 ///
273 /// # Invariants
274 /// The hash has to be either from the deserialized invoice or from the serialized [`RawBolt11Invoice`].
275 #[derive(Eq, PartialEq, Debug, Clone, Hash, Ord, PartialOrd)]
276 pub struct SignedRawBolt11Invoice {
277         /// The raw invoice that the signature belongs to
278         raw_invoice: RawBolt11Invoice,
279
280         /// Hash of the [`RawBolt11Invoice`] that will be used to check the signature.
281         ///
282         /// * if the `SignedRawBolt11Invoice` was deserialized the hash is of from the original encoded form,
283         /// since it's not guaranteed that encoding it again will lead to the same result since integers
284         /// could have been encoded with leading zeroes etc.
285         /// * if the `SignedRawBolt11Invoice` was constructed manually the hash will be the calculated hash
286         /// from the [`RawBolt11Invoice`]
287         hash: [u8; 32],
288
289         /// signature of the payment request
290         signature: Bolt11InvoiceSignature,
291 }
292
293 /// Represents an syntactically correct [`Bolt11Invoice`] for a payment on the lightning network,
294 /// but without the signature information.
295 /// Decoding and encoding should not lead to information loss but may lead to different hashes.
296 ///
297 /// For methods without docs see the corresponding methods in [`Bolt11Invoice`].
298 #[derive(Eq, PartialEq, Debug, Clone, Hash, Ord, PartialOrd)]
299 pub struct RawBolt11Invoice {
300         /// human readable part
301         pub hrp: RawHrp,
302
303         /// data part
304         pub data: RawDataPart,
305 }
306
307 /// Data of the [`RawBolt11Invoice`] that is encoded in the human readable part.
308 ///
309 /// This is not exported to bindings users as we don't yet support `Option<Enum>`
310 #[derive(Eq, PartialEq, Debug, Clone, Hash, Ord, PartialOrd)]
311 pub struct RawHrp {
312         /// The currency deferred from the 3rd and 4th character of the bech32 transaction
313         pub currency: Currency,
314
315         /// The amount that, multiplied by the SI prefix, has to be payed
316         pub raw_amount: Option<u64>,
317
318         /// SI prefix that gets multiplied with the `raw_amount`
319         pub si_prefix: Option<SiPrefix>,
320 }
321
322 /// Data of the [`RawBolt11Invoice`] that is encoded in the data part
323 #[derive(Eq, PartialEq, Debug, Clone, Hash, Ord, PartialOrd)]
324 pub struct RawDataPart {
325         /// generation time of the invoice
326         pub timestamp: PositiveTimestamp,
327
328         /// tagged fields of the payment request
329         pub tagged_fields: Vec<RawTaggedField>,
330 }
331
332 /// A timestamp that refers to a date after 1 January 1970.
333 ///
334 /// # Invariants
335 ///
336 /// The Unix timestamp representing the stored time has to be positive and no greater than
337 /// [`MAX_TIMESTAMP`].
338 #[derive(Eq, PartialEq, Debug, Clone, Hash, Ord, PartialOrd)]
339 pub struct PositiveTimestamp(Duration);
340
341 /// SI prefixes for the human readable part
342 #[derive(Eq, PartialEq, Debug, Clone, Copy, Hash, Ord, PartialOrd)]
343 pub enum SiPrefix {
344         /// 10^-3
345         Milli,
346         /// 10^-6
347         Micro,
348         /// 10^-9
349         Nano,
350         /// 10^-12
351         Pico,
352 }
353
354 impl SiPrefix {
355         /// Returns the multiplier to go from a BTC value to picoBTC implied by this SiPrefix.
356         /// This is effectively 10^12 * the prefix multiplier
357         pub fn multiplier(&self) -> u64 {
358                 match *self {
359                         SiPrefix::Milli => 1_000_000_000,
360                         SiPrefix::Micro => 1_000_000,
361                         SiPrefix::Nano => 1_000,
362                         SiPrefix::Pico => 1,
363                 }
364         }
365
366         /// Returns all enum variants of `SiPrefix` sorted in descending order of their associated
367         /// multiplier.
368         ///
369         /// This is not exported to bindings users as we don't yet support a slice of enums, and also because this function
370         /// isn't the most critical to expose.
371         pub fn values_desc() -> &'static [SiPrefix] {
372                 use crate::SiPrefix::*;
373                 static VALUES: [SiPrefix; 4] = [Milli, Micro, Nano, Pico];
374                 &VALUES
375         }
376 }
377
378 /// Enum representing the crypto currencies (or networks) supported by this library
379 #[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
380 pub enum Currency {
381         /// Bitcoin mainnet
382         Bitcoin,
383
384         /// Bitcoin testnet
385         BitcoinTestnet,
386
387         /// Bitcoin regtest
388         Regtest,
389
390         /// Bitcoin simnet
391         Simnet,
392
393         /// Bitcoin signet
394         Signet,
395 }
396
397 impl From<Network> for Currency {
398         fn from(network: Network) -> Self {
399                 match network {
400                         Network::Bitcoin => Currency::Bitcoin,
401                         Network::Testnet => Currency::BitcoinTestnet,
402                         Network::Regtest => Currency::Regtest,
403                         Network::Signet => Currency::Signet,
404                         _ => {
405                                 debug_assert!(false, "Need to handle new rust-bitcoin network type");
406                                 Currency::Regtest
407                         },
408                 }
409         }
410 }
411
412 impl From<Currency> for Network {
413         fn from(currency: Currency) -> Self {
414                 match currency {
415                         Currency::Bitcoin => Network::Bitcoin,
416                         Currency::BitcoinTestnet => Network::Testnet,
417                         Currency::Regtest => Network::Regtest,
418                         Currency::Simnet => Network::Regtest,
419                         Currency::Signet => Network::Signet,
420                 }
421         }
422 }
423
424 /// Tagged field which may have an unknown tag
425 ///
426 /// This is not exported to bindings users as we don't currently support TaggedField
427 #[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
428 pub enum RawTaggedField {
429         /// Parsed tagged field with known tag
430         KnownSemantics(TaggedField),
431         /// tagged field which was not parsed due to an unknown tag or undefined field semantics
432         UnknownSemantics(Vec<u5>),
433 }
434
435 /// Tagged field with known tag
436 ///
437 /// For descriptions of the enum values please refer to the enclosed type's docs.
438 ///
439 /// This is not exported to bindings users as we don't yet support enum variants with the same name the struct contained
440 /// in the variant.
441 #[allow(missing_docs)]
442 #[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
443 pub enum TaggedField {
444         PaymentHash(Sha256),
445         Description(Description),
446         PayeePubKey(PayeePubKey),
447         DescriptionHash(Sha256),
448         ExpiryTime(ExpiryTime),
449         MinFinalCltvExpiryDelta(MinFinalCltvExpiryDelta),
450         Fallback(Fallback),
451         PrivateRoute(PrivateRoute),
452         PaymentSecret(PaymentSecret),
453         PaymentMetadata(Vec<u8>),
454         Features(Bolt11InvoiceFeatures),
455 }
456
457 /// SHA-256 hash
458 #[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
459 pub struct Sha256(/// This is not exported to bindings users as the native hash types are not currently mapped
460         pub sha256::Hash);
461
462 impl Sha256 {
463         /// Constructs a new [`Sha256`] from the given bytes, which are assumed to be the output of a
464         /// single sha256 hash.
465         #[cfg(c_bindings)]
466         pub fn from_bytes(bytes: &[u8; 32]) -> Self {
467                 Self(sha256::Hash::from_slice(bytes).expect("from_slice only fails if len is not 32"))
468         }
469 }
470
471 /// Description string
472 ///
473 /// # Invariants
474 /// The description can be at most 639 __bytes__ long
475 #[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd, Default)]
476 pub struct Description(UntrustedString);
477
478 /// Payee public key
479 #[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
480 pub struct PayeePubKey(pub PublicKey);
481
482 /// Positive duration that defines when (relatively to the timestamp) in the future the invoice
483 /// expires
484 #[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
485 pub struct ExpiryTime(Duration);
486
487 /// `min_final_cltv_expiry_delta` to use for the last HTLC in the route
488 #[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
489 pub struct MinFinalCltvExpiryDelta(pub u64);
490
491 /// Fallback address in case no LN payment is possible
492 #[allow(missing_docs)]
493 #[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
494 pub enum Fallback {
495         SegWitProgram {
496                 version: WitnessVersion,
497                 program: Vec<u8>,
498         },
499         PubKeyHash(PubkeyHash),
500         ScriptHash(ScriptHash),
501 }
502
503 /// Recoverable signature
504 #[derive(Clone, Debug, Hash, Eq, PartialEq)]
505 pub struct Bolt11InvoiceSignature(pub RecoverableSignature);
506
507 impl PartialOrd for Bolt11InvoiceSignature {
508         fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
509                 Some(self.cmp(other))
510         }
511 }
512
513 impl Ord for Bolt11InvoiceSignature {
514         fn cmp(&self, other: &Self) -> Ordering {
515                 self.0.serialize_compact().1.cmp(&other.0.serialize_compact().1)
516         }
517 }
518
519 /// Private routing information
520 ///
521 /// # Invariants
522 /// The encoded route has to be <1024 5bit characters long (<=639 bytes or <=12 hops)
523 ///
524 #[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
525 pub struct PrivateRoute(RouteHint);
526
527 /// Tag constants as specified in BOLT11
528 #[allow(missing_docs)]
529 pub mod constants {
530         pub const TAG_PAYMENT_HASH: u8 = 1;
531         pub const TAG_DESCRIPTION: u8 = 13;
532         pub const TAG_PAYEE_PUB_KEY: u8 = 19;
533         pub const TAG_DESCRIPTION_HASH: u8 = 23;
534         pub const TAG_EXPIRY_TIME: u8 = 6;
535         pub const TAG_MIN_FINAL_CLTV_EXPIRY_DELTA: u8 = 24;
536         pub const TAG_FALLBACK: u8 = 9;
537         pub const TAG_PRIVATE_ROUTE: u8 = 3;
538         pub const TAG_PAYMENT_SECRET: u8 = 16;
539         pub const TAG_PAYMENT_METADATA: u8 = 27;
540         pub const TAG_FEATURES: u8 = 5;
541 }
542
543 impl InvoiceBuilder<tb::False, tb::False, tb::False, tb::False, tb::False, tb::False> {
544         /// Construct new, empty `InvoiceBuilder`. All necessary fields have to be filled first before
545         /// `InvoiceBuilder::build(self)` becomes available.
546         pub fn new(currency: Currency) -> Self {
547                 InvoiceBuilder {
548                         currency,
549                         amount: None,
550                         si_prefix: None,
551                         timestamp: None,
552                         tagged_fields: Vec::new(),
553                         error: None,
554
555                         phantom_d: core::marker::PhantomData,
556                         phantom_h: core::marker::PhantomData,
557                         phantom_t: core::marker::PhantomData,
558                         phantom_c: core::marker::PhantomData,
559                         phantom_s: core::marker::PhantomData,
560                         phantom_m: core::marker::PhantomData,
561                 }
562         }
563 }
564
565 impl<D: tb::Bool, H: tb::Bool, T: tb::Bool, C: tb::Bool, S: tb::Bool, M: tb::Bool> InvoiceBuilder<D, H, T, C, S, M> {
566         /// Helper function to set the completeness flags.
567         fn set_flags<DN: tb::Bool, HN: tb::Bool, TN: tb::Bool, CN: tb::Bool, SN: tb::Bool, MN: tb::Bool>(self) -> InvoiceBuilder<DN, HN, TN, CN, SN, MN> {
568                 InvoiceBuilder::<DN, HN, TN, CN, SN, MN> {
569                         currency: self.currency,
570                         amount: self.amount,
571                         si_prefix: self.si_prefix,
572                         timestamp: self.timestamp,
573                         tagged_fields: self.tagged_fields,
574                         error: self.error,
575
576                         phantom_d: core::marker::PhantomData,
577                         phantom_h: core::marker::PhantomData,
578                         phantom_t: core::marker::PhantomData,
579                         phantom_c: core::marker::PhantomData,
580                         phantom_s: core::marker::PhantomData,
581                         phantom_m: core::marker::PhantomData,
582                 }
583         }
584
585         /// Sets the amount in millisatoshis. The optimal SI prefix is chosen automatically.
586         pub fn amount_milli_satoshis(mut self, amount_msat: u64) -> Self {
587                 let amount = amount_msat * 10; // Invoices are denominated in "pico BTC"
588                 let biggest_possible_si_prefix = SiPrefix::values_desc()
589                         .iter()
590                         .find(|prefix| amount % prefix.multiplier() == 0)
591                         .expect("Pico should always match");
592                 self.amount = Some(amount / biggest_possible_si_prefix.multiplier());
593                 self.si_prefix = Some(*biggest_possible_si_prefix);
594                 self
595         }
596
597         /// Sets the payee's public key.
598         pub fn payee_pub_key(mut self, pub_key: PublicKey) -> Self {
599                 self.tagged_fields.push(TaggedField::PayeePubKey(PayeePubKey(pub_key)));
600                 self
601         }
602
603         /// Sets the expiry time, dropping the subsecond part (which is not representable in BOLT 11
604         /// invoices).
605         pub fn expiry_time(mut self, expiry_time: Duration) -> Self {
606                 self.tagged_fields.push(TaggedField::ExpiryTime(ExpiryTime::from_duration(expiry_time)));
607                 self
608         }
609
610         /// Adds a fallback address.
611         pub fn fallback(mut self, fallback: Fallback) -> Self {
612                 self.tagged_fields.push(TaggedField::Fallback(fallback));
613                 self
614         }
615
616         /// Adds a private route.
617         pub fn private_route(mut self, hint: RouteHint) -> Self {
618                 match PrivateRoute::new(hint) {
619                         Ok(r) => self.tagged_fields.push(TaggedField::PrivateRoute(r)),
620                         Err(e) => self.error = Some(e),
621                 }
622                 self
623         }
624 }
625
626 impl<D: tb::Bool, H: tb::Bool, C: tb::Bool, S: tb::Bool, M: tb::Bool> InvoiceBuilder<D, H, tb::True, C, S, M> {
627         /// Builds a [`RawBolt11Invoice`] if no [`CreationError`] occurred while construction any of the
628         /// fields.
629         pub fn build_raw(self) -> Result<RawBolt11Invoice, CreationError> {
630
631                 // If an error occurred at any time before, return it now
632                 if let Some(e) = self.error {
633                         return Err(e);
634                 }
635
636                 let hrp = RawHrp {
637                         currency: self.currency,
638                         raw_amount: self.amount,
639                         si_prefix: self.si_prefix,
640                 };
641
642                 let timestamp = self.timestamp.expect("ensured to be Some(t) by type T");
643
644                 let tagged_fields = self.tagged_fields.into_iter().map(|tf| {
645                         RawTaggedField::KnownSemantics(tf)
646                 }).collect::<Vec<_>>();
647
648                 let data = RawDataPart {
649                         timestamp,
650                         tagged_fields,
651                 };
652
653                 Ok(RawBolt11Invoice {
654                         hrp,
655                         data,
656                 })
657         }
658 }
659
660 impl<H: tb::Bool, T: tb::Bool, C: tb::Bool, S: tb::Bool, M: tb::Bool> InvoiceBuilder<tb::False, H, T, C, S, M> {
661         /// Set the description. This function is only available if no description (hash) was set.
662         pub fn description(mut self, description: String) -> InvoiceBuilder<tb::True, H, T, C, S, M> {
663                 match Description::new(description) {
664                         Ok(d) => self.tagged_fields.push(TaggedField::Description(d)),
665                         Err(e) => self.error = Some(e),
666                 }
667                 self.set_flags()
668         }
669
670         /// Set the description hash. This function is only available if no description (hash) was set.
671         pub fn description_hash(mut self, description_hash: sha256::Hash) -> InvoiceBuilder<tb::True, H, T, C, S, M> {
672                 self.tagged_fields.push(TaggedField::DescriptionHash(Sha256(description_hash)));
673                 self.set_flags()
674         }
675
676         /// Set the description or description hash. This function is only available if no description (hash) was set.
677         pub fn invoice_description(self, description: Bolt11InvoiceDescription) -> InvoiceBuilder<tb::True, H, T, C, S, M> {
678                 match description {
679                         Bolt11InvoiceDescription::Direct(desc) => {
680                                 self.description(desc.clone().into_inner().0)
681                         }
682                         Bolt11InvoiceDescription::Hash(hash) => {
683                                 self.description_hash(hash.0)
684                         }
685                 }
686         }
687 }
688
689 impl<D: tb::Bool, T: tb::Bool, C: tb::Bool, S: tb::Bool, M: tb::Bool> InvoiceBuilder<D, tb::False, T, C, S, M> {
690         /// Set the payment hash. This function is only available if no payment hash was set.
691         pub fn payment_hash(mut self, hash: sha256::Hash) -> InvoiceBuilder<D, tb::True, T, C, S, M> {
692                 self.tagged_fields.push(TaggedField::PaymentHash(Sha256(hash)));
693                 self.set_flags()
694         }
695 }
696
697 impl<D: tb::Bool, H: tb::Bool, C: tb::Bool, S: tb::Bool, M: tb::Bool> InvoiceBuilder<D, H, tb::False, C, S, M> {
698         /// Sets the timestamp to a specific [`SystemTime`].
699         #[cfg(feature = "std")]
700         pub fn timestamp(mut self, time: SystemTime) -> InvoiceBuilder<D, H, tb::True, C, S, M> {
701                 match PositiveTimestamp::from_system_time(time) {
702                         Ok(t) => self.timestamp = Some(t),
703                         Err(e) => self.error = Some(e),
704                 }
705
706                 self.set_flags()
707         }
708
709         /// Sets the timestamp to a duration since the Unix epoch, dropping the subsecond part (which
710         /// is not representable in BOLT 11 invoices).
711         pub fn duration_since_epoch(mut self, time: Duration) -> InvoiceBuilder<D, H, tb::True, C, S, M> {
712                 match PositiveTimestamp::from_duration_since_epoch(time) {
713                         Ok(t) => self.timestamp = Some(t),
714                         Err(e) => self.error = Some(e),
715                 }
716
717                 self.set_flags()
718         }
719
720         /// Sets the timestamp to the current system time.
721         #[cfg(feature = "std")]
722         pub fn current_timestamp(mut self) -> InvoiceBuilder<D, H, tb::True, C, S, M> {
723                 let now = PositiveTimestamp::from_system_time(SystemTime::now());
724                 self.timestamp = Some(now.expect("for the foreseeable future this shouldn't happen"));
725                 self.set_flags()
726         }
727 }
728
729 impl<D: tb::Bool, H: tb::Bool, T: tb::Bool, S: tb::Bool, M: tb::Bool> InvoiceBuilder<D, H, T, tb::False, S, M> {
730         /// Sets `min_final_cltv_expiry_delta`.
731         pub fn min_final_cltv_expiry_delta(mut self, min_final_cltv_expiry_delta: u64) -> InvoiceBuilder<D, H, T, tb::True, S, M> {
732                 self.tagged_fields.push(TaggedField::MinFinalCltvExpiryDelta(MinFinalCltvExpiryDelta(min_final_cltv_expiry_delta)));
733                 self.set_flags()
734         }
735 }
736
737 impl<D: tb::Bool, H: tb::Bool, T: tb::Bool, C: tb::Bool, M: tb::Bool> InvoiceBuilder<D, H, T, C, tb::False, M> {
738         /// Sets the payment secret and relevant features.
739         pub fn payment_secret(mut self, payment_secret: PaymentSecret) -> InvoiceBuilder<D, H, T, C, tb::True, M> {
740                 let mut found_features = false;
741                 for field in self.tagged_fields.iter_mut() {
742                         if let TaggedField::Features(f) = field {
743                                 found_features = true;
744                                 f.set_variable_length_onion_required();
745                                 f.set_payment_secret_required();
746                         }
747                 }
748                 self.tagged_fields.push(TaggedField::PaymentSecret(payment_secret));
749                 if !found_features {
750                         let mut features = Bolt11InvoiceFeatures::empty();
751                         features.set_variable_length_onion_required();
752                         features.set_payment_secret_required();
753                         self.tagged_fields.push(TaggedField::Features(features));
754                 }
755                 self.set_flags()
756         }
757 }
758
759 impl<D: tb::Bool, H: tb::Bool, T: tb::Bool, C: tb::Bool, S: tb::Bool> InvoiceBuilder<D, H, T, C, S, tb::False> {
760         /// Sets the payment metadata.
761         ///
762         /// By default features are set to *optionally* allow the sender to include the payment metadata.
763         /// If you wish to require that the sender include the metadata (and fail to parse the invoice if
764         /// they don't support payment metadata fields), you need to call
765         /// [`InvoiceBuilder::require_payment_metadata`] after this.
766         pub fn payment_metadata(mut self, payment_metadata: Vec<u8>) -> InvoiceBuilder<D, H, T, C, S, tb::True> {
767                 self.tagged_fields.push(TaggedField::PaymentMetadata(payment_metadata));
768                 let mut found_features = false;
769                 for field in self.tagged_fields.iter_mut() {
770                         if let TaggedField::Features(f) = field {
771                                 found_features = true;
772                                 f.set_payment_metadata_optional();
773                         }
774                 }
775                 if !found_features {
776                         let mut features = Bolt11InvoiceFeatures::empty();
777                         features.set_payment_metadata_optional();
778                         self.tagged_fields.push(TaggedField::Features(features));
779                 }
780                 self.set_flags()
781         }
782 }
783
784 impl<D: tb::Bool, H: tb::Bool, T: tb::Bool, C: tb::Bool, S: tb::Bool> InvoiceBuilder<D, H, T, C, S, tb::True> {
785         /// Sets forwarding of payment metadata as required. A reader of the invoice which does not
786         /// support sending payment metadata will fail to read the invoice.
787         pub fn require_payment_metadata(mut self) -> InvoiceBuilder<D, H, T, C, S, tb::True> {
788                 for field in self.tagged_fields.iter_mut() {
789                         if let TaggedField::Features(f) = field {
790                                 f.set_payment_metadata_required();
791                         }
792                 }
793                 self
794         }
795 }
796
797 impl<D: tb::Bool, H: tb::Bool, T: tb::Bool, C: tb::Bool, M: tb::Bool> InvoiceBuilder<D, H, T, C, tb::True, M> {
798         /// Sets the `basic_mpp` feature as optional.
799         pub fn basic_mpp(mut self) -> Self {
800                 for field in self.tagged_fields.iter_mut() {
801                         if let TaggedField::Features(f) = field {
802                                 f.set_basic_mpp_optional();
803                         }
804                 }
805                 self
806         }
807 }
808
809 impl<M: tb::Bool> InvoiceBuilder<tb::True, tb::True, tb::True, tb::True, tb::True, M> {
810         /// Builds and signs an invoice using the supplied `sign_function`. This function MAY NOT fail
811         /// and MUST produce a recoverable signature valid for the given hash and if applicable also for
812         /// the included payee public key.
813         pub fn build_signed<F>(self, sign_function: F) -> Result<Bolt11Invoice, CreationError>
814                 where F: FnOnce(&Message) -> RecoverableSignature
815         {
816                 let invoice = self.try_build_signed::<_, ()>(|hash| {
817                         Ok(sign_function(hash))
818                 });
819
820                 match invoice {
821                         Ok(i) => Ok(i),
822                         Err(SignOrCreationError::CreationError(e)) => Err(e),
823                         Err(SignOrCreationError::SignError(())) => unreachable!(),
824                 }
825         }
826
827         /// Builds and signs an invoice using the supplied `sign_function`. This function MAY fail with
828         /// an error of type `E` and MUST produce a recoverable signature valid for the given hash and
829         /// if applicable also for the included payee public key.
830         pub fn try_build_signed<F, E>(self, sign_function: F) -> Result<Bolt11Invoice, SignOrCreationError<E>>
831                 where F: FnOnce(&Message) -> Result<RecoverableSignature, E>
832         {
833                 let raw = match self.build_raw() {
834                         Ok(r) => r,
835                         Err(e) => return Err(SignOrCreationError::CreationError(e)),
836                 };
837
838                 let signed = match raw.sign(sign_function) {
839                         Ok(s) => s,
840                         Err(e) => return Err(SignOrCreationError::SignError(e)),
841                 };
842
843                 let invoice = Bolt11Invoice {
844                         signed_invoice: signed,
845                 };
846
847                 invoice.check_field_counts().expect("should be ensured by type signature of builder");
848                 invoice.check_feature_bits().expect("should be ensured by type signature of builder");
849                 invoice.check_amount().expect("should be ensured by type signature of builder");
850
851                 Ok(invoice)
852         }
853 }
854
855
856 impl SignedRawBolt11Invoice {
857         /// Disassembles the `SignedRawBolt11Invoice` into its three parts:
858         ///  1. raw invoice
859         ///  2. hash of the raw invoice
860         ///  3. signature
861         pub fn into_parts(self) -> (RawBolt11Invoice, [u8; 32], Bolt11InvoiceSignature) {
862                 (self.raw_invoice, self.hash, self.signature)
863         }
864
865         /// The [`RawBolt11Invoice`] which was signed.
866         pub fn raw_invoice(&self) -> &RawBolt11Invoice {
867                 &self.raw_invoice
868         }
869
870         /// The hash of the [`RawBolt11Invoice`] that was signed.
871         pub fn signable_hash(&self) -> &[u8; 32] {
872                 &self.hash
873         }
874
875         /// Signature for the invoice.
876         pub fn signature(&self) -> &Bolt11InvoiceSignature {
877                 &self.signature
878         }
879
880         /// Recovers the public key used for signing the invoice from the recoverable signature.
881         pub fn recover_payee_pub_key(&self) -> Result<PayeePubKey, secp256k1::Error> {
882                 let hash = Message::from_slice(&self.hash[..])
883                         .expect("Hash is 32 bytes long, same as MESSAGE_SIZE");
884
885                 Ok(PayeePubKey(Secp256k1::new().recover_ecdsa(
886                         &hash,
887                         &self.signature
888                 )?))
889         }
890
891         /// Checks if the signature is valid for the included payee public key or if none exists if it's
892         /// valid for the recovered signature (which should always be true?).
893         pub fn check_signature(&self) -> bool {
894                 let included_pub_key = self.raw_invoice.payee_pub_key();
895
896                 let mut recovered_pub_key = Option::None;
897                 if recovered_pub_key.is_none() {
898                         let recovered = match self.recover_payee_pub_key() {
899                                 Ok(pk) => pk,
900                                 Err(_) => return false,
901                         };
902                         recovered_pub_key = Some(recovered);
903                 }
904
905                 let pub_key = included_pub_key.or(recovered_pub_key.as_ref())
906                         .expect("One is always present");
907
908                 let hash = Message::from_slice(&self.hash[..])
909                         .expect("Hash is 32 bytes long, same as MESSAGE_SIZE");
910
911                 let secp_context = Secp256k1::new();
912                 let verification_result = secp_context.verify_ecdsa(
913                         &hash,
914                         &self.signature.to_standard(),
915                         pub_key
916                 );
917
918                 match verification_result {
919                         Ok(()) => true,
920                         Err(_) => false,
921                 }
922         }
923 }
924
925 /// Finds the first element of an enum stream of a given variant and extracts one member of the
926 /// variant. If no element was found `None` gets returned.
927 ///
928 /// The following example would extract the first B.
929 ///
930 /// ```ignore
931 /// enum Enum {
932 ///     A(u8),
933 ///     B(u16)
934 /// }
935 ///
936 /// let elements = vec![Enum::A(1), Enum::A(2), Enum::B(3), Enum::A(4)];
937 ///
938 /// assert_eq!(find_extract!(elements.iter(), Enum::B(x), x), Some(3u16));
939 /// ```
940 macro_rules! find_extract {
941         ($iter:expr, $enm:pat, $enm_var:ident) => {
942                 find_all_extract!($iter, $enm, $enm_var).next()
943         };
944 }
945
946 /// Finds the all elements of an enum stream of a given variant and extracts one member of the
947 /// variant through an iterator.
948 ///
949 /// The following example would extract all A.
950 ///
951 /// ```ignore
952 /// enum Enum {
953 ///     A(u8),
954 ///     B(u16)
955 /// }
956 ///
957 /// let elements = vec![Enum::A(1), Enum::A(2), Enum::B(3), Enum::A(4)];
958 ///
959 /// assert_eq!(
960 ///     find_all_extract!(elements.iter(), Enum::A(x), x).collect::<Vec<u8>>(),
961 ///     vec![1u8, 2u8, 4u8]
962 /// );
963 /// ```
964 macro_rules! find_all_extract {
965         ($iter:expr, $enm:pat, $enm_var:ident) => {
966                 $iter.filter_map(|tf| match *tf {
967                         $enm => Some($enm_var),
968                         _ => None,
969                 })
970         };
971 }
972
973 #[allow(missing_docs)]
974 impl RawBolt11Invoice {
975         /// Hash the HRP as bytes and signatureless data part.
976         fn hash_from_parts(hrp_bytes: &[u8], data_without_signature: &[u5]) -> [u8; 32] {
977                 let preimage = construct_invoice_preimage(hrp_bytes, data_without_signature);
978                 let mut hash: [u8; 32] = Default::default();
979                 hash.copy_from_slice(&sha256::Hash::hash(&preimage)[..]);
980                 hash
981         }
982
983         /// Calculate the hash of the encoded `RawBolt11Invoice` which should be signed.
984         pub fn signable_hash(&self) -> [u8; 32] {
985                 use bech32::ToBase32;
986
987                 RawBolt11Invoice::hash_from_parts(
988                         self.hrp.to_string().as_bytes(),
989                         &self.data.to_base32()
990                 )
991         }
992
993         /// Signs the invoice using the supplied `sign_method`. This function MAY fail with an error of
994         /// type `E`. Since the signature of a [`SignedRawBolt11Invoice`] is not required to be valid there
995         /// are no constraints regarding the validity of the produced signature.
996         ///
997         /// This is not exported to bindings users as we don't currently support passing function pointers into methods
998         /// explicitly.
999         pub fn sign<F, E>(self, sign_method: F) -> Result<SignedRawBolt11Invoice, E>
1000                 where F: FnOnce(&Message) -> Result<RecoverableSignature, E>
1001         {
1002                 let raw_hash = self.signable_hash();
1003                 let hash = Message::from_slice(&raw_hash[..])
1004                         .expect("Hash is 32 bytes long, same as MESSAGE_SIZE");
1005                 let signature = sign_method(&hash)?;
1006
1007                 Ok(SignedRawBolt11Invoice {
1008                         raw_invoice: self,
1009                         hash: raw_hash,
1010                         signature: Bolt11InvoiceSignature(signature),
1011                 })
1012         }
1013
1014         /// Returns an iterator over all tagged fields with known semantics.
1015         ///
1016         /// This is not exported to bindings users as there is not yet a manual mapping for a FilterMap
1017         pub fn known_tagged_fields(&self)
1018                 -> FilterMap<Iter<RawTaggedField>, fn(&RawTaggedField) -> Option<&TaggedField>>
1019         {
1020                 // For 1.14.0 compatibility: closures' types can't be written an fn()->() in the
1021                 // function's type signature.
1022                 // TODO: refactor once impl Trait is available
1023                 fn match_raw(raw: &RawTaggedField) -> Option<&TaggedField> {
1024                         match *raw {
1025                                 RawTaggedField::KnownSemantics(ref tf) => Some(tf),
1026                                 _ => None,
1027                         }
1028                 }
1029
1030                 self.data.tagged_fields.iter().filter_map(match_raw )
1031         }
1032
1033         pub fn payment_hash(&self) -> Option<&Sha256> {
1034                 find_extract!(self.known_tagged_fields(), TaggedField::PaymentHash(ref x), x)
1035         }
1036
1037         pub fn description(&self) -> Option<&Description> {
1038                 find_extract!(self.known_tagged_fields(), TaggedField::Description(ref x), x)
1039         }
1040
1041         pub fn payee_pub_key(&self) -> Option<&PayeePubKey> {
1042                 find_extract!(self.known_tagged_fields(), TaggedField::PayeePubKey(ref x), x)
1043         }
1044
1045         pub fn description_hash(&self) -> Option<&Sha256> {
1046                 find_extract!(self.known_tagged_fields(), TaggedField::DescriptionHash(ref x), x)
1047         }
1048
1049         pub fn expiry_time(&self) -> Option<&ExpiryTime> {
1050                 find_extract!(self.known_tagged_fields(), TaggedField::ExpiryTime(ref x), x)
1051         }
1052
1053         pub fn min_final_cltv_expiry_delta(&self) -> Option<&MinFinalCltvExpiryDelta> {
1054                 find_extract!(self.known_tagged_fields(), TaggedField::MinFinalCltvExpiryDelta(ref x), x)
1055         }
1056
1057         pub fn payment_secret(&self) -> Option<&PaymentSecret> {
1058                 find_extract!(self.known_tagged_fields(), TaggedField::PaymentSecret(ref x), x)
1059         }
1060
1061         pub fn payment_metadata(&self) -> Option<&Vec<u8>> {
1062                 find_extract!(self.known_tagged_fields(), TaggedField::PaymentMetadata(ref x), x)
1063         }
1064
1065         pub fn features(&self) -> Option<&Bolt11InvoiceFeatures> {
1066                 find_extract!(self.known_tagged_fields(), TaggedField::Features(ref x), x)
1067         }
1068
1069         /// This is not exported to bindings users as we don't support Vec<&NonOpaqueType>
1070         pub fn fallbacks(&self) -> Vec<&Fallback> {
1071                 find_all_extract!(self.known_tagged_fields(), TaggedField::Fallback(ref x), x).collect()
1072         }
1073
1074         pub fn private_routes(&self) -> Vec<&PrivateRoute> {
1075                 find_all_extract!(self.known_tagged_fields(), TaggedField::PrivateRoute(ref x), x).collect()
1076         }
1077
1078         pub fn amount_pico_btc(&self) -> Option<u64> {
1079                 self.hrp.raw_amount.map(|v| {
1080                         v * self.hrp.si_prefix.as_ref().map_or(1_000_000_000_000, |si| { si.multiplier() })
1081                 })
1082         }
1083
1084         pub fn currency(&self) -> Currency {
1085                 self.hrp.currency.clone()
1086         }
1087 }
1088
1089 impl PositiveTimestamp {
1090         /// Creates a `PositiveTimestamp` from a Unix timestamp in the range `0..=MAX_TIMESTAMP`.
1091         ///
1092         /// Otherwise, returns a [`CreationError::TimestampOutOfBounds`].
1093         pub fn from_unix_timestamp(unix_seconds: u64) -> Result<Self, CreationError> {
1094                 if unix_seconds <= MAX_TIMESTAMP {
1095                         Ok(Self(Duration::from_secs(unix_seconds)))
1096                 } else {
1097                         Err(CreationError::TimestampOutOfBounds)
1098                 }
1099         }
1100
1101         /// Creates a `PositiveTimestamp` from a [`SystemTime`] with a corresponding Unix timestamp in
1102         /// the range `0..=MAX_TIMESTAMP`.
1103         ///
1104         /// Note that the subsecond part is dropped as it is not representable in BOLT 11 invoices.
1105         ///
1106         /// Otherwise, returns a [`CreationError::TimestampOutOfBounds`].
1107         #[cfg(feature = "std")]
1108         pub fn from_system_time(time: SystemTime) -> Result<Self, CreationError> {
1109                 time.duration_since(SystemTime::UNIX_EPOCH)
1110                         .map(Self::from_duration_since_epoch)
1111                         .unwrap_or(Err(CreationError::TimestampOutOfBounds))
1112         }
1113
1114         /// Creates a `PositiveTimestamp` from a [`Duration`] since the Unix epoch in the range
1115         /// `0..=MAX_TIMESTAMP`.
1116         ///
1117         /// Note that the subsecond part is dropped as it is not representable in BOLT 11 invoices.
1118         ///
1119         /// Otherwise, returns a [`CreationError::TimestampOutOfBounds`].
1120         pub fn from_duration_since_epoch(duration: Duration) -> Result<Self, CreationError> {
1121                 Self::from_unix_timestamp(duration.as_secs())
1122         }
1123
1124         /// Returns the Unix timestamp representing the stored time
1125         pub fn as_unix_timestamp(&self) -> u64 {
1126                 self.0.as_secs()
1127         }
1128
1129         /// Returns the duration of the stored time since the Unix epoch
1130         pub fn as_duration_since_epoch(&self) -> Duration {
1131                 self.0
1132         }
1133
1134         /// Returns the [`SystemTime`] representing the stored time
1135         #[cfg(feature = "std")]
1136         pub fn as_time(&self) -> SystemTime {
1137                 SystemTime::UNIX_EPOCH + self.0
1138         }
1139 }
1140
1141 impl From<PositiveTimestamp> for Duration {
1142         fn from(val: PositiveTimestamp) -> Self {
1143                 val.0
1144         }
1145 }
1146
1147 #[cfg(feature = "std")]
1148 impl From<PositiveTimestamp> for SystemTime {
1149         fn from(val: PositiveTimestamp) -> Self {
1150                 SystemTime::UNIX_EPOCH + val.0
1151         }
1152 }
1153
1154 impl Bolt11Invoice {
1155         /// The hash of the [`RawBolt11Invoice`] that was signed.
1156         pub fn signable_hash(&self) -> [u8; 32] {
1157                 self.signed_invoice.hash
1158         }
1159
1160         /// Transform the `Bolt11Invoice` into its unchecked version.
1161         pub fn into_signed_raw(self) -> SignedRawBolt11Invoice {
1162                 self.signed_invoice
1163         }
1164
1165         /// Check that all mandatory fields are present
1166         fn check_field_counts(&self) -> Result<(), Bolt11SemanticError> {
1167                 // "A writer MUST include exactly one p field […]."
1168                 let payment_hash_cnt = self.tagged_fields().filter(|&tf| match *tf {
1169                         TaggedField::PaymentHash(_) => true,
1170                         _ => false,
1171                 }).count();
1172                 if payment_hash_cnt < 1 {
1173                         return Err(Bolt11SemanticError::NoPaymentHash);
1174                 } else if payment_hash_cnt > 1 {
1175                         return Err(Bolt11SemanticError::MultiplePaymentHashes);
1176                 }
1177
1178                 // "A writer MUST include either exactly one d or exactly one h field."
1179                 let description_cnt = self.tagged_fields().filter(|&tf| match *tf {
1180                         TaggedField::Description(_) | TaggedField::DescriptionHash(_) => true,
1181                         _ => false,
1182                 }).count();
1183                 if  description_cnt < 1 {
1184                         return Err(Bolt11SemanticError::NoDescription);
1185                 } else if description_cnt > 1 {
1186                         return  Err(Bolt11SemanticError::MultipleDescriptions);
1187                 }
1188
1189                 self.check_payment_secret()?;
1190
1191                 Ok(())
1192         }
1193
1194         /// Checks that there is exactly one payment secret field
1195         fn check_payment_secret(&self) -> Result<(), Bolt11SemanticError> {
1196                 // "A writer MUST include exactly one `s` field."
1197                 let payment_secret_count = self.tagged_fields().filter(|&tf| match *tf {
1198                         TaggedField::PaymentSecret(_) => true,
1199                         _ => false,
1200                 }).count();
1201                 if payment_secret_count < 1 {
1202                         return Err(Bolt11SemanticError::NoPaymentSecret);
1203                 } else if payment_secret_count > 1 {
1204                         return Err(Bolt11SemanticError::MultiplePaymentSecrets);
1205                 }
1206
1207                 Ok(())
1208         }
1209
1210         /// Check that amount is a whole number of millisatoshis
1211         fn check_amount(&self) -> Result<(), Bolt11SemanticError> {
1212                 if let Some(amount_pico_btc) = self.amount_pico_btc() {
1213                         if amount_pico_btc % 10 != 0 {
1214                                 return Err(Bolt11SemanticError::ImpreciseAmount);
1215                         }
1216                 }
1217                 Ok(())
1218         }
1219
1220         /// Check that feature bits are set as required
1221         fn check_feature_bits(&self) -> Result<(), Bolt11SemanticError> {
1222                 self.check_payment_secret()?;
1223
1224                 // "A writer MUST set an s field if and only if the payment_secret feature is set."
1225                 // (this requirement has been since removed, and we now require the payment secret
1226                 // feature bit always).
1227                 let features = self.tagged_fields().find(|&tf| match *tf {
1228                         TaggedField::Features(_) => true,
1229                         _ => false,
1230                 });
1231                 match features {
1232                         None => Err(Bolt11SemanticError::InvalidFeatures),
1233                         Some(TaggedField::Features(features)) => {
1234                                 if features.requires_unknown_bits() {
1235                                         Err(Bolt11SemanticError::InvalidFeatures)
1236                                 } else if !features.supports_payment_secret() {
1237                                         Err(Bolt11SemanticError::InvalidFeatures)
1238                                 } else {
1239                                         Ok(())
1240                                 }
1241                         },
1242                         Some(_) => unreachable!(),
1243                 }
1244         }
1245
1246         /// Check that the invoice is signed correctly and that key recovery works
1247         pub fn check_signature(&self) -> Result<(), Bolt11SemanticError> {
1248                 match self.signed_invoice.recover_payee_pub_key() {
1249                         Err(secp256k1::Error::InvalidRecoveryId) =>
1250                                 return Err(Bolt11SemanticError::InvalidRecoveryId),
1251                         Err(secp256k1::Error::InvalidSignature) =>
1252                                 return Err(Bolt11SemanticError::InvalidSignature),
1253                         Err(e) => panic!("no other error may occur, got {:?}", e),
1254                         Ok(_) => {},
1255                 }
1256
1257                 if !self.signed_invoice.check_signature() {
1258                         return Err(Bolt11SemanticError::InvalidSignature);
1259                 }
1260
1261                 Ok(())
1262         }
1263
1264         /// Constructs a `Bolt11Invoice` from a [`SignedRawBolt11Invoice`] by checking all its invariants.
1265         /// ```
1266         /// use lightning_invoice::*;
1267         ///
1268         /// let invoice = "lnbc100p1psj9jhxdqud3jxktt5w46x7unfv9kz6mn0v3jsnp4q0d3p2sfluzdx45tqcs\
1269         /// h2pu5qc7lgq0xs578ngs6s0s68ua4h7cvspp5q6rmq35js88zp5dvwrv9m459tnk2zunwj5jalqtyxqulh0l\
1270         /// 5gflssp5nf55ny5gcrfl30xuhzj3nphgj27rstekmr9fw3ny5989s300gyus9qyysgqcqpcrzjqw2sxwe993\
1271         /// h5pcm4dxzpvttgza8zhkqxpgffcrf5v25nwpr3cmfg7z54kuqq8rgqqqqqqqq2qqqqq9qq9qrzjqd0ylaqcl\
1272         /// j9424x9m8h2vcukcgnm6s56xfgu3j78zyqzhgs4hlpzvznlugqq9vsqqqqqqqlgqqqqqeqq9qrzjqwldmj9d\
1273         /// ha74df76zhx6l9we0vjdquygcdt3kssupehe64g6yyp5yz5rhuqqwccqqyqqqqlgqqqqjcqq9qrzjqf9e58a\
1274         /// guqr0rcun0ajlvmzq3ek63cw2w282gv3z5uupmuwvgjtq2z55qsqqg6qqqyqqqrtnqqqzq3cqygrzjqvphms\
1275         /// ywntrrhqjcraumvc4y6r8v4z5v593trte429v4hredj7ms5z52usqq9ngqqqqqqqlgqqqqqqgq9qrzjq2v0v\
1276         /// p62g49p7569ev48cmulecsxe59lvaw3wlxm7r982zxa9zzj7z5l0cqqxusqqyqqqqlgqqqqqzsqygarl9fh3\
1277         /// 8s0gyuxjjgux34w75dnc6xp2l35j7es3jd4ugt3lu0xzre26yg5m7ke54n2d5sym4xcmxtl8238xxvw5h5h5\
1278         /// j5r6drg6k6zcqj0fcwg";
1279         ///
1280         /// let signed = invoice.parse::<SignedRawBolt11Invoice>().unwrap();
1281         ///
1282         /// assert!(Bolt11Invoice::from_signed(signed).is_ok());
1283         /// ```
1284         pub fn from_signed(signed_invoice: SignedRawBolt11Invoice) -> Result<Self, Bolt11SemanticError> {
1285                 let invoice = Bolt11Invoice {
1286                         signed_invoice,
1287                 };
1288                 invoice.check_field_counts()?;
1289                 invoice.check_feature_bits()?;
1290                 invoice.check_signature()?;
1291                 invoice.check_amount()?;
1292
1293                 Ok(invoice)
1294         }
1295
1296         /// Returns the `Bolt11Invoice`'s timestamp (should equal its creation time)
1297         #[cfg(feature = "std")]
1298         pub fn timestamp(&self) -> SystemTime {
1299                 self.signed_invoice.raw_invoice().data.timestamp.as_time()
1300         }
1301
1302         /// Returns the `Bolt11Invoice`'s timestamp as a duration since the Unix epoch
1303         pub fn duration_since_epoch(&self) -> Duration {
1304                 self.signed_invoice.raw_invoice().data.timestamp.0
1305         }
1306
1307         /// Returns an iterator over all tagged fields of this `Bolt11Invoice`.
1308         ///
1309         /// This is not exported to bindings users as there is not yet a manual mapping for a FilterMap
1310         pub fn tagged_fields(&self)
1311                 -> FilterMap<Iter<RawTaggedField>, fn(&RawTaggedField) -> Option<&TaggedField>> {
1312                 self.signed_invoice.raw_invoice().known_tagged_fields()
1313         }
1314
1315         /// Returns the hash to which we will receive the preimage on completion of the payment
1316         pub fn payment_hash(&self) -> &sha256::Hash {
1317                 &self.signed_invoice.payment_hash().expect("checked by constructor").0
1318         }
1319
1320         /// Return the description or a hash of it for longer ones
1321         ///
1322         /// This is not exported to bindings users because we don't yet export Bolt11InvoiceDescription
1323         pub fn description(&self) -> Bolt11InvoiceDescription {
1324                 if let Some(direct) = self.signed_invoice.description() {
1325                         return Bolt11InvoiceDescription::Direct(direct);
1326                 } else if let Some(hash) = self.signed_invoice.description_hash() {
1327                         return Bolt11InvoiceDescription::Hash(hash);
1328                 }
1329                 unreachable!("ensured by constructor");
1330         }
1331
1332         /// Get the payee's public key if one was included in the invoice
1333         pub fn payee_pub_key(&self) -> Option<&PublicKey> {
1334                 self.signed_invoice.payee_pub_key().map(|x| &x.0)
1335         }
1336
1337         /// Get the payment secret if one was included in the invoice
1338         pub fn payment_secret(&self) -> &PaymentSecret {
1339                 self.signed_invoice.payment_secret().expect("was checked by constructor")
1340         }
1341
1342         /// Get the payment metadata blob if one was included in the invoice
1343         pub fn payment_metadata(&self) -> Option<&Vec<u8>> {
1344                 self.signed_invoice.payment_metadata()
1345         }
1346
1347         /// Get the invoice features if they were included in the invoice
1348         pub fn features(&self) -> Option<&Bolt11InvoiceFeatures> {
1349                 self.signed_invoice.features()
1350         }
1351
1352         /// Recover the payee's public key (only to be used if none was included in the invoice)
1353         pub fn recover_payee_pub_key(&self) -> PublicKey {
1354                 self.signed_invoice.recover_payee_pub_key().expect("was checked by constructor").0
1355         }
1356
1357         /// Returns the Duration since the Unix epoch at which the invoice expires.
1358         /// Returning None if overflow occurred.
1359         pub fn expires_at(&self) -> Option<Duration> {
1360                 self.duration_since_epoch().checked_add(self.expiry_time())
1361         }
1362
1363         /// Returns the invoice's expiry time, if present, otherwise [`DEFAULT_EXPIRY_TIME`].
1364         pub fn expiry_time(&self) -> Duration {
1365                 self.signed_invoice.expiry_time()
1366                         .map(|x| x.0)
1367                         .unwrap_or(Duration::from_secs(DEFAULT_EXPIRY_TIME))
1368         }
1369
1370         /// Returns whether the invoice has expired.
1371         #[cfg(feature = "std")]
1372         pub fn is_expired(&self) -> bool {
1373                 Self::is_expired_from_epoch(&self.timestamp(), self.expiry_time())
1374         }
1375
1376         /// Returns whether the expiry time from the given epoch has passed.
1377         #[cfg(feature = "std")]
1378         pub(crate) fn is_expired_from_epoch(epoch: &SystemTime, expiry_time: Duration) -> bool {
1379                 match epoch.elapsed() {
1380                         Ok(elapsed) => elapsed > expiry_time,
1381                         Err(_) => false,
1382                 }
1383         }
1384
1385         /// Returns the Duration remaining until the invoice expires.
1386         #[cfg(feature = "std")]
1387         pub fn duration_until_expiry(&self) -> Duration {
1388                 SystemTime::now().duration_since(SystemTime::UNIX_EPOCH)
1389                         .map(|now| self.expiration_remaining_from_epoch(now))
1390                         .unwrap_or(Duration::from_nanos(0))
1391         }
1392
1393         /// Returns the Duration remaining until the invoice expires given the current time.
1394         /// `time` is the timestamp as a duration since the Unix epoch.
1395         pub fn expiration_remaining_from_epoch(&self, time: Duration) -> Duration {
1396                 self.expires_at().map(|x| x.checked_sub(time)).flatten().unwrap_or(Duration::from_nanos(0))
1397         }
1398
1399         /// Returns whether the expiry time would pass at the given point in time.
1400         /// `at_time` is the timestamp as a duration since the Unix epoch.
1401         pub fn would_expire(&self, at_time: Duration) -> bool {
1402                 self.duration_since_epoch()
1403                         .checked_add(self.expiry_time())
1404                         .unwrap_or_else(|| Duration::new(u64::max_value(), 1_000_000_000 - 1)) < at_time
1405         }
1406
1407         /// Returns the invoice's `min_final_cltv_expiry_delta` time, if present, otherwise
1408         /// [`DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA`].
1409         pub fn min_final_cltv_expiry_delta(&self) -> u64 {
1410                 self.signed_invoice.min_final_cltv_expiry_delta()
1411                         .map(|x| x.0)
1412                         .unwrap_or(DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA)
1413         }
1414
1415         /// Returns a list of all fallback addresses
1416         ///
1417         /// This is not exported to bindings users as we don't support Vec<&NonOpaqueType>
1418         pub fn fallbacks(&self) -> Vec<&Fallback> {
1419                 self.signed_invoice.fallbacks()
1420         }
1421
1422         /// Returns a list of all fallback addresses as [`Address`]es
1423         pub fn fallback_addresses(&self) -> Vec<Address> {
1424                 self.fallbacks().iter().filter_map(|fallback| {
1425                         let payload = match fallback {
1426                                 Fallback::SegWitProgram { version, program } => {
1427                                         match WitnessProgram::new(*version, program.clone()) {
1428                                                 Ok(witness_program) => Payload::WitnessProgram(witness_program),
1429                                                 Err(_) => return None,
1430                                         }
1431                                 }
1432                                 Fallback::PubKeyHash(pkh) => {
1433                                         Payload::PubkeyHash(*pkh)
1434                                 }
1435                                 Fallback::ScriptHash(sh) => {
1436                                         Payload::ScriptHash(*sh)
1437                                 }
1438                         };
1439
1440                         Some(Address::new(self.network(), payload))
1441                 }).collect()
1442         }
1443
1444         /// Returns a list of all routes included in the invoice
1445         pub fn private_routes(&self) -> Vec<&PrivateRoute> {
1446                 self.signed_invoice.private_routes()
1447         }
1448
1449         /// Returns a list of all routes included in the invoice as the underlying hints
1450         pub fn route_hints(&self) -> Vec<RouteHint> {
1451                 find_all_extract!(
1452                         self.signed_invoice.known_tagged_fields(), TaggedField::PrivateRoute(ref x), x
1453                 ).map(|route| (**route).clone()).collect()
1454         }
1455
1456         /// Returns the currency for which the invoice was issued
1457         pub fn currency(&self) -> Currency {
1458                 self.signed_invoice.currency()
1459         }
1460
1461         /// Returns the network for which the invoice was issued
1462         ///
1463         /// This is not exported to bindings users, see [`Self::currency`] instead.
1464         pub fn network(&self) -> Network {
1465                 self.signed_invoice.currency().into()
1466         }
1467
1468         /// Returns the amount if specified in the invoice as millisatoshis.
1469         pub fn amount_milli_satoshis(&self) -> Option<u64> {
1470                 self.signed_invoice.amount_pico_btc().map(|v| v / 10)
1471         }
1472
1473         /// Returns the amount if specified in the invoice as pico BTC.
1474         fn amount_pico_btc(&self) -> Option<u64> {
1475                 self.signed_invoice.amount_pico_btc()
1476         }
1477 }
1478
1479 impl From<TaggedField> for RawTaggedField {
1480         fn from(tf: TaggedField) -> Self {
1481                 RawTaggedField::KnownSemantics(tf)
1482         }
1483 }
1484
1485 impl TaggedField {
1486         /// Numeric representation of the field's tag
1487         pub fn tag(&self) -> u5 {
1488                 let tag = match *self {
1489                         TaggedField::PaymentHash(_) => constants::TAG_PAYMENT_HASH,
1490                         TaggedField::Description(_) => constants::TAG_DESCRIPTION,
1491                         TaggedField::PayeePubKey(_) => constants::TAG_PAYEE_PUB_KEY,
1492                         TaggedField::DescriptionHash(_) => constants::TAG_DESCRIPTION_HASH,
1493                         TaggedField::ExpiryTime(_) => constants::TAG_EXPIRY_TIME,
1494                         TaggedField::MinFinalCltvExpiryDelta(_) => constants::TAG_MIN_FINAL_CLTV_EXPIRY_DELTA,
1495                         TaggedField::Fallback(_) => constants::TAG_FALLBACK,
1496                         TaggedField::PrivateRoute(_) => constants::TAG_PRIVATE_ROUTE,
1497                         TaggedField::PaymentSecret(_) => constants::TAG_PAYMENT_SECRET,
1498                         TaggedField::PaymentMetadata(_) => constants::TAG_PAYMENT_METADATA,
1499                         TaggedField::Features(_) => constants::TAG_FEATURES,
1500                 };
1501
1502                 u5::try_from_u8(tag).expect("all tags defined are <32")
1503         }
1504 }
1505
1506 impl Description {
1507
1508         /// Creates a new `Description` if `description` is at most 1023 __bytes__ long,
1509         /// returns [`CreationError::DescriptionTooLong`] otherwise
1510         ///
1511         /// Please note that single characters may use more than one byte due to UTF8 encoding.
1512         pub fn new(description: String) -> Result<Description, CreationError> {
1513                 if description.len() > 639 {
1514                         Err(CreationError::DescriptionTooLong)
1515                 } else {
1516                         Ok(Description(UntrustedString(description)))
1517                 }
1518         }
1519
1520         /// Returns the underlying description [`UntrustedString`]
1521         pub fn into_inner(self) -> UntrustedString {
1522                 self.0
1523         }
1524 }
1525
1526 impl Display for Description {
1527         fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
1528                 write!(f, "{}", self.0)
1529         }
1530 }
1531
1532 impl From<PublicKey> for PayeePubKey {
1533         fn from(pk: PublicKey) -> Self {
1534                 PayeePubKey(pk)
1535         }
1536 }
1537
1538 impl Deref for PayeePubKey {
1539         type Target = PublicKey;
1540
1541         fn deref(&self) -> &PublicKey {
1542                 &self.0
1543         }
1544 }
1545
1546 impl ExpiryTime {
1547         /// Construct an `ExpiryTime` from seconds.
1548         pub fn from_seconds(seconds: u64) -> ExpiryTime {
1549                 ExpiryTime(Duration::from_secs(seconds))
1550         }
1551
1552         /// Construct an `ExpiryTime` from a [`Duration`], dropping the sub-second part.
1553         pub fn from_duration(duration: Duration) -> ExpiryTime {
1554                 Self::from_seconds(duration.as_secs())
1555         }
1556
1557         /// Returns the expiry time in seconds
1558         pub fn as_seconds(&self) -> u64 {
1559                 self.0.as_secs()
1560         }
1561
1562         /// Returns a reference to the underlying [`Duration`] (=expiry time)
1563         pub fn as_duration(&self) -> &Duration {
1564                 &self.0
1565         }
1566 }
1567
1568 impl PrivateRoute {
1569         /// Creates a new (partial) route from a list of hops
1570         pub fn new(hops: RouteHint) -> Result<PrivateRoute, CreationError> {
1571                 if hops.0.len() <= 12 {
1572                         Ok(PrivateRoute(hops))
1573                 } else {
1574                         Err(CreationError::RouteTooLong)
1575                 }
1576         }
1577
1578         /// Returns the underlying list of hops
1579         pub fn into_inner(self) -> RouteHint {
1580                 self.0
1581         }
1582 }
1583
1584 impl From<PrivateRoute> for RouteHint {
1585         fn from(val: PrivateRoute) -> Self {
1586                 val.into_inner()
1587         }
1588 }
1589
1590 impl Deref for PrivateRoute {
1591         type Target = RouteHint;
1592
1593         fn deref(&self) -> &RouteHint {
1594                 &self.0
1595         }
1596 }
1597
1598 impl Deref for Bolt11InvoiceSignature {
1599         type Target = RecoverableSignature;
1600
1601         fn deref(&self) -> &RecoverableSignature {
1602                 &self.0
1603         }
1604 }
1605
1606 impl Deref for SignedRawBolt11Invoice {
1607         type Target = RawBolt11Invoice;
1608
1609         fn deref(&self) -> &RawBolt11Invoice {
1610                 &self.raw_invoice
1611         }
1612 }
1613
1614 /// Errors that may occur when constructing a new [`RawBolt11Invoice`] or [`Bolt11Invoice`]
1615 #[derive(Eq, PartialEq, Debug, Clone)]
1616 pub enum CreationError {
1617         /// The supplied description string was longer than 639 __bytes__ (see [`Description::new`])
1618         DescriptionTooLong,
1619
1620         /// The specified route has too many hops and can't be encoded
1621         RouteTooLong,
1622
1623         /// The Unix timestamp of the supplied date is less than zero or greater than 35-bits
1624         TimestampOutOfBounds,
1625
1626         /// The supplied millisatoshi amount was greater than the total bitcoin supply.
1627         InvalidAmount,
1628
1629         /// Route hints were required for this invoice and were missing. Applies to
1630         /// [phantom invoices].
1631         ///
1632         /// [phantom invoices]: crate::utils::create_phantom_invoice
1633         MissingRouteHints,
1634
1635         /// The provided `min_final_cltv_expiry_delta` was less than [`MIN_FINAL_CLTV_EXPIRY_DELTA`].
1636         ///
1637         /// [`MIN_FINAL_CLTV_EXPIRY_DELTA`]: lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA
1638         MinFinalCltvExpiryDeltaTooShort,
1639 }
1640
1641 impl Display for CreationError {
1642         fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
1643                 match self {
1644                         CreationError::DescriptionTooLong => f.write_str("The supplied description string was longer than 639 bytes"),
1645                         CreationError::RouteTooLong => f.write_str("The specified route has too many hops and can't be encoded"),
1646                         CreationError::TimestampOutOfBounds => f.write_str("The Unix timestamp of the supplied date is less than zero or greater than 35-bits"),
1647                         CreationError::InvalidAmount => f.write_str("The supplied millisatoshi amount was greater than the total bitcoin supply"),
1648                         CreationError::MissingRouteHints => f.write_str("The invoice required route hints and they weren't provided"),
1649                         CreationError::MinFinalCltvExpiryDeltaTooShort => f.write_str(
1650                                 "The supplied final CLTV expiry delta was less than LDK's `MIN_FINAL_CLTV_EXPIRY_DELTA`"),
1651                 }
1652         }
1653 }
1654
1655 #[cfg(feature = "std")]
1656 impl std::error::Error for CreationError { }
1657
1658 /// Errors that may occur when converting a [`RawBolt11Invoice`] to a [`Bolt11Invoice`]. They relate to
1659 /// the requirements sections in BOLT #11
1660 #[derive(Eq, PartialEq, Debug, Clone)]
1661 pub enum Bolt11SemanticError {
1662         /// The invoice is missing the mandatory payment hash
1663         NoPaymentHash,
1664
1665         /// The invoice has multiple payment hashes which isn't allowed
1666         MultiplePaymentHashes,
1667
1668         /// No description or description hash are part of the invoice
1669         NoDescription,
1670
1671         /// The invoice contains multiple descriptions and/or description hashes which isn't allowed
1672         MultipleDescriptions,
1673
1674         /// The invoice is missing the mandatory payment secret, which all modern lightning nodes
1675         /// should provide.
1676         NoPaymentSecret,
1677
1678         /// The invoice contains multiple payment secrets
1679         MultiplePaymentSecrets,
1680
1681         /// The invoice's features are invalid
1682         InvalidFeatures,
1683
1684         /// The recovery id doesn't fit the signature/pub key
1685         InvalidRecoveryId,
1686
1687         /// The invoice's signature is invalid
1688         InvalidSignature,
1689
1690         /// The invoice's amount was not a whole number of millisatoshis
1691         ImpreciseAmount,
1692 }
1693
1694 impl Display for Bolt11SemanticError {
1695         fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
1696                 match self {
1697                         Bolt11SemanticError::NoPaymentHash => f.write_str("The invoice is missing the mandatory payment hash"),
1698                         Bolt11SemanticError::MultiplePaymentHashes => f.write_str("The invoice has multiple payment hashes which isn't allowed"),
1699                         Bolt11SemanticError::NoDescription => f.write_str("No description or description hash are part of the invoice"),
1700                         Bolt11SemanticError::MultipleDescriptions => f.write_str("The invoice contains multiple descriptions and/or description hashes which isn't allowed"),
1701                         Bolt11SemanticError::NoPaymentSecret => f.write_str("The invoice is missing the mandatory payment secret"),
1702                         Bolt11SemanticError::MultiplePaymentSecrets => f.write_str("The invoice contains multiple payment secrets"),
1703                         Bolt11SemanticError::InvalidFeatures => f.write_str("The invoice's features are invalid"),
1704                         Bolt11SemanticError::InvalidRecoveryId => f.write_str("The recovery id doesn't fit the signature/pub key"),
1705                         Bolt11SemanticError::InvalidSignature => f.write_str("The invoice's signature is invalid"),
1706                         Bolt11SemanticError::ImpreciseAmount => f.write_str("The invoice's amount was not a whole number of millisatoshis"),
1707                 }
1708         }
1709 }
1710
1711 #[cfg(feature = "std")]
1712 impl std::error::Error for Bolt11SemanticError { }
1713
1714 /// When signing using a fallible method either an user-supplied `SignError` or a [`CreationError`]
1715 /// may occur.
1716 #[derive(Eq, PartialEq, Debug, Clone)]
1717 pub enum SignOrCreationError<S = ()> {
1718         /// An error occurred during signing
1719         SignError(S),
1720
1721         /// An error occurred while building the transaction
1722         CreationError(CreationError),
1723 }
1724
1725 impl<S> Display for SignOrCreationError<S> {
1726         fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
1727                 match self {
1728                         SignOrCreationError::SignError(_) => f.write_str("An error occurred during signing"),
1729                         SignOrCreationError::CreationError(err) => err.fmt(f),
1730                 }
1731         }
1732 }
1733
1734 #[cfg(feature = "serde")]
1735 impl Serialize for Bolt11Invoice {
1736         fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
1737                 serializer.serialize_str(self.to_string().as_str())
1738         }
1739 }
1740 #[cfg(feature = "serde")]
1741 impl<'de> Deserialize<'de> for Bolt11Invoice {
1742         fn deserialize<D>(deserializer: D) -> Result<Bolt11Invoice, D::Error> where D: Deserializer<'de> {
1743                 let bolt11 = String::deserialize(deserializer)?
1744                         .parse::<Bolt11Invoice>()
1745                         .map_err(|e| D::Error::custom(format_args!("{:?}", e)))?;
1746
1747                 Ok(bolt11)
1748         }
1749 }
1750
1751 #[cfg(test)]
1752 mod test {
1753         use bitcoin::ScriptBuf;
1754         use bitcoin::hashes::sha256;
1755         use std::str::FromStr;
1756
1757         #[test]
1758         fn test_system_time_bounds_assumptions() {
1759                 assert_eq!(
1760                         crate::PositiveTimestamp::from_unix_timestamp(crate::MAX_TIMESTAMP + 1),
1761                         Err(crate::CreationError::TimestampOutOfBounds)
1762                 );
1763         }
1764
1765         #[test]
1766         fn test_calc_invoice_hash() {
1767                 use crate::{RawBolt11Invoice, RawHrp, RawDataPart, Currency, PositiveTimestamp};
1768                 use crate::TaggedField::*;
1769
1770                 let invoice = RawBolt11Invoice {
1771                         hrp: RawHrp {
1772                                 currency: Currency::Bitcoin,
1773                                 raw_amount: None,
1774                                 si_prefix: None,
1775                         },
1776                         data: RawDataPart {
1777                                 timestamp: PositiveTimestamp::from_unix_timestamp(1496314658).unwrap(),
1778                                 tagged_fields: vec![
1779                                         PaymentHash(crate::Sha256(sha256::Hash::from_str(
1780                                                 "0001020304050607080900010203040506070809000102030405060708090102"
1781                                         ).unwrap())).into(),
1782                                         Description(crate::Description::new(
1783                                                 "Please consider supporting this project".to_owned()
1784                                         ).unwrap()).into(),
1785                                 ],
1786                         },
1787                 };
1788
1789                 let expected_hash = [
1790                         0xc3, 0xd4, 0xe8, 0x3f, 0x64, 0x6f, 0xa7, 0x9a, 0x39, 0x3d, 0x75, 0x27, 0x7b, 0x1d,
1791                         0x85, 0x8d, 0xb1, 0xd1, 0xf7, 0xab, 0x71, 0x37, 0xdc, 0xb7, 0x83, 0x5d, 0xb2, 0xec,
1792                         0xd5, 0x18, 0xe1, 0xc9
1793                 ];
1794
1795                 assert_eq!(invoice.signable_hash(), expected_hash)
1796         }
1797
1798         #[test]
1799         fn test_check_signature() {
1800                 use crate::TaggedField::*;
1801                 use secp256k1::Secp256k1;
1802                 use secp256k1::ecdsa::{RecoveryId, RecoverableSignature};
1803                 use secp256k1::{SecretKey, PublicKey};
1804                 use crate::{SignedRawBolt11Invoice, Bolt11InvoiceSignature, RawBolt11Invoice, RawHrp, RawDataPart, Currency, Sha256,
1805                          PositiveTimestamp};
1806
1807                 let invoice = SignedRawBolt11Invoice {
1808                         raw_invoice: RawBolt11Invoice {
1809                                 hrp: RawHrp {
1810                                         currency: Currency::Bitcoin,
1811                                         raw_amount: None,
1812                                         si_prefix: None,
1813                                 },
1814                                 data: RawDataPart {
1815                                         timestamp: PositiveTimestamp::from_unix_timestamp(1496314658).unwrap(),
1816                                         tagged_fields: vec ! [
1817                                                 PaymentHash(Sha256(sha256::Hash::from_str(
1818                                                         "0001020304050607080900010203040506070809000102030405060708090102"
1819                                                 ).unwrap())).into(),
1820                                                 Description(
1821                                                         crate::Description::new(
1822                                                                 "Please consider supporting this project".to_owned()
1823                                                         ).unwrap()
1824                                                 ).into(),
1825                                         ],
1826                                 },
1827                         },
1828                         hash: [
1829                                 0xc3, 0xd4, 0xe8, 0x3f, 0x64, 0x6f, 0xa7, 0x9a, 0x39, 0x3d, 0x75, 0x27,
1830                                 0x7b, 0x1d, 0x85, 0x8d, 0xb1, 0xd1, 0xf7, 0xab, 0x71, 0x37, 0xdc, 0xb7,
1831                                 0x83, 0x5d, 0xb2, 0xec, 0xd5, 0x18, 0xe1, 0xc9
1832                         ],
1833                         signature: Bolt11InvoiceSignature(RecoverableSignature::from_compact(
1834                                 & [
1835                                         0x38u8, 0xec, 0x68, 0x91, 0x34, 0x5e, 0x20, 0x41, 0x45, 0xbe, 0x8a,
1836                                         0x3a, 0x99, 0xde, 0x38, 0xe9, 0x8a, 0x39, 0xd6, 0xa5, 0x69, 0x43,
1837                                         0x4e, 0x18, 0x45, 0xc8, 0xaf, 0x72, 0x05, 0xaf, 0xcf, 0xcc, 0x7f,
1838                                         0x42, 0x5f, 0xcd, 0x14, 0x63, 0xe9, 0x3c, 0x32, 0x88, 0x1e, 0xad,
1839                                         0x0d, 0x6e, 0x35, 0x6d, 0x46, 0x7e, 0xc8, 0xc0, 0x25, 0x53, 0xf9,
1840                                         0xaa, 0xb1, 0x5e, 0x57, 0x38, 0xb1, 0x1f, 0x12, 0x7f
1841                                 ],
1842                                 RecoveryId::from_i32(0).unwrap()
1843                         ).unwrap()),
1844                 };
1845
1846                 assert!(invoice.check_signature());
1847
1848                 let private_key = SecretKey::from_slice(
1849                         &[
1850                                 0xe1, 0x26, 0xf6, 0x8f, 0x7e, 0xaf, 0xcc, 0x8b, 0x74, 0xf5, 0x4d, 0x26, 0x9f, 0xe2,
1851                                 0x06, 0xbe, 0x71, 0x50, 0x00, 0xf9, 0x4d, 0xac, 0x06, 0x7d, 0x1c, 0x04, 0xa8, 0xca,
1852                                 0x3b, 0x2d, 0xb7, 0x34
1853                         ][..]
1854                 ).unwrap();
1855                 let public_key = PublicKey::from_secret_key(&Secp256k1::new(), &private_key);
1856
1857                 assert_eq!(invoice.recover_payee_pub_key(), Ok(crate::PayeePubKey(public_key)));
1858
1859                 let (raw_invoice, _, _) = invoice.into_parts();
1860                 let new_signed = raw_invoice.sign::<_, ()>(|hash| {
1861                         Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key))
1862                 }).unwrap();
1863
1864                 assert!(new_signed.check_signature());
1865         }
1866
1867         #[test]
1868         fn test_check_feature_bits() {
1869                 use crate::TaggedField::*;
1870                 use lightning::ln::features::Bolt11InvoiceFeatures;
1871                 use secp256k1::Secp256k1;
1872                 use secp256k1::SecretKey;
1873                 use crate::{Bolt11Invoice, RawBolt11Invoice, RawHrp, RawDataPart, Currency, Sha256, PositiveTimestamp,
1874                          Bolt11SemanticError};
1875
1876                 let private_key = SecretKey::from_slice(&[42; 32]).unwrap();
1877                 let payment_secret = lightning::ln::PaymentSecret([21; 32]);
1878                 let invoice_template = RawBolt11Invoice {
1879                         hrp: RawHrp {
1880                                 currency: Currency::Bitcoin,
1881                                 raw_amount: None,
1882                                 si_prefix: None,
1883                         },
1884                         data: RawDataPart {
1885                                 timestamp: PositiveTimestamp::from_unix_timestamp(1496314658).unwrap(),
1886                                 tagged_fields: vec ! [
1887                                         PaymentHash(Sha256(sha256::Hash::from_str(
1888                                                 "0001020304050607080900010203040506070809000102030405060708090102"
1889                                         ).unwrap())).into(),
1890                                         Description(
1891                                                 crate::Description::new(
1892                                                         "Please consider supporting this project".to_owned()
1893                                                 ).unwrap()
1894                                         ).into(),
1895                                 ],
1896                         },
1897                 };
1898
1899                 // Missing features
1900                 let invoice = {
1901                         let mut invoice = invoice_template.clone();
1902                         invoice.data.tagged_fields.push(PaymentSecret(payment_secret).into());
1903                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1904                 }.unwrap();
1905                 assert_eq!(Bolt11Invoice::from_signed(invoice), Err(Bolt11SemanticError::InvalidFeatures));
1906
1907                 // Missing feature bits
1908                 let invoice = {
1909                         let mut invoice = invoice_template.clone();
1910                         invoice.data.tagged_fields.push(PaymentSecret(payment_secret).into());
1911                         invoice.data.tagged_fields.push(Features(Bolt11InvoiceFeatures::empty()).into());
1912                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1913                 }.unwrap();
1914                 assert_eq!(Bolt11Invoice::from_signed(invoice), Err(Bolt11SemanticError::InvalidFeatures));
1915
1916                 let mut payment_secret_features = Bolt11InvoiceFeatures::empty();
1917                 payment_secret_features.set_payment_secret_required();
1918
1919                 // Including payment secret and feature bits
1920                 let invoice = {
1921                         let mut invoice = invoice_template.clone();
1922                         invoice.data.tagged_fields.push(PaymentSecret(payment_secret).into());
1923                         invoice.data.tagged_fields.push(Features(payment_secret_features.clone()).into());
1924                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1925                 }.unwrap();
1926                 assert!(Bolt11Invoice::from_signed(invoice).is_ok());
1927
1928                 // No payment secret or features
1929                 let invoice = {
1930                         let invoice = invoice_template.clone();
1931                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1932                 }.unwrap();
1933                 assert_eq!(Bolt11Invoice::from_signed(invoice), Err(Bolt11SemanticError::NoPaymentSecret));
1934
1935                 // No payment secret or feature bits
1936                 let invoice = {
1937                         let mut invoice = invoice_template.clone();
1938                         invoice.data.tagged_fields.push(Features(Bolt11InvoiceFeatures::empty()).into());
1939                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1940                 }.unwrap();
1941                 assert_eq!(Bolt11Invoice::from_signed(invoice), Err(Bolt11SemanticError::NoPaymentSecret));
1942
1943                 // Missing payment secret
1944                 let invoice = {
1945                         let mut invoice = invoice_template.clone();
1946                         invoice.data.tagged_fields.push(Features(payment_secret_features).into());
1947                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1948                 }.unwrap();
1949                 assert_eq!(Bolt11Invoice::from_signed(invoice), Err(Bolt11SemanticError::NoPaymentSecret));
1950
1951                 // Multiple payment secrets
1952                 let invoice = {
1953                         let mut invoice = invoice_template;
1954                         invoice.data.tagged_fields.push(PaymentSecret(payment_secret).into());
1955                         invoice.data.tagged_fields.push(PaymentSecret(payment_secret).into());
1956                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1957                 }.unwrap();
1958                 assert_eq!(Bolt11Invoice::from_signed(invoice), Err(Bolt11SemanticError::MultiplePaymentSecrets));
1959         }
1960
1961         #[test]
1962         fn test_builder_amount() {
1963                 use crate::*;
1964
1965                 let builder = InvoiceBuilder::new(Currency::Bitcoin)
1966                         .description("Test".into())
1967                         .payment_hash(sha256::Hash::from_slice(&[0;32][..]).unwrap())
1968                         .duration_since_epoch(Duration::from_secs(1234567));
1969
1970                 let invoice = builder.clone()
1971                         .amount_milli_satoshis(1500)
1972                         .build_raw()
1973                         .unwrap();
1974
1975                 assert_eq!(invoice.hrp.si_prefix, Some(SiPrefix::Nano));
1976                 assert_eq!(invoice.hrp.raw_amount, Some(15));
1977
1978
1979                 let invoice = builder
1980                         .amount_milli_satoshis(150)
1981                         .build_raw()
1982                         .unwrap();
1983
1984                 assert_eq!(invoice.hrp.si_prefix, Some(SiPrefix::Pico));
1985                 assert_eq!(invoice.hrp.raw_amount, Some(1500));
1986         }
1987
1988         #[test]
1989         fn test_builder_fail() {
1990                 use crate::*;
1991                 use lightning::routing::router::RouteHintHop;
1992                 use std::iter::FromIterator;
1993                 use secp256k1::PublicKey;
1994
1995                 let builder = InvoiceBuilder::new(Currency::Bitcoin)
1996                         .payment_hash(sha256::Hash::from_slice(&[0;32][..]).unwrap())
1997                         .duration_since_epoch(Duration::from_secs(1234567))
1998                         .min_final_cltv_expiry_delta(144);
1999
2000                 let too_long_string = String::from_iter(
2001                         (0..1024).map(|_| '?')
2002                 );
2003
2004                 let long_desc_res = builder.clone()
2005                         .description(too_long_string)
2006                         .build_raw();
2007                 assert_eq!(long_desc_res, Err(CreationError::DescriptionTooLong));
2008
2009                 let route_hop = RouteHintHop {
2010                         src_node_id: PublicKey::from_slice(
2011                                         &[
2012                                                 0x03, 0x9e, 0x03, 0xa9, 0x01, 0xb8, 0x55, 0x34, 0xff, 0x1e, 0x92, 0xc4,
2013                                                 0x3c, 0x74, 0x43, 0x1f, 0x7c, 0xe7, 0x20, 0x46, 0x06, 0x0f, 0xcf, 0x7a,
2014                                                 0x95, 0xc3, 0x7e, 0x14, 0x8f, 0x78, 0xc7, 0x72, 0x55
2015                                         ][..]
2016                                 ).unwrap(),
2017                         short_channel_id: 0,
2018                         fees: RoutingFees {
2019                                 base_msat: 0,
2020                                 proportional_millionths: 0,
2021                         },
2022                         cltv_expiry_delta: 0,
2023                         htlc_minimum_msat: None,
2024                         htlc_maximum_msat: None,
2025                 };
2026                 let too_long_route = RouteHint(vec![route_hop; 13]);
2027                 let long_route_res = builder.clone()
2028                         .description("Test".into())
2029                         .private_route(too_long_route)
2030                         .build_raw();
2031                 assert_eq!(long_route_res, Err(CreationError::RouteTooLong));
2032
2033                 let sign_error_res = builder
2034                         .description("Test".into())
2035                         .payment_secret(PaymentSecret([0; 32]))
2036                         .try_build_signed(|_| {
2037                                 Err("ImaginaryError")
2038                         });
2039                 assert_eq!(sign_error_res, Err(SignOrCreationError::SignError("ImaginaryError")));
2040         }
2041
2042         #[test]
2043         fn test_builder_ok() {
2044                 use crate::*;
2045                 use lightning::routing::router::RouteHintHop;
2046                 use secp256k1::Secp256k1;
2047                 use secp256k1::{SecretKey, PublicKey};
2048                 use std::time::Duration;
2049
2050                 let secp_ctx = Secp256k1::new();
2051
2052                 let private_key = SecretKey::from_slice(
2053                         &[
2054                                 0xe1, 0x26, 0xf6, 0x8f, 0x7e, 0xaf, 0xcc, 0x8b, 0x74, 0xf5, 0x4d, 0x26, 0x9f, 0xe2,
2055                                 0x06, 0xbe, 0x71, 0x50, 0x00, 0xf9, 0x4d, 0xac, 0x06, 0x7d, 0x1c, 0x04, 0xa8, 0xca,
2056                                 0x3b, 0x2d, 0xb7, 0x34
2057                         ][..]
2058                 ).unwrap();
2059                 let public_key = PublicKey::from_secret_key(&secp_ctx, &private_key);
2060
2061                 let route_1 = RouteHint(vec![
2062                         RouteHintHop {
2063                                 src_node_id: public_key,
2064                                 short_channel_id: de::parse_int_be(&[123; 8], 256).expect("short chan ID slice too big?"),
2065                                 fees: RoutingFees {
2066                                         base_msat: 2,
2067                                         proportional_millionths: 1,
2068                                 },
2069                                 cltv_expiry_delta: 145,
2070                                 htlc_minimum_msat: None,
2071                                 htlc_maximum_msat: None,
2072                         },
2073                         RouteHintHop {
2074                                 src_node_id: public_key,
2075                                 short_channel_id: de::parse_int_be(&[42; 8], 256).expect("short chan ID slice too big?"),
2076                                 fees: RoutingFees {
2077                                         base_msat: 3,
2078                                         proportional_millionths: 2,
2079                                 },
2080                                 cltv_expiry_delta: 146,
2081                                 htlc_minimum_msat: None,
2082                                 htlc_maximum_msat: None,
2083                         }
2084                 ]);
2085
2086                 let route_2 = RouteHint(vec![
2087                         RouteHintHop {
2088                                 src_node_id: public_key,
2089                                 short_channel_id: 0,
2090                                 fees: RoutingFees {
2091                                         base_msat: 4,
2092                                         proportional_millionths: 3,
2093                                 },
2094                                 cltv_expiry_delta: 147,
2095                                 htlc_minimum_msat: None,
2096                                 htlc_maximum_msat: None,
2097                         },
2098                         RouteHintHop {
2099                                 src_node_id: public_key,
2100                                 short_channel_id: de::parse_int_be(&[1; 8], 256).expect("short chan ID slice too big?"),
2101                                 fees: RoutingFees {
2102                                         base_msat: 5,
2103                                         proportional_millionths: 4,
2104                                 },
2105                                 cltv_expiry_delta: 148,
2106                                 htlc_minimum_msat: None,
2107                                 htlc_maximum_msat: None,
2108                         }
2109                 ]);
2110
2111                 let builder = InvoiceBuilder::new(Currency::BitcoinTestnet)
2112                         .amount_milli_satoshis(123)
2113                         .duration_since_epoch(Duration::from_secs(1234567))
2114                         .payee_pub_key(public_key)
2115                         .expiry_time(Duration::from_secs(54321))
2116                         .min_final_cltv_expiry_delta(144)
2117                         .fallback(Fallback::PubKeyHash(PubkeyHash::from_slice(&[0;20]).unwrap()))
2118                         .private_route(route_1.clone())
2119                         .private_route(route_2.clone())
2120                         .description_hash(sha256::Hash::from_slice(&[3;32][..]).unwrap())
2121                         .payment_hash(sha256::Hash::from_slice(&[21;32][..]).unwrap())
2122                         .payment_secret(PaymentSecret([42; 32]))
2123                         .basic_mpp();
2124
2125                 let invoice = builder.clone().build_signed(|hash| {
2126                         secp_ctx.sign_ecdsa_recoverable(hash, &private_key)
2127                 }).unwrap();
2128
2129                 assert!(invoice.check_signature().is_ok());
2130                 assert_eq!(invoice.tagged_fields().count(), 10);
2131
2132                 assert_eq!(invoice.amount_milli_satoshis(), Some(123));
2133                 assert_eq!(invoice.amount_pico_btc(), Some(1230));
2134                 assert_eq!(invoice.currency(), Currency::BitcoinTestnet);
2135                 #[cfg(feature = "std")]
2136                 assert_eq!(
2137                         invoice.timestamp().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs(),
2138                         1234567
2139                 );
2140                 assert_eq!(invoice.payee_pub_key(), Some(&public_key));
2141                 assert_eq!(invoice.expiry_time(), Duration::from_secs(54321));
2142                 assert_eq!(invoice.min_final_cltv_expiry_delta(), 144);
2143                 assert_eq!(invoice.fallbacks(), vec![&Fallback::PubKeyHash(PubkeyHash::from_slice(&[0;20]).unwrap())]);
2144                 let address = Address::from_script(&ScriptBuf::new_p2pkh(&PubkeyHash::from_slice(&[0;20]).unwrap()), Network::Testnet).unwrap();
2145                 assert_eq!(invoice.fallback_addresses(), vec![address]);
2146                 assert_eq!(invoice.private_routes(), vec![&PrivateRoute(route_1), &PrivateRoute(route_2)]);
2147                 assert_eq!(
2148                         invoice.description(),
2149                         Bolt11InvoiceDescription::Hash(&Sha256(sha256::Hash::from_slice(&[3;32][..]).unwrap()))
2150                 );
2151                 assert_eq!(invoice.payment_hash(), &sha256::Hash::from_slice(&[21;32][..]).unwrap());
2152                 assert_eq!(invoice.payment_secret(), &PaymentSecret([42; 32]));
2153
2154                 let mut expected_features = Bolt11InvoiceFeatures::empty();
2155                 expected_features.set_variable_length_onion_required();
2156                 expected_features.set_payment_secret_required();
2157                 expected_features.set_basic_mpp_optional();
2158                 assert_eq!(invoice.features(), Some(&expected_features));
2159
2160                 let raw_invoice = builder.build_raw().unwrap();
2161                 assert_eq!(raw_invoice, *invoice.into_signed_raw().raw_invoice())
2162         }
2163
2164         #[test]
2165         fn test_default_values() {
2166                 use crate::*;
2167                 use secp256k1::Secp256k1;
2168                 use secp256k1::SecretKey;
2169
2170                 let signed_invoice = InvoiceBuilder::new(Currency::Bitcoin)
2171                         .description("Test".into())
2172                         .payment_hash(sha256::Hash::from_slice(&[0;32][..]).unwrap())
2173                         .payment_secret(PaymentSecret([0; 32]))
2174                         .duration_since_epoch(Duration::from_secs(1234567))
2175                         .build_raw()
2176                         .unwrap()
2177                         .sign::<_, ()>(|hash| {
2178                                 let privkey = SecretKey::from_slice(&[41; 32]).unwrap();
2179                                 let secp_ctx = Secp256k1::new();
2180                                 Ok(secp_ctx.sign_ecdsa_recoverable(hash, &privkey))
2181                         })
2182                         .unwrap();
2183                 let invoice = Bolt11Invoice::from_signed(signed_invoice).unwrap();
2184
2185                 assert_eq!(invoice.min_final_cltv_expiry_delta(), DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA);
2186                 assert_eq!(invoice.expiry_time(), Duration::from_secs(DEFAULT_EXPIRY_TIME));
2187                 assert!(!invoice.would_expire(Duration::from_secs(1234568)));
2188         }
2189
2190         #[test]
2191         fn test_expiration() {
2192                 use crate::*;
2193                 use secp256k1::Secp256k1;
2194                 use secp256k1::SecretKey;
2195
2196                 let signed_invoice = InvoiceBuilder::new(Currency::Bitcoin)
2197                         .description("Test".into())
2198                         .payment_hash(sha256::Hash::from_slice(&[0;32][..]).unwrap())
2199                         .payment_secret(PaymentSecret([0; 32]))
2200                         .duration_since_epoch(Duration::from_secs(1234567))
2201                         .build_raw()
2202                         .unwrap()
2203                         .sign::<_, ()>(|hash| {
2204                                 let privkey = SecretKey::from_slice(&[41; 32]).unwrap();
2205                                 let secp_ctx = Secp256k1::new();
2206                                 Ok(secp_ctx.sign_ecdsa_recoverable(hash, &privkey))
2207                         })
2208                         .unwrap();
2209                 let invoice = Bolt11Invoice::from_signed(signed_invoice).unwrap();
2210
2211                 assert!(invoice.would_expire(Duration::from_secs(1234567 + DEFAULT_EXPIRY_TIME + 1)));
2212         }
2213
2214         #[cfg(feature = "serde")]
2215         #[test]
2216         fn test_serde() {
2217                 let invoice_str = "lnbc100p1psj9jhxdqud3jxktt5w46x7unfv9kz6mn0v3jsnp4q0d3p2sfluzdx45tqcs\
2218                         h2pu5qc7lgq0xs578ngs6s0s68ua4h7cvspp5q6rmq35js88zp5dvwrv9m459tnk2zunwj5jalqtyxqulh0l\
2219                         5gflssp5nf55ny5gcrfl30xuhzj3nphgj27rstekmr9fw3ny5989s300gyus9qyysgqcqpcrzjqw2sxwe993\
2220                         h5pcm4dxzpvttgza8zhkqxpgffcrf5v25nwpr3cmfg7z54kuqq8rgqqqqqqqq2qqqqq9qq9qrzjqd0ylaqcl\
2221                         j9424x9m8h2vcukcgnm6s56xfgu3j78zyqzhgs4hlpzvznlugqq9vsqqqqqqqlgqqqqqeqq9qrzjqwldmj9d\
2222                         ha74df76zhx6l9we0vjdquygcdt3kssupehe64g6yyp5yz5rhuqqwccqqyqqqqlgqqqqjcqq9qrzjqf9e58a\
2223                         guqr0rcun0ajlvmzq3ek63cw2w282gv3z5uupmuwvgjtq2z55qsqqg6qqqyqqqrtnqqqzq3cqygrzjqvphms\
2224                         ywntrrhqjcraumvc4y6r8v4z5v593trte429v4hredj7ms5z52usqq9ngqqqqqqqlgqqqqqqgq9qrzjq2v0v\
2225                         p62g49p7569ev48cmulecsxe59lvaw3wlxm7r982zxa9zzj7z5l0cqqxusqqyqqqqlgqqqqqzsqygarl9fh3\
2226                         8s0gyuxjjgux34w75dnc6xp2l35j7es3jd4ugt3lu0xzre26yg5m7ke54n2d5sym4xcmxtl8238xxvw5h5h5\
2227                         j5r6drg6k6zcqj0fcwg";
2228                 let invoice = invoice_str.parse::<super::Bolt11Invoice>().unwrap();
2229                 let serialized_invoice = serde_json::to_string(&invoice).unwrap();
2230                 let deserialized_invoice: super::Bolt11Invoice = serde_json::from_str(serialized_invoice.as_str()).unwrap();
2231                 assert_eq!(invoice, deserialized_invoice);
2232                 assert_eq!(invoice_str, deserialized_invoice.to_string().as_str());
2233                 assert_eq!(invoice_str, serialized_invoice.as_str().trim_matches('\"'));
2234         }
2235 }