@@ -5037,33 +5037,32 @@ fn test_static_spendable_outputs_justice_tx_revoked_htlc_timeout_tx() {
5037
5037
check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5038
5038
5039
5039
let node_txn = nodes[ 1 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) ;
5040
- assert_eq ! ( node_txn. len( ) , 4 ) ; // ChannelMonitor: justice tx on revoked commitment , justice tx on revoked HTLC-timeout, adjusted justice tx , ChannelManager: local commitment tx
5040
+ assert_eq ! ( node_txn. len( ) , 3 ) ; // ChannelMonitor: bogus justics tx , justice tx on revoked outputs , ChannelManager: local commitment tx
5041
5041
// The first transaction generated is bogus - it spends both outputs of revoked_local_txn[0]
5042
5042
// including the one already spent by revoked_htlc_txn[0]. That's OK, we'll spend with valid
5043
5043
// transactions next...
5044
- assert_eq ! ( node_txn[ 0 ] . input. len( ) , 2 ) ;
5045
- check_spends ! ( node_txn[ 0 ] , revoked_local_txn[ 0 ] ) ;
5044
+ assert_eq ! ( node_txn[ 0 ] . input. len( ) , 3 ) ;
5045
+ check_spends ! ( node_txn[ 0 ] , revoked_local_txn[ 0 ] , revoked_htlc_txn [ 0 ] ) ;
5046
5046
5047
- check_spends ! ( node_txn[ 1 ] , chan_1. 3 ) ;
5047
+ assert_eq ! ( node_txn[ 1 ] . input. len( ) , 2 ) ;
5048
+ check_spends ! ( node_txn[ 1 ] , revoked_local_txn[ 0 ] , revoked_htlc_txn[ 0 ] ) ;
5049
+ assert ! ( ( node_txn[ 1 ] . input[ 1 ] . previous_output. txid == revoked_htlc_txn[ 0 ] . txid( ) &&
5050
+ node_txn[ 1 ] . input[ 0 ] . previous_output != revoked_htlc_txn[ 0 ] . input[ 0 ] . previous_output) ||
5051
+ ( node_txn[ 1 ] . input[ 0 ] . previous_output. txid == revoked_htlc_txn[ 0 ] . txid( ) &&
5052
+ node_txn[ 1 ] . input[ 1 ] . previous_output != revoked_htlc_txn[ 0 ] . input[ 0 ] . previous_output) ) ;
5048
5053
5049
5054
assert_eq ! ( node_txn[ 2 ] . input. len( ) , 1 ) ;
5050
- check_spends ! ( node_txn[ 2 ] , revoked_htlc_txn[ 0 ] ) ;
5051
- assert_eq ! ( node_txn[ 3 ] . input. len( ) , 1 ) ;
5052
- check_spends ! ( node_txn[ 3 ] , revoked_local_txn[ 0 ] ) ;
5055
+ check_spends ! ( node_txn[ 2 ] , chan_1. 3 ) ;
5053
5056
5054
5057
let header_1 = BlockHeader { version : 0x20000000 , prev_blockhash : header. block_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
5055
- nodes[ 1 ] . block_notifier . block_connected ( & Block { header : header_1, txdata : vec ! [ node_txn[ 2 ] . clone ( ) , node_txn [ 3 ] . clone( ) ] } , 1 ) ;
5058
+ nodes[ 1 ] . block_notifier . block_connected ( & Block { header : header_1, txdata : vec ! [ node_txn[ 1 ] . clone( ) ] } , 1 ) ;
5056
5059
connect_blocks ( & nodes[ 1 ] . block_notifier , ANTI_REORG_DELAY - 1 , 1 , true , header. block_hash ( ) ) ;
5057
5060
5058
- // Note that nodes[1]'s tx_broadcaster is still locked, so if we get here the channelmonitor
5059
- // didn't try to generate any new transactions.
5060
-
5061
- // Check B's ChannelMonitor was able to generate the right spendable output descriptor which
5062
- // allows the user to spend the newly-confirmed outputs.
5061
+ // Check B's ChannelMonitor was able to generate the right spendable output descriptor
5063
5062
let spend_txn = check_spendable_outputs ! ( nodes[ 1 ] , 1 , node_cfgs[ 1 ] . keys_manager, 100000 ) ;
5064
- assert_eq ! ( spend_txn. len( ) , 2 ) ;
5065
- check_spends ! ( spend_txn[ 0 ] , node_txn [ 2 ] ) ;
5066
- check_spends ! ( spend_txn[ 1 ] , node_txn[ 3 ] ) ;
5063
+ assert_eq ! ( spend_txn. len( ) , 1 ) ;
5064
+ assert_eq ! ( spend_txn[ 0 ] . input . len ( ) , 1 ) ;
5065
+ check_spends ! ( spend_txn[ 0 ] , node_txn[ 1 ] ) ;
5067
5066
}
5068
5067
5069
5068
#[ test]
@@ -5108,33 +5107,36 @@ fn test_static_spendable_outputs_justice_tx_revoked_htlc_success_tx() {
5108
5107
let node_txn = nodes[ 0 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) ;
5109
5108
assert_eq ! ( node_txn. len( ) , 3 ) ; // ChannelMonitor: justice tx on revoked commitment, justice tx on revoked HTLC-success, ChannelManager: local commitment tx
5110
5109
5111
- // The first transaction generated is just in case of a reorg - it double-spends
5112
- // revoked_htlc_txn[0], spending the HTLC output on revoked_local_txn[0] directly.
5113
- assert_eq ! ( node_txn[ 0 ] . input. len( ) , 1 ) ;
5114
- check_spends ! ( node_txn[ 0 ] , revoked_local_txn[ 0 ] ) ;
5115
- assert_eq ! ( node_txn[ 0 ] . input[ 0 ] . previous_output, revoked_htlc_txn[ 0 ] . input[ 0 ] . previous_output) ;
5110
+ // The first transaction generated is bogus - it spends both outputs of revoked_local_txn[0]
5111
+ // including the one already spent by revoked_htlc_txn[0]. That's OK, we'll spend with valid
5112
+ // transactions next...
5113
+ assert_eq ! ( node_txn[ 0 ] . input. len( ) , 2 ) ;
5114
+ check_spends ! ( node_txn[ 0 ] , revoked_local_txn[ 0 ] , revoked_htlc_txn[ 0 ] ) ;
5115
+ assert ! ( ( node_txn[ 0 ] . input[ 1 ] . previous_output. txid == revoked_htlc_txn[ 0 ] . txid( ) &&
5116
+ node_txn[ 0 ] . input[ 0 ] . previous_output == revoked_htlc_txn[ 0 ] . input[ 0 ] . previous_output) ||
5117
+ ( node_txn[ 0 ] . input[ 0 ] . previous_output. txid == revoked_htlc_txn[ 0 ] . txid( ) &&
5118
+ node_txn[ 0 ] . input[ 1 ] . previous_output == revoked_htlc_txn[ 0 ] . input[ 0 ] . previous_output) ) ;
5116
5119
5117
- assert_eq ! ( node_txn[ 2 ] . input. len( ) , 1 ) ;
5118
- check_spends ! ( node_txn[ 2 ] , revoked_htlc_txn[ 0 ] ) ;
5120
+ assert_eq ! ( node_txn[ 1 ] . input. len( ) , 1 ) ;
5121
+ check_spends ! ( node_txn[ 1 ] , revoked_htlc_txn[ 0 ] ) ;
5119
5122
5120
- check_spends ! ( node_txn[ 1 ] , chan_1. 3 ) ;
5123
+ check_spends ! ( node_txn[ 2 ] , chan_1. 3 ) ;
5121
5124
5122
5125
let header_1 = BlockHeader { version : 0x20000000 , prev_blockhash : header. block_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
5123
- nodes[ 0 ] . block_notifier . block_connected ( & Block { header : header_1, txdata : vec ! [ node_txn[ 2 ] . clone( ) ] } , 1 ) ;
5126
+ nodes[ 0 ] . block_notifier . block_connected ( & Block { header : header_1, txdata : vec ! [ node_txn[ 1 ] . clone( ) ] } , 1 ) ;
5124
5127
connect_blocks ( & nodes[ 0 ] . block_notifier , ANTI_REORG_DELAY - 1 , 1 , true , header. block_hash ( ) ) ;
5125
5128
5126
5129
// Note that nodes[0]'s tx_broadcaster is still locked, so if we get here the channelmonitor
5127
5130
// didn't try to generate any new transactions.
5128
5131
5129
5132
// Check A's ChannelMonitor was able to generate the right spendable output descriptor
5130
5133
let spend_txn = check_spendable_outputs ! ( nodes[ 0 ] , 1 , node_cfgs[ 0 ] . keys_manager, 100000 ) ;
5131
- assert_eq ! ( spend_txn. len( ) , 4 ) ; // Duplicated SpendableOutput due to block rescan after revoked htlc output tracking
5134
+ assert_eq ! ( spend_txn. len( ) , 3 ) ; // Duplicated SpendableOutput due to block rescan after revoked htlc output tracking
5132
5135
assert_eq ! ( spend_txn[ 0 ] , spend_txn[ 1 ] ) ;
5133
- assert_eq ! ( spend_txn[ 0 ] , spend_txn[ 2 ] ) ;
5134
5136
assert_eq ! ( spend_txn[ 0 ] . input. len( ) , 1 ) ;
5135
5137
check_spends ! ( spend_txn[ 0 ] , revoked_local_txn[ 0 ] ) ; // spending to_remote output from revoked local tx
5136
5138
assert_ne ! ( spend_txn[ 0 ] . input[ 0 ] . previous_output, revoked_htlc_txn[ 0 ] . input[ 0 ] . previous_output) ;
5137
- check_spends ! ( spend_txn[ 3 ] , node_txn[ 2 ] ) ; // spending justice tx output on the htlc success tx
5139
+ check_spends ! ( spend_txn[ 2 ] , node_txn[ 1 ] ) ; // spending justice tx output on the htlc success tx
5138
5140
}
5139
5141
5140
5142
#[ test]
@@ -7796,11 +7798,11 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
7796
7798
}
7797
7799
7798
7800
// Broadcast set of revoked txn on A
7799
- let header_128 = connect_blocks ( & nodes[ 0 ] . block_notifier , 128 , 0 , true , header. block_hash ( ) ) ;
7801
+ let header_128 = BlockHeader { version : 0x20000000 , prev_blockhash : header. block_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
7802
+ nodes[ 0 ] . block_notifier . block_connected ( & Block { header : header_128, txdata : vec ! [ revoked_local_txn[ 0 ] . clone( ) ] } , 128 ) ;
7800
7803
expect_pending_htlcs_forwardable_ignore ! ( nodes[ 0 ] ) ;
7801
-
7802
- let header_129 = BlockHeader { version : 0x20000000 , prev_blockhash : header_128, merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
7803
- nodes[ 0 ] . block_notifier . block_connected ( & Block { header : header_129, txdata : vec ! [ revoked_local_txn[ 0 ] . clone( ) , revoked_htlc_txn[ 0 ] . clone( ) , revoked_htlc_txn[ 1 ] . clone( ) ] } , 129 ) ;
7804
+ let header_129 = BlockHeader { version : 0x20000000 , prev_blockhash : header_128. block_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
7805
+ nodes[ 0 ] . block_notifier . block_connected ( & Block { header : header_129, txdata : vec ! [ revoked_htlc_txn[ 0 ] . clone( ) , revoked_htlc_txn[ 1 ] . clone( ) ] } , 129 ) ;
7804
7806
let first;
7805
7807
let feerate_1;
7806
7808
let penalty_txn;
@@ -7836,6 +7838,7 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
7836
7838
assert_eq ! ( node_txn[ 4 ] . input. len( ) , 2 ) ;
7837
7839
assert_eq ! ( node_txn[ 4 ] . output. len( ) , 1 ) ;
7838
7840
check_spends ! ( node_txn[ 4 ] , revoked_htlc_txn[ 0 ] , revoked_htlc_txn[ 1 ] ) ;
7841
+
7839
7842
first = node_txn[ 4 ] . txid ( ) ;
7840
7843
// Store both feerates for later comparison
7841
7844
let fee_1 = revoked_htlc_txn[ 0 ] . output [ 0 ] . value + revoked_htlc_txn[ 1 ] . output [ 0 ] . value - node_txn[ 4 ] . output [ 0 ] . value ;
@@ -7847,6 +7850,8 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
7847
7850
// Connect one more block to see if bumped penalty are issued for HTLC txn
7848
7851
let header_130 = BlockHeader { version : 0x20000000 , prev_blockhash : header_129. block_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
7849
7852
nodes[ 0 ] . block_notifier . block_connected ( & Block { header : header_130, txdata : penalty_txn } , 130 ) ;
7853
+ let header_131 = BlockHeader { version : 0x20000000 , prev_blockhash : header_130. block_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
7854
+ nodes[ 0 ] . block_notifier . block_connected ( & Block { header : header_131, txdata : Vec :: new ( ) } , 131 ) ;
7850
7855
{
7851
7856
let mut node_txn = nodes[ 0 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) ;
7852
7857
assert_eq ! ( node_txn. len( ) , 2 ) ; // 2 bumped penalty txn on revoked commitment tx
@@ -7863,7 +7868,7 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
7863
7868
} ;
7864
7869
7865
7870
// Few more blocks to confirm penalty txn
7866
- let header_135 = connect_blocks ( & nodes[ 0 ] . block_notifier , 5 , 130 , true , header_130 . block_hash ( ) ) ;
7871
+ let header_135 = connect_blocks ( & nodes[ 0 ] . block_notifier , 4 , 131 , true , header_131 . block_hash ( ) ) ;
7867
7872
assert ! ( nodes[ 0 ] . tx_broadcaster. txn_broadcasted. lock( ) . unwrap( ) . is_empty( ) ) ;
7868
7873
let header_144 = connect_blocks ( & nodes[ 0 ] . block_notifier , 9 , 135 , true , header_135) ;
7869
7874
let node_txn = {
0 commit comments