Skip to content

Commit 0be98f5

Browse files
authored
Merge branch 'lightningdevkit:main' into main
2 parents 78dbb77 + 22d1bab commit 0be98f5

28 files changed

+1690
-1211
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ fn check_api_err(api_err: APIError) {
295295
// all others. If you hit this panic, the list of acceptable errors
296296
// is probably just stale and you should add new messages here.
297297
match err.as_str() {
298-
"Peer for first hop currently disconnected/pending monitor update!" => {},
298+
"Peer for first hop currently disconnected" => {},
299299
_ if err.starts_with("Cannot push more than their max accepted HTLCs ") => {},
300300
_ if err.starts_with("Cannot send value that would put us over the max HTLC value in flight our peer will accept ") => {},
301301
_ if err.starts_with("Cannot send value that would put our balance under counterparty-announced channel reserve value") => {},
@@ -474,8 +474,8 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
474474
let mut channel_txn = Vec::new();
475475
macro_rules! make_channel {
476476
($source: expr, $dest: expr, $chan_id: expr) => { {
477-
$source.peer_connected(&$dest.get_our_node_id(), &Init { features: $dest.init_features(), remote_network_address: None }).unwrap();
478-
$dest.peer_connected(&$source.get_our_node_id(), &Init { features: $source.init_features(), remote_network_address: None }).unwrap();
477+
$source.peer_connected(&$dest.get_our_node_id(), &Init { features: $dest.init_features(), remote_network_address: None }, true).unwrap();
478+
$dest.peer_connected(&$source.get_our_node_id(), &Init { features: $source.init_features(), remote_network_address: None }, false).unwrap();
479479

480480
$source.create_channel($dest.get_our_node_id(), 100_000, 42, 0, None).unwrap();
481481
let open_channel = {
@@ -979,31 +979,31 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
979979

980980
0x0c => {
981981
if !chan_a_disconnected {
982-
nodes[0].peer_disconnected(&nodes[1].get_our_node_id(), false);
983-
nodes[1].peer_disconnected(&nodes[0].get_our_node_id(), false);
982+
nodes[0].peer_disconnected(&nodes[1].get_our_node_id());
983+
nodes[1].peer_disconnected(&nodes[0].get_our_node_id());
984984
chan_a_disconnected = true;
985985
drain_msg_events_on_disconnect!(0);
986986
}
987987
},
988988
0x0d => {
989989
if !chan_b_disconnected {
990-
nodes[1].peer_disconnected(&nodes[2].get_our_node_id(), false);
991-
nodes[2].peer_disconnected(&nodes[1].get_our_node_id(), false);
990+
nodes[1].peer_disconnected(&nodes[2].get_our_node_id());
991+
nodes[2].peer_disconnected(&nodes[1].get_our_node_id());
992992
chan_b_disconnected = true;
993993
drain_msg_events_on_disconnect!(2);
994994
}
995995
},
996996
0x0e => {
997997
if chan_a_disconnected {
998-
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: nodes[1].init_features(), remote_network_address: None }).unwrap();
999-
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: nodes[0].init_features(), remote_network_address: None }).unwrap();
998+
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: nodes[1].init_features(), remote_network_address: None }, true).unwrap();
999+
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: nodes[0].init_features(), remote_network_address: None }, false).unwrap();
10001000
chan_a_disconnected = false;
10011001
}
10021002
},
10031003
0x0f => {
10041004
if chan_b_disconnected {
1005-
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: nodes[2].init_features(), remote_network_address: None }).unwrap();
1006-
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: nodes[1].init_features(), remote_network_address: None }).unwrap();
1005+
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: nodes[2].init_features(), remote_network_address: None }, true).unwrap();
1006+
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: nodes[1].init_features(), remote_network_address: None }, false).unwrap();
10071007
chan_b_disconnected = false;
10081008
}
10091009
},
@@ -1040,7 +1040,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
10401040

