Skip to content

Commit 4d3b600

Browse files
committed
Have close_channel take a UserChannelId
... which is nice for consistency reasons. We also fix a minor bug that would have lead us to forget a peer whenever we'd close a channel, even if it wasn't the last one.
1 parent dabbb4d commit 4d3b600

File tree

6 files changed

+32
-16
lines changed

6 files changed

+32
-16
lines changed

bindings/kotlin/ldk-node-jvm/lib/src/test/kotlin/org/lightningdevkit/ldknode/LibraryTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,8 @@ class LibraryTest {
217217
assert(channelReadyEvent2 is Event.ChannelReady)
218218
node2.eventHandled()
219219

220-
val channelId = when (channelReadyEvent2) {
221-
is Event.ChannelReady -> channelReadyEvent2.channelId
220+
val userChannelId = when (channelReadyEvent2) {
221+
is Event.ChannelReady -> channelReadyEvent2.userChannelId
222222
else -> return
223223
}
224224

@@ -239,7 +239,7 @@ class LibraryTest {
239239
assert(node1.listPayments().size == 1)
240240
assert(node2.listPayments().size == 1)
241241

242-
node2.closeChannel(channelId, nodeId1)
242+
node2.closeChannel(userChannelId, nodeId1)
243243

244244
val channelClosedEvent1 = node1.waitNextEvent()
245245
println("Got event: $channelClosedEvent1")

bindings/ldk_node.udl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ interface LDKNode {
6565
[Throws=NodeError]
6666
UserChannelId connect_open_channel(PublicKey node_id, SocketAddress address, u64 channel_amount_sats, u64? push_to_counterparty_msat, ChannelConfig? channel_config, boolean announce_channel);
6767
[Throws=NodeError]
68-
void close_channel([ByRef]ChannelId channel_id, PublicKey counterparty_node_id);
68+
void close_channel([ByRef]UserChannelId user_channel_id, PublicKey counterparty_node_id);
6969
[Throws=NodeError]
7070
void update_channel_config([ByRef]ChannelId channel_id, PublicKey counterparty_node_id, ChannelConfig channel_config);
7171
[Throws=NodeError]

bindings/python/src/ldk_node/test_ldk_node.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ def test_channel_full_cycle(self):
198198
print("EVENT:", payment_received_event_2)
199199
node_2.event_handled()
200200

201-
node_2.close_channel(channel_ready_event_2.channel_id, node_id_1)
201+
node_2.close_channel(channel_ready_event_2.user_channel_id, node_id_1)
202202

203203
channel_closed_event_1 = node_1.wait_next_event()
204204
assert isinstance(channel_closed_event_1, Event.CHANNEL_CLOSED)

src/lib.rs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,12 +1104,28 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
11041104

11051105
/// Close a previously opened channel.
11061106
pub fn close_channel(
1107-
&self, channel_id: &ChannelId, counterparty_node_id: PublicKey,
1107+
&self, user_channel_id: &UserChannelId, counterparty_node_id: PublicKey,
11081108
) -> Result<(), Error> {
1109-
self.peer_store.remove_peer(&counterparty_node_id)?;
1110-
match self.channel_manager.close_channel(&channel_id, &counterparty_node_id) {
1111-
Ok(_) => Ok(()),
1112-
Err(_) => Err(Error::ChannelClosingFailed),
1109+
let open_channels =
1110+
self.channel_manager.list_channels_with_counterparty(&counterparty_node_id);
1111+
if let Some(channel_details) =
1112+
open_channels.iter().find(|c| c.user_channel_id == user_channel_id.0)
1113+
{
1114+
match self
1115+
.channel_manager
1116+
.close_channel(&channel_details.channel_id, &counterparty_node_id)
1117+
{
1118+
Ok(_) => {
1119+
// Check if this was the last open channel, if so, forget the peer.
1120+
if open_channels.len() == 1 {
1121+
self.peer_store.remove_peer(&counterparty_node_id)?;
1122+
}
1123+
Ok(())
1124+
}
1125+
Err(_) => Err(Error::ChannelClosingFailed),
1126+
}
1127+
} else {
1128+
Ok(())
11131129
}
11141130
}
11151131

tests/common.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,11 @@ pub(crate) use expect_channel_pending_event;
6565
macro_rules! expect_channel_ready_event {
6666
($node: expr, $counterparty_node_id: expr) => {{
6767
match $node.wait_next_event() {
68-
ref e @ Event::ChannelReady { channel_id, counterparty_node_id, .. } => {
68+
ref e @ Event::ChannelReady { user_channel_id, counterparty_node_id, .. } => {
6969
println!("{} got event {:?}", $node.node_id(), e);
7070
assert_eq!(counterparty_node_id, Some($counterparty_node_id));
7171
$node.event_handled();
72-
channel_id
72+
user_channel_id
7373
}
7474
ref e => {
7575
panic!("{} got unexpected event!: {:?}", std::stringify!($node), e);
@@ -377,7 +377,7 @@ pub(crate) fn do_channel_full_cycle<K: KVStore + Sync + Send, E: ElectrumApi>(
377377

378378
expect_channel_ready_event!(node_a, node_b.node_id());
379379

380-
let channel_id = expect_channel_ready_event!(node_b, node_a.node_id());
380+
let user_channel_id = expect_channel_ready_event!(node_b, node_a.node_id());
381381

382382
println!("\nB receive_payment");
383383
let invoice_amount_1_msat = 2500_000;
@@ -520,7 +520,7 @@ pub(crate) fn do_channel_full_cycle<K: KVStore + Sync + Send, E: ElectrumApi>(
520520
);
521521

522522
println!("\nB close_channel");
523-
node_b.close_channel(&channel_id, node_a.node_id()).unwrap();
523+
node_b.close_channel(&user_channel_id, node_a.node_id()).unwrap();
524524
expect_event!(node_a, ChannelClosed);
525525
expect_event!(node_b, ChannelClosed);
526526

tests/integration_tests_cln.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ fn test_cln() {
8888
let funding_txo = common::expect_channel_pending_event!(node, cln_node_id);
8989
common::wait_for_tx(&electrs_client, funding_txo.txid);
9090
common::generate_blocks_and_wait(&bitcoind_client, &electrs_client, 6);
91-
let channel_id = common::expect_channel_ready_event!(node, cln_node_id);
91+
let user_channel_id = common::expect_channel_ready_event!(node, cln_node_id);
9292

9393
// Send a payment to CLN
9494
let mut rng = thread_rng();
@@ -110,7 +110,7 @@ fn test_cln() {
110110
cln_client.pay(&ldk_invoice.to_string(), Default::default()).unwrap();
111111
common::expect_event!(node, PaymentReceived);
112112

113-
node.close_channel(&channel_id, cln_node_id).unwrap();
113+
node.close_channel(&user_channel_id, cln_node_id).unwrap();
114114
common::expect_event!(node, ChannelClosed);
115115
node.stop().unwrap();
116116
}

0 commit comments

Comments
 (0)