mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-25 15:20:24 +01:00
Add a PaymentClaimed
event to indicate a payment was claimed
This replaces the return value of `claim_funds` with an event. It does not yet change behavior in any material way.
This commit is contained in:
parent
28c70ac506
commit
0a2a40c4fd
11 changed files with 248 additions and 86 deletions
|
@ -842,11 +842,12 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
||||||
if $fail {
|
if $fail {
|
||||||
assert!(nodes[$node].fail_htlc_backwards(&payment_hash));
|
assert!(nodes[$node].fail_htlc_backwards(&payment_hash));
|
||||||
} else {
|
} else {
|
||||||
assert!(nodes[$node].claim_funds(PaymentPreimage(payment_hash.0)));
|
nodes[$node].claim_funds(PaymentPreimage(payment_hash.0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
events::Event::PaymentSent { .. } => {},
|
events::Event::PaymentSent { .. } => {},
|
||||||
|
events::Event::PaymentClaimed { .. } => {},
|
||||||
events::Event::PaymentPathSuccessful { .. } => {},
|
events::Event::PaymentPathSuccessful { .. } => {},
|
||||||
events::Event::PaymentPathFailed { .. } => {},
|
events::Event::PaymentPathFailed { .. } => {},
|
||||||
events::Event::PaymentForwarded { .. } if $node == 1 => {},
|
events::Event::PaymentForwarded { .. } if $node == 1 => {},
|
||||||
|
|
|
@ -731,7 +731,7 @@ impl<ChannelSigner: Sign, C: Deref, T: Deref, F: Deref, L: Deref, P: Deref> even
|
||||||
mod tests {
|
mod tests {
|
||||||
use bitcoin::BlockHeader;
|
use bitcoin::BlockHeader;
|
||||||
use ::{check_added_monitors, check_closed_broadcast, check_closed_event};
|
use ::{check_added_monitors, check_closed_broadcast, check_closed_event};
|
||||||
use ::{expect_payment_sent, expect_payment_sent_without_paths, expect_payment_path_successful, get_event_msg};
|
use ::{expect_payment_sent, expect_payment_claimed, expect_payment_sent_without_paths, expect_payment_path_successful, get_event_msg};
|
||||||
use ::{get_htlc_update_msgs, get_local_commitment_txn, get_revoke_commit_msgs, get_route_and_payment_hash, unwrap_send_err};
|
use ::{get_htlc_update_msgs, get_local_commitment_txn, get_revoke_commit_msgs, get_route_and_payment_hash, unwrap_send_err};
|
||||||
use chain::{ChannelMonitorUpdateErr, Confirm, Watch};
|
use chain::{ChannelMonitorUpdateErr, Confirm, Watch};
|
||||||
use chain::channelmonitor::LATENCY_GRACE_PERIOD_BLOCKS;
|
use chain::channelmonitor::LATENCY_GRACE_PERIOD_BLOCKS;
|
||||||
|
@ -798,16 +798,18 @@ mod tests {
|
||||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
|
|
||||||
// Route two payments to be claimed at the same time.
|
// Route two payments to be claimed at the same time.
|
||||||
let payment_preimage_1 = route_payment(&nodes[0], &[&nodes[1]], 1_000_000).0;
|
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||||
let payment_preimage_2 = route_payment(&nodes[0], &[&nodes[1]], 1_000_000).0;
|
let (payment_preimage_2, payment_hash_2, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||||
|
|
||||||
chanmon_cfgs[1].persister.offchain_monitor_updates.lock().unwrap().clear();
|
chanmon_cfgs[1].persister.offchain_monitor_updates.lock().unwrap().clear();
|
||||||
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
||||||
|
|
||||||
nodes[1].node.claim_funds(payment_preimage_1);
|
nodes[1].node.claim_funds(payment_preimage_1);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
|
||||||
nodes[1].node.claim_funds(payment_preimage_2);
|
nodes[1].node.claim_funds(payment_preimage_2);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_2, 1_000_000);
|
||||||
|
|
||||||
chanmon_cfgs[1].persister.set_update_ret(Ok(()));
|
chanmon_cfgs[1].persister.set_update_ret(Ok(()));
|
||||||
|
|
||||||
|
@ -877,8 +879,9 @@ mod tests {
|
||||||
let (route, second_payment_hash, _, second_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 100_000);
|
let (route, second_payment_hash, _, second_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 100_000);
|
||||||
|
|
||||||
// First route a payment that we will claim on chain and give the recipient the preimage.
|
// First route a payment that we will claim on chain and give the recipient the preimage.
|
||||||
let payment_preimage = route_payment(&nodes[0], &[&nodes[1]], 1_000_000).0;
|
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||||
nodes[1].node.claim_funds(payment_preimage);
|
nodes[1].node.claim_funds(payment_preimage);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash, 1_000_000);
|
||||||
nodes[1].node.get_and_clear_pending_msg_events();
|
nodes[1].node.get_and_clear_pending_msg_events();
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
let remote_txn = get_local_commitment_txn!(nodes[1], channel.2);
|
let remote_txn = get_local_commitment_txn!(nodes[1], channel.2);
|
||||||
|
|
|
@ -89,7 +89,7 @@ fn test_monitor_and_persister_update_fail() {
|
||||||
send_payment(&nodes[0], &vec!(&nodes[1])[..], 10_000_000);
|
send_payment(&nodes[0], &vec!(&nodes[1])[..], 10_000_000);
|
||||||
|
|
||||||
// Route an HTLC from node 0 to node 1 (but don't settle)
|
// Route an HTLC from node 0 to node 1 (but don't settle)
|
||||||
let preimage = route_payment(&nodes[0], &vec!(&nodes[1])[..], 9_000_000).0;
|
let (preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 9_000_000);
|
||||||
|
|
||||||
// Make a copy of the ChainMonitor so we can capture the error it returns on a
|
// Make a copy of the ChainMonitor so we can capture the error it returns on a
|
||||||
// bogus update. Note that if instead we updated the nodes[0]'s ChainMonitor
|
// bogus update. Note that if instead we updated the nodes[0]'s ChainMonitor
|
||||||
|
@ -123,8 +123,10 @@ fn test_monitor_and_persister_update_fail() {
|
||||||
persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
||||||
|
|
||||||
// Try to update ChannelMonitor
|
// Try to update ChannelMonitor
|
||||||
assert!(nodes[1].node.claim_funds(preimage));
|
nodes[1].node.claim_funds(preimage);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash, 9_000_000);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
|
||||||
let updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
let updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
||||||
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
|
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
|
||||||
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &updates.update_fulfill_htlcs[0]);
|
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &updates.update_fulfill_htlcs[0]);
|
||||||
|
@ -267,7 +269,7 @@ fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
|
||||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||||
|
|
||||||
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
|
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||||
|
|
||||||
// Now try to send a second payment which will fail to send
|
// Now try to send a second payment which will fail to send
|
||||||
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||||
|
@ -283,8 +285,10 @@ fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
|
||||||
|
|
||||||
// Claim the previous payment, which will result in a update_fulfill_htlc/CS from nodes[1]
|
// Claim the previous payment, which will result in a update_fulfill_htlc/CS from nodes[1]
|
||||||
// but nodes[0] won't respond since it is frozen.
|
// but nodes[0] won't respond since it is frozen.
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage_1));
|
nodes[1].node.claim_funds(payment_preimage_1);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
|
||||||
|
|
||||||
let events_2 = nodes[1].node.get_and_clear_pending_msg_events();
|
let events_2 = nodes[1].node.get_and_clear_pending_msg_events();
|
||||||
assert_eq!(events_2.len(), 1);
|
assert_eq!(events_2.len(), 1);
|
||||||
let (bs_initial_fulfill, bs_initial_commitment_signed) = match events_2[0] {
|
let (bs_initial_fulfill, bs_initial_commitment_signed) = match events_2[0] {
|
||||||
|
@ -1088,13 +1092,15 @@ fn test_monitor_update_fail_reestablish() {
|
||||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||||
|
|
||||||
let (payment_preimage, _, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1000000);
|
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1_000_000);
|
||||||
|
|
||||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||||
|
|
||||||
assert!(nodes[2].node.claim_funds(payment_preimage));
|
nodes[2].node.claim_funds(payment_preimage);
|
||||||
check_added_monitors!(nodes[2], 1);
|
check_added_monitors!(nodes[2], 1);
|
||||||
|
expect_payment_claimed!(nodes[2], payment_hash, 1_000_000);
|
||||||
|
|
||||||
let mut updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
let mut updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
||||||
assert!(updates.update_add_htlcs.is_empty());
|
assert!(updates.update_add_htlcs.is_empty());
|
||||||
assert!(updates.update_fail_htlcs.is_empty());
|
assert!(updates.update_fail_htlcs.is_empty());
|
||||||
|
@ -1292,13 +1298,14 @@ fn claim_while_disconnected_monitor_update_fail() {
|
||||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||||
|
|
||||||
// Forward a payment for B to claim
|
// Forward a payment for B to claim
|
||||||
let (payment_preimage_1, _, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
|
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||||
|
|
||||||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||||
|
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage_1));
|
nodes[1].node.claim_funds(payment_preimage_1);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
|
||||||
|
|
||||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||||
|
@ -1578,10 +1585,11 @@ fn test_monitor_update_fail_claim() {
|
||||||
// Rebalance a bit so that we can send backwards from 3 to 2.
|
// Rebalance a bit so that we can send backwards from 3 to 2.
|
||||||
send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 5000000);
|
send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 5000000);
|
||||||
|
|
||||||
let (payment_preimage_1, _, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
|
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||||
|
|
||||||
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage_1));
|
nodes[1].node.claim_funds(payment_preimage_1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
|
||||||
nodes[1].logger.assert_log("lightning::ln::channelmanager".to_string(), "Temporary failure claiming HTLC, treating as success: Failed to update ChannelMonitor".to_string(), 1);
|
nodes[1].logger.assert_log("lightning::ln::channelmanager".to_string(), "Temporary failure claiming HTLC, treating as success: Failed to update ChannelMonitor".to_string(), 1);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
|
||||||
|
@ -1754,7 +1762,7 @@ fn monitor_update_claim_fail_no_response() {
|
||||||
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
|
||||||
|
|
||||||
// Forward a payment for B to claim
|
// Forward a payment for B to claim
|
||||||
let (payment_preimage_1, _, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
|
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||||
|
|
||||||
// Now start forwarding a second payment, skipping the last RAA so B is in AwaitingRAA
|
// Now start forwarding a second payment, skipping the last RAA so B is in AwaitingRAA
|
||||||
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||||
|
@ -1770,8 +1778,10 @@ fn monitor_update_claim_fail_no_response() {
|
||||||
let as_raa = commitment_signed_dance!(nodes[1], nodes[0], payment_event.commitment_msg, false, true, false, true);
|
let as_raa = commitment_signed_dance!(nodes[1], nodes[0], payment_event.commitment_msg, false, true, false, true);
|
||||||
|
|
||||||
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage_1));
|
nodes[1].node.claim_funds(payment_preimage_1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
|
||||||
let events = nodes[1].node.get_and_clear_pending_msg_events();
|
let events = nodes[1].node.get_and_clear_pending_msg_events();
|
||||||
assert_eq!(events.len(), 0);
|
assert_eq!(events.len(), 0);
|
||||||
nodes[1].logger.assert_log("lightning::ln::channelmanager".to_string(), "Temporary failure claiming HTLC, treating as success: Failed to update ChannelMonitor".to_string(), 1);
|
nodes[1].logger.assert_log("lightning::ln::channelmanager".to_string(), "Temporary failure claiming HTLC, treating as success: Failed to update ChannelMonitor".to_string(), 1);
|
||||||
|
@ -2076,13 +2086,15 @@ fn test_fail_htlc_on_broadcast_after_claim() {
|
||||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known()).2;
|
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known()).2;
|
||||||
|
|
||||||
let payment_preimage = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 2000).0;
|
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 2000);
|
||||||
|
|
||||||
let bs_txn = get_local_commitment_txn!(nodes[2], chan_id_2);
|
let bs_txn = get_local_commitment_txn!(nodes[2], chan_id_2);
|
||||||
assert_eq!(bs_txn.len(), 1);
|
assert_eq!(bs_txn.len(), 1);
|
||||||
|
|
||||||
nodes[2].node.claim_funds(payment_preimage);
|
nodes[2].node.claim_funds(payment_preimage);
|
||||||
check_added_monitors!(nodes[2], 1);
|
check_added_monitors!(nodes[2], 1);
|
||||||
|
expect_payment_claimed!(nodes[2], payment_hash, 2000);
|
||||||
|
|
||||||
let cs_updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
let cs_updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
||||||
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &cs_updates.update_fulfill_htlcs[0]);
|
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &cs_updates.update_fulfill_htlcs[0]);
|
||||||
let bs_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
let bs_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
||||||
|
@ -2235,7 +2247,7 @@ fn do_channel_holding_cell_serialize(disconnect: bool, reload_a: bool) {
|
||||||
//
|
//
|
||||||
// Note that because, at the end, MonitorUpdateFailed is still set, the HTLC generated in (c)
|
// Note that because, at the end, MonitorUpdateFailed is still set, the HTLC generated in (c)
|
||||||
// will not be freed from the holding cell.
|
// will not be freed from the holding cell.
|
||||||
let (payment_preimage_0, _, _) = route_payment(&nodes[1], &[&nodes[0]], 100000);
|
let (payment_preimage_0, payment_hash_0, _) = route_payment(&nodes[1], &[&nodes[0]], 100_000);
|
||||||
|
|
||||||
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1)).unwrap();
|
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1)).unwrap();
|
||||||
check_added_monitors!(nodes[0], 1);
|
check_added_monitors!(nodes[0], 1);
|
||||||
|
@ -2246,8 +2258,9 @@ fn do_channel_holding_cell_serialize(disconnect: bool, reload_a: bool) {
|
||||||
check_added_monitors!(nodes[0], 0);
|
check_added_monitors!(nodes[0], 0);
|
||||||
|
|
||||||
chanmon_cfgs[0].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
chanmon_cfgs[0].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
||||||
assert!(nodes[0].node.claim_funds(payment_preimage_0));
|
nodes[0].node.claim_funds(payment_preimage_0);
|
||||||
check_added_monitors!(nodes[0], 1);
|
check_added_monitors!(nodes[0], 1);
|
||||||
|
expect_payment_claimed!(nodes[0], payment_hash_0, 100_000);
|
||||||
|
|
||||||
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &send.msgs[0]);
|
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &send.msgs[0]);
|
||||||
nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), &send.commitment_msg);
|
nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), &send.commitment_msg);
|
||||||
|
@ -2460,8 +2473,10 @@ fn do_test_reconnect_dup_htlc_claims(htlc_status: HTLCStatusAtDupClaim, second_f
|
||||||
check_added_monitors!(nodes[2], 1);
|
check_added_monitors!(nodes[2], 1);
|
||||||
get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
||||||
} else {
|
} else {
|
||||||
assert!(nodes[2].node.claim_funds(payment_preimage));
|
nodes[2].node.claim_funds(payment_preimage);
|
||||||
check_added_monitors!(nodes[2], 1);
|
check_added_monitors!(nodes[2], 1);
|
||||||
|
expect_payment_claimed!(nodes[2], payment_hash, 100_000);
|
||||||
|
|
||||||
let cs_updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
let cs_updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
||||||
assert_eq!(cs_updates.update_fulfill_htlcs.len(), 1);
|
assert_eq!(cs_updates.update_fulfill_htlcs.len(), 1);
|
||||||
// Check that the message we're about to deliver matches the one generated:
|
// Check that the message we're about to deliver matches the one generated:
|
||||||
|
@ -2630,20 +2645,22 @@ fn double_temp_error() {
|
||||||
|
|
||||||
let (_, _, channel_id, _) = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
let (_, _, channel_id, _) = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
|
|
||||||
let (payment_preimage_1, _, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
|
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||||
let (payment_preimage_2, _, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
|
let (payment_preimage_2, payment_hash_2, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||||
|
|
||||||
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
||||||
// `claim_funds` results in a ChannelMonitorUpdate.
|
// `claim_funds` results in a ChannelMonitorUpdate.
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage_1));
|
nodes[1].node.claim_funds(payment_preimage_1);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
|
||||||
let (funding_tx, latest_update_1, _) = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap().get(&channel_id).unwrap().clone();
|
let (funding_tx, latest_update_1, _) = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap().get(&channel_id).unwrap().clone();
|
||||||
|
|
||||||
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
||||||
// Previously, this would've panicked due to a double-call to `Channel::monitor_update_failed`,
|
// Previously, this would've panicked due to a double-call to `Channel::monitor_update_failed`,
|
||||||
// which had some asserts that prevented it from being called twice.
|
// which had some asserts that prevented it from being called twice.
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage_2));
|
nodes[1].node.claim_funds(payment_preimage_2);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_2, 1_000_000);
|
||||||
chanmon_cfgs[1].persister.set_update_ret(Ok(()));
|
chanmon_cfgs[1].persister.set_update_ret(Ok(()));
|
||||||
|
|
||||||
let (_, latest_update_2, _) = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap().get(&channel_id).unwrap().clone();
|
let (_, latest_update_2, _) = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap().get(&channel_id).unwrap().clone();
|
||||||
|
|
|
@ -3788,26 +3788,29 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
||||||
/// Provides a payment preimage in response to [`Event::PaymentReceived`], generating any
|
/// Provides a payment preimage in response to [`Event::PaymentReceived`], generating any
|
||||||
/// [`MessageSendEvent`]s needed to claim the payment.
|
/// [`MessageSendEvent`]s needed to claim the payment.
|
||||||
///
|
///
|
||||||
|
/// Note that calling this method does *not* guarantee that the payment has been claimed. You
|
||||||
|
/// *must* wait for an [`Event::PaymentClaimed`] event which upon a successful claim will be
|
||||||
|
/// provided to your [`EventHandler`] when [`process_pending_events`] is next called.
|
||||||
|
///
|
||||||
/// Note that if you did not set an `amount_msat` when calling [`create_inbound_payment`] or
|
/// Note that if you did not set an `amount_msat` when calling [`create_inbound_payment`] or
|
||||||
/// [`create_inbound_payment_for_hash`] you must check that the amount in the `PaymentReceived`
|
/// [`create_inbound_payment_for_hash`] you must check that the amount in the `PaymentReceived`
|
||||||
/// event matches your expectation. If you fail to do so and call this method, you may provide
|
/// event matches your expectation. If you fail to do so and call this method, you may provide
|
||||||
/// the sender "proof-of-payment" when they did not fulfill the full expected payment.
|
/// the sender "proof-of-payment" when they did not fulfill the full expected payment.
|
||||||
///
|
///
|
||||||
/// Returns whether any HTLCs were claimed, and thus if any new [`MessageSendEvent`]s are now
|
|
||||||
/// pending for processing via [`get_and_clear_pending_msg_events`].
|
|
||||||
///
|
|
||||||
/// [`Event::PaymentReceived`]: crate::util::events::Event::PaymentReceived
|
/// [`Event::PaymentReceived`]: crate::util::events::Event::PaymentReceived
|
||||||
|
/// [`Event::PaymentClaimed`]: crate::util::events::Event::PaymentClaimed
|
||||||
|
/// [`process_pending_events`]: EventsProvider::process_pending_events
|
||||||
/// [`create_inbound_payment`]: Self::create_inbound_payment
|
/// [`create_inbound_payment`]: Self::create_inbound_payment
|
||||||
/// [`create_inbound_payment_for_hash`]: Self::create_inbound_payment_for_hash
|
/// [`create_inbound_payment_for_hash`]: Self::create_inbound_payment_for_hash
|
||||||
/// [`get_and_clear_pending_msg_events`]: MessageSendEventsProvider::get_and_clear_pending_msg_events
|
/// [`get_and_clear_pending_msg_events`]: MessageSendEventsProvider::get_and_clear_pending_msg_events
|
||||||
pub fn claim_funds(&self, payment_preimage: PaymentPreimage) -> bool {
|
pub fn claim_funds(&self, payment_preimage: PaymentPreimage) {
|
||||||
let payment_hash = PaymentHash(Sha256::hash(&payment_preimage.0).into_inner());
|
let payment_hash = PaymentHash(Sha256::hash(&payment_preimage.0).into_inner());
|
||||||
|
|
||||||
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
|
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
|
||||||
|
|
||||||
let mut channel_state = Some(self.channel_state.lock().unwrap());
|
let mut channel_state = Some(self.channel_state.lock().unwrap());
|
||||||
let removed_source = channel_state.as_mut().unwrap().claimable_htlcs.remove(&payment_hash);
|
let removed_source = channel_state.as_mut().unwrap().claimable_htlcs.remove(&payment_hash);
|
||||||
if let Some((_, mut sources)) = removed_source {
|
if let Some((payment_purpose, mut sources)) = removed_source {
|
||||||
assert!(!sources.is_empty());
|
assert!(!sources.is_empty());
|
||||||
|
|
||||||
// If we are claiming an MPP payment, we have to take special care to ensure that each
|
// If we are claiming an MPP payment, we have to take special care to ensure that each
|
||||||
|
@ -3821,12 +3824,14 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
||||||
// we got all the HTLCs and then a channel closed while we were waiting for the user to
|
// we got all the HTLCs and then a channel closed while we were waiting for the user to
|
||||||
// provide the preimage, so worrying too much about the optimal handling isn't worth
|
// provide the preimage, so worrying too much about the optimal handling isn't worth
|
||||||
// it.
|
// it.
|
||||||
|
let mut claimable_amt_msat = 0;
|
||||||
let mut valid_mpp = true;
|
let mut valid_mpp = true;
|
||||||
for htlc in sources.iter() {
|
for htlc in sources.iter() {
|
||||||
if let None = channel_state.as_ref().unwrap().short_to_id.get(&htlc.prev_hop.short_channel_id) {
|
if let None = channel_state.as_ref().unwrap().short_to_id.get(&htlc.prev_hop.short_channel_id) {
|
||||||
valid_mpp = false;
|
valid_mpp = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
claimable_amt_msat += htlc.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut errs = Vec::new();
|
let mut errs = Vec::new();
|
||||||
|
@ -3862,6 +3867,14 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if claimed_any_htlcs {
|
||||||
|
self.pending_events.lock().unwrap().push(events::Event::PaymentClaimed {
|
||||||
|
payment_hash,
|
||||||
|
purpose: payment_purpose,
|
||||||
|
amt: claimable_amt_msat,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Now that we've done the entire above loop in one lock, we can handle any errors
|
// Now that we've done the entire above loop in one lock, we can handle any errors
|
||||||
// which were generated.
|
// which were generated.
|
||||||
channel_state.take();
|
channel_state.take();
|
||||||
|
@ -3870,9 +3883,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
||||||
let res: Result<(), _> = Err(err);
|
let res: Result<(), _> = Err(err);
|
||||||
let _ = handle_error!(self, res, counterparty_node_id);
|
let _ = handle_error!(self, res, counterparty_node_id);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
claimed_any_htlcs
|
|
||||||
} else { false }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn claim_funds_from_hop(&self, channel_state_lock: &mut MutexGuard<ChannelHolder<Signer>>, prev_hop: HTLCPreviousHopData, payment_preimage: PaymentPreimage) -> ClaimFundsFromHop {
|
fn claim_funds_from_hop(&self, channel_state_lock: &mut MutexGuard<ChannelHolder<Signer>>, prev_hop: HTLCPreviousHopData, payment_preimage: PaymentPreimage) -> ClaimFundsFromHop {
|
||||||
|
@ -6827,7 +6838,7 @@ impl<'a, Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
|
||||||
for (_, monitor) in args.channel_monitors.iter() {
|
for (_, monitor) in args.channel_monitors.iter() {
|
||||||
for (payment_hash, payment_preimage) in monitor.get_stored_preimages() {
|
for (payment_hash, payment_preimage) in monitor.get_stored_preimages() {
|
||||||
if let Some(claimable_htlcs) = claimable_htlcs.remove(&payment_hash) {
|
if let Some(claimable_htlcs) = claimable_htlcs.remove(&payment_hash) {
|
||||||
log_info!(args.logger, "Re-claimaing HTLCs with payment hash {} due to partial-claim.", log_bytes!(payment_hash.0));
|
log_info!(args.logger, "Re-claiming HTLCs with payment hash {} as we've released the preimage to a ChannelMonitor!", log_bytes!(payment_hash.0));
|
||||||
for claimable_htlc in claimable_htlcs.1 {
|
for claimable_htlc in claimable_htlcs.1 {
|
||||||
// Add a holding-cell claim of the payment to the Channel, which should be
|
// Add a holding-cell claim of the payment to the Channel, which should be
|
||||||
// applied ~immediately on peer reconnection. Because it won't generate a
|
// applied ~immediately on peer reconnection. Because it won't generate a
|
||||||
|
@ -7109,8 +7120,10 @@ mod tests {
|
||||||
// claim_funds_along_route because the ordering of the messages causes the second half of the
|
// claim_funds_along_route because the ordering of the messages causes the second half of the
|
||||||
// payment to be put in the holding cell, which confuses the test utilities. So we exchange the
|
// payment to be put in the holding cell, which confuses the test utilities. So we exchange the
|
||||||
// lightning messages manually.
|
// lightning messages manually.
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage));
|
nodes[1].node.claim_funds(payment_preimage);
|
||||||
|
expect_payment_claimed!(nodes[1], our_payment_hash, 200_000);
|
||||||
check_added_monitors!(nodes[1], 2);
|
check_added_monitors!(nodes[1], 2);
|
||||||
|
|
||||||
let bs_first_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
let bs_first_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
||||||
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &bs_first_updates.update_fulfill_htlcs[0]);
|
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &bs_first_updates.update_fulfill_htlcs[0]);
|
||||||
nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &bs_first_updates.commitment_signed);
|
nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &bs_first_updates.commitment_signed);
|
||||||
|
@ -7556,7 +7569,8 @@ pub mod bench {
|
||||||
|
|
||||||
expect_pending_htlcs_forwardable!(NodeHolder { node: &$node_b });
|
expect_pending_htlcs_forwardable!(NodeHolder { node: &$node_b });
|
||||||
expect_payment_received!(NodeHolder { node: &$node_b }, payment_hash, payment_secret, 10_000);
|
expect_payment_received!(NodeHolder { node: &$node_b }, payment_hash, payment_secret, 10_000);
|
||||||
assert!($node_b.claim_funds(payment_preimage));
|
$node_b.claim_funds(payment_preimage);
|
||||||
|
expect_payment_claimed!(NodeHolder { node: &$node_b }, payment_hash, 10_000);
|
||||||
|
|
||||||
match $node_b.get_and_clear_pending_msg_events().pop().unwrap() {
|
match $node_b.get_and_clear_pending_msg_events().pop().unwrap() {
|
||||||
MessageSendEvent::UpdateHTLCs { node_id, updates } => {
|
MessageSendEvent::UpdateHTLCs { node_id, updates } => {
|
||||||
|
|
|
@ -34,6 +34,8 @@ use bitcoin::blockdata::transaction::{Transaction, TxOut};
|
||||||
use bitcoin::network::constants::Network;
|
use bitcoin::network::constants::Network;
|
||||||
|
|
||||||
use bitcoin::hash_types::BlockHash;
|
use bitcoin::hash_types::BlockHash;
|
||||||
|
use bitcoin::hashes::sha256::Hash as Sha256;
|
||||||
|
use bitcoin::hashes::Hash as _;
|
||||||
|
|
||||||
use bitcoin::secp256k1::PublicKey;
|
use bitcoin::secp256k1::PublicKey;
|
||||||
|
|
||||||
|
@ -1266,6 +1268,22 @@ macro_rules! expect_payment_received {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
#[cfg(any(test, feature = "_bench_unstable", feature = "_test_utils"))]
|
||||||
|
macro_rules! expect_payment_claimed {
|
||||||
|
($node: expr, $expected_payment_hash: expr, $expected_recv_value: expr) => {
|
||||||
|
let events = $node.node.get_and_clear_pending_events();
|
||||||
|
assert_eq!(events.len(), 1);
|
||||||
|
match events[0] {
|
||||||
|
$crate::util::events::Event::PaymentClaimed { ref payment_hash, amt, .. } => {
|
||||||
|
assert_eq!($expected_payment_hash, *payment_hash);
|
||||||
|
assert_eq!($expected_recv_value, amt);
|
||||||
|
},
|
||||||
|
_ => panic!("Unexpected event"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! expect_payment_sent_without_paths {
|
macro_rules! expect_payment_sent_without_paths {
|
||||||
|
@ -1550,7 +1568,19 @@ pub fn do_claim_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>,
|
||||||
for path in expected_paths.iter() {
|
for path in expected_paths.iter() {
|
||||||
assert_eq!(path.last().unwrap().node.get_our_node_id(), expected_paths[0].last().unwrap().node.get_our_node_id());
|
assert_eq!(path.last().unwrap().node.get_our_node_id(), expected_paths[0].last().unwrap().node.get_our_node_id());
|
||||||
}
|
}
|
||||||
assert!(expected_paths[0].last().unwrap().node.claim_funds(our_payment_preimage));
|
expected_paths[0].last().unwrap().node.claim_funds(our_payment_preimage);
|
||||||
|
|
||||||
|
let claim_event = expected_paths[0].last().unwrap().node.get_and_clear_pending_events();
|
||||||
|
assert_eq!(claim_event.len(), 1);
|
||||||
|
match claim_event[0] {
|
||||||
|
Event::PaymentClaimed { purpose: PaymentPurpose::SpontaneousPayment(preimage), .. }|
|
||||||
|
Event::PaymentClaimed { purpose: PaymentPurpose::InvoicePayment { payment_preimage: Some(preimage), ..}, .. } =>
|
||||||
|
assert_eq!(preimage, our_payment_preimage),
|
||||||
|
Event::PaymentClaimed { purpose: PaymentPurpose::InvoicePayment { .. }, payment_hash, .. } =>
|
||||||
|
assert_eq!(&payment_hash.0, &Sha256::hash(&our_payment_preimage.0)[..]),
|
||||||
|
_ => panic!(),
|
||||||
|
}
|
||||||
|
|
||||||
check_added_monitors!(expected_paths[0].last().unwrap(), expected_paths.len());
|
check_added_monitors!(expected_paths[0].last().unwrap(), expected_paths.len());
|
||||||
|
|
||||||
let mut expected_total_fee_msat = 0;
|
let mut expected_total_fee_msat = 0;
|
||||||
|
@ -1645,7 +1675,7 @@ pub fn do_claim_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure that claim_funds is idempotent.
|
// Ensure that claim_funds is idempotent.
|
||||||
assert!(!expected_paths[0].last().unwrap().node.claim_funds(our_payment_preimage));
|
expected_paths[0].last().unwrap().node.claim_funds(our_payment_preimage);
|
||||||
assert!(expected_paths[0].last().unwrap().node.get_and_clear_pending_msg_events().is_empty());
|
assert!(expected_paths[0].last().unwrap().node.get_and_clear_pending_msg_events().is_empty());
|
||||||
check_added_monitors!(expected_paths[0].last().unwrap(), 0);
|
check_added_monitors!(expected_paths[0].last().unwrap(), 0);
|
||||||
|
|
||||||
|
|
|
@ -1259,6 +1259,7 @@ fn test_duplicate_htlc_different_direction_onchain() {
|
||||||
|
|
||||||
// Provide preimage to node 0 by claiming payment
|
// Provide preimage to node 0 by claiming payment
|
||||||
nodes[0].node.claim_funds(payment_preimage);
|
nodes[0].node.claim_funds(payment_preimage);
|
||||||
|
expect_payment_claimed!(nodes[0], payment_hash, 800_000);
|
||||||
check_added_monitors!(nodes[0], 1);
|
check_added_monitors!(nodes[0], 1);
|
||||||
|
|
||||||
// Broadcast node 1 commitment txn
|
// Broadcast node 1 commitment txn
|
||||||
|
@ -2031,8 +2032,9 @@ fn channel_reserve_in_flight_removes() {
|
||||||
|
|
||||||
let b_chan_values = get_channel_value_stat!(nodes[1], chan_1.2);
|
let b_chan_values = get_channel_value_stat!(nodes[1], chan_1.2);
|
||||||
// Route the first two HTLCs.
|
// Route the first two HTLCs.
|
||||||
let (payment_preimage_1, _, _) = route_payment(&nodes[0], &[&nodes[1]], b_chan_values.channel_reserve_msat - b_chan_values.value_to_self_msat - 10000);
|
let payment_value_1 = b_chan_values.channel_reserve_msat - b_chan_values.value_to_self_msat - 10000;
|
||||||
let (payment_preimage_2, _, _) = route_payment(&nodes[0], &[&nodes[1]], 20000);
|
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], payment_value_1);
|
||||||
|
let (payment_preimage_2, payment_hash_2, _) = route_payment(&nodes[0], &[&nodes[1]], 20_000);
|
||||||
|
|
||||||
// Start routing the third HTLC (this is just used to get everyone in the right state).
|
// Start routing the third HTLC (this is just used to get everyone in the right state).
|
||||||
let (route, payment_hash_3, payment_preimage_3, payment_secret_3) = get_route_and_payment_hash!(nodes[0], nodes[1], 100000);
|
let (route, payment_hash_3, payment_preimage_3, payment_secret_3) = get_route_and_payment_hash!(nodes[0], nodes[1], 100000);
|
||||||
|
@ -2046,13 +2048,15 @@ fn channel_reserve_in_flight_removes() {
|
||||||
|
|
||||||
// Now claim both of the first two HTLCs on B's end, putting B in AwaitingRAA and generating an
|
// Now claim both of the first two HTLCs on B's end, putting B in AwaitingRAA and generating an
|
||||||
// initial fulfill/CS.
|
// initial fulfill/CS.
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage_1));
|
nodes[1].node.claim_funds(payment_preimage_1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_1, payment_value_1);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
let bs_removes = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
let bs_removes = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
||||||
|
|
||||||
// This claim goes in B's holding cell, allowing us to have a pending B->A RAA which does not
|
// This claim goes in B's holding cell, allowing us to have a pending B->A RAA which does not
|
||||||
// remove the second HTLC when we send the HTLC back from B to A.
|
// remove the second HTLC when we send the HTLC back from B to A.
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage_2));
|
nodes[1].node.claim_funds(payment_preimage_2);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_2, 20_000);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
|
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
|
||||||
|
|
||||||
|
@ -2195,7 +2199,7 @@ fn channel_monitor_network_test() {
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
|
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed);
|
||||||
|
|
||||||
// One pending HTLC is discarded by the force-close:
|
// One pending HTLC is discarded by the force-close:
|
||||||
let payment_preimage_1 = route_payment(&nodes[1], &vec!(&nodes[2], &nodes[3])[..], 3000000).0;
|
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[1], &[&nodes[2], &nodes[3]], 3_000_000);
|
||||||
|
|
||||||
// Simple case of one pending HTLC to HTLC-Timeout (note that the HTLC-Timeout is not
|
// Simple case of one pending HTLC to HTLC-Timeout (note that the HTLC-Timeout is not
|
||||||
// broadcasted until we reach the timelock time).
|
// broadcasted until we reach the timelock time).
|
||||||
|
@ -2217,9 +2221,10 @@ fn channel_monitor_network_test() {
|
||||||
check_closed_event!(nodes[2], 1, ClosureReason::CommitmentTxConfirmed);
|
check_closed_event!(nodes[2], 1, ClosureReason::CommitmentTxConfirmed);
|
||||||
|
|
||||||
macro_rules! claim_funds {
|
macro_rules! claim_funds {
|
||||||
($node: expr, $prev_node: expr, $preimage: expr) => {
|
($node: expr, $prev_node: expr, $preimage: expr, $payment_hash: expr) => {
|
||||||
{
|
{
|
||||||
assert!($node.node.claim_funds($preimage));
|
$node.node.claim_funds($preimage);
|
||||||
|
expect_payment_claimed!($node, $payment_hash, 3_000_000);
|
||||||
check_added_monitors!($node, 1);
|
check_added_monitors!($node, 1);
|
||||||
|
|
||||||
let events = $node.node.get_and_clear_pending_msg_events();
|
let events = $node.node.get_and_clear_pending_msg_events();
|
||||||
|
@ -2249,7 +2254,7 @@ fn channel_monitor_network_test() {
|
||||||
node2_commitment_txid = node_txn[0].txid();
|
node2_commitment_txid = node_txn[0].txid();
|
||||||
|
|
||||||
// Claim the payment on nodes[3], giving it knowledge of the preimage
|
// Claim the payment on nodes[3], giving it knowledge of the preimage
|
||||||
claim_funds!(nodes[3], nodes[2], payment_preimage_1);
|
claim_funds!(nodes[3], nodes[2], payment_preimage_1, payment_hash_1);
|
||||||
mine_transaction(&nodes[3], &node_txn[0]);
|
mine_transaction(&nodes[3], &node_txn[0]);
|
||||||
check_added_monitors!(nodes[3], 1);
|
check_added_monitors!(nodes[3], 1);
|
||||||
check_preimage_claim(&nodes[3], &node_txn);
|
check_preimage_claim(&nodes[3], &node_txn);
|
||||||
|
@ -2265,7 +2270,7 @@ fn channel_monitor_network_test() {
|
||||||
let chan_3_mon = nodes[3].chain_monitor.chain_monitor.remove_monitor(&OutPoint { txid: chan_3.3.txid(), index: 0 });
|
let chan_3_mon = nodes[3].chain_monitor.chain_monitor.remove_monitor(&OutPoint { txid: chan_3.3.txid(), index: 0 });
|
||||||
|
|
||||||
// One pending HTLC to time out:
|
// One pending HTLC to time out:
|
||||||
let payment_preimage_2 = route_payment(&nodes[3], &vec!(&nodes[4])[..], 3000000).0;
|
let (payment_preimage_2, payment_hash_2, _) = route_payment(&nodes[3], &[&nodes[4]], 3_000_000);
|
||||||
// CLTV expires at TEST_FINAL_CLTV + 1 (current height) + 1 (added in send_payment for
|
// CLTV expires at TEST_FINAL_CLTV + 1 (current height) + 1 (added in send_payment for
|
||||||
// buffer space).
|
// buffer space).
|
||||||
|
|
||||||
|
@ -2300,7 +2305,7 @@ fn channel_monitor_network_test() {
|
||||||
let node_txn = test_txn_broadcast(&nodes[3], &chan_4, None, HTLCType::TIMEOUT);
|
let node_txn = test_txn_broadcast(&nodes[3], &chan_4, None, HTLCType::TIMEOUT);
|
||||||
|
|
||||||
// Claim the payment on nodes[4], giving it knowledge of the preimage
|
// Claim the payment on nodes[4], giving it knowledge of the preimage
|
||||||
claim_funds!(nodes[4], nodes[3], payment_preimage_2);
|
claim_funds!(nodes[4], nodes[3], payment_preimage_2, payment_hash_2);
|
||||||
|
|
||||||
connect_blocks(&nodes[4], TEST_FINAL_CLTV - CLTV_CLAIM_BUFFER + 2);
|
connect_blocks(&nodes[4], TEST_FINAL_CLTV - CLTV_CLAIM_BUFFER + 2);
|
||||||
let events = nodes[4].node.get_and_clear_pending_msg_events();
|
let events = nodes[4].node.get_and_clear_pending_msg_events();
|
||||||
|
@ -2655,8 +2660,8 @@ fn test_htlc_on_chain_success() {
|
||||||
send_payment(&nodes[0], &vec!(&nodes[1], &nodes[2])[..], 8000000);
|
send_payment(&nodes[0], &vec!(&nodes[1], &nodes[2])[..], 8000000);
|
||||||
send_payment(&nodes[0], &vec!(&nodes[1], &nodes[2])[..], 8000000);
|
send_payment(&nodes[0], &vec!(&nodes[1], &nodes[2])[..], 8000000);
|
||||||
|
|
||||||
let (our_payment_preimage, payment_hash_1, _payment_secret) = route_payment(&nodes[0], &vec!(&nodes[1], &nodes[2]), 3000000);
|
let (our_payment_preimage, payment_hash_1, _payment_secret) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 3_000_000);
|
||||||
let (our_payment_preimage_2, payment_hash_2, _payment_secret_2) = route_payment(&nodes[0], &vec!(&nodes[1], &nodes[2]), 3000000);
|
let (our_payment_preimage_2, payment_hash_2, _payment_secret_2) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 3_000_000);
|
||||||
|
|
||||||
// Broadcast legit commitment tx from C on B's chain
|
// Broadcast legit commitment tx from C on B's chain
|
||||||
// Broadcast HTLC Success transaction by C on received output from C's commitment tx on B's chain
|
// Broadcast HTLC Success transaction by C on received output from C's commitment tx on B's chain
|
||||||
|
@ -2664,7 +2669,9 @@ fn test_htlc_on_chain_success() {
|
||||||
assert_eq!(commitment_tx.len(), 1);
|
assert_eq!(commitment_tx.len(), 1);
|
||||||
check_spends!(commitment_tx[0], chan_2.3);
|
check_spends!(commitment_tx[0], chan_2.3);
|
||||||
nodes[2].node.claim_funds(our_payment_preimage);
|
nodes[2].node.claim_funds(our_payment_preimage);
|
||||||
|
expect_payment_claimed!(nodes[2], payment_hash_1, 3_000_000);
|
||||||
nodes[2].node.claim_funds(our_payment_preimage_2);
|
nodes[2].node.claim_funds(our_payment_preimage_2);
|
||||||
|
expect_payment_claimed!(nodes[2], payment_hash_2, 3_000_000);
|
||||||
check_added_monitors!(nodes[2], 2);
|
check_added_monitors!(nodes[2], 2);
|
||||||
let updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
let updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
||||||
assert!(updates.update_add_htlcs.is_empty());
|
assert!(updates.update_add_htlcs.is_empty());
|
||||||
|
@ -3476,9 +3483,10 @@ fn test_dup_events_on_peer_disconnect() {
|
||||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
|
|
||||||
let payment_preimage = route_payment(&nodes[0], &[&nodes[1]], 1000000).0;
|
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||||
|
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage));
|
nodes[1].node.claim_funds(payment_preimage);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash, 1_000_000);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
let claim_msgs = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
let claim_msgs = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
||||||
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &claim_msgs.update_fulfill_htlcs[0]);
|
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &claim_msgs.update_fulfill_htlcs[0]);
|
||||||
|
@ -3612,7 +3620,7 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8, simulate_broken
|
||||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
}
|
}
|
||||||
|
|
||||||
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[1], 1_000_000);
|
||||||
|
|
||||||
let payment_event = {
|
let payment_event = {
|
||||||
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1)).unwrap();
|
nodes[0].node.send_payment(&route, payment_hash_1, &Some(payment_secret_1)).unwrap();
|
||||||
|
@ -3717,6 +3725,7 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8, simulate_broken
|
||||||
|
|
||||||
nodes[1].node.claim_funds(payment_preimage_1);
|
nodes[1].node.claim_funds(payment_preimage_1);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
|
||||||
|
|
||||||
let events_3 = nodes[1].node.get_and_clear_pending_msg_events();
|
let events_3 = nodes[1].node.get_and_clear_pending_msg_events();
|
||||||
assert_eq!(events_3.len(), 1);
|
assert_eq!(events_3.len(), 1);
|
||||||
|
@ -4054,7 +4063,7 @@ fn test_drop_messages_peer_disconnect_dual_htlc() {
|
||||||
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
|
|
||||||
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
|
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1_000_000);
|
||||||
|
|
||||||
// Now try to send a second payment which will fail to send
|
// Now try to send a second payment which will fail to send
|
||||||
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||||
|
@ -4068,7 +4077,8 @@ fn test_drop_messages_peer_disconnect_dual_htlc() {
|
||||||
_ => panic!("Unexpected event"),
|
_ => panic!("Unexpected event"),
|
||||||
}
|
}
|
||||||
|
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage_1));
|
nodes[1].node.claim_funds(payment_preimage_1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
|
||||||
let events_2 = nodes[1].node.get_and_clear_pending_msg_events();
|
let events_2 = nodes[1].node.get_and_clear_pending_msg_events();
|
||||||
|
@ -4844,14 +4854,15 @@ fn test_static_spendable_outputs_preimage_tx() {
|
||||||
// Create some initial channels
|
// Create some initial channels
|
||||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
|
|
||||||
let payment_preimage = route_payment(&nodes[0], &vec!(&nodes[1])[..], 3000000).0;
|
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 3_000_000);
|
||||||
|
|
||||||
let commitment_tx = get_local_commitment_txn!(nodes[0], chan_1.2);
|
let commitment_tx = get_local_commitment_txn!(nodes[0], chan_1.2);
|
||||||
assert_eq!(commitment_tx[0].input.len(), 1);
|
assert_eq!(commitment_tx[0].input.len(), 1);
|
||||||
assert_eq!(commitment_tx[0].input[0].previous_output.txid, chan_1.3.txid());
|
assert_eq!(commitment_tx[0].input[0].previous_output.txid, chan_1.3.txid());
|
||||||
|
|
||||||
// Settle A's commitment tx on B's chain
|
// Settle A's commitment tx on B's chain
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage));
|
nodes[1].node.claim_funds(payment_preimage);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash, 3_000_000);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
mine_transaction(&nodes[1], &commitment_tx[0]);
|
mine_transaction(&nodes[1], &commitment_tx[0]);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
@ -5144,10 +5155,11 @@ fn test_onchain_to_onchain_claim() {
|
||||||
send_payment(&nodes[0], &vec!(&nodes[1], &nodes[2])[..], 8000000);
|
send_payment(&nodes[0], &vec!(&nodes[1], &nodes[2])[..], 8000000);
|
||||||
send_payment(&nodes[0], &vec!(&nodes[1], &nodes[2])[..], 8000000);
|
send_payment(&nodes[0], &vec!(&nodes[1], &nodes[2])[..], 8000000);
|
||||||
|
|
||||||
let (payment_preimage, _payment_hash, _payment_secret) = route_payment(&nodes[0], &vec!(&nodes[1], &nodes[2]), 3000000);
|
let (payment_preimage, payment_hash, _payment_secret) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 3_000_000);
|
||||||
let commitment_tx = get_local_commitment_txn!(nodes[2], chan_2.2);
|
let commitment_tx = get_local_commitment_txn!(nodes[2], chan_2.2);
|
||||||
check_spends!(commitment_tx[0], chan_2.3);
|
check_spends!(commitment_tx[0], chan_2.3);
|
||||||
nodes[2].node.claim_funds(payment_preimage);
|
nodes[2].node.claim_funds(payment_preimage);
|
||||||
|
expect_payment_claimed!(nodes[2], payment_hash, 3_000_000);
|
||||||
check_added_monitors!(nodes[2], 1);
|
check_added_monitors!(nodes[2], 1);
|
||||||
let updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
let updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
||||||
assert!(updates.update_add_htlcs.is_empty());
|
assert!(updates.update_add_htlcs.is_empty());
|
||||||
|
@ -5262,7 +5274,7 @@ fn test_duplicate_payment_hash_one_failure_one_success() {
|
||||||
connect_blocks(&nodes[2], node_max_height - nodes[2].best_block_info().1);
|
connect_blocks(&nodes[2], node_max_height - nodes[2].best_block_info().1);
|
||||||
connect_blocks(&nodes[3], node_max_height - nodes[3].best_block_info().1);
|
connect_blocks(&nodes[3], node_max_height - nodes[3].best_block_info().1);
|
||||||
|
|
||||||
let (our_payment_preimage, duplicate_payment_hash, _) = route_payment(&nodes[0], &vec!(&nodes[1], &nodes[2])[..], 900000);
|
let (our_payment_preimage, duplicate_payment_hash, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 900_000);
|
||||||
|
|
||||||
let payment_secret = nodes[3].node.create_inbound_payment_for_hash(duplicate_payment_hash, None, 7200).unwrap();
|
let payment_secret = nodes[3].node.create_inbound_payment_for_hash(duplicate_payment_hash, None, 7200).unwrap();
|
||||||
// We reduce the final CLTV here by a somewhat arbitrary constant to keep it under the one-byte
|
// We reduce the final CLTV here by a somewhat arbitrary constant to keep it under the one-byte
|
||||||
|
@ -5305,6 +5317,8 @@ fn test_duplicate_payment_hash_one_failure_one_success() {
|
||||||
}
|
}
|
||||||
|
|
||||||
nodes[2].node.claim_funds(our_payment_preimage);
|
nodes[2].node.claim_funds(our_payment_preimage);
|
||||||
|
expect_payment_claimed!(nodes[2], duplicate_payment_hash, 900_000);
|
||||||
|
|
||||||
mine_transaction(&nodes[2], &commitment_txn[0]);
|
mine_transaction(&nodes[2], &commitment_txn[0]);
|
||||||
check_added_monitors!(nodes[2], 2);
|
check_added_monitors!(nodes[2], 2);
|
||||||
check_closed_event!(nodes[2], 1, ClosureReason::CommitmentTxConfirmed);
|
check_closed_event!(nodes[2], 1, ClosureReason::CommitmentTxConfirmed);
|
||||||
|
@ -5385,7 +5399,7 @@ fn test_dynamic_spendable_outputs_local_htlc_success_tx() {
|
||||||
// Create some initial channels
|
// Create some initial channels
|
||||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
|
|
||||||
let payment_preimage = route_payment(&nodes[0], &vec!(&nodes[1])[..], 9000000).0;
|
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 9_000_000);
|
||||||
let local_txn = get_local_commitment_txn!(nodes[1], chan_1.2);
|
let local_txn = get_local_commitment_txn!(nodes[1], chan_1.2);
|
||||||
assert_eq!(local_txn.len(), 1);
|
assert_eq!(local_txn.len(), 1);
|
||||||
assert_eq!(local_txn[0].input.len(), 1);
|
assert_eq!(local_txn[0].input.len(), 1);
|
||||||
|
@ -5393,7 +5407,9 @@ fn test_dynamic_spendable_outputs_local_htlc_success_tx() {
|
||||||
|
|
||||||
// Give B knowledge of preimage to be able to generate a local HTLC-Success Tx
|
// Give B knowledge of preimage to be able to generate a local HTLC-Success Tx
|
||||||
nodes[1].node.claim_funds(payment_preimage);
|
nodes[1].node.claim_funds(payment_preimage);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash, 9_000_000);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
|
||||||
mine_transaction(&nodes[1], &local_txn[0]);
|
mine_transaction(&nodes[1], &local_txn[0]);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
check_closed_event!(nodes[1], 1, ClosureReason::CommitmentTxConfirmed);
|
check_closed_event!(nodes[1], 1, ClosureReason::CommitmentTxConfirmed);
|
||||||
|
@ -5868,12 +5884,13 @@ fn do_htlc_claim_local_commitment_only(use_dust: bool) {
|
||||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||||
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
|
|
||||||
let (payment_preimage, _, _) = route_payment(&nodes[0], &[&nodes[1]], if use_dust { 50000 } else { 3000000 });
|
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], if use_dust { 50000 } else { 3_000_000 });
|
||||||
|
|
||||||
// Claim the payment, but don't deliver A's commitment_signed, resulting in the HTLC only being
|
// Claim the payment, but don't deliver A's commitment_signed, resulting in the HTLC only being
|
||||||
// present in B's local commitment transaction, but none of A's commitment transactions.
|
// present in B's local commitment transaction, but none of A's commitment transactions.
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage));
|
nodes[1].node.claim_funds(payment_preimage);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash, if use_dust { 50000 } else { 3_000_000 });
|
||||||
|
|
||||||
let bs_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
let bs_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
||||||
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &bs_updates.update_fulfill_htlcs[0]);
|
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &bs_updates.update_fulfill_htlcs[0]);
|
||||||
|
@ -6307,6 +6324,8 @@ fn test_free_and_fail_holding_cell_htlcs() {
|
||||||
}
|
}
|
||||||
nodes[1].node.claim_funds(payment_preimage_1);
|
nodes[1].node.claim_funds(payment_preimage_1);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_1, amt_1);
|
||||||
|
|
||||||
let update_msgs = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
let update_msgs = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
||||||
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &update_msgs.update_fulfill_htlcs[0]);
|
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &update_msgs.update_fulfill_htlcs[0]);
|
||||||
commitment_signed_dance!(nodes[0], nodes[1], update_msgs.commitment_signed, false, true);
|
commitment_signed_dance!(nodes[0], nodes[1], update_msgs.commitment_signed, false, true);
|
||||||
|
@ -6895,10 +6914,11 @@ fn test_update_fulfill_htlc_bolt2_incorrect_htlc_id() {
|
||||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
|
|
||||||
let our_payment_preimage = route_payment(&nodes[0], &[&nodes[1]], 100000).0;
|
let (our_payment_preimage, our_payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 100_000);
|
||||||
|
|
||||||
nodes[1].node.claim_funds(our_payment_preimage);
|
nodes[1].node.claim_funds(our_payment_preimage);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], our_payment_hash, 100_000);
|
||||||
|
|
||||||
let events = nodes[1].node.get_and_clear_pending_msg_events();
|
let events = nodes[1].node.get_and_clear_pending_msg_events();
|
||||||
assert_eq!(events.len(), 1);
|
assert_eq!(events.len(), 1);
|
||||||
|
@ -6937,10 +6957,11 @@ fn test_update_fulfill_htlc_bolt2_wrong_preimage() {
|
||||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||||
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
|
|
||||||
let our_payment_preimage = route_payment(&nodes[0], &[&nodes[1]], 100000).0;
|
let (our_payment_preimage, our_payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 100_000);
|
||||||
|
|
||||||
nodes[1].node.claim_funds(our_payment_preimage);
|
nodes[1].node.claim_funds(our_payment_preimage);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], our_payment_hash, 100_000);
|
||||||
|
|
||||||
let events = nodes[1].node.get_and_clear_pending_msg_events();
|
let events = nodes[1].node.get_and_clear_pending_msg_events();
|
||||||
assert_eq!(events.len(), 1);
|
assert_eq!(events.len(), 1);
|
||||||
|
@ -7927,7 +7948,7 @@ fn test_bump_penalty_txn_on_remote_commitment() {
|
||||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||||
|
|
||||||
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::known(), InitFeatures::known());
|
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::known(), InitFeatures::known());
|
||||||
let payment_preimage = route_payment(&nodes[0], &vec!(&nodes[1])[..], 3000000).0;
|
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 3_000_000);
|
||||||
route_payment(&nodes[1], &vec!(&nodes[0])[..], 3000000).0;
|
route_payment(&nodes[1], &vec!(&nodes[0])[..], 3000000).0;
|
||||||
|
|
||||||
// Remote commitment txn with 4 outputs : to_local, to_remote, 1 outgoing HTLC, 1 incoming HTLC
|
// Remote commitment txn with 4 outputs : to_local, to_remote, 1 outgoing HTLC, 1 incoming HTLC
|
||||||
|
@ -7938,6 +7959,7 @@ fn test_bump_penalty_txn_on_remote_commitment() {
|
||||||
|
|
||||||
// Claim a HTLC without revocation (provide B monitor with preimage)
|
// Claim a HTLC without revocation (provide B monitor with preimage)
|
||||||
nodes[1].node.claim_funds(payment_preimage);
|
nodes[1].node.claim_funds(payment_preimage);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash, 3_000_000);
|
||||||
mine_transaction(&nodes[1], &remote_txn[0]);
|
mine_transaction(&nodes[1], &remote_txn[0]);
|
||||||
check_added_monitors!(nodes[1], 2);
|
check_added_monitors!(nodes[1], 2);
|
||||||
connect_blocks(&nodes[1], TEST_FINAL_CLTV - 1); // Confirm blocks until the HTLC expires
|
connect_blocks(&nodes[1], TEST_FINAL_CLTV - 1); // Confirm blocks until the HTLC expires
|
||||||
|
@ -8113,8 +8135,9 @@ fn test_pending_claimed_htlc_no_balance_underflow() {
|
||||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||||
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100_000, 0, InitFeatures::known(), InitFeatures::known());
|
create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100_000, 0, InitFeatures::known(), InitFeatures::known());
|
||||||
|
|
||||||
let payment_preimage = route_payment(&nodes[0], &[&nodes[1]], 1_010_000).0;
|
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 1_010_000);
|
||||||
nodes[1].node.claim_funds(payment_preimage);
|
nodes[1].node.claim_funds(payment_preimage);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash, 1_010_000);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
let fulfill_ev = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
let fulfill_ev = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
||||||
|
|
||||||
|
@ -8696,7 +8719,7 @@ fn test_update_err_monitor_lockdown() {
|
||||||
send_payment(&nodes[0], &vec!(&nodes[1])[..], 10_000_000);
|
send_payment(&nodes[0], &vec!(&nodes[1])[..], 10_000_000);
|
||||||
|
|
||||||
// Route a HTLC from node 0 to node 1 (but don't settle)
|
// Route a HTLC from node 0 to node 1 (but don't settle)
|
||||||
let preimage = route_payment(&nodes[0], &vec!(&nodes[1])[..], 9_000_000).0;
|
let (preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 9_000_000);
|
||||||
|
|
||||||
// Copy ChainMonitor to simulate a watchtower and update block height of node 0 until its ChannelMonitor timeout HTLC onchain
|
// Copy ChainMonitor to simulate a watchtower and update block height of node 0 until its ChannelMonitor timeout HTLC onchain
|
||||||
let chain_source = test_utils::TestChainSource::new(Network::Testnet);
|
let chain_source = test_utils::TestChainSource::new(Network::Testnet);
|
||||||
|
@ -8720,8 +8743,10 @@ fn test_update_err_monitor_lockdown() {
|
||||||
watchtower.chain_monitor.block_connected(&Block { header, txdata: vec![] }, 200);
|
watchtower.chain_monitor.block_connected(&Block { header, txdata: vec![] }, 200);
|
||||||
|
|
||||||
// Try to update ChannelMonitor
|
// Try to update ChannelMonitor
|
||||||
assert!(nodes[1].node.claim_funds(preimage));
|
nodes[1].node.claim_funds(preimage);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash, 9_000_000);
|
||||||
|
|
||||||
let updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
let updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
||||||
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
|
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
|
||||||
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &updates.update_fulfill_htlcs[0]);
|
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &updates.update_fulfill_htlcs[0]);
|
||||||
|
@ -8964,7 +8989,7 @@ fn do_test_onchain_htlc_settlement_after_close(broadcast_alice: bool, go_onchain
|
||||||
|
|
||||||
// Steps (1) and (2):
|
// Steps (1) and (2):
|
||||||
// Send an HTLC Alice --> Bob --> Carol, but Carol doesn't settle the HTLC back.
|
// Send an HTLC Alice --> Bob --> Carol, but Carol doesn't settle the HTLC back.
|
||||||
let (payment_preimage, _payment_hash, _payment_secret) = route_payment(&nodes[0], &vec!(&nodes[1], &nodes[2]), 3_000_000);
|
let (payment_preimage, payment_hash, _payment_secret) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 3_000_000);
|
||||||
|
|
||||||
// Check that Alice's commitment transaction now contains an output for this HTLC.
|
// Check that Alice's commitment transaction now contains an output for this HTLC.
|
||||||
let alice_txn = get_local_commitment_txn!(nodes[0], chan_ab.2);
|
let alice_txn = get_local_commitment_txn!(nodes[0], chan_ab.2);
|
||||||
|
@ -9009,8 +9034,10 @@ fn do_test_onchain_htlc_settlement_after_close(broadcast_alice: bool, go_onchain
|
||||||
// Step (5):
|
// Step (5):
|
||||||
// Carol then claims the funds and sends an update_fulfill message to Bob, and they go through the
|
// Carol then claims the funds and sends an update_fulfill message to Bob, and they go through the
|
||||||
// process of removing the HTLC from their commitment transactions.
|
// process of removing the HTLC from their commitment transactions.
|
||||||
assert!(nodes[2].node.claim_funds(payment_preimage));
|
nodes[2].node.claim_funds(payment_preimage);
|
||||||
check_added_monitors!(nodes[2], 1);
|
check_added_monitors!(nodes[2], 1);
|
||||||
|
expect_payment_claimed!(nodes[2], payment_hash, 3_000_000);
|
||||||
|
|
||||||
let carol_updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
let carol_updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
||||||
assert!(carol_updates.update_add_htlcs.is_empty());
|
assert!(carol_updates.update_add_htlcs.is_empty());
|
||||||
assert!(carol_updates.update_fail_htlcs.is_empty());
|
assert!(carol_updates.update_fail_htlcs.is_empty());
|
||||||
|
@ -9906,6 +9933,7 @@ fn do_test_partial_claim_before_restart(persist_both_monitors: bool) {
|
||||||
|
|
||||||
nodes[3].node.claim_funds(payment_preimage);
|
nodes[3].node.claim_funds(payment_preimage);
|
||||||
check_added_monitors!(nodes[3], 2);
|
check_added_monitors!(nodes[3], 2);
|
||||||
|
expect_payment_claimed!(nodes[3], payment_hash, 15_000_000);
|
||||||
|
|
||||||
// Now fetch one of the two updated ChannelMonitors from nodes[3], and restart pretending we
|
// Now fetch one of the two updated ChannelMonitors from nodes[3], and restart pretending we
|
||||||
// crashed in between the two persistence calls - using one old ChannelMonitor and one new one,
|
// crashed in between the two persistence calls - using one old ChannelMonitor and one new one,
|
||||||
|
|
|
@ -203,7 +203,7 @@ fn do_test_claim_value_force_close(prev_commitment_tx: bool) {
|
||||||
assert_eq!(funding_outpoint.to_channel_id(), chan_id);
|
assert_eq!(funding_outpoint.to_channel_id(), chan_id);
|
||||||
|
|
||||||
// This HTLC is immediately claimed, giving node B the preimage
|
// This HTLC is immediately claimed, giving node B the preimage
|
||||||
let payment_preimage = route_payment(&nodes[0], &[&nodes[1]], 3_000_000).0;
|
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 3_000_000);
|
||||||
// This HTLC is allowed to time out, letting A claim it. However, in order to test claimable
|
// This HTLC is allowed to time out, letting A claim it. However, in order to test claimable
|
||||||
// balances more fully we also give B the preimage for this HTLC.
|
// balances more fully we also give B the preimage for this HTLC.
|
||||||
let (timeout_payment_preimage, timeout_payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 4_000_000);
|
let (timeout_payment_preimage, timeout_payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 4_000_000);
|
||||||
|
@ -236,13 +236,18 @@ fn do_test_claim_value_force_close(prev_commitment_tx: bool) {
|
||||||
|
|
||||||
nodes[1].node.claim_funds(payment_preimage);
|
nodes[1].node.claim_funds(payment_preimage);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash, 3_000_000);
|
||||||
|
|
||||||
let b_htlc_msgs = get_htlc_update_msgs!(&nodes[1], nodes[0].node.get_our_node_id());
|
let b_htlc_msgs = get_htlc_update_msgs!(&nodes[1], nodes[0].node.get_our_node_id());
|
||||||
// We claim the dust payment here as well, but it won't impact our claimable balances as its
|
// We claim the dust payment here as well, but it won't impact our claimable balances as its
|
||||||
// dust and thus doesn't appear on chain at all.
|
// dust and thus doesn't appear on chain at all.
|
||||||
nodes[1].node.claim_funds(dust_payment_preimage);
|
nodes[1].node.claim_funds(dust_payment_preimage);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], dust_payment_hash, 3_000);
|
||||||
|
|
||||||
nodes[1].node.claim_funds(timeout_payment_preimage);
|
nodes[1].node.claim_funds(timeout_payment_preimage);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], timeout_payment_hash, 4_000_000);
|
||||||
|
|
||||||
if prev_commitment_tx {
|
if prev_commitment_tx {
|
||||||
// To build a previous commitment transaction, deliver one round of commitment messages.
|
// To build a previous commitment transaction, deliver one round of commitment messages.
|
||||||
|
@ -580,9 +585,10 @@ fn test_balances_on_local_commitment_htlcs() {
|
||||||
|
|
||||||
expect_pending_htlcs_forwardable!(nodes[1]);
|
expect_pending_htlcs_forwardable!(nodes[1]);
|
||||||
expect_payment_received!(nodes[1], payment_hash_2, payment_secret_2, 20_000_000);
|
expect_payment_received!(nodes[1], payment_hash_2, payment_secret_2, 20_000_000);
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage_2));
|
nodes[1].node.claim_funds(payment_preimage_2);
|
||||||
get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash_2, 20_000_000);
|
||||||
|
|
||||||
let chan_feerate = get_feerate!(nodes[0], chan_id) as u64;
|
let chan_feerate = get_feerate!(nodes[0], chan_id) as u64;
|
||||||
let opt_anchors = get_opt_anchors!(nodes[0], chan_id);
|
let opt_anchors = get_opt_anchors!(nodes[0], chan_id);
|
||||||
|
|
|
@ -376,7 +376,7 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
|
||||||
// Send two payments - one which will get to nodes[2] and will be claimed, one which we'll time
|
// Send two payments - one which will get to nodes[2] and will be claimed, one which we'll time
|
||||||
// out and retry.
|
// out and retry.
|
||||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], 1_000_000);
|
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], 1_000_000);
|
||||||
let (payment_preimage_1, _, _, payment_id_1) = send_along_route(&nodes[0], route.clone(), &[&nodes[1], &nodes[2]], 1_000_000);
|
let (payment_preimage_1, payment_hash_1, _, payment_id_1) = send_along_route(&nodes[0], route.clone(), &[&nodes[1], &nodes[2]], 1_000_000);
|
||||||
let payment_id = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
let payment_id = nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
|
||||||
check_added_monitors!(nodes[0], 1);
|
check_added_monitors!(nodes[0], 1);
|
||||||
|
|
||||||
|
@ -475,6 +475,8 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
|
||||||
// we close in a moment.
|
// we close in a moment.
|
||||||
nodes[2].node.claim_funds(payment_preimage_1);
|
nodes[2].node.claim_funds(payment_preimage_1);
|
||||||
check_added_monitors!(nodes[2], 1);
|
check_added_monitors!(nodes[2], 1);
|
||||||
|
expect_payment_claimed!(nodes[2], payment_hash_1, 1_000_000);
|
||||||
|
|
||||||
let htlc_fulfill_updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
let htlc_fulfill_updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
||||||
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &htlc_fulfill_updates.update_fulfill_htlcs[0]);
|
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &htlc_fulfill_updates.update_fulfill_htlcs[0]);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
@ -564,7 +566,7 @@ fn do_test_dup_htlc_onchain_fails_on_reload(persist_manager_post_event: bool, co
|
||||||
|
|
||||||
// Route a payment, but force-close the channel before the HTLC fulfill message arrives at
|
// Route a payment, but force-close the channel before the HTLC fulfill message arrives at
|
||||||
// nodes[0].
|
// nodes[0].
|
||||||
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 10000000);
|
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1]], 10_000_000);
|
||||||
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id, &nodes[1].node.get_our_node_id()).unwrap();
|
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id, &nodes[1].node.get_our_node_id()).unwrap();
|
||||||
check_closed_broadcast!(nodes[0], true);
|
check_closed_broadcast!(nodes[0], true);
|
||||||
check_added_monitors!(nodes[0], 1);
|
check_added_monitors!(nodes[0], 1);
|
||||||
|
@ -582,8 +584,9 @@ fn do_test_dup_htlc_onchain_fails_on_reload(persist_manager_post_event: bool, co
|
||||||
check_spends!(node_txn[2], node_txn[1]);
|
check_spends!(node_txn[2], node_txn[1]);
|
||||||
let timeout_txn = vec![node_txn[2].clone()];
|
let timeout_txn = vec![node_txn[2].clone()];
|
||||||
|
|
||||||
assert!(nodes[1].node.claim_funds(payment_preimage));
|
nodes[1].node.claim_funds(payment_preimage);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash, 10_000_000);
|
||||||
|
|
||||||
let mut header = BlockHeader { version: 0x20000000, prev_blockhash: nodes[1].best_block_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
|
let mut header = BlockHeader { version: 0x20000000, prev_blockhash: nodes[1].best_block_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
|
||||||
connect_block(&nodes[1], &Block { header, txdata: vec![node_txn[1].clone()]});
|
connect_block(&nodes[1], &Block { header, txdata: vec![node_txn[1].clone()]});
|
||||||
|
@ -740,6 +743,8 @@ fn test_fulfill_restart_failure() {
|
||||||
|
|
||||||
nodes[1].node.claim_funds(payment_preimage);
|
nodes[1].node.claim_funds(payment_preimage);
|
||||||
check_added_monitors!(nodes[1], 1);
|
check_added_monitors!(nodes[1], 1);
|
||||||
|
expect_payment_claimed!(nodes[1], payment_hash, 100_000);
|
||||||
|
|
||||||
let htlc_fulfill_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
let htlc_fulfill_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
|
||||||
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &htlc_fulfill_updates.update_fulfill_htlcs[0]);
|
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &htlc_fulfill_updates.update_fulfill_htlcs[0]);
|
||||||
expect_payment_sent_without_paths!(nodes[0], payment_preimage);
|
expect_payment_sent_without_paths!(nodes[0], payment_preimage);
|
||||||
|
|
|
@ -60,10 +60,11 @@ fn do_test_onchain_htlc_reorg(local_commitment: bool, claim: bool) {
|
||||||
connect_blocks(&nodes[1], 2*CHAN_CONFIRM_DEPTH + 1 - nodes[1].best_block_info().1);
|
connect_blocks(&nodes[1], 2*CHAN_CONFIRM_DEPTH + 1 - nodes[1].best_block_info().1);
|
||||||
connect_blocks(&nodes[2], 2*CHAN_CONFIRM_DEPTH + 1 - nodes[2].best_block_info().1);
|
connect_blocks(&nodes[2], 2*CHAN_CONFIRM_DEPTH + 1 - nodes[2].best_block_info().1);
|
||||||
|
|
||||||
let (our_payment_preimage, our_payment_hash, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1000000);
|
let (our_payment_preimage, our_payment_hash, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1_000_000);
|
||||||
|
|
||||||
// Provide preimage to node 2 by claiming payment
|
// Provide preimage to node 2 by claiming payment
|
||||||
nodes[2].node.claim_funds(our_payment_preimage);
|
nodes[2].node.claim_funds(our_payment_preimage);
|
||||||
|
expect_payment_claimed!(nodes[2], our_payment_hash, 1_000_000);
|
||||||
check_added_monitors!(nodes[2], 1);
|
check_added_monitors!(nodes[2], 1);
|
||||||
get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
||||||
|
|
||||||
|
@ -348,8 +349,8 @@ fn test_set_outpoints_partial_claiming() {
|
||||||
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
|
||||||
|
|
||||||
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::known(), InitFeatures::known());
|
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::known(), InitFeatures::known());
|
||||||
let payment_preimage_1 = route_payment(&nodes[1], &vec!(&nodes[0])[..], 3_000_000).0;
|
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[1], &[&nodes[0]], 3_000_000);
|
||||||
let payment_preimage_2 = route_payment(&nodes[1], &vec!(&nodes[0])[..], 3_000_000).0;
|
let (payment_preimage_2, payment_hash_2, _) = route_payment(&nodes[1], &[&nodes[0]], 3_000_000);
|
||||||
|
|
||||||
// Remote commitment txn with 4 outputs: to_local, to_remote, 2 outgoing HTLC
|
// Remote commitment txn with 4 outputs: to_local, to_remote, 2 outgoing HTLC
|
||||||
let remote_txn = get_local_commitment_txn!(nodes[1], chan.2);
|
let remote_txn = get_local_commitment_txn!(nodes[1], chan.2);
|
||||||
|
@ -363,9 +364,10 @@ fn test_set_outpoints_partial_claiming() {
|
||||||
// Connect blocks on node A to advance height towards TEST_FINAL_CLTV
|
// Connect blocks on node A to advance height towards TEST_FINAL_CLTV
|
||||||
// Provide node A with both preimage
|
// Provide node A with both preimage
|
||||||
nodes[0].node.claim_funds(payment_preimage_1);
|
nodes[0].node.claim_funds(payment_preimage_1);
|
||||||
|
expect_payment_claimed!(nodes[0], payment_hash_1, 3_000_000);
|
||||||
nodes[0].node.claim_funds(payment_preimage_2);
|
nodes[0].node.claim_funds(payment_preimage_2);
|
||||||
|
expect_payment_claimed!(nodes[0], payment_hash_2, 3_000_000);
|
||||||
check_added_monitors!(nodes[0], 2);
|
check_added_monitors!(nodes[0], 2);
|
||||||
nodes[0].node.get_and_clear_pending_events();
|
|
||||||
nodes[0].node.get_and_clear_pending_msg_events();
|
nodes[0].node.get_and_clear_pending_msg_events();
|
||||||
|
|
||||||
// Connect blocks on node A commitment transaction
|
// Connect blocks on node A commitment transaction
|
||||||
|
|
|
@ -81,7 +81,7 @@ fn updates_shutdown_wait() {
|
||||||
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
let keys_manager = test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||||
|
|
||||||
let (payment_preimage, _, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100000);
|
let (payment_preimage_0, payment_hash_0, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100_000);
|
||||||
|
|
||||||
nodes[0].node.close_channel(&chan_1.2, &nodes[1].node.get_our_node_id()).unwrap();
|
nodes[0].node.close_channel(&chan_1.2, &nodes[1].node.get_our_node_id()).unwrap();
|
||||||
let node_0_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
|
let node_0_shutdown = get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id());
|
||||||
|
@ -101,8 +101,10 @@ fn updates_shutdown_wait() {
|
||||||
unwrap_send_err!(nodes[0].node.send_payment(&route_1, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
|
unwrap_send_err!(nodes[0].node.send_payment(&route_1, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
|
||||||
unwrap_send_err!(nodes[1].node.send_payment(&route_2, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
|
unwrap_send_err!(nodes[1].node.send_payment(&route_2, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
|
||||||
|
|
||||||
assert!(nodes[2].node.claim_funds(payment_preimage));
|
nodes[2].node.claim_funds(payment_preimage_0);
|
||||||
check_added_monitors!(nodes[2], 1);
|
check_added_monitors!(nodes[2], 1);
|
||||||
|
expect_payment_claimed!(nodes[2], payment_hash_0, 100_000);
|
||||||
|
|
||||||
let updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
let updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
||||||
assert!(updates.update_add_htlcs.is_empty());
|
assert!(updates.update_add_htlcs.is_empty());
|
||||||
assert!(updates.update_fail_htlcs.is_empty());
|
assert!(updates.update_fail_htlcs.is_empty());
|
||||||
|
@ -122,7 +124,7 @@ fn updates_shutdown_wait() {
|
||||||
assert_eq!(updates_2.update_fulfill_htlcs.len(), 1);
|
assert_eq!(updates_2.update_fulfill_htlcs.len(), 1);
|
||||||
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &updates_2.update_fulfill_htlcs[0]);
|
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &updates_2.update_fulfill_htlcs[0]);
|
||||||
commitment_signed_dance!(nodes[0], nodes[1], updates_2.commitment_signed, false, true);
|
commitment_signed_dance!(nodes[0], nodes[1], updates_2.commitment_signed, false, true);
|
||||||
expect_payment_sent!(nodes[0], payment_preimage);
|
expect_payment_sent!(nodes[0], payment_preimage_0);
|
||||||
|
|
||||||
let node_0_closing_signed = get_event_msg!(nodes[0], MessageSendEvent::SendClosingSigned, nodes[1].node.get_our_node_id());
|
let node_0_closing_signed = get_event_msg!(nodes[0], MessageSendEvent::SendClosingSigned, nodes[1].node.get_our_node_id());
|
||||||
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_closing_signed);
|
nodes[1].node.handle_closing_signed(&nodes[0].node.get_our_node_id(), &node_0_closing_signed);
|
||||||
|
@ -230,7 +232,7 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
||||||
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
|
||||||
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
|
||||||
|
|
||||||
let (payment_preimage, _, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100000);
|
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100_000);
|
||||||
|
|
||||||
nodes[1].node.close_channel(&chan_1.2, &nodes[0].node.get_our_node_id()).unwrap();
|
nodes[1].node.close_channel(&chan_1.2, &nodes[0].node.get_our_node_id()).unwrap();
|
||||||
let node_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
let node_1_shutdown = get_event_msg!(nodes[1], MessageSendEvent::SendShutdown, nodes[0].node.get_our_node_id());
|
||||||
|
@ -270,8 +272,10 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
||||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||||
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
|
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
|
||||||
|
|
||||||
assert!(nodes[2].node.claim_funds(payment_preimage));
|
nodes[2].node.claim_funds(payment_preimage);
|
||||||
check_added_monitors!(nodes[2], 1);
|
check_added_monitors!(nodes[2], 1);
|
||||||
|
expect_payment_claimed!(nodes[2], payment_hash, 100_000);
|
||||||
|
|
||||||
let updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
let updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
|
||||||
assert!(updates.update_add_htlcs.is_empty());
|
assert!(updates.update_add_htlcs.is_empty());
|
||||||
assert!(updates.update_fail_htlcs.is_empty());
|
assert!(updates.update_fail_htlcs.is_empty());
|
||||||
|
|
|
@ -188,8 +188,9 @@ pub enum Event {
|
||||||
/// [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel
|
/// [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel
|
||||||
user_channel_id: u64,
|
user_channel_id: u64,
|
||||||
},
|
},
|
||||||
/// Indicates we've received money! Just gotta dig out that payment preimage and feed it to
|
/// Indicates we've received (an offer of) money! Just gotta dig out that payment preimage and
|
||||||
/// [`ChannelManager::claim_funds`] to get it....
|
/// feed it to [`ChannelManager::claim_funds`] to get it....
|
||||||
|
///
|
||||||
/// Note that if the preimage is not known, you should call
|
/// Note that if the preimage is not known, you should call
|
||||||
/// [`ChannelManager::fail_htlc_backwards`] to free up resources for this HTLC and avoid
|
/// [`ChannelManager::fail_htlc_backwards`] to free up resources for this HTLC and avoid
|
||||||
/// network congestion.
|
/// network congestion.
|
||||||
|
@ -213,6 +214,30 @@ pub enum Event {
|
||||||
/// payment is to pay an invoice or to send a spontaneous payment.
|
/// payment is to pay an invoice or to send a spontaneous payment.
|
||||||
purpose: PaymentPurpose,
|
purpose: PaymentPurpose,
|
||||||
},
|
},
|
||||||
|
/// Indicates a payment has been claimed and we've received money!
|
||||||
|
///
|
||||||
|
/// This most likely occurs when [`ChannelManager::claim_funds`] has been called in response
|
||||||
|
/// to an [`Event::PaymentReceived`]. However, if we previously crashed during a
|
||||||
|
/// [`ChannelManager::claim_funds`] call you may see this event without a corresponding
|
||||||
|
/// [`Event::PaymentReceived`] event.
|
||||||
|
///
|
||||||
|
/// # Note
|
||||||
|
/// LDK will not stop an inbound payment from being paid multiple times, so multiple
|
||||||
|
/// `PaymentReceived` events may be generated for the same payment. If you then call
|
||||||
|
/// [`ChannelManager::claim_funds`] twice for the same [`Event::PaymentReceived`] you may get
|
||||||
|
/// multiple `PaymentClaimed` events.
|
||||||
|
///
|
||||||
|
/// [`ChannelManager::claim_funds`]: crate::ln::channelmanager::ChannelManager::claim_funds
|
||||||
|
PaymentClaimed {
|
||||||
|
/// The payment hash of the claimed payment. Note that LDK will not stop you from
|
||||||
|
/// registering duplicate payment hashes for inbound payments.
|
||||||
|
payment_hash: PaymentHash,
|
||||||
|
/// The value, in thousandths of a satoshi, that this payment is for.
|
||||||
|
amt: u64,
|
||||||
|
/// The purpose of this claimed payment, i.e. whether the payment was for an invoice or a
|
||||||
|
/// spontaneous payment.
|
||||||
|
purpose: PaymentPurpose,
|
||||||
|
},
|
||||||
/// Indicates an outbound payment we made succeeded (i.e. it made it all the way to its target
|
/// Indicates an outbound payment we made succeeded (i.e. it made it all the way to its target
|
||||||
/// and we got back the payment preimage for it).
|
/// and we got back the payment preimage for it).
|
||||||
///
|
///
|
||||||
|
@ -592,6 +617,14 @@ impl Writeable for Event {
|
||||||
// We never write the OpenChannelRequest events as, upon disconnection, peers
|
// We never write the OpenChannelRequest events as, upon disconnection, peers
|
||||||
// drop any channels which have not yet exchanged funding_signed.
|
// drop any channels which have not yet exchanged funding_signed.
|
||||||
},
|
},
|
||||||
|
&Event::PaymentClaimed { ref payment_hash, ref amt, ref purpose } => {
|
||||||
|
19u8.write(writer)?;
|
||||||
|
write_tlv_fields!(writer, {
|
||||||
|
(0, payment_hash, required),
|
||||||
|
(2, purpose, required),
|
||||||
|
(4, amt, required),
|
||||||
|
});
|
||||||
|
},
|
||||||
// Note that, going forward, all new events must only write data inside of
|
// Note that, going forward, all new events must only write data inside of
|
||||||
// `write_tlv_fields`. Versions 0.0.101+ will ignore odd-numbered events that write
|
// `write_tlv_fields`. Versions 0.0.101+ will ignore odd-numbered events that write
|
||||||
// data via `write_tlv_fields`.
|
// data via `write_tlv_fields`.
|
||||||
|
@ -792,6 +825,25 @@ impl MaybeReadable for Event {
|
||||||
// Value 17 is used for `Event::OpenChannelRequest`.
|
// Value 17 is used for `Event::OpenChannelRequest`.
|
||||||
Ok(None)
|
Ok(None)
|
||||||
},
|
},
|
||||||
|
19u8 => {
|
||||||
|
let f = || {
|
||||||
|
let mut payment_hash = PaymentHash([0; 32]);
|
||||||
|
let mut purpose = None;
|
||||||
|
let mut amt = 0;
|
||||||
|
read_tlv_fields!(reader, {
|
||||||
|
(0, payment_hash, required),
|
||||||
|
(2, purpose, ignorable),
|
||||||
|
(4, amt, required),
|
||||||
|
});
|
||||||
|
if purpose.is_none() { return Ok(None); }
|
||||||
|
Ok(Some(Event::PaymentClaimed {
|
||||||
|
payment_hash,
|
||||||
|
purpose: purpose.unwrap(),
|
||||||
|
amt,
|
||||||
|
}))
|
||||||
|
};
|
||||||
|
f()
|
||||||
|
},
|
||||||
// Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue.
|
// Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue.
|
||||||
// Version 0.0.100 failed to properly ignore odd types, possibly resulting in corrupt
|
// Version 0.0.100 failed to properly ignore odd types, possibly resulting in corrupt
|
||||||
// reads.
|
// reads.
|
||||||
|
|
Loading…
Add table
Reference in a new issue