Expose send_payment_for_bolt12_invoice
[rust-lightning] / fuzz / src / full_stack.rs
index 30508fe532473c2222e40cad7a96456e8dd1f117..10328cdce812d2992f8d53f18c1102bea7cde444 100644 (file)
@@ -31,7 +31,6 @@ use bitcoin::hashes::sha256d::Hash as Sha256dHash;
 use bitcoin::hash_types::{Txid, BlockHash};
 
 use lightning::blinded_path::BlindedPath;
-use lightning::blinded_path::message::ForwardNode;
 use lightning::blinded_path::payment::ReceiveTlvs;
 use lightning::chain;
 use lightning::chain::{BestBlock, ChannelMonitorUpdateStatus, Confirm, Listen};
@@ -41,7 +40,8 @@ use lightning::chain::transaction::OutPoint;
 use lightning::sign::{InMemorySigner, Recipient, KeyMaterial, EntropySource, NodeSigner, SignerProvider};
 use lightning::events::Event;
 use lightning::ln::{ChannelId, PaymentHash, PaymentPreimage, PaymentSecret};
-use lightning::ln::channelmanager::{ChainParameters, ChannelDetails, ChannelManager, PaymentId, RecipientOnionFields, Retry, InterceptId};
+use lightning::ln::channel_state::ChannelDetails;
+use lightning::ln::channelmanager::{ChainParameters, ChannelManager, PaymentId, RecipientOnionFields, Retry, InterceptId};
 use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,IgnoringMessageHandler};
 use lightning::ln::msgs::{self, DecodeError};
 use lightning::ln::script::ShutdownScript;
@@ -71,7 +71,7 @@ use std::cell::RefCell;
 use std::convert::TryInto;
 use std::cmp;
 use std::sync::{Arc, Mutex};
-use std::sync::atomic::{AtomicU64,AtomicUsize,Ordering};
+use std::sync::atomic::{AtomicU64,AtomicUsize,AtomicBool,Ordering};
 use bech32::u5;
 
 #[inline]
@@ -98,6 +98,7 @@ pub fn slice_to_be24(v: &[u8]) -> u32 {
 struct InputData {
        data: Vec<u8>,
        read_pos: AtomicUsize,
+       halt_fee_est_reads: AtomicBool,
 }
 impl InputData {
        fn get_slice(&self, len: usize) -> Option<&[u8]> {
@@ -124,6 +125,9 @@ struct FuzzEstimator {
 }
 impl FeeEstimator for FuzzEstimator {
        fn get_est_sat_per_1000_weight(&self, _: ConfirmationTarget) -> u32 {
+               if self.input.halt_fee_est_reads.load(Ordering::Acquire) {
+                       return 253;
+               }
                //TODO: We should actually be testing at least much more than 64k...
                match self.input.get_slice(2) {
                        Some(slice) => cmp::max(slice_to_be16(slice) as u32, 253),
@@ -161,7 +165,7 @@ impl MessageRouter for FuzzRouter {
        }
 
        fn create_blinded_paths<T: secp256k1::Signing + secp256k1::Verification>(
-               &self, _recipient: PublicKey, _peers: Vec<ForwardNode>, _secp_ctx: &Secp256k1<T>,
+               &self, _recipient: PublicKey, _peers: Vec<PublicKey>, _secp_ctx: &Secp256k1<T>,
        ) -> Result<Vec<BlindedPath>, ()> {
                unreachable!()
        }
@@ -220,6 +224,7 @@ struct MoneyLossDetector<'a> {
        height: usize,
        max_height: usize,
        blocks_connected: u32,
+       error_message: String,
 }
 impl<'a> MoneyLossDetector<'a> {
        pub fn new(peers: &'a RefCell<[bool; 256]>,
@@ -238,6 +243,7 @@ impl<'a> MoneyLossDetector<'a> {
                        height: 0,
                        max_height: 0,
                        blocks_connected: 0,
+                       error_message: "Channel force-closed".to_string(),
                }
        }
 
@@ -292,7 +298,7 @@ impl<'a> Drop for MoneyLossDetector<'a> {
                        }
 
                        // Force all channels onto the chain (and time out claim txn)
-                       self.manager.force_close_all_channels_broadcasting_latest_txn();
+                       self.manager.force_close_all_channels_broadcasting_latest_txn(self.error_message.to_string());
                }
        }
 }
@@ -444,6 +450,7 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
        let input = Arc::new(InputData {
                data: data.to_vec(),
                read_pos: AtomicUsize::new(0),
+               halt_fee_est_reads: AtomicBool::new(false),
        });
        let fee_est = Arc::new(FuzzEstimator {
                input: input.clone(),
@@ -701,10 +708,12 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
                        11 => {
                                let mut txn = broadcast.txn_broadcasted.lock().unwrap().split_off(0);
                                if !txn.is_empty() {
+                                       input.halt_fee_est_reads.store(true, Ordering::Release);
                                        loss_detector.connect_block(&txn[..]);
                                        for _ in 2..100 {
                                                loss_detector.connect_block(&[]);
                                        }
+                                       input.halt_fee_est_reads.store(false, Ordering::Release);
                                }
                                for tx in txn.drain(..) {
                                        loss_detector.funding_txn.push(tx);
@@ -735,9 +744,10 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
                        14 => {
                                let mut channels = channelmanager.list_channels();
                                let channel_id = get_slice!(1)[0] as usize;
+                               let error_message = "Channel force-closed";
                                if channel_id >= channels.len() { return; }
                                channels.sort_by(|a, b| { a.channel_id.cmp(&b.channel_id) });
-                               channelmanager.force_close_broadcasting_latest_txn(&channels[channel_id].channel_id, &channels[channel_id].counterparty.node_id).unwrap();
+                               channelmanager.force_close_broadcasting_latest_txn(&channels[channel_id].channel_id, &channels[channel_id].counterparty.node_id, error_message.to_string()).unwrap();
                        },
                        // 15, 16, 17, 18 is above
                        19 => {
@@ -860,7 +870,7 @@ mod tests {
                // our network key
                ext_from_hex("0100000000000000000000000000000000000000000000000000000000000000", &mut test);
                // config
-               ext_from_hex("0000000000900000000000000000640001000000000001ffff0000000000000000ffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff000000ffffffff00ffff1a000400010000020400000000040200000a08ffffffffffffffff0001000000", &mut test);
+               ext_from_hex("0000000000900000000000000000640001000000000001ffff0000000000000000ffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff000000ffffffff00ffff1a000400010000020400000000040200000a08ffffffffffffffff000100000000", &mut test);
 
                // new outbound connection with id 0
                ext_from_hex("00", &mut test);
@@ -911,19 +921,32 @@ mod tests {
                ext_from_hex("0c005e", &mut test);
                // the funding transaction
                ext_from_hex("020000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0150c3000000000000220020ae0000000000000000000000000000000000000000000000000000000000000000000000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                // connect a block with no transactions, one per line
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                // by now client should have sent a channel_ready (CHECK 3: SendChannelReady to 03000000 for chan 3d000000)
 
                // inbound read from peer id 0 of len 18
@@ -1293,21 +1316,28 @@ mod tests {
                ext_from_hex("0c007d", &mut test);
                // the commitment transaction for channel 3f00000000000000000000000000000000000000000000000000000000000000
                ext_from_hex("02000000013a000000000000000000000000000000000000000000000000000000000000000000000000000000800258020000000000002200204b0000000000000000000000000000000000000000000000000000000000000014c0000000000000160014280000000000000000000000000000000000000005000020", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                //
                // connect a block with one transaction of len 94
                ext_from_hex("0c005e", &mut test);
                // the HTLC timeout transaction
                ext_from_hex("0200000001730000000000000000000000000000000000000000000000000000000000000000000000000000000001a701000000000000220020b20000000000000000000000000000000000000000000000000000000000000000000000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                // connect a block with no transactions
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                // connect a block with no transactions
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                // connect a block with no transactions
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                // connect a block with no transactions
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
                // connect a block with no transactions
                ext_from_hex("0c0000", &mut test);
+               ext_from_hex("00fd00fd", &mut test); // Two feerate requests during block connection
 
                // process the now-pending HTLC forward
                ext_from_hex("07", &mut test);
@@ -1353,7 +1383,7 @@ mod tests {
                // our network key
                ext_from_hex("0100000000000000000000000000000000000000000000000000000000000000", &mut test);
                // config
-               ext_from_hex("0000000000900000000000000000640001000000000001ffff0000000000000000ffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff000000ffffffff00ffff1a000400010000020400000000040200000a08ffffffffffffffff0001000000", &mut test);
+               ext_from_hex("0000000000900000000000000000640001000000000001ffff0000000000000000ffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff000000ffffffff00ffff1a000400010000020400000000040200000a08ffffffffffffffff000100000000", &mut test);
 
                // new outbound connection with id 0
                ext_from_hex("00", &mut test);