@@ -7786,12 +7786,14 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
7786
7786
check_spends ! ( revoked_htlc_txn[ 0 ] , revoked_local_txn[ 0 ] ) ;
7787
7787
assert_eq ! ( revoked_htlc_txn[ 1 ] . input. len( ) , 1 ) ;
7788
7788
assert_eq ! ( revoked_htlc_txn[ 1 ] . input[ 0 ] . witness. last( ) . unwrap( ) . len( ) , OFFERED_HTLC_SCRIPT_WEIGHT ) ;
7789
+ assert_eq ! ( revoked_htlc_txn[ 1 ] . output. len( ) , 1 ) ;
7789
7790
check_spends ! ( revoked_htlc_txn[ 1 ] , revoked_local_txn[ 0 ] ) ;
7790
7791
} else if revoked_htlc_txn[ 1 ] . input [ 0 ] . witness . last ( ) . unwrap ( ) . len ( ) == ACCEPTED_HTLC_SCRIPT_WEIGHT {
7791
7792
assert_eq ! ( revoked_htlc_txn[ 1 ] . input. len( ) , 1 ) ;
7792
7793
check_spends ! ( revoked_htlc_txn[ 1 ] , revoked_local_txn[ 0 ] ) ;
7793
7794
assert_eq ! ( revoked_htlc_txn[ 0 ] . input. len( ) , 1 ) ;
7794
7795
assert_eq ! ( revoked_htlc_txn[ 0 ] . input[ 0 ] . witness. last( ) . unwrap( ) . len( ) , OFFERED_HTLC_SCRIPT_WEIGHT ) ;
7796
+ assert_eq ! ( revoked_htlc_txn[ 0 ] . output. len( ) , 1 ) ;
7795
7797
check_spends ! ( revoked_htlc_txn[ 0 ] , revoked_local_txn[ 0 ] ) ;
7796
7798
}
7797
7799
@@ -7808,18 +7810,43 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
7808
7810
let mut node_txn = nodes[ 0 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) ;
7809
7811
assert_eq ! ( node_txn. len( ) , 5 ) ; // 3 penalty txn on revoked commitment tx + A commitment tx + 1 penalty tnx on revoked HTLC txn
7810
7812
// Verify claim tx are spending revoked HTLC txn
7813
+
7814
+ // node_txn 0-2 each spend a separate revoked output from revoked_local_txn[0]
7815
+ // Note that node_txn[0] and node_txn[1] are bogus - they double spend the revoked_htlc_txn
7816
+ // which are included in the same block (they are broadcasted just because and in case of
7817
+ // reorgs).
7818
+ assert_eq ! ( node_txn[ 0 ] . input. len( ) , 1 ) ;
7819
+ check_spends ! ( node_txn[ 0 ] , revoked_local_txn[ 0 ] ) ;
7820
+ assert_eq ! ( node_txn[ 1 ] . input. len( ) , 1 ) ;
7821
+ check_spends ! ( node_txn[ 1 ] , revoked_local_txn[ 0 ] ) ;
7822
+ assert_eq ! ( node_txn[ 2 ] . input. len( ) , 1 ) ;
7823
+ check_spends ! ( node_txn[ 2 ] , revoked_local_txn[ 0 ] ) ;
7824
+
7825
+ assert_ne ! ( node_txn[ 0 ] . input[ 0 ] . previous_output, node_txn[ 1 ] . input[ 0 ] . previous_output) ;
7826
+ assert_ne ! ( node_txn[ 0 ] . input[ 0 ] . previous_output, node_txn[ 2 ] . input[ 0 ] . previous_output) ;
7827
+ assert_ne ! ( node_txn[ 1 ] . input[ 0 ] . previous_output, node_txn[ 2 ] . input[ 0 ] . previous_output) ;
7828
+
7829
+ assert_eq ! ( node_txn[ 0 ] . input[ 0 ] . previous_output, revoked_htlc_txn[ 0 ] . input[ 0 ] . previous_output) ;
7830
+ assert_eq ! ( node_txn[ 1 ] . input[ 0 ] . previous_output, revoked_htlc_txn[ 1 ] . input[ 0 ] . previous_output) ;
7831
+
7832
+ // node_txn[3] is the local commitment tx broadcast just because (and somewhat in case of
7833
+ // reorgs)
7834
+ check_spends ! ( node_txn[ 3 ] , chan. 3 ) ;
7835
+
7836
+ // node_txn[4] spends the revoked outputs from the revoked_htlc_txn (which only have one
7837
+ // output, checked above).
7811
7838
assert_eq ! ( node_txn[ 4 ] . input. len( ) , 2 ) ;
7812
7839
assert_eq ! ( node_txn[ 4 ] . output. len( ) , 1 ) ;
7813
7840
check_spends ! ( node_txn[ 4 ] , revoked_htlc_txn[ 0 ] , revoked_htlc_txn[ 1 ] ) ;
7814
7841
first = node_txn[ 4 ] . txid ( ) ;
7815
7842
// Store both feerates for later comparison
7816
7843
let fee_1 = revoked_htlc_txn[ 0 ] . output [ 0 ] . value + revoked_htlc_txn[ 1 ] . output [ 0 ] . value - node_txn[ 4 ] . output [ 0 ] . value ;
7817
7844
feerate_1 = fee_1 * 1000 / node_txn[ 4 ] . get_weight ( ) as u64 ;
7818
- penalty_txn = vec ! [ node_txn[ 0 ] . clone ( ) , node_txn [ 1 ] . clone ( ) , node_txn [ 2 ] . clone( ) ] ;
7845
+ penalty_txn = vec ! [ node_txn[ 2 ] . clone( ) ] ;
7819
7846
node_txn. clear ( ) ;
7820
7847
}
7821
7848
7822
- // Connect three more block to see if bumped penalty are issued for HTLC txn
7849
+ // Connect one more block to see if bumped penalty are issued for HTLC txn
7823
7850
let header_130 = BlockHeader { version : 0x20000000 , prev_blockhash : header_129. block_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
7824
7851
nodes[ 0 ] . block_notifier . block_connected ( & Block { header : header_130, txdata : penalty_txn } , 130 ) ;
7825
7852
{
@@ -7828,6 +7855,13 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
7828
7855
7829
7856
check_spends ! ( node_txn[ 0 ] , revoked_local_txn[ 0 ] ) ;
7830
7857
check_spends ! ( node_txn[ 1 ] , revoked_local_txn[ 0 ] ) ;
7858
+ // Note that these are both bogus - they spend outputs already claimed in block 129:
7859
+ if node_txn[ 0 ] . input [ 0 ] . previous_output == revoked_htlc_txn[ 0 ] . input [ 0 ] . previous_output {
7860
+ assert_eq ! ( node_txn[ 1 ] . input[ 0 ] . previous_output, revoked_htlc_txn[ 1 ] . input[ 0 ] . previous_output) ;
7861
+ } else {
7862
+ assert_eq ! ( node_txn[ 0 ] . input[ 0 ] . previous_output, revoked_htlc_txn[ 1 ] . input[ 0 ] . previous_output) ;
7863
+ assert_eq ! ( node_txn[ 1 ] . input[ 0 ] . previous_output, revoked_htlc_txn[ 0 ] . input[ 0 ] . previous_output) ;
7864
+ }
7831
7865
7832
7866
node_txn. clear ( ) ;
7833
7867
} ;
0 commit comments