10411041
0x2c => {
10421042
if !chan_a_disconnected {
1043-
nodes[1].peer_disconnected(&nodes[0].get_our_node_id(), false);
1043+
nodes[1].peer_disconnected(&nodes[0].get_our_node_id());
10441044
chan_a_disconnected = true;
10451045
drain_msg_events_on_disconnect!(0);
10461046
}
@@ -1054,14 +1054,14 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
10541054
},
10551055
0x2d => {
10561056
if !chan_a_disconnected {
1057-
nodes[0].peer_disconnected(&nodes[1].get_our_node_id(), false);
1057+
nodes[0].peer_disconnected(&nodes[1].get_our_node_id());
10581058
chan_a_disconnected = true;
10591059
nodes[0].get_and_clear_pending_msg_events();
10601060
ab_events.clear();
10611061
ba_events.clear();
10621062
}
10631063
if !chan_b_disconnected {
1064-
nodes[2].peer_disconnected(&nodes[1].get_our_node_id(), false);
1064+
nodes[2].peer_disconnected(&nodes[1].get_our_node_id());
10651065
chan_b_disconnected = true;
10661066
nodes[2].get_and_clear_pending_msg_events();
10671067
bc_events.clear();
@@ -1073,7 +1073,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
10731073
},
10741074
0x2e => {
10751075
if !chan_b_disconnected {
1076-
nodes[1].peer_disconnected(&nodes[2].get_our_node_id(), false);
1076+
nodes[1].peer_disconnected(&nodes[2].get_our_node_id());
10771077
chan_b_disconnected = true;
10781078
drain_msg_events_on_disconnect!(2);
10791079
}
@@ -1198,13 +1198,13 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
11981198

11991199
// Next, make sure peers are all connected to each other
12001200
if chan_a_disconnected {
1201-
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: nodes[1].init_features(), remote_network_address: None }).unwrap();
1202-
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: nodes[0].init_features(), remote_network_address: None }).unwrap();
1201+
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: nodes[1].init_features(), remote_network_address: None }, true).unwrap();
1202+
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: nodes[0].init_features(), remote_network_address: None }, false).unwrap();
12031203
chan_a_disconnected = false;
12041204
}
12051205
if chan_b_disconnected {
1206-
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: nodes[2].init_features(), remote_network_address: None }).unwrap();
1207-
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: nodes[1].init_features(), remote_network_address: None }).unwrap();
1206+
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: nodes[2].init_features(), remote_network_address: None }, true).unwrap();
1207+
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: nodes[1].init_features(), remote_network_address: None }, false).unwrap();
12081208
chan_b_disconnected = false;
12091209
}
12101210

fuzz/src/full_stack.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -634,11 +634,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
634634
if let Err(e) = channelmanager.funding_transaction_generated(&funding_generation.0, &funding_generation.1, tx.clone()) {
635635
// It's possible the channel has been closed in the mean time, but any other
636636
// failure may be a bug.
637-
if let APIError::ChannelUnavailable { err } = e {
638-
if !err.starts_with("Can't find a peer matching the passed counterparty node_id ") {
639-
assert_eq!(err, "No such channel");
640-
}
641-
} else { panic!(); }
637+
if let APIError::ChannelUnavailable { .. } = e { } else { panic!(); }
642638
}
643639
pending_funding_signatures.insert(funding_output, tx);
644640
}

fuzz/src/indexedmap.rs

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,27 @@ use hashbrown::HashSet;
1313

1414
use crate::utils::test_logger;
1515

