Skip to content

Commit a0c65c3

Browse files
authored
Merge pull request #2043 from valentinewallace/2023-02-initial-send-path-fails
`PaymentPathFailed`: add initial send error details
2 parents 596ef3b + f2f90d5 commit a0c65c3

16 files changed

+370
-167
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use lightning::routing::gossip::{NetworkGraph, P2PGossipSync};
3333
use lightning::routing::utxo::UtxoLookup;
3434
use lightning::routing::router::Router;
3535
use lightning::routing::scoring::{Score, WriteableScore};
36-
use lightning::util::events::{Event, EventHandler, EventsProvider};
36+
use lightning::util::events::{Event, EventHandler, EventsProvider, PathFailure};
3737
use lightning::util::logger::Logger;
3838
use lightning::util::persist::Persister;
3939
use lightning_rapid_gossip_sync::RapidGossipSync;
@@ -214,10 +214,10 @@ where
214214
fn handle_network_graph_update<L: Deref>(
215215
network_graph: &NetworkGraph<L>, event: &Event
216216
) where L::Target: Logger {
217-
if let Event::PaymentPathFailed { ref network_update, .. } = event {
218-
if let Some(network_update) = network_update {
219-
network_graph.handle_network_update(&network_update);
220-
}
217+
if let Event::PaymentPathFailed {
218+
failure: PathFailure::OnPath { network_update: Some(ref upd) }, .. } = event
219+
{
220+
network_graph.handle_network_update(upd);
221221
}
222222
}
223223

@@ -672,7 +672,7 @@ mod tests {
672672
use lightning::routing::router::{DefaultRouter, RouteHop};
673673
use lightning::routing::scoring::{ChannelUsage, Score};
674674
use lightning::util::config::UserConfig;
675-
use lightning::util::events::{Event, MessageSendEventsProvider, MessageSendEvent};
675+
use lightning::util::events::{Event, PathFailure, MessageSendEventsProvider, MessageSendEvent};
676676
use lightning::util::ser::Writeable;
677677
use lightning::util::test_utils;
678678
use lightning::util::persist::KVStorePersister;
@@ -1364,8 +1364,7 @@ mod tests {
13641364
payment_id: None,
13651365
payment_hash: PaymentHash([42; 32]),
13661366
payment_failed_permanently: false,
1367-
network_update: None,
1368-
all_paths_failed: true,
1367+
failure: PathFailure::OnPath { network_update: None },
13691368
path: path.clone(),
13701369
short_channel_id: Some(scored_scid),
13711370
retry: None,
@@ -1385,8 +1384,7 @@ mod tests {
13851384
payment_id: None,
13861385
payment_hash: PaymentHash([42; 32]),
13871386
payment_failed_permanently: true,
1388-
network_update: None,
1389-
all_paths_failed: true,
1387+
failure: PathFailure::OnPath { network_update: None },
13901388
path: path.clone(),
13911389
short_channel_id: None,
13921390
retry: None,

lightning/src/chain/channelmonitor.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ use crate::chain::onchaintx::OnchainTxHandler;
4949
use crate::chain::package::{CounterpartyOfferedHTLCOutput, CounterpartyReceivedHTLCOutput, HolderFundingOutput, HolderHTLCOutput, PackageSolvingData, PackageTemplate, RevokedOutput, RevokedHTLCOutput};
5050
use crate::chain::Filter;
5151
use crate::util::logger::Logger;
52-
use crate::util::ser::{Readable, ReadableArgs, MaybeReadable, Writer, Writeable, U48, OptionDeserWrapper};
52+
use crate::util::ser::{Readable, ReadableArgs, RequiredWrapper, MaybeReadable, UpgradableRequired, Writer, Writeable, U48};
5353
use crate::util::byte_utils;
5454
use crate::util::events::Event;
5555
#[cfg(anchors)]
@@ -314,8 +314,8 @@ impl Readable for CounterpartyCommitmentParameters {
314314
}
315315
}
316316

317-
let mut counterparty_delayed_payment_base_key = OptionDeserWrapper(None);
318-
let mut counterparty_htlc_base_key = OptionDeserWrapper(None);
317+
let mut counterparty_delayed_payment_base_key = RequiredWrapper(None);
318+
let mut counterparty_htlc_base_key = RequiredWrapper(None);
319319
let mut on_counterparty_tx_csv: u16 = 0;
320320
read_tlv_fields!(r, {
321321
(0, counterparty_delayed_payment_base_key, required),
@@ -454,19 +454,15 @@ impl MaybeReadable for OnchainEventEntry {
454454
let mut transaction = None;
455455
let mut block_hash = None;
456456
let mut height = 0;
457-
let mut event = None;
457+
let mut event = UpgradableRequired(None);
458458
read_tlv_fields!(reader, {
459459
(0, txid, required),
460460
(1, transaction, option),
461461
(2, height, required),
462462
(3, block_hash, option),
463-
(4, event, ignorable),
463+
(4, event, upgradable_required),
464464
});
465-
if let Some(ev) = event {
466-
Ok(Some(Self { txid, transaction, height, block_hash, event: ev }))
467-
} else {
468-
Ok(None)
469-
}
465+
Ok(Some(Self { txid, transaction, height, block_hash, event: _init_tlv_based_struct_field!(event, upgradable_required) }))
470466
}
471467
}
472468

lightning/src/chain/onchaintx.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use crate::chain::keysinterface::WriteableEcdsaChannelSigner;
3636
use crate::chain::package::PackageSolvingData;
3737
use crate::chain::package::PackageTemplate;
3838
use crate::util::logger::Logger;
39-
use crate::util::ser::{Readable, ReadableArgs, MaybeReadable, Writer, Writeable, VecWriter};
39+
use crate::util::ser::{Readable, ReadableArgs, MaybeReadable, UpgradableRequired, Writer, Writeable, VecWriter};
4040

4141
use crate::io;
4242
use crate::prelude::*;
@@ -106,18 +106,14 @@ impl MaybeReadable for OnchainEventEntry {
106106
let mut txid = Txid::all_zeros();
107107
let mut height = 0;
108108
let mut block_hash = None;
109-
let mut event = None;
109+
let mut event = UpgradableRequired(None);
110110
read_tlv_fields!(reader, {
111111
(0, txid, required),
112112
(1, block_hash, option),
113113
(2, height, required),
114-
(4, event, ignorable),
114+
(4, event, upgradable_required),
115115
});
116-
if let Some(ev) = event {
117-
Ok(Some(Self { txid, height, block_hash, event: ev }))
118-
} else {
119-
Ok(None)
120-
}
116+
Ok(Some(Self { txid, height, block_hash, event: _init_tlv_based_struct_field!(event, upgradable_required) }))
121117
}
122118
}
123119

lightning/src/ln/channelmanager.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ pub(crate) enum MonitorUpdateCompletionAction {
468468

469469
impl_writeable_tlv_based_enum_upgradable!(MonitorUpdateCompletionAction,
470470
(0, PaymentClaimed) => { (0, payment_hash, required) },
471-
(2, EmitEvent) => { (0, event, ignorable) },
471+
(2, EmitEvent) => { (0, event, upgradable_required) },
472472
);
473473

474474
/// State we hold per-peer.
@@ -2420,10 +2420,10 @@ where
24202420
let session_priv = SecretKey::from_slice(&session_priv_bytes[..]).expect("RNG is busted");
24212421

24222422
let onion_keys = onion_utils::construct_onion_keys(&self.secp_ctx, &path, &session_priv)
2423-
.map_err(|_| APIError::InvalidRoute{err: "Pubkey along hop was maliciously selected"})?;
2423+
.map_err(|_| APIError::InvalidRoute{err: "Pubkey along hop was maliciously selected".to_owned()})?;
24242424
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(path, total_value, payment_secret, cur_height, keysend_preimage)?;
24252425
if onion_utils::route_size_insane(&onion_payloads) {
2426-
return Err(APIError::InvalidRoute{err: "Route size too large considering onion data"});
2426+
return Err(APIError::InvalidRoute{err: "Route size too large considering onion data".to_owned()});
24272427
}
24282428
let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, prng_seed, payment_hash);
24292429

@@ -6693,7 +6693,7 @@ impl Writeable for ClaimableHTLC {
66936693

66946694
impl Readable for ClaimableHTLC {
66956695
fn read<R: Read>(reader: &mut R) -> Result<Self, DecodeError> {
6696-
let mut prev_hop = crate::util::ser::OptionDeserWrapper(None);
6696+
let mut prev_hop = crate::util::ser::RequiredWrapper(None);
66976697
let mut value = 0;
66986698
let mut payment_data: Option<msgs::FinalOnionHopData> = None;
66996699
let mut cltv_expiry = 0;
@@ -6743,7 +6743,7 @@ impl Readable for HTLCSource {
67436743
let id: u8 = Readable::read(reader)?;
67446744
match id {
67456745
0 => {
6746-
let mut session_priv: crate::util::ser::OptionDeserWrapper<SecretKey> = crate::util::ser::OptionDeserWrapper(None);
6746+
let mut session_priv: crate::util::ser::RequiredWrapper<SecretKey> = crate::util::ser::RequiredWrapper(None);
67476747
let mut first_hop_htlc_msat: u64 = 0;
67486748
let mut path = Some(Vec::new());
67496749
let mut payment_id = None;

lightning/src/ln/functional_test_utils.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use crate::util::enforcing_trait_impls::EnforcingSigner;
2424
use crate::util::scid_utils;
2525
use crate::util::test_utils;
2626
use crate::util::test_utils::{panicking, TestChainMonitor};
27-
use crate::util::events::{Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider, PaymentPurpose};
27+
use crate::util::events::{Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider, PathFailure, PaymentPurpose};
2828
use crate::util::errors::APIError;
2929
use crate::util::config::UserConfig;
3030
use crate::util::ser::{ReadableArgs, Writeable};
@@ -1818,7 +1818,7 @@ pub fn expect_payment_failed_conditions_event<'a, 'b, 'c, 'd, 'e>(
18181818
) {
18191819
if conditions.expected_mpp_parts_remain { assert_eq!(payment_failed_events.len(), 1); } else { assert_eq!(payment_failed_events.len(), 2); }
18201820
let expected_payment_id = match &payment_failed_events[0] {
1821-
Event::PaymentPathFailed { payment_hash, payment_failed_permanently, path, retry, payment_id, network_update, short_channel_id,
1821+
Event::PaymentPathFailed { payment_hash, payment_failed_permanently, path, retry, payment_id, failure, short_channel_id,
18221822
#[cfg(test)]
18231823
error_code,
18241824
#[cfg(test)]
@@ -1843,23 +1843,24 @@ pub fn expect_payment_failed_conditions_event<'a, 'b, 'c, 'd, 'e>(
18431843
}
18441844

18451845
if let Some(chan_closed) = conditions.expected_blamed_chan_closed {
1846-
match network_update {
1847-
Some(NetworkUpdate::ChannelUpdateMessage { ref msg }) if !chan_closed => {
1848-
if let Some(scid) = conditions.expected_blamed_scid {
1849-
assert_eq!(msg.contents.short_channel_id, scid);
1850-
}
1851-
const CHAN_DISABLED_FLAG: u8 = 2;
1852-
assert_eq!(msg.contents.flags & CHAN_DISABLED_FLAG, 0);
1853-
},
1854-
Some(NetworkUpdate::ChannelFailure { short_channel_id, is_permanent }) if chan_closed => {
1855-
if let Some(scid) = conditions.expected_blamed_scid {
1856-
assert_eq!(*short_channel_id, scid);
1857-
}
1858-
assert!(is_permanent);
1859-
},
1860-
Some(_) => panic!("Unexpected update type"),
1861-
None => panic!("Expected update"),
1862-
}
1846+
if let PathFailure::OnPath { network_update: Some(upd) } = failure {
1847+
match upd {
1848+
NetworkUpdate::ChannelUpdateMessage { ref msg } if !chan_closed => {
1849+
if let Some(scid) = conditions.expected_blamed_scid {
1850+
assert_eq!(msg.contents.short_channel_id, scid);
1851+
}
1852+
const CHAN_DISABLED_FLAG: u8 = 2;
1853+
assert_eq!(msg.contents.flags & CHAN_DISABLED_FLAG, 0);
1854+
},
1855+
NetworkUpdate::ChannelFailure { short_channel_id, is_permanent } if chan_closed => {
1856+
if let Some(scid) = conditions.expected_blamed_scid {
1857+
assert_eq!(*short_channel_id, scid);
1858+
}
1859+
assert!(is_permanent);
1860+
},
1861+
_ => panic!("Unexpected update type"),
1862+
}
1863+
} else { panic!("Expected network update"); }
18631864
}
18641865

18651866
payment_id.unwrap()
@@ -2240,10 +2241,9 @@ pub fn pass_failed_payment_back<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expe
22402241
if i == expected_paths.len() - 1 { assert_eq!(events.len(), 2); } else { assert_eq!(events.len(), 1); }
22412242

22422243
let expected_payment_id = match events[0] {
2243-
Event::PaymentPathFailed { payment_hash, payment_failed_permanently, all_paths_failed, ref path, ref payment_id, .. } => {
2244+
Event::PaymentPathFailed { payment_hash, payment_failed_permanently, ref path, ref payment_id, .. } => {
22442245
assert_eq!(payment_hash, our_payment_hash);
22452246
assert!(payment_failed_permanently);
2246-
assert_eq!(all_paths_failed, i == expected_paths.len() - 1);
22472247
for (idx, hop) in expected_route.iter().enumerate() {
22482248
assert_eq!(hop.node.get_our_node_id(), path[idx].pubkey);
22492249
}

lightning/src/ln/functional_tests.rs

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use crate::ln::msgs;
3131
use crate::ln::msgs::{ChannelMessageHandler, RoutingMessageHandler, ErrorAction};
3232
use crate::util::enforcing_trait_impls::EnforcingSigner;
3333
use crate::util::test_utils;
34-
use crate::util::events::{Event, MessageSendEvent, MessageSendEventsProvider, PaymentPurpose, ClosureReason, HTLCDestination};
34+
use crate::util::events::{Event, MessageSendEvent, MessageSendEventsProvider, PathFailure, PaymentPurpose, ClosureReason, HTLCDestination};
3535
use crate::util::errors::APIError;
3636
use crate::util::ser::{Writeable, ReadableArgs};
3737
use crate::util::config::UserConfig;
@@ -3235,12 +3235,12 @@ fn do_test_commitment_revoked_fail_backward_exhaustive(deliver_bs_raa: bool, use
32353235
let events = nodes[0].node.get_and_clear_pending_events();
32363236
assert_eq!(events.len(), 6);
32373237
match events[0] {
3238-
Event::PaymentPathFailed { ref payment_hash, ref network_update, .. } => {
3238+
Event::PaymentPathFailed { ref payment_hash, ref failure, .. } => {
32393239
assert!(failed_htlcs.insert(payment_hash.0));
32403240
// If we delivered B's RAA we got an unknown preimage error, not something
32413241
// that we should update our routing table for.
32423242
if !deliver_bs_raa {
3243-
assert!(network_update.is_some());
3243+
if let PathFailure::OnPath { network_update: Some(_) } = failure { } else { panic!("Unexpected path failure") }
32443244
}
32453245
},
32463246
_ => panic!("Unexpected event"),
@@ -3252,9 +3252,8 @@ fn do_test_commitment_revoked_fail_backward_exhaustive(deliver_bs_raa: bool, use
32523252
_ => panic!("Unexpected event"),
32533253
}
32543254
match events[2] {
3255-
Event::PaymentPathFailed { ref payment_hash, ref network_update, .. } => {
3255+
Event::PaymentPathFailed { ref payment_hash, failure: PathFailure::OnPath { network_update: Some(_) }, .. } => {
32563256
assert!(failed_htlcs.insert(payment_hash.0));
3257-
assert!(network_update.is_some());
32583257
},
32593258
_ => panic!("Unexpected event"),
32603259
}
@@ -3265,9 +3264,8 @@ fn do_test_commitment_revoked_fail_backward_exhaustive(deliver_bs_raa: bool, use
32653264
_ => panic!("Unexpected event"),
32663265
}
32673266
match events[4] {
3268-
Event::PaymentPathFailed { ref payment_hash, ref network_update, .. } => {
3267+
Event::PaymentPathFailed { ref payment_hash, failure: PathFailure::OnPath { network_update: Some(_) }, .. } => {
32693268
assert!(failed_htlcs.insert(payment_hash.0));
3270-
assert!(network_update.is_some());
32713269
},
32723270
_ => panic!("Unexpected event"),
32733271
}
@@ -5148,14 +5146,14 @@ fn do_test_fail_backwards_unrevoked_remote_announce(deliver_last_raa: bool, anno
51485146
let mut as_failds = HashSet::new();
51495147
let mut as_updates = 0;
51505148
for event in as_events.iter() {
5151-
if let &Event::PaymentPathFailed { ref payment_hash, ref payment_failed_permanently, ref network_update, .. } = event {
5149+
if let &Event::PaymentPathFailed { ref payment_hash, ref payment_failed_permanently, ref failure, .. } = event {
51525150
assert!(as_failds.insert(*payment_hash));
51535151
if *payment_hash != payment_hash_2 {
51545152
assert_eq!(*payment_failed_permanently, deliver_last_raa);
51555153
} else {
51565154
assert!(!payment_failed_permanently);
51575155
}
5158-
if network_update.is_some() {
5156+
if let PathFailure::OnPath { network_update: Some(_) } = failure {
51595157
as_updates += 1;
51605158
}
51615159
} else if let &Event::PaymentFailed { .. } = event {
@@ -5174,14 +5172,14 @@ fn do_test_fail_backwards_unrevoked_remote_announce(deliver_last_raa: bool, anno
51745172
let mut bs_failds = HashSet::new();
51755173
let mut bs_updates = 0;
51765174
for event in bs_events.iter() {
5177-
if let &Event::PaymentPathFailed { ref payment_hash, ref payment_failed_permanently, ref network_update, .. } = event {
5175+
if let &Event::PaymentPathFailed { ref payment_hash, ref payment_failed_permanently, ref failure, .. } = event {
51785176
assert!(bs_failds.insert(*payment_hash));
51795177
if *payment_hash != payment_hash_1 && *payment_hash != payment_hash_5 {
51805178
assert_eq!(*payment_failed_permanently, deliver_last_raa);
51815179
} else {
51825180
assert!(!payment_failed_permanently);
51835181
}
5184-
if network_update.is_some() {
5182+
if let PathFailure::OnPath { network_update: Some(_) } = failure {
51855183
bs_updates += 1;
51865184
}
51875185
} else if let &Event::PaymentFailed { .. } = event {
@@ -5695,12 +5693,10 @@ fn test_fail_holding_cell_htlc_upon_free() {
56955693
let events = nodes[0].node.get_and_clear_pending_events();
56965694
assert_eq!(events.len(), 2);
56975695
match &events[0] {
5698-
&Event::PaymentPathFailed { ref payment_id, ref payment_hash, ref payment_failed_permanently, ref network_update, ref all_paths_failed, ref short_channel_id, .. } => {
5696+
&Event::PaymentPathFailed { ref payment_id, ref payment_hash, ref payment_failed_permanently, failure: PathFailure::OnPath { network_update: None }, ref short_channel_id, .. } => {
56995697
assert_eq!(PaymentId(our_payment_hash.0), *payment_id.as_ref().unwrap());
57005698
assert_eq!(our_payment_hash.clone(), *payment_hash);
57015699
assert_eq!(*payment_failed_permanently, false);
5702-
assert_eq!(*all_paths_failed, true);
5703-
assert_eq!(*network_update, None);
57045700
assert_eq!(*short_channel_id, Some(route.paths[0][0].short_channel_id));
57055701
},
57065702
_ => panic!("Unexpected event"),
@@ -5786,12 +5782,10 @@ fn test_free_and_fail_holding_cell_htlcs() {
57865782
let events = nodes[0].node.get_and_clear_pending_events();
57875783
assert_eq!(events.len(), 2);
57885784
match &events[0] {
5789-
&Event::PaymentPathFailed { ref payment_id, ref payment_hash, ref payment_failed_permanently, ref network_update, ref all_paths_failed, ref short_channel_id, .. } => {
5785+
&Event::PaymentPathFailed { ref payment_id, ref payment_hash, ref payment_failed_permanently, failure: PathFailure::OnPath { network_update: None }, ref short_channel_id, .. } => {
57905786
assert_eq!(payment_id_2, *payment_id.as_ref().unwrap());
57915787
assert_eq!(payment_hash_2.clone(), *payment_hash);
57925788
assert_eq!(*payment_failed_permanently, false);
5793-
assert_eq!(*all_paths_failed, true);
5794-
assert_eq!(*network_update, None);
57955789
assert_eq!(*short_channel_id, Some(route_2.paths[0][0].short_channel_id));
57965790
},
57975791
_ => panic!("Unexpected event"),
@@ -6689,8 +6683,7 @@ fn test_channel_failed_after_message_with_badonion_node_perm_bits_set() {
66896683
// Expect a PaymentPathFailed event with a ChannelFailure network update for the channel between
66906684
// the node originating the error to its next hop.
66916685
match events_5[0] {
6692-
Event::PaymentPathFailed { network_update:
6693-
Some(NetworkUpdate::ChannelFailure { short_channel_id, is_permanent }), error_code, ..
6686+
Event::PaymentPathFailed { error_code, failure: PathFailure::OnPath { network_update: Some(NetworkUpdate::ChannelFailure { short_channel_id, is_permanent }) }, ..
66946687
} => {
66956688
assert_eq!(short_channel_id, chan_2.0.contents.short_channel_id);
66966689
assert!(is_permanent);

lightning/src/ln/onion_route_tests.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::ln::features::{InitFeatures, InvoiceFeatures};
2323
use crate::ln::msgs;
2424
use crate::ln::msgs::{ChannelMessageHandler, ChannelUpdate};
2525
use crate::ln::wire::Encode;
26-
use crate::util::events::{Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider};
26+
use crate::util::events::{Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider, PathFailure};
2727
use crate::util::ser::{Writeable, Writer};
2828
use crate::util::test_utils;
2929
use crate::util::config::{UserConfig, ChannelConfig};
@@ -167,9 +167,8 @@ fn run_onion_failure_test_with_fail_intercept<F1,F2,F3>(_name: &str, test_case:
167167

168168
let events = nodes[0].node.get_and_clear_pending_events();
169169
assert_eq!(events.len(), 2);
170-
if let &Event::PaymentPathFailed { ref payment_failed_permanently, ref network_update, ref all_paths_failed, ref short_channel_id, ref error_code, .. } = &events[0] {
170+
if let &Event::PaymentPathFailed { ref payment_failed_permanently, ref short_channel_id, ref error_code, failure: PathFailure::OnPath { ref network_update }, .. } = &events[0] {
171171
assert_eq!(*payment_failed_permanently, !expected_retryable);
172-
assert_eq!(*all_paths_failed, true);
173172
assert_eq!(*error_code, expected_error_code);
174173
if expected_channel_update.is_some() {
175174
match network_update {

lightning/src/ln/onion_utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,11 @@ pub(super) fn build_onion_payloads(path: &Vec<RouteHop>, total_msat: u64, paymen
182182
});
183183
cur_value_msat += hop.fee_msat;
184184
if cur_value_msat >= 21000000 * 100000000 * 1000 {
185-
return Err(APIError::InvalidRoute{err: "Channel fees overflowed?"});
185+
return Err(APIError::InvalidRoute{err: "Channel fees overflowed?".to_owned()});
186186
}
187187
cur_cltv += hop.cltv_expiry_delta as u32;
188188
if cur_cltv >= 500000000 {
189-
return Err(APIError::InvalidRoute{err: "Channel CLTV overflowed?"});
189+
return Err(APIError::InvalidRoute{err: "Channel CLTV overflowed?".to_owned()});
190190
}
191191
last_short_channel_id = hop.short_channel_id;
192192
}

0 commit comments

Comments
 (0)