@@ -16,7 +16,7 @@ use bitcoin::blockdata::block::{Block, BlockHeader};
16
16
use bitcoin:: blockdata:: constants:: genesis_block;
17
17
use bitcoin:: hash_types:: BlockHash ;
18
18
use bitcoin:: network:: constants:: Network ;
19
- use chain:: channelmonitor:: ChannelMonitor ;
19
+ use chain:: channelmonitor:: { ANTI_REORG_DELAY , ChannelMonitor } ;
20
20
use chain:: transaction:: OutPoint ;
21
21
use chain:: { ChannelMonitorUpdateErr , Listen , Watch } ;
22
22
use ln:: { PaymentPreimage , PaymentHash } ;
@@ -2064,6 +2064,48 @@ fn test_pending_update_fee_ack_on_reconnect() {
2064
2064
claim_payment ( & nodes[ 1 ] , & [ & nodes[ 0 ] ] , payment_preimage) ;
2065
2065
}
2066
2066
2067
+ #[ test]
2068
+ fn test_fail_htlc_on_broadcast_after_claim ( ) {
2069
+ // In an earlier version of 7e78fa660cec8a73286c94c1073ee588140e7a01 we'd also fail the inbound
2070
+ // channel backwards if we received an HTLC failure after a HTLC fulfillment. Here we test a
2071
+ // specific case of that by having the HTLC failure come from the ChannelMonitor after a dust
2072
+ // HTLC was not included in a confirmed commitment transaction.
2073
+ //
2074
+ // We first forward a payment, then claim it with an update_fulfill_htlc message, closing the
2075
+ // channel immediately before commitment occurs. After the commitment transaction reaches
2076
+ // ANTI_REORG_DELAY confirmations, will will try to fail the HTLC which was already fulfilled.
2077
+ let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
2078
+ let node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
2079
+ let node_chanmgrs = create_node_chanmgrs ( 3 , & node_cfgs, & [ None , None , None ] ) ;
2080
+ let mut nodes = create_network ( 3 , & node_cfgs, & node_chanmgrs) ;
2081
+
2082
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
2083
+ let chan_id_2 = create_announced_chan_between_nodes ( & nodes, 1 , 2 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) . 2 ;
2084
+
2085
+ let payment_preimage = route_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] ] , 2000 ) . 0 ;
2086
+
2087
+ let bs_txn = get_local_commitment_txn ! ( nodes[ 2 ] , chan_id_2) ;
2088
+ assert_eq ! ( bs_txn. len( ) , 1 ) ;
2089
+
2090
+ nodes[ 2 ] . node . claim_funds ( payment_preimage) ;
2091
+ check_added_monitors ! ( nodes[ 2 ] , 1 ) ;
2092
+ let cs_updates = get_htlc_update_msgs ! ( nodes[ 2 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2093
+ nodes[ 1 ] . node . handle_update_fulfill_htlc ( & nodes[ 2 ] . node . get_our_node_id ( ) , & cs_updates. update_fulfill_htlcs [ 0 ] ) ;
2094
+ let bs_updates = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2095
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2096
+ expect_payment_forwarded ! ( nodes[ 1 ] , Some ( 1000 ) , false ) ;
2097
+
2098
+ mine_transaction ( & nodes[ 1 ] , & bs_txn[ 0 ] ) ;
2099
+ connect_blocks ( & nodes[ 1 ] , ANTI_REORG_DELAY - 1 ) ;
2100
+ check_closed_broadcast ! ( nodes[ 1 ] , true ) ;
2101
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2102
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
2103
+
2104
+ nodes[ 0 ] . node . handle_update_fulfill_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_updates. update_fulfill_htlcs [ 0 ] ) ;
2105
+ expect_payment_sent ! ( nodes[ 0 ] , payment_preimage) ;
2106
+ commitment_signed_dance ! ( nodes[ 0 ] , nodes[ 1 ] , bs_updates. commitment_signed, true , true ) ;
2107
+ }
2108
+
2067
2109
fn do_update_fee_resend_test ( deliver_update : bool , parallel_updates : bool ) {
2068
2110
// In early versions we did not handle resending of update_fee on reconnect correctly. The
2069
2111
// chanmon_consistency fuzz target, of course, immediately found it, but we test a few cases
0 commit comments