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