@@ -3444,7 +3444,7 @@ mod tests {
3444
3444
#[ test]
3445
3445
fn channel_monitor_claim_revoked_commitment_tx ( ) {
3446
3446
3447
- let nodes = create_network ( 2 ) ;
3447
+ let nodes = create_network ( 4 ) ;
3448
3448
3449
3449
// Create some new channel:
3450
3450
let chan_1 = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
@@ -3479,6 +3479,42 @@ mod tests {
3479
3479
get_announce_close_broadcast_events ( & nodes, 0 , 1 ) ;
3480
3480
assert_eq ! ( nodes[ 0 ] . node. list_channels( ) . len( ) , 0 ) ;
3481
3481
assert_eq ! ( nodes[ 1 ] . node. list_channels( ) . len( ) , 0 ) ;
3482
+
3483
+ let chan_2 = create_announced_chan_between_nodes ( & nodes, 2 , 3 ) ;
3484
+
3485
+ // Rebalance the network to generate htlc in the two directions
3486
+ send_payment ( & nodes[ 2 ] , & vec ! ( & nodes[ 3 ] ) [ ..] , 8000000 ) ;
3487
+ // node[2] is gonna to revoke an old state thus node[3] should be able to claim both offered/received HTLC outputs on top of commitment tx, but this
3488
+ // time as two different claim transactions as we're gonna to timeout htlc with given a high current heigh
3489
+ let payment_preimage_3 = route_payment ( & nodes[ 2 ] , & vec ! ( & nodes[ 3 ] ) [ ..] , 3000000 ) . 0 ;
3490
+ let _payment_preimage_4 = route_payment ( & nodes[ 3 ] , & vec ! ( & nodes[ 2 ] ) [ ..] , 3000000 ) . 0 ;
3491
+
3492
+ // Get the will-be-revoked local txn from node[2]
3493
+ let revoked_local_txn = nodes[ 2 ] . node . channel_state . lock ( ) . unwrap ( ) . by_id . iter ( ) . next ( ) . unwrap ( ) . 1 . last_local_commitment_txn . clone ( ) ;
3494
+
3495
+ //Revoke the old state
3496
+ claim_payment ( & nodes[ 2 ] , & vec ! ( & nodes[ 3 ] ) [ ..] , payment_preimage_3) ;
3497
+
3498
+ {
3499
+ let header = BlockHeader { version : 0x20000000 , prev_blockhash : Default :: default ( ) , merkle_root : Default :: default ( ) , time : 42 , bits : 42 , nonce : 42 } ;
3500
+
3501
+ nodes[ 2 ] . chain_monitor . block_connected_with_filtering ( & Block { header, txdata : vec ! [ revoked_local_txn[ 0 ] . clone( ) ] } , 200 ) ;
3502
+ test_txn_broadcast ( & nodes[ 2 ] , & chan_2, Some ( revoked_local_txn[ 0 ] . clone ( ) ) , HTLCType :: TIMEOUT ) ;
3503
+
3504
+ nodes[ 3 ] . chain_monitor . block_connected_with_filtering ( & Block { header, txdata : vec ! [ revoked_local_txn[ 0 ] . clone( ) ] } , 200 ) ;
3505
+ let node_txn = nodes[ 3 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) ;
3506
+ assert_eq ! ( node_txn. len( ) , 10 ) ; // ChannelManager : 2, ChannelMontitor: 8 (2 revocation htlc tx, 1 local commitment tx + 1 htlc timeout tx) * 2 (block-rescan)
3507
+ assert_eq ! ( node_txn[ 0 ] . input. len( ) , 1 ) ;
3508
+ assert_eq ! ( node_txn[ 1 ] . input. len( ) , 1 ) ;
3509
+
3510
+ let mut funding_tx_map = HashMap :: new ( ) ;
3511
+ funding_tx_map. insert ( revoked_local_txn[ 0 ] . txid ( ) , revoked_local_txn[ 0 ] . clone ( ) ) ;
3512
+ node_txn[ 0 ] . verify ( & funding_tx_map) . unwrap ( ) ;
3513
+ }
3514
+ get_announce_close_broadcast_events ( & nodes, 2 , 3 ) ;
3515
+ assert_eq ! ( nodes[ 2 ] . node. list_channels( ) . len( ) , 0 ) ;
3516
+ assert_eq ! ( nodes[ 3 ] . node. list_channels( ) . len( ) , 0 ) ;
3517
+
3482
3518
}
3483
3519
3484
3520
#[ test]
0 commit comments