X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning-invoice%2Fsrc%2Flib.rs;h=17b6e2de2b6efe8582f9f78823289f306c9f4991;hb=1d72e87e7829d86214f92936c8b4fdcd9fac8d50;hp=c01dfa47ba0b086f8de39691de88df06ce3f2e91;hpb=ce6bcf68a15331c082b34d09902241583bc6ff71;p=rust-lightning diff --git a/lightning-invoice/src/lib.rs b/lightning-invoice/src/lib.rs index c01dfa47..17b6e2de 100644 --- a/lightning-invoice/src/lib.rs +++ b/lightning-invoice/src/lib.rs @@ -154,11 +154,11 @@ pub const DEFAULT_EXPIRY_TIME: u64 = 3600; /// Default minimum final CLTV expiry as defined by [BOLT 11]. /// /// Note that this is *not* the same value as rust-lightning's minimum CLTV expiry, which is -/// provided in [`MIN_FINAL_CLTV_EXPIRY`]. +/// provided in [`MIN_FINAL_CLTV_EXPIRY_DELTA`]. /// /// [BOLT 11]: https://github.com/lightning/bolts/blob/master/11-payment-encoding.md -/// [`MIN_FINAL_CLTV_EXPIRY`]: lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY -pub const DEFAULT_MIN_FINAL_CLTV_EXPIRY: u64 = 18; +/// [`MIN_FINAL_CLTV_EXPIRY_DELTA`]: lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA +pub const DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA: u64 = 18; /// Builder for `Invoice`s. It's the most convenient and advised way to use this library. It ensures /// that only a semantically and syntactically correct Invoice can be built using it. @@ -199,7 +199,7 @@ pub const DEFAULT_MIN_FINAL_CLTV_EXPIRY: u64 = 18; /// .payment_hash(payment_hash) /// .payment_secret(payment_secret) /// .current_timestamp() -/// .min_final_cltv_expiry(144) +/// .min_final_cltv_expiry_delta(144) /// .build_signed(|hash| { /// Secp256k1::new().sign_ecdsa_recoverable(hash, &private_key) /// }) @@ -410,7 +410,7 @@ pub enum TaggedField { PayeePubKey(PayeePubKey), DescriptionHash(Sha256), ExpiryTime(ExpiryTime), - MinFinalCltvExpiry(MinFinalCltvExpiry), + MinFinalCltvExpiryDelta(MinFinalCltvExpiryDelta), Fallback(Fallback), PrivateRoute(PrivateRoute), PaymentSecret(PaymentSecret), @@ -438,9 +438,9 @@ pub struct PayeePubKey(pub PublicKey); #[derive(Clone, Debug, Hash, Eq, PartialEq)] pub struct ExpiryTime(Duration); -/// `min_final_cltv_expiry` to use for the last HTLC in the route +/// `min_final_cltv_expiry_delta` to use for the last HTLC in the route #[derive(Clone, Debug, Hash, Eq, PartialEq)] -pub struct MinFinalCltvExpiry(pub u64); +pub struct MinFinalCltvExpiryDelta(pub u64); // TODO: better types instead onf byte arrays /// Fallback address in case no LN payment is possible @@ -475,7 +475,7 @@ pub mod constants { pub const TAG_PAYEE_PUB_KEY: u8 = 19; pub const TAG_DESCRIPTION_HASH: u8 = 23; pub const TAG_EXPIRY_TIME: u8 = 6; - pub const TAG_MIN_FINAL_CLTV_EXPIRY: u8 = 24; + pub const TAG_MIN_FINAL_CLTV_EXPIRY_DELTA: u8 = 24; pub const TAG_FALLBACK: u8 = 9; pub const TAG_PRIVATE_ROUTE: u8 = 3; pub const TAG_PAYMENT_SECRET: u8 = 16; @@ -654,9 +654,9 @@ impl InvoiceBuilder InvoiceBuilder { - /// Sets `min_final_cltv_expiry`. - pub fn min_final_cltv_expiry(mut self, min_final_cltv_expiry: u64) -> InvoiceBuilder { - self.tagged_fields.push(TaggedField::MinFinalCltvExpiry(MinFinalCltvExpiry(min_final_cltv_expiry))); + /// Sets `min_final_cltv_expiry_delta`. + pub fn min_final_cltv_expiry_delta(mut self, min_final_cltv_expiry_delta: u64) -> InvoiceBuilder { + self.tagged_fields.push(TaggedField::MinFinalCltvExpiryDelta(MinFinalCltvExpiryDelta(min_final_cltv_expiry_delta))); self.set_flags() } } @@ -929,8 +929,8 @@ impl RawInvoice { find_extract!(self.known_tagged_fields(), TaggedField::ExpiryTime(ref x), x) } - pub fn min_final_cltv_expiry(&self) -> Option<&MinFinalCltvExpiry> { - find_extract!(self.known_tagged_fields(), TaggedField::MinFinalCltvExpiry(ref x), x) + pub fn min_final_cltv_expiry_delta(&self) -> Option<&MinFinalCltvExpiryDelta> { + find_extract!(self.known_tagged_fields(), TaggedField::MinFinalCltvExpiryDelta(ref x), x) } pub fn payment_secret(&self) -> Option<&PaymentSecret> { @@ -1243,12 +1243,12 @@ impl Invoice { .unwrap_or_else(|| Duration::new(u64::max_value(), 1_000_000_000 - 1)) < at_time } - /// Returns the invoice's `min_final_cltv_expiry` time, if present, otherwise - /// [`DEFAULT_MIN_FINAL_CLTV_EXPIRY`]. - pub fn min_final_cltv_expiry(&self) -> u64 { - self.signed_invoice.min_final_cltv_expiry() + /// Returns the invoice's `min_final_cltv_expiry_delta` time, if present, otherwise + /// [`DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA`]. + pub fn min_final_cltv_expiry_delta(&self) -> u64 { + self.signed_invoice.min_final_cltv_expiry_delta() .map(|x| x.0) - .unwrap_or(DEFAULT_MIN_FINAL_CLTV_EXPIRY) + .unwrap_or(DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA) } /// Returns a list of all fallback addresses @@ -1301,7 +1301,7 @@ impl TaggedField { TaggedField::PayeePubKey(_) => constants::TAG_PAYEE_PUB_KEY, TaggedField::DescriptionHash(_) => constants::TAG_DESCRIPTION_HASH, TaggedField::ExpiryTime(_) => constants::TAG_EXPIRY_TIME, - TaggedField::MinFinalCltvExpiry(_) => constants::TAG_MIN_FINAL_CLTV_EXPIRY, + TaggedField::MinFinalCltvExpiryDelta(_) => constants::TAG_MIN_FINAL_CLTV_EXPIRY_DELTA, TaggedField::Fallback(_) => constants::TAG_FALLBACK, TaggedField::PrivateRoute(_) => constants::TAG_PRIVATE_ROUTE, TaggedField::PaymentSecret(_) => constants::TAG_PAYMENT_SECRET, @@ -1448,6 +1448,11 @@ pub enum CreationError { /// /// [phantom invoices]: crate::utils::create_phantom_invoice MissingRouteHints, + + /// The provided `min_final_cltv_expiry_delta` was less than [`MIN_FINAL_CLTV_EXPIRY_DELTA`]. + /// + /// [`MIN_FINAL_CLTV_EXPIRY_DELTA`]: lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA + MinFinalCltvExpiryDeltaTooShort, } impl Display for CreationError { @@ -1458,6 +1463,8 @@ impl Display for CreationError { CreationError::TimestampOutOfBounds => f.write_str("The Unix timestamp of the supplied date is less than zero or greater than 35-bits"), CreationError::InvalidAmount => f.write_str("The supplied millisatoshi amount was greater than the total bitcoin supply"), CreationError::MissingRouteHints => f.write_str("The invoice required route hints and they weren't provided"), + CreationError::MinFinalCltvExpiryDeltaTooShort => f.write_str( + "The supplied final CLTV expiry delta was less than LDK's `MIN_FINAL_CLTV_EXPIRY_DELTA`"), } } } @@ -1804,7 +1811,7 @@ mod test { let builder = InvoiceBuilder::new(Currency::Bitcoin) .payment_hash(sha256::Hash::from_slice(&[0;32][..]).unwrap()) .duration_since_epoch(Duration::from_secs(1234567)) - .min_final_cltv_expiry(144); + .min_final_cltv_expiry_delta(144); let too_long_string = String::from_iter( (0..1024).map(|_| '?') @@ -1922,7 +1929,7 @@ mod test { .duration_since_epoch(Duration::from_secs(1234567)) .payee_pub_key(public_key.clone()) .expiry_time(Duration::from_secs(54321)) - .min_final_cltv_expiry(144) + .min_final_cltv_expiry_delta(144) .fallback(Fallback::PubKeyHash([0;20])) .private_route(route_1.clone()) .private_route(route_2.clone()) @@ -1948,7 +1955,7 @@ mod test { ); assert_eq!(invoice.payee_pub_key(), Some(&public_key)); assert_eq!(invoice.expiry_time(), Duration::from_secs(54321)); - assert_eq!(invoice.min_final_cltv_expiry(), 144); + assert_eq!(invoice.min_final_cltv_expiry_delta(), 144); assert_eq!(invoice.fallbacks(), vec![&Fallback::PubKeyHash([0;20])]); assert_eq!(invoice.private_routes(), vec![&PrivateRoute(route_1), &PrivateRoute(route_2)]); assert_eq!( @@ -1989,7 +1996,7 @@ mod test { .unwrap(); let invoice = Invoice::from_signed(signed_invoice).unwrap(); - assert_eq!(invoice.min_final_cltv_expiry(), DEFAULT_MIN_FINAL_CLTV_EXPIRY); + assert_eq!(invoice.min_final_cltv_expiry_delta(), DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA); assert_eq!(invoice.expiry_time(), Duration::from_secs(DEFAULT_EXPIRY_TIME)); assert!(!invoice.would_expire(Duration::from_secs(1234568))); }