Add get_single_block to chacha20 module
[rust-lightning] / lightning / src / ln / channelmanager.rs
index 47d705fe625b4889d7d3da19681af0d4272b8807..b9ee78499bcc6a5fecf749086af81b69b4277212 100644 (file)
@@ -67,10 +67,11 @@ use io::{Cursor, Read};
 use sync::{Arc, Condvar, Mutex, MutexGuard, RwLock, RwLockReadGuard};
 use core::sync::atomic::{AtomicUsize, Ordering};
 use core::time::Duration;
-#[cfg(any(test, feature = "allow_wallclock_use"))]
-use std::time::Instant;
 use core::ops::Deref;
 
+#[cfg(any(test, feature = "std"))]
+use std::time::Instant;
+
 // We hold various information about HTLC relay in the HTLC objects in Channel itself:
 //
 // Upon receipt of an HTLC from a peer, we'll give it a PendingHTLCStatus indicating if it should
@@ -2912,6 +2913,59 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
                                                                        }
                                                                }
 
+                                                               macro_rules! check_total_value {
+                                                                       ($payment_data_total_msat: expr, $payment_secret: expr, $payment_preimage: expr) => {{
+                                                                               let mut total_value = 0;
+                                                                               let mut payment_received_generated = false;
+                                                                               let htlcs = channel_state.claimable_htlcs.entry(payment_hash)
+                                                                                       .or_insert(Vec::new());
+                                                                               if htlcs.len() == 1 {
+                                                                                       if let OnionPayload::Spontaneous(_) = htlcs[0].onion_payload {
+                                                                                               log_trace!(self.logger, "Failing new HTLC with payment_hash {} as we already had an existing keysend HTLC with the same payment hash", log_bytes!(payment_hash.0));
+                                                                                               fail_htlc!(claimable_htlc);
+                                                                                               continue
+                                                                                       }
+                                                                               }
+                                                                               htlcs.push(claimable_htlc);
+                                                                               for htlc in htlcs.iter() {
+                                                                                       total_value += htlc.value;
+                                                                                       match &htlc.onion_payload {
+                                                                                               OnionPayload::Invoice(htlc_payment_data) => {
+                                                                                                       if htlc_payment_data.total_msat != $payment_data_total_msat {
+                                                                                                               log_trace!(self.logger, "Failing HTLCs with payment_hash {} as the HTLCs had inconsistent total values (eg {} and {})",
+                                                                                                                       log_bytes!(payment_hash.0), $payment_data_total_msat, htlc_payment_data.total_msat);
+                                                                                                               total_value = msgs::MAX_VALUE_MSAT;
+                                                                                                       }
+                                                                                                       if total_value >= msgs::MAX_VALUE_MSAT { break; }
+                                                                                               },
+                                                                                               _ => unreachable!(),
+                                                                                       }
+                                                                               }
+                                                                               if total_value >= msgs::MAX_VALUE_MSAT || total_value > $payment_data_total_msat {
+                                                                                       log_trace!(self.logger, "Failing HTLCs with payment_hash {} as the total value {} ran over expected value {} (or HTLCs were inconsistent)",
+                                                                                               log_bytes!(payment_hash.0), total_value, $payment_data_total_msat);
+                                                                                       for htlc in htlcs.iter() {
+                                                                                               fail_htlc!(htlc);
+                                                                                       }
+                                                                               } else if total_value == $payment_data_total_msat {
+                                                                                       new_events.push(events::Event::PaymentReceived {
+                                                                                               payment_hash,
+                                                                                               purpose: events::PaymentPurpose::InvoicePayment {
+                                                                                                       payment_preimage: $payment_preimage,
+                                                                                                       payment_secret: $payment_secret,
+                                                                                               },
+                                                                                               amt: total_value,
+                                                                                       });
+                                                                                       payment_received_generated = true;
+                                                                               } else {
+                                                                                       // Nothing to do - we haven't reached the total
+                                                                                       // payment value yet, wait until we receive more
+                                                                                       // MPP parts.
+                                                                               }
+                                                                               payment_received_generated
+                                                                       }}
+                                                               }
+
                                                                // Check that the payment hash and secret are known. Note that we
                                                                // MUST take care to handle the "unknown payment hash" and
                                                                // "incorrect payment secret" cases here identically or we'd expose
