@@ -14868,7 +14868,7 @@ mod tests {
14868
14868
use crate::ln::onion_utils::ATTRIBUTION_DATA_LEN;
14869
14869
use crate::ln::types::ChannelId;
14870
14870
use crate::types::payment::{PaymentPreimage, PaymentHash, PaymentSecret};
14871
- use crate::ln::channelmanager::{create_recv_pending_htlc_info, inbound_payment, ChannelConfigOverrides, HTLCForwardInfo, InterceptId, PaymentId, RecipientOnionFields};
14871
+ use crate::ln::channelmanager::{RAACommitmentOrder, create_recv_pending_htlc_info, inbound_payment, ChannelConfigOverrides, HTLCForwardInfo, InterceptId, PaymentId, RecipientOnionFields};
14872
14872
use crate::ln::functional_test_utils::*;
14873
14873
use crate::ln::msgs::{self, AcceptChannel, ErrorAction};
14874
14874
use crate::ln::msgs::ChannelMessageHandler;
@@ -15340,6 +15340,80 @@ use crate::ln::types::ChannelId;
15340
15340
nodes[1].logger.assert_log_contains("lightning::ln::channelmanager", "Payment preimage didn't match payment hash", 1);
15341
15341
}
15342
15342
15343
+ #[test]
15344
+ fn test_htlc_localremoved_persistence() {
15345
+ let chanmon_cfgs: Vec<TestChanMonCfg> = create_chanmon_cfgs(2);
15346
+ let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
15347
+
15348
+ let persister;
15349
+ let chain_monitor;
15350
+ let deserialized_chanmgr;
15351
+
15352
+ // Send a keysend payment that fails because of a preimage mismatch.
15353
+ let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
15354
+ let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
15355
+
15356
+ let payer_pubkey = nodes[0].node.get_our_node_id();
15357
+ let payee_pubkey = nodes[1].node.get_our_node_id();
15358
+
15359
+ let _chan = create_chan_between_nodes(&nodes[0], &nodes[1]);
15360
+ let route_params = RouteParameters::from_payment_params_and_value(
15361
+ PaymentParameters::for_keysend(payee_pubkey, 40, false), 10_000);
15362
+ let network_graph = nodes[0].network_graph;
15363
+ let first_hops = nodes[0].node.list_usable_channels();
15364
+ let scorer = test_utils::TestScorer::new();
15365
+ let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
15366
+ let route = find_route(
15367
+ &payer_pubkey, &route_params, &network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
15368
+ nodes[0].logger, &scorer, &Default::default(), &random_seed_bytes
15369
+ ).unwrap();
15370
+
15371
+ let test_preimage = PaymentPreimage([42; 32]);
15372
+ let mismatch_payment_hash = PaymentHash([43; 32]);
15373
+ let session_privs = nodes[0].node.test_add_new_pending_payment(mismatch_payment_hash,
15374
+ RecipientOnionFields::spontaneous_empty(), PaymentId(mismatch_payment_hash.0), &route).unwrap();
15375
+ nodes[0].node.test_send_payment_internal(&route, mismatch_payment_hash,
15376
+ RecipientOnionFields::spontaneous_empty(), Some(test_preimage), PaymentId(mismatch_payment_hash.0), None, session_privs).unwrap();
15377
+ check_added_monitors!(nodes[0], 1);
15378
+
15379
+ let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
15380
+ nodes[1].node.handle_update_add_htlc(nodes[0].node.get_our_node_id(), &updates.update_add_htlcs[0]);
15381
+ commitment_signed_dance!(nodes[1], nodes[0], &updates.commitment_signed, false);
15382
+ expect_pending_htlcs_forwardable!(nodes[1]);
15383
+ expect_htlc_handling_failed_destinations!(nodes[1].node.get_and_clear_pending_events(), &[HTLCDestination::FailedPayment { payment_hash: mismatch_payment_hash }]);
15384
+ check_added_monitors(&nodes[1], 1);
15385
+
15386
+ // Save the update_fail_htlc message for later comparison.
15387
+ let msgs = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
15388
+ let htlc_fail_msg = msgs.update_fail_htlcs[0].clone();
15389
+
15390
+ // Reload node.
15391
+ nodes[0].node.peer_disconnected(nodes[1].node.get_our_node_id());
15392
+ nodes[1].node.peer_disconnected(nodes[0].node.get_our_node_id());
15393
+
15394
+ let monitor_encoded = get_monitor!(nodes[1], _chan.3).encode();
15395
+ reload_node!(nodes[1], nodes[1].node.encode(), &[&monitor_encoded], persister, chain_monitor, deserialized_chanmgr);
15396
+
15397
+ nodes[0].node.peer_connected(nodes[1].node.get_our_node_id(), &msgs::Init {
15398
+ features: nodes[1].node.init_features(), networks: None, remote_network_address: None
15399
+ }, true).unwrap();
15400
+ let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
15401
+ assert_eq!(reestablish_1.len(), 1);
15402
+ nodes[1].node.peer_connected(nodes[0].node.get_our_node_id(), &msgs::Init {
15403
+ features: nodes[0].node.init_features(), networks: None, remote_network_address: None
15404
+ }, false).unwrap();
15405
+ let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
15406
+ assert_eq!(reestablish_2.len(), 1);
15407
+ nodes[0].node.handle_channel_reestablish(nodes[1].node.get_our_node_id(), &reestablish_2[0]);
15408
+ handle_chan_reestablish_msgs!(nodes[0], nodes[1]);
15409
+ nodes[1].node.handle_channel_reestablish(nodes[0].node.get_our_node_id(), &reestablish_1[0]);
15410
+
15411
+ // Assert that same failure message is resent after reload.
15412
+ let msgs = handle_chan_reestablish_msgs!(nodes[1], nodes[0]);
15413
+ let htlc_fail_msg_after_reload = msgs.2.unwrap().update_fail_htlcs[0].clone();
15414
+ assert_eq!(htlc_fail_msg, htlc_fail_msg_after_reload);
15415
+ }
15416
+
15343
15417
#[test]
15344
15418
fn test_multi_hop_missing_secret() {
15345
15419
let chanmon_cfgs = create_chanmon_cfgs(4);
0 commit comments