mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-25 07:17:40 +01:00
Merge pull request #2239 from valentinewallace/2023-04-remove-redundant-final-cltv-param
Remove redundant `final_cltv_delta` param from `get_route`
This commit is contained in:
commit
41e94f9404
7 changed files with 127 additions and 133 deletions
|
@ -1697,14 +1697,14 @@ macro_rules! get_payment_preimage_hash {
|
|||
}
|
||||
|
||||
/// Gets a route from the given sender to the node described in `payment_params`.
|
||||
pub fn get_route(send_node: &Node, payment_params: &PaymentParameters, recv_value: u64, final_cltv_expiry_delta: u32) -> Result<Route, msgs::LightningError> {
|
||||
pub fn get_route(send_node: &Node, payment_params: &PaymentParameters, recv_value: u64) -> Result<Route, msgs::LightningError> {
|
||||
let scorer = TestScorer::new();
|
||||
let keys_manager = TestKeysInterface::new(&[0u8; 32], bitcoin::network::constants::Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
router::get_route(
|
||||
&send_node.node.get_our_node_id(), payment_params, &send_node.network_graph.read_only(),
|
||||
Some(&send_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
|
||||
recv_value, final_cltv_expiry_delta, send_node.logger, &scorer, &random_seed_bytes
|
||||
recv_value, send_node.logger, &scorer, &random_seed_bytes
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -1713,8 +1713,8 @@ pub fn get_route(send_node: &Node, payment_params: &PaymentParameters, recv_valu
|
|||
/// Don't use this, use the identically-named function instead.
|
||||
#[macro_export]
|
||||
macro_rules! get_route {
|
||||
($send_node: expr, $payment_params: expr, $recv_value: expr, $cltv: expr) => {
|
||||
$crate::ln::functional_test_utils::get_route(&$send_node, &$payment_params, $recv_value, $cltv)
|
||||
($send_node: expr, $payment_params: expr, $recv_value: expr) => {
|
||||
$crate::ln::functional_test_utils::get_route(&$send_node, &$payment_params, $recv_value)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1724,12 +1724,12 @@ macro_rules! get_route_and_payment_hash {
|
|||
($send_node: expr, $recv_node: expr, $recv_value: expr) => {{
|
||||
let payment_params = $crate::routing::router::PaymentParameters::from_node_id($recv_node.node.get_our_node_id(), TEST_FINAL_CLTV)
|
||||
.with_features($recv_node.node.invoice_features());
|
||||
$crate::get_route_and_payment_hash!($send_node, $recv_node, payment_params, $recv_value, TEST_FINAL_CLTV)
|
||||
$crate::get_route_and_payment_hash!($send_node, $recv_node, payment_params, $recv_value)
|
||||
}};
|
||||
($send_node: expr, $recv_node: expr, $payment_params: expr, $recv_value: expr, $cltv: expr) => {{
|
||||
($send_node: expr, $recv_node: expr, $payment_params: expr, $recv_value: expr) => {{
|
||||
let (payment_preimage, payment_hash, payment_secret) =
|
||||
$crate::ln::functional_test_utils::get_payment_preimage_hash(&$recv_node, Some($recv_value), None);
|
||||
let route = $crate::ln::functional_test_utils::get_route(&$send_node, &$payment_params, $recv_value, $cltv);
|
||||
let route = $crate::ln::functional_test_utils::get_route(&$send_node, &$payment_params, $recv_value);
|
||||
(route.unwrap(), payment_hash, payment_preimage, payment_secret)
|
||||
}}
|
||||
}
|
||||
|
@ -2273,7 +2273,7 @@ pub const TEST_FINAL_CLTV: u32 = 70;
|
|||
pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) -> (PaymentPreimage, PaymentHash, PaymentSecret) {
|
||||
let payment_params = PaymentParameters::from_node_id(expected_route.last().unwrap().node.get_our_node_id(), TEST_FINAL_CLTV)
|
||||
.with_features(expected_route.last().unwrap().node.invoice_features());
|
||||
let route = get_route(origin_node, &payment_params, recv_value, TEST_FINAL_CLTV).unwrap();
|
||||
let route = get_route(origin_node, &payment_params, recv_value).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
assert_eq!(route.paths[0].hops.len(), expected_route.len());
|
||||
for (node, hop) in expected_route.iter().zip(route.paths[0].hops.iter()) {
|
||||
|
@ -2294,7 +2294,7 @@ pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_rou
|
|||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let route = router::get_route(
|
||||
&origin_node.node.get_our_node_id(), &payment_params, &network_graph,
|
||||
None, recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer, &random_seed_bytes).unwrap();
|
||||
None, recv_value, origin_node.logger, &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
assert_eq!(route.paths[0].hops.len(), expected_route.len());
|
||||
for (node, hop) in expected_route.iter().zip(route.paths[0].hops.iter()) {
|
||||
|
|
|
@ -1830,7 +1830,7 @@ fn test_channel_reserve_holding_cell_htlcs() {
|
|||
{
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id(), TEST_FINAL_CLTV)
|
||||
.with_features(nodes[2].node.invoice_features()).with_max_channel_saturation_power_of_half(0);
|
||||
let (mut route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, recv_value_0, TEST_FINAL_CLTV);
|
||||
let (mut route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, recv_value_0);
|
||||
route.paths[0].hops.last_mut().unwrap().fee_msat += 1;
|
||||
assert!(route.paths[0].hops.iter().rev().skip(1).all(|h| h.fee_msat == feemsat));
|
||||
|
||||
|
@ -1857,7 +1857,7 @@ fn test_channel_reserve_holding_cell_htlcs() {
|
|||
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id(), TEST_FINAL_CLTV)
|
||||
.with_features(nodes[2].node.invoice_features()).with_max_channel_saturation_power_of_half(0);
|
||||
let route = get_route!(nodes[0], payment_params, recv_value_0, TEST_FINAL_CLTV).unwrap();
|
||||
let route = get_route!(nodes[0], payment_params, recv_value_0).unwrap();
|
||||
let (payment_preimage, ..) = send_along_route(&nodes[0], route, &[&nodes[1], &nodes[2]], recv_value_0);
|
||||
claim_payment(&nodes[0], &[&nodes[1], &nodes[2]], payment_preimage);
|
||||
|
||||
|
@ -4796,7 +4796,7 @@ fn test_duplicate_payment_hash_one_failure_one_success() {
|
|||
// ACCEPTED_HTLC_SCRIPT_WEIGHT.
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[3].node.get_our_node_id(), TEST_FINAL_CLTV - 40)
|
||||
.with_features(nodes[3].node.invoice_features());
|
||||
let (route, _, _, _) = get_route_and_payment_hash!(nodes[0], nodes[3], payment_params, 800_000, TEST_FINAL_CLTV - 40);
|
||||
let (route, _, _, _) = get_route_and_payment_hash!(nodes[0], nodes[3], payment_params, 800_000);
|
||||
send_along_route_with_secret(&nodes[0], route, &[&[&nodes[1], &nodes[2], &nodes[3]]], 800_000, duplicate_payment_hash, payment_secret);
|
||||
|
||||
let commitment_txn = get_local_commitment_txn!(nodes[2], chan_2.2);
|
||||
|
@ -6102,7 +6102,7 @@ fn test_update_add_htlc_bolt2_sender_cltv_expiry_too_high() {
|
|||
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id(), 0)
|
||||
.with_features(nodes[1].node.invoice_features());
|
||||
let (mut route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], payment_params, 100000000, 0);
|
||||
let (mut route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], payment_params, 100000000);
|
||||
route.paths[0].hops.last_mut().unwrap().cltv_expiry_delta = 500000001;
|
||||
unwrap_send_err!(nodes[0].node.send_payment_with_route(&route, our_payment_hash,
|
||||
RecipientOnionFields::secret_only(our_payment_secret), PaymentId(our_payment_hash.0)
|
||||
|
@ -7044,7 +7044,7 @@ fn test_check_htlc_underpaying() {
|
|||
let scorer = test_utils::TestScorer::new();
|
||||
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id(), TEST_FINAL_CLTV).with_features(nodes[1].node.invoice_features());
|
||||
let route = get_route(&nodes[0].node.get_our_node_id(), &payment_params, &nodes[0].network_graph.read_only(), None, 10_000, TEST_FINAL_CLTV, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&nodes[0].node.get_our_node_id(), &payment_params, &nodes[0].network_graph.read_only(), None, 10_000, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
|
||||
let (_, our_payment_hash, _) = get_payment_preimage_hash!(nodes[0]);
|
||||
let our_payment_secret = nodes[1].node.create_inbound_payment_for_hash(our_payment_hash, Some(100_000), 7200, None).unwrap();
|
||||
nodes[0].node.send_payment_with_route(&route, our_payment_hash,
|
||||
|
@ -7190,7 +7190,7 @@ fn test_bump_penalty_txn_on_revoked_commitment() {
|
|||
let payment_preimage = route_payment(&nodes[0], &vec!(&nodes[1])[..], 3000000).0;
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[0].node.get_our_node_id(), 30)
|
||||
.with_features(nodes[0].node.invoice_features());
|
||||
let (route,_, _, _) = get_route_and_payment_hash!(nodes[1], nodes[0], payment_params, 3000000, 30);
|
||||
let (route,_, _, _) = get_route_and_payment_hash!(nodes[1], nodes[0], payment_params, 3000000);
|
||||
send_along_route(&nodes[1], route, &vec!(&nodes[0])[..], 3000000);
|
||||
|
||||
let revoked_txn = get_local_commitment_txn!(nodes[0], chan.2);
|
||||
|
@ -7298,11 +7298,11 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
|
|||
let scorer = test_utils::TestScorer::new();
|
||||
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
|
||||
let route = get_route(&nodes[0].node.get_our_node_id(), &payment_params, &nodes[0].network_graph.read_only(), None,
|
||||
3_000_000, 50, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
|
||||
3_000_000, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
|
||||
let payment_preimage = send_along_route(&nodes[0], route, &[&nodes[1]], 3_000_000).0;
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[0].node.get_our_node_id(), 50).with_features(nodes[0].node.invoice_features());
|
||||
let route = get_route(&nodes[1].node.get_our_node_id(), &payment_params, &nodes[1].network_graph.read_only(), None,
|
||||
3_000_000, 50, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
|
||||
3_000_000, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
|
||||
send_along_route(&nodes[1], route, &[&nodes[0]], 3_000_000);
|
||||
|
||||
let revoked_local_txn = get_local_commitment_txn!(nodes[1], chan.2);
|
||||
|
@ -9301,7 +9301,7 @@ fn do_test_dup_htlc_second_rejected(test_for_second_fail_panic: bool) {
|
|||
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id(), TEST_FINAL_CLTV)
|
||||
.with_features(nodes[1].node.invoice_features());
|
||||
let route = get_route!(nodes[0], payment_params, 10_000, TEST_FINAL_CLTV).unwrap();
|
||||
let route = get_route!(nodes[0], payment_params, 10_000).unwrap();
|
||||
|
||||
let (our_payment_preimage, our_payment_hash, our_payment_secret) = get_payment_preimage_hash!(&nodes[1]);
|
||||
|
||||
|
@ -9410,7 +9410,7 @@ fn test_inconsistent_mpp_params() {
|
|||
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[3].node.get_our_node_id(), TEST_FINAL_CLTV)
|
||||
.with_features(nodes[3].node.invoice_features());
|
||||
let mut route = get_route!(nodes[0], payment_params, 15_000_000, TEST_FINAL_CLTV).unwrap();
|
||||
let mut route = get_route!(nodes[0], payment_params, 15_000_000).unwrap();
|
||||
assert_eq!(route.paths.len(), 2);
|
||||
route.paths.sort_by(|path_a, _| {
|
||||
// Sort the path so that the path through nodes[1] comes first
|
||||
|
@ -9956,7 +9956,7 @@ fn do_payment_with_custom_min_final_cltv_expiry(valid_delta: bool, use_user_hash
|
|||
let (payment_hash, payment_secret) = nodes[1].node.create_inbound_payment(Some(recv_value), 7200, Some(min_final_cltv_expiry_delta)).unwrap();
|
||||
(payment_hash, nodes[1].node.get_payment_preimage(payment_hash, payment_secret).unwrap(), payment_secret)
|
||||
};
|
||||
let route = get_route!(nodes[0], payment_parameters, recv_value, final_cltv_expiry_delta as u32).unwrap();
|
||||
let route = get_route!(nodes[0], payment_parameters, recv_value).unwrap();
|
||||
nodes[0].node.send_payment_with_route(&route, payment_hash,
|
||||
RecipientOnionFields::secret_only(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
|
|
@ -716,7 +716,7 @@ fn do_test_onion_failure_stale_channel_update(announced_channel: bool) {
|
|||
let payment_params = PaymentParameters::from_node_id(*channel_to_update_counterparty, TEST_FINAL_CLTV)
|
||||
.with_features(nodes[2].node.invoice_features())
|
||||
.with_route_hints(hop_hints);
|
||||
get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, PAYMENT_AMT, TEST_FINAL_CLTV)
|
||||
get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, PAYMENT_AMT)
|
||||
};
|
||||
send_along_route_with_secret(&nodes[0], route.clone(), &[&[&nodes[1], &nodes[2]]], PAYMENT_AMT,
|
||||
payment_hash, payment_secret);
|
||||
|
@ -862,7 +862,7 @@ fn test_always_create_tlv_format_onion_payloads() {
|
|||
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id(), TEST_FINAL_CLTV)
|
||||
.with_features(InvoiceFeatures::empty());
|
||||
let (route, _payment_hash, _payment_preimage, _payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 40000, TEST_FINAL_CLTV);
|
||||
let (route, _payment_hash, _payment_preimage, _payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 40000);
|
||||
|
||||
let hops = &route.paths[0].hops;
|
||||
// Asserts that the first hop to `node[1]` signals no support for variable length onions.
|
||||
|
@ -993,7 +993,7 @@ macro_rules! get_phantom_route {
|
|||
(get_route(
|
||||
&$nodes[0].node.get_our_node_id(), &payment_params, &network_graph,
|
||||
Some(&$nodes[0].node.list_usable_channels().iter().collect::<Vec<_>>()),
|
||||
$amt, TEST_FINAL_CLTV, $nodes[0].logger, &scorer, &[0u8; 32]
|
||||
$amt, $nodes[0].logger, &scorer, &[0u8; 32]
|
||||
).unwrap(), phantom_route_hint.phantom_scid)
|
||||
}
|
||||
}}
|
||||
|
|
|
@ -864,7 +864,7 @@ fn get_ldk_payment_preimage() {
|
|||
let route = get_route(
|
||||
&nodes[0].node.get_our_node_id(), &payment_params, &nodes[0].network_graph.read_only(),
|
||||
Some(&nodes[0].node.list_usable_channels().iter().collect::<Vec<_>>()),
|
||||
amt_msat, TEST_FINAL_CLTV, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
|
||||
amt_msat, nodes[0].logger, &scorer, &random_seed_bytes).unwrap();
|
||||
nodes[0].node.send_payment_with_route(&route, payment_hash,
|
||||
RecipientOnionFields::secret_only(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
@ -974,7 +974,7 @@ fn failed_probe_yields_event() {
|
|||
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id(), 42);
|
||||
|
||||
let (route, _, _, _) = get_route_and_payment_hash!(&nodes[0], nodes[2], &payment_params, 9_998_000, 42);
|
||||
let (route, _, _, _) = get_route_and_payment_hash!(&nodes[0], nodes[2], &payment_params, 9_998_000);
|
||||
|
||||
let (payment_hash, payment_id) = nodes[0].node.send_probe(route.paths[0].clone()).unwrap();
|
||||
|
||||
|
@ -1023,7 +1023,7 @@ fn onchain_failed_probe_yields_event() {
|
|||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id(), 42);
|
||||
|
||||
// Send a dust HTLC, which will be treated as if it timed out once the channel hits the chain.
|
||||
let (route, _, _, _) = get_route_and_payment_hash!(&nodes[0], nodes[2], &payment_params, 1_000, 42);
|
||||
let (route, _, _, _) = get_route_and_payment_hash!(&nodes[0], nodes[2], &payment_params, 1_000);
|
||||
let (payment_hash, payment_id) = nodes[0].node.send_probe(route.paths[0].clone()).unwrap();
|
||||
|
||||
// node[0] -- update_add_htlcs -> node[1]
|
||||
|
@ -1418,8 +1418,7 @@ fn do_test_intercepted_payment(test: InterceptTest) {
|
|||
let route = get_route(
|
||||
&nodes[0].node.get_our_node_id(), &route_params.payment_params,
|
||||
&nodes[0].network_graph.read_only(), None, route_params.final_value_msat,
|
||||
route_params.payment_params.final_cltv_expiry_delta, nodes[0].logger, &scorer,
|
||||
&random_seed_bytes,
|
||||
nodes[0].logger, &scorer, &random_seed_bytes,
|
||||
).unwrap();
|
||||
|
||||
let (payment_hash, payment_secret) = nodes[2].node.create_inbound_payment(Some(amt_msat), 60 * 60, None).unwrap();
|
||||
|
|
|
@ -69,7 +69,7 @@ fn test_priv_forwarding_rejection() {
|
|||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id(), TEST_FINAL_CLTV)
|
||||
.with_features(nodes[2].node.invoice_features())
|
||||
.with_route_hints(last_hops);
|
||||
let (route, our_payment_hash, our_payment_preimage, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 10_000, TEST_FINAL_CLTV);
|
||||
let (route, our_payment_hash, our_payment_preimage, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 10_000);
|
||||
|
||||
nodes[0].node.send_payment_with_route(&route, our_payment_hash,
|
||||
RecipientOnionFields::secret_only(our_payment_secret), PaymentId(our_payment_hash.0)).unwrap();
|
||||
|
@ -238,7 +238,7 @@ fn test_routed_scid_alias() {
|
|||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id(), 42)
|
||||
.with_features(nodes[2].node.invoice_features())
|
||||
.with_route_hints(hop_hints);
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 100_000, 42);
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 100_000);
|
||||
assert_eq!(route.paths[0].hops[1].short_channel_id, last_hop[0].inbound_scid_alias.unwrap());
|
||||
nodes[0].node.send_payment_with_route(&route, payment_hash,
|
||||
RecipientOnionFields::secret_only(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
|
@ -404,7 +404,7 @@ fn test_inbound_scid_privacy() {
|
|||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id(), 42)
|
||||
.with_features(nodes[2].node.invoice_features())
|
||||
.with_route_hints(hop_hints.clone());
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 100_000, 42);
|
||||
let (route, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 100_000);
|
||||
assert_eq!(route.paths[0].hops[1].short_channel_id, last_hop[0].inbound_scid_alias.unwrap());
|
||||
nodes[0].node.send_payment_with_route(&route, payment_hash,
|
||||
RecipientOnionFields::secret_only(payment_secret), PaymentId(payment_hash.0)).unwrap();
|
||||
|
@ -420,7 +420,7 @@ fn test_inbound_scid_privacy() {
|
|||
let payment_params_2 = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id(), 42)
|
||||
.with_features(nodes[2].node.invoice_features())
|
||||
.with_route_hints(hop_hints);
|
||||
let (route_2, payment_hash_2, _, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params_2, 100_000, 42);
|
||||
let (route_2, payment_hash_2, _, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params_2, 100_000);
|
||||
assert_eq!(route_2.paths[0].hops[1].short_channel_id, last_hop[0].short_channel_id.unwrap());
|
||||
nodes[0].node.send_payment_with_route(&route_2, payment_hash_2,
|
||||
RecipientOnionFields::secret_only(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
|
||||
|
@ -472,7 +472,7 @@ fn test_scid_alias_returned() {
|
|||
let payment_params = PaymentParameters::from_node_id(nodes[2].node.get_our_node_id(), 42)
|
||||
.with_features(nodes[2].node.invoice_features())
|
||||
.with_route_hints(hop_hints);
|
||||
let (mut route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 10_000, 42);
|
||||
let (mut route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], payment_params, 10_000);
|
||||
assert_eq!(route.paths[0].hops[1].short_channel_id, nodes[2].node.list_usable_channels()[0].inbound_scid_alias.unwrap());
|
||||
|
||||
route.paths[0].hops[1].fee_msat = 10_000_000; // Overshoot the last channel's value
|
||||
|
|
|
@ -95,9 +95,9 @@ fn updates_shutdown_wait() {
|
|||
let (_, payment_hash, payment_secret) = get_payment_preimage_hash!(nodes[0]);
|
||||
|
||||
let payment_params_1 = PaymentParameters::from_node_id(nodes[1].node.get_our_node_id(), TEST_FINAL_CLTV).with_features(nodes[1].node.invoice_features());
|
||||
let route_1 = get_route(&nodes[0].node.get_our_node_id(), &payment_params_1, &nodes[0].network_graph.read_only(), None, 100000, TEST_FINAL_CLTV, &logger, &scorer, &random_seed_bytes).unwrap();
|
||||
let route_1 = get_route(&nodes[0].node.get_our_node_id(), &payment_params_1, &nodes[0].network_graph.read_only(), None, 100000, &logger, &scorer, &random_seed_bytes).unwrap();
|
||||
let payment_params_2 = PaymentParameters::from_node_id(nodes[0].node.get_our_node_id(), TEST_FINAL_CLTV).with_features(nodes[0].node.invoice_features());
|
||||
let route_2 = get_route(&nodes[1].node.get_our_node_id(), &payment_params_2, &nodes[1].network_graph.read_only(), None, 100000, TEST_FINAL_CLTV, &logger, &scorer, &random_seed_bytes).unwrap();
|
||||
let route_2 = get_route(&nodes[1].node.get_our_node_id(), &payment_params_2, &nodes[1].network_graph.read_only(), None, 100000, &logger, &scorer, &random_seed_bytes).unwrap();
|
||||
unwrap_send_err!(nodes[0].node.send_payment_with_route(&route_1, payment_hash,
|
||||
RecipientOnionFields::secret_only(payment_secret), PaymentId(payment_hash.0)
|
||||
), true, APIError::ChannelUnavailable {..}, {});
|
||||
|
|
|
@ -1103,9 +1103,8 @@ pub fn find_route<L: Deref, GL: Deref, S: Score>(
|
|||
) -> Result<Route, LightningError>
|
||||
where L::Target: Logger, GL::Target: Logger {
|
||||
let graph_lock = network_graph.read_only();
|
||||
let final_cltv_expiry_delta = route_params.payment_params.final_cltv_expiry_delta;
|
||||
let mut route = get_route(our_node_pubkey, &route_params.payment_params, &graph_lock, first_hops,
|
||||
route_params.final_value_msat, final_cltv_expiry_delta, logger, scorer,
|
||||
route_params.final_value_msat, logger, scorer,
|
||||
random_seed_bytes)?;
|
||||
add_random_cltv_offset(&mut route, &route_params.payment_params, &graph_lock, random_seed_bytes);
|
||||
Ok(route)
|
||||
|
@ -1113,8 +1112,8 @@ where L::Target: Logger, GL::Target: Logger {
|
|||
|
||||
pub(crate) fn get_route<L: Deref, S: Score>(
|
||||
our_node_pubkey: &PublicKey, payment_params: &PaymentParameters, network_graph: &ReadOnlyNetworkGraph,
|
||||
first_hops: Option<&[&ChannelDetails]>, final_value_msat: u64, final_cltv_expiry_delta: u32,
|
||||
logger: L, scorer: &S, _random_seed_bytes: &[u8; 32]
|
||||
first_hops: Option<&[&ChannelDetails]>, final_value_msat: u64, logger: L, scorer: &S,
|
||||
_random_seed_bytes: &[u8; 32]
|
||||
) -> Result<Route, LightningError>
|
||||
where L::Target: Logger {
|
||||
let payee_node_id = NodeId::from_pubkey(&payment_params.payee_pubkey);
|
||||
|
@ -1145,13 +1144,10 @@ where L::Target: Logger {
|
|||
_ => return Err(LightningError{err: "Routing to blinded paths isn't supported yet".to_owned(), action: ErrorAction::IgnoreError}),
|
||||
|
||||
}
|
||||
if payment_params.max_total_cltv_expiry_delta <= final_cltv_expiry_delta {
|
||||
if payment_params.max_total_cltv_expiry_delta <= payment_params.final_cltv_expiry_delta {
|
||||
return Err(LightningError{err: "Can't find a route where the maximum total CLTV expiry delta is below the final CLTV expiry.".to_owned(), action: ErrorAction::IgnoreError});
|
||||
}
|
||||
|
||||
// TODO: Remove the explicit final_cltv_expiry_delta parameter
|
||||
debug_assert_eq!(final_cltv_expiry_delta, payment_params.final_cltv_expiry_delta);
|
||||
|
||||
// The general routing idea is the following:
|
||||
// 1. Fill first/last hops communicated by the caller.
|
||||
// 2. Attempt to construct a path from payer to payee for transferring
|
||||
|
@ -1379,9 +1375,9 @@ where L::Target: Logger {
|
|||
// In order to already account for some of the privacy enhancing random CLTV
|
||||
// expiry delta offset we add on top later, we subtract a rough estimate
|
||||
// (2*MEDIAN_HOP_CLTV_EXPIRY_DELTA) here.
|
||||
let max_total_cltv_expiry_delta = (payment_params.max_total_cltv_expiry_delta - final_cltv_expiry_delta)
|
||||
let max_total_cltv_expiry_delta = (payment_params.max_total_cltv_expiry_delta - payment_params.final_cltv_expiry_delta)
|
||||
.checked_sub(2*MEDIAN_HOP_CLTV_EXPIRY_DELTA)
|
||||
.unwrap_or(payment_params.max_total_cltv_expiry_delta - final_cltv_expiry_delta);
|
||||
.unwrap_or(payment_params.max_total_cltv_expiry_delta - payment_params.final_cltv_expiry_delta);
|
||||
let hop_total_cltv_delta = ($next_hops_cltv_delta as u32)
|
||||
.saturating_add($candidate.cltv_expiry_delta());
|
||||
let exceeds_cltv_delta_limit = hop_total_cltv_delta > max_total_cltv_expiry_delta;
|
||||
|
@ -2071,7 +2067,7 @@ where L::Target: Logger {
|
|||
}).collect::<Vec<_>>();
|
||||
// Propagate the cltv_expiry_delta one hop backwards since the delta from the current hop is
|
||||
// applicable for the previous hop.
|
||||
path.iter_mut().rev().fold(final_cltv_expiry_delta, |prev_cltv_expiry_delta, hop| {
|
||||
path.iter_mut().rev().fold(payment_params.final_cltv_expiry_delta, |prev_cltv_expiry_delta, hop| {
|
||||
core::mem::replace(&mut hop.as_mut().unwrap().cltv_expiry_delta, prev_cltv_expiry_delta)
|
||||
});
|
||||
selected_paths.push(path);
|
||||
|
@ -2203,16 +2199,15 @@ where L::Target: Logger, GL::Target: Logger {
|
|||
let graph_lock = network_graph.read_only();
|
||||
let mut route = build_route_from_hops_internal(
|
||||
our_node_pubkey, hops, &route_params.payment_params, &graph_lock,
|
||||
route_params.final_value_msat, route_params.payment_params.final_cltv_expiry_delta,
|
||||
logger, random_seed_bytes)?;
|
||||
route_params.final_value_msat, logger, random_seed_bytes)?;
|
||||
add_random_cltv_offset(&mut route, &route_params.payment_params, &graph_lock, random_seed_bytes);
|
||||
Ok(route)
|
||||
}
|
||||
|
||||
fn build_route_from_hops_internal<L: Deref>(
|
||||
our_node_pubkey: &PublicKey, hops: &[PublicKey], payment_params: &PaymentParameters,
|
||||
network_graph: &ReadOnlyNetworkGraph, final_value_msat: u64, final_cltv_expiry_delta: u32,
|
||||
logger: L, random_seed_bytes: &[u8; 32]
|
||||
network_graph: &ReadOnlyNetworkGraph, final_value_msat: u64, logger: L,
|
||||
random_seed_bytes: &[u8; 32]
|
||||
) -> Result<Route, LightningError> where L::Target: Logger {
|
||||
|
||||
struct HopScorer {
|
||||
|
@ -2267,7 +2262,7 @@ fn build_route_from_hops_internal<L: Deref>(
|
|||
let scorer = HopScorer { our_node_id, hop_ids };
|
||||
|
||||
get_route(our_node_pubkey, payment_params, network_graph, None, final_value_msat,
|
||||
final_cltv_expiry_delta, logger, &scorer, random_seed_bytes)
|
||||
logger, &scorer, random_seed_bytes)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
@ -2357,11 +2352,11 @@ mod tests {
|
|||
|
||||
// Simple route to 2 via 1
|
||||
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 0, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 0, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Cannot send a payment of 0 msat");
|
||||
} else { panic!(); }
|
||||
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 2);
|
||||
|
||||
assert_eq!(route.paths[0].hops[0].pubkey, nodes[1]);
|
||||
|
@ -2393,11 +2388,11 @@ mod tests {
|
|||
let our_chans = vec![get_channel_details(Some(2), our_id, InitFeatures::from_le_bytes(vec![0b11]), 100000)];
|
||||
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) =
|
||||
get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 100, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "First hop cannot have our_node_pubkey as a destination.");
|
||||
} else { panic!(); }
|
||||
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 2);
|
||||
}
|
||||
|
||||
|
@ -2505,7 +2500,7 @@ mod tests {
|
|||
});
|
||||
|
||||
// Not possible to send 199_999_999, because the minimum on channel=2 is 200_000_000.
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 199_999_999, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 199_999_999, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a path to the given destination");
|
||||
} else { panic!(); }
|
||||
|
||||
|
@ -2524,7 +2519,7 @@ mod tests {
|
|||
});
|
||||
|
||||
// A payment above the minimum should pass
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 199_999_999, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 199_999_999, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 2);
|
||||
}
|
||||
|
||||
|
@ -2606,7 +2601,7 @@ mod tests {
|
|||
excess_data: Vec::new()
|
||||
});
|
||||
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 60_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 60_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
// Overpay fees to hit htlc_minimum_msat.
|
||||
let overpaid_fees = route.paths[0].hops[0].fee_msat + route.paths[1].hops[0].fee_msat;
|
||||
// TODO: this could be better balanced to overpay 10k and not 15k.
|
||||
|
@ -2651,14 +2646,14 @@ mod tests {
|
|||
excess_data: Vec::new()
|
||||
});
|
||||
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 60_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 60_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
// Fine to overpay for htlc_minimum_msat if it allows us to save fee.
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
assert_eq!(route.paths[0].hops[0].short_channel_id, 12);
|
||||
let fees = route.paths[0].hops[0].fee_msat;
|
||||
assert_eq!(fees, 5_000);
|
||||
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 50_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 50_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
// Not fine to overpay for htlc_minimum_msat if it requires paying more than fee on
|
||||
// the other channel.
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
|
@ -2703,13 +2698,13 @@ mod tests {
|
|||
});
|
||||
|
||||
// If all the channels require some features we don't understand, route should fail
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a path to the given destination");
|
||||
} else { panic!(); }
|
||||
|
||||
// If we specify a channel to node7, that overrides our local channel view and that gets used
|
||||
let our_chans = vec![get_channel_details(Some(42), nodes[7].clone(), InitFeatures::from_le_bytes(vec![0b11]), 250_000_000)];
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 2);
|
||||
|
||||
assert_eq!(route.paths[0].hops[0].pubkey, nodes[7]);
|
||||
|
@ -2744,13 +2739,13 @@ mod tests {
|
|||
add_or_update_node(&gossip_sync, &secp_ctx, &privkeys[7], unknown_features.clone(), 1);
|
||||
|
||||
// If all nodes require some features we don't understand, route should fail
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a path to the given destination");
|
||||
} else { panic!(); }
|
||||
|
||||
// If we specify a channel to node7, that overrides our local channel view and that gets used
|
||||
let our_chans = vec![get_channel_details(Some(42), nodes[7].clone(), InitFeatures::from_le_bytes(vec![0b11]), 250_000_000)];
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 2);
|
||||
|
||||
assert_eq!(route.paths[0].hops[0].pubkey, nodes[7]);
|
||||
|
@ -2782,7 +2777,7 @@ mod tests {
|
|||
|
||||
// Route to 1 via 2 and 3 because our channel to 1 is disabled
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[0], 42);
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 3);
|
||||
|
||||
assert_eq!(route.paths[0].hops[0].pubkey, nodes[1]);
|
||||
|
@ -2809,7 +2804,7 @@ mod tests {
|
|||
// If we specify a channel to node7, that overrides our local channel view and that gets used
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[2], 42);
|
||||
let our_chans = vec![get_channel_details(Some(42), nodes[7].clone(), InitFeatures::from_le_bytes(vec![0b11]), 250_000_000)];
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 2);
|
||||
|
||||
assert_eq!(route.paths[0].hops[0].pubkey, nodes[7]);
|
||||
|
@ -2932,13 +2927,13 @@ mod tests {
|
|||
invalid_last_hops.push(invalid_last_hop);
|
||||
{
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[6], 42).with_route_hints(invalid_last_hops);
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Route hint cannot have the payee as the source.");
|
||||
} else { panic!(); }
|
||||
}
|
||||
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[6], 42).with_route_hints(last_hops_multi_private_channels(&nodes));
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 5);
|
||||
|
||||
assert_eq!(route.paths[0].hops[0].pubkey, nodes[1]);
|
||||
|
@ -3014,7 +3009,7 @@ mod tests {
|
|||
|
||||
// Test handling of an empty RouteHint passed in Invoice.
|
||||
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 5);
|
||||
|
||||
assert_eq!(route.paths[0].hops[0].pubkey, nodes[1]);
|
||||
|
@ -3120,7 +3115,7 @@ mod tests {
|
|||
excess_data: Vec::new()
|
||||
});
|
||||
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 4);
|
||||
|
||||
assert_eq!(route.paths[0].hops[0].pubkey, nodes[1]);
|
||||
|
@ -3192,7 +3187,7 @@ mod tests {
|
|||
excess_data: Vec::new()
|
||||
});
|
||||
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &[42u8; 32]).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &[42u8; 32]).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 4);
|
||||
|
||||
assert_eq!(route.paths[0].hops[0].pubkey, nodes[1]);
|
||||
|
@ -3274,7 +3269,7 @@ mod tests {
|
|||
// This test shows that public routes can be present in the invoice
|
||||
// which would be handled in the same manner.
|
||||
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 5);
|
||||
|
||||
assert_eq!(route.paths[0].hops[0].pubkey, nodes[1]);
|
||||
|
@ -3327,7 +3322,7 @@ mod tests {
|
|||
let our_chans = vec![get_channel_details(Some(42), nodes[3].clone(), InitFeatures::from_le_bytes(vec![0b11]), 250_000_000)];
|
||||
let mut last_hops = last_hops(&nodes);
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[6], 42).with_route_hints(last_hops.clone());
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 2);
|
||||
|
||||
assert_eq!(route.paths[0].hops[0].pubkey, nodes[3]);
|
||||
|
@ -3348,7 +3343,7 @@ mod tests {
|
|||
|
||||
// Revert to via 6 as the fee on 8 goes up
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[6], 42).with_route_hints(last_hops);
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 4);
|
||||
|
||||
assert_eq!(route.paths[0].hops[0].pubkey, nodes[1]);
|
||||
|
@ -3382,7 +3377,7 @@ mod tests {
|
|||
assert_eq!(route.paths[0].hops[3].channel_features.le_flags(), &Vec::<u8>::new()); // We can't learn any flags from invoices, sadly
|
||||
|
||||
// ...but still use 8 for larger payments as 6 has a variable feerate
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 2000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 2000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths[0].hops.len(), 5);
|
||||
|
||||
assert_eq!(route.paths[0].hops[0].pubkey, nodes[1]);
|
||||
|
@ -3448,7 +3443,7 @@ mod tests {
|
|||
let logger = ln_test_utils::TestLogger::new();
|
||||
let network_graph = NetworkGraph::new(Network::Testnet, &logger);
|
||||
let route = get_route(&source_node_id, &payment_params, &network_graph.read_only(),
|
||||
Some(&our_chans.iter().collect::<Vec<_>>()), route_val, 42, &logger, &scorer, &random_seed_bytes);
|
||||
Some(&our_chans.iter().collect::<Vec<_>>()), route_val, &logger, &scorer, &random_seed_bytes);
|
||||
route
|
||||
}
|
||||
|
||||
|
@ -3570,14 +3565,14 @@ mod tests {
|
|||
{
|
||||
// Attempt to route more than available results in a failure.
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 250_000_001, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 250_000_001, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a sufficient route to the given destination");
|
||||
} else { panic!(); }
|
||||
}
|
||||
|
||||
{
|
||||
// Now, attempt to route an exact amount we have should be fine.
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 250_000_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 250_000_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
let path = route.paths.last().unwrap();
|
||||
assert_eq!(path.hops.len(), 2);
|
||||
|
@ -3606,14 +3601,14 @@ mod tests {
|
|||
{
|
||||
// Attempt to route more than available results in a failure.
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(
|
||||
&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 200_000_001, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 200_000_001, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a sufficient route to the given destination");
|
||||
} else { panic!(); }
|
||||
}
|
||||
|
||||
{
|
||||
// Now, attempt to route an exact amount we have should be fine.
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 200_000_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&our_chans.iter().collect::<Vec<_>>()), 200_000_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
let path = route.paths.last().unwrap();
|
||||
assert_eq!(path.hops.len(), 2);
|
||||
|
@ -3653,14 +3648,14 @@ mod tests {
|
|||
{
|
||||
// Attempt to route more than available results in a failure.
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 15_001, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 15_001, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a sufficient route to the given destination");
|
||||
} else { panic!(); }
|
||||
}
|
||||
|
||||
{
|
||||
// Now, attempt to route an exact amount we have should be fine.
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 15_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 15_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
let path = route.paths.last().unwrap();
|
||||
assert_eq!(path.hops.len(), 2);
|
||||
|
@ -3724,14 +3719,14 @@ mod tests {
|
|||
{
|
||||
// Attempt to route more than available results in a failure.
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 15_001, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 15_001, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a sufficient route to the given destination");
|
||||
} else { panic!(); }
|
||||
}
|
||||
|
||||
{
|
||||
// Now, attempt to route an exact amount we have should be fine.
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 15_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 15_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
let path = route.paths.last().unwrap();
|
||||
assert_eq!(path.hops.len(), 2);
|
||||
|
@ -3756,14 +3751,14 @@ mod tests {
|
|||
{
|
||||
// Attempt to route more than available results in a failure.
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 10_001, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 10_001, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a sufficient route to the given destination");
|
||||
} else { panic!(); }
|
||||
}
|
||||
|
||||
{
|
||||
// Now, attempt to route an exact amount we have should be fine.
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 10_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 10_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
let path = route.paths.last().unwrap();
|
||||
assert_eq!(path.hops.len(), 2);
|
||||
|
@ -3868,14 +3863,14 @@ mod tests {
|
|||
{
|
||||
// Attempt to route more than available results in a failure.
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 60_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 60_000, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a sufficient route to the given destination");
|
||||
} else { panic!(); }
|
||||
}
|
||||
|
||||
{
|
||||
// Now, attempt to route 49 sats (just a bit below the capacity).
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 49_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 49_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
let mut total_amount_paid_msat = 0;
|
||||
for path in &route.paths {
|
||||
|
@ -3888,7 +3883,7 @@ mod tests {
|
|||
|
||||
{
|
||||
// Attempt to route an exact amount is also fine
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 50_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 50_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
let mut total_amount_paid_msat = 0;
|
||||
for path in &route.paths {
|
||||
|
@ -3936,7 +3931,7 @@ mod tests {
|
|||
});
|
||||
|
||||
{
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 50_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 50_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
let mut total_amount_paid_msat = 0;
|
||||
for path in &route.paths {
|
||||
|
@ -4050,7 +4045,7 @@ mod tests {
|
|||
{
|
||||
// Attempt to route more than available results in a failure.
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 300_000, 42,
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 300_000,
|
||||
Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a sufficient route to the given destination");
|
||||
} else { panic!(); }
|
||||
|
@ -4060,7 +4055,7 @@ mod tests {
|
|||
// Attempt to route while setting max_path_count to 0 results in a failure.
|
||||
let zero_payment_params = payment_params.clone().with_max_path_count(0);
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(
|
||||
&our_id, &zero_payment_params, &network_graph.read_only(), None, 100, 42,
|
||||
&our_id, &zero_payment_params, &network_graph.read_only(), None, 100,
|
||||
Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Can't find a route with no paths allowed.");
|
||||
} else { panic!(); }
|
||||
|
@ -4072,7 +4067,7 @@ mod tests {
|
|||
// to account for 1/3 of the total value, which is violated by 2 out of 3 paths.
|
||||
let fail_payment_params = payment_params.clone().with_max_path_count(3);
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(
|
||||
&our_id, &fail_payment_params, &network_graph.read_only(), None, 250_000, 42,
|
||||
&our_id, &fail_payment_params, &network_graph.read_only(), None, 250_000,
|
||||
Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a sufficient route to the given destination");
|
||||
} else { panic!(); }
|
||||
|
@ -4082,7 +4077,7 @@ mod tests {
|
|||
// Now, attempt to route 250 sats (just a bit below the capacity).
|
||||
// Our algorithm should provide us with these 3 paths.
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None,
|
||||
250_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
250_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 3);
|
||||
let mut total_amount_paid_msat = 0;
|
||||
for path in &route.paths {
|
||||
|
@ -4096,7 +4091,7 @@ mod tests {
|
|||
{
|
||||
// Attempt to route an exact amount is also fine
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None,
|
||||
290_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
290_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 3);
|
||||
let mut total_amount_paid_msat = 0;
|
||||
for path in &route.paths {
|
||||
|
@ -4252,7 +4247,7 @@ mod tests {
|
|||
{
|
||||
// Attempt to route more than available results in a failure.
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 350_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 350_000, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a sufficient route to the given destination");
|
||||
} else { panic!(); }
|
||||
}
|
||||
|
@ -4260,7 +4255,7 @@ mod tests {
|
|||
{
|
||||
// Now, attempt to route 300 sats (exact amount we can route).
|
||||
// Our algorithm should provide us with these 3 paths, 100 sats each.
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 300_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 300_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 3);
|
||||
|
||||
let mut total_amount_paid_msat = 0;
|
||||
|
@ -4421,7 +4416,7 @@ mod tests {
|
|||
{
|
||||
// Now, attempt to route 180 sats.
|
||||
// Our algorithm should provide us with these 2 paths.
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 180_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 180_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 2);
|
||||
|
||||
let mut total_value_transferred_msat = 0;
|
||||
|
@ -4592,14 +4587,14 @@ mod tests {
|
|||
{
|
||||
// Attempt to route more than available results in a failure.
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 210_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 210_000, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a sufficient route to the given destination");
|
||||
} else { panic!(); }
|
||||
}
|
||||
|
||||
{
|
||||
// Now, attempt to route 200 sats (exact amount we can route).
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 200_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 200_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 2);
|
||||
|
||||
let mut total_amount_paid_msat = 0;
|
||||
|
@ -4699,7 +4694,7 @@ mod tests {
|
|||
|
||||
// Get a route for 100 sats and check that we found the MPP route no problem and didn't
|
||||
// overpay at all.
|
||||
let mut route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let mut route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 2);
|
||||
route.paths.sort_by_key(|path| path.hops[0].short_channel_id);
|
||||
// Paths are manually ordered ordered by SCID, so:
|
||||
|
@ -4818,7 +4813,7 @@ mod tests {
|
|||
{
|
||||
// Attempt to route more than available results in a failure.
|
||||
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 150_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 150_000, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
assert_eq!(err, "Failed to find a sufficient route to the given destination");
|
||||
} else { panic!(); }
|
||||
}
|
||||
|
@ -4826,7 +4821,7 @@ mod tests {
|
|||
{
|
||||
// Now, attempt to route 125 sats (just a bit below the capacity of 3 channels).
|
||||
// Our algorithm should provide us with these 3 paths.
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 125_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 125_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 3);
|
||||
let mut total_amount_paid_msat = 0;
|
||||
for path in &route.paths {
|
||||
|
@ -4839,7 +4834,7 @@ mod tests {
|
|||
|
||||
{
|
||||
// Attempt to route without the last small cheap channel
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 90_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 90_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 2);
|
||||
let mut total_amount_paid_msat = 0;
|
||||
for path in &route.paths {
|
||||
|
@ -4978,7 +4973,7 @@ mod tests {
|
|||
|
||||
{
|
||||
// Now ensure the route flows simply over nodes 1 and 4 to 6.
|
||||
let route = get_route(&our_id, &payment_params, &network.read_only(), None, 10_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network.read_only(), None, 10_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
assert_eq!(route.paths[0].hops.len(), 3);
|
||||
|
||||
|
@ -5049,7 +5044,7 @@ mod tests {
|
|||
{
|
||||
// Now, attempt to route 90 sats, which is exactly 90 sats at the last hop, plus the
|
||||
// 200% fee charged channel 13 in the 1-to-2 direction.
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 90_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 90_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
assert_eq!(route.paths[0].hops.len(), 2);
|
||||
|
||||
|
@ -5115,7 +5110,7 @@ mod tests {
|
|||
// Now, attempt to route 90 sats, hitting the htlc_minimum on channel 4, but
|
||||
// overshooting the htlc_maximum on channel 2. Thus, we should pick the (absurdly
|
||||
// expensive) channels 12-13 path.
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 90_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 90_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
assert_eq!(route.paths[0].hops.len(), 2);
|
||||
|
||||
|
@ -5157,7 +5152,7 @@ mod tests {
|
|||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&[
|
||||
&get_channel_details(Some(3), nodes[0], channelmanager::provided_init_features(&config), 200_000),
|
||||
&get_channel_details(Some(2), nodes[0], channelmanager::provided_init_features(&config), 10_000),
|
||||
]), 100_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
]), 100_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
assert_eq!(route.paths[0].hops.len(), 1);
|
||||
|
||||
|
@ -5169,7 +5164,7 @@ mod tests {
|
|||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), Some(&[
|
||||
&get_channel_details(Some(3), nodes[0], channelmanager::provided_init_features(&config), 50_000),
|
||||
&get_channel_details(Some(2), nodes[0], channelmanager::provided_init_features(&config), 50_000),
|
||||
]), 100_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
]), 100_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 2);
|
||||
assert_eq!(route.paths[0].hops.len(), 1);
|
||||
assert_eq!(route.paths[1].hops.len(), 1);
|
||||
|
@ -5201,7 +5196,7 @@ mod tests {
|
|||
&get_channel_details(Some(8), nodes[0], channelmanager::provided_init_features(&config), 50_000),
|
||||
&get_channel_details(Some(9), nodes[0], channelmanager::provided_init_features(&config), 50_000),
|
||||
&get_channel_details(Some(4), nodes[0], channelmanager::provided_init_features(&config), 1_000_000),
|
||||
]), 100_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
]), 100_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
assert_eq!(route.paths[0].hops.len(), 1);
|
||||
|
||||
|
@ -5222,7 +5217,7 @@ mod tests {
|
|||
let keys_manager = ln_test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let route = get_route(
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 100, 42,
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 100,
|
||||
Arc::clone(&logger), &scorer, &random_seed_bytes
|
||||
).unwrap();
|
||||
let path = route.paths[0].hops.iter().map(|hop| hop.short_channel_id).collect::<Vec<_>>();
|
||||
|
@ -5235,7 +5230,7 @@ mod tests {
|
|||
// from nodes[2] rather than channel 6, 11, and 8, even though the longer path is cheaper.
|
||||
let scorer = FixedPenaltyScorer::with_penalty(100);
|
||||
let route = get_route(
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 100, 42,
|
||||
&our_id, &payment_params, &network_graph.read_only(), None, 100,
|
||||
Arc::clone(&logger), &scorer, &random_seed_bytes
|
||||
).unwrap();
|
||||
let path = route.paths[0].hops.iter().map(|hop| hop.short_channel_id).collect::<Vec<_>>();
|
||||
|
@ -5296,7 +5291,7 @@ mod tests {
|
|||
let keys_manager = ln_test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let route = get_route(
|
||||
&our_id, &payment_params, &network_graph, None, 100, 42,
|
||||
&our_id, &payment_params, &network_graph, None, 100,
|
||||
Arc::clone(&logger), &scorer, &random_seed_bytes
|
||||
).unwrap();
|
||||
let path = route.paths[0].hops.iter().map(|hop| hop.short_channel_id).collect::<Vec<_>>();
|
||||
|
@ -5308,7 +5303,7 @@ mod tests {
|
|||
// A different path to nodes[6] exists if channel 6 cannot be routed over.
|
||||
let scorer = BadChannelScorer { short_channel_id: 6 };
|
||||
let route = get_route(
|
||||
&our_id, &payment_params, &network_graph, None, 100, 42,
|
||||
&our_id, &payment_params, &network_graph, None, 100,
|
||||
Arc::clone(&logger), &scorer, &random_seed_bytes
|
||||
).unwrap();
|
||||
let path = route.paths[0].hops.iter().map(|hop| hop.short_channel_id).collect::<Vec<_>>();
|
||||
|
@ -5320,7 +5315,7 @@ mod tests {
|
|||
// A path to nodes[6] does not exist if nodes[2] cannot be routed through.
|
||||
let scorer = BadNodeScorer { node_id: NodeId::from_pubkey(&nodes[2]) };
|
||||
match get_route(
|
||||
&our_id, &payment_params, &network_graph, None, 100, 42,
|
||||
&our_id, &payment_params, &network_graph, None, 100,
|
||||
Arc::clone(&logger), &scorer, &random_seed_bytes
|
||||
) {
|
||||
Err(LightningError { err, .. } ) => {
|
||||
|
@ -5415,7 +5410,7 @@ mod tests {
|
|||
.with_max_total_cltv_expiry_delta(feasible_max_total_cltv_delta);
|
||||
let keys_manager = ln_test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let route = get_route(&our_id, &feasible_payment_params, &network_graph, None, 100, 0, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &feasible_payment_params, &network_graph, None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let path = route.paths[0].hops.iter().map(|hop| hop.short_channel_id).collect::<Vec<_>>();
|
||||
assert_ne!(path.len(), 0);
|
||||
|
||||
|
@ -5423,7 +5418,7 @@ mod tests {
|
|||
let fail_max_total_cltv_delta = 23;
|
||||
let fail_payment_params = PaymentParameters::from_node_id(nodes[6], 0).with_route_hints(last_hops(&nodes))
|
||||
.with_max_total_cltv_expiry_delta(fail_max_total_cltv_delta);
|
||||
match get_route(&our_id, &fail_payment_params, &network_graph, None, 100, 0, Arc::clone(&logger), &scorer, &random_seed_bytes)
|
||||
match get_route(&our_id, &fail_payment_params, &network_graph, None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes)
|
||||
{
|
||||
Err(LightningError { err, .. } ) => {
|
||||
assert_eq!(err, "Failed to find a path to the given destination");
|
||||
|
@ -5448,9 +5443,9 @@ mod tests {
|
|||
|
||||
// We should be able to find a route initially, and then after we fail a few random
|
||||
// channels eventually we won't be able to any longer.
|
||||
assert!(get_route(&our_id, &payment_params, &network_graph, None, 100, 0, Arc::clone(&logger), &scorer, &random_seed_bytes).is_ok());
|
||||
assert!(get_route(&our_id, &payment_params, &network_graph, None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes).is_ok());
|
||||
loop {
|
||||
if let Ok(route) = get_route(&our_id, &payment_params, &network_graph, None, 100, 0, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
if let Ok(route) = get_route(&our_id, &payment_params, &network_graph, None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes) {
|
||||
for chan in route.paths[0].hops.iter() {
|
||||
assert!(!payment_params.previously_failed_channels.contains(&chan.short_channel_id));
|
||||
}
|
||||
|
@ -5473,14 +5468,14 @@ mod tests {
|
|||
|
||||
// First check we can actually create a long route on this graph.
|
||||
let feasible_payment_params = PaymentParameters::from_node_id(nodes[18], 0);
|
||||
let route = get_route(&our_id, &feasible_payment_params, &network_graph, None, 100, 0,
|
||||
let route = get_route(&our_id, &feasible_payment_params, &network_graph, None, 100,
|
||||
Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let path = route.paths[0].hops.iter().map(|hop| hop.short_channel_id).collect::<Vec<_>>();
|
||||
assert!(path.len() == MAX_PATH_LENGTH_ESTIMATE.into());
|
||||
|
||||
// But we can't create a path surpassing the MAX_PATH_LENGTH_ESTIMATE limit.
|
||||
let fail_payment_params = PaymentParameters::from_node_id(nodes[19], 0);
|
||||
match get_route(&our_id, &fail_payment_params, &network_graph, None, 100, 0,
|
||||
match get_route(&our_id, &fail_payment_params, &network_graph, None, 100,
|
||||
Arc::clone(&logger), &scorer, &random_seed_bytes)
|
||||
{
|
||||
Err(LightningError { err, .. } ) => {
|
||||
|
@ -5500,7 +5495,7 @@ mod tests {
|
|||
let payment_params = PaymentParameters::from_node_id(nodes[6], 42).with_route_hints(last_hops(&nodes));
|
||||
let keys_manager = ln_test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 1);
|
||||
|
||||
let cltv_expiry_deltas_before = route.paths[0].hops.iter().map(|h| h.cltv_expiry_delta).collect::<Vec<u32>>();
|
||||
|
@ -5534,7 +5529,7 @@ mod tests {
|
|||
let keys_manager = ln_test_utils::TestKeysInterface::new(&[4u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
|
||||
let mut route = get_route(&our_id, &payment_params, &network_graph, None, 100, 0,
|
||||
let mut route = get_route(&our_id, &payment_params, &network_graph, None, 100,
|
||||
Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
add_random_cltv_offset(&mut route, &payment_params, &network_graph, &random_seed_bytes);
|
||||
|
||||
|
@ -5600,7 +5595,7 @@ mod tests {
|
|||
let payment_params = PaymentParameters::from_node_id(nodes[3], 0);
|
||||
let hops = [nodes[1], nodes[2], nodes[4], nodes[3]];
|
||||
let route = build_route_from_hops_internal(&our_id, &hops, &payment_params,
|
||||
&network_graph, 100, 0, Arc::clone(&logger), &random_seed_bytes).unwrap();
|
||||
&network_graph, 100, Arc::clone(&logger), &random_seed_bytes).unwrap();
|
||||
let route_hop_pubkeys = route.paths[0].hops.iter().map(|hop| hop.pubkey).collect::<Vec<_>>();
|
||||
assert_eq!(hops.len(), route.paths[0].hops.len());
|
||||
for (idx, hop_pubkey) in hops.iter().enumerate() {
|
||||
|
@ -5647,7 +5642,7 @@ mod tests {
|
|||
let keys_manager = ln_test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
|
||||
let random_seed_bytes = keys_manager.get_secure_random_bytes();
|
||||
// 100,000 sats is less than the available liquidity on each channel, set above.
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100_000_000, 42, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100_000_000, Arc::clone(&logger), &scorer, &random_seed_bytes).unwrap();
|
||||
assert_eq!(route.paths.len(), 2);
|
||||
assert!((route.paths[0].hops[1].short_channel_id == 4 && route.paths[1].hops[1].short_channel_id == 13) ||
|
||||
(route.paths[1].hops[1].short_channel_id == 4 && route.paths[0].hops[1].short_channel_id == 13));
|
||||
|
@ -5694,7 +5689,7 @@ mod tests {
|
|||
let amt = seed as u64 % 200_000_000;
|
||||
let params = ProbabilisticScoringParameters::default();
|
||||
let scorer = ProbabilisticScorer::new(params, &graph, &logger);
|
||||
if get_route(src, &payment_params, &graph.read_only(), None, amt, 42, &logger, &scorer, &random_seed_bytes).is_ok() {
|
||||
if get_route(src, &payment_params, &graph.read_only(), None, amt, &logger, &scorer, &random_seed_bytes).is_ok() {
|
||||
continue 'load_endpoints;
|
||||
}
|
||||
}
|
||||
|
@ -5732,7 +5727,7 @@ mod tests {
|
|||
let amt = seed as u64 % 200_000_000;
|
||||
let params = ProbabilisticScoringParameters::default();
|
||||
let scorer = ProbabilisticScorer::new(params, &graph, &logger);
|
||||
if get_route(src, &payment_params, &graph.read_only(), None, amt, 42, &logger, &scorer, &random_seed_bytes).is_ok() {
|
||||
if get_route(src, &payment_params, &graph.read_only(), None, amt, &logger, &scorer, &random_seed_bytes).is_ok() {
|
||||
continue 'load_endpoints;
|
||||
}
|
||||
}
|
||||
|
@ -5762,17 +5757,17 @@ mod tests {
|
|||
|
||||
// Then check we can get a normal route
|
||||
let payment_params = PaymentParameters::from_node_id(nodes[10], 42);
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes);
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes);
|
||||
assert!(route.is_ok());
|
||||
|
||||
// Then check that we can't get a route if we ban an intermediate node.
|
||||
scorer.add_banned(&NodeId::from_pubkey(&nodes[3]));
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes);
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes);
|
||||
assert!(route.is_err());
|
||||
|
||||
// Finally make sure we can route again, when we remove the ban.
|
||||
scorer.remove_banned(&NodeId::from_pubkey(&nodes[3]));
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, 42, Arc::clone(&logger), &scorer, &random_seed_bytes);
|
||||
let route = get_route(&our_id, &payment_params, &network_graph.read_only(), None, 100, Arc::clone(&logger), &scorer, &random_seed_bytes);
|
||||
assert!(route.is_ok());
|
||||
}
|
||||
|
||||
|
@ -6077,7 +6072,7 @@ mod benches {
|
|||
let params = PaymentParameters::from_node_id(dst, 42).with_features(features.clone());
|
||||
let first_hop = first_hop(src);
|
||||
let amt = seed as u64 % 1_000_000;
|
||||
if let Ok(route) = get_route(&payer, ¶ms, &graph.read_only(), Some(&[&first_hop]), amt, 42, &DummyLogger{}, &scorer, &random_seed_bytes) {
|
||||
if let Ok(route) = get_route(&payer, ¶ms, &graph.read_only(), Some(&[&first_hop]), amt, &DummyLogger{}, &scorer, &random_seed_bytes) {
|
||||
routes.push(route);
|
||||
route_endpoints.push((first_hop, params, amt));
|
||||
continue 'load_endpoints;
|
||||
|
@ -6104,7 +6099,7 @@ mod benches {
|
|||
// selected destinations, possibly causing us to fail because, eg, the newly-selected path
|
||||
// requires a too-high CLTV delta.
|
||||
route_endpoints.retain(|(first_hop, params, amt)| {
|
||||
get_route(&payer, params, &graph.read_only(), Some(&[first_hop]), *amt, 42, &DummyLogger{}, &scorer, &random_seed_bytes).is_ok()
|
||||
get_route(&payer, params, &graph.read_only(), Some(&[first_hop]), *amt, &DummyLogger{}, &scorer, &random_seed_bytes).is_ok()
|
||||
});
|
||||
route_endpoints.truncate(100);
|
||||
assert_eq!(route_endpoints.len(), 100);
|
||||
|
@ -6113,7 +6108,7 @@ mod benches {
|
|||
let mut idx = 0;
|
||||
bench.iter(|| {
|
||||
let (first_hop, params, amt) = &route_endpoints[idx % route_endpoints.len()];
|
||||
assert!(get_route(&payer, params, &graph.read_only(), Some(&[first_hop]), *amt, 42, &DummyLogger{}, &scorer, &random_seed_bytes).is_ok());
|
||||
assert!(get_route(&payer, params, &graph.read_only(), Some(&[first_hop]), *amt, &DummyLogger{}, &scorer, &random_seed_bytes).is_ok());
|
||||
idx += 1;
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue