@@ -2127,8 +2127,10 @@ fn test_justice_tx() {
2127
2127
test_txn_broadcast ( & nodes[ 1 ] , & chan_5, None , HTLCType :: NONE ) ;
2128
2128
2129
2129
nodes[ 0 ] . block_notifier . block_connected ( & Block { header, txdata : vec ! [ revoked_local_txn[ 0 ] . clone( ) ] } , 1 ) ;
2130
+ // Verify broadcast of revoked HTLC-timeout
2130
2131
let node_txn = test_txn_broadcast ( & nodes[ 0 ] , & chan_5, Some ( revoked_local_txn[ 0 ] . clone ( ) ) , HTLCType :: TIMEOUT ) ;
2131
2132
header = BlockHeader { version : 0x20000000 , prev_blockhash : header. bitcoin_hash ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
2133
+ // Broadcast revoked HTLC-timeout on node 1
2132
2134
nodes[ 1 ] . block_notifier . block_connected ( & Block { header, txdata : vec ! [ node_txn[ 1 ] . clone( ) ] } , 1 ) ;
2133
2135
test_revoked_htlc_claim_txn_broadcast ( & nodes[ 1 ] , node_txn[ 1 ] . clone ( ) , revoked_local_txn[ 0 ] . clone ( ) ) ;
2134
2136
}
@@ -4182,9 +4184,14 @@ fn test_static_spendable_outputs_justice_tx_revoked_htlc_timeout_tx() {
4182
4184
check_closed_broadcast ! ( nodes[ 1 ] , false ) ;
4183
4185
4184
4186
let node_txn = nodes[ 1 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) ;
4185
- 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
4187
+ 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
4188
+ assert_eq ! ( node_txn[ 0 ] . input. len( ) , 2 ) ;
4189
+ check_spends ! ( node_txn[ 0 ] , revoked_local_txn[ 0 ] ) ;
4190
+ check_spends ! ( node_txn[ 1 ] , chan_1. 3 ) ;
4186
4191
assert_eq ! ( node_txn[ 2 ] . input. len( ) , 1 ) ;
4187
4192
check_spends ! ( node_txn[ 2 ] , revoked_htlc_txn[ 0 ] ) ;
4193
+ assert_eq ! ( node_txn[ 3 ] . input. len( ) , 1 ) ;
4194
+ check_spends ! ( node_txn[ 3 ] , revoked_local_txn[ 0 ] ) ;
4188
4195
4189
4196
// Check B's ChannelMonitor was able to generate the right spendable output descriptor
4190
4197
let spend_txn = check_spendable_outputs ! ( nodes[ 1 ] , 1 ) ;
@@ -4233,7 +4240,7 @@ fn test_static_spendable_outputs_justice_tx_revoked_htlc_success_tx() {
4233
4240
4234
4241
// Check A's ChannelMonitor was able to generate the right spendable output descriptor
4235
4242
let spend_txn = check_spendable_outputs ! ( nodes[ 0 ] , 1 ) ;
4236
- assert_eq ! ( spend_txn. len( ) , 4 ) ;
4243
+ assert_eq ! ( spend_txn. len( ) , 5 ) ; // Duplicated SpendableOutput due to block rescan after revoked htlc output tracking
4237
4244
assert_eq ! ( spend_txn[ 0 ] , spend_txn[ 2 ] ) ;
4238
4245
check_spends ! ( spend_txn[ 0 ] , revoked_local_txn[ 0 ] ) ; // spending to_remote output from revoked local tx
4239
4246
check_spends ! ( spend_txn[ 1 ] , node_txn[ 0 ] ) ; // spending justice tx output from revoked local tx htlc received output
@@ -6993,7 +7000,7 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
6993
7000
6994
7001
assert_eq ! ( node_txn[ 0 ] . input. len( ) , 2 ) ;
6995
7002
check_spends ! ( node_txn[ 0 ] , revoked_htlc_txn[ 0 ] , revoked_htlc_txn[ 1 ] ) ;
6996
- //// Verify bumped tx is different and 25% bump heuristic
7003
+ // Verify bumped tx is different and 25% bump heuristic
6997
7004
assert_ne ! ( first, node_txn[ 0 ] . txid( ) ) ;
6998
7005
let fee_2 = revoked_htlc_txn[ 0 ] . output [ 0 ] . value + revoked_htlc_txn[ 1 ] . output [ 0 ] . value - node_txn[ 0 ] . output [ 0 ] . value ;
6999
7006
let feerate_2 = fee_2 * 1000 / node_txn[ 0 ] . get_weight ( ) as u64 ;
@@ -7008,7 +7015,13 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
7008
7015
connect_blocks ( & nodes[ 0 ] . block_notifier , 20 , 145 , true , header_145. bitcoin_hash ( ) ) ;
7009
7016
{
7010
7017
let mut node_txn = nodes[ 0 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) ;
7011
- assert_eq ! ( node_txn. len( ) , 1 ) ; //TODO: fix check_spend_remote_htlc lack of watch output
7018
+ // We verify than no new transaction has been broadcast because previously
7019
+ // we were buggy on this exact behavior by not tracking for monitoring remote HTLC outputs (see #411)
7020
+ // which means we wouldn't see a spend of them by a justice tx and bumped justice tx
7021
+ // were generated forever instead of safe cleaning after confirmation and ANTI_REORG_SAFE_DELAY blocks.
7022
+ // Enforce spending of revoked htlc output by claiming transaction remove request as expected and dry
7023
+ // up bumped justice generation.
7024
+ assert_eq ! ( node_txn. len( ) , 0 ) ;
7012
7025
node_txn. clear ( ) ;
7013
7026
}
7014
7027
check_closed_broadcast ! ( nodes[ 0 ] , false ) ;
0 commit comments