Skip to content

Commit e46d085

Browse files
committed
List usable channels
1 parent 78941a7 commit e46d085

File tree

5 files changed

+79
-21
lines changed

5 files changed

+79
-21
lines changed

example/App.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,32 @@ const App = () => {
125125
}}
126126
/>
127127

128+
<Button
129+
title={'List usable channels'}
130+
onPress={async () => {
131+
try {
132+
const res = await ldk.listUsableChannels();
133+
134+
if (res.isErr()) {
135+
setMessage(res.error.message);
136+
return;
137+
}
138+
139+
let msg = '';
140+
res.value.forEach((channel) => {
141+
Object.keys(channel).forEach((key) => {
142+
// @ts-ignore
143+
msg += `${key}: ${channel[key]}\n`;
144+
});
145+
});
146+
147+
setMessage(msg);
148+
} catch (e) {
149+
setMessage(e.toString());
150+
}
151+
}}
152+
/>
153+
128154
<Button
129155
title={'Pay invoice'}
130156
onPress={async () => {

ios/Helpers.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,32 @@ extension Invoice {
4545
}
4646
}
4747

48+
extension ChannelDetails {
49+
var asJson: Any {
50+
return [
51+
"channel_id": Data(self.get_channel_id()).hexEncodedString(),
52+
"is_public": self.get_is_public(),
53+
"is_usable": self.get_is_usable(),
54+
"is_outbound": self.get_is_outbound(),
55+
"balance_msat": self.get_balance_msat(),
56+
"counterparty": Data(self.get_counterparty().write()).hexEncodedString(),
57+
"funding_txo": Data(self.get_funding_txo()?.write() ?? []).hexEncodedString(),
58+
"channel_type": Data(self.get_channel_type().write()).hexEncodedString(),
59+
"user_channel_id": self.get_user_channel_id(), //Number
60+
"confirmations_required": self.get_confirmations_required().getValue() as Any, // Optional number
61+
"short_channel_id": self.get_short_channel_id().getValue() as Any, //Optional number
62+
"is_funding_locked": self.get_is_funding_locked(), //Bool
63+
"inbound_scid_alias": self.get_inbound_scid_alias().getValue() as Any, //Optional number
64+
"get_inbound_payment_scid": self.get_inbound_payment_scid().getValue() as Any, //Optional number,
65+
"inbound_capacity_msat": self.get_inbound_capacity_msat(),
66+
"channel_value_satoshis": self.get_channel_value_satoshis(),
67+
"outbound_capacity_msat": self.get_outbound_capacity_msat(),
68+
"force_close_spend_delay": self.get_force_close_spend_delay().getValue() as Any, //Optional number
69+
"unspendable_punishment_reserve": self.get_unspendable_punishment_reserve().getValue() as Any //Optional number
70+
]
71+
}
72+
}
73+
4874
extension Data {
4975
struct HexEncodingOptions: OptionSet {
5076
let rawValue: Int

ios/Ldk.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ @interface RCT_EXTERN_MODULE(Ldk, NSObject)
5656
reject:(RCTPromiseRejectBlock)reject)
5757
RCT_EXTERN_METHOD(listChannels:(RCTPromiseResolveBlock)resolve
5858
reject:(RCTPromiseRejectBlock)reject)
59+
RCT_EXTERN_METHOD(listUsableChannels:(RCTPromiseResolveBlock)resolve
60+
reject:(RCTPromiseRejectBlock)reject)
5961

6062
//MARK: Payments
6163
RCT_EXTERN_METHOD(decode:(NSString *)paymentRequest

ios/Ldk.swift

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -460,27 +460,17 @@ class Ldk: NSObject {
460460
return handleReject(reject, .init_channel_manager)
461461
}
462462

463-
resolve(channelManager.list_channels().map { [
464-
"channel_id": Data($0.get_channel_id()).hexEncodedString(),
465-
"is_public": $0.get_is_public(),
466-
"is_usable": $0.get_is_usable(),
467-
"is_outbound": $0.get_is_outbound(),
468-
"balance_msat": $0.get_balance_msat(),
469-
"counterparty": Data($0.get_counterparty().write()).hexEncodedString(),
470-
"funding_txo": Data($0.get_funding_txo()?.write() ?? []).hexEncodedString(),
471-
"channel_type": Data($0.get_channel_type().write()).hexEncodedString(),
472-
"user_channel_id": $0.get_user_channel_id(), //Number
473-
"confirmations_required": $0.get_confirmations_required().getValue() as Any, // Optional number
474-
"short_channel_id": $0.get_short_channel_id().getValue() as Any, //Optional number
475-
"is_funding_locked": $0.get_is_funding_locked(), //Bool
476-
"inbound_scid_alias": $0.get_inbound_scid_alias().getValue() as Any, //Optional number
477-
"get_inbound_payment_scid": $0.get_inbound_payment_scid().getValue() as Any, //Optional number,
478-
"inbound_capacity_msat": $0.get_inbound_capacity_msat(),
479-
"channel_value_satoshis": $0.get_channel_value_satoshis(),
480-
"outbound_capacity_msat": $0.get_outbound_capacity_msat(),
481-
"force_close_spend_delay": $0.get_force_close_spend_delay().getValue() as Any, //Optional number
482-
"unspendable_punishment_reserve": $0.get_unspendable_punishment_reserve().getValue() as Any //Optional number
483-
] })
463+
resolve(channelManager.list_channels().map { $0.asJson })
464+
}
465+
466+
@objc
467+
func listUsableChannels(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
468+
//Sync ChannelMonitors and ChannelManager to chain tip
469+
guard let channelManager = channelManager else {
470+
return handleReject(reject, .init_channel_manager)
471+
}
472+
473+
resolve(channelManager.list_usable_channels().map { $0.asJson })
484474
}
485475
}
486476

src/ldk.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,20 @@ class LDK {
324324
}
325325
}
326326

327+
/**
328+
* Returns array of usable channels
329+
* https://docs.rs/lightning/latest/lightning/ln/channelmanager/struct.ChannelDetails.html
330+
* @returns {Promise<Ok<Ok<TChannel[]> | Err<TChannel[]>> | Err<unknown>>}
331+
*/
332+
async listUsableChannels(): Promise<Result<TChannel[]>> {
333+
try {
334+
const res = await NativeLDK.listUsableChannels();
335+
return ok(res);
336+
} catch (e) {
337+
return err(e);
338+
}
339+
}
340+
327341
/**
328342
* Callback passed though will get triggered for each LND log item
329343
* @param callback

0 commit comments

Comments
 (0)