Skip to content

Commit 04f8622

Browse files
Merge pull request #4 from synonymdev/pending-htlcs-forwardable
Swift pending HTLCs forwardable
2 parents 0bc1c34 + 1c5451f commit 04f8622

File tree

7 files changed

+96
-10
lines changed

7 files changed

+96
-10
lines changed

ios/Classes/LdkChannelManagerPersister.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,16 @@ class LdkChannelManagerPersister: Persister, ExtendedChannelManagerPersister {
139139
//Unused on mobile
140140
return
141141
case .PendingHTLCsForwardable:
142-
//TODO not sure if required.
142+
guard let pendingHTLCsForwardable = event.getValueAsPendingHTLCsForwardable() else {
143+
return handleEventError(event)
144+
}
145+
146+
LdkEventEmitter.shared.send(
147+
withEvent: .channel_manager_pending_htlcs_forwardable,
148+
body: [
149+
"time_forwardable": pendingHTLCsForwardable.getTime_forwardable(),
150+
]
151+
)
143152
return
144153
case .SpendableOutputs:
145154
guard let spendableOutputs = event.getValueAsSpendableOutputs() else {

ios/Classes/LdkFilter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class LdkFilter: Filter {
1717
LdkEventEmitter.shared.send(
1818
withEvent: .register_tx,
1919
body: [
20-
"txid": Data(txid ?? []).hexEncodedString(),
20+
"txid": Data(Data(txid ?? []).reversed()).hexEncodedString(),
2121
"script_pubkey": Data(script_pubkey).hexEncodedString()
2222
]
2323
)

ios/Ldk.m

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ @interface RCT_EXTERN_MODULE(Ldk, NSObject)
8080
description:(NSString *)description
8181
resolve:(RCTPromiseResolveBlock)resolve
8282
reject:(RCTPromiseRejectBlock)reject)
83+
RCT_EXTERN_METHOD(processPendingHtlcForwards:(RCTPromiseResolveBlock)resolve
84+
reject:(RCTPromiseRejectBlock)reject)
85+
RCT_EXTERN_METHOD(claimFunds:(NSString *)paymentPreimage
86+
resolve:(RCTPromiseResolveBlock)resolve
87+
reject:(RCTPromiseRejectBlock)reject)
8388
@end
8489

8590
//MARK: Events

ios/Ldk.swift

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ enum EventTypes: String, CaseIterable {
2121
case channel_manager_payment_path_successful = "channel_manager_payment_path_successful"
2222
case channel_manager_payment_path_failed = "channel_manager_payment_path_failed"
2323
case channel_manager_payment_failed = "channel_manager_payment_failed"
24+
case channel_manager_pending_htlcs_forwardable = "channel_manager_pending_htlcs_forwardable"
2425
case channel_manager_spendable_outputs = "channel_manager_spendable_outputs"
2526
case channel_manager_channel_closed = "channel_manager_channel_closed"
2627
case channel_manager_discard_funding = "channel_manager_discard_funding"
@@ -48,6 +49,7 @@ enum LdkErrors: String {
4849
case invoice_payment_fail = "invoice_payment_fail"
4950
case init_ldk_currency = "init_ldk_currency"
5051
case invoice_create_failed = "invoice_create_failed"
52+
case claim_funds_failed = "claim_funds_failed"
5153
}
5254

5355
enum LdkCallbackResponses: String {
@@ -66,6 +68,8 @@ enum LdkCallbackResponses: String {
6668
case invoice_payment_success = "invoice_payment_success"
6769
case tx_set_confirmed = "tx_set_confirmed"
6870
case tx_set_unconfirmed = "tx_set_unconfirmed"
71+
case process_pending_htlc_forwards_success = "process_pending_htlc_forwards_success"
72+
case claim_funds_success = "claim_funds_success"
6973
}
7074

7175
@objc(Ldk)
@@ -179,9 +183,8 @@ class Ldk: NSObject {
179183

180184
@objc
181185
func initNetworkGraph(_ genesisHash: NSString, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
182-
networkGraph = NetworkGraph(genesis_hash: String(genesisHash).hexaBytes.reversed())
186+
networkGraph = NetworkGraph(genesis_hash: String(genesisHash).hexaBytes)
183187
//TODO load cached version if exists instead. NetworkGraph.read(ser: serialized_backup)
184-
185188
handleResolve(resolve, .network_graph_init_success)
186189
}
187190

@@ -251,7 +254,7 @@ class Ldk: NSObject {
251254
fee_estimator: feeEstimator,
252255
chain_monitor: chainMonitor,
253256
filter: filter,
254-
net_graph_serialized: nil, //TODO
257+
net_graph_serialized: networkGraph.write(),
255258
tx_broadcaster: broadcaster,
256259
logger: logger
257260
)
@@ -397,7 +400,7 @@ class Ldk: NSObject {
397400

398401
let res = invoicePayer.pay_invoice(invoice: invoice)
399402
if res.isOk() {
400-
handleResolve(resolve, .invoice_payment_success)
403+
return handleResolve(resolve, .invoice_payment_success)
401404
}
402405

403406
guard let error = res.getError() else {
@@ -467,6 +470,31 @@ class Ldk: NSObject {
467470
return handleReject(reject, .invoice_create_failed, nil, "Invoice creation error: \(creationError.rawValue)")
468471
}
469472

473+
@objc
474+
func processPendingHtlcForwards(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
475+
guard let channelManager = channelManager else {
476+
return handleReject(reject, .init_channel_manager)
477+
}
478+
479+
channelManager.process_pending_htlc_forwards()
480+
481+
handleResolve(resolve, .process_pending_htlc_forwards_success)
482+
}
483+
484+
@objc
485+
func claimFunds(_ paymentPreimage: NSString, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
486+
guard let channelManager = channelManager else {
487+
return handleReject(reject, .init_channel_manager)
488+
}
489+
490+
let res = channelManager.claim_funds(payment_preimage: String(paymentPreimage).hexaBytes)
491+
if res == false {
492+
handleReject(reject, .claim_funds_failed)
493+
}
494+
495+
handleResolve(resolve, .claim_funds_success)
496+
}
497+
470498
//MARK: Fetch methods
471499
@objc
472500
func version(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {

src/ldk.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,33 @@ class LDK {
310310
}
311311
}
312312

313+
/**
314+
* https://docs.rs/lightning/latest/lightning/ln/channelmanager/struct.ChannelManager.html#method.process_pending_htlc_forwards
315+
* @returns {Promise<Err<unknown> | Ok<Ok<string> | Err<string>>>}
316+
*/
317+
async processPendingHtlcForwards(): Promise<Result<string>> {
318+
try {
319+
const res = await NativeLDK.processPendingHtlcForwards();
320+
return ok(res);
321+
} catch (e) {
322+
return err(e);
323+
}
324+
}
325+
326+
/**
327+
* https://docs.rs/lightning/latest/lightning/ln/channelmanager/struct.ChannelManager.html#method.claim_funds
328+
* @returns {Promise<Err<unknown> | Ok<Ok<string> | Err<string>>>}
329+
* @param paymentPreimage
330+
*/
331+
async claimFunds(paymentPreimage: string): Promise<Result<string>> {
332+
try {
333+
const res = await NativeLDK.claimFunds(paymentPreimage);
334+
return ok(res);
335+
} catch (e) {
336+
return err(e);
337+
}
338+
}
339+
313340
/**
314341
* Pays a bolt11 payment request
315342
* @param paymentRequest

src/lightning-manager.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
TPersistManagerEvent,
2121
TRegisterOutputEvent,
2222
TRegisterTxEvent,
23+
TChannelManagerPendingHtlcsForwardable,
2324
} from './utils/types';
2425
import {
2526
dummyRandomSeed,
@@ -105,6 +106,10 @@ class LightningManager {
105106
EEventTypes.channel_manager_payment_failed,
106107
this.onChannelManagerPaymentFailed.bind(this),
107108
);
109+
ldk.onEvent(
110+
EEventTypes.channel_manager_pending_htlcs_forwardable,
111+
this.onChannelManagerPendingHtlcsForwardable.bind(this),
112+
);
108113
ldk.onEvent(
109114
EEventTypes.channel_manager_spendable_outputs,
110115
this.onChannelManagerSpendableOutputs.bind(this),
@@ -330,10 +335,12 @@ class LightningManager {
330335
private onChannelManagerPaymentReceived(
331336
res: TChannelManagerPaymentReceived,
332337
): void {
333-
//TODO call channelManager.claim_funds(payment_preimage: paymentPreimage) if spontaneous_payment_preimage is not a blank string as
334-
//https://docs.rs/lightning/latest/lightning/util/events/enum.PaymentPurpose.html#variant.SpontaneousPayment
335-
//If not a spontaneous payment then nothing to do but notify user invoice was paid
336-
console.log(`onChannelManagerPaymentReceived: ${JSON.stringify(res)}`); //TODO
338+
if (res.spontaneous_payment_preimage) {
339+
//https://docs.rs/lightning/latest/lightning/util/events/enum.PaymentPurpose.html#variant.SpontaneousPayment
340+
ldk.claimFunds(res.spontaneous_payment_preimage).catch(console.error);
341+
} else {
342+
ldk.claimFunds(res.payment_preimage).catch(console.error);
343+
}
337344
}
338345

339346
private onChannelManagerPaymentSent(res: TChannelManagerPaymentSent): void {
@@ -369,6 +376,12 @@ class LightningManager {
369376
console.log(`onChannelManagerPaymentFailed: ${JSON.stringify(res)}`); //TODO
370377
}
371378

379+
private onChannelManagerPendingHtlcsForwardable(
380+
res: TChannelManagerPendingHtlcsForwardable,
381+
): void {
382+
ldk.processPendingHtlcForwards().catch(console.error);
383+
}
384+
372385
private onChannelManagerSpendableOutputs(
373386
res: TChannelManagerSpendableOutputs,
374387
): void {

src/utils/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export enum EEventTypes {
2222
channel_manager_payment_path_successful = 'channel_manager_payment_path_successful',
2323
channel_manager_payment_path_failed = 'channel_manager_payment_path_failed',
2424
channel_manager_payment_failed = 'channel_manager_payment_failed',
25+
channel_manager_pending_htlcs_forwardable = 'channel_manager_pending_htlcs_forwardable',
2526
channel_manager_spendable_outputs = 'channel_manager_spendable_outputs',
2627
channel_manager_channel_closed = 'channel_manager_channel_closed',
2728
channel_manager_discard_funding = 'channel_manager_discard_funding',
@@ -89,6 +90,9 @@ export type TChannelManagerPaymentFailed = {
8990
payment_id: string;
9091
payment_hash: string;
9192
};
93+
export type TChannelManagerPendingHtlcsForwardable = {
94+
time_forwardable: number;
95+
};
9296
export type TChannelManagerSpendableOutputs = {
9397
outputs: string[];
9498
};

0 commit comments

Comments
 (0)