16-
fn check_eq(btree: &BTreeMap<u8, u8>, indexed: &IndexedMap<u8, u8>) {
16+
use std::ops::{RangeBounds, Bound};
17+
18+
struct ExclLowerInclUpper(u8, u8);
19+
impl RangeBounds<u8> for ExclLowerInclUpper {
20+
fn start_bound(&self) -> Bound<&u8> { Bound::Excluded(&self.0) }
21+
fn end_bound(&self) -> Bound<&u8> { Bound::Included(&self.1) }
22+
}
23+
struct ExclLowerExclUpper(u8, u8);
24+
impl RangeBounds<u8> for ExclLowerExclUpper {
25+
fn start_bound(&self) -> Bound<&u8> { Bound::Excluded(&self.0) }
26+
fn end_bound(&self) -> Bound<&u8> { Bound::Excluded(&self.1) }
27+
}
28+
29+
fn check_eq(btree: &BTreeMap<u8, u8>, mut indexed: IndexedMap<u8, u8>) {
1730
assert_eq!(btree.len(), indexed.len());
1831
assert_eq!(btree.is_empty(), indexed.is_empty());
1932

2033
let mut btree_clone = btree.clone();
2134
assert!(btree_clone == *btree);
2235
let mut indexed_clone = indexed.clone();
23-
assert!(indexed_clone == *indexed);
36+
assert!(indexed_clone == indexed);
2437

2538
for k in 0..=255 {
2639
assert_eq!(btree.contains_key(&k), indexed.contains_key(&k));
@@ -43,16 +56,27 @@ fn check_eq(btree: &BTreeMap<u8, u8>, indexed: &IndexedMap<u8, u8>) {
4356
}
4457

4558
const STRIDE: u8 = 16;
46-
for k in 0..=255/STRIDE {
47-
let lower_bound = k * STRIDE;
48-
let upper_bound = lower_bound + (STRIDE - 1);
49-
let mut btree_iter = btree.range(lower_bound..=upper_bound);
50-
let mut indexed_iter = indexed.range(lower_bound..=upper_bound);
51-
loop {
52-
let b_v = btree_iter.next();
53-
let i_v = indexed_iter.next();
54-
assert_eq!(b_v, i_v);
55-
if b_v.is_none() { break; }
59+
for range_type in 0..4 {
60+
for k in 0..=255/STRIDE {
61+
let lower_bound = k * STRIDE;
62+
let upper_bound = lower_bound + (STRIDE - 1);
63+
macro_rules! range { ($map: expr) => {
64+
match range_type {
65+
0 => $map.range(lower_bound..upper_bound),
66+
1 => $map.range(lower_bound..=upper_bound),
67+
2 => $map.range(ExclLowerInclUpper(lower_bound, upper_bound)),
68+
3 => $map.range(ExclLowerExclUpper(lower_bound, upper_bound)),
69+
_ => unreachable!(),
70+
}
71+
} }
72+
let mut btree_iter = range!(btree);
73+
let mut indexed_iter = range!(indexed);
74+
loop {
75+
let b_v = btree_iter.next();
76+
let i_v = indexed_iter.next();
77+
assert_eq!(b_v, i_v);
78+
if b_v.is_none() { break; }
79+
}
5680
}
5781
}
5882

@@ -91,15 +115,15 @@ pub fn do_test(data: &[u8]) {
91115
let prev_value_i = indexed.insert(tuple[0], tuple[1]);
92116
assert_eq!(prev_value_b, prev_value_i);
93117
}
94-
check_eq(&btree, &indexed);
118+
check_eq(&btree, indexed.clone());
95119

96120
// Now, modify the maps in all the ways we have to do so, checking that the maps remain
97121
// equivalent as we go.
98122
for (k, v) in indexed.unordered_iter_mut() {
99123
*v = *k;
100124
*btree.get_mut(k).unwrap() = *k;
101125
}
102-
check_eq(&btree, &indexed);
126+
check_eq(&btree, indexed.clone());
103127

104128
for k in 0..=255 {
105129
match btree.entry(k) {
@@ -124,7 +148,7 @@ pub fn do_test(data: &[u8]) {
124148
},
125149
}
126150
}
127-
check_eq(&btree, &indexed);
151+
check_eq(&btree, indexed);
128152
}
129153

130154
pub fn indexedmap_test<Out: test_logger::Output>(data: &[u8], _out: Out) {

lightning-background-processor/src/lib.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ use lightning::util::events::{Event, EventHandler, EventsProvider};
3737
use lightning::util::logger::Logger;
3838
use lightning::util::persist::Persister;
3939
use lightning_rapid_gossip_sync::RapidGossipSync;
40-
use lightning::io;
4140

4241
use core::ops::Deref;
4342
use core::time::Duration;
@@ -431,7 +430,7 @@ pub async fn process_events_async<
431430
persister: PS, event_handler: EventHandler, chain_monitor: M, channel_manager: CM,
432431
gossip_sync: GossipSync<PGS, RGS, G, UL, L>, peer_manager: PM, logger: L, scorer: Option<S>,
433432
sleeper: Sleeper,
434-
) -> Result<(), io::Error>
433+
) -> Result<(), lightning::io::Error>
435434
where
436435
UL::Target: 'static + UtxoLookup,
437436
CF::Target: 'static + chain::Filter,
@@ -963,8 +962,8 @@ mod tests {
963962

964963
for i in 0..num_nodes {
965964
for j in (i+1)..num_nodes {
966-
nodes[i].node.peer_connected(&nodes[j].node.get_our_node_id(), &Init { features: nodes[j].node.init_features(), remote_network_address: None }).unwrap();
967-
nodes[j].node.peer_connected(&nodes[i].node.get_our_node_id(), &Init { features: nodes[i].node.init_features(), remote_network_address: None }).unwrap();
965+
nodes[i].node.peer_connected(&nodes[j].node.get_our_node_id(), &Init { features: nodes[j].node.init_features(), remote_network_address: None }, true).unwrap();
966+
nodes[j].node.peer_connected(&nodes[i].node.get_our_node_id(), &Init { features: nodes[i].node.init_features(), remote_network_address: None }, false).unwrap();
968967
}
969968
}
970969

lightning-invoice/src/payment.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use lightning::chain;
1717
use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
1818
use lightning::chain::keysinterface::{NodeSigner, SignerProvider, EntropySource};
1919
use lightning::ln::{PaymentHash, PaymentSecret};
20-
use lightning::ln::channelmanager::{ChannelManager, PaymentId, PaymentSendFailure, Retry};
20+
use lightning::ln::channelmanager::{ChannelManager, PaymentId, Retry, RetryableSendFailure};
2121
use lightning::routing::router::{PaymentParameters, RouteParameters, Router};
2222
use lightning::util::logger::Logger;
2323

@@ -172,7 +172,7 @@ pub enum PaymentError {
172172
/// An error resulting from the provided [`Invoice`] or payment hash.
173173
Invoice(&'static str),
174174
/// An error occurring when sending a payment.
175-
Sending(PaymentSendFailure),
175+
Sending(RetryableSendFailure),
176176
}
177177

178178
/// A trait defining behavior of an [`Invoice`] payer.

lightning-invoice/src/utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -842,13 +842,13 @@ mod test {
842842

843843
// With only one sufficient-value peer connected we should only get its hint
844844
scid_aliases.remove(&chan_b.0.short_channel_id_alias.unwrap());
845-
nodes[0].node.peer_disconnected(&nodes[2].node.get_our_node_id(), false);
845+
nodes[0].node.peer_disconnected(&nodes[2].node.get_our_node_id());
846846
match_invoice_routes(Some(1_000_000_000), &nodes[0], scid_aliases.clone());
847847

848848
// If we don't have any sufficient-value peers connected we should get all hints with
849849
// sufficient value, even though there is a connected insufficient-value peer.
850850
scid_aliases.insert(chan_b.0.short_channel_id_alias.unwrap());
851-
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
851+
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id());
852852
match_invoice_routes(Some(1_000_000_000), &nodes[0], scid_aliases);
853853
}
854854

lightning-net-tokio/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ mod tests {
617617
fn handle_channel_update(&self, _msg: &ChannelUpdate) -> Result<bool, LightningError> { Ok(false) }
618618
fn get_next_channel_announcement(&self, _starting_point: u64) -> Option<(ChannelAnnouncement, Option<ChannelUpdate>, Option<ChannelUpdate>)> { None }
619619
fn get_next_node_announcement(&self, _starting_point: Option<&NodeId>) -> Option<NodeAnnouncement> { None }
620-
fn peer_connected(&self, _their_node_id: &PublicKey, _init_msg: &Init) -> Result<(), ()> { Ok(()) }
620+
fn peer_connected(&self, _their_node_id: &PublicKey, _init_msg: &Init, _inbound: bool) -> Result<(), ()> { Ok(()) }
621621
fn handle_reply_channel_range(&self, _their_node_id: &PublicKey, _msg: ReplyChannelRange) -> Result<(), LightningError> { Ok(()) }
622622
fn handle_reply_short_channel_ids_end(&self, _their_node_id: &PublicKey, _msg: ReplyShortChannelIdsEnd) -> Result<(), LightningError> { Ok(()) }
623623
fn handle_query_channel_range(&self, _their_node_id: &PublicKey, _msg: QueryChannelRange) -> Result<(), LightningError> { Ok(()) }
@@ -643,13 +643,13 @@ mod tests {
643643
fn handle_update_fee(&self, _their_node_id: &PublicKey, _msg: &UpdateFee) {}
644644
fn handle_announcement_signatures(&self, _their_node_id: &PublicKey, _msg: &AnnouncementSignatures) {}
645645
fn handle_channel_update(&self, _their_node_id: &PublicKey, _msg: &ChannelUpdate) {}
646-
fn peer_disconnected(&self, their_node_id: &PublicKey, _no_connection_possible: bool) {
646+
fn peer_disconnected(&self, their_node_id: &PublicKey) {
647647
if *their_node_id == self.expected_pubkey {
648648
self.disconnected_flag.store(true, Ordering::SeqCst);
649649
self.pubkey_disconnected.clone().try_send(()).unwrap();
650650
}
651651
}
652-
fn peer_connected(&self, their_node_id: &PublicKey, _init_msg: &Init) -> Result<(), ()> {
652+
fn peer_connected(&self, their_node_id: &PublicKey, _init_msg: &Init, _inbound: bool) -> Result<(), ()> {
653653
if *their_node_id == self.expected_pubkey {
654654
self.pubkey_connected.clone().try_send(()).unwrap();
655655
}

lightning/src/chain/chainmonitor.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,7 @@ mod tests {
796796
use crate::ln::functional_test_utils::*;
797797
use crate::ln::msgs::ChannelMessageHandler;
798798
use crate::util::errors::APIError;
799-
use crate::util::events::{ClosureReason, MessageSendEvent, MessageSendEventsProvider};
799+
use crate::util::events::{Event, ClosureReason, MessageSendEvent, MessageSendEventsProvider};
800800

801801
#[test]
802802
fn test_async_ooo_offchain_updates() {
@@ -819,10 +819,8 @@ mod tests {
819819

820820
nodes[1].node.claim_funds(payment_preimage_1);
821821
check_added_monitors!(nodes[1], 1);
822-
expect_payment_claimed!(nodes[1], payment_hash_1, 1_000_000);
823822
nodes[1].node.claim_funds(payment_preimage_2);
824823
check_added_monitors!(nodes[1], 1);
825-
expect_payment_claimed!(nodes[1], payment_hash_2, 1_000_000);
826824

827825
let persistences = chanmon_cfgs[1].persister.offchain_monitor_updates.lock().unwrap().clone();
828826
assert_eq!(persistences.len(), 1);
@@ -850,8 +848,24 @@ mod tests {
850848
.find(|(txo, _)| txo == funding_txo).unwrap().1.contains(&next_update));
851849
assert!(nodes[1].chain_monitor.release_pending_monitor_events().is_empty());
852850
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
851+
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
853852
nodes[1].chain_monitor.chain_monitor.channel_monitor_updated(*funding_txo, update_iter.next().unwrap().clone()).unwrap();
854853

854+
let claim_events = nodes[1].node.get_and_clear_pending_events();
855+
assert_eq!(claim_events.len(), 2);
856+
match claim_events[0] {
857+
Event::PaymentClaimed { ref payment_hash, amount_msat: 1_000_000, .. } => {
858+
assert_eq!(payment_hash_1, *payment_hash);
859+
},
860+
_ => panic!("Unexpected event"),
861+
}
862+
match claim_events[1] {
863+
Event::PaymentClaimed { ref payment_hash, amount_msat: 1_000_000, .. } => {
864+
assert_eq!(payment_hash_2, *payment_hash);
865+
},
866+
_ => panic!("Unexpected event"),
867+
}
868+
855869
// Now manually walk the commitment signed dance - because we claimed two payments
856870
// back-to-back it doesn't fit into the neat walk commitment_signed_dance does.
857871

0 commit comments

Comments
 (0)