@@ -4170,6 +4170,60 @@ fn test_static_spendable_outputs_preimage_tx() {
4170
4170
check_spends ! ( spend_txn[ 0 ] , node_txn[ 0 ] ) ;
4171
4171
}
4172
4172
4173
+ #[ test]
4174
+ fn test_static_spendable_outputs_timeout_tx ( ) {
4175
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
4176
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
4177
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
4178
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
4179
+
4180
+ // Create some initial channels
4181
+ let chan_1 = create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: supported ( ) , InitFeatures :: supported ( ) ) ;
4182
+
4183
+ // Rebalance the network a bit by relaying one payment through all the channels ...
4184
+ send_payment ( & nodes[ 0 ] , & vec ! ( & nodes[ 1 ] ) [ ..] , 8000000 , 8_000_000 ) ;
4185
+
4186
+ let ( _, our_payment_hash) = route_payment ( & nodes[ 1 ] , & vec ! ( & nodes[ 0 ] ) [ ..] , 3_000_000 ) ;
4187
+
4188
+ let commitment_tx = get_local_commitment_txn ! ( nodes[ 0 ] , chan_1. 2 ) ;
4189
+ assert_eq ! ( commitment_tx[ 0 ] . input. len( ) , 1 ) ;
4190
+ assert_eq ! ( commitment_tx[ 0 ] . input[ 0 ] . previous_output. txid, chan_1. 3 . txid( ) ) ;
4191
+
4192
+ // Settle A's commitment tx on B' chain
4193
+ let header = BlockHeader { version : 0x2000_0000 , prev_blockhash : Default :: default ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
4194
+ nodes[ 1 ] . block_notifier . block_connected ( & Block { header, txdata : vec ! [ commitment_tx[ 0 ] . clone( ) ] } , 0 ) ;
4195
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4196
+ let events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
4197
+ match events[ 0 ] {
4198
+ MessageSendEvent :: BroadcastChannelUpdate { .. } => { } ,
4199
+ _ => panic ! ( "Unexpected event" ) ,
4200
+ }
4201
+
4202
+ // Check B's monitor was able to send back output descriptor event for timeout tx on A's commitment tx
4203
+ let node_txn = nodes[ 1 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) ;
4204
+ assert_eq ! ( node_txn. len( ) , 3 ) ; // ChannelManager : 2 (local commitent tx + HTLC-timeout), ChannelMonitor: timeout tx
4205
+ check_spends ! ( node_txn[ 0 ] , commitment_tx[ 0 ] . clone( ) ) ;
4206
+ assert_eq ! ( node_txn[ 0 ] . input[ 0 ] . witness. last( ) . unwrap( ) . len( ) , ACCEPTED_HTLC_SCRIPT_WEIGHT ) ;
4207
+ check_spends ! ( node_txn[ 1 ] , chan_1. 3 . clone( ) ) ;
4208
+ check_spends ! ( node_txn[ 2 ] , node_txn[ 1 ] ) ;
4209
+
4210
+ let header_1 = BlockHeader { version : 0x20000000 , prev_blockhash : header. bitcoin_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
4211
+ nodes[ 1 ] . block_notifier . block_connected ( & Block { header : header_1, txdata : vec ! [ node_txn[ 0 ] . clone( ) ] } , 1 ) ;
4212
+ connect_blocks ( & nodes[ 1 ] . block_notifier , ANTI_REORG_DELAY - 1 , 1 , true , header. bitcoin_hash ( ) ) ;
4213
+ let events = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
4214
+ assert_eq ! ( events. len( ) , 1 ) ;
4215
+ match events[ 0 ] {
4216
+ Event :: PaymentFailed { payment_hash, .. } => {
4217
+ assert_eq ! ( payment_hash, our_payment_hash) ;
4218
+ } ,
4219
+ _ => panic ! ( "Unexpected event" ) ,
4220
+ }
4221
+
4222
+ let spend_txn = check_spendable_outputs ! ( nodes[ 1 ] , 1 ) ;
4223
+ assert_eq ! ( spend_txn. len( ) , 3 ) ; // SpendableOutput: remote_commitment_tx.to_remote (*2), timeout_tx.output (*1)
4224
+ check_spends ! ( spend_txn[ 2 ] , node_txn[ 0 ] . clone( ) ) ;
4225
+ }
4226
+
4173
4227
#[ test]
4174
4228
fn test_static_spendable_outputs_justice_tx_revoked_commitment_tx ( ) {
4175
4229
let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
0 commit comments