@@ -2961,54 +3015,9 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
                                                                                                log_bytes!(payment_hash.0), payment_data.total_msat, inbound_payment.get().min_value_msat.unwrap());
                                                                                        fail_htlc!(claimable_htlc);
                                                                                } else {
-                                                                                       let mut total_value = 0;
-                                                                                       let htlcs = channel_state.claimable_htlcs.entry(payment_hash)
-                                                                                               .or_insert(Vec::new());
-                                                                                       if htlcs.len() == 1 {
-                                                                                               if let OnionPayload::Spontaneous(_) = htlcs[0].onion_payload {
-                                                                                                       log_trace!(self.logger, "Failing new HTLC with payment_hash {} as we already had an existing keysend HTLC with the same payment hash", log_bytes!(payment_hash.0));
-                                                                                                       fail_htlc!(claimable_htlc);
-                                                                                                       continue
-                                                                                               }
-                                                                                       }
-                                                                                       htlcs.push(claimable_htlc);
-                                                                                       for htlc in htlcs.iter() {
-                                                                                               total_value += htlc.value;
-                                                                                               match &htlc.onion_payload {
-                                                                                                       OnionPayload::Invoice(htlc_payment_data) => {
-                                                                                                               if htlc_payment_data.total_msat != payment_data.total_msat {
-                                                                                                                       log_trace!(self.logger, "Failing HTLCs with payment_hash {} as the HTLCs had inconsistent total values (eg {} and {})",
-                                                                                                                                                                log_bytes!(payment_hash.0), payment_data.total_msat, htlc_payment_data.total_msat);
-                                                                                                                       total_value = msgs::MAX_VALUE_MSAT;
-                                                                                                               }
-                                                                                                               if total_value >= msgs::MAX_VALUE_MSAT { break; }
-                                                                                                       },
-                                                                                                       _ => unreachable!(),
-                                                                                               }
-                                                                                       }
-                                                                                       if total_value >= msgs::MAX_VALUE_MSAT || total_value > payment_data.total_msat {
-                                                                                               log_trace!(self.logger, "Failing HTLCs with payment_hash {} as the total value {} ran over expected value {} (or HTLCs were inconsistent)",
-                                                                                                       log_bytes!(payment_hash.0), total_value, payment_data.total_msat);
-                                                                                               for htlc in htlcs.iter() {
-                                                                                                       fail_htlc!(htlc);
-                                                                                               }
-                                                                                       } else if total_value == payment_data.total_msat {
-                                                                                               new_events.push(events::Event::PaymentReceived {
-                                                                                                       payment_hash,
-                                                                                                       purpose: events::PaymentPurpose::InvoicePayment {
-                                                                                                               payment_preimage: inbound_payment.get().payment_preimage,
-                                                                                                               payment_secret: payment_data.payment_secret,
-                                                                                                       },
-                                                                                                       amt: total_value,
-                                                                                               });
-                                                                                               // Only ever generate at most one PaymentReceived
-                                                                                               // per registered payment_hash, even if it isn't
-                                                                                               // claimed.
+                                                                                       let payment_received_generated = check_total_value!(payment_data.total_msat, payment_data.payment_secret, inbound_payment.get().payment_preimage);
+                                                                                       if payment_received_generated {
                                                                                                inbound_payment.remove_entry();
-                                                                                       } else {
-                                                                                               // Nothing to do - we haven't reached the total
-                                                                                               // payment value yet, wait until we receive more
-                                                                                               // MPP parts.
                                                                                        }
                                                                                }
                                                                        },
@@ -5110,8 +5119,9 @@ where
        /// indicating whether persistence is necessary. Only one listener on
        /// `await_persistable_update` or `await_persistable_update_timeout` is guaranteed to be woken
        /// up.
-       /// Note that the feature `allow_wallclock_use` must be enabled to use this function.
-       #[cfg(any(test, feature = "allow_wallclock_use"))]
+       ///
+       /// Note that this method is not available with the `no-std` feature.
+       #[cfg(any(test, feature = "std"))]
        pub fn await_persistable_update_timeout(&self, max_wait: Duration) -> bool {
                self.persistence_notifier.wait_timeout(max_wait)
        }
@@ -5406,7 +5416,7 @@ impl PersistenceNotifier {
                }
        }
 
-       #[cfg(any(test, feature = "allow_wallclock_use"))]
+       #[cfg(any(test, feature = "std"))]
        fn wait_timeout(&self, max_wait: Duration) -> bool {
                let current_time = Instant::now();
                loop {