2020-08-10 15:00:09 -04:00
// This file is Copyright its original authors, visible in version control
// history.
//
// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// You may not use this file except in accordance with one or both of these
// licenses.
2019-01-23 16:46:44 -05:00
//! A bunch of useful utilities for building networks of nodes and exchanging messages between
//! nodes for functional tests.
use chain ::chaininterface ;
use chain ::transaction ::OutPoint ;
2020-01-06 20:29:33 -05:00
use ln ::channelmanager ::{ ChannelManager , ChannelManagerReadArgs , RAACommitmentOrder , PaymentPreimage , PaymentHash , PaymentSecret , PaymentSendFailure } ;
2020-01-20 22:13:44 -05:00
use ln ::channelmonitor ::{ ChannelMonitor , ManyChannelMonitor } ;
2020-05-02 15:05:04 -04:00
use routing ::router ::{ Route , get_route } ;
2020-05-06 18:34:37 -04:00
use routing ::network_graph ::{ NetGraphMsgHandler , NetworkGraph } ;
2020-01-06 17:54:02 -05:00
use ln ::features ::InitFeatures ;
2019-01-23 16:46:44 -05:00
use ln ::msgs ;
2020-01-06 17:54:02 -05:00
use ln ::msgs ::{ ChannelMessageHandler , RoutingMessageHandler } ;
2019-11-26 16:46:33 -05:00
use util ::enforcing_trait_impls ::EnforcingChannelKeys ;
2019-01-23 16:46:44 -05:00
use util ::test_utils ;
2020-01-16 13:26:38 -05:00
use util ::test_utils ::TestChannelMonitor ;
2019-01-23 16:46:44 -05:00
use util ::events ::{ Event , EventsProvider , MessageSendEvent , MessageSendEventsProvider } ;
use util ::errors ::APIError ;
use util ::config ::UserConfig ;
2020-05-06 18:34:37 -04:00
use util ::ser ::{ ReadableArgs , Writeable , Readable } ;
2019-01-23 16:46:44 -05:00
2020-06-16 15:10:17 -07:00
use bitcoin ::blockdata ::block ::{ Block , BlockHeader } ;
2019-01-23 16:46:44 -05:00
use bitcoin ::blockdata ::transaction ::{ Transaction , TxOut } ;
use bitcoin ::network ::constants ::Network ;
2020-04-27 16:41:54 +02:00
use bitcoin ::hashes ::sha256 ::Hash as Sha256 ;
use bitcoin ::hashes ::Hash ;
2020-04-27 17:53:13 +02:00
use bitcoin ::hash_types ::BlockHash ;
2019-01-23 16:46:44 -05:00
2020-04-27 16:51:59 +02:00
use bitcoin ::secp256k1 ::key ::PublicKey ;
2019-01-23 16:46:44 -05:00
use std ::cell ::RefCell ;
use std ::rc ::Rc ;
2020-06-11 15:23:35 -04:00
use std ::sync ::Mutex ;
2019-01-23 16:46:44 -05:00
use std ::mem ;
2020-01-24 17:48:27 -05:00
use std ::collections ::HashMap ;
2019-01-23 16:46:44 -05:00
pub const CHAN_CONFIRM_DEPTH : u32 = 100 ;
2020-07-14 10:11:50 -07:00
pub fn confirm_transaction < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > , tx : & Transaction ) {
2020-06-16 15:10:17 -07:00
let dummy_tx = Transaction { version : 0 , lock_time : 0 , input : Vec ::new ( ) , output : Vec ::new ( ) } ;
let dummy_tx_count = tx . version as usize ;
let mut block = Block {
header : BlockHeader { version : 0x20000000 , prev_blockhash : Default ::default ( ) , merkle_root : Default ::default ( ) , time : 42 , bits : 42 , nonce : 42 } ,
txdata : vec ! [ dummy_tx ; dummy_tx_count ] ,
} ;
block . txdata . push ( tx . clone ( ) ) ;
2020-07-14 10:29:11 -07:00
connect_block ( node , & block , 1 ) ;
2019-01-23 16:46:44 -05:00
for i in 2 .. CHAN_CONFIRM_DEPTH {
2020-06-16 15:10:17 -07:00
block = Block {
header : BlockHeader { version : 0x20000000 , prev_blockhash : block . header . block_hash ( ) , merkle_root : Default ::default ( ) , time : 42 , bits : 42 , nonce : 42 } ,
txdata : vec ! [ ] ,
} ;
2020-07-14 10:29:11 -07:00
connect_block ( node , & block , i ) ;
2019-01-23 16:46:44 -05:00
}
}
2020-07-14 10:11:50 -07:00
pub fn connect_blocks < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > , depth : u32 , height : u32 , parent : bool , prev_blockhash : BlockHash ) -> BlockHash {
2020-06-16 15:10:17 -07:00
let mut block = Block {
header : BlockHeader { version : 0x2000000 , prev_blockhash : if parent { prev_blockhash } else { Default ::default ( ) } , merkle_root : Default ::default ( ) , time : 42 , bits : 42 , nonce : 42 } ,
txdata : vec ! [ ] ,
} ;
2020-07-14 10:29:11 -07:00
connect_block ( node , & block , height + 1 ) ;
2019-05-30 20:54:02 -04:00
for i in 2 .. depth + 1 {
2020-06-16 15:10:17 -07:00
block = Block {
header : BlockHeader { version : 0x20000000 , prev_blockhash : block . header . block_hash ( ) , merkle_root : Default ::default ( ) , time : 42 , bits : 42 , nonce : 42 } ,
txdata : vec ! [ ] ,
} ;
2020-07-14 10:29:11 -07:00
connect_block ( node , & block , height + i ) ;
2019-05-30 20:54:02 -04:00
}
2020-06-16 15:10:17 -07:00
block . header . block_hash ( )
2019-02-08 21:43:56 -05:00
}
2020-07-14 10:29:11 -07:00
pub fn connect_block < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > , block : & Block , height : u32 ) {
node . block_notifier . block_connected ( block , height )
}
pub fn disconnect_block < ' a , ' b , ' c , ' d > ( node : & ' a Node < ' b , ' c , ' d > , header : & BlockHeader , height : u32 ) {
node . block_notifier . block_disconnected ( header , height )
}
2020-02-20 14:14:12 -05:00
pub struct TestChanMonCfg {
pub tx_broadcaster : test_utils ::TestBroadcaster ,
2020-02-27 11:33:03 -05:00
pub fee_estimator : test_utils ::TestFeeEstimator ,
2020-03-02 12:55:53 -05:00
pub chain_monitor : chaininterface ::ChainWatchInterfaceUtil ,
pub logger : test_utils ::TestLogger ,
2020-02-20 14:14:12 -05:00
}
pub struct NodeCfg < ' a > {
2020-03-02 12:55:53 -05:00
pub chain_monitor : & ' a chaininterface ::ChainWatchInterfaceUtil ,
2020-02-20 14:14:12 -05:00
pub tx_broadcaster : & ' a test_utils ::TestBroadcaster ,
2020-02-27 11:33:03 -05:00
pub fee_estimator : & ' a test_utils ::TestFeeEstimator ,
2020-02-20 14:14:12 -05:00
pub chan_monitor : test_utils ::TestChannelMonitor < ' a > ,
2020-02-26 16:00:26 -05:00
pub keys_manager : test_utils ::TestKeysInterface ,
2020-03-02 12:55:53 -05:00
pub logger : & ' a test_utils ::TestLogger ,
2020-01-16 13:26:38 -05:00
pub node_seed : [ u8 ; 32 ] ,
}
2020-02-20 14:14:12 -05:00
pub struct Node < ' a , ' b : ' a , ' c : ' b > {
2020-06-16 15:10:17 -07:00
pub block_notifier : chaininterface ::BlockNotifierRef < ' a > ,
2020-03-02 12:55:53 -05:00
pub chain_monitor : & ' c chaininterface ::ChainWatchInterfaceUtil ,
2020-02-20 14:14:12 -05:00
pub tx_broadcaster : & ' c test_utils ::TestBroadcaster ,
pub chan_monitor : & ' b test_utils ::TestChannelMonitor < ' c > ,
2020-02-26 16:00:26 -05:00
pub keys_manager : & ' b test_utils ::TestKeysInterface ,
2020-03-02 12:55:53 -05:00
pub node : & ' a ChannelManager < EnforcingChannelKeys , & ' b TestChannelMonitor < ' c > , & ' c test_utils ::TestBroadcaster , & ' b test_utils ::TestKeysInterface , & ' c test_utils ::TestFeeEstimator , & ' c test_utils ::TestLogger > ,
pub net_graph_msg_handler : NetGraphMsgHandler < & ' c chaininterface ::ChainWatchInterfaceUtil , & ' c test_utils ::TestLogger > ,
2019-01-23 16:46:44 -05:00
pub node_seed : [ u8 ; 32 ] ,
pub network_payment_count : Rc < RefCell < u8 > > ,
pub network_chan_count : Rc < RefCell < u32 > > ,
2020-03-02 12:55:53 -05:00
pub logger : & ' c test_utils ::TestLogger ,
2019-01-23 16:46:44 -05:00
}
2020-01-16 13:26:38 -05:00
2020-02-20 14:14:12 -05:00
impl < ' a , ' b , ' c > Drop for Node < ' a , ' b , ' c > {
2019-01-23 16:46:44 -05:00
fn drop ( & mut self ) {
if ! ::std ::thread ::panicking ( ) {
// Check that we processed all pending events
assert! ( self . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
assert! ( self . node . get_and_clear_pending_events ( ) . is_empty ( ) ) ;
assert! ( self . chan_monitor . added_monitors . lock ( ) . unwrap ( ) . is_empty ( ) ) ;
2020-01-20 22:13:44 -05:00
2020-02-23 23:26:10 -05:00
// Check that if we serialize the Router, we can deserialize it again.
{
let mut w = test_utils ::TestVecWriter ( Vec ::new ( ) ) ;
2020-05-06 18:34:37 -04:00
let network_graph_ser = self . net_graph_msg_handler . network_graph . read ( ) . unwrap ( ) ;
network_graph_ser . write ( & mut w ) . unwrap ( ) ;
let network_graph_deser = < NetworkGraph > ::read ( & mut ::std ::io ::Cursor ::new ( & w . 0 ) ) . unwrap ( ) ;
2020-05-11 21:08:35 -04:00
assert! ( network_graph_deser = = * self . net_graph_msg_handler . network_graph . read ( ) . unwrap ( ) ) ;
2020-05-06 18:34:37 -04:00
let net_graph_msg_handler = NetGraphMsgHandler ::from_net_graph (
2020-06-11 15:23:35 -04:00
self . chain_monitor , self . logger , network_graph_deser
2020-05-06 18:34:37 -04:00
) ;
2020-02-23 23:26:10 -05:00
let mut chan_progress = 0 ;
loop {
2020-05-02 15:05:04 -04:00
let orig_announcements = self . net_graph_msg_handler . get_next_channel_announcements ( chan_progress , 255 ) ;
let deserialized_announcements = net_graph_msg_handler . get_next_channel_announcements ( chan_progress , 255 ) ;
2020-02-23 23:26:10 -05:00
assert! ( orig_announcements = = deserialized_announcements ) ;
chan_progress = match orig_announcements . last ( ) {
Some ( announcement ) = > announcement . 0. contents . short_channel_id + 1 ,
None = > break ,
} ;
}
let mut node_progress = None ;
loop {
2020-05-02 15:05:04 -04:00
let orig_announcements = self . net_graph_msg_handler . get_next_node_announcements ( node_progress . as_ref ( ) , 255 ) ;
let deserialized_announcements = net_graph_msg_handler . get_next_node_announcements ( node_progress . as_ref ( ) , 255 ) ;
2020-02-23 23:26:10 -05:00
assert! ( orig_announcements = = deserialized_announcements ) ;
node_progress = match orig_announcements . last ( ) {
Some ( announcement ) = > Some ( announcement . contents . node_id ) ,
None = > break ,
} ;
}
}
2020-01-20 22:13:44 -05:00
// Check that if we serialize and then deserialize all our channel monitors we get the
// same set of outputs to watch for on chain as we have now. Note that if we write
// tests that fully close channels and remove the monitors at some point this may break.
2020-02-27 11:33:03 -05:00
let feeest = test_utils ::TestFeeEstimator { sat_per_kw : 253 } ;
2020-02-17 13:50:46 -05:00
let mut deserialized_monitors = Vec ::new ( ) ;
2020-03-18 16:30:05 -04:00
{
let old_monitors = self . chan_monitor . simple_monitor . monitors . lock ( ) . unwrap ( ) ;
for ( _ , old_monitor ) in old_monitors . iter ( ) {
let mut w = test_utils ::TestVecWriter ( Vec ::new ( ) ) ;
old_monitor . write_for_disk ( & mut w ) . unwrap ( ) ;
2020-04-27 17:53:13 +02:00
let ( _ , deserialized_monitor ) = < ( BlockHash , ChannelMonitor < EnforcingChannelKeys > ) > ::read (
2020-03-02 12:55:53 -05:00
& mut ::std ::io ::Cursor ::new ( & w . 0 ) ) . unwrap ( ) ;
2020-03-18 16:30:05 -04:00
deserialized_monitors . push ( deserialized_monitor ) ;
}
2020-02-17 13:50:46 -05:00
}
// Before using all the new monitors to check the watch outpoints, use the full set of
// them to ensure we can write and reload our ChannelManager.
{
let mut channel_monitors = HashMap ::new ( ) ;
for monitor in deserialized_monitors . iter_mut ( ) {
2020-06-09 23:00:30 -04:00
channel_monitors . insert ( monitor . get_funding_txo ( ) . 0 , monitor ) ;
2020-02-17 13:50:46 -05:00
}
let mut w = test_utils ::TestVecWriter ( Vec ::new ( ) ) ;
self . node . write ( & mut w ) . unwrap ( ) ;
2020-03-02 12:55:53 -05:00
< ( BlockHash , ChannelManager < EnforcingChannelKeys , & test_utils ::TestChannelMonitor , & test_utils ::TestBroadcaster , & test_utils ::TestKeysInterface , & test_utils ::TestFeeEstimator , & test_utils ::TestLogger > ) > ::read ( & mut ::std ::io ::Cursor ::new ( w . 0 ) , ChannelManagerReadArgs {
2020-02-17 13:50:46 -05:00
default_config : UserConfig ::default ( ) ,
2020-02-26 16:00:26 -05:00
keys_manager : self . keys_manager ,
2020-02-27 11:33:03 -05:00
fee_estimator : & test_utils ::TestFeeEstimator { sat_per_kw : 253 } ,
2020-02-17 13:50:46 -05:00
monitor : self . chan_monitor ,
tx_broadcaster : self . tx_broadcaster . clone ( ) ,
2020-03-02 12:55:53 -05:00
logger : & test_utils ::TestLogger ::new ( ) ,
2020-08-07 16:27:26 -04:00
channel_monitors ,
2020-02-17 13:50:46 -05:00
} ) . unwrap ( ) ;
}
2020-03-02 12:55:53 -05:00
let chain_watch = chaininterface ::ChainWatchInterfaceUtil ::new ( Network ::Testnet ) ;
let channel_monitor = test_utils ::TestChannelMonitor ::new ( & chain_watch , self . tx_broadcaster . clone ( ) , & self . logger , & feeest ) ;
2020-02-17 13:50:46 -05:00
for deserialized_monitor in deserialized_monitors . drain ( .. ) {
2020-06-09 23:00:30 -04:00
if let Err ( _ ) = channel_monitor . add_monitor ( deserialized_monitor . get_funding_txo ( ) . 0 , deserialized_monitor ) {
2020-01-20 22:13:44 -05:00
panic! ( ) ;
}
}
2020-03-02 12:55:53 -05:00
if chain_watch ! = * self . chain_monitor {
2020-01-20 22:13:44 -05:00
panic! ( ) ;
}
2019-01-23 16:46:44 -05:00
}
}
}
2020-02-20 14:14:12 -05:00
pub fn create_chan_between_nodes < ' a , ' b , ' c , ' d > ( node_a : & ' a Node < ' b , ' c , ' d > , node_b : & ' a Node < ' b , ' c , ' d > , a_flags : InitFeatures , b_flags : InitFeatures ) -> ( msgs ::ChannelAnnouncement , msgs ::ChannelUpdate , msgs ::ChannelUpdate , [ u8 ; 32 ] , Transaction ) {
2019-07-11 14:02:48 -04:00
create_chan_between_nodes_with_value ( node_a , node_b , 100000 , 10001 , a_flags , b_flags )
2019-01-23 16:46:44 -05:00
}
2020-02-20 14:14:12 -05:00
pub fn create_chan_between_nodes_with_value < ' a , ' b , ' c , ' d > ( node_a : & ' a Node < ' b , ' c , ' d > , node_b : & ' a Node < ' b , ' c , ' d > , channel_value : u64 , push_msat : u64 , a_flags : InitFeatures , b_flags : InitFeatures ) -> ( msgs ::ChannelAnnouncement , msgs ::ChannelUpdate , msgs ::ChannelUpdate , [ u8 ; 32 ] , Transaction ) {
2019-07-11 14:02:48 -04:00
let ( funding_locked , channel_id , tx ) = create_chan_between_nodes_with_value_a ( node_a , node_b , channel_value , push_msat , a_flags , b_flags ) ;
2019-01-23 16:46:44 -05:00
let ( announcement , as_update , bs_update ) = create_chan_between_nodes_with_value_b ( node_a , node_b , & funding_locked ) ;
( announcement , as_update , bs_update , channel_id , tx )
}
macro_rules ! get_revoke_commit_msgs {
( $node : expr , $node_id : expr ) = > {
{
let events = $node . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( events . len ( ) , 2 ) ;
( match events [ 0 ] {
MessageSendEvent ::SendRevokeAndACK { ref node_id , ref msg } = > {
assert_eq! ( * node_id , $node_id ) ;
( * msg ) . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
} , match events [ 1 ] {
MessageSendEvent ::UpdateHTLCs { ref node_id , ref updates } = > {
assert_eq! ( * node_id , $node_id ) ;
assert! ( updates . update_add_htlcs . is_empty ( ) ) ;
assert! ( updates . update_fulfill_htlcs . is_empty ( ) ) ;
assert! ( updates . update_fail_htlcs . is_empty ( ) ) ;
assert! ( updates . update_fail_malformed_htlcs . is_empty ( ) ) ;
assert! ( updates . update_fee . is_none ( ) ) ;
updates . commitment_signed . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
} )
}
}
}
macro_rules ! get_event_msg {
( $node : expr , $event_type : path , $node_id : expr ) = > {
{
let events = $node . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( events . len ( ) , 1 ) ;
match events [ 0 ] {
$event_type { ref node_id , ref msg } = > {
assert_eq! ( * node_id , $node_id ) ;
( * msg ) . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
}
}
}
}
macro_rules ! get_htlc_update_msgs {
( $node : expr , $node_id : expr ) = > {
{
let events = $node . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( events . len ( ) , 1 ) ;
match events [ 0 ] {
MessageSendEvent ::UpdateHTLCs { ref node_id , ref updates } = > {
assert_eq! ( * node_id , $node_id ) ;
( * updates ) . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
}
}
}
}
macro_rules ! get_feerate {
( $node : expr , $channel_id : expr ) = > {
{
let chan_lock = $node . node . channel_state . lock ( ) . unwrap ( ) ;
let chan = chan_lock . by_id . get ( & $channel_id ) . unwrap ( ) ;
chan . get_feerate ( )
}
}
}
2020-03-18 21:30:34 -04:00
macro_rules ! get_local_commitment_txn {
( $node : expr , $channel_id : expr ) = > {
2020-03-18 21:37:09 -04:00
{
let mut monitors = $node . chan_monitor . simple_monitor . monitors . lock ( ) . unwrap ( ) ;
let mut commitment_txn = None ;
for ( funding_txo , monitor ) in monitors . iter_mut ( ) {
if funding_txo . to_channel_id ( ) = = $channel_id {
2020-09-06 19:51:21 -04:00
commitment_txn = Some ( monitor . unsafe_get_latest_holder_commitment_txn ( & $node . logger ) ) ;
2020-03-18 21:37:09 -04:00
break ;
}
}
commitment_txn . unwrap ( )
}
2020-03-18 21:30:34 -04:00
}
}
2020-01-06 20:29:33 -05:00
macro_rules ! unwrap_send_err {
( $res : expr , $all_failed : expr , $type : pat , $check : expr ) = > {
match & $res {
& Err ( PaymentSendFailure ::AllFailedRetrySafe ( ref fails ) ) if $all_failed = > {
assert_eq! ( fails . len ( ) , 1 ) ;
match fails [ 0 ] {
$type = > { $check } ,
_ = > panic! ( ) ,
}
} ,
& Err ( PaymentSendFailure ::PartialFailure ( ref fails ) ) if ! $all_failed = > {
assert_eq! ( fails . len ( ) , 1 ) ;
match fails [ 0 ] {
Err ( $type ) = > { $check } ,
_ = > panic! ( ) ,
}
} ,
_ = > panic! ( ) ,
}
}
}
2020-04-18 16:35:01 -04:00
macro_rules ! check_added_monitors {
( $node : expr , $count : expr ) = > {
{
let mut added_monitors = $node . chan_monitor . added_monitors . lock ( ) . unwrap ( ) ;
assert_eq! ( added_monitors . len ( ) , $count ) ;
added_monitors . clear ( ) ;
}
}
}
2020-02-20 14:14:12 -05:00
pub fn create_funding_transaction < ' a , ' b , ' c > ( node : & Node < ' a , ' b , ' c > , expected_chan_value : u64 , expected_user_chan_id : u64 ) -> ( [ u8 ; 32 ] , Transaction , OutPoint ) {
2019-07-26 18:05:05 -04:00
let chan_id = * node . network_chan_count . borrow ( ) ;
2019-01-23 16:46:44 -05:00
2019-07-26 18:05:05 -04:00
let events = node . node . get_and_clear_pending_events ( ) ;
assert_eq! ( events . len ( ) , 1 ) ;
match events [ 0 ] {
2019-01-23 16:46:44 -05:00
Event ::FundingGenerationReady { ref temporary_channel_id , ref channel_value_satoshis , ref output_script , user_channel_id } = > {
2019-07-26 18:05:05 -04:00
assert_eq! ( * channel_value_satoshis , expected_chan_value ) ;
assert_eq! ( user_channel_id , expected_user_chan_id ) ;
2019-01-23 16:46:44 -05:00
2020-08-25 17:12:00 -04:00
let tx = Transaction { version : chan_id as i32 , lock_time : 0 , input : Vec ::new ( ) , output : vec ! [ TxOut {
2019-01-23 16:46:44 -05:00
value : * channel_value_satoshis , script_pubkey : output_script . clone ( ) ,
} ] } ;
2020-05-12 13:17:49 -04:00
let funding_outpoint = OutPoint { txid : tx . txid ( ) , index : 0 } ;
2019-07-26 18:05:05 -04:00
( * temporary_channel_id , tx , funding_outpoint )
2019-01-23 16:46:44 -05:00
} ,
_ = > panic! ( " Unexpected event " ) ,
}
2019-07-26 18:05:05 -04:00
}
2020-02-20 14:14:12 -05:00
pub fn create_chan_between_nodes_with_value_init < ' a , ' b , ' c > ( node_a : & Node < ' a , ' b , ' c > , node_b : & Node < ' a , ' b , ' c > , channel_value : u64 , push_msat : u64 , a_flags : InitFeatures , b_flags : InitFeatures ) -> Transaction {
2020-02-25 12:03:25 +00:00
node_a . node . create_channel ( node_b . node . get_our_node_id ( ) , channel_value , push_msat , 42 , None ) . unwrap ( ) ;
2019-11-05 18:51:05 -05:00
node_b . node . handle_open_channel ( & node_a . node . get_our_node_id ( ) , a_flags , & get_event_msg! ( node_a , MessageSendEvent ::SendOpenChannel , node_b . node . get_our_node_id ( ) ) ) ;
node_a . node . handle_accept_channel ( & node_b . node . get_our_node_id ( ) , b_flags , & get_event_msg! ( node_b , MessageSendEvent ::SendAcceptChannel , node_a . node . get_our_node_id ( ) ) ) ;
2019-07-26 18:05:05 -04:00
let ( temporary_channel_id , tx , funding_output ) = create_funding_transaction ( node_a , channel_value , 42 ) ;
2020-04-18 16:35:01 -04:00
node_a . node . funding_transaction_generated ( & temporary_channel_id , funding_output ) ;
check_added_monitors! ( node_a , 0 ) ;
2019-01-23 16:46:44 -05:00
2019-11-05 18:51:05 -05:00
node_b . node . handle_funding_created ( & node_a . node . get_our_node_id ( ) , & get_event_msg! ( node_a , MessageSendEvent ::SendFundingCreated , node_b . node . get_our_node_id ( ) ) ) ;
2019-01-23 16:46:44 -05:00
{
let mut added_monitors = node_b . chan_monitor . added_monitors . lock ( ) . unwrap ( ) ;
assert_eq! ( added_monitors . len ( ) , 1 ) ;
assert_eq! ( added_monitors [ 0 ] . 0 , funding_output ) ;
added_monitors . clear ( ) ;
}
2019-11-05 18:51:05 -05:00
node_a . node . handle_funding_signed ( & node_b . node . get_our_node_id ( ) , & get_event_msg! ( node_b , MessageSendEvent ::SendFundingSigned , node_a . node . get_our_node_id ( ) ) ) ;
2019-01-23 16:46:44 -05:00
{
let mut added_monitors = node_a . chan_monitor . added_monitors . lock ( ) . unwrap ( ) ;
assert_eq! ( added_monitors . len ( ) , 1 ) ;
assert_eq! ( added_monitors [ 0 ] . 0 , funding_output ) ;
added_monitors . clear ( ) ;
}
let events_4 = node_a . node . get_and_clear_pending_events ( ) ;
assert_eq! ( events_4 . len ( ) , 1 ) ;
match events_4 [ 0 ] {
Event ::FundingBroadcastSafe { ref funding_txo , user_channel_id } = > {
assert_eq! ( user_channel_id , 42 ) ;
assert_eq! ( * funding_txo , funding_output ) ;
} ,
_ = > panic! ( " Unexpected event " ) ,
} ;
tx
}
2020-02-20 14:14:12 -05:00
pub fn create_chan_between_nodes_with_value_confirm_first < ' a , ' b , ' c , ' d > ( node_recv : & ' a Node < ' b , ' c , ' c > , node_conf : & ' a Node < ' b , ' c , ' d > , tx : & Transaction ) {
2020-07-14 10:11:50 -07:00
confirm_transaction ( node_conf , tx ) ;
2019-11-05 18:51:05 -05:00
node_recv . node . handle_funding_locked ( & node_conf . node . get_our_node_id ( ) , & get_event_msg! ( node_conf , MessageSendEvent ::SendFundingLocked , node_recv . node . get_our_node_id ( ) ) ) ;
2019-07-29 13:45:35 -04:00
}
2019-01-23 16:46:44 -05:00
2020-02-20 14:14:12 -05:00
pub fn create_chan_between_nodes_with_value_confirm_second < ' a , ' b , ' c > ( node_recv : & Node < ' a , ' b , ' c > , node_conf : & Node < ' a , ' b , ' c > ) -> ( ( msgs ::FundingLocked , msgs ::AnnouncementSignatures ) , [ u8 ; 32 ] ) {
2019-01-23 16:46:44 -05:00
let channel_id ;
2019-07-29 13:45:35 -04:00
let events_6 = node_conf . node . get_and_clear_pending_msg_events ( ) ;
2019-01-23 16:46:44 -05:00
assert_eq! ( events_6 . len ( ) , 2 ) ;
( ( match events_6 [ 0 ] {
MessageSendEvent ::SendFundingLocked { ref node_id , ref msg } = > {
channel_id = msg . channel_id . clone ( ) ;
2019-07-29 13:45:35 -04:00
assert_eq! ( * node_id , node_recv . node . get_our_node_id ( ) ) ;
2019-01-23 16:46:44 -05:00
msg . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
} , match events_6 [ 1 ] {
MessageSendEvent ::SendAnnouncementSignatures { ref node_id , ref msg } = > {
2019-07-29 13:45:35 -04:00
assert_eq! ( * node_id , node_recv . node . get_our_node_id ( ) ) ;
2019-01-23 16:46:44 -05:00
msg . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
} ) , channel_id )
}
2020-02-20 14:14:12 -05:00
pub fn create_chan_between_nodes_with_value_confirm < ' a , ' b , ' c , ' d > ( node_a : & ' a Node < ' b , ' c , ' d > , node_b : & ' a Node < ' b , ' c , ' d > , tx : & Transaction ) -> ( ( msgs ::FundingLocked , msgs ::AnnouncementSignatures ) , [ u8 ; 32 ] ) {
2019-07-29 13:45:35 -04:00
create_chan_between_nodes_with_value_confirm_first ( node_a , node_b , tx ) ;
2020-07-14 10:11:50 -07:00
confirm_transaction ( node_a , tx ) ;
2019-07-29 13:45:35 -04:00
create_chan_between_nodes_with_value_confirm_second ( node_b , node_a )
}
2020-02-20 14:14:12 -05:00
pub fn create_chan_between_nodes_with_value_a < ' a , ' b , ' c , ' d > ( node_a : & ' a Node < ' b , ' c , ' d > , node_b : & ' a Node < ' b , ' c , ' d > , channel_value : u64 , push_msat : u64 , a_flags : InitFeatures , b_flags : InitFeatures ) -> ( ( msgs ::FundingLocked , msgs ::AnnouncementSignatures ) , [ u8 ; 32 ] , Transaction ) {
2019-07-11 14:02:48 -04:00
let tx = create_chan_between_nodes_with_value_init ( node_a , node_b , channel_value , push_msat , a_flags , b_flags ) ;
2019-01-23 16:46:44 -05:00
let ( msgs , chan_id ) = create_chan_between_nodes_with_value_confirm ( node_a , node_b , & tx ) ;
( msgs , chan_id , tx )
}
2020-02-20 14:14:12 -05:00
pub fn create_chan_between_nodes_with_value_b < ' a , ' b , ' c > ( node_a : & Node < ' a , ' b , ' c > , node_b : & Node < ' a , ' b , ' c > , as_funding_msgs : & ( msgs ::FundingLocked , msgs ::AnnouncementSignatures ) ) -> ( msgs ::ChannelAnnouncement , msgs ::ChannelUpdate , msgs ::ChannelUpdate ) {
2019-11-05 18:51:05 -05:00
node_b . node . handle_funding_locked ( & node_a . node . get_our_node_id ( ) , & as_funding_msgs . 0 ) ;
2019-01-23 16:46:44 -05:00
let bs_announcement_sigs = get_event_msg! ( node_b , MessageSendEvent ::SendAnnouncementSignatures , node_a . node . get_our_node_id ( ) ) ;
2019-11-05 18:51:05 -05:00
node_b . node . handle_announcement_signatures ( & node_a . node . get_our_node_id ( ) , & as_funding_msgs . 1 ) ;
2019-01-23 16:46:44 -05:00
let events_7 = node_b . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( events_7 . len ( ) , 1 ) ;
let ( announcement , bs_update ) = match events_7 [ 0 ] {
MessageSendEvent ::BroadcastChannelAnnouncement { ref msg , ref update_msg } = > {
( msg , update_msg )
} ,
_ = > panic! ( " Unexpected event " ) ,
} ;
2019-11-05 18:51:05 -05:00
node_a . node . handle_announcement_signatures ( & node_b . node . get_our_node_id ( ) , & bs_announcement_sigs ) ;
2019-01-23 16:46:44 -05:00
let events_8 = node_a . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( events_8 . len ( ) , 1 ) ;
let as_update = match events_8 [ 0 ] {
MessageSendEvent ::BroadcastChannelAnnouncement { ref msg , ref update_msg } = > {
assert! ( * announcement = = * msg ) ;
assert_eq! ( update_msg . contents . short_channel_id , announcement . contents . short_channel_id ) ;
assert_eq! ( update_msg . contents . short_channel_id , bs_update . contents . short_channel_id ) ;
update_msg
} ,
_ = > panic! ( " Unexpected event " ) ,
} ;
* node_a . network_chan_count . borrow_mut ( ) + = 1 ;
( ( * announcement ) . clone ( ) , ( * as_update ) . clone ( ) , ( * bs_update ) . clone ( ) )
}
2020-02-20 14:14:12 -05:00
pub fn create_announced_chan_between_nodes < ' a , ' b , ' c , ' d > ( nodes : & ' a Vec < Node < ' b , ' c , ' d > > , a : usize , b : usize , a_flags : InitFeatures , b_flags : InitFeatures ) -> ( msgs ::ChannelUpdate , msgs ::ChannelUpdate , [ u8 ; 32 ] , Transaction ) {
2019-07-11 14:02:48 -04:00
create_announced_chan_between_nodes_with_value ( nodes , a , b , 100000 , 10001 , a_flags , b_flags )
2019-01-23 16:46:44 -05:00
}
2020-02-20 14:14:12 -05:00
pub fn create_announced_chan_between_nodes_with_value < ' a , ' b , ' c , ' d > ( nodes : & ' a Vec < Node < ' b , ' c , ' d > > , a : usize , b : usize , channel_value : u64 , push_msat : u64 , a_flags : InitFeatures , b_flags : InitFeatures ) -> ( msgs ::ChannelUpdate , msgs ::ChannelUpdate , [ u8 ; 32 ] , Transaction ) {
2019-07-11 14:02:48 -04:00
let chan_announcement = create_chan_between_nodes_with_value ( & nodes [ a ] , & nodes [ b ] , channel_value , push_msat , a_flags , b_flags ) ;
2020-01-02 20:32:37 -05:00
nodes [ a ] . node . broadcast_node_announcement ( [ 0 , 0 , 0 ] , [ 0 ; 32 ] , Vec ::new ( ) ) ;
let a_events = nodes [ a ] . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( a_events . len ( ) , 1 ) ;
let a_node_announcement = match a_events [ 0 ] {
MessageSendEvent ::BroadcastNodeAnnouncement { ref msg } = > {
( * msg ) . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
} ;
nodes [ b ] . node . broadcast_node_announcement ( [ 1 , 1 , 1 ] , [ 1 ; 32 ] , Vec ::new ( ) ) ;
let b_events = nodes [ b ] . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( b_events . len ( ) , 1 ) ;
let b_node_announcement = match b_events [ 0 ] {
MessageSendEvent ::BroadcastNodeAnnouncement { ref msg } = > {
( * msg ) . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
} ;
2019-01-23 16:46:44 -05:00
for node in nodes {
2020-05-02 15:05:04 -04:00
assert! ( node . net_graph_msg_handler . handle_channel_announcement ( & chan_announcement . 0 ) . unwrap ( ) ) ;
node . net_graph_msg_handler . handle_channel_update ( & chan_announcement . 1 ) . unwrap ( ) ;
node . net_graph_msg_handler . handle_channel_update ( & chan_announcement . 2 ) . unwrap ( ) ;
node . net_graph_msg_handler . handle_node_announcement ( & a_node_announcement ) . unwrap ( ) ;
node . net_graph_msg_handler . handle_node_announcement ( & b_node_announcement ) . unwrap ( ) ;
2019-01-23 16:46:44 -05:00
}
( chan_announcement . 1 , chan_announcement . 2 , chan_announcement . 3 , chan_announcement . 4 )
}
macro_rules ! check_spends {
2020-03-04 17:45:27 -05:00
( $tx : expr , $( $spends_txn : expr ) , * ) = > {
2019-01-23 16:46:44 -05:00
{
2019-08-23 19:12:55 -04:00
$tx . verify ( | out_point | {
2020-03-04 17:45:27 -05:00
$(
if out_point . txid = = $spends_txn . txid ( ) {
return $spends_txn . output . get ( out_point . vout as usize ) . cloned ( )
}
) *
None
2019-08-23 19:12:55 -04:00
} ) . unwrap ( ) ;
2019-01-23 16:46:44 -05:00
}
}
}
macro_rules ! get_closing_signed_broadcast {
( $node : expr , $dest_pubkey : expr ) = > {
{
let events = $node . get_and_clear_pending_msg_events ( ) ;
assert! ( events . len ( ) = = 1 | | events . len ( ) = = 2 ) ;
( match events [ events . len ( ) - 1 ] {
MessageSendEvent ::BroadcastChannelUpdate { ref msg } = > {
assert_eq! ( msg . contents . flags & 2 , 2 ) ;
msg . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
} , if events . len ( ) = = 2 {
match events [ 0 ] {
MessageSendEvent ::SendClosingSigned { ref node_id , ref msg } = > {
assert_eq! ( * node_id , $dest_pubkey ) ;
Some ( msg . clone ( ) )
} ,
_ = > panic! ( " Unexpected event " ) ,
}
} else { None } )
}
}
}
macro_rules ! check_closed_broadcast {
2019-11-05 18:51:05 -05:00
( $node : expr , $with_error_msg : expr ) = > { {
2019-01-23 16:46:44 -05:00
let events = $node . node . get_and_clear_pending_msg_events ( ) ;
2019-11-05 18:51:05 -05:00
assert_eq! ( events . len ( ) , if $with_error_msg { 2 } else { 1 } ) ;
2019-01-23 16:46:44 -05:00
match events [ 0 ] {
MessageSendEvent ::BroadcastChannelUpdate { ref msg } = > {
assert_eq! ( msg . contents . flags & 2 , 2 ) ;
} ,
_ = > panic! ( " Unexpected event " ) ,
}
2019-11-05 18:51:05 -05:00
if $with_error_msg {
match events [ 1 ] {
MessageSendEvent ::HandleError { action : ErrorAction ::SendErrorMessage { ref msg } , node_id : _ } = > {
// TODO: Check node_id
Some ( msg . clone ( ) )
} ,
_ = > panic! ( " Unexpected event " ) ,
}
} else { None }
2019-01-23 16:46:44 -05:00
} }
}
2020-02-20 14:14:12 -05:00
pub fn close_channel < ' a , ' b , ' c > ( outbound_node : & Node < ' a , ' b , ' c > , inbound_node : & Node < ' a , ' b , ' c > , channel_id : & [ u8 ; 32 ] , funding_tx : Transaction , close_inbound_first : bool ) -> ( msgs ::ChannelUpdate , msgs ::ChannelUpdate , Transaction ) {
2019-01-23 16:46:44 -05:00
let ( node_a , broadcaster_a , struct_a ) = if close_inbound_first { ( & inbound_node . node , & inbound_node . tx_broadcaster , inbound_node ) } else { ( & outbound_node . node , & outbound_node . tx_broadcaster , outbound_node ) } ;
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 ) ;
node_a . close_channel ( channel_id ) . unwrap ( ) ;
2019-11-05 18:51:05 -05:00
node_b . handle_shutdown ( & node_a . get_our_node_id ( ) , & get_event_msg! ( struct_a , MessageSendEvent ::SendShutdown , node_b . get_our_node_id ( ) ) ) ;
2019-01-23 16:46:44 -05:00
let events_1 = node_b . get_and_clear_pending_msg_events ( ) ;
assert! ( events_1 . len ( ) > = 1 ) ;
let shutdown_b = match events_1 [ 0 ] {
MessageSendEvent ::SendShutdown { ref node_id , ref msg } = > {
assert_eq! ( node_id , & node_a . get_our_node_id ( ) ) ;
msg . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
} ;
let closing_signed_b = if ! close_inbound_first {
assert_eq! ( events_1 . len ( ) , 1 ) ;
None
} else {
Some ( match events_1 [ 1 ] {
MessageSendEvent ::SendClosingSigned { ref node_id , ref msg } = > {
assert_eq! ( node_id , & node_a . get_our_node_id ( ) ) ;
msg . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
} )
} ;
2019-11-05 18:51:05 -05:00
node_a . handle_shutdown ( & node_b . get_our_node_id ( ) , & shutdown_b ) ;
2019-01-23 16:46:44 -05:00
let ( as_update , bs_update ) = if close_inbound_first {
assert! ( node_a . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
2019-11-05 18:51:05 -05:00
node_a . handle_closing_signed ( & node_b . get_our_node_id ( ) , & closing_signed_b . unwrap ( ) ) ;
2019-01-23 16:46:44 -05:00
assert_eq! ( broadcaster_a . txn_broadcasted . lock ( ) . unwrap ( ) . len ( ) , 1 ) ;
tx_a = broadcaster_a . txn_broadcasted . lock ( ) . unwrap ( ) . remove ( 0 ) ;
let ( as_update , closing_signed_a ) = get_closing_signed_broadcast! ( node_a , node_b . get_our_node_id ( ) ) ;
2019-11-05 18:51:05 -05:00
node_b . handle_closing_signed ( & node_a . get_our_node_id ( ) , & closing_signed_a . unwrap ( ) ) ;
2019-01-23 16:46:44 -05:00
let ( bs_update , none_b ) = get_closing_signed_broadcast! ( node_b , node_a . get_our_node_id ( ) ) ;
assert! ( none_b . is_none ( ) ) ;
assert_eq! ( broadcaster_b . txn_broadcasted . lock ( ) . unwrap ( ) . len ( ) , 1 ) ;
tx_b = broadcaster_b . txn_broadcasted . lock ( ) . unwrap ( ) . remove ( 0 ) ;
( as_update , bs_update )
} else {
let closing_signed_a = get_event_msg! ( struct_a , MessageSendEvent ::SendClosingSigned , node_b . get_our_node_id ( ) ) ;
2019-11-05 18:51:05 -05:00
node_b . handle_closing_signed ( & node_a . get_our_node_id ( ) , & closing_signed_a ) ;
2019-01-23 16:46:44 -05:00
assert_eq! ( broadcaster_b . txn_broadcasted . lock ( ) . unwrap ( ) . len ( ) , 1 ) ;
tx_b = broadcaster_b . txn_broadcasted . lock ( ) . unwrap ( ) . remove ( 0 ) ;
let ( bs_update , closing_signed_b ) = get_closing_signed_broadcast! ( node_b , node_a . get_our_node_id ( ) ) ;
2019-11-05 18:51:05 -05:00
node_a . handle_closing_signed ( & node_b . get_our_node_id ( ) , & closing_signed_b . unwrap ( ) ) ;
2019-01-23 16:46:44 -05:00
let ( as_update , none_a ) = get_closing_signed_broadcast! ( node_a , node_b . get_our_node_id ( ) ) ;
assert! ( none_a . is_none ( ) ) ;
assert_eq! ( broadcaster_a . txn_broadcasted . lock ( ) . unwrap ( ) . len ( ) , 1 ) ;
tx_a = broadcaster_a . txn_broadcasted . lock ( ) . unwrap ( ) . remove ( 0 ) ;
( as_update , bs_update )
} ;
assert_eq! ( tx_a , tx_b ) ;
check_spends! ( tx_a , funding_tx ) ;
( as_update , bs_update , tx_a )
}
pub struct SendEvent {
pub node_id : PublicKey ,
pub msgs : Vec < msgs ::UpdateAddHTLC > ,
pub commitment_msg : msgs ::CommitmentSigned ,
}
impl SendEvent {
pub fn from_commitment_update ( node_id : PublicKey , updates : msgs ::CommitmentUpdate ) -> SendEvent {
assert! ( updates . update_fulfill_htlcs . is_empty ( ) ) ;
assert! ( updates . update_fail_htlcs . is_empty ( ) ) ;
assert! ( updates . update_fail_malformed_htlcs . is_empty ( ) ) ;
assert! ( updates . update_fee . is_none ( ) ) ;
SendEvent { node_id : node_id , msgs : updates . update_add_htlcs , commitment_msg : updates . commitment_signed }
}
pub fn from_event ( event : MessageSendEvent ) -> SendEvent {
match event {
MessageSendEvent ::UpdateHTLCs { node_id , updates } = > SendEvent ::from_commitment_update ( node_id , updates ) ,
_ = > panic! ( " Unexpected event type! " ) ,
}
}
2020-02-20 14:14:12 -05:00
pub fn from_node < ' a , ' b , ' c > ( node : & Node < ' a , ' b , ' c > ) -> SendEvent {
2019-01-23 16:46:44 -05:00
let mut events = node . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( events . len ( ) , 1 ) ;
SendEvent ::from_event ( events . pop ( ) . unwrap ( ) )
}
}
macro_rules ! commitment_signed_dance {
( $node_a : expr , $node_b : expr , $commitment_signed : expr , $fail_backwards : expr , true /* skip last step */ ) = > {
{
check_added_monitors! ( $node_a , 0 ) ;
assert! ( $node_a . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
2019-11-05 18:51:05 -05:00
$node_a . node . handle_commitment_signed ( & $node_b . node . get_our_node_id ( ) , & $commitment_signed ) ;
2019-01-23 16:46:44 -05:00
check_added_monitors! ( $node_a , 1 ) ;
commitment_signed_dance! ( $node_a , $node_b , ( ) , $fail_backwards , true , false ) ;
}
} ;
( $node_a : expr , $node_b : expr , ( ) , $fail_backwards : expr , true /* skip last step */ , true /* return extra message */ , true /* return last RAA */ ) = > {
{
let ( as_revoke_and_ack , as_commitment_signed ) = get_revoke_commit_msgs! ( $node_a , $node_b . node . get_our_node_id ( ) ) ;
check_added_monitors! ( $node_b , 0 ) ;
assert! ( $node_b . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
2019-11-05 18:51:05 -05:00
$node_b . node . handle_revoke_and_ack ( & $node_a . node . get_our_node_id ( ) , & as_revoke_and_ack ) ;
2019-01-23 16:46:44 -05:00
assert! ( $node_b . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
check_added_monitors! ( $node_b , 1 ) ;
2019-11-05 18:51:05 -05:00
$node_b . node . handle_commitment_signed ( & $node_a . node . get_our_node_id ( ) , & as_commitment_signed ) ;
2019-01-23 16:46:44 -05:00
let ( bs_revoke_and_ack , extra_msg_option ) = {
let events = $node_b . node . get_and_clear_pending_msg_events ( ) ;
assert! ( events . len ( ) < = 2 ) ;
( match events [ 0 ] {
MessageSendEvent ::SendRevokeAndACK { ref node_id , ref msg } = > {
assert_eq! ( * node_id , $node_a . node . get_our_node_id ( ) ) ;
( * msg ) . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
} , events . get ( 1 ) . map ( | e | e . clone ( ) ) )
} ;
check_added_monitors! ( $node_b , 1 ) ;
if $fail_backwards {
assert! ( $node_a . node . get_and_clear_pending_events ( ) . is_empty ( ) ) ;
assert! ( $node_a . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
}
( extra_msg_option , bs_revoke_and_ack )
}
} ;
( $node_a : expr , $node_b : expr , $commitment_signed : expr , $fail_backwards : expr , true /* skip last step */ , false /* return extra message */ , true /* return last RAA */ ) = > {
{
check_added_monitors! ( $node_a , 0 ) ;
assert! ( $node_a . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
2019-11-05 18:51:05 -05:00
$node_a . node . handle_commitment_signed ( & $node_b . node . get_our_node_id ( ) , & $commitment_signed ) ;
2019-01-23 16:46:44 -05:00
check_added_monitors! ( $node_a , 1 ) ;
let ( extra_msg_option , bs_revoke_and_ack ) = commitment_signed_dance! ( $node_a , $node_b , ( ) , $fail_backwards , true , true , true ) ;
assert! ( extra_msg_option . is_none ( ) ) ;
bs_revoke_and_ack
}
} ;
( $node_a : expr , $node_b : expr , ( ) , $fail_backwards : expr , true /* skip last step */ , true /* return extra message */ ) = > {
{
let ( extra_msg_option , bs_revoke_and_ack ) = commitment_signed_dance! ( $node_a , $node_b , ( ) , $fail_backwards , true , true , true ) ;
2019-11-05 18:51:05 -05:00
$node_a . node . handle_revoke_and_ack ( & $node_b . node . get_our_node_id ( ) , & bs_revoke_and_ack ) ;
2019-01-23 16:46:44 -05:00
check_added_monitors! ( $node_a , 1 ) ;
extra_msg_option
}
} ;
( $node_a : expr , $node_b : expr , ( ) , $fail_backwards : expr , true /* skip last step */ , false /* no extra message */ ) = > {
{
assert! ( commitment_signed_dance! ( $node_a , $node_b , ( ) , $fail_backwards , true , true ) . is_none ( ) ) ;
}
} ;
( $node_a : expr , $node_b : expr , $commitment_signed : expr , $fail_backwards : expr ) = > {
{
commitment_signed_dance! ( $node_a , $node_b , $commitment_signed , $fail_backwards , true ) ;
if $fail_backwards {
expect_pending_htlcs_forwardable! ( $node_a ) ;
check_added_monitors! ( $node_a , 1 ) ;
let channel_state = $node_a . node . channel_state . lock ( ) . unwrap ( ) ;
assert_eq! ( channel_state . pending_msg_events . len ( ) , 1 ) ;
if let MessageSendEvent ::UpdateHTLCs { ref node_id , .. } = channel_state . pending_msg_events [ 0 ] {
assert_ne! ( * node_id , $node_b . node . get_our_node_id ( ) ) ;
} else { panic! ( " Unexpected event " ) ; }
} else {
assert! ( $node_a . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
}
}
}
}
macro_rules ! get_payment_preimage_hash {
( $node : expr ) = > {
{
let payment_preimage = PaymentPreimage ( [ * $node . network_payment_count . borrow ( ) ; 32 ] ) ;
* $node . network_payment_count . borrow_mut ( ) + = 1 ;
let payment_hash = PaymentHash ( Sha256 ::hash ( & payment_preimage . 0 [ .. ] ) . into_inner ( ) ) ;
( payment_preimage , payment_hash )
}
}
}
2020-01-09 14:09:25 -05:00
macro_rules ! expect_pending_htlcs_forwardable_ignore {
2019-01-23 16:46:44 -05:00
( $node : expr ) = > { {
let events = $node . node . get_and_clear_pending_events ( ) ;
assert_eq! ( events . len ( ) , 1 ) ;
match events [ 0 ] {
Event ::PendingHTLCsForwardable { .. } = > { } ,
_ = > panic! ( " Unexpected event " ) ,
} ;
2020-01-09 14:09:25 -05:00
} }
}
macro_rules ! expect_pending_htlcs_forwardable {
( $node : expr ) = > { {
expect_pending_htlcs_forwardable_ignore! ( $node ) ;
2019-01-23 16:46:44 -05:00
$node . node . process_pending_htlc_forwards ( ) ;
} }
}
2019-03-04 15:36:05 -05:00
macro_rules ! expect_payment_received {
( $node : expr , $expected_payment_hash : expr , $expected_recv_value : expr ) = > {
let events = $node . node . get_and_clear_pending_events ( ) ;
assert_eq! ( events . len ( ) , 1 ) ;
match events [ 0 ] {
2020-01-02 01:23:48 -05:00
Event ::PaymentReceived { ref payment_hash , ref payment_secret , amt } = > {
2019-03-04 15:36:05 -05:00
assert_eq! ( $expected_payment_hash , * payment_hash ) ;
2020-01-02 01:23:48 -05:00
assert_eq! ( None , * payment_secret ) ;
2019-03-04 15:36:05 -05:00
assert_eq! ( $expected_recv_value , amt ) ;
} ,
_ = > panic! ( " Unexpected event " ) ,
}
}
}
macro_rules ! expect_payment_sent {
( $node : expr , $expected_payment_preimage : expr ) = > {
let events = $node . node . get_and_clear_pending_events ( ) ;
assert_eq! ( events . len ( ) , 1 ) ;
match events [ 0 ] {
Event ::PaymentSent { ref payment_preimage } = > {
assert_eq! ( $expected_payment_preimage , * payment_preimage ) ;
} ,
_ = > panic! ( " Unexpected event " ) ,
}
}
}
2020-02-18 17:57:15 -05:00
macro_rules ! expect_payment_failed {
2020-04-20 15:46:35 -04:00
( $node : expr , $expected_payment_hash : expr , $rejected_by_dest : expr $(, $expected_error_code : expr , $expected_error_data : expr ) * ) = > {
2020-02-18 17:57:15 -05:00
let events = $node . node . get_and_clear_pending_events ( ) ;
assert_eq! ( events . len ( ) , 1 ) ;
match events [ 0 ] {
2020-04-20 15:46:35 -04:00
Event ::PaymentFailed { ref payment_hash , rejected_by_dest , ref error_code , ref error_data } = > {
2020-02-18 17:57:15 -05:00
assert_eq! ( * payment_hash , $expected_payment_hash ) ;
assert_eq! ( rejected_by_dest , $rejected_by_dest ) ;
2020-04-20 15:46:35 -04:00
assert! ( error_code . is_some ( ) ) ;
assert! ( error_data . is_some ( ) ) ;
$(
assert_eq! ( error_code . unwrap ( ) , $expected_error_code ) ;
assert_eq! ( & error_data . as_ref ( ) . unwrap ( ) [ .. ] , $expected_error_data ) ;
) *
2020-02-18 17:57:15 -05:00
} ,
_ = > panic! ( " Unexpected event " ) ,
}
}
}
2020-01-06 20:30:08 -05:00
pub fn send_along_route_with_secret < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , route : Route , expected_paths : & [ & [ & Node < ' a , ' b , ' c > ] ] , recv_value : u64 , our_payment_hash : PaymentHash , our_payment_secret : Option < PaymentSecret > ) {
2020-04-07 13:36:58 -04:00
origin_node . node . send_payment ( & route , our_payment_hash , & our_payment_secret ) . unwrap ( ) ;
2020-01-06 20:30:08 -05:00
check_added_monitors! ( origin_node , expected_paths . len ( ) ) ;
2020-03-19 00:34:15 -04:00
pass_along_route ( origin_node , expected_paths , recv_value , our_payment_hash , our_payment_secret ) ;
}
2020-01-06 20:30:08 -05:00
2020-03-19 00:34:15 -04:00
pub fn pass_along_path < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_path : & [ & Node < ' a , ' b , ' c > ] , recv_value : u64 , our_payment_hash : PaymentHash , our_payment_secret : Option < PaymentSecret > , ev : MessageSendEvent , payment_received_expected : bool ) {
let mut payment_event = SendEvent ::from_event ( ev ) ;
let mut prev_node = origin_node ;
for ( idx , & node ) in expected_path . iter ( ) . enumerate ( ) {
assert_eq! ( node . node . get_our_node_id ( ) , payment_event . node_id ) ;
node . node . handle_update_add_htlc ( & prev_node . node . get_our_node_id ( ) , & payment_event . msgs [ 0 ] ) ;
check_added_monitors! ( node , 0 ) ;
commitment_signed_dance! ( node , prev_node , payment_event . commitment_msg , false ) ;
expect_pending_htlcs_forwardable! ( node ) ;
if idx = = expected_path . len ( ) - 1 {
let events_2 = node . node . get_and_clear_pending_events ( ) ;
if payment_received_expected {
assert_eq! ( events_2 . len ( ) , 1 ) ;
match events_2 [ 0 ] {
Event ::PaymentReceived { ref payment_hash , ref payment_secret , amt } = > {
assert_eq! ( our_payment_hash , * payment_hash ) ;
assert_eq! ( our_payment_secret , * payment_secret ) ;
assert_eq! ( amt , recv_value ) ;
} ,
_ = > panic! ( " Unexpected event " ) ,
2020-01-06 20:30:08 -05:00
}
} else {
2020-03-19 00:34:15 -04:00
assert! ( events_2 . is_empty ( ) ) ;
2019-01-23 16:46:44 -05:00
}
2020-03-19 00:34:15 -04:00
} else {
let mut events_2 = node . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( events_2 . len ( ) , 1 ) ;
check_added_monitors! ( node , 1 ) ;
payment_event = SendEvent ::from_event ( events_2 . remove ( 0 ) ) ;
assert_eq! ( payment_event . msgs . len ( ) , 1 ) ;
2020-01-06 20:30:08 -05:00
}
2020-03-19 00:34:15 -04:00
prev_node = node ;
}
}
pub fn pass_along_route < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & [ & Node < ' a , ' b , ' c > ] ] , recv_value : u64 , our_payment_hash : PaymentHash , our_payment_secret : Option < PaymentSecret > ) {
let mut events = origin_node . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( events . len ( ) , expected_route . len ( ) ) ;
for ( path_idx , ( ev , expected_path ) ) in events . drain ( .. ) . zip ( expected_route . iter ( ) ) . enumerate ( ) {
// Once we've gotten through all the HTLCs, the last one should result in a
// PaymentReceived (but each previous one should not!), .
let expect_payment = path_idx = = expected_route . len ( ) - 1 ;
pass_along_path ( origin_node , expected_path , recv_value , our_payment_hash . clone ( ) , our_payment_secret , ev , expect_payment ) ;
2019-01-23 16:46:44 -05:00
}
}
2020-01-02 01:23:48 -05:00
pub fn send_along_route_with_hash < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , route : Route , expected_route : & [ & Node < ' a , ' b , ' c > ] , recv_value : u64 , our_payment_hash : PaymentHash ) {
2020-01-06 20:30:08 -05:00
send_along_route_with_secret ( origin_node , route , & [ expected_route ] , recv_value , our_payment_hash , None ) ;
2020-01-02 01:23:48 -05:00
}
2020-02-20 14:14:12 -05:00
pub fn send_along_route < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , route : Route , expected_route : & [ & Node < ' a , ' b , ' c > ] , recv_value : u64 ) -> ( PaymentPreimage , PaymentHash ) {
2019-01-23 16:46:44 -05:00
let ( our_payment_preimage , our_payment_hash ) = get_payment_preimage_hash! ( origin_node ) ;
send_along_route_with_hash ( origin_node , route , expected_route , recv_value , our_payment_hash ) ;
( our_payment_preimage , our_payment_hash )
}
2020-01-06 20:30:08 -05:00
pub fn claim_payment_along_route_with_secret < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_paths : & [ & [ & Node < ' a , ' b , ' c > ] ] , skip_last : bool , our_payment_preimage : PaymentPreimage , our_payment_secret : Option < PaymentSecret > , expected_amount : u64 ) {
for path in expected_paths . iter ( ) {
assert_eq! ( path . last ( ) . unwrap ( ) . node . get_our_node_id ( ) , expected_paths [ 0 ] . last ( ) . unwrap ( ) . node . get_our_node_id ( ) ) ;
}
assert! ( expected_paths [ 0 ] . last ( ) . unwrap ( ) . node . claim_funds ( our_payment_preimage , & our_payment_secret , expected_amount ) ) ;
check_added_monitors! ( expected_paths [ 0 ] . last ( ) . unwrap ( ) , expected_paths . len ( ) ) ;
macro_rules ! msgs_from_ev {
( $ev : expr ) = > {
match $ev {
& MessageSendEvent ::UpdateHTLCs { ref node_id , updates : msgs ::CommitmentUpdate { ref update_add_htlcs , ref update_fulfill_htlcs , ref update_fail_htlcs , ref update_fail_malformed_htlcs , ref update_fee , ref commitment_signed } } = > {
assert! ( update_add_htlcs . is_empty ( ) ) ;
assert_eq! ( update_fulfill_htlcs . len ( ) , 1 ) ;
assert! ( update_fail_htlcs . is_empty ( ) ) ;
assert! ( update_fail_malformed_htlcs . is_empty ( ) ) ;
assert! ( update_fee . is_none ( ) ) ;
( ( update_fulfill_htlcs [ 0 ] . clone ( ) , commitment_signed . clone ( ) ) , node_id . clone ( ) )
} ,
_ = > panic! ( " Unexpected event " ) ,
2019-01-23 16:46:44 -05:00
}
}
}
2020-01-06 20:30:08 -05:00
let mut per_path_msgs : Vec < ( ( msgs ::UpdateFulfillHTLC , msgs ::CommitmentSigned ) , PublicKey ) > = Vec ::with_capacity ( expected_paths . len ( ) ) ;
let events = expected_paths [ 0 ] . last ( ) . unwrap ( ) . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( events . len ( ) , expected_paths . len ( ) ) ;
for ev in events . iter ( ) {
per_path_msgs . push ( msgs_from_ev! ( ev ) ) ;
}
2019-01-23 16:46:44 -05:00
2020-01-06 20:30:08 -05:00
for ( expected_route , ( path_msgs , next_hop ) ) in expected_paths . iter ( ) . zip ( per_path_msgs . drain ( .. ) ) {
let mut next_msgs = Some ( path_msgs ) ;
let mut expected_next_node = next_hop ;
macro_rules ! last_update_fulfill_dance {
( $node : expr , $prev_node : expr ) = > {
{
$node . node . handle_update_fulfill_htlc ( & $prev_node . node . get_our_node_id ( ) , & next_msgs . as_ref ( ) . unwrap ( ) . 0 ) ;
check_added_monitors! ( $node , 0 ) ;
assert! ( $node . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
commitment_signed_dance! ( $node , $prev_node , next_msgs . as_ref ( ) . unwrap ( ) . 1 , false ) ;
}
2019-01-23 16:46:44 -05:00
}
}
2020-01-06 20:30:08 -05:00
macro_rules ! mid_update_fulfill_dance {
( $node : expr , $prev_node : expr , $new_msgs : expr ) = > {
{
$node . node . handle_update_fulfill_htlc ( & $prev_node . node . get_our_node_id ( ) , & next_msgs . as_ref ( ) . unwrap ( ) . 0 ) ;
check_added_monitors! ( $node , 1 ) ;
let new_next_msgs = if $new_msgs {
let events = $node . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( events . len ( ) , 1 ) ;
let ( res , nexthop ) = msgs_from_ev! ( & events [ 0 ] ) ;
expected_next_node = nexthop ;
Some ( res )
} else {
assert! ( $node . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
None
} ;
commitment_signed_dance! ( $node , $prev_node , next_msgs . as_ref ( ) . unwrap ( ) . 1 , false ) ;
next_msgs = new_next_msgs ;
}
2019-01-23 16:46:44 -05:00
}
}
2020-01-06 20:30:08 -05:00
let mut prev_node = expected_route . last ( ) . unwrap ( ) ;
for ( idx , node ) in expected_route . iter ( ) . rev ( ) . enumerate ( ) . skip ( 1 ) {
assert_eq! ( expected_next_node , node . node . get_our_node_id ( ) ) ;
let update_next_msgs = ! skip_last | | idx ! = expected_route . len ( ) - 1 ;
if next_msgs . is_some ( ) {
mid_update_fulfill_dance! ( node , prev_node , update_next_msgs ) ;
} else {
assert! ( ! update_next_msgs ) ;
assert! ( node . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
}
if ! skip_last & & idx = = expected_route . len ( ) - 1 {
assert_eq! ( expected_next_node , origin_node . node . get_our_node_id ( ) ) ;
}
2019-01-23 16:46:44 -05:00
2020-01-06 20:30:08 -05:00
prev_node = node ;
}
2019-01-23 16:46:44 -05:00
2020-01-06 20:30:08 -05:00
if ! skip_last {
last_update_fulfill_dance! ( origin_node , expected_route . first ( ) . unwrap ( ) ) ;
expect_payment_sent! ( origin_node , our_payment_preimage ) ;
}
2019-01-23 16:46:44 -05:00
}
}
2020-01-02 01:23:48 -05:00
pub fn claim_payment_along_route < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , skip_last : bool , our_payment_preimage : PaymentPreimage , expected_amount : u64 ) {
2020-01-06 20:30:08 -05:00
claim_payment_along_route_with_secret ( origin_node , & [ expected_route ] , skip_last , our_payment_preimage , None , expected_amount ) ;
2020-01-02 01:23:48 -05:00
}
2020-02-20 14:14:12 -05:00
pub fn claim_payment < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , our_payment_preimage : PaymentPreimage , expected_amount : u64 ) {
2019-11-14 18:50:24 -05:00
claim_payment_along_route ( origin_node , expected_route , false , our_payment_preimage , expected_amount ) ;
2019-01-23 16:46:44 -05:00
}
pub const TEST_FINAL_CLTV : u32 = 32 ;
2020-02-20 14:14:12 -05:00
pub fn route_payment < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , recv_value : u64 ) -> ( PaymentPreimage , PaymentHash ) {
2020-05-02 15:05:04 -04:00
let net_graph_msg_handler = & origin_node . net_graph_msg_handler ;
2020-03-02 12:55:53 -05:00
let logger = test_utils ::TestLogger ::new ( ) ;
2020-06-11 15:40:28 -04:00
let route = get_route ( & origin_node . node . get_our_node_id ( ) , & net_graph_msg_handler . network_graph . read ( ) . unwrap ( ) , & expected_route . last ( ) . unwrap ( ) . node . get_our_node_id ( ) , None , & Vec ::new ( ) , recv_value , TEST_FINAL_CLTV , & logger ) . unwrap ( ) ;
2020-01-03 19:31:40 -05:00
assert_eq! ( route . paths . len ( ) , 1 ) ;
assert_eq! ( route . paths [ 0 ] . len ( ) , expected_route . len ( ) ) ;
for ( node , hop ) in expected_route . iter ( ) . zip ( route . paths [ 0 ] . iter ( ) ) {
2019-01-23 16:46:44 -05:00
assert_eq! ( hop . pubkey , node . node . get_our_node_id ( ) ) ;
}
send_along_route ( origin_node , route , expected_route , recv_value )
}
2020-02-20 14:14:12 -05:00
pub fn route_over_limit < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , recv_value : u64 ) {
2020-03-02 12:55:53 -05:00
let logger = test_utils ::TestLogger ::new ( ) ;
2020-05-02 15:05:04 -04:00
let net_graph_msg_handler = & origin_node . net_graph_msg_handler ;
2020-06-11 15:40:28 -04:00
let route = get_route ( & origin_node . node . get_our_node_id ( ) , & net_graph_msg_handler . network_graph . read ( ) . unwrap ( ) , & expected_route . last ( ) . unwrap ( ) . node . get_our_node_id ( ) , None , & Vec ::new ( ) , recv_value , TEST_FINAL_CLTV , & logger ) . unwrap ( ) ;
2020-01-03 19:31:40 -05:00
assert_eq! ( route . paths . len ( ) , 1 ) ;
assert_eq! ( route . paths [ 0 ] . len ( ) , expected_route . len ( ) ) ;
for ( node , hop ) in expected_route . iter ( ) . zip ( route . paths [ 0 ] . iter ( ) ) {
2019-01-23 16:46:44 -05:00
assert_eq! ( hop . pubkey , node . node . get_our_node_id ( ) ) ;
}
let ( _ , our_payment_hash ) = get_payment_preimage_hash! ( origin_node ) ;
2020-07-13 13:16:32 +09:00
unwrap_send_err! ( origin_node . node . send_payment ( & route , our_payment_hash , & None ) , true , APIError ::ChannelUnavailable { ref err } ,
assert! ( err . contains ( " Cannot send value that would put us over the max HTLC value in flight our peer will accept " ) ) ) ;
2019-01-23 16:46:44 -05:00
}
2020-02-20 14:14:12 -05:00
pub fn send_payment < ' a , ' b , ' c > ( origin : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , recv_value : u64 , expected_value : u64 ) {
2019-01-23 16:46:44 -05:00
let our_payment_preimage = route_payment ( & origin , expected_route , recv_value ) . 0 ;
2019-11-14 18:50:24 -05:00
claim_payment ( & origin , expected_route , our_payment_preimage , expected_value ) ;
2019-01-23 16:46:44 -05:00
}
2020-02-20 14:14:12 -05:00
pub fn fail_payment_along_route < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , skip_last : bool , our_payment_hash : PaymentHash ) {
2020-01-02 01:23:48 -05:00
assert! ( expected_route . last ( ) . unwrap ( ) . node . fail_htlc_backwards ( & our_payment_hash , & None ) ) ;
2019-01-23 16:46:44 -05:00
expect_pending_htlcs_forwardable! ( expected_route . last ( ) . unwrap ( ) ) ;
check_added_monitors! ( expected_route . last ( ) . unwrap ( ) , 1 ) ;
let mut next_msgs : Option < ( msgs ::UpdateFailHTLC , msgs ::CommitmentSigned ) > = None ;
macro_rules ! update_fail_dance {
( $node : expr , $prev_node : expr , $last_node : expr ) = > {
{
2019-11-05 18:51:05 -05:00
$node . node . handle_update_fail_htlc ( & $prev_node . node . get_our_node_id ( ) , & next_msgs . as_ref ( ) . unwrap ( ) . 0 ) ;
2019-01-23 16:46:44 -05:00
commitment_signed_dance! ( $node , $prev_node , next_msgs . as_ref ( ) . unwrap ( ) . 1 , ! $last_node ) ;
if skip_last & & $last_node {
expect_pending_htlcs_forwardable! ( $node ) ;
}
}
}
}
let mut expected_next_node = expected_route . last ( ) . unwrap ( ) . node . get_our_node_id ( ) ;
let mut prev_node = expected_route . last ( ) . unwrap ( ) ;
for ( idx , node ) in expected_route . iter ( ) . rev ( ) . enumerate ( ) {
assert_eq! ( expected_next_node , node . node . get_our_node_id ( ) ) ;
if next_msgs . is_some ( ) {
// We may be the "last node" for the purpose of the commitment dance if we're
// skipping the last node (implying it is disconnected) and we're the
// second-to-last node!
update_fail_dance! ( node , prev_node , skip_last & & idx = = expected_route . len ( ) - 1 ) ;
}
let events = node . node . get_and_clear_pending_msg_events ( ) ;
if ! skip_last | | idx ! = expected_route . len ( ) - 1 {
assert_eq! ( events . len ( ) , 1 ) ;
match events [ 0 ] {
MessageSendEvent ::UpdateHTLCs { ref node_id , updates : msgs ::CommitmentUpdate { ref update_add_htlcs , ref update_fulfill_htlcs , ref update_fail_htlcs , ref update_fail_malformed_htlcs , ref update_fee , ref commitment_signed } } = > {
assert! ( update_add_htlcs . is_empty ( ) ) ;
assert! ( update_fulfill_htlcs . is_empty ( ) ) ;
assert_eq! ( update_fail_htlcs . len ( ) , 1 ) ;
assert! ( update_fail_malformed_htlcs . is_empty ( ) ) ;
assert! ( update_fee . is_none ( ) ) ;
expected_next_node = node_id . clone ( ) ;
next_msgs = Some ( ( update_fail_htlcs [ 0 ] . clone ( ) , commitment_signed . clone ( ) ) ) ;
} ,
_ = > panic! ( " Unexpected event " ) ,
}
} else {
assert! ( events . is_empty ( ) ) ;
}
if ! skip_last & & idx = = expected_route . len ( ) - 1 {
assert_eq! ( expected_next_node , origin_node . node . get_our_node_id ( ) ) ;
}
prev_node = node ;
}
if ! skip_last {
update_fail_dance! ( origin_node , expected_route . first ( ) . unwrap ( ) , true ) ;
let events = origin_node . node . get_and_clear_pending_events ( ) ;
assert_eq! ( events . len ( ) , 1 ) ;
match events [ 0 ] {
Event ::PaymentFailed { payment_hash , rejected_by_dest , .. } = > {
assert_eq! ( payment_hash , our_payment_hash ) ;
assert! ( rejected_by_dest ) ;
} ,
_ = > panic! ( " Unexpected event " ) ,
}
}
}
2020-02-20 14:14:12 -05:00
pub fn fail_payment < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , our_payment_hash : PaymentHash ) {
2019-01-23 16:46:44 -05:00
fail_payment_along_route ( origin_node , expected_route , false , our_payment_hash ) ;
}
2020-02-20 14:14:12 -05:00
pub fn create_chanmon_cfgs ( node_count : usize ) -> Vec < TestChanMonCfg > {
let mut chan_mon_cfgs = Vec ::new ( ) ;
2020-03-02 12:55:53 -05:00
for i in 0 .. node_count {
2020-03-09 19:56:42 -04:00
let tx_broadcaster = test_utils ::TestBroadcaster { txn_broadcasted : Mutex ::new ( Vec ::new ( ) ) } ;
2020-02-27 11:33:03 -05:00
let fee_estimator = test_utils ::TestFeeEstimator { sat_per_kw : 253 } ;
2020-03-02 12:55:53 -05:00
let chain_monitor = chaininterface ::ChainWatchInterfaceUtil ::new ( Network ::Testnet ) ;
let logger = test_utils ::TestLogger ::with_id ( format! ( " node {} " , i ) ) ;
chan_mon_cfgs . push ( TestChanMonCfg { tx_broadcaster , fee_estimator , chain_monitor , logger } ) ;
2020-02-20 14:14:12 -05:00
}
chan_mon_cfgs
}
pub fn create_node_cfgs < ' a > ( node_count : usize , chanmon_cfgs : & ' a Vec < TestChanMonCfg > ) -> Vec < NodeCfg < ' a > > {
2019-01-23 16:46:44 -05:00
let mut nodes = Vec ::new ( ) ;
for i in 0 .. node_count {
2020-06-17 08:29:30 -07:00
let seed = [ i as u8 ; 32 ] ;
2020-03-02 12:55:53 -05:00
let keys_manager = test_utils ::TestKeysInterface ::new ( & seed , Network ::Testnet ) ;
let chan_monitor = test_utils ::TestChannelMonitor ::new ( & chanmon_cfgs [ i ] . chain_monitor , & chanmon_cfgs [ i ] . tx_broadcaster , & chanmon_cfgs [ i ] . logger , & chanmon_cfgs [ i ] . fee_estimator ) ;
nodes . push ( NodeCfg { chain_monitor : & chanmon_cfgs [ i ] . chain_monitor , logger : & chanmon_cfgs [ i ] . logger , tx_broadcaster : & chanmon_cfgs [ i ] . tx_broadcaster , fee_estimator : & chanmon_cfgs [ i ] . fee_estimator , chan_monitor , keys_manager , node_seed : seed } ) ;
2020-01-16 13:26:38 -05:00
}
nodes
}
2020-03-02 12:55:53 -05:00
pub fn create_node_chanmgrs < ' a , ' b > ( node_count : usize , cfgs : & ' a Vec < NodeCfg < ' b > > , node_config : & [ Option < UserConfig > ] ) -> Vec < ChannelManager < EnforcingChannelKeys , & ' a TestChannelMonitor < ' b > , & ' b test_utils ::TestBroadcaster , & ' a test_utils ::TestKeysInterface , & ' b test_utils ::TestFeeEstimator , & ' b test_utils ::TestLogger > > {
2020-01-16 13:26:38 -05:00
let mut chanmgrs = Vec ::new ( ) ;
for i in 0 .. node_count {
2019-10-18 14:19:49 +01:00
let mut default_config = UserConfig ::default ( ) ;
2019-07-11 14:30:11 -04:00
default_config . channel_options . announced_channel = true ;
default_config . peer_channel_config_limits . force_announced_channel_preference = false ;
2020-03-10 13:03:10 -04:00
default_config . own_channel_config . our_htlc_minimum_msat = 1000 ; // sanitization being done by the sender, to exerce receiver logic we need to lift of limit
2020-05-12 13:34:00 -04:00
let node = ChannelManager ::new ( Network ::Testnet , cfgs [ i ] . fee_estimator , & cfgs [ i ] . chan_monitor , cfgs [ i ] . tx_broadcaster , cfgs [ i ] . logger . clone ( ) , & cfgs [ i ] . keys_manager , if node_config [ i ] . is_some ( ) { node_config [ i ] . clone ( ) . unwrap ( ) } else { default_config } , 0 ) ;
2020-01-16 13:26:38 -05:00
chanmgrs . push ( node ) ;
}
chanmgrs
}
2020-03-02 12:55:53 -05:00
pub fn create_network < ' a , ' b : ' a , ' c : ' b > ( node_count : usize , cfgs : & ' b Vec < NodeCfg < ' c > > , chan_mgrs : & ' a Vec < ChannelManager < EnforcingChannelKeys , & ' b TestChannelMonitor < ' c > , & ' c test_utils ::TestBroadcaster , & ' b test_utils ::TestKeysInterface , & ' c test_utils ::TestFeeEstimator , & ' c test_utils ::TestLogger > > ) -> Vec < Node < ' a , ' b , ' c > > {
2020-01-16 13:26:38 -05:00
let mut nodes = Vec ::new ( ) ;
let chan_count = Rc ::new ( RefCell ::new ( 0 ) ) ;
let payment_count = Rc ::new ( RefCell ::new ( 0 ) ) ;
for i in 0 .. node_count {
2020-06-16 15:10:17 -07:00
let block_notifier = chaininterface ::BlockNotifier ::new ( ) ;
2020-01-16 13:26:38 -05:00
block_notifier . register_listener ( & cfgs [ i ] . chan_monitor . simple_monitor as & chaininterface ::ChainListener ) ;
block_notifier . register_listener ( & chan_mgrs [ i ] as & chaininterface ::ChainListener ) ;
2020-03-02 12:55:53 -05:00
let net_graph_msg_handler = NetGraphMsgHandler ::new ( cfgs [ i ] . chain_monitor , cfgs [ i ] . logger ) ;
nodes . push ( Node { chain_monitor : & cfgs [ i ] . chain_monitor , block_notifier ,
2020-05-11 18:36:58 -04:00
tx_broadcaster : cfgs [ i ] . tx_broadcaster , chan_monitor : & cfgs [ i ] . chan_monitor ,
keys_manager : & cfgs [ i ] . keys_manager , node : & chan_mgrs [ i ] , net_graph_msg_handler ,
node_seed : cfgs [ i ] . node_seed , network_chan_count : chan_count . clone ( ) ,
2020-03-02 12:55:53 -05:00
network_payment_count : payment_count . clone ( ) , logger : cfgs [ i ] . logger ,
2020-01-16 13:26:38 -05:00
} )
2019-01-23 16:46:44 -05:00
}
nodes
}
2020-01-14 13:47:01 -05:00
pub const ACCEPTED_HTLC_SCRIPT_WEIGHT : usize = 138 ; //Here we have a diff due to HTLC CLTV expiry being < 2^15 in test
pub const OFFERED_HTLC_SCRIPT_WEIGHT : usize = 133 ;
2019-01-23 16:46:44 -05:00
#[ derive(PartialEq) ]
pub enum HTLCType { NONE , TIMEOUT , SUCCESS }
/// Tests that the given node has broadcast transactions for the given Channel
///
2020-09-06 19:51:21 -04:00
/// First checks that the latest holder commitment tx has been broadcast, unless an explicit
2019-01-23 16:46:44 -05:00
/// commitment_tx is provided, which may be used to test that a remote commitment tx was
/// broadcast and the revoked outputs were claimed.
///
/// Next tests that there is (or is not) a transaction that spends the commitment transaction
/// that appears to be the type of HTLC transaction specified in has_htlc_tx.
///
/// All broadcast transactions must be accounted for in one of the above three types of we'll
/// also fail.
2020-02-20 14:14:12 -05:00
pub fn test_txn_broadcast < ' a , ' b , ' c > ( node : & Node < ' a , ' b , ' c > , chan : & ( msgs ::ChannelUpdate , msgs ::ChannelUpdate , [ u8 ; 32 ] , Transaction ) , commitment_tx : Option < Transaction > , has_htlc_tx : HTLCType ) -> Vec < Transaction > {
2019-01-23 16:46:44 -05:00
let mut node_txn = node . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) ;
assert! ( node_txn . len ( ) > = if commitment_tx . is_some ( ) { 0 } else { 1 } + if has_htlc_tx = = HTLCType ::NONE { 0 } else { 1 } ) ;
let mut res = Vec ::with_capacity ( 2 ) ;
node_txn . retain ( | tx | {
if tx . input . len ( ) = = 1 & & tx . input [ 0 ] . previous_output . txid = = chan . 3. txid ( ) {
2020-03-04 17:36:12 -05:00
check_spends! ( tx , chan . 3 ) ;
2019-01-23 16:46:44 -05:00
if commitment_tx . is_none ( ) {
res . push ( tx . clone ( ) ) ;
}
false
} else { true }
} ) ;
if let Some ( explicit_tx ) = commitment_tx {
res . push ( explicit_tx . clone ( ) ) ;
}
assert_eq! ( res . len ( ) , 1 ) ;
if has_htlc_tx ! = HTLCType ::NONE {
node_txn . retain ( | tx | {
if tx . input . len ( ) = = 1 & & tx . input [ 0 ] . previous_output . txid = = res [ 0 ] . txid ( ) {
2020-03-04 17:36:12 -05:00
check_spends! ( tx , res [ 0 ] ) ;
2019-01-23 16:46:44 -05:00
if has_htlc_tx = = HTLCType ::TIMEOUT {
assert! ( tx . lock_time ! = 0 ) ;
} else {
assert! ( tx . lock_time = = 0 ) ;
}
res . push ( tx . clone ( ) ) ;
false
} else { true }
} ) ;
assert! ( res . len ( ) = = 2 | | res . len ( ) = = 3 ) ;
if res . len ( ) = = 3 {
assert_eq! ( res [ 1 ] , res [ 2 ] ) ;
}
}
assert! ( node_txn . is_empty ( ) ) ;
res
}
/// Tests that the given node has broadcast a claim transaction against the provided revoked
/// HTLC transaction.
2020-02-20 14:14:12 -05:00
pub fn test_revoked_htlc_claim_txn_broadcast < ' a , ' b , ' c > ( node : & Node < ' a , ' b , ' c > , revoked_tx : Transaction , commitment_revoked_tx : Transaction ) {
2019-01-23 16:46:44 -05:00
let mut node_txn = node . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) ;
2020-02-26 18:18:27 -05:00
// We may issue multiple claiming transaction on revoked outputs due to block rescan
// for revoked htlc outputs
if node_txn . len ( ) ! = 1 & & node_txn . len ( ) ! = 2 & & node_txn . len ( ) ! = 3 { assert! ( false ) ; }
2019-01-23 16:46:44 -05:00
node_txn . retain ( | tx | {
if tx . input . len ( ) = = 1 & & tx . input [ 0 ] . previous_output . txid = = revoked_tx . txid ( ) {
2019-12-09 16:59:08 -05:00
check_spends! ( tx , revoked_tx ) ;
2019-01-23 16:46:44 -05:00
false
} else { true }
} ) ;
2019-12-09 16:59:08 -05:00
node_txn . retain ( | tx | {
check_spends! ( tx , commitment_revoked_tx ) ;
false
} ) ;
2019-01-23 16:46:44 -05:00
assert! ( node_txn . is_empty ( ) ) ;
}
2020-02-20 14:14:12 -05:00
pub fn check_preimage_claim < ' a , ' b , ' c > ( node : & Node < ' a , ' b , ' c > , prev_txn : & Vec < Transaction > ) -> Vec < Transaction > {
2019-01-23 16:46:44 -05:00
let mut node_txn = node . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) ;
assert! ( node_txn . len ( ) > = 1 ) ;
assert_eq! ( node_txn [ 0 ] . input . len ( ) , 1 ) ;
let mut found_prev = false ;
for tx in prev_txn {
if node_txn [ 0 ] . input [ 0 ] . previous_output . txid = = tx . txid ( ) {
2020-03-04 17:36:12 -05:00
check_spends! ( node_txn [ 0 ] , tx ) ;
2019-01-23 16:46:44 -05:00
assert! ( node_txn [ 0 ] . input [ 0 ] . witness [ 2 ] . len ( ) > 106 ) ; // must spend an htlc output
assert_eq! ( tx . input . len ( ) , 1 ) ; // must spend a commitment tx
found_prev = true ;
break ;
}
}
assert! ( found_prev ) ;
let mut res = Vec ::new ( ) ;
mem ::swap ( & mut * node_txn , & mut res ) ;
res
}
2020-02-20 14:14:12 -05:00
pub fn get_announce_close_broadcast_events < ' a , ' b , ' c > ( nodes : & Vec < Node < ' a , ' b , ' c > > , a : usize , b : usize ) {
2019-01-23 16:46:44 -05:00
let events_1 = nodes [ a ] . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( events_1 . len ( ) , 1 ) ;
let as_update = match events_1 [ 0 ] {
MessageSendEvent ::BroadcastChannelUpdate { ref msg } = > {
msg . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
} ;
let events_2 = nodes [ b ] . node . get_and_clear_pending_msg_events ( ) ;
assert_eq! ( events_2 . len ( ) , 1 ) ;
let bs_update = match events_2 [ 0 ] {
MessageSendEvent ::BroadcastChannelUpdate { ref msg } = > {
msg . clone ( )
} ,
_ = > panic! ( " Unexpected event " ) ,
} ;
for node in nodes {
2020-05-02 15:05:04 -04:00
node . net_graph_msg_handler . handle_channel_update ( & as_update ) . unwrap ( ) ;
node . net_graph_msg_handler . handle_channel_update ( & bs_update ) . unwrap ( ) ;
2019-01-23 16:46:44 -05:00
}
}
macro_rules ! get_channel_value_stat {
( $node : expr , $channel_id : expr ) = > { {
let chan_lock = $node . node . channel_state . lock ( ) . unwrap ( ) ;
let chan = chan_lock . by_id . get ( & $channel_id ) . unwrap ( ) ;
chan . get_value_stat ( )
} }
}
macro_rules ! get_chan_reestablish_msgs {
( $src_node : expr , $dst_node : expr ) = > {
{
let mut res = Vec ::with_capacity ( 1 ) ;
for msg in $src_node . node . get_and_clear_pending_msg_events ( ) {
if let MessageSendEvent ::SendChannelReestablish { ref node_id , ref msg } = msg {
assert_eq! ( * node_id , $dst_node . node . get_our_node_id ( ) ) ;
res . push ( msg . clone ( ) ) ;
} else {
panic! ( " Unexpected event " )
}
}
res
}
}
}
macro_rules ! handle_chan_reestablish_msgs {
( $src_node : expr , $dst_node : expr ) = > {
{
let msg_events = $src_node . node . get_and_clear_pending_msg_events ( ) ;
let mut idx = 0 ;
let funding_locked = if let Some ( & MessageSendEvent ::SendFundingLocked { ref node_id , ref msg } ) = msg_events . get ( 0 ) {
idx + = 1 ;
assert_eq! ( * node_id , $dst_node . node . get_our_node_id ( ) ) ;
Some ( msg . clone ( ) )
} else {
None
} ;
let mut revoke_and_ack = None ;
let mut commitment_update = None ;
let order = if let Some ( ev ) = msg_events . get ( idx ) {
idx + = 1 ;
match ev {
& MessageSendEvent ::SendRevokeAndACK { ref node_id , ref msg } = > {
assert_eq! ( * node_id , $dst_node . node . get_our_node_id ( ) ) ;
revoke_and_ack = Some ( msg . clone ( ) ) ;
RAACommitmentOrder ::RevokeAndACKFirst
} ,
& MessageSendEvent ::UpdateHTLCs { ref node_id , ref updates } = > {
assert_eq! ( * node_id , $dst_node . node . get_our_node_id ( ) ) ;
commitment_update = Some ( updates . clone ( ) ) ;
RAACommitmentOrder ::CommitmentFirst
} ,
_ = > panic! ( " Unexpected event " ) ,
}
} else {
RAACommitmentOrder ::CommitmentFirst
} ;
if let Some ( ev ) = msg_events . get ( idx ) {
match ev {
& MessageSendEvent ::SendRevokeAndACK { ref node_id , ref msg } = > {
assert_eq! ( * node_id , $dst_node . node . get_our_node_id ( ) ) ;
assert! ( revoke_and_ack . is_none ( ) ) ;
revoke_and_ack = Some ( msg . clone ( ) ) ;
} ,
& MessageSendEvent ::UpdateHTLCs { ref node_id , ref updates } = > {
assert_eq! ( * node_id , $dst_node . node . get_our_node_id ( ) ) ;
assert! ( commitment_update . is_none ( ) ) ;
commitment_update = Some ( updates . clone ( ) ) ;
} ,
_ = > panic! ( " Unexpected event " ) ,
}
}
( funding_locked , revoke_and_ack , commitment_update , order )
}
}
}
/// pending_htlc_adds includes both the holding cell and in-flight update_add_htlcs, whereas
/// for claims/fails they are separated out.
2020-02-20 14:14:12 -05:00
pub fn reconnect_nodes < ' a , ' b , ' c > ( node_a : & Node < ' a , ' b , ' c > , node_b : & Node < ' a , ' b , ' c > , send_funding_locked : ( bool , bool ) , pending_htlc_adds : ( i64 , i64 ) , pending_htlc_claims : ( usize , usize ) , pending_cell_htlc_claims : ( usize , usize ) , pending_cell_htlc_fails : ( usize , usize ) , pending_raa : ( bool , bool ) ) {
2019-12-27 22:50:42 -05:00
node_a . node . peer_connected ( & node_b . node . get_our_node_id ( ) , & msgs ::Init { features : InitFeatures ::empty ( ) } ) ;
2019-01-23 16:46:44 -05:00
let reestablish_1 = get_chan_reestablish_msgs! ( node_a , node_b ) ;
2019-12-27 22:50:42 -05:00
node_b . node . peer_connected ( & node_a . node . get_our_node_id ( ) , & msgs ::Init { features : InitFeatures ::empty ( ) } ) ;
2019-01-23 16:46:44 -05:00
let reestablish_2 = get_chan_reestablish_msgs! ( node_b , node_a ) ;
if send_funding_locked . 0 {
// If a expects a funding_locked, it better not think it has received a revoke_and_ack
// from b
for reestablish in reestablish_1 . iter ( ) {
assert_eq! ( reestablish . next_remote_commitment_number , 0 ) ;
}
}
if send_funding_locked . 1 {
// If b expects a funding_locked, it better not think it has received a revoke_and_ack
// from a
for reestablish in reestablish_2 . iter ( ) {
assert_eq! ( reestablish . next_remote_commitment_number , 0 ) ;
}
}
if send_funding_locked . 0 | | send_funding_locked . 1 {
// If we expect any funding_locked's, both sides better have set
2020-09-06 19:51:21 -04:00
// next_holder_commitment_number to 1
2019-01-23 16:46:44 -05:00
for reestablish in reestablish_1 . iter ( ) {
assert_eq! ( reestablish . next_local_commitment_number , 1 ) ;
}
for reestablish in reestablish_2 . iter ( ) {
assert_eq! ( reestablish . next_local_commitment_number , 1 ) ;
}
}
let mut resp_1 = Vec ::new ( ) ;
for msg in reestablish_1 {
2019-11-05 18:51:05 -05:00
node_b . node . handle_channel_reestablish ( & node_a . node . get_our_node_id ( ) , & msg ) ;
2019-01-23 16:46:44 -05:00
resp_1 . push ( handle_chan_reestablish_msgs! ( node_b , node_a ) ) ;
}
if pending_cell_htlc_claims . 0 ! = 0 | | pending_cell_htlc_fails . 0 ! = 0 {
check_added_monitors! ( node_b , 1 ) ;
} else {
check_added_monitors! ( node_b , 0 ) ;
}
let mut resp_2 = Vec ::new ( ) ;
for msg in reestablish_2 {
2019-11-05 18:51:05 -05:00
node_a . node . handle_channel_reestablish ( & node_b . node . get_our_node_id ( ) , & msg ) ;
2019-01-23 16:46:44 -05:00
resp_2 . push ( handle_chan_reestablish_msgs! ( node_a , node_b ) ) ;
}
if pending_cell_htlc_claims . 1 ! = 0 | | pending_cell_htlc_fails . 1 ! = 0 {
check_added_monitors! ( node_a , 1 ) ;
} else {
check_added_monitors! ( node_a , 0 ) ;
}
2019-01-24 16:41:51 +02:00
// We don't yet support both needing updates, as that would require a different commitment dance:
2019-01-23 16:46:44 -05:00
assert! ( ( pending_htlc_adds . 0 = = 0 & & pending_htlc_claims . 0 = = 0 & & pending_cell_htlc_claims . 0 = = 0 & & pending_cell_htlc_fails . 0 = = 0 ) | |
( pending_htlc_adds . 1 = = 0 & & pending_htlc_claims . 1 = = 0 & & pending_cell_htlc_claims . 1 = = 0 & & pending_cell_htlc_fails . 1 = = 0 ) ) ;
for chan_msgs in resp_1 . drain ( .. ) {
if send_funding_locked . 0 {
2019-11-05 18:51:05 -05:00
node_a . node . handle_funding_locked ( & node_b . node . get_our_node_id ( ) , & chan_msgs . 0. unwrap ( ) ) ;
2019-01-23 16:46:44 -05:00
let announcement_event = node_a . node . get_and_clear_pending_msg_events ( ) ;
if ! announcement_event . is_empty ( ) {
assert_eq! ( announcement_event . len ( ) , 1 ) ;
if let MessageSendEvent ::SendAnnouncementSignatures { .. } = announcement_event [ 0 ] {
//TODO: Test announcement_sigs re-sending
} else { panic! ( " Unexpected event! " ) ; }
}
} else {
assert! ( chan_msgs . 0. is_none ( ) ) ;
}
if pending_raa . 0 {
assert! ( chan_msgs . 3 = = RAACommitmentOrder ::RevokeAndACKFirst ) ;
2019-11-05 18:51:05 -05:00
node_a . node . handle_revoke_and_ack ( & node_b . node . get_our_node_id ( ) , & chan_msgs . 1. unwrap ( ) ) ;
2019-01-23 16:46:44 -05:00
assert! ( node_a . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
check_added_monitors! ( node_a , 1 ) ;
} else {
assert! ( chan_msgs . 1. is_none ( ) ) ;
}
if pending_htlc_adds . 0 ! = 0 | | pending_htlc_claims . 0 ! = 0 | | pending_cell_htlc_claims . 0 ! = 0 | | pending_cell_htlc_fails . 0 ! = 0 {
let commitment_update = chan_msgs . 2. unwrap ( ) ;
if pending_htlc_adds . 0 ! = - 1 { // We use -1 to denote a response commitment_signed
assert_eq! ( commitment_update . update_add_htlcs . len ( ) , pending_htlc_adds . 0 as usize ) ;
} else {
assert! ( commitment_update . update_add_htlcs . is_empty ( ) ) ;
}
assert_eq! ( commitment_update . update_fulfill_htlcs . len ( ) , pending_htlc_claims . 0 + pending_cell_htlc_claims . 0 ) ;
assert_eq! ( commitment_update . update_fail_htlcs . len ( ) , pending_cell_htlc_fails . 0 ) ;
assert! ( commitment_update . update_fail_malformed_htlcs . is_empty ( ) ) ;
for update_add in commitment_update . update_add_htlcs {
2019-11-05 18:51:05 -05:00
node_a . node . handle_update_add_htlc ( & node_b . node . get_our_node_id ( ) , & update_add ) ;
2019-01-23 16:46:44 -05:00
}
for update_fulfill in commitment_update . update_fulfill_htlcs {
2019-11-05 18:51:05 -05:00
node_a . node . handle_update_fulfill_htlc ( & node_b . node . get_our_node_id ( ) , & update_fulfill ) ;
2019-01-23 16:46:44 -05:00
}
for update_fail in commitment_update . update_fail_htlcs {
2019-11-05 18:51:05 -05:00
node_a . node . handle_update_fail_htlc ( & node_b . node . get_our_node_id ( ) , & update_fail ) ;
2019-01-23 16:46:44 -05:00
}
if pending_htlc_adds . 0 ! = - 1 { // We use -1 to denote a response commitment_signed
commitment_signed_dance! ( node_a , node_b , commitment_update . commitment_signed , false ) ;
} else {
2019-11-05 18:51:05 -05:00
node_a . node . handle_commitment_signed ( & node_b . node . get_our_node_id ( ) , & commitment_update . commitment_signed ) ;
2019-01-23 16:46:44 -05:00
check_added_monitors! ( node_a , 1 ) ;
let as_revoke_and_ack = get_event_msg! ( node_a , MessageSendEvent ::SendRevokeAndACK , node_b . node . get_our_node_id ( ) ) ;
// No commitment_signed so get_event_msg's assert(len == 1) passes
2019-11-05 18:51:05 -05:00
node_b . node . handle_revoke_and_ack ( & node_a . node . get_our_node_id ( ) , & as_revoke_and_ack ) ;
2019-01-23 16:46:44 -05:00
assert! ( node_b . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
check_added_monitors! ( node_b , 1 ) ;
}
} else {
assert! ( chan_msgs . 2. is_none ( ) ) ;
}
}
for chan_msgs in resp_2 . drain ( .. ) {
if send_funding_locked . 1 {
2019-11-05 18:51:05 -05:00
node_b . node . handle_funding_locked ( & node_a . node . get_our_node_id ( ) , & chan_msgs . 0. unwrap ( ) ) ;
2019-01-23 16:46:44 -05:00
let announcement_event = node_b . node . get_and_clear_pending_msg_events ( ) ;
if ! announcement_event . is_empty ( ) {
assert_eq! ( announcement_event . len ( ) , 1 ) ;
if let MessageSendEvent ::SendAnnouncementSignatures { .. } = announcement_event [ 0 ] {
//TODO: Test announcement_sigs re-sending
} else { panic! ( " Unexpected event! " ) ; }
}
} else {
assert! ( chan_msgs . 0. is_none ( ) ) ;
}
if pending_raa . 1 {
assert! ( chan_msgs . 3 = = RAACommitmentOrder ::RevokeAndACKFirst ) ;
2019-11-05 18:51:05 -05:00
node_b . node . handle_revoke_and_ack ( & node_a . node . get_our_node_id ( ) , & chan_msgs . 1. unwrap ( ) ) ;
2019-01-23 16:46:44 -05:00
assert! ( node_b . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
check_added_monitors! ( node_b , 1 ) ;
} else {
assert! ( chan_msgs . 1. is_none ( ) ) ;
}
if pending_htlc_adds . 1 ! = 0 | | pending_htlc_claims . 1 ! = 0 | | pending_cell_htlc_claims . 1 ! = 0 | | pending_cell_htlc_fails . 1 ! = 0 {
let commitment_update = chan_msgs . 2. unwrap ( ) ;
if pending_htlc_adds . 1 ! = - 1 { // We use -1 to denote a response commitment_signed
assert_eq! ( commitment_update . update_add_htlcs . len ( ) , pending_htlc_adds . 1 as usize ) ;
}
assert_eq! ( commitment_update . update_fulfill_htlcs . len ( ) , pending_htlc_claims . 0 + pending_cell_htlc_claims . 0 ) ;
assert_eq! ( commitment_update . update_fail_htlcs . len ( ) , pending_cell_htlc_fails . 0 ) ;
assert! ( commitment_update . update_fail_malformed_htlcs . is_empty ( ) ) ;
for update_add in commitment_update . update_add_htlcs {
2019-11-05 18:51:05 -05:00
node_b . node . handle_update_add_htlc ( & node_a . node . get_our_node_id ( ) , & update_add ) ;
2019-01-23 16:46:44 -05:00
}
for update_fulfill in commitment_update . update_fulfill_htlcs {
2019-11-05 18:51:05 -05:00
node_b . node . handle_update_fulfill_htlc ( & node_a . node . get_our_node_id ( ) , & update_fulfill ) ;
2019-01-23 16:46:44 -05:00
}
for update_fail in commitment_update . update_fail_htlcs {
2019-11-05 18:51:05 -05:00
node_b . node . handle_update_fail_htlc ( & node_a . node . get_our_node_id ( ) , & update_fail ) ;
2019-01-23 16:46:44 -05:00
}
if pending_htlc_adds . 1 ! = - 1 { // We use -1 to denote a response commitment_signed
commitment_signed_dance! ( node_b , node_a , commitment_update . commitment_signed , false ) ;
} else {
2019-11-05 18:51:05 -05:00
node_b . node . handle_commitment_signed ( & node_a . node . get_our_node_id ( ) , & commitment_update . commitment_signed ) ;
2019-01-23 16:46:44 -05:00
check_added_monitors! ( node_b , 1 ) ;
let bs_revoke_and_ack = get_event_msg! ( node_b , MessageSendEvent ::SendRevokeAndACK , node_a . node . get_our_node_id ( ) ) ;
// No commitment_signed so get_event_msg's assert(len == 1) passes
2019-11-05 18:51:05 -05:00
node_a . node . handle_revoke_and_ack ( & node_b . node . get_our_node_id ( ) , & bs_revoke_and_ack ) ;
2019-01-23 16:46:44 -05:00
assert! ( node_a . node . get_and_clear_pending_msg_events ( ) . is_empty ( ) ) ;
check_added_monitors! ( node_a , 1 ) ;
}
} else {
assert! ( chan_msgs . 2. is_none ( ) ) ;
}
}
}