1212use crate :: chain:: { ChannelMonitorUpdateStatus , Watch } ;
1313use crate :: chain:: chaininterface:: LowerBoundedFeeEstimator ;
1414use crate :: chain:: channelmonitor:: { ChannelMonitor , ChannelMonitorUpdateStep } ;
15+ use crate :: routing:: router:: { PaymentParameters , RouteParameters } ;
1516use crate :: sign:: EntropySource ;
1617use crate :: chain:: transaction:: OutPoint ;
1718use crate :: events:: { ClosureReason , Event , HTLCDestination } ;
18- use crate :: ln:: channelmanager:: { ChannelManager , ChannelManagerReadArgs , PaymentId , RecipientOnionFields } ;
19+ use crate :: ln:: channelmanager:: { ChannelManager , ChannelManagerReadArgs , PaymentId , RecipientOnionFields , RAACommitmentOrder } ;
1920use crate :: ln:: msgs;
2021use crate :: ln:: types:: ChannelId ;
2122use crate :: ln:: msgs:: { BaseMessageHandler , ChannelMessageHandler , RoutingMessageHandler , ErrorAction , MessageSendEvent } ;
@@ -27,6 +28,7 @@ use crate::util::config::UserConfig;
2728
2829use bitcoin:: hashes:: Hash ;
2930use bitcoin:: hash_types:: BlockHash ;
31+ use types:: payment:: { PaymentHash , PaymentPreimage } ;
3032
3133use crate :: prelude:: * ;
3234
@@ -504,7 +506,6 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
504506
505507#[ cfg( feature = "std" ) ]
506508fn do_test_data_loss_protect ( reconnect_panicing : bool , substantially_old : bool , not_stale : bool ) {
507- use crate :: routing:: router:: { RouteParameters , PaymentParameters } ;
508509 use crate :: ln:: channelmanager:: Retry ;
509510 use crate :: util:: string:: UntrustedString ;
510511 // When we get a data_loss_protect proving we're behind, we immediately panic as the
@@ -1286,3 +1287,73 @@ fn test_reload_partial_funding_batch() {
12861287 // Ensure the channels don't exist anymore.
12871288 assert ! ( nodes[ 0 ] . node. list_channels( ) . is_empty( ) ) ;
12881289}
1290+
1291+ #[ test]
1292+ fn test_htlc_localremoved_persistence ( ) {
1293+ // Tests that if we fail an htlc back (update_fail_htlc message) and then restart the node, the node will resend the
1294+ // exact same fail message.
1295+ let chanmon_cfgs: Vec < TestChanMonCfg > = create_chanmon_cfgs ( 2 ) ;
1296+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
1297+
1298+ let persister;
1299+ let chain_monitor;
1300+ let deserialized_chanmgr;
1301+
1302+ // Send a keysend payment that fails because of a preimage mismatch.
1303+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
1304+ let mut nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
1305+
1306+ let payee_pubkey = nodes[ 1 ] . node . get_our_node_id ( ) ;
1307+
1308+ let _chan = create_chan_between_nodes ( & nodes[ 0 ] , & nodes[ 1 ] ) ;
1309+ let route_params = RouteParameters :: from_payment_params_and_value (
1310+ PaymentParameters :: for_keysend ( payee_pubkey, 40 , false ) , 10_000 ) ;
1311+ let route = find_route (
1312+ & nodes[ 0 ] , & route_params
1313+ ) . unwrap ( ) ;
1314+
1315+ let test_preimage = PaymentPreimage ( [ 42 ; 32 ] ) ;
1316+ let mismatch_payment_hash = PaymentHash ( [ 43 ; 32 ] ) ;
1317+ let session_privs = nodes[ 0 ] . node . test_add_new_pending_payment ( mismatch_payment_hash,
1318+ RecipientOnionFields :: spontaneous_empty ( ) , PaymentId ( mismatch_payment_hash. 0 ) , & route) . unwrap ( ) ;
1319+ nodes[ 0 ] . node . test_send_payment_internal ( & route, mismatch_payment_hash,
1320+ RecipientOnionFields :: spontaneous_empty ( ) , Some ( test_preimage) , PaymentId ( mismatch_payment_hash. 0 ) , None , session_privs) . unwrap ( ) ;
1321+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
1322+
1323+ let updates = get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
1324+ nodes[ 1 ] . node . handle_update_add_htlc ( nodes[ 0 ] . node . get_our_node_id ( ) , & updates. update_add_htlcs [ 0 ] ) ;
1325+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , & updates. commitment_signed, false ) ;
1326+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
1327+ expect_htlc_handling_failed_destinations ! ( nodes[ 1 ] . node. get_and_clear_pending_events( ) , & [ HTLCDestination :: FailedPayment { payment_hash: mismatch_payment_hash } ] ) ;
1328+ check_added_monitors ( & nodes[ 1 ] , 1 ) ;
1329+
1330+ // Save the update_fail_htlc message for later comparison.
1331+ let msgs = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
1332+ let htlc_fail_msg = msgs. update_fail_htlcs [ 0 ] . clone ( ) ;
1333+
1334+ // Reload nodes.
1335+ nodes[ 0 ] . node . peer_disconnected ( nodes[ 1 ] . node . get_our_node_id ( ) ) ;
1336+ nodes[ 1 ] . node . peer_disconnected ( nodes[ 0 ] . node . get_our_node_id ( ) ) ;
1337+
1338+ let monitor_encoded = get_monitor ! ( nodes[ 1 ] , _chan. 3 ) . encode ( ) ;
1339+ reload_node ! ( nodes[ 1 ] , nodes[ 1 ] . node. encode( ) , & [ & monitor_encoded] , persister, chain_monitor, deserialized_chanmgr) ;
1340+
1341+ nodes[ 0 ] . node . peer_connected ( nodes[ 1 ] . node . get_our_node_id ( ) , & msgs:: Init {
1342+ features : nodes[ 1 ] . node . init_features ( ) , networks : None , remote_network_address : None
1343+ } , true ) . unwrap ( ) ;
1344+ let reestablish_1 = get_chan_reestablish_msgs ! ( nodes[ 0 ] , nodes[ 1 ] ) ;
1345+ assert_eq ! ( reestablish_1. len( ) , 1 ) ;
1346+ nodes[ 1 ] . node . peer_connected ( nodes[ 0 ] . node . get_our_node_id ( ) , & msgs:: Init {
1347+ features : nodes[ 0 ] . node . init_features ( ) , networks : None , remote_network_address : None
1348+ } , false ) . unwrap ( ) ;
1349+ let reestablish_2 = get_chan_reestablish_msgs ! ( nodes[ 1 ] , nodes[ 0 ] ) ;
1350+ assert_eq ! ( reestablish_2. len( ) , 1 ) ;
1351+ nodes[ 0 ] . node . handle_channel_reestablish ( nodes[ 1 ] . node . get_our_node_id ( ) , & reestablish_2[ 0 ] ) ;
1352+ handle_chan_reestablish_msgs ! ( nodes[ 0 ] , nodes[ 1 ] ) ;
1353+ nodes[ 1 ] . node . handle_channel_reestablish ( nodes[ 0 ] . node . get_our_node_id ( ) , & reestablish_1[ 0 ] ) ;
1354+
1355+ // Assert that same failure message is resent after reload.
1356+ let msgs = handle_chan_reestablish_msgs ! ( nodes[ 1 ] , nodes[ 0 ] ) ;
1357+ let htlc_fail_msg_after_reload = msgs. 2 . unwrap ( ) . update_fail_htlcs [ 0 ] . clone ( ) ;
1358+ assert_eq ! ( htlc_fail_msg, htlc_fail_msg_after_reload) ;
1359+ }
0 commit comments