Merge pull request #459 from ariard/2020-01-fix-htlc-height-timer
authorMatt Corallo <649246+TheBlueMatt@users.noreply.github.com>
Sat, 25 Jan 2020 22:11:27 +0000 (22:11 +0000)
committerGitHub <noreply@github.com>
Sat, 25 Jan 2020 22:11:27 +0000 (22:11 +0000)
Fix bumping timer for claiming revoked HTLC outputs

1  2 
lightning/src/ln/channelmonitor.rs
lightning/src/ln/functional_tests.rs

index 41c7eb89a069df737ce30006371df6c7c9838439,2f941cc095ce3a39d625a5aa6612fc436723c331..f32d2fbdb9d2b38cf225adfb313e9b4eb1a3ab5b
@@@ -31,8 -31,9 +31,8 @@@ use secp256k1
  
  use ln::msgs::DecodeError;
  use ln::chan_utils;
 -use ln::chan_utils::{HTLCOutputInCommitment, LocalCommitmentTransaction};
 +use ln::chan_utils::{HTLCOutputInCommitment, LocalCommitmentTransaction, HTLCType};
  use ln::channelmanager::{HTLCSource, PaymentPreimage, PaymentHash};
 -use ln::channel::{ACCEPTED_HTLC_SCRIPT_WEIGHT, OFFERED_HTLC_SCRIPT_WEIGHT};
  use chain::chaininterface::{ChainListener, ChainWatchInterface, BroadcasterInterface, FeeEstimator, ConfirmationTarget, MIN_RELAY_FEE_SAT_PER_1000_WEIGHT};
  use chain::transaction::OutPoint;
  use chain::keysinterface::SpendableOutputDescriptor;
