@@ -183,7 +183,7 @@ fn test_onchain_htlc_timeout_delay_remote_commitment() {
183
183
do_test_onchain_htlc_reorg ( false , false ) ;
184
184
}
185
185
186
- fn do_test_unconf_chan ( reload_node : bool , reorg_after_reload : bool , connect_style : ConnectStyle ) {
186
+ fn do_test_unconf_chan ( reload_node : bool , reorg_after_reload : bool , use_funding_unconfirmed : bool , connect_style : ConnectStyle ) {
187
187
// After creating a chan between nodes, we disconnect all blocks previously seen to force a
188
188
// channel close on nodes[0] side. We also use this to provide very basic testing of logic
189
189
// around freeing background events which store monitor updates during block_[dis]connected.
@@ -196,16 +196,28 @@ fn do_test_unconf_chan(reload_node: bool, reorg_after_reload: bool, connect_styl
196
196
let mut nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
197
197
* nodes[ 0 ] . connect_style . borrow_mut ( ) = connect_style;
198
198
199
- let chan_id = create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) . 2 ;
199
+ let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
200
200
201
201
let channel_state = nodes[ 0 ] . node . channel_state . lock ( ) . unwrap ( ) ;
202
202
assert_eq ! ( channel_state. by_id. len( ) , 1 ) ;
203
203
assert_eq ! ( channel_state. short_to_id. len( ) , 1 ) ;
204
204
mem:: drop ( channel_state) ;
205
205
206
206
if !reorg_after_reload {
207
- disconnect_all_blocks ( & nodes[ 0 ] ) ;
208
- check_closed_broadcast ! ( nodes[ 0 ] , true ) ;
207
+ if use_funding_unconfirmed {
208
+ let relevant_txids = nodes[ 0 ] . node . get_relevant_txids ( ) ;
209
+ assert_eq ! ( relevant_txids. len( ) , 1 ) ;
210
+ assert_eq ! ( & relevant_txids[ ..] , & [ chan. 3 . txid( ) ] ) ;
211
+ nodes[ 0 ] . node . transaction_unconfirmed ( & relevant_txids[ 0 ] ) ;
212
+ } else {
213
+ disconnect_all_blocks ( & nodes[ 0 ] ) ;
214
+ }
215
+ if connect_style == ConnectStyle :: FullBlockViaListen && !use_funding_unconfirmed {
216
+ handle_announce_close_broadcast_events ( & nodes, 0 , 1 , true , "Funding transaction was un-confirmed. Locked at 6 confs, now have 2 confs." ) ;
217
+ } else {
218
+ handle_announce_close_broadcast_events ( & nodes, 0 , 1 , true , "Funding transaction was un-confirmed. Locked at 6 confs, now have 0 confs." ) ;
219
+ }
220
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
209
221
{
210
222
let channel_state = nodes[ 0 ] . node . channel_state . lock ( ) . unwrap ( ) ;
211
223
assert_eq ! ( channel_state. by_id. len( ) , 0 ) ;
@@ -255,8 +267,20 @@ fn do_test_unconf_chan(reload_node: bool, reorg_after_reload: bool, connect_styl
255
267
}
256
268
257
269
if reorg_after_reload {
258
- disconnect_all_blocks ( & nodes[ 0 ] ) ;
259
- check_closed_broadcast ! ( nodes[ 0 ] , true ) ;
270
+ if use_funding_unconfirmed {
271
+ let relevant_txids = nodes[ 0 ] . node . get_relevant_txids ( ) ;
272
+ assert_eq ! ( relevant_txids. len( ) , 1 ) ;
273
+ assert_eq ! ( & relevant_txids[ ..] , & [ chan. 3 . txid( ) ] ) ;
274
+ nodes[ 0 ] . node . transaction_unconfirmed ( & relevant_txids[ 0 ] ) ;
275
+ } else {
276
+ disconnect_all_blocks ( & nodes[ 0 ] ) ;
277
+ }
278
+ if connect_style == ConnectStyle :: FullBlockViaListen && !use_funding_unconfirmed {
279
+ handle_announce_close_broadcast_events ( & nodes, 0 , 1 , true , "Funding transaction was un-confirmed. Locked at 6 confs, now have 2 confs." ) ;
280
+ } else {
281
+ handle_announce_close_broadcast_events ( & nodes, 0 , 1 , true , "Funding transaction was un-confirmed. Locked at 6 confs, now have 0 confs." ) ;
282
+ }
283
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
260
284
{
261
285
let channel_state = nodes[ 0 ] . node . channel_state . lock ( ) . unwrap ( ) ;
262
286
assert_eq ! ( channel_state. by_id. len( ) , 0 ) ;
@@ -265,25 +289,42 @@ fn do_test_unconf_chan(reload_node: bool, reorg_after_reload: bool, connect_styl
265
289
}
266
290
// With expect_channel_force_closed set the TestChainMonitor will enforce that the next update
267
291
// is a ChannelForcClosed on the right channel with should_broadcast set.
268
- * nodes[ 0 ] . chain_monitor . expect_channel_force_closed . lock ( ) . unwrap ( ) = Some ( ( chan_id , true ) ) ;
292
+ * nodes[ 0 ] . chain_monitor . expect_channel_force_closed . lock ( ) . unwrap ( ) = Some ( ( chan . 2 , true ) ) ;
269
293
nodes[ 0 ] . node . test_process_background_events ( ) ; // Required to free the pending background monitor update
270
294
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
295
+
296
+ // Now check that we can create a new channel
297
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
298
+ send_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 8000000 , 8_000_000 ) ;
271
299
}
272
300
273
301
#[ test]
274
302
fn test_unconf_chan ( ) {
275
- do_test_unconf_chan ( true , true , ConnectStyle :: BestBlockFirstSkippingBlocks ) ;
276
- do_test_unconf_chan ( false , true , ConnectStyle :: BestBlockFirstSkippingBlocks ) ;
277
- do_test_unconf_chan ( true , false , ConnectStyle :: BestBlockFirstSkippingBlocks ) ;
278
- do_test_unconf_chan ( false , false , ConnectStyle :: BestBlockFirstSkippingBlocks ) ;
303
+ do_test_unconf_chan ( true , true , false , ConnectStyle :: BestBlockFirstSkippingBlocks ) ;
304
+ do_test_unconf_chan ( false , true , false , ConnectStyle :: BestBlockFirstSkippingBlocks ) ;
305
+ do_test_unconf_chan ( true , false , false , ConnectStyle :: BestBlockFirstSkippingBlocks ) ;
306
+ do_test_unconf_chan ( false , false , false , ConnectStyle :: BestBlockFirstSkippingBlocks ) ;
279
307
}
280
308
281
309
#[ test]
282
310
fn test_unconf_chan_via_listen ( ) {
283
- do_test_unconf_chan ( true , true , ConnectStyle :: FullBlockViaListen ) ;
284
- do_test_unconf_chan ( false , true , ConnectStyle :: FullBlockViaListen ) ;
285
- do_test_unconf_chan ( true , false , ConnectStyle :: FullBlockViaListen ) ;
286
- do_test_unconf_chan ( false , false , ConnectStyle :: FullBlockViaListen ) ;
311
+ do_test_unconf_chan ( true , true , false , ConnectStyle :: FullBlockViaListen ) ;
312
+ do_test_unconf_chan ( false , true , false , ConnectStyle :: FullBlockViaListen ) ;
313
+ do_test_unconf_chan ( true , false , false , ConnectStyle :: FullBlockViaListen ) ;
314
+ do_test_unconf_chan ( false , false , false , ConnectStyle :: FullBlockViaListen ) ;
315
+ }
316
+
317
+ #[ test]
318
+ fn test_unconf_chan_via_funding_unconfirmed ( ) {
319
+ do_test_unconf_chan ( true , true , true , ConnectStyle :: BestBlockFirstSkippingBlocks ) ;
320
+ do_test_unconf_chan ( false , true , true , ConnectStyle :: BestBlockFirstSkippingBlocks ) ;
321
+ do_test_unconf_chan ( true , false , true , ConnectStyle :: BestBlockFirstSkippingBlocks ) ;
322
+ do_test_unconf_chan ( false , false , true , ConnectStyle :: BestBlockFirstSkippingBlocks ) ;
323
+
324
+ do_test_unconf_chan ( true , true , true , ConnectStyle :: FullBlockViaListen ) ;
325
+ do_test_unconf_chan ( false , true , true , ConnectStyle :: FullBlockViaListen ) ;
326
+ do_test_unconf_chan ( true , false , true , ConnectStyle :: FullBlockViaListen ) ;
327
+ do_test_unconf_chan ( false , false , true , ConnectStyle :: FullBlockViaListen ) ;
287
328
}
288
329
289
330
#[ test]
0 commit comments