@@ -8497,3 +8497,50 @@ fn test_concurrent_monitor_claim() {
8497
8497
check_spends ! ( htlc_txn[ 1 ] , bob_state_y) ;
8498
8498
}
8499
8499
}
8500
+
8501
+ #[ test]
8502
+ fn test_htlc_no_detection ( ) {
8503
+ // This test is a mutation to underscore the detection logic bug we had
8504
+ // before #653. HTLC value routed is above the remaining balance, thus
8505
+ // inverting HTLC and `to_remote` output. HTLC will come second and
8506
+ // it wouldn't be seen by pre-#653 detection as we were enumerate()'ing
8507
+ // on a watched outputs vector (Vec<TxOut>) thus implicitly relying on
8508
+ // outputs order detection for correct spending children filtring.
8509
+
8510
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
8511
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
8512
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
8513
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
8514
+
8515
+ // Create some initial channels
8516
+ let chan_1 = create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 100000 , 10001 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
8517
+
8518
+ send_payment ( & nodes[ 0 ] , & vec ! ( & nodes[ 1 ] ) [ ..] , 1_000_000 , 1_000_000 ) ;
8519
+ let ( _, our_payment_hash) = route_payment ( & nodes[ 0 ] , & vec ! ( & nodes[ 1 ] ) [ ..] , 2_000_000 ) ;
8520
+ let local_txn = get_local_commitment_txn ! ( nodes[ 0 ] , chan_1. 2 ) ;
8521
+ assert_eq ! ( local_txn[ 0 ] . input. len( ) , 1 ) ;
8522
+ assert_eq ! ( local_txn[ 0 ] . output. len( ) , 3 ) ;
8523
+ check_spends ! ( local_txn[ 0 ] , chan_1. 3 ) ;
8524
+
8525
+ // Timeout HTLC on A's chain and so it can generate a HTLC-Timeout tx
8526
+ let header = BlockHeader { version : 0x20000000 , prev_blockhash : Default :: default ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
8527
+ connect_block ( & nodes[ 0 ] , & Block { header, txdata : vec ! [ local_txn[ 0 ] . clone( ) ] } , 200 ) ;
8528
+ // We deliberately connect the local tx twice as this should provoke a failure calling
8529
+ // this test before #653 fix.
8530
+ connect_block ( & nodes[ 0 ] , & Block { header, txdata : vec ! [ local_txn[ 0 ] . clone( ) ] } , 200 ) ;
8531
+ check_closed_broadcast ! ( nodes[ 0 ] , false ) ;
8532
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
8533
+
8534
+ let htlc_timeout = {
8535
+ let node_txn = nodes[ 0 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) ;
8536
+ assert_eq ! ( node_txn[ 0 ] . input. len( ) , 1 ) ;
8537
+ assert_eq ! ( node_txn[ 0 ] . input[ 0 ] . witness. last( ) . unwrap( ) . len( ) , OFFERED_HTLC_SCRIPT_WEIGHT ) ;
8538
+ check_spends ! ( node_txn[ 0 ] , local_txn[ 0 ] ) ;
8539
+ node_txn[ 0 ] . clone ( )
8540
+ } ;
8541
+
8542
+ let header_201 = BlockHeader { version : 0x20000000 , prev_blockhash : header. block_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
8543
+ connect_block ( & nodes[ 0 ] , & Block { header : header_201, txdata : vec ! [ htlc_timeout. clone( ) ] } , 201 ) ;
8544
+ connect_blocks ( & nodes[ 0 ] , ANTI_REORG_DELAY - 1 , 201 , true , header_201. block_hash ( ) ) ;
8545
+ expect_payment_failed ! ( nodes[ 0 ] , our_payment_hash, true ) ;
8546
+ }
0 commit comments