+ ((*announcement).clone(), (*as_update).clone(), (*bs_update).clone(), channel_id, tx)
+ }
+
+ fn create_announced_chan_between_nodes(nodes: &Vec<Node>, a: usize, b: usize) -> (msgs::ChannelUpdate, msgs::ChannelUpdate, Uint256, Transaction) {
+ let chan_announcement = create_chan_between_nodes(&nodes[a], &nodes[b]);
+ for node in nodes {
+ assert!(node.router.handle_channel_announcement(&chan_announcement.0).unwrap());
+ node.router.handle_channel_update(&chan_announcement.1).unwrap();
+ node.router.handle_channel_update(&chan_announcement.2).unwrap();
+ }
+ (chan_announcement.1, chan_announcement.2, chan_announcement.3, chan_announcement.4)
+ }
+
+ fn close_channel(outbound_node: &Node, inbound_node: &Node, channel_id: &Uint256, funding_tx: Transaction, close_inbound_first: bool) {
+ let (node_a, broadcaster_a) = if close_inbound_first { (&inbound_node.node, &inbound_node.tx_broadcaster) } else { (&outbound_node.node, &outbound_node.tx_broadcaster) };
+ let (node_b, broadcaster_b) = if close_inbound_first { (&outbound_node.node, &outbound_node.tx_broadcaster) } else { (&inbound_node.node, &inbound_node.tx_broadcaster) };
+ let (tx_a, tx_b);
+
+ let shutdown_a = node_a.close_channel(channel_id).unwrap();
+ let (shutdown_b, mut closing_signed_b) = node_b.handle_shutdown(&node_a.get_our_node_id(), &shutdown_a).unwrap();
+ if !close_inbound_first {
+ assert!(closing_signed_b.is_none());
+ }
+ let (empty_a, mut closing_signed_a) = node_a.handle_shutdown(&node_b.get_our_node_id(), &shutdown_b.unwrap()).unwrap();
+ assert!(empty_a.is_none());
+ if close_inbound_first {
+ assert!(closing_signed_a.is_none());
+ closing_signed_a = node_a.handle_closing_signed(&node_b.get_our_node_id(), &closing_signed_b.unwrap()).unwrap();
+ assert_eq!(broadcaster_a.txn_broadcasted.lock().unwrap().len(), 1);
+ tx_a = broadcaster_a.txn_broadcasted.lock().unwrap().remove(0);
+
+ let empty_b = node_b.handle_closing_signed(&node_a.get_our_node_id(), &closing_signed_a.unwrap()).unwrap();
+ assert!(empty_b.is_none());
+ assert_eq!(broadcaster_b.txn_broadcasted.lock().unwrap().len(), 1);
+ tx_b = broadcaster_b.txn_broadcasted.lock().unwrap().remove(0);
+ } else {
+ closing_signed_b = node_b.handle_closing_signed(&node_a.get_our_node_id(), &closing_signed_a.unwrap()).unwrap();
+ assert_eq!(broadcaster_b.txn_broadcasted.lock().unwrap().len(), 1);
+ tx_b = broadcaster_b.txn_broadcasted.lock().unwrap().remove(0);
+
+ let empty_a2 = node_a.handle_closing_signed(&node_b.get_our_node_id(), &closing_signed_b.unwrap()).unwrap();
+ assert!(empty_a2.is_none());
+ assert_eq!(broadcaster_a.txn_broadcasted.lock().unwrap().len(), 1);
+ tx_a = broadcaster_a.txn_broadcasted.lock().unwrap().remove(0);
+ }
+ assert_eq!(tx_a, tx_b);
+ let mut funding_tx_map = HashMap::new();
+ funding_tx_map.insert(funding_tx.txid(), funding_tx);
+ tx_a.verify(&funding_tx_map).unwrap();