d4e2b736757d35c62f348fccf122f3cd39403470
[rust-lightning] / lightning-invoice / src / lib.rs
1 // Prefix these with `rustdoc::` when we update our MSRV to be >= 1.52 to remove warnings.
2 #![deny(broken_intra_doc_links)]
3 #![deny(private_intra_doc_links)]
4
5 #![deny(missing_docs)]
6 #![deny(non_upper_case_globals)]
7 #![deny(non_camel_case_types)]
8 #![deny(non_snake_case)]
9 #![deny(unused_mut)]
10
11 #![cfg_attr(docsrs, feature(doc_auto_cfg))]
12
13 #![cfg_attr(feature = "strict", deny(warnings))]
14 #![cfg_attr(all(not(feature = "std"), not(test)), no_std)]
15
16 //! This crate provides data structures to represent
17 //! [lightning BOLT11](https://github.com/lightning/bolts/blob/master/11-payment-encoding.md)
18 //! invoices and functions to create, encode and decode these. If you just want to use the standard
19 //! en-/decoding functionality this should get you started:
20 //!
21 //!   * For parsing use `str::parse::<Bolt11Invoice>(&self)` (see [`Bolt11Invoice::from_str`])
22 //!   * For constructing invoices use the [`InvoiceBuilder`]
23 //!   * For serializing invoices use the [`Display`]/[`ToString`] traits
24 //!
25 //! [`Bolt11Invoice::from_str`]: crate::Bolt11Invoice#impl-FromStr
26
27 #[cfg(not(any(feature = "std", feature = "no-std")))]
28 compile_error!("at least one of the `std` or `no-std` features must be enabled");
29
30 pub mod payment;
31 pub mod utils;
32
33 pub(crate) mod time_utils;
34
35 extern crate bech32;
36 extern crate bitcoin_hashes;
37 #[macro_use] extern crate lightning;
38 extern crate num_traits;
39 extern crate secp256k1;
40 extern crate alloc;
41 #[cfg(any(test, feature = "std"))]
42 extern crate core;
43 #[cfg(feature = "serde")]
44 extern crate serde;
45
46 #[cfg(feature = "std")]
47 use std::time::SystemTime;
48
49 use bech32::u5;
50 use bitcoin::{Address, Network, PubkeyHash, ScriptHash};
51 use bitcoin::util::address::{Payload, WitnessVersion};
52 use bitcoin_hashes::{Hash, sha256};
53 use lightning::ln::features::Bolt11InvoiceFeatures;
54 #[cfg(any(doc, test))]
55 use lightning::routing::gossip::RoutingFees;
56 use lightning::util::invoice::construct_invoice_preimage;
57
58 use secp256k1::PublicKey;
59 use secp256k1::{Message, Secp256k1};
60 use secp256k1::ecdsa::RecoverableSignature;
61
62 use core::cmp::Ordering;
63 use core::fmt::{Display, Formatter, self};
64 use core::iter::FilterMap;
65 use core::num::ParseIntError;
66 use core::ops::Deref;
67 use core::slice::Iter;
68 use core::time::Duration;
69 use core::str;
70
71 #[cfg(feature = "serde")]
72 use serde::{Deserialize, Deserializer,Serialize, Serializer, de::Error};
73
74 #[doc(no_inline)]
75 pub use lightning::ln::PaymentSecret;
76 #[doc(no_inline)]
77 pub use lightning::routing::router::RouteHint;
78
79 mod de;
80 mod ser;
81 mod tb;
82
83 mod prelude {
84         #[cfg(feature = "hashbrown")]
85         extern crate hashbrown;
86
87         pub use alloc::{vec, vec::Vec, string::String, collections::VecDeque, boxed::Box};
88         #[cfg(not(feature = "hashbrown"))]
89         pub use std::collections::{HashMap, HashSet, hash_map};
90         #[cfg(feature = "hashbrown")]
91         pub use self::hashbrown::{HashMap, HashSet, hash_map};
92
93         pub use alloc::string::ToString;
94 }
95
96 use crate::prelude::*;
97
98 /// Sync compat for std/no_std
99 #[cfg(feature = "std")]
100 mod sync {
101         pub use ::std::sync::{Mutex, MutexGuard};
102 }
103
104 /// Sync compat for std/no_std
105 #[cfg(not(feature = "std"))]
106 mod sync;
107
108 /// Errors that indicate what is wrong with the invoice. They have some granularity for debug
109 /// reasons, but should generally result in an "invalid BOLT11 invoice" message for the user.
110 #[allow(missing_docs)]
111 #[derive(PartialEq, Eq, Debug, Clone)]
112 pub enum Bolt11ParseError {
113         Bech32Error(bech32::Error),
114         ParseAmountError(ParseIntError),
115         MalformedSignature(secp256k1::Error),
116         BadPrefix,
117         UnknownCurrency,
118         UnknownSiPrefix,
119         MalformedHRP,
120         TooShortDataPart,
121         UnexpectedEndOfTaggedFields,
122         DescriptionDecodeError(str::Utf8Error),
123         PaddingError,
124         IntegerOverflowError,
125         InvalidSegWitProgramLength,
126         InvalidPubKeyHashLength,
127         InvalidScriptHashLength,
128         InvalidRecoveryId,
129         InvalidSliceLength(String),
130
131         /// Not an error, but used internally to signal that a part of the invoice should be ignored
132         /// according to BOLT11
133         Skip,
134 }
135
136 /// Indicates that something went wrong while parsing or validating the invoice. Parsing errors
137 /// should be mostly seen as opaque and are only there for debugging reasons. Semantic errors
138 /// like wrong signatures, missing fields etc. could mean that someone tampered with the invoice.
139 #[derive(PartialEq, Eq, Debug, Clone)]
140 pub enum ParseOrSemanticError {
141         /// The invoice couldn't be decoded
142         ParseError(Bolt11ParseError),
143
144         /// The invoice could be decoded but violates the BOLT11 standard
145         SemanticError(crate::Bolt11SemanticError),
146 }
147
148 /// The number of bits used to represent timestamps as defined in BOLT 11.
149 const TIMESTAMP_BITS: usize = 35;
150
151 /// The maximum timestamp as [`Duration::as_secs`] since the Unix epoch allowed by [`BOLT 11`].
152 ///
153 /// [BOLT 11]: https://github.com/lightning/bolts/blob/master/11-payment-encoding.md
154 pub const MAX_TIMESTAMP: u64 = (1 << TIMESTAMP_BITS) - 1;
155
156 /// Default expiry time as defined by [BOLT 11].
157 ///
158 /// [BOLT 11]: https://github.com/lightning/bolts/blob/master/11-payment-encoding.md
159 pub const DEFAULT_EXPIRY_TIME: u64 = 3600;
160
161 /// Default minimum final CLTV expiry as defined by [BOLT 11].
162 ///
163 /// Note that this is *not* the same value as rust-lightning's minimum CLTV expiry, which is
164 /// provided in [`MIN_FINAL_CLTV_EXPIRY_DELTA`].
165 ///
166 /// [BOLT 11]: https://github.com/lightning/bolts/blob/master/11-payment-encoding.md
167 /// [`MIN_FINAL_CLTV_EXPIRY_DELTA`]: lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA
168 pub const DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA: u64 = 18;
169
170 /// Builder for [`Bolt11Invoice`]s. It's the most convenient and advised way to use this library. It
171 /// ensures that only a semantically and syntactically correct invoice can be built using it.
172 ///
173 /// ```
174 /// extern crate secp256k1;
175 /// extern crate lightning;
176 /// extern crate lightning_invoice;
177 /// extern crate bitcoin_hashes;
178 ///
179 /// use bitcoin_hashes::Hash;
180 /// use bitcoin_hashes::sha256;
181 ///
182 /// use secp256k1::Secp256k1;
183 /// use secp256k1::SecretKey;
184 ///
185 /// use lightning::ln::PaymentSecret;
186 ///
187 /// use lightning_invoice::{Currency, InvoiceBuilder};
188 ///
189 /// # #[cfg(not(feature = "std"))]
190 /// # fn main() {}
191 /// # #[cfg(feature = "std")]
192 /// # fn main() {
193 /// let private_key = SecretKey::from_slice(
194 ///             &[
195 ///                     0xe1, 0x26, 0xf6, 0x8f, 0x7e, 0xaf, 0xcc, 0x8b, 0x74, 0xf5, 0x4d, 0x26, 0x9f,
196 ///                     0xe2, 0x06, 0xbe, 0x71, 0x50, 0x00, 0xf9, 0x4d, 0xac, 0x06, 0x7d, 0x1c, 0x04,
197 ///             0xa8, 0xca, 0x3b, 0x2d, 0xb7, 0x34
198 ///     ][..]
199 ///     ).unwrap();
200 ///
201 /// let payment_hash = sha256::Hash::from_slice(&[0; 32][..]).unwrap();
202 /// let payment_secret = PaymentSecret([42u8; 32]);
203 ///
204 /// let invoice = InvoiceBuilder::new(Currency::Bitcoin)
205 ///     .description("Coins pls!".into())
206 ///     .payment_hash(payment_hash)
207 ///     .payment_secret(payment_secret)
208 ///     .current_timestamp()
209 ///     .min_final_cltv_expiry_delta(144)
210 ///     .build_signed(|hash| {
211 ///             Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)
212 ///     })
213 ///     .unwrap();
214 ///
215 /// assert!(invoice.to_string().starts_with("lnbc1"));
216 /// # }
217 /// ```
218 ///
219 /// # Type parameters
220 /// The two parameters `D` and `H` signal if the builder already contains the correct amount of the
221 /// given field:
222 ///  * `D`: exactly one [`TaggedField::Description`] or [`TaggedField::DescriptionHash`]
223 ///  * `H`: exactly one [`TaggedField::PaymentHash`]
224 ///  * `T`: the timestamp is set
225 ///  * `C`: the CLTV expiry is set
226 ///  * `S`: the payment secret is set
227 ///  * `M`: payment metadata is set
228 ///
229 /// This is not exported to bindings users as we likely need to manually select one set of boolean type parameters.
230 #[derive(Eq, PartialEq, Debug, Clone)]
231 pub struct InvoiceBuilder<D: tb::Bool, H: tb::Bool, T: tb::Bool, C: tb::Bool, S: tb::Bool, M: tb::Bool> {
232         currency: Currency,
233         amount: Option<u64>,
234         si_prefix: Option<SiPrefix>,
235         timestamp: Option<PositiveTimestamp>,
236         tagged_fields: Vec<TaggedField>,
237         error: Option<CreationError>,
238
239         phantom_d: core::marker::PhantomData<D>,
240         phantom_h: core::marker::PhantomData<H>,
241         phantom_t: core::marker::PhantomData<T>,
242         phantom_c: core::marker::PhantomData<C>,
243         phantom_s: core::marker::PhantomData<S>,
244         phantom_m: core::marker::PhantomData<M>,
245 }
246
247 /// Represents a syntactically and semantically correct lightning BOLT11 invoice.
248 ///
249 /// There are three ways to construct a `Bolt11Invoice`:
250 ///  1. using [`InvoiceBuilder`]
251 ///  2. using [`Bolt11Invoice::from_signed`]
252 ///  3. using `str::parse::<Bolt11Invoice>(&str)` (see [`Bolt11Invoice::from_str`])
253 ///
254 /// [`Bolt11Invoice::from_str`]: crate::Bolt11Invoice#impl-FromStr
255 #[derive(Eq, PartialEq, Debug, Clone, Hash, Ord, PartialOrd)]
256 pub struct Bolt11Invoice {
257         signed_invoice: SignedRawBolt11Invoice,
258 }
259
260 /// Represents the description of an invoice which has to be either a directly included string or
261 /// a hash of a description provided out of band.
262 ///
263 /// This is not exported to bindings users as we don't have a good way to map the reference lifetimes making this
264 /// practically impossible to use safely in languages like C.
265 #[derive(Eq, PartialEq, Debug, Clone, Ord, PartialOrd)]
266 pub enum Bolt11InvoiceDescription<'f> {
267         /// Reference to the directly supplied description in the invoice
268         Direct(&'f Description),
269
270         /// Reference to the description's hash included in the invoice
271         Hash(&'f Sha256),
272 }
273
274 /// Represents a signed [`RawBolt11Invoice`] with cached hash. The signature is not checked and may be
275 /// invalid.
276 ///
277 /// # Invariants
278 /// The hash has to be either from the deserialized invoice or from the serialized [`RawBolt11Invoice`].
279 #[derive(Eq, PartialEq, Debug, Clone, Hash, Ord, PartialOrd)]
280 pub struct SignedRawBolt11Invoice {
281         /// The raw invoice that the signature belongs to
282         raw_invoice: RawBolt11Invoice,
283
284         /// Hash of the [`RawBolt11Invoice`] that will be used to check the signature.
285         ///
286         /// * if the `SignedRawBolt11Invoice` was deserialized the hash is of from the original encoded form,
287         /// since it's not guaranteed that encoding it again will lead to the same result since integers
288         /// could have been encoded with leading zeroes etc.
289         /// * if the `SignedRawBolt11Invoice` was constructed manually the hash will be the calculated hash
290         /// from the [`RawBolt11Invoice`]
291         hash: [u8; 32],
292
293         /// signature of the payment request
294         signature: Bolt11InvoiceSignature,
295 }
296
297 /// Represents an syntactically correct [`Bolt11Invoice`] for a payment on the lightning network,
298 /// but without the signature information.
299 /// Decoding and encoding should not lead to information loss but may lead to different hashes.
300 ///
301 /// For methods without docs see the corresponding methods in [`Bolt11Invoice`].
302 #[derive(Eq, PartialEq, Debug, Clone, Hash, Ord, PartialOrd)]
303 pub struct RawBolt11Invoice {
304         /// human readable part
305         pub hrp: RawHrp,
306
307         /// data part
308         pub data: RawDataPart,
309 }
310
311 /// Data of the [`RawBolt11Invoice`] that is encoded in the human readable part.
312 ///
313 /// This is not exported to bindings users as we don't yet support `Option<Enum>`
314 #[derive(Eq, PartialEq, Debug, Clone, Hash, Ord, PartialOrd)]
315 pub struct RawHrp {
316         /// The currency deferred from the 3rd and 4th character of the bech32 transaction
317         pub currency: Currency,
318
319         /// The amount that, multiplied by the SI prefix, has to be payed
320         pub raw_amount: Option<u64>,
321
322         /// SI prefix that gets multiplied with the `raw_amount`
323         pub si_prefix: Option<SiPrefix>,
324 }
325
326 /// Data of the [`RawBolt11Invoice`] that is encoded in the data part
327 #[derive(Eq, PartialEq, Debug, Clone, Hash, Ord, PartialOrd)]
328 pub struct RawDataPart {
329         /// generation time of the invoice
330         pub timestamp: PositiveTimestamp,
331
332         /// tagged fields of the payment request
333         pub tagged_fields: Vec<RawTaggedField>,
334 }
335
336 /// A timestamp that refers to a date after 1 January 1970.
337 ///
338 /// # Invariants
339 ///
340 /// The Unix timestamp representing the stored time has to be positive and no greater than
341 /// [`MAX_TIMESTAMP`].
342 #[derive(Eq, PartialEq, Debug, Clone, Hash, Ord, PartialOrd)]
343 pub struct PositiveTimestamp(Duration);
344
345 /// SI prefixes for the human readable part
346 #[derive(Eq, PartialEq, Debug, Clone, Copy, Hash, Ord, PartialOrd)]
347 pub enum SiPrefix {
348         /// 10^-3
349         Milli,
350         /// 10^-6
351         Micro,
352         /// 10^-9
353         Nano,
354         /// 10^-12
355         Pico,
356 }
357
358 impl SiPrefix {
359         /// Returns the multiplier to go from a BTC value to picoBTC implied by this SiPrefix.
360         /// This is effectively 10^12 * the prefix multiplier
361         pub fn multiplier(&self) -> u64 {
362                 match *self {
363                         SiPrefix::Milli => 1_000_000_000,
364                         SiPrefix::Micro => 1_000_000,
365                         SiPrefix::Nano => 1_000,
366                         SiPrefix::Pico => 1,
367                 }
368         }
369
370         /// Returns all enum variants of `SiPrefix` sorted in descending order of their associated
371         /// multiplier.
372         ///
373         /// This is not exported to bindings users as we don't yet support a slice of enums, and also because this function
374         /// isn't the most critical to expose.
375         pub fn values_desc() -> &'static [SiPrefix] {
376                 use crate::SiPrefix::*;
377                 static VALUES: [SiPrefix; 4] = [Milli, Micro, Nano, Pico];
378                 &VALUES
379         }
380 }
381
382 /// Enum representing the crypto currencies (or networks) supported by this library
383 #[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
384 pub enum Currency {
385         /// Bitcoin mainnet
386         Bitcoin,
387
388         /// Bitcoin testnet
389         BitcoinTestnet,
390
391         /// Bitcoin regtest
392         Regtest,
393
394         /// Bitcoin simnet
395         Simnet,
396
397         /// Bitcoin signet
398         Signet,
399 }
400
401 impl From<Network> for Currency {
402         fn from(network: Network) -> Self {
403                 match network {
404                         Network::Bitcoin => Currency::Bitcoin,
405                         Network::Testnet => Currency::BitcoinTestnet,
406                         Network::Regtest => Currency::Regtest,
407                         Network::Signet => Currency::Signet,
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)]
476 pub struct Description(String);
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                 self.0.serialize_compact().1.partial_cmp(&other.0.serialize_compact().1)
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())
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 #[cfg(feature = "std")]
1142 impl From<PositiveTimestamp> for SystemTime {
1143         fn from(val: PositiveTimestamp) -> Self {
1144                 SystemTime::UNIX_EPOCH + val.0
1145         }
1146 }
1147
1148 impl Bolt11Invoice {
1149         /// The hash of the [`RawBolt11Invoice`] that was signed.
1150         pub fn signable_hash(&self) -> [u8; 32] {
1151                 self.signed_invoice.hash
1152         }
1153
1154         /// Transform the `Bolt11Invoice` into its unchecked version.
1155         pub fn into_signed_raw(self) -> SignedRawBolt11Invoice {
1156                 self.signed_invoice
1157         }
1158
1159         /// Check that all mandatory fields are present
1160         fn check_field_counts(&self) -> Result<(), Bolt11SemanticError> {
1161                 // "A writer MUST include exactly one p field […]."
1162                 let payment_hash_cnt = self.tagged_fields().filter(|&tf| match *tf {
1163                         TaggedField::PaymentHash(_) => true,
1164                         _ => false,
1165                 }).count();
1166                 if payment_hash_cnt < 1 {
1167                         return Err(Bolt11SemanticError::NoPaymentHash);
1168                 } else if payment_hash_cnt > 1 {
1169                         return Err(Bolt11SemanticError::MultiplePaymentHashes);
1170                 }
1171
1172                 // "A writer MUST include either exactly one d or exactly one h field."
1173                 let description_cnt = self.tagged_fields().filter(|&tf| match *tf {
1174                         TaggedField::Description(_) | TaggedField::DescriptionHash(_) => true,
1175                         _ => false,
1176                 }).count();
1177                 if  description_cnt < 1 {
1178                         return Err(Bolt11SemanticError::NoDescription);
1179                 } else if description_cnt > 1 {
1180                         return  Err(Bolt11SemanticError::MultipleDescriptions);
1181                 }
1182
1183                 self.check_payment_secret()?;
1184
1185                 Ok(())
1186         }
1187
1188         /// Checks that there is exactly one payment secret field
1189         fn check_payment_secret(&self) -> Result<(), Bolt11SemanticError> {
1190                 // "A writer MUST include exactly one `s` field."
1191                 let payment_secret_count = self.tagged_fields().filter(|&tf| match *tf {
1192                         TaggedField::PaymentSecret(_) => true,
1193                         _ => false,
1194                 }).count();
1195                 if payment_secret_count < 1 {
1196                         return Err(Bolt11SemanticError::NoPaymentSecret);
1197                 } else if payment_secret_count > 1 {
1198                         return Err(Bolt11SemanticError::MultiplePaymentSecrets);
1199                 }
1200
1201                 Ok(())
1202         }
1203
1204         /// Check that amount is a whole number of millisatoshis
1205         fn check_amount(&self) -> Result<(), Bolt11SemanticError> {
1206                 if let Some(amount_pico_btc) = self.amount_pico_btc() {
1207                         if amount_pico_btc % 10 != 0 {
1208                                 return Err(Bolt11SemanticError::ImpreciseAmount);
1209                         }
1210                 }
1211                 Ok(())
1212         }
1213
1214         /// Check that feature bits are set as required
1215         fn check_feature_bits(&self) -> Result<(), Bolt11SemanticError> {
1216                 self.check_payment_secret()?;
1217
1218                 // "A writer MUST set an s field if and only if the payment_secret feature is set."
1219                 // (this requirement has been since removed, and we now require the payment secret
1220                 // feature bit always).
1221                 let features = self.tagged_fields().find(|&tf| match *tf {
1222                         TaggedField::Features(_) => true,
1223                         _ => false,
1224                 });
1225                 match features {
1226                         None => Err(Bolt11SemanticError::InvalidFeatures),
1227                         Some(TaggedField::Features(features)) => {
1228                                 if features.requires_unknown_bits() {
1229                                         Err(Bolt11SemanticError::InvalidFeatures)
1230                                 } else if !features.supports_payment_secret() {
1231                                         Err(Bolt11SemanticError::InvalidFeatures)
1232                                 } else {
1233                                         Ok(())
1234                                 }
1235                         },
1236                         Some(_) => unreachable!(),
1237                 }
1238         }
1239
1240         /// Check that the invoice is signed correctly and that key recovery works
1241         pub fn check_signature(&self) -> Result<(), Bolt11SemanticError> {
1242                 match self.signed_invoice.recover_payee_pub_key() {
1243                         Err(secp256k1::Error::InvalidRecoveryId) =>
1244                                 return Err(Bolt11SemanticError::InvalidRecoveryId),
1245                         Err(secp256k1::Error::InvalidSignature) =>
1246                                 return Err(Bolt11SemanticError::InvalidSignature),
1247                         Err(e) => panic!("no other error may occur, got {:?}", e),
1248                         Ok(_) => {},
1249                 }
1250
1251                 if !self.signed_invoice.check_signature() {
1252                         return Err(Bolt11SemanticError::InvalidSignature);
1253                 }
1254
1255                 Ok(())
1256         }
1257
1258         /// Constructs a `Bolt11Invoice` from a [`SignedRawBolt11Invoice`] by checking all its invariants.
1259         /// ```
1260         /// use lightning_invoice::*;
1261         ///
1262         /// let invoice = "lnbc100p1psj9jhxdqud3jxktt5w46x7unfv9kz6mn0v3jsnp4q0d3p2sfluzdx45tqcs\
1263         /// h2pu5qc7lgq0xs578ngs6s0s68ua4h7cvspp5q6rmq35js88zp5dvwrv9m459tnk2zunwj5jalqtyxqulh0l\
1264         /// 5gflssp5nf55ny5gcrfl30xuhzj3nphgj27rstekmr9fw3ny5989s300gyus9qyysgqcqpcrzjqw2sxwe993\
1265         /// h5pcm4dxzpvttgza8zhkqxpgffcrf5v25nwpr3cmfg7z54kuqq8rgqqqqqqqq2qqqqq9qq9qrzjqd0ylaqcl\
1266         /// j9424x9m8h2vcukcgnm6s56xfgu3j78zyqzhgs4hlpzvznlugqq9vsqqqqqqqlgqqqqqeqq9qrzjqwldmj9d\
1267         /// ha74df76zhx6l9we0vjdquygcdt3kssupehe64g6yyp5yz5rhuqqwccqqyqqqqlgqqqqjcqq9qrzjqf9e58a\
1268         /// guqr0rcun0ajlvmzq3ek63cw2w282gv3z5uupmuwvgjtq2z55qsqqg6qqqyqqqrtnqqqzq3cqygrzjqvphms\
1269         /// ywntrrhqjcraumvc4y6r8v4z5v593trte429v4hredj7ms5z52usqq9ngqqqqqqqlgqqqqqqgq9qrzjq2v0v\
1270         /// p62g49p7569ev48cmulecsxe59lvaw3wlxm7r982zxa9zzj7z5l0cqqxusqqyqqqqlgqqqqqzsqygarl9fh3\
1271         /// 8s0gyuxjjgux34w75dnc6xp2l35j7es3jd4ugt3lu0xzre26yg5m7ke54n2d5sym4xcmxtl8238xxvw5h5h5\
1272         /// j5r6drg6k6zcqj0fcwg";
1273         ///
1274         /// let signed = invoice.parse::<SignedRawBolt11Invoice>().unwrap();
1275         ///
1276         /// assert!(Bolt11Invoice::from_signed(signed).is_ok());
1277         /// ```
1278         pub fn from_signed(signed_invoice: SignedRawBolt11Invoice) -> Result<Self, Bolt11SemanticError> {
1279                 let invoice = Bolt11Invoice {
1280                         signed_invoice,
1281                 };
1282                 invoice.check_field_counts()?;
1283                 invoice.check_feature_bits()?;
1284                 invoice.check_signature()?;
1285                 invoice.check_amount()?;
1286
1287                 Ok(invoice)
1288         }
1289
1290         /// Returns the `Bolt11Invoice`'s timestamp (should equal its creation time)
1291         #[cfg(feature = "std")]
1292         pub fn timestamp(&self) -> SystemTime {
1293                 self.signed_invoice.raw_invoice().data.timestamp.as_time()
1294         }
1295
1296         /// Returns the `Bolt11Invoice`'s timestamp as a duration since the Unix epoch
1297         pub fn duration_since_epoch(&self) -> Duration {
1298                 self.signed_invoice.raw_invoice().data.timestamp.0
1299         }
1300
1301         /// Returns an iterator over all tagged fields of this `Bolt11Invoice`.
1302         ///
1303         /// This is not exported to bindings users as there is not yet a manual mapping for a FilterMap
1304         pub fn tagged_fields(&self)
1305                 -> FilterMap<Iter<RawTaggedField>, fn(&RawTaggedField) -> Option<&TaggedField>> {
1306                 self.signed_invoice.raw_invoice().known_tagged_fields()
1307         }
1308
1309         /// Returns the hash to which we will receive the preimage on completion of the payment
1310         pub fn payment_hash(&self) -> &sha256::Hash {
1311                 &self.signed_invoice.payment_hash().expect("checked by constructor").0
1312         }
1313
1314         /// Return the description or a hash of it for longer ones
1315         ///
1316         /// This is not exported to bindings users because we don't yet export Bolt11InvoiceDescription
1317         pub fn description(&self) -> Bolt11InvoiceDescription {
1318                 if let Some(direct) = self.signed_invoice.description() {
1319                         return Bolt11InvoiceDescription::Direct(direct);
1320                 } else if let Some(hash) = self.signed_invoice.description_hash() {
1321                         return Bolt11InvoiceDescription::Hash(hash);
1322                 }
1323                 unreachable!("ensured by constructor");
1324         }
1325
1326         /// Get the payee's public key if one was included in the invoice
1327         pub fn payee_pub_key(&self) -> Option<&PublicKey> {
1328                 self.signed_invoice.payee_pub_key().map(|x| &x.0)
1329         }
1330
1331         /// Get the payment secret if one was included in the invoice
1332         pub fn payment_secret(&self) -> &PaymentSecret {
1333                 self.signed_invoice.payment_secret().expect("was checked by constructor")
1334         }
1335
1336         /// Get the payment metadata blob if one was included in the invoice
1337         pub fn payment_metadata(&self) -> Option<&Vec<u8>> {
1338                 self.signed_invoice.payment_metadata()
1339         }
1340
1341         /// Get the invoice features if they were included in the invoice
1342         pub fn features(&self) -> Option<&Bolt11InvoiceFeatures> {
1343                 self.signed_invoice.features()
1344         }
1345
1346         /// Recover the payee's public key (only to be used if none was included in the invoice)
1347         pub fn recover_payee_pub_key(&self) -> PublicKey {
1348                 self.signed_invoice.recover_payee_pub_key().expect("was checked by constructor").0
1349         }
1350
1351         /// Returns the Duration since the Unix epoch at which the invoice expires.
1352         /// Returning None if overflow occurred.
1353         pub fn expires_at(&self) -> Option<Duration> {
1354                 self.duration_since_epoch().checked_add(self.expiry_time())
1355         }
1356
1357         /// Returns the invoice's expiry time, if present, otherwise [`DEFAULT_EXPIRY_TIME`].
1358         pub fn expiry_time(&self) -> Duration {
1359                 self.signed_invoice.expiry_time()
1360                         .map(|x| x.0)
1361                         .unwrap_or(Duration::from_secs(DEFAULT_EXPIRY_TIME))
1362         }
1363
1364         /// Returns whether the invoice has expired.
1365         #[cfg(feature = "std")]
1366         pub fn is_expired(&self) -> bool {
1367                 Self::is_expired_from_epoch(&self.timestamp(), self.expiry_time())
1368         }
1369
1370         /// Returns whether the expiry time from the given epoch has passed.
1371         #[cfg(feature = "std")]
1372         pub(crate) fn is_expired_from_epoch(epoch: &SystemTime, expiry_time: Duration) -> bool {
1373                 match epoch.elapsed() {
1374                         Ok(elapsed) => elapsed > expiry_time,
1375                         Err(_) => false,
1376                 }
1377         }
1378
1379         /// Returns the Duration remaining until the invoice expires.
1380         #[cfg(feature = "std")]
1381         pub fn duration_until_expiry(&self) -> Duration {
1382                 SystemTime::now().duration_since(SystemTime::UNIX_EPOCH)
1383                         .map(|now| self.expiration_remaining_from_epoch(now))
1384                         .unwrap_or(Duration::from_nanos(0))
1385         }
1386
1387         /// Returns the Duration remaining until the invoice expires given the current time.
1388         /// `time` is the timestamp as a duration since the Unix epoch.
1389         pub fn expiration_remaining_from_epoch(&self, time: Duration) -> Duration {
1390                 self.expires_at().map(|x| x.checked_sub(time)).flatten().unwrap_or(Duration::from_nanos(0))
1391         }
1392
1393         /// Returns whether the expiry time would pass at the given point in time.
1394         /// `at_time` is the timestamp as a duration since the Unix epoch.
1395         pub fn would_expire(&self, at_time: Duration) -> bool {
1396                 self.duration_since_epoch()
1397                         .checked_add(self.expiry_time())
1398                         .unwrap_or_else(|| Duration::new(u64::max_value(), 1_000_000_000 - 1)) < at_time
1399         }
1400
1401         /// Returns the invoice's `min_final_cltv_expiry_delta` time, if present, otherwise
1402         /// [`DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA`].
1403         pub fn min_final_cltv_expiry_delta(&self) -> u64 {
1404                 self.signed_invoice.min_final_cltv_expiry_delta()
1405                         .map(|x| x.0)
1406                         .unwrap_or(DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA)
1407         }
1408
1409         /// Returns a list of all fallback addresses
1410         ///
1411         /// This is not exported to bindings users as we don't support Vec<&NonOpaqueType>
1412         pub fn fallbacks(&self) -> Vec<&Fallback> {
1413                 self.signed_invoice.fallbacks()
1414         }
1415
1416         /// Returns a list of all fallback addresses as [`Address`]es
1417         pub fn fallback_addresses(&self) -> Vec<Address> {
1418                 self.fallbacks().iter().map(|fallback| {
1419                         let payload = match fallback {
1420                                 Fallback::SegWitProgram { version, program } => {
1421                                         Payload::WitnessProgram { version: *version, program: program.to_vec() }
1422                                 }
1423                                 Fallback::PubKeyHash(pkh) => {
1424                                         Payload::PubkeyHash(*pkh)
1425                                 }
1426                                 Fallback::ScriptHash(sh) => {
1427                                         Payload::ScriptHash(*sh)
1428                                 }
1429                         };
1430
1431                         Address { payload, network: self.network() }
1432                 }).collect()
1433         }
1434
1435         /// Returns a list of all routes included in the invoice
1436         pub fn private_routes(&self) -> Vec<&PrivateRoute> {
1437                 self.signed_invoice.private_routes()
1438         }
1439
1440         /// Returns a list of all routes included in the invoice as the underlying hints
1441         pub fn route_hints(&self) -> Vec<RouteHint> {
1442                 find_all_extract!(
1443                         self.signed_invoice.known_tagged_fields(), TaggedField::PrivateRoute(ref x), x
1444                 ).map(|route| (**route).clone()).collect()
1445         }
1446
1447         /// Returns the currency for which the invoice was issued
1448         pub fn currency(&self) -> Currency {
1449                 self.signed_invoice.currency()
1450         }
1451
1452         /// Returns the network for which the invoice was issued
1453         ///
1454         /// This is not exported to bindings users, see [`Self::currency`] instead.
1455         pub fn network(&self) -> Network {
1456                 self.signed_invoice.currency().into()
1457         }
1458
1459         /// Returns the amount if specified in the invoice as millisatoshis.
1460         pub fn amount_milli_satoshis(&self) -> Option<u64> {
1461                 self.signed_invoice.amount_pico_btc().map(|v| v / 10)
1462         }
1463
1464         /// Returns the amount if specified in the invoice as pico BTC.
1465         fn amount_pico_btc(&self) -> Option<u64> {
1466                 self.signed_invoice.amount_pico_btc()
1467         }
1468 }
1469
1470 impl From<TaggedField> for RawTaggedField {
1471         fn from(tf: TaggedField) -> Self {
1472                 RawTaggedField::KnownSemantics(tf)
1473         }
1474 }
1475
1476 impl TaggedField {
1477         /// Numeric representation of the field's tag
1478         pub fn tag(&self) -> u5 {
1479                 let tag = match *self {
1480                         TaggedField::PaymentHash(_) => constants::TAG_PAYMENT_HASH,
1481                         TaggedField::Description(_) => constants::TAG_DESCRIPTION,
1482                         TaggedField::PayeePubKey(_) => constants::TAG_PAYEE_PUB_KEY,
1483                         TaggedField::DescriptionHash(_) => constants::TAG_DESCRIPTION_HASH,
1484                         TaggedField::ExpiryTime(_) => constants::TAG_EXPIRY_TIME,
1485                         TaggedField::MinFinalCltvExpiryDelta(_) => constants::TAG_MIN_FINAL_CLTV_EXPIRY_DELTA,
1486                         TaggedField::Fallback(_) => constants::TAG_FALLBACK,
1487                         TaggedField::PrivateRoute(_) => constants::TAG_PRIVATE_ROUTE,
1488                         TaggedField::PaymentSecret(_) => constants::TAG_PAYMENT_SECRET,
1489                         TaggedField::PaymentMetadata(_) => constants::TAG_PAYMENT_METADATA,
1490                         TaggedField::Features(_) => constants::TAG_FEATURES,
1491                 };
1492
1493                 u5::try_from_u8(tag).expect("all tags defined are <32")
1494         }
1495 }
1496
1497 impl Description {
1498
1499         /// Creates a new `Description` if `description` is at most 1023 __bytes__ long,
1500         /// returns [`CreationError::DescriptionTooLong`] otherwise
1501         ///
1502         /// Please note that single characters may use more than one byte due to UTF8 encoding.
1503         pub fn new(description: String) -> Result<Description, CreationError> {
1504                 if description.len() > 639 {
1505                         Err(CreationError::DescriptionTooLong)
1506                 } else {
1507                         Ok(Description(description))
1508                 }
1509         }
1510
1511         /// Returns the underlying description [`String`]
1512         pub fn into_inner(self) -> String {
1513                 self.0
1514         }
1515 }
1516
1517 impl From<Description> for String {
1518         fn from(val: Description) -> Self {
1519                 val.into_inner()
1520         }
1521 }
1522
1523 impl Deref for Description {
1524         type Target = str;
1525
1526         fn deref(&self) -> &str {
1527                 &self.0
1528         }
1529 }
1530
1531 impl From<PublicKey> for PayeePubKey {
1532         fn from(pk: PublicKey) -> Self {
1533                 PayeePubKey(pk)
1534         }
1535 }
1536
1537 impl Deref for PayeePubKey {
1538         type Target = PublicKey;
1539
1540         fn deref(&self) -> &PublicKey {
1541                 &self.0
1542         }
1543 }
1544
1545 impl ExpiryTime {
1546         /// Construct an `ExpiryTime` from seconds.
1547         pub fn from_seconds(seconds: u64) -> ExpiryTime {
1548                 ExpiryTime(Duration::from_secs(seconds))
1549         }
1550
1551         /// Construct an `ExpiryTime` from a [`Duration`], dropping the sub-second part.
1552         pub fn from_duration(duration: Duration) -> ExpiryTime {
1553                 Self::from_seconds(duration.as_secs())
1554         }
1555
1556         /// Returns the expiry time in seconds
1557         pub fn as_seconds(&self) -> u64 {
1558                 self.0.as_secs()
1559         }
1560
1561         /// Returns a reference to the underlying [`Duration`] (=expiry time)
1562         pub fn as_duration(&self) -> &Duration {
1563                 &self.0
1564         }
1565 }
1566
1567 impl PrivateRoute {
1568         /// Creates a new (partial) route from a list of hops
1569         pub fn new(hops: RouteHint) -> Result<PrivateRoute, CreationError> {
1570                 if hops.0.len() <= 12 {
1571                         Ok(PrivateRoute(hops))
1572                 } else {
1573                         Err(CreationError::RouteTooLong)
1574                 }
1575         }
1576
1577         /// Returns the underlying list of hops
1578         pub fn into_inner(self) -> RouteHint {
1579                 self.0
1580         }
1581 }
1582
1583 impl From<PrivateRoute> for RouteHint {
1584         fn from(val: PrivateRoute) -> Self {
1585                 val.into_inner()
1586         }
1587 }
1588
1589 impl Deref for PrivateRoute {
1590         type Target = RouteHint;
1591
1592         fn deref(&self) -> &RouteHint {
1593                 &self.0
1594         }
1595 }
1596
1597 impl Deref for Bolt11InvoiceSignature {
1598         type Target = RecoverableSignature;
1599
1600         fn deref(&self) -> &RecoverableSignature {
1601                 &self.0
1602         }
1603 }
1604
1605 impl Deref for SignedRawBolt11Invoice {
1606         type Target = RawBolt11Invoice;
1607
1608         fn deref(&self) -> &RawBolt11Invoice {
1609                 &self.raw_invoice
1610         }
1611 }
1612
1613 /// Errors that may occur when constructing a new [`RawBolt11Invoice`] or [`Bolt11Invoice`]
1614 #[derive(Eq, PartialEq, Debug, Clone)]
1615 pub enum CreationError {
1616         /// The supplied description string was longer than 639 __bytes__ (see [`Description::new`])
1617         DescriptionTooLong,
1618
1619         /// The specified route has too many hops and can't be encoded
1620         RouteTooLong,
1621
1622         /// The Unix timestamp of the supplied date is less than zero or greater than 35-bits
1623         TimestampOutOfBounds,
1624
1625         /// The supplied millisatoshi amount was greater than the total bitcoin supply.
1626         InvalidAmount,
1627
1628         /// Route hints were required for this invoice and were missing. Applies to
1629         /// [phantom invoices].
1630         ///
1631         /// [phantom invoices]: crate::utils::create_phantom_invoice
1632         MissingRouteHints,
1633
1634         /// The provided `min_final_cltv_expiry_delta` was less than [`MIN_FINAL_CLTV_EXPIRY_DELTA`].
1635         ///
1636         /// [`MIN_FINAL_CLTV_EXPIRY_DELTA`]: lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA
1637         MinFinalCltvExpiryDeltaTooShort,
1638 }
1639
1640 impl Display for CreationError {
1641         fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
1642                 match self {
1643                         CreationError::DescriptionTooLong => f.write_str("The supplied description string was longer than 639 bytes"),
1644                         CreationError::RouteTooLong => f.write_str("The specified route has too many hops and can't be encoded"),
1645                         CreationError::TimestampOutOfBounds => f.write_str("The Unix timestamp of the supplied date is less than zero or greater than 35-bits"),
1646                         CreationError::InvalidAmount => f.write_str("The supplied millisatoshi amount was greater than the total bitcoin supply"),
1647                         CreationError::MissingRouteHints => f.write_str("The invoice required route hints and they weren't provided"),
1648                         CreationError::MinFinalCltvExpiryDeltaTooShort => f.write_str(
1649                                 "The supplied final CLTV expiry delta was less than LDK's `MIN_FINAL_CLTV_EXPIRY_DELTA`"),
1650                 }
1651         }
1652 }
1653
1654 #[cfg(feature = "std")]
1655 impl std::error::Error for CreationError { }
1656
1657 /// Errors that may occur when converting a [`RawBolt11Invoice`] to a [`Bolt11Invoice`]. They relate to
1658 /// the requirements sections in BOLT #11
1659 #[derive(Eq, PartialEq, Debug, Clone)]
1660 pub enum Bolt11SemanticError {
1661         /// The invoice is missing the mandatory payment hash
1662         NoPaymentHash,
1663
1664         /// The invoice has multiple payment hashes which isn't allowed
1665         MultiplePaymentHashes,
1666
1667         /// No description or description hash are part of the invoice
1668         NoDescription,
1669
1670         /// The invoice contains multiple descriptions and/or description hashes which isn't allowed
1671         MultipleDescriptions,
1672
1673         /// The invoice is missing the mandatory payment secret, which all modern lightning nodes
1674         /// should provide.
1675         NoPaymentSecret,
1676
1677         /// The invoice contains multiple payment secrets
1678         MultiplePaymentSecrets,
1679
1680         /// The invoice's features are invalid
1681         InvalidFeatures,
1682
1683         /// The recovery id doesn't fit the signature/pub key
1684         InvalidRecoveryId,
1685
1686         /// The invoice's signature is invalid
1687         InvalidSignature,
1688
1689         /// The invoice's amount was not a whole number of millisatoshis
1690         ImpreciseAmount,
1691 }
1692
1693 impl Display for Bolt11SemanticError {
1694         fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
1695                 match self {
1696                         Bolt11SemanticError::NoPaymentHash => f.write_str("The invoice is missing the mandatory payment hash"),
1697                         Bolt11SemanticError::MultiplePaymentHashes => f.write_str("The invoice has multiple payment hashes which isn't allowed"),
1698                         Bolt11SemanticError::NoDescription => f.write_str("No description or description hash are part of the invoice"),
1699                         Bolt11SemanticError::MultipleDescriptions => f.write_str("The invoice contains multiple descriptions and/or description hashes which isn't allowed"),
1700                         Bolt11SemanticError::NoPaymentSecret => f.write_str("The invoice is missing the mandatory payment secret"),
1701                         Bolt11SemanticError::MultiplePaymentSecrets => f.write_str("The invoice contains multiple payment secrets"),
1702                         Bolt11SemanticError::InvalidFeatures => f.write_str("The invoice's features are invalid"),
1703                         Bolt11SemanticError::InvalidRecoveryId => f.write_str("The recovery id doesn't fit the signature/pub key"),
1704                         Bolt11SemanticError::InvalidSignature => f.write_str("The invoice's signature is invalid"),
1705                         Bolt11SemanticError::ImpreciseAmount => f.write_str("The invoice's amount was not a whole number of millisatoshis"),
1706                 }
1707         }
1708 }
1709
1710 #[cfg(feature = "std")]
1711 impl std::error::Error for Bolt11SemanticError { }
1712
1713 /// When signing using a fallible method either an user-supplied `SignError` or a [`CreationError`]
1714 /// may occur.
1715 #[derive(Eq, PartialEq, Debug, Clone)]
1716 pub enum SignOrCreationError<S = ()> {
1717         /// An error occurred during signing
1718         SignError(S),
1719
1720         /// An error occurred while building the transaction
1721         CreationError(CreationError),
1722 }
1723
1724 impl<S> Display for SignOrCreationError<S> {
1725         fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
1726                 match self {
1727                         SignOrCreationError::SignError(_) => f.write_str("An error occurred during signing"),
1728                         SignOrCreationError::CreationError(err) => err.fmt(f),
1729                 }
1730         }
1731 }
1732
1733 #[cfg(feature = "serde")]
1734 impl Serialize for Bolt11Invoice {
1735         fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
1736                 serializer.serialize_str(self.to_string().as_str())
1737         }
1738 }
1739 #[cfg(feature = "serde")]
1740 impl<'de> Deserialize<'de> for Bolt11Invoice {
1741         fn deserialize<D>(deserializer: D) -> Result<Bolt11Invoice, D::Error> where D: Deserializer<'de> {
1742                 let bolt11 = String::deserialize(deserializer)?
1743                         .parse::<Bolt11Invoice>()
1744                         .map_err(|e| D::Error::custom(format_args!("{:?}", e)))?;
1745
1746                 Ok(bolt11)
1747         }
1748 }
1749
1750 #[cfg(test)]
1751 mod test {
1752         use bitcoin::Script;
1753         use bitcoin_hashes::hex::FromHex;
1754         use bitcoin_hashes::sha256;
1755
1756         #[test]
1757         fn test_system_time_bounds_assumptions() {
1758                 assert_eq!(
1759                         crate::PositiveTimestamp::from_unix_timestamp(crate::MAX_TIMESTAMP + 1),
1760                         Err(crate::CreationError::TimestampOutOfBounds)
1761                 );
1762         }
1763
1764         #[test]
1765         fn test_calc_invoice_hash() {
1766                 use crate::{RawBolt11Invoice, RawHrp, RawDataPart, Currency, PositiveTimestamp};
1767                 use crate::TaggedField::*;
1768
1769                 let invoice = RawBolt11Invoice {
1770                         hrp: RawHrp {
1771                                 currency: Currency::Bitcoin,
1772                                 raw_amount: None,
1773                                 si_prefix: None,
1774                         },
1775                         data: RawDataPart {
1776                                 timestamp: PositiveTimestamp::from_unix_timestamp(1496314658).unwrap(),
1777                                 tagged_fields: vec![
1778                                         PaymentHash(crate::Sha256(sha256::Hash::from_hex(
1779                                                 "0001020304050607080900010203040506070809000102030405060708090102"
1780                                         ).unwrap())).into(),
1781                                         Description(crate::Description::new(
1782                                                 "Please consider supporting this project".to_owned()
1783                                         ).unwrap()).into(),
1784                                 ],
1785                         },
1786                 };
1787
1788                 let expected_hash = [
1789                         0xc3, 0xd4, 0xe8, 0x3f, 0x64, 0x6f, 0xa7, 0x9a, 0x39, 0x3d, 0x75, 0x27, 0x7b, 0x1d,
1790                         0x85, 0x8d, 0xb1, 0xd1, 0xf7, 0xab, 0x71, 0x37, 0xdc, 0xb7, 0x83, 0x5d, 0xb2, 0xec,
1791                         0xd5, 0x18, 0xe1, 0xc9
1792                 ];
1793
1794                 assert_eq!(invoice.signable_hash(), expected_hash)
1795         }
1796
1797         #[test]
1798         fn test_check_signature() {
1799                 use crate::TaggedField::*;
1800                 use secp256k1::Secp256k1;
1801                 use secp256k1::ecdsa::{RecoveryId, RecoverableSignature};
1802                 use secp256k1::{SecretKey, PublicKey};
1803                 use crate::{SignedRawBolt11Invoice, Bolt11InvoiceSignature, RawBolt11Invoice, RawHrp, RawDataPart, Currency, Sha256,
1804                          PositiveTimestamp};
1805
1806                 let invoice = SignedRawBolt11Invoice {
1807                         raw_invoice: RawBolt11Invoice {
1808                                 hrp: RawHrp {
1809                                         currency: Currency::Bitcoin,
1810                                         raw_amount: None,
1811                                         si_prefix: None,
1812                                 },
1813                                 data: RawDataPart {
1814                                         timestamp: PositiveTimestamp::from_unix_timestamp(1496314658).unwrap(),
1815                                         tagged_fields: vec ! [
1816                                                 PaymentHash(Sha256(sha256::Hash::from_hex(
1817                                                         "0001020304050607080900010203040506070809000102030405060708090102"
1818                                                 ).unwrap())).into(),
1819                                                 Description(
1820                                                         crate::Description::new(
1821                                                                 "Please consider supporting this project".to_owned()
1822                                                         ).unwrap()
1823                                                 ).into(),
1824                                         ],
1825                                 },
1826                         },
1827                         hash: [
1828                                 0xc3, 0xd4, 0xe8, 0x3f, 0x64, 0x6f, 0xa7, 0x9a, 0x39, 0x3d, 0x75, 0x27,
1829                                 0x7b, 0x1d, 0x85, 0x8d, 0xb1, 0xd1, 0xf7, 0xab, 0x71, 0x37, 0xdc, 0xb7,
1830                                 0x83, 0x5d, 0xb2, 0xec, 0xd5, 0x18, 0xe1, 0xc9
1831                         ],
1832                         signature: Bolt11InvoiceSignature(RecoverableSignature::from_compact(
1833                                 & [
1834                                         0x38u8, 0xec, 0x68, 0x91, 0x34, 0x5e, 0x20, 0x41, 0x45, 0xbe, 0x8a,
1835                                         0x3a, 0x99, 0xde, 0x38, 0xe9, 0x8a, 0x39, 0xd6, 0xa5, 0x69, 0x43,
1836                                         0x4e, 0x18, 0x45, 0xc8, 0xaf, 0x72, 0x05, 0xaf, 0xcf, 0xcc, 0x7f,
1837                                         0x42, 0x5f, 0xcd, 0x14, 0x63, 0xe9, 0x3c, 0x32, 0x88, 0x1e, 0xad,
1838                                         0x0d, 0x6e, 0x35, 0x6d, 0x46, 0x7e, 0xc8, 0xc0, 0x25, 0x53, 0xf9,
1839                                         0xaa, 0xb1, 0x5e, 0x57, 0x38, 0xb1, 0x1f, 0x12, 0x7f
1840                                 ],
1841                                 RecoveryId::from_i32(0).unwrap()
1842                         ).unwrap()),
1843                 };
1844
1845                 assert!(invoice.check_signature());
1846
1847                 let private_key = SecretKey::from_slice(
1848                         &[
1849                                 0xe1, 0x26, 0xf6, 0x8f, 0x7e, 0xaf, 0xcc, 0x8b, 0x74, 0xf5, 0x4d, 0x26, 0x9f, 0xe2,
1850                                 0x06, 0xbe, 0x71, 0x50, 0x00, 0xf9, 0x4d, 0xac, 0x06, 0x7d, 0x1c, 0x04, 0xa8, 0xca,
1851                                 0x3b, 0x2d, 0xb7, 0x34
1852                         ][..]
1853                 ).unwrap();
1854                 let public_key = PublicKey::from_secret_key(&Secp256k1::new(), &private_key);
1855
1856                 assert_eq!(invoice.recover_payee_pub_key(), Ok(crate::PayeePubKey(public_key)));
1857
1858                 let (raw_invoice, _, _) = invoice.into_parts();
1859                 let new_signed = raw_invoice.sign::<_, ()>(|hash| {
1860                         Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key))
1861                 }).unwrap();
1862
1863                 assert!(new_signed.check_signature());
1864         }
1865
1866         #[test]
1867         fn test_check_feature_bits() {
1868                 use crate::TaggedField::*;
1869                 use lightning::ln::features::Bolt11InvoiceFeatures;
1870                 use secp256k1::Secp256k1;
1871                 use secp256k1::SecretKey;
1872                 use crate::{Bolt11Invoice, RawBolt11Invoice, RawHrp, RawDataPart, Currency, Sha256, PositiveTimestamp, 
1873                          Bolt11SemanticError};
1874
1875                 let private_key = SecretKey::from_slice(&[42; 32]).unwrap();
1876                 let payment_secret = lightning::ln::PaymentSecret([21; 32]);
1877                 let invoice_template = RawBolt11Invoice {
1878                         hrp: RawHrp {
1879                                 currency: Currency::Bitcoin,
1880                                 raw_amount: None,
1881                                 si_prefix: None,
1882                         },
1883                         data: RawDataPart {
1884                                 timestamp: PositiveTimestamp::from_unix_timestamp(1496314658).unwrap(),
1885                                 tagged_fields: vec ! [
1886                                         PaymentHash(Sha256(sha256::Hash::from_hex(
1887                                                 "0001020304050607080900010203040506070809000102030405060708090102"
1888                                         ).unwrap())).into(),
1889                                         Description(
1890                                                 crate::Description::new(
1891                                                         "Please consider supporting this project".to_owned()
1892                                                 ).unwrap()
1893                                         ).into(),
1894                                 ],
1895                         },
1896                 };
1897
1898                 // Missing features
1899                 let invoice = {
1900                         let mut invoice = invoice_template.clone();
1901                         invoice.data.tagged_fields.push(PaymentSecret(payment_secret).into());
1902                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1903                 }.unwrap();
1904                 assert_eq!(Bolt11Invoice::from_signed(invoice), Err(Bolt11SemanticError::InvalidFeatures));
1905
1906                 // Missing feature bits
1907                 let invoice = {
1908                         let mut invoice = invoice_template.clone();
1909                         invoice.data.tagged_fields.push(PaymentSecret(payment_secret).into());
1910                         invoice.data.tagged_fields.push(Features(Bolt11InvoiceFeatures::empty()).into());
1911                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1912                 }.unwrap();
1913                 assert_eq!(Bolt11Invoice::from_signed(invoice), Err(Bolt11SemanticError::InvalidFeatures));
1914
1915                 let mut payment_secret_features = Bolt11InvoiceFeatures::empty();
1916                 payment_secret_features.set_payment_secret_required();
1917
1918                 // Including payment secret and feature bits
1919                 let invoice = {
1920                         let mut invoice = invoice_template.clone();
1921                         invoice.data.tagged_fields.push(PaymentSecret(payment_secret).into());
1922                         invoice.data.tagged_fields.push(Features(payment_secret_features.clone()).into());
1923                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1924                 }.unwrap();
1925                 assert!(Bolt11Invoice::from_signed(invoice).is_ok());
1926
1927                 // No payment secret or features
1928                 let invoice = {
1929                         let invoice = invoice_template.clone();
1930                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1931                 }.unwrap();
1932                 assert_eq!(Bolt11Invoice::from_signed(invoice), Err(Bolt11SemanticError::NoPaymentSecret));
1933
1934                 // No payment secret or feature bits
1935                 let invoice = {
1936                         let mut invoice = invoice_template.clone();
1937                         invoice.data.tagged_fields.push(Features(Bolt11InvoiceFeatures::empty()).into());
1938                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1939                 }.unwrap();
1940                 assert_eq!(Bolt11Invoice::from_signed(invoice), Err(Bolt11SemanticError::NoPaymentSecret));
1941
1942                 // Missing payment secret
1943                 let invoice = {
1944                         let mut invoice = invoice_template.clone();
1945                         invoice.data.tagged_fields.push(Features(payment_secret_features).into());
1946                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1947                 }.unwrap();
1948                 assert_eq!(Bolt11Invoice::from_signed(invoice), Err(Bolt11SemanticError::NoPaymentSecret));
1949
1950                 // Multiple payment secrets
1951                 let invoice = {
1952                         let mut invoice = invoice_template;
1953                         invoice.data.tagged_fields.push(PaymentSecret(payment_secret).into());
1954                         invoice.data.tagged_fields.push(PaymentSecret(payment_secret).into());
1955                         invoice.sign::<_, ()>(|hash| Ok(Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key)))
1956                 }.unwrap();
1957                 assert_eq!(Bolt11Invoice::from_signed(invoice), Err(Bolt11SemanticError::MultiplePaymentSecrets));
1958         }
1959
1960         #[test]
1961         fn test_builder_amount() {
1962                 use crate::*;
1963
1964                 let builder = InvoiceBuilder::new(Currency::Bitcoin)
1965                         .description("Test".into())
1966                         .payment_hash(sha256::Hash::from_slice(&[0;32][..]).unwrap())
1967                         .duration_since_epoch(Duration::from_secs(1234567));
1968
1969                 let invoice = builder.clone()
1970                         .amount_milli_satoshis(1500)
1971                         .build_raw()
1972                         .unwrap();
1973
1974                 assert_eq!(invoice.hrp.si_prefix, Some(SiPrefix::Nano));
1975                 assert_eq!(invoice.hrp.raw_amount, Some(15));
1976
1977
1978                 let invoice = builder
1979                         .amount_milli_satoshis(150)
1980                         .build_raw()
1981                         .unwrap();
1982
1983                 assert_eq!(invoice.hrp.si_prefix, Some(SiPrefix::Pico));
1984                 assert_eq!(invoice.hrp.raw_amount, Some(1500));
1985         }
1986
1987         #[test]
1988         fn test_builder_fail() {
1989                 use crate::*;
1990                 use lightning::routing::router::RouteHintHop;
1991                 use std::iter::FromIterator;
1992                 use secp256k1::PublicKey;
1993
1994                 let builder = InvoiceBuilder::new(Currency::Bitcoin)
1995                         .payment_hash(sha256::Hash::from_slice(&[0;32][..]).unwrap())
1996                         .duration_since_epoch(Duration::from_secs(1234567))
1997                         .min_final_cltv_expiry_delta(144);
1998
1999                 let too_long_string = String::from_iter(
2000                         (0..1024).map(|_| '?')
2001                 );
2002
2003                 let long_desc_res = builder.clone()
2004                         .description(too_long_string)
2005                         .build_raw();
2006                 assert_eq!(long_desc_res, Err(CreationError::DescriptionTooLong));
2007
2008                 let route_hop = RouteHintHop {
2009                         src_node_id: PublicKey::from_slice(
2010                                         &[
2011                                                 0x03, 0x9e, 0x03, 0xa9, 0x01, 0xb8, 0x55, 0x34, 0xff, 0x1e, 0x92, 0xc4,
2012                                                 0x3c, 0x74, 0x43, 0x1f, 0x7c, 0xe7, 0x20, 0x46, 0x06, 0x0f, 0xcf, 0x7a,
2013                                                 0x95, 0xc3, 0x7e, 0x14, 0x8f, 0x78, 0xc7, 0x72, 0x55
2014                                         ][..]
2015                                 ).unwrap(),
2016                         short_channel_id: 0,
2017                         fees: RoutingFees {
2018                                 base_msat: 0,
2019                                 proportional_millionths: 0,
2020                         },
2021                         cltv_expiry_delta: 0,
2022                         htlc_minimum_msat: None,
2023                         htlc_maximum_msat: None,
2024                 };
2025                 let too_long_route = RouteHint(vec![route_hop; 13]);
2026                 let long_route_res = builder.clone()
2027                         .description("Test".into())
2028                         .private_route(too_long_route)
2029                         .build_raw();
2030                 assert_eq!(long_route_res, Err(CreationError::RouteTooLong));
2031
2032                 let sign_error_res = builder
2033                         .description("Test".into())
2034                         .payment_secret(PaymentSecret([0; 32]))
2035                         .try_build_signed(|_| {
2036                                 Err("ImaginaryError")
2037                         });
2038                 assert_eq!(sign_error_res, Err(SignOrCreationError::SignError("ImaginaryError")));
2039         }
2040
2041         #[test]
2042         fn test_builder_ok() {
2043                 use crate::*;
2044                 use lightning::routing::router::RouteHintHop;
2045                 use secp256k1::Secp256k1;
2046                 use secp256k1::{SecretKey, PublicKey};
2047                 use std::time::{UNIX_EPOCH, Duration};
2048
2049                 let secp_ctx = Secp256k1::new();
2050
2051                 let private_key = SecretKey::from_slice(
2052                         &[
2053                                 0xe1, 0x26, 0xf6, 0x8f, 0x7e, 0xaf, 0xcc, 0x8b, 0x74, 0xf5, 0x4d, 0x26, 0x9f, 0xe2,
2054                                 0x06, 0xbe, 0x71, 0x50, 0x00, 0xf9, 0x4d, 0xac, 0x06, 0x7d, 0x1c, 0x04, 0xa8, 0xca,
2055                                 0x3b, 0x2d, 0xb7, 0x34
2056                         ][..]
2057                 ).unwrap();
2058                 let public_key = PublicKey::from_secret_key(&secp_ctx, &private_key);
2059
2060                 let route_1 = RouteHint(vec![
2061                         RouteHintHop {
2062                                 src_node_id: public_key,
2063                                 short_channel_id: de::parse_int_be(&[123; 8], 256).expect("short chan ID slice too big?"),
2064                                 fees: RoutingFees {
2065                                         base_msat: 2,
2066                                         proportional_millionths: 1,
2067                                 },
2068                                 cltv_expiry_delta: 145,
2069                                 htlc_minimum_msat: None,
2070                                 htlc_maximum_msat: None,
2071                         },
2072                         RouteHintHop {
2073                                 src_node_id: public_key,
2074                                 short_channel_id: de::parse_int_be(&[42; 8], 256).expect("short chan ID slice too big?"),
2075                                 fees: RoutingFees {
2076                                         base_msat: 3,
2077                                         proportional_millionths: 2,
2078                                 },
2079                                 cltv_expiry_delta: 146,
2080                                 htlc_minimum_msat: None,
2081                                 htlc_maximum_msat: None,
2082                         }
2083                 ]);
2084
2085                 let route_2 = RouteHint(vec![
2086                         RouteHintHop {
2087                                 src_node_id: public_key,
2088                                 short_channel_id: 0,
2089                                 fees: RoutingFees {
2090                                         base_msat: 4,
2091                                         proportional_millionths: 3,
2092                                 },
2093                                 cltv_expiry_delta: 147,
2094                                 htlc_minimum_msat: None,
2095                                 htlc_maximum_msat: None,
2096                         },
2097                         RouteHintHop {
2098                                 src_node_id: public_key,
2099                                 short_channel_id: de::parse_int_be(&[1; 8], 256).expect("short chan ID slice too big?"),
2100                                 fees: RoutingFees {
2101                                         base_msat: 5,
2102                                         proportional_millionths: 4,
2103                                 },
2104                                 cltv_expiry_delta: 148,
2105                                 htlc_minimum_msat: None,
2106                                 htlc_maximum_msat: None,
2107                         }
2108                 ]);
2109
2110                 let builder = InvoiceBuilder::new(Currency::BitcoinTestnet)
2111                         .amount_milli_satoshis(123)
2112                         .duration_since_epoch(Duration::from_secs(1234567))
2113                         .payee_pub_key(public_key)
2114                         .expiry_time(Duration::from_secs(54321))
2115                         .min_final_cltv_expiry_delta(144)
2116                         .fallback(Fallback::PubKeyHash(PubkeyHash::from_slice(&[0;20]).unwrap()))
2117                         .private_route(route_1.clone())
2118                         .private_route(route_2.clone())
2119                         .description_hash(sha256::Hash::from_slice(&[3;32][..]).unwrap())
2120                         .payment_hash(sha256::Hash::from_slice(&[21;32][..]).unwrap())
2121                         .payment_secret(PaymentSecret([42; 32]))
2122                         .basic_mpp();
2123
2124                 let invoice = builder.clone().build_signed(|hash| {
2125                         secp_ctx.sign_ecdsa_recoverable(hash, &private_key)
2126                 }).unwrap();
2127
2128                 assert!(invoice.check_signature().is_ok());
2129                 assert_eq!(invoice.tagged_fields().count(), 10);
2130
2131                 assert_eq!(invoice.amount_milli_satoshis(), Some(123));
2132                 assert_eq!(invoice.amount_pico_btc(), Some(1230));
2133                 assert_eq!(invoice.currency(), Currency::BitcoinTestnet);
2134                 #[cfg(feature = "std")]
2135                 assert_eq!(
2136                         invoice.timestamp().duration_since(UNIX_EPOCH).unwrap().as_secs(),
2137                         1234567
2138                 );
2139                 assert_eq!(invoice.payee_pub_key(), Some(&public_key));
2140                 assert_eq!(invoice.expiry_time(), Duration::from_secs(54321));
2141                 assert_eq!(invoice.min_final_cltv_expiry_delta(), 144);
2142                 assert_eq!(invoice.fallbacks(), vec![&Fallback::PubKeyHash(PubkeyHash::from_slice(&[0;20]).unwrap())]);
2143                 let address = Address::from_script(&Script::new_p2pkh(&PubkeyHash::from_slice(&[0;20]).unwrap()), Network::Testnet).unwrap();
2144                 assert_eq!(invoice.fallback_addresses(), vec![address]);
2145                 assert_eq!(invoice.private_routes(), vec![&PrivateRoute(route_1), &PrivateRoute(route_2)]);
2146                 assert_eq!(
2147                         invoice.description(),
2148                         Bolt11InvoiceDescription::Hash(&Sha256(sha256::Hash::from_slice(&[3;32][..]).unwrap()))
2149                 );
2150                 assert_eq!(invoice.payment_hash(), &sha256::Hash::from_slice(&[21;32][..]).unwrap());
2151                 assert_eq!(invoice.payment_secret(), &PaymentSecret([42; 32]));
2152
2153                 let mut expected_features = Bolt11InvoiceFeatures::empty();
2154                 expected_features.set_variable_length_onion_required();
2155                 expected_features.set_payment_secret_required();
2156                 expected_features.set_basic_mpp_optional();
2157                 assert_eq!(invoice.features(), Some(&expected_features));
2158
2159                 let raw_invoice = builder.build_raw().unwrap();
2160                 assert_eq!(raw_invoice, *invoice.into_signed_raw().raw_invoice())
2161         }
2162
2163         #[test]
2164         fn test_default_values() {
2165                 use crate::*;
2166                 use secp256k1::Secp256k1;
2167                 use secp256k1::SecretKey;
2168
2169                 let signed_invoice = InvoiceBuilder::new(Currency::Bitcoin)
2170                         .description("Test".into())
2171                         .payment_hash(sha256::Hash::from_slice(&[0;32][..]).unwrap())
2172                         .payment_secret(PaymentSecret([0; 32]))
2173                         .duration_since_epoch(Duration::from_secs(1234567))
2174                         .build_raw()
2175                         .unwrap()
2176                         .sign::<_, ()>(|hash| {
2177                                 let privkey = SecretKey::from_slice(&[41; 32]).unwrap();
2178                                 let secp_ctx = Secp256k1::new();
2179                                 Ok(secp_ctx.sign_ecdsa_recoverable(hash, &privkey))
2180                         })
2181                         .unwrap();
2182                 let invoice = Bolt11Invoice::from_signed(signed_invoice).unwrap();
2183
2184                 assert_eq!(invoice.min_final_cltv_expiry_delta(), DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA);
2185                 assert_eq!(invoice.expiry_time(), Duration::from_secs(DEFAULT_EXPIRY_TIME));
2186                 assert!(!invoice.would_expire(Duration::from_secs(1234568)));
2187         }
2188
2189         #[test]
2190         fn test_expiration() {
2191                 use crate::*;
2192                 use secp256k1::Secp256k1;
2193                 use secp256k1::SecretKey;
2194
2195                 let signed_invoice = InvoiceBuilder::new(Currency::Bitcoin)
2196                         .description("Test".into())
2197                         .payment_hash(sha256::Hash::from_slice(&[0;32][..]).unwrap())
2198                         .payment_secret(PaymentSecret([0; 32]))
2199                         .duration_since_epoch(Duration::from_secs(1234567))
2200                         .build_raw()
2201                         .unwrap()
2202                         .sign::<_, ()>(|hash| {
2203                                 let privkey = SecretKey::from_slice(&[41; 32]).unwrap();
2204                                 let secp_ctx = Secp256k1::new();
2205                                 Ok(secp_ctx.sign_ecdsa_recoverable(hash, &privkey))
2206                         })
2207                         .unwrap();
2208                 let invoice = Bolt11Invoice::from_signed(signed_invoice).unwrap();
2209
2210                 assert!(invoice.would_expire(Duration::from_secs(1234567 + DEFAULT_EXPIRY_TIME + 1)));
2211         }
2212
2213         #[cfg(feature = "serde")]
2214         #[test]
2215         fn test_serde() {
2216                 let invoice_str = "lnbc100p1psj9jhxdqud3jxktt5w46x7unfv9kz6mn0v3jsnp4q0d3p2sfluzdx45tqcs\
2217                         h2pu5qc7lgq0xs578ngs6s0s68ua4h7cvspp5q6rmq35js88zp5dvwrv9m459tnk2zunwj5jalqtyxqulh0l\
2218                         5gflssp5nf55ny5gcrfl30xuhzj3nphgj27rstekmr9fw3ny5989s300gyus9qyysgqcqpcrzjqw2sxwe993\
2219                         h5pcm4dxzpvttgza8zhkqxpgffcrf5v25nwpr3cmfg7z54kuqq8rgqqqqqqqq2qqqqq9qq9qrzjqd0ylaqcl\
2220                         j9424x9m8h2vcukcgnm6s56xfgu3j78zyqzhgs4hlpzvznlugqq9vsqqqqqqqlgqqqqqeqq9qrzjqwldmj9d\
2221                         ha74df76zhx6l9we0vjdquygcdt3kssupehe64g6yyp5yz5rhuqqwccqqyqqqqlgqqqqjcqq9qrzjqf9e58a\
2222                         guqr0rcun0ajlvmzq3ek63cw2w282gv3z5uupmuwvgjtq2z55qsqqg6qqqyqqqrtnqqqzq3cqygrzjqvphms\
2223                         ywntrrhqjcraumvc4y6r8v4z5v593trte429v4hredj7ms5z52usqq9ngqqqqqqqlgqqqqqqgq9qrzjq2v0v\
2224                         p62g49p7569ev48cmulecsxe59lvaw3wlxm7r982zxa9zzj7z5l0cqqxusqqyqqqqlgqqqqqzsqygarl9fh3\
2225                         8s0gyuxjjgux34w75dnc6xp2l35j7es3jd4ugt3lu0xzre26yg5m7ke54n2d5sym4xcmxtl8238xxvw5h5h5\
2226                         j5r6drg6k6zcqj0fcwg";
2227                 let invoice = invoice_str.parse::<super::Bolt11Invoice>().unwrap();
2228                 let serialized_invoice = serde_json::to_string(&invoice).unwrap();
2229                 let deserialized_invoice: super::Bolt11Invoice = serde_json::from_str(serialized_invoice.as_str()).unwrap();
2230                 assert_eq!(invoice, deserialized_invoice);
2231                 assert_eq!(invoice_str, deserialized_invoice.to_string().as_str());
2232                 assert_eq!(invoice_str, serialized_invoice.as_str().trim_matches('\"'));
2233         }
2234 }