Skip to content

Commit f3e33f4

Browse files
committed
Try to overpay the recipient if we fail to find a path at all
Previously we'd only try to overpay if we managed to find a path to the recipient which was sufficient. However, if we fail to find any path to the recipient at all we should still retry overpaying the recipient. Ultimately we should be silling to pay whatever reasonable performance penalty if the alternative is not finding a path at all, which we do here.
1 parent 5861dde commit f3e33f4

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

lightning/src/routing/router.rs

+53
Original file line numberDiff line numberDiff line change
@@ -2454,6 +2454,9 @@ where L::Target: Logger {
24542454
// because we deterministically terminated the search due to low liquidity.
24552455
if !found_new_path && channel_saturation_pow_half != 0 {
24562456
channel_saturation_pow_half = 0;
2457+
} else if !found_new_path && hit_minimum_limit && already_collected_value_msat < final_value_msat && path_value_msat != recommended_value_msat {
2458+
log_trace!(logger, "Failed to collect enough value, but running again to collect extra paths with a potentially higher limit.");
2459+
path_value_msat = recommended_value_msat;
24572460
} else if already_collected_value_msat >= recommended_value_msat || !found_new_path {
24582461
log_trace!(logger, "Have now collected {} msat (seeking {} msat) in paths. Last path loop {} a new path.",
24592462
already_collected_value_msat, recommended_value_msat, if found_new_path { "found" } else { "did not find" });
@@ -3223,6 +3226,56 @@ mod tests {
32233226
assert_eq!(fees, 5_000);
32243227
}
32253228

3229+
#[test]
3230+
fn htlc_minimum_recipient_overpay_test() {
3231+
let (secp_ctx, network_graph, gossip_sync, _, logger) = build_graph();
3232+
let (_, our_id, privkeys, nodes) = get_nodes(&secp_ctx);
3233+
let config = UserConfig::default();
3234+
let payment_params = PaymentParameters::from_node_id(nodes[2], 42).with_bolt11_features(channelmanager::provided_invoice_features(&config)).unwrap();
3235+
let scorer = ln_test_utils::TestScorer::new();
3236+
let keys_manager = ln_test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);
3237+
let random_seed_bytes = keys_manager.get_secure_random_bytes();
3238+
3239+
// Route to node2 over a single path which requires overpaying the recipient themselves.
3240+
3241+
// First disable all paths except the us -> node1 -> node2 path
3242+
update_channel(&gossip_sync, &secp_ctx, &privkeys[2], UnsignedChannelUpdate {
3243+
chain_hash: genesis_block(Network::Testnet).header.block_hash(),
3244+
short_channel_id: 13,
3245+
timestamp: 2,
3246+
flags: 3,
3247+
cltv_expiry_delta: 0,
3248+
htlc_minimum_msat: 0,
3249+
htlc_maximum_msat: 0,
3250+
fee_base_msat: 0,
3251+
fee_proportional_millionths: 0,
3252+
excess_data: Vec::new()
3253+
});
3254+
3255+
// Set channel 4 to free but with a high htlc_minimum_msat
3256+
update_channel(&gossip_sync, &secp_ctx, &privkeys[1], UnsignedChannelUpdate {
3257+
chain_hash: genesis_block(Network::Testnet).header.block_hash(),
3258+
short_channel_id: 4,
3259+
timestamp: 2,
3260+
flags: 0,
3261+
cltv_expiry_delta: 0,
3262+
htlc_minimum_msat: 15_000,
3263+
htlc_maximum_msat: MAX_VALUE_MSAT,
3264+
fee_base_msat: 0,
3265+
fee_proportional_millionths: 0,
3266+
excess_data: Vec::new()
3267+
});
3268+
3269+
// Now check that we'll find a path if the htlc_minimum is overrun substantially.
3270+
let mut route_params = RouteParameters::from_payment_params_and_value(
3271+
payment_params.clone(), 5_000);
3272+
// TODO: This can even overrun the fee limit set by the recipient!
3273+
route_params.max_total_routing_fee_msat = Some(9_999);
3274+
let route = get_route(&our_id, &route_params, &network_graph.read_only(), None,
3275+
Arc::clone(&logger), &scorer, &Default::default(), &random_seed_bytes).unwrap();
3276+
assert_eq!(route.get_total_fees(), 10_000);
3277+
}
3278+
32263279
#[test]
32273280
fn disable_channels_test() {
32283281
let (secp_ctx, network_graph, gossip_sync, _, logger) = build_graph();

0 commit comments

Comments
 (0)