@@@ -152,6 -153,7 +152,6 @@@ pub struct SimpleManyChannelMonitor<Key
  }
  
  impl<'a, Key : Send + cmp::Eq + hash::Hash> ChainListener for SimpleManyChannelMonitor<Key> {
 -
        fn block_connected(&self, header: &BlockHeader, height: u32, txn_matched: &[&Transaction], _indexes_of_txn_matched: &[u32]) {
                let block_hash = header.bitcoin_hash();
                let mut new_events: Vec<events::Event> = Vec::with_capacity(0);
  impl<Key : Send + cmp::Eq + hash::Hash + 'static> SimpleManyChannelMonitor<Key> {
        /// Creates a new object which can be used to monitor several channels given the chain
        /// interface with which to register to receive notifications.
 -      pub fn new(chain_monitor: Arc<ChainWatchInterface>, broadcaster: Arc<BroadcasterInterface>, logger: Arc<Logger>, feeest: Arc<FeeEstimator>) -> Arc<SimpleManyChannelMonitor<Key>> {
 -              let res = Arc::new(SimpleManyChannelMonitor {
 +      pub fn new(chain_monitor: Arc<ChainWatchInterface>, broadcaster: Arc<BroadcasterInterface>, logger: Arc<Logger>, feeest: Arc<FeeEstimator>) -> SimpleManyChannelMonitor<Key> {
 +              let res = SimpleManyChannelMonitor {
                        monitors: Mutex::new(HashMap::new()),
                        chain_monitor,
                        broadcaster,
                        pending_htlc_updated: Mutex::new(HashMap::new()),
                        logger,
                        fee_estimator: feeest,
 -              });
 +              };
  
                res
        }
@@@ -2057,7 -2059,7 +2057,7 @@@ impl ChannelMonitor 
                        assert!(predicted_weight >= spend_tx.get_weight());
                        let outpoint = BitcoinOutPoint { txid: spend_tx.txid(), vout: 0 };
                        let output = spend_tx.output[0].clone();
-                       let height_timer = Self::get_height_timer(height, self.their_to_self_delay.unwrap() as u32); // We can safely unwrap given we are past channel opening
+                       let height_timer = Self::get_height_timer(height, height + self.our_to_self_delay as u32);
                        log_trace!(self, "Outpoint {}:{} is being being claimed, if it doesn't succeed, a bumped claiming txn is going to be broadcast at height {}", spend_tx.input[0].previous_output.txid, spend_tx.input[0].previous_output.vout, height_timer);
                        let mut per_input_material = HashMap::with_capacity(1);
                        per_input_material.insert(spend_tx.input[0].previous_output, InputMaterial::Revoked { script: redeemscript, pubkey: None, key: revocation_key, is_htlc: false, amount: tx.output[0].value });
                                assert!(local_tx.tx.has_local_sig());
                                match self.key_storage {
                                        Storage::Local { ref delayed_payment_base_key, .. } => {
 -                                              append_onchain_update!(self.broadcast_by_local_state(local_tx, delayed_payment_base_key, height));
 +                                              let mut res = self.broadcast_by_local_state(local_tx, delayed_payment_base_key, height);
 +                                              append_onchain_update!(res);
                                        },
                                        Storage::Watchtower { .. } => { }
                                }
                                assert!(local_tx.tx.has_local_sig());
                                match self.key_storage {
                                        Storage::Local { ref delayed_payment_base_key, .. } => {
 -                                              append_onchain_update!(self.broadcast_by_local_state(local_tx, delayed_payment_base_key, height));
 +                                              let mut res = self.broadcast_by_local_state(local_tx, delayed_payment_base_key, height);
 +                                              append_onchain_update!(res);
                                        },
                                        Storage::Watchtower { .. } => { }
                                }
        }
  
        fn block_disconnected(&mut self, height: u32, block_hash: &Sha256dHash, broadcaster: &BroadcasterInterface, fee_estimator: &FeeEstimator) {
 +              log_trace!(self, "Block {} at height {} disconnected", block_hash, height);
                let mut bump_candidates = HashMap::new();
                if let Some(events) = self.onchain_events_waiting_threshold_conf.remove(&(height + ANTI_REORG_DELAY - 1)) {
                        //We may discard:
  
                'outer_loop: for input in &tx.input {
                        let mut payment_data = None;
 -                      let revocation_sig_claim = (input.witness.len() == 3 && input.witness[2].len() == OFFERED_HTLC_SCRIPT_WEIGHT && input.witness[1].len() == 33)
 -                              || (input.witness.len() == 3 && input.witness[2].len() == ACCEPTED_HTLC_SCRIPT_WEIGHT && input.witness[1].len() == 33);
 -                      let accepted_preimage_claim = input.witness.len() == 5 && input.witness[4].len() == ACCEPTED_HTLC_SCRIPT_WEIGHT;
 -                      let offered_preimage_claim = input.witness.len() == 3 && input.witness[2].len() == OFFERED_HTLC_SCRIPT_WEIGHT;
 +                      let revocation_sig_claim = (input.witness.len() == 3 && HTLCType::scriptlen_to_htlctype(input.witness[2].len()) == Some(HTLCType::OfferedHTLC) && input.witness[1].len() == 33)
 +                              || (input.witness.len() == 3 && HTLCType::scriptlen_to_htlctype(input.witness[2].len()) == Some(HTLCType::AcceptedHTLC) && input.witness[1].len() == 33);
 +                      let accepted_preimage_claim = input.witness.len() == 5 && HTLCType::scriptlen_to_htlctype(input.witness[4].len()) == Some(HTLCType::AcceptedHTLC);
 +                      let offered_preimage_claim = input.witness.len() == 3 && HTLCType::scriptlen_to_htlctype(input.witness[2].len()) == Some(HTLCType::OfferedHTLC);
  
                        macro_rules! log_claim {
                                ($tx_info: expr, $local_tx: expr, $htlc: expr, $source_avail: expr) => {
                for per_outp_material in cached_claim_datas.per_input_material.values() {
                        match per_outp_material {
                                &InputMaterial::Revoked { ref script, ref is_htlc, ref amount, .. } => {
 -                                      inputs_witnesses_weight += Self::get_witnesses_weight(if !is_htlc { &[InputDescriptors::RevokedOutput] } else if script.len() == OFFERED_HTLC_SCRIPT_WEIGHT { &[InputDescriptors::RevokedOfferedHTLC] } else if script.len() == ACCEPTED_HTLC_SCRIPT_WEIGHT { &[InputDescriptors::RevokedReceivedHTLC] } else { &[] });
 +                                      log_trace!(self, "Is HLTC ? {}", is_htlc);
 +                                      inputs_witnesses_weight += Self::get_witnesses_weight(if !is_htlc { &[InputDescriptors::RevokedOutput] } else if HTLCType::scriptlen_to_htlctype(script.len()) == Some(HTLCType::OfferedHTLC) { &[InputDescriptors::RevokedOfferedHTLC] } else if HTLCType::scriptlen_to_htlctype(script.len()) == Some(HTLCType::AcceptedHTLC) { &[InputDescriptors::RevokedReceivedHTLC] } else { unreachable!() });
                                        amt += *amount;
                                },
                                &InputMaterial::RemoteHTLC { ref preimage, ref amount, .. } => {
                                                bumped_tx.input[i].witness.push(vec!(1));
                                        }
                                        bumped_tx.input[i].witness.push(script.clone().into_bytes());
 -                                      log_trace!(self, "Going to broadcast bumped Penalty Transaction {} claiming revoked {} output {} from {} with new feerate {}", bumped_tx.txid(), if !is_htlc { "to_local" } else if script.len() == OFFERED_HTLC_SCRIPT_WEIGHT { "offered" } else if script.len() == ACCEPTED_HTLC_SCRIPT_WEIGHT { "received" } else { "" }, outp.vout, outp.txid, new_feerate);
 +                                      log_trace!(self, "Going to broadcast bumped Penalty Transaction {} claiming revoked {} output {} from {} with new feerate {}", bumped_tx.txid(), if !is_htlc { "to_local" } else if HTLCType::scriptlen_to_htlctype(script.len()) == Some(HTLCType::OfferedHTLC) { "offered" } else if HTLCType::scriptlen_to_htlctype(script.len()) == Some(HTLCType::AcceptedHTLC) { "received" } else { "" }, outp.vout, outp.txid, new_feerate);
                                },
                                &InputMaterial::RemoteHTLC { ref script, ref key, ref preimage, ref amount, ref locktime } => {
                                        if !preimage.is_some() { bumped_tx.lock_time = *locktime };
index 06621986495c14fed048c0d983972d7b7292f5a3,8b68bc9727714a193af573759b577192eaa1c988..3a800233e01d265e2fc00a5c5c5a28f155116826
@@@ -3,15 -3,15 +3,15 @@@
  //! claim outputs on-chain.
  
  use chain::transaction::OutPoint;
 -use chain::chaininterface::{ChainListener, ChainWatchInterfaceUtil};
  use chain::keysinterface::{KeysInterface, SpendableOutputDescriptor};
 +use chain::chaininterface::{ChainListener, ChainWatchInterfaceUtil, BlockNotifier};
  use ln::channel::{COMMITMENT_TX_BASE_WEIGHT, COMMITMENT_TX_WEIGHT_PER_HTLC};
  use ln::channelmanager::{ChannelManager,ChannelManagerReadArgs,HTLCForwardInfo,RAACommitmentOrder, PaymentPreimage, PaymentHash, BREAKDOWN_TIMEOUT};
  use ln::channelmonitor::{ChannelMonitor, CLTV_CLAIM_BUFFER, LATENCY_GRACE_PERIOD_BLOCKS, ManyChannelMonitor, ANTI_REORG_DELAY};
 -use ln::channel::{ACCEPTED_HTLC_SCRIPT_WEIGHT, OFFERED_HTLC_SCRIPT_WEIGHT, Channel, ChannelError};
 +use ln::channel::{Channel, ChannelError};
  use ln::onion_utils;
  use ln::router::{Route, RouteHop};
 -use ln::features::{ChannelFeatures, InitFeatures};
 +use ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
  use ln::msgs;
  use ln::msgs::{ChannelMessageHandler,RoutingMessageHandler,HTLCFailChannelUpdate, ErrorAction};
  use util::enforcing_trait_impls::EnforcingChannelKeys;
@@@ -53,9 -53,7 +53,9 @@@ use ln::functional_test_utils::*
  #[test]
  fn test_insane_channel_opens() {
        // Stand up a network of 2 nodes
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        // Instantiate channel parameters where we push the maximum msats given our
        // funding satoshis
  
  #[test]
  fn test_async_inbound_update_fee() {
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        let channel_id = chan.2;
  
  fn test_update_fee_unordered_raa() {
        // Just the intro to the previous test followed by an out-of-order RAA (which caused a
        // crash in an earlier version of the update_fee patch)
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        let channel_id = chan.2;
  
  
  #[test]
  fn test_multi_flight_update_fee() {
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        let channel_id = chan.2;
  
  
  #[test]
  fn test_update_fee_vanilla() {
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        let channel_id = chan.2;
  
  
  #[test]
  fn test_update_fee_that_funder_cannot_afford() {
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let channel_value = 1888;
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, channel_value, 700000, InitFeatures::supported(), InitFeatures::supported());
        let channel_id = chan.2;
  
  #[test]
  fn test_update_fee_with_fundee_update_add_htlc() {
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        let channel_id = chan.2;
  
  
  #[test]
  fn test_update_fee() {
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        let channel_id = chan.2;
  
  #[test]
  fn pre_funding_lock_shutdown_test() {
        // Test sending a shutdown prior to funding_locked after funding generation
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let tx = create_chan_between_nodes_with_value_init(&nodes[0], &nodes[1], 8000000, 0, InitFeatures::supported(), InitFeatures::supported());
        let header = BlockHeader { version: 0x20000000, prev_blockhash: Default::default(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
        nodes[0].block_notifier.block_connected(&Block { header, txdata: vec![tx.clone()]}, 1);
  #[test]
  fn updates_shutdown_wait() {
        // Test sending a shutdown with outstanding updates pending
 -      let mut nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::supported(), InitFeatures::supported());
        let route_1 = nodes[0].router.get_route(&nodes[1].node.get_our_node_id(), None, &[], 100000, TEST_FINAL_CLTV).unwrap();
  #[test]
  fn htlc_fail_async_shutdown() {
        // Test HTLCs fail if shutdown starts even if messages are delivered out-of-order
 -      let mut nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::supported(), InitFeatures::supported());
  
  fn do_test_shutdown_rebroadcast(recv_count: u8) {
        // Test that shutdown/closing_signed is re-sent on reconnect with a variable number of
        // messages delivered prior to disconnect
 -      let nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::supported(), InitFeatures::supported());
  
        nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
        nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
  
 -      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id());
 +      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        let node_0_reestablish = get_event_msg!(nodes[0], MessageSendEvent::SendChannelReestablish, nodes[1].node.get_our_node_id());
 -      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id());
 +      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        let node_1_reestablish = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
  
        nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &node_0_reestablish);
        nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
        nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
  
 -      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id());
 +      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        let node_0_2nd_reestablish = get_event_msg!(nodes[0], MessageSendEvent::SendChannelReestablish, nodes[1].node.get_our_node_id());
 -      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id());
 +      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        if recv_count == 0 {
                // If all closing_signeds weren't delivered we can just resume where we left off...
                let node_1_2nd_reestablish = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
@@@ -1016,9 -992,7 +1016,9 @@@ fn test_shutdown_rebroadcast() 
  fn fake_network_test() {
        // Simple test which builds a network of ChannelManagers, connects them to each other, and
        // tests that payments get routed and transactions broadcast in semi-reasonable ways.
 -      let nodes = create_network(4, &[None, None, None, None]);
 +      let node_cfgs = create_node_cfgs(4);
 +      let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
 +      let nodes = create_network(4, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        let mut hops = Vec::with_capacity(3);
        hops.push(RouteHop {
                pubkey: nodes[2].node.get_our_node_id(),
 +              node_features: NodeFeatures::empty(),
                short_channel_id: chan_2.0.contents.short_channel_id,
 +              channel_features: ChannelFeatures::empty(),
                fee_msat: 0,
                cltv_expiry_delta: chan_3.0.contents.cltv_expiry_delta as u32
        });
        hops.push(RouteHop {
                pubkey: nodes[3].node.get_our_node_id(),
 +              node_features: NodeFeatures::empty(),
                short_channel_id: chan_3.0.contents.short_channel_id,
 +              channel_features: ChannelFeatures::empty(),
                fee_msat: 0,
                cltv_expiry_delta: chan_4.1.contents.cltv_expiry_delta as u32
        });
        hops.push(RouteHop {
                pubkey: nodes[1].node.get_our_node_id(),
 +              node_features: NodeFeatures::empty(),
                short_channel_id: chan_4.0.contents.short_channel_id,
 +              channel_features: ChannelFeatures::empty(),
                fee_msat: 1000000,
                cltv_expiry_delta: TEST_FINAL_CLTV,
        });
        let mut hops = Vec::with_capacity(3);
        hops.push(RouteHop {
                pubkey: nodes[3].node.get_our_node_id(),
 +              node_features: NodeFeatures::empty(),
                short_channel_id: chan_4.0.contents.short_channel_id,
 +              channel_features: ChannelFeatures::empty(),
                fee_msat: 0,
                cltv_expiry_delta: chan_3.1.contents.cltv_expiry_delta as u32
        });
        hops.push(RouteHop {
                pubkey: nodes[2].node.get_our_node_id(),
 +              node_features: NodeFeatures::empty(),
                short_channel_id: chan_3.0.contents.short_channel_id,
 +              channel_features: ChannelFeatures::empty(),
                fee_msat: 0,
                cltv_expiry_delta: chan_2.1.contents.cltv_expiry_delta as u32
        });
        hops.push(RouteHop {
                pubkey: nodes[1].node.get_our_node_id(),
 +              node_features: NodeFeatures::empty(),
                short_channel_id: chan_2.0.contents.short_channel_id,
 +              channel_features: ChannelFeatures::empty(),
                fee_msat: 1000000,
                cltv_expiry_delta: TEST_FINAL_CLTV,
        });
@@@ -1147,9 -1109,7 +1147,9 @@@ fn holding_cell_htlc_counting() 
        // Tests that HTLCs in the holding cell count towards the pending HTLC limits on outbound HTLCs
        // to ensure we don't end up with HTLCs sitting around in our holding cell for several
        // commitment dance rounds.
 -      let mut nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::supported(), InitFeatures::supported());
  
  fn duplicate_htlc_test() {
        // Test that we accept duplicate payment_hash HTLCs across the network and that
        // claiming/failing them are all separate and don't affect each other
 -      let mut nodes = create_network(6, &[None, None, None, None, None, None]);
 +      let node_cfgs = create_node_cfgs(6);
 +      let node_chanmgrs = create_node_chanmgrs(6, &node_cfgs, &[None, None, None, None, None, None]);
 +      let mut nodes = create_network(6, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels to route via 3 to 4/5 from 0/1/2
        create_announced_chan_between_nodes(&nodes, 0, 3, InitFeatures::supported(), InitFeatures::supported());
@@@ -1305,9 -1263,7 +1305,9 @@@ fn test_duplicate_htlc_different_direct
        // Test that ChannelMonitor doesn't generate 2 preimage txn
        // when we have 2 HTLCs with same preimage that go across a node
        // in opposite directions.
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
  
  fn do_channel_reserve_test(test_recv: bool) {
  
 -      let mut nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
        let chan_1 = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1900, 1001, InitFeatures::supported(), InitFeatures::supported());
        let chan_2 = create_announced_chan_between_nodes_with_value(&nodes, 1, 2, 1900, 1001, InitFeatures::supported(), InitFeatures::supported());
  
@@@ -1660,9 -1614,7 +1660,9 @@@ fn channel_reserve_in_flight_removes() 
        //    removed it fully. B now has the push_msat plus the first two HTLCs in value.
        //  * Now B happily sends another HTLC, potentially violating its reserve value from A's point
        //    of view (if A counts the AwaitingRemovedRemoteRevoke HTLC).
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        let b_chan_values = get_channel_value_stat!(nodes[1], chan_1.2);
  fn channel_monitor_network_test() {
        // Simple test which builds a network of ChannelManagers, connects them to each other, and
        // tests that ChannelMonitor is able to recover from various states.
 -      let nodes = create_network(5, &[None, None, None, None, None]);
 +      let node_cfgs = create_node_cfgs(5);
 +      let node_chanmgrs = create_node_chanmgrs(5, &node_cfgs, &[None, None, None, None, None]);
 +      let nodes = create_network(5, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
@@@ -1938,10 -1888,8 +1938,10 @@@ fn test_justice_tx() 
        bob_config.channel_options.announced_channel = true;
        bob_config.peer_channel_config_limits.force_announced_channel_preference = false;
        bob_config.own_channel_config.our_to_self_delay = 6 * 24 * 3;
 -      let cfgs = [Some(alice_config), Some(bob_config)];
 -      let nodes = create_network(2, &cfgs);
 +      let user_cfgs = [Some(alice_config), Some(bob_config)];
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &user_cfgs);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        // Create some new channels:
        let chan_5 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
  fn revoked_output_claim() {
        // Simple test to ensure a node will claim a revoked output when a stale remote commitment
        // transaction is broadcast by its counterparty
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        // node[0] is gonna to revoke an old state thus node[1] should be able to claim the revoked output
        let revoked_local_txn = nodes[0].node.channel_state.lock().unwrap().by_id.get_mut(&chan_1.2).unwrap().channel_monitor().get_latest_local_commitment_txn();
  #[test]
  fn claim_htlc_outputs_shared_tx() {
        // Node revoked old state, htlcs haven't time out yet, claim them in shared justice tx
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        // Create some new channel:
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  #[test]
  fn claim_htlc_outputs_single_tx() {
        // Node revoked old state, htlcs have timed out, claim each of them in separated justice tx
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
@@@ -2240,9 -2182,7 +2240,9 @@@ fn test_htlc_on_chain_success() 
        // the HTLC outputs via the preimage it learned (which, once confirmed should generate a
        // PaymentSent event).
  
 -      let nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
@@@ -2407,9 -2347,7 +2407,9 @@@ fn test_htlc_on_chain_timeout() 
        //            \                                  \
        //         B's HTLC timeout tx               B's timeout tx
  
 -      let nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
  
        // Create some intial channels
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
@@@ -2517,9 -2455,7 +2517,9 @@@ fn test_simple_commitment_revoked_fail_
        // Test that in case of a revoked commitment tx, we detect the resolution of output by justice tx
        // and fail backward accordingly.
  
 -      let nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
@@@ -2587,9 -2523,7 +2587,9 @@@ fn do_test_commitment_revoked_fail_back
        // * Once they remove it, we will send a (the first) commitment_signed without the HTLC,
        //   and once they revoke the previous commitment transaction (allowing us to send a new
        //   commitment_signed) we will be free to fail/fulfill the HTLC backwards.
 -      let mut nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
@@@ -2800,9 -2734,7 +2800,9 @@@ fn test_commitment_revoked_fail_backwar
  fn test_htlc_ignore_latest_remote_commitment() {
        // Test that HTLC transactions spending the latest remote commitment transaction are simply
        // ignored if we cannot claim them. This originally tickled an invalid unwrap().
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        route_payment(&nodes[0], &[&nodes[1]], 10000000);
  #[test]
  fn test_force_close_fail_back() {
        // Check which HTLCs are failed-backwards on channel force-closure
 -      let mut nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::supported(), InitFeatures::supported());
  
  #[test]
  fn test_unconf_chan() {
        // After creating a chan between nodes, we disconnect all blocks previously seen to force a channel close on nodes[0] side
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        let channel_state = nodes[0].node.channel_state.lock().unwrap();
  #[test]
  fn test_simple_peer_disconnect() {
        // Test that we can reconnect when there are no lost messages
 -      let nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::supported(), InitFeatures::supported());
  
  
  fn do_test_drop_messages_peer_disconnect(messages_delivered: u8) {
        // Test that we can reconnect when in-flight HTLC updates get dropped
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        if messages_delivered == 0 {
                create_chan_between_nodes_with_value_a(&nodes[0], &nodes[1], 100000, 10001, InitFeatures::supported(), InitFeatures::supported());
                // nodes[1] doesn't receive the funding_locked message (it'll be re-sent on reconnect)
@@@ -3194,9 -3118,7 +3194,9 @@@ fn test_drop_messages_peer_disconnect_b
  #[test]
  fn test_funding_peer_disconnect() {
        // Test that we can lock in our funding tx while disconnected
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let tx = create_chan_between_nodes_with_value_init(&nodes[0], &nodes[1], 100000, 10001, InitFeatures::supported(), InitFeatures::supported());
  
        nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
  fn test_drop_messages_peer_disconnect_dual_htlc() {
        // Test that we can handle reconnecting when both sides of a channel have pending
        // commitment_updates when we disconnect.
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        let (payment_preimage_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
        nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
        nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
  
 -      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id());
 +      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
        assert_eq!(reestablish_1.len(), 1);
 -      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id());
 +      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
        assert_eq!(reestablish_2.len(), 1);
  
  fn test_invalid_channel_announcement() {
        //Test BOLT 7 channel_announcement msg requirement for final node, gather data to build customed channel_announcement msgs
        let secp_ctx = Secp256k1::new();
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let chan_announcement = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::supported(), InitFeatures::supported());
  
  
  #[test]
  fn test_no_txn_manager_serialize_deserialize() {
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let new_chan_monitor: test_utils::TestChannelMonitor;
 +      let nodes_0_deserialized: ChannelManager<EnforcingChannelKeys, &test_utils::TestChannelMonitor>;
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let tx = create_chan_between_nodes_with_value_init(&nodes[0], &nodes[1], 100000, 10001, InitFeatures::supported(), InitFeatures::supported());
  
        let mut chan_0_monitor_serialized = test_utils::TestVecWriter(Vec::new());
        nodes[0].chan_monitor.simple_monitor.monitors.lock().unwrap().iter().next().unwrap().1.write_for_disk(&mut chan_0_monitor_serialized).unwrap();
  
 -      nodes[0].chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone(), Arc::new(test_utils::TestLogger::new()), Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 })));
 +      new_chan_monitor = test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone(), Arc::new(test_utils::TestLogger::new()), Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }));
 +      nodes[0].chan_monitor = &new_chan_monitor;
        let mut chan_0_monitor_read = &chan_0_monitor_serialized.0[..];
        let (_, mut chan_0_monitor) = <(Sha256dHash, ChannelMonitor)>::read(&mut chan_0_monitor_read, Arc::new(test_utils::TestLogger::new())).unwrap();
        assert!(chan_0_monitor_read.is_empty());
        let mut nodes_0_read = &nodes_0_serialized[..];
        let config = UserConfig::default();
        let keys_manager = Arc::new(test_utils::TestKeysInterface::new(&nodes[0].node_seed, Network::Testnet, Arc::new(test_utils::TestLogger::new())));
 -      let (_, nodes_0_deserialized) = {
 +      let (_, nodes_0_deserialized_tmp) = {
                let mut channel_monitors = HashMap::new();
                channel_monitors.insert(chan_0_monitor.get_funding_txo().unwrap(), &mut chan_0_monitor);
 -              <(Sha256dHash, ChannelManager<EnforcingChannelKeys>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
 +              <(Sha256dHash, ChannelManager<EnforcingChannelKeys, &test_utils::TestChannelMonitor>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
                        default_config: config,
                        keys_manager,
                        fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }),
 -                      monitor: nodes[0].chan_monitor.clone(),
 +                      monitor: nodes[0].chan_monitor,
                        tx_broadcaster: nodes[0].tx_broadcaster.clone(),
                        logger: Arc::new(test_utils::TestLogger::new()),
                        channel_monitors: &mut channel_monitors,
                }).unwrap()
        };
 +      nodes_0_deserialized = nodes_0_deserialized_tmp;
        assert!(nodes_0_read.is_empty());
  
        assert!(nodes[0].chan_monitor.add_update_monitor(chan_0_monitor.get_funding_txo().unwrap(), chan_0_monitor).is_ok());
 -      nodes[0].node = Arc::new(nodes_0_deserialized);
 -      let nodes_0_as_listener: Arc<ChainListener> = nodes[0].node.clone();
 -      nodes[0].block_notifier.register_listener(Arc::downgrade(&nodes_0_as_listener));
 +      nodes[0].node = &nodes_0_deserialized;
 +      nodes[0].block_notifier.register_listener(nodes[0].node);
        assert_eq!(nodes[0].node.list_channels().len(), 1);
        check_added_monitors!(nodes[0], 1);
  
 -      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id());
 +      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
 -      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id());
 +      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
  
        nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &reestablish_1[0]);
  
  #[test]
  fn test_simple_manager_serialize_deserialize() {
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let new_chan_monitor: test_utils::TestChannelMonitor;
 +      let nodes_0_deserialized: ChannelManager<EnforcingChannelKeys, &test_utils::TestChannelMonitor>;
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        let (our_payment_preimage, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
        let mut chan_0_monitor_serialized = test_utils::TestVecWriter(Vec::new());
        nodes[0].chan_monitor.simple_monitor.monitors.lock().unwrap().iter().next().unwrap().1.write_for_disk(&mut chan_0_monitor_serialized).unwrap();
  
 -      nodes[0].chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone(), Arc::new(test_utils::TestLogger::new()), Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 })));
 +      new_chan_monitor = test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone(), Arc::new(test_utils::TestLogger::new()), Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }));
 +      nodes[0].chan_monitor = &new_chan_monitor;
        let mut chan_0_monitor_read = &chan_0_monitor_serialized.0[..];
        let (_, mut chan_0_monitor) = <(Sha256dHash, ChannelMonitor)>::read(&mut chan_0_monitor_read, Arc::new(test_utils::TestLogger::new())).unwrap();
        assert!(chan_0_monitor_read.is_empty());
  
        let mut nodes_0_read = &nodes_0_serialized[..];
        let keys_manager = Arc::new(test_utils::TestKeysInterface::new(&nodes[0].node_seed, Network::Testnet, Arc::new(test_utils::TestLogger::new())));
 -      let (_, nodes_0_deserialized) = {
 +      let (_, nodes_0_deserialized_tmp) = {
                let mut channel_monitors = HashMap::new();
                channel_monitors.insert(chan_0_monitor.get_funding_txo().unwrap(), &mut chan_0_monitor);
 -              <(Sha256dHash, ChannelManager<EnforcingChannelKeys>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
 +              <(Sha256dHash, ChannelManager<EnforcingChannelKeys, &test_utils::TestChannelMonitor>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
                        default_config: UserConfig::default(),
                        keys_manager,
                        fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }),
 -                      monitor: nodes[0].chan_monitor.clone(),
 +                      monitor: nodes[0].chan_monitor,
                        tx_broadcaster: nodes[0].tx_broadcaster.clone(),
                        logger: Arc::new(test_utils::TestLogger::new()),
                        channel_monitors: &mut channel_monitors,
                }).unwrap()
        };
 +      nodes_0_deserialized = nodes_0_deserialized_tmp;
        assert!(nodes_0_read.is_empty());
  
        assert!(nodes[0].chan_monitor.add_update_monitor(chan_0_monitor.get_funding_txo().unwrap(), chan_0_monitor).is_ok());
 -      nodes[0].node = Arc::new(nodes_0_deserialized);
 +      nodes[0].node = &nodes_0_deserialized;
        check_added_monitors!(nodes[0], 1);
  
        reconnect_nodes(&nodes[0], &nodes[1], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
  #[test]
  fn test_manager_serialize_deserialize_inconsistent_monitor() {
        // Test deserializing a ChannelManager with an out-of-date ChannelMonitor
 -      let mut nodes = create_network(4, &[None, None, None, None]);
 +      let node_cfgs = create_node_cfgs(4);
 +      let node_chanmgrs = create_node_chanmgrs(4, &node_cfgs, &[None, None, None, None]);
 +      let new_chan_monitor: test_utils::TestChannelMonitor;
 +      let nodes_0_deserialized: ChannelManager<EnforcingChannelKeys, &test_utils::TestChannelMonitor>;
 +      let mut nodes = create_network(4, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        create_announced_chan_between_nodes(&nodes, 2, 0, InitFeatures::supported(), InitFeatures::supported());
        let (_, _, channel_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 3, InitFeatures::supported(), InitFeatures::supported());
                node_0_monitors_serialized.push(writer.0);
        }
  
 -      nodes[0].chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone(), Arc::new(test_utils::TestLogger::new()), Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 })));
 +      new_chan_monitor = test_utils::TestChannelMonitor::new(nodes[0].chain_monitor.clone(), nodes[0].tx_broadcaster.clone(), Arc::new(test_utils::TestLogger::new()), Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }));
 +      nodes[0].chan_monitor = &new_chan_monitor;
        let mut node_0_monitors = Vec::new();
        for serialized in node_0_monitors_serialized.iter() {
                let mut read = &serialized[..];
  
        let mut nodes_0_read = &nodes_0_serialized[..];
        let keys_manager = Arc::new(test_utils::TestKeysInterface::new(&nodes[0].node_seed, Network::Testnet, Arc::new(test_utils::TestLogger::new())));
 -      let (_, nodes_0_deserialized) = <(Sha256dHash, ChannelManager<EnforcingChannelKeys>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
 +      let (_, nodes_0_deserialized_tmp) = <(Sha256dHash, ChannelManager<EnforcingChannelKeys, &test_utils::TestChannelMonitor>)>::read(&mut nodes_0_read, ChannelManagerReadArgs {
                default_config: UserConfig::default(),
                keys_manager,
                fee_estimator: Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 }),
 -              monitor: nodes[0].chan_monitor.clone(),
 +              monitor: nodes[0].chan_monitor,
                tx_broadcaster: nodes[0].tx_broadcaster.clone(),
                logger: Arc::new(test_utils::TestLogger::new()),
                channel_monitors: &mut node_0_monitors.iter_mut().map(|monitor| { (monitor.get_funding_txo().unwrap(), monitor) }).collect(),
        }).unwrap();
 +      nodes_0_deserialized = nodes_0_deserialized_tmp;
        assert!(nodes_0_read.is_empty());
  
        { // Channel close should result in a commitment tx and an HTLC tx
                assert!(nodes[0].chan_monitor.add_update_monitor(monitor.get_funding_txo().unwrap(), monitor).is_ok());
                check_added_monitors!(nodes[0], 1);
        }
 -      nodes[0].node = Arc::new(nodes_0_deserialized);
 +      nodes[0].node = &nodes_0_deserialized;
  
        // nodes[1] and nodes[2] have no lost state with nodes[0]...
        reconnect_nodes(&nodes[0], &nodes[1], (false, false), (0, 0), (0, 0), (0, 0), (0, 0), (false, false));
        //... and we can even still claim the payment!
        claim_payment(&nodes[2], &[&nodes[0], &nodes[1]], our_payment_preimage, 1_000_000);
  
 -      nodes[3].node.peer_connected(&nodes[0].node.get_our_node_id());
 +      nodes[3].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        let reestablish = get_event_msg!(nodes[3], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
 -      nodes[0].node.peer_connected(&nodes[3].node.get_our_node_id());
 +      nodes[0].node.peer_connected(&nodes[3].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        nodes[0].node.handle_channel_reestablish(&nodes[3].node.get_our_node_id(), &reestablish);
        let msg_events = nodes[0].node.get_and_clear_pending_msg_events();
        assert_eq!(msg_events.len(), 1);
@@@ -3816,9 -3717,7 +3816,9 @@@ macro_rules! check_spendable_outputs 
  #[test]
  fn test_claim_sizeable_push_msat() {
        // Incidentally test SpendableOutput event generation due to detection of to_local output on commitment tx
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 99000000, InitFeatures::supported(), InitFeatures::supported());
        nodes[1].node.force_close_channel(&chan.2);
  fn test_claim_on_remote_sizeable_push_msat() {
        // Same test as previous, just test on remote commitment tx, as per_commitment_point registration changes following you're funder/fundee and
        // to_remote output is encumbered by a P2WPKH
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 99000000, InitFeatures::supported(), InitFeatures::supported());
        nodes[0].node.force_close_channel(&chan.2);
@@@ -3866,9 -3763,7 +3866,9 @@@ fn test_claim_on_remote_revoked_sizeabl
        // Same test as previous, just test on remote revoked commitment tx, as per_commitment_point registration changes following you're funder/fundee and
        // to_remote output is encumbered by a P2WPKH
  
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 59000000, InitFeatures::supported(), InitFeatures::supported());
        let payment_preimage = route_payment(&nodes[0], &vec!(&nodes[1])[..], 3000000).0;
  
  #[test]
  fn test_static_spendable_outputs_preimage_tx() {
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
@@@ -3938,9 -3831,7 +3938,9 @@@ eprintln!("{:?}", node_txn[1])
  
  #[test]
  fn test_static_spendable_outputs_justice_tx_revoked_commitment_tx() {
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
  #[test]
  fn test_static_spendable_outputs_justice_tx_revoked_htlc_timeout_tx() {
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
  #[test]
  fn test_static_spendable_outputs_justice_tx_revoked_htlc_success_tx() {
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
@@@ -4071,9 -3958,7 +4071,9 @@@ fn test_onchain_to_onchain_claim() 
        // Finally, check that B will claim the HTLC output if A's latest commitment transaction
        // gets broadcast.
  
 -      let nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  fn test_duplicate_payment_hash_one_failure_one_success() {
        // Topology : A --> B --> C
        // We route 2 payments with same hash between B and C, one will be timeout, the other successfully claim
 -      let mut nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
  
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::supported(), InitFeatures::supported());
  
  #[test]
  fn test_dynamic_spendable_outputs_local_htlc_success_tx() {
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
@@@ -4332,9 -4213,7 +4332,9 @@@ fn do_test_fail_backwards_unrevoked_rem
        //    - C - D -
        // B /         \ F
        // And test where C fails back to A/B when D announces its latest commitment transaction
 -      let nodes = create_network(6, &[None, None, None, None, None, None]);
 +      let node_cfgs = create_node_cfgs(6);
 +      let node_chanmgrs = create_node_chanmgrs(6, &node_cfgs, &[None, None, None, None, None, None]);
 +      let nodes = create_network(6, &node_cfgs, &node_chanmgrs);
  
        create_announced_chan_between_nodes(&nodes, 0, 2, InitFeatures::supported(), InitFeatures::supported());
        create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::supported(), InitFeatures::supported());
@@@ -4573,9 -4452,7 +4573,9 @@@ fn test_fail_backwards_previous_remote_
  
  #[test]
  fn test_dynamic_spendable_outputs_local_htlc_timeout_tx() {
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels
        let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
  #[test]
  fn test_static_output_closing_tx() {
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
  }
  
  fn do_htlc_claim_local_commitment_only(use_dust: bool) {
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        let (our_payment_preimage, _) = route_payment(&nodes[0], &[&nodes[1]], if use_dust { 50000 } else { 3000000 });
  }
  
  fn do_htlc_claim_current_remote_commitment_only(use_dust: bool) {
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        let route = nodes[0].router.get_route(&nodes[1].node.get_our_node_id(), None, &Vec::new(), if use_dust { 50000 } else { 3000000 }, TEST_FINAL_CLTV).unwrap();
  }
  
  fn do_htlc_claim_previous_remote_commitment_only(use_dust: bool, check_revoke_no_close: bool) {
 -      let nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        // Fail the payment, but don't deliver A's final RAA, resulting in the HTLC only being present
@@@ -4983,9 -4852,7 +4983,9 @@@ fn test_onion_failure() 
        const NODE: u16 = 0x2000;
        const UPDATE: u16 = 0x1000;
  
 -      let mut nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
        for node in nodes.iter() {
                *node.keys_manager.override_session_priv.lock().unwrap() = Some(SecretKey::from_slice(&[3; 32]).unwrap());
        }
  #[test]
  #[should_panic]
  fn bolt2_open_channel_sending_node_checks_part1() { //This test needs to be on its own as we are catching a panic
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        //Force duplicate channel ids
        for node in nodes.iter() {
                *node.keys_manager.override_channel_id_priv.lock().unwrap() = Some([0; 32]);
  
  #[test]
  fn bolt2_open_channel_sending_node_checks_part2() {
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        // BOLT #2 spec: Sending node must set funding_satoshis to less than 2^24 satoshis
        let channel_value_satoshis=2^24;
  fn test_update_add_htlc_bolt2_sender_value_below_minimum_msat() {
        //BOLT2 Requirement: MUST offer amount_msat greater than 0.
        //BOLT2 Requirement: MUST NOT offer amount_msat below the receiving node's htlc_minimum_msat (same validation check catches both of these)
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let _chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 95000000, InitFeatures::supported(), InitFeatures::supported());
        let mut route = nodes[0].router.get_route(&nodes[1].node.get_our_node_id(), None, &[], 100000, TEST_FINAL_CLTV).unwrap();
        let (_, our_payment_hash) = get_payment_preimage_hash!(nodes[0]);
  fn test_update_add_htlc_bolt2_sender_cltv_expiry_too_high() {
        //BOLT 2 Requirement: MUST set cltv_expiry less than 500000000.
        //It is enforced when constructing a route.
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let _chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 0, InitFeatures::supported(), InitFeatures::supported());
        let route = nodes[0].router.get_route(&nodes[1].node.get_our_node_id(), None, &[], 100000000, 500000001).unwrap();
        let (_, our_payment_hash) = get_payment_preimage_hash!(nodes[0]);
@@@ -5315,9 -5174,7 +5315,9 @@@ fn test_update_add_htlc_bolt2_sender_ex
        //BOLT 2 Requirement: if result would be offering more than the remote's max_accepted_htlcs HTLCs, in the remote commitment transaction: MUST NOT add an HTLC.
        //BOLT 2 Requirement: for the first HTLC it offers MUST set id to 0.
        //BOLT 2 Requirement: MUST increase the value of id by 1 for each successive offer.
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 0, InitFeatures::supported(), InitFeatures::supported());
        let max_accepted_htlcs = nodes[1].node.channel_state.lock().unwrap().by_id.get(&chan.2).unwrap().their_max_accepted_htlcs as u64;
  
  #[test]
  fn test_update_add_htlc_bolt2_sender_exceed_max_htlc_value_in_flight() {
        //BOLT 2 Requirement: if the sum of total offered HTLCs would exceed the remote's max_htlc_value_in_flight_msat: MUST NOT add an HTLC.
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let channel_value = 100000;
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, channel_value, 0, InitFeatures::supported(), InitFeatures::supported());
        let max_in_flight = get_channel_value_stat!(nodes[0], chan.2).their_max_htlc_value_in_flight_msat;
  #[test]
  fn test_update_add_htlc_bolt2_receiver_check_amount_received_more_than_min() {
        //BOLT2 Requirement: receiving an amount_msat equal to 0, OR less than its own htlc_minimum_msat -> SHOULD fail the channel.
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 95000000, InitFeatures::supported(), InitFeatures::supported());
        let htlc_minimum_msat: u64;
        {
  #[test]
  fn test_update_add_htlc_bolt2_receiver_sender_can_afford_amount_sent() {
        //BOLT2 Requirement: receiving an amount_msat that the sending node cannot afford at the current feerate_per_kw (while maintaining its channel reserve): SHOULD fail the channel
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 95000000, InitFeatures::supported(), InitFeatures::supported());
  
        let their_channel_reserve = get_channel_value_stat!(nodes[0], chan.2).channel_reserve_msat;
  fn test_update_add_htlc_bolt2_receiver_check_max_htlc_limit() {
        //BOLT 2 Requirement: if a sending node adds more than its max_accepted_htlcs HTLCs to its local commitment transaction: SHOULD fail the channel
        //BOLT 2 Requirement: MUST allow multiple HTLCs with the same payment_hash.
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 95000000, InitFeatures::supported(), InitFeatures::supported());
        let route = nodes[0].router.get_route(&nodes[1].node.get_our_node_id(), None, &[], 3999999, TEST_FINAL_CLTV).unwrap();
        let (_, our_payment_hash) = get_payment_preimage_hash!(nodes[0]);
  #[test]
  fn test_update_add_htlc_bolt2_receiver_check_max_in_flight_msat() {
        //OR adds more than its max_htlc_value_in_flight_msat worth of offered HTLCs to its local commitment transaction: SHOULD fail the channel
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 1000000, InitFeatures::supported(), InitFeatures::supported());
        let route = nodes[0].router.get_route(&nodes[1].node.get_our_node_id(), None, &[], 1000000, TEST_FINAL_CLTV).unwrap();
        let (_, our_payment_hash) = get_payment_preimage_hash!(nodes[0]);
  #[test]
  fn test_update_add_htlc_bolt2_receiver_check_cltv_expiry() {
        //BOLT2 Requirement: if sending node sets cltv_expiry to greater or equal to 500000000: SHOULD fail the channel.
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 95000000, InitFeatures::supported(), InitFeatures::supported());
        let route = nodes[0].router.get_route(&nodes[1].node.get_our_node_id(), None, &[], 3999999, TEST_FINAL_CLTV).unwrap();
        let (_, our_payment_hash) = get_payment_preimage_hash!(nodes[0]);
@@@ -5523,9 -5368,7 +5523,9 @@@ fn test_update_add_htlc_bolt2_receiver_
        //BOLT 2 requirement: if the sender did not previously acknowledge the commitment of that HTLC: MUST ignore a repeated id value after a reconnection.
        // We test this by first testing that that repeated HTLCs pass commitment signature checks
        // after disconnect and that non-sequential htlc_ids result in a channel failure.
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
        let route = nodes[0].router.get_route(&nodes[1].node.get_our_node_id(), None, &[], 1000000, TEST_FINAL_CLTV).unwrap();
        let (_, our_payment_hash) = get_payment_preimage_hash!(nodes[0]);
        //Disconnect and Reconnect
        nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
        nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
 -      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id());
 +      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
        assert_eq!(reestablish_1.len(), 1);
 -      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id());
 +      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
        assert_eq!(reestablish_2.len(), 1);
        nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &reestablish_2[0]);
  fn test_update_fulfill_htlc_bolt2_update_fulfill_htlc_before_commitment() {
        //BOLT 2 Requirement: until the corresponding HTLC is irrevocably committed in both sides' commitment transactions:     MUST NOT send an update_fulfill_htlc, update_fail_htlc, or update_fail_malformed_htlc.
  
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        let route = nodes[0].router.get_route(&nodes[1].node.get_our_node_id(), None, &[], 1000000, TEST_FINAL_CLTV).unwrap();
  fn test_update_fulfill_htlc_bolt2_update_fail_htlc_before_commitment() {
        //BOLT 2 Requirement: until the corresponding HTLC is irrevocably committed in both sides' commitment transactions:     MUST NOT send an update_fulfill_htlc, update_fail_htlc, or update_fail_malformed_htlc.
  
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        let route = nodes[0].router.get_route(&nodes[1].node.get_our_node_id(), None, &[], 1000000, TEST_FINAL_CLTV).unwrap();
  fn test_update_fulfill_htlc_bolt2_update_fail_malformed_htlc_before_commitment() {
        //BOLT 2 Requirement: until the corresponding HTLC is irrevocably committed in both sides' commitment transactions:     MUST NOT send an update_fulfill_htlc, update_fail_htlc, or update_fail_malformed_htlc.
  
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        let route = nodes[0].router.get_route(&nodes[1].node.get_our_node_id(), None, &[], 1000000, TEST_FINAL_CLTV).unwrap();
  fn test_update_fulfill_htlc_bolt2_incorrect_htlc_id() {
        //BOLT 2 Requirement: A receiving node: if the id does not correspond to an HTLC in its current commitment transaction MUST fail the channel.
  
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        let our_payment_preimage = route_payment(&nodes[0], &[&nodes[1]], 100000).0;
  fn test_update_fulfill_htlc_bolt2_wrong_preimage() {
        //BOLT 2 Requirement: A receiving node: if the payment_preimage value in update_fulfill_htlc doesn't SHA256 hash to the corresponding HTLC payment_hash MUST fail the channel.
  
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        let our_payment_preimage = route_payment(&nodes[0], &[&nodes[1]], 100000).0;
  fn test_update_fulfill_htlc_bolt2_missing_badonion_bit_for_malformed_htlc_message() {
        //BOLT 2 Requirement: A receiving node: if the BADONION bit in failure_code is not set for update_fail_malformed_htlc MUST fail the channel.
  
 -      let mut nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 1000000, InitFeatures::supported(), InitFeatures::supported());
        let route = nodes[0].router.get_route(&nodes[1].node.get_our_node_id(), None, &[], 1000000, TEST_FINAL_CLTV).unwrap();
        let (_, our_payment_hash) = get_payment_preimage_hash!(nodes[0]);
@@@ -5777,9 -5608,7 +5777,9 @@@ fn test_update_fulfill_htlc_bolt2_after
        //BOLT 2 Requirement: a receiving node which has an outgoing HTLC canceled by update_fail_malformed_htlc:
        //    * MUST return an error in the update_fail_htlc sent to the link which originally sent the HTLC, using the failure_code given and setting the data to sha256_of_onion.
  
 -      let mut nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
        create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 1000000, InitFeatures::supported(), InitFeatures::supported());
        create_announced_chan_between_nodes_with_value(&nodes, 1, 2, 1000000, 1000000, InitFeatures::supported(), InitFeatures::supported());
  
@@@ -5854,9 -5683,7 +5854,9 @@@ fn do_test_failure_delay_dust_htlc_loca
        // We can have at most two valid local commitment tx, so both cases must be covered, and both txs must be checked to get them all as
        // HTLC could have been removed from lastest local commitment tx but still valid until we get remote RAA
  
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan =create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        let bs_dust_limit = nodes[1].node.channel_state.lock().unwrap().by_id.get(&chan.2).unwrap().our_dust_limit_satoshis;
@@@ -5946,9 -5773,7 +5946,9 @@@ fn test_no_failure_dust_htlc_local_comm
        // Transaction filters for failing back dust htlc based on local commitment txn infos has been
        // prone to error, we test here that a dummy transaction don't fail them.
  
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        // Rebalance a bit
@@@ -6002,9 -5827,7 +6002,9 @@@ fn do_test_sweep_outbound_htlc_failure_
        // Broadcast of local commitment tx, trigger failure-update of dust-HTLCs
        // Broadcast of HTLC-timeout tx on local commitment tx, trigger failure-update of non-dust HTLCs
  
 -      let nodes = create_network(3, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
 +      let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
        let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
  
        let bs_dust_limit = nodes[1].node.channel_state.lock().unwrap().by_id.get(&chan.2).unwrap().our_dust_limit_satoshis;
@@@ -6134,10 -5957,8 +6134,10 @@@ fn test_upfront_shutdown_script() 
        config.channel_options.announced_channel = true;
        config.peer_channel_config_limits.force_announced_channel_preference = false;
        config.channel_options.commit_upfront_shutdown_pubkey = false;
 -      let cfgs = [None, Some(config), None];
 -      let nodes = create_network(3, &cfgs);
 +      let user_cfgs = [None, Some(config), None];
 +      let node_cfgs = create_node_cfgs(3);
 +      let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &user_cfgs);
 +      let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
  
        // We test that in case of peer committing upfront to a script, if it changes at closing, we refuse to sign
        let flags = InitFeatures::supported();
@@@ -6231,10 -6052,8 +6231,10 @@@ fn test_user_configurable_csv_delay() 
        low_our_to_self_config.own_channel_config.our_to_self_delay = 6;
        let mut high_their_to_self_config = UserConfig::default();
        high_their_to_self_config.peer_channel_config_limits.their_to_self_delay = 100;
 -      let cfgs = [Some(high_their_to_self_config.clone()), None];
 -      let nodes = create_network(2, &cfgs);
 +      let user_cfgs = [Some(high_their_to_self_config.clone()), None];
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &user_cfgs);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        // We test config.our_to_self > BREAKDOWN_TIMEOUT is enforced in Channel::new_outbound()
        let keys_manager: Arc<KeysInterface<ChanKeySigner = EnforcingChannelKeys>> = Arc::new(test_utils::TestKeysInterface::new(&nodes[0].node_seed, Network::Testnet, Arc::new(test_utils::TestLogger::new())));
@@@ -6289,11 -6108,7 +6289,11 @@@ fn test_data_loss_protect() 
        // * we don't broadcast our Local Commitment Tx in case of fallen behind
        // * we close channel in case of detecting other being fallen behind
        // * we are able to claim our own outputs thanks to remote my_current_per_commitment_point
 -      let mut nodes = create_network(2, &[None, None]);
 +      let monitor;
 +      let node_state_0;
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 1000000, InitFeatures::supported(), InitFeatures::supported());
  
        let chain_monitor = Arc::new(ChainWatchInterfaceUtil::new(Network::Testnet, Arc::clone(&logger)));
        let tx_broadcaster = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())});
        let feeest = Arc::new(test_utils::TestFeeEstimator { sat_per_kw: 253 });
 -      let monitor = Arc::new(test_utils::TestChannelMonitor::new(chain_monitor.clone(), tx_broadcaster.clone(), logger.clone(), feeest.clone()));
 -      let node_state_0 = {
 +      monitor = test_utils::TestChannelMonitor::new(chain_monitor.clone(), tx_broadcaster.clone(), logger.clone(), feeest.clone());
 +      node_state_0 = {
                let mut channel_monitors = HashMap::new();
                channel_monitors.insert(OutPoint { txid: chan.3.txid(), index: 0 }, &mut chan_monitor);
 -              <(Sha256dHash, ChannelManager<EnforcingChannelKeys>)>::read(&mut ::std::io::Cursor::new(previous_node_state), ChannelManagerReadArgs {
 +              <(Sha256dHash, ChannelManager<EnforcingChannelKeys, &test_utils::TestChannelMonitor>)>::read(&mut ::std::io::Cursor::new(previous_node_state), ChannelManagerReadArgs {
                        keys_manager: Arc::new(test_utils::TestKeysInterface::new(&nodes[0].node_seed, Network::Testnet, Arc::clone(&logger))),
                        fee_estimator: feeest.clone(),
 -                      monitor: monitor.clone(),
 +                      monitor: &monitor,
                        logger: Arc::clone(&logger),
                        tx_broadcaster,
                        default_config: UserConfig::default(),
 -                      channel_monitors: &mut channel_monitors
 +                      channel_monitors: &mut channel_monitors,
                }).unwrap().1
        };
 -      nodes[0].node = Arc::new(node_state_0);
 +      nodes[0].node = &node_state_0;
        assert!(monitor.add_update_monitor(OutPoint { txid: chan.3.txid(), index: 0 }, chan_monitor.clone()).is_ok());
 -      nodes[0].chan_monitor = monitor;
 +      nodes[0].chan_monitor = &monitor;
        nodes[0].chain_monitor = chain_monitor;
  
 -      let weak_res = Arc::downgrade(&nodes[0].chan_monitor.simple_monitor);
 -      nodes[0].block_notifier.register_listener(weak_res);
 -      let weak_res = Arc::downgrade(&nodes[0].node);
 -      nodes[0].block_notifier.register_listener(weak_res);
 +      nodes[0].block_notifier = BlockNotifier::new(nodes[0].chain_monitor.clone());
 +      nodes[0].block_notifier.register_listener(&nodes[0].chan_monitor.simple_monitor);
 +      nodes[0].block_notifier.register_listener(nodes[0].node);
  
        check_added_monitors!(nodes[0], 1);
  
 -      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id());
 -      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id());
 +      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
 +      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
  
        let reestablish_0 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
  
@@@ -6408,9 -6224,7 +6408,9 @@@ fn test_check_htlc_underpaying() 
        // sending a probe payment (i.e less than expected value0
        // to B, B should refuse payment.
  
 -      let nodes = create_network(2, &[None, None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        // Create some initial channels
        create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
@@@ -6456,9 -6270,7 +6456,9 @@@ fn test_announce_disable_channels() 
        // Create 2 channels between A and B. Disconnect B. Call timer_chan_freshness_every_min and check for generated
        // ChannelUpdate. Reconnect B, reestablish and check there is non-generated ChannelUpdate.
  
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let short_id_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported()).0.contents.short_channel_id;
        let short_id_2 = create_announced_chan_between_nodes(&nodes, 1, 0, InitFeatures::supported(), InitFeatures::supported()).0.contents.short_channel_id;
                }
        }
        // Reconnect peers
 -      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id());
 +      nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
        assert_eq!(reestablish_1.len(), 3);
 -      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id());
 +      nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
        let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
        assert_eq!(reestablish_2.len(), 3);
  
@@@ -6517,9 -6329,7 +6517,9 @@@ fn test_bump_penalty_txn_on_revoked_com
        // In case of penalty txn with too low feerates for getting into mempools, RBF-bump them to be sure
        // we're able to claim outputs on revoked commitment transaction before timelocks expiration
  
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::supported(), InitFeatures::supported());
        let payment_preimage = route_payment(&nodes[0], &vec!(&nodes[1])[..], 3000000).0;
@@@ -6619,9 -6429,7 +6619,9 @@@ fn test_bump_penalty_txn_on_revoked_htl
        // In case of penalty txn with too low feerates for getting into mempools, RBF-bump them to sure
        // we're able to claim outputs on revoked HTLC transactions before timelocks expiration
  
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::supported(), InitFeatures::supported());
        // Lock HTLC in both directions
  
        // Connect three more block to see if bumped penalty are issued for HTLC txn
        let header_132 = connect_blocks(&nodes[0].block_notifier, 3, 129, true, header_129.bitcoin_hash());
-       let node_txn = {
+       let penalty_local_tx;
+       {
                let mut node_txn = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap();
-               assert_eq!(node_txn.len(), 5); // 2 bumped penalty txn on offered/received HTLC outputs of revoked commitment tx + 1 penalty tx on to_local of revoked commitment tx + 2 bumped penalty tx on revoked HTLC txn
+               assert_eq!(node_txn.len(), 3); // 2 bumped penalty txn on offered/received HTLC outputs of revoked commitment tx + 1 penalty tx on to_local of revoked commitment tx + 2 bumped penalty tx on revoked HTLC txn
  
                check_spends!(node_txn[0], revoked_local_txn[0].clone());
                check_spends!(node_txn[1], revoked_local_txn[0].clone());
  
-               let mut penalty_local = ::std::usize::MAX;
+               check_spends!(node_txn[2], revoked_local_txn[0].clone());
+               penalty_local_tx = node_txn[2].clone();
+               node_txn.clear();
+       };
+       // Few more blocks to broadcast and confirm penalty_local_tx
+       let header_133 = BlockHeader { version: 0x20000000, prev_blockhash: header_132, merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
+       nodes[0].block_notifier.block_connected(&Block { header: header_133, txdata: vec![penalty_local_tx] }, 133);
+       let header_135 = connect_blocks(&nodes[0].block_notifier, 2, 133, true, header_133.bitcoin_hash());
+       {
+               let mut node_txn = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap();
+               assert_eq!(node_txn.len(), 1);
+               check_spends!(node_txn[0], revoked_local_txn[0].clone());
+               node_txn.clear();
+       }
+       let header_144 = connect_blocks(&nodes[0].block_notifier, 9, 135, true, header_135);
+       let node_txn = {
+               let mut node_txn = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap();
+               assert_eq!(node_txn.len(), 2);
                let mut penalty_offered = ::std::usize::MAX;
                let mut penalty_received = ::std::usize::MAX;
  
                {
-                       let iter_txn = node_txn[2..].iter();
-                       for (i, tx) in iter_txn.enumerate() {
-                               if tx.input[0].previous_output.txid == revoked_local_txn[0].txid() {
-                                       penalty_local = 2 + i;
-                               } else if tx.input[0].previous_output.txid == revoked_htlc_txn[offered].txid() {
-                                       penalty_offered = 2+ i;
+                       for (i, tx) in node_txn.iter().enumerate() {
+                               if tx.input[0].previous_output.txid == revoked_htlc_txn[offered].txid() {
+                                       penalty_offered = i;
                                } else if tx.input[0].previous_output.txid == revoked_htlc_txn[received].txid() {
-                                       penalty_received = 2 + i;
+                                       penalty_received = i;
                                }
                        }
                }
-               check_spends!(node_txn[penalty_local], revoked_local_txn[0].clone());
  
                assert_eq!(node_txn[penalty_received].input.len(), 1);
                assert_eq!(node_txn[penalty_received].output.len(), 1);
                let fee = revoked_htlc_txn[received].output[0].value - node_txn[penalty_received].output[0].value;
                let new_feerate = fee * 1000 / node_txn[penalty_received].get_weight() as u64;
                assert!(new_feerate * 100 > feerate_2 * 125);
-               let txn = vec![node_txn[2].clone(), node_txn[3].clone(), node_txn[4].clone()];
+               let txn = vec![node_txn[0].clone(), node_txn[1].clone()];
                node_txn.clear();
                txn
        };
        // Broadcast claim txn and confirm blocks to avoid further bumps on this outputs
-       let header_133 = BlockHeader { version: 0x20000000, prev_blockhash: header_132, merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
-       nodes[0].block_notifier.block_connected(&Block { header: header_133, txdata: node_txn }, 133);
-       let header_140 = connect_blocks(&nodes[0].block_notifier, 6, 134, true, header_133.bitcoin_hash());
-       {
-               let mut node_txn = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap();
-               node_txn.clear();
-       }
-       // Connect few more blocks and check only penalty transaction for to_local output have been issued
-       connect_blocks(&nodes[0].block_notifier, 7, 140, true, header_140);
+       let header_145 = BlockHeader { version: 0x20000000, prev_blockhash: header_144, merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
+       nodes[0].block_notifier.block_connected(&Block { header: header_145, txdata: node_txn }, 145);
+       connect_blocks(&nodes[0].block_notifier, 20, 145, true, header_145.bitcoin_hash());
        {
                let mut node_txn = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap();
-               assert_eq!(node_txn.len(), 2); //TODO: should be zero when we fix check_spend_remote_htlc
+               assert_eq!(node_txn.len(), 2); //TODO: fix check_spend_remote_htlc lack of watch output
                node_txn.clear();
        }
        check_closed_broadcast!(nodes[0], false);
@@@ -6765,9 -6582,7 +6774,9 @@@ fn test_bump_penalty_txn_on_remote_comm
        // Provide preimage for one
        // Check aggregation
  
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::supported(), InitFeatures::supported());
        let payment_preimage = route_payment(&nodes[0], &vec!(&nodes[1])[..], 3000000).0;
@@@ -6874,9 -6689,7 +6883,9 @@@ fn test_set_outpoints_partial_claiming(
        // - remote party claim tx, new bump tx
        // - disconnect remote claiming tx, new bump
        // - disconnect tx, see no tx anymore
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::supported(), InitFeatures::supported());
        let payment_preimage_1 = route_payment(&nodes[1], &vec!(&nodes[0])[..], 3_000_000).0;
@@@ -6968,9 -6781,7 +6977,9 @@@ fn test_bump_txn_sanitize_tracking_maps
        // Sanitizing pendning_claim_request and claimable_outpoints used to be buggy,
        // verify we clean then right after expiration of ANTI_REORG_DELAY.
  
 -      let nodes = create_network(2, &[None, None]);
 +      let node_cfgs = create_node_cfgs(2);
 +      let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
 +      let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
  
        let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::supported(), InitFeatures::supported());
        // Lock HTLC in both directions