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