@@ -8497,3 +8497,50 @@ fn test_concurrent_monitor_claim() {
84978497 check_spends ! ( htlc_txn[ 1 ] , bob_state_y) ;
84988498 }
84998499}
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