Skip to content

Commit 6684702

Browse files
committed
Function for setting tx as confirmed or unconfirmed (in event of re-org)
1 parent e46d085 commit 6684702

File tree

5 files changed

+138
-19
lines changed

5 files changed

+138
-19
lines changed

ios/Ldk.m

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ @interface RCT_EXTERN_MODULE(Ldk, NSObject)
4747
pubKey:(NSString *)pubKey
4848
resolve:(RCTPromiseResolveBlock)resolve
4949
reject:(RCTPromiseRejectBlock)reject)
50+
RCT_EXTERN_METHOD(setTxConfirmed:(NSString *)header
51+
transaction:(NSString *)transaction
52+
pos:(NSInteger *)pos
53+
height:(NSInteger *)height
54+
resolve:(RCTPromiseResolveBlock)resolve
55+
reject:(RCTPromiseRejectBlock)reject)
56+
RCT_EXTERN_METHOD(setTxUnconfirmed:(NSString *)txId
57+
resolve:(RCTPromiseResolveBlock)resolve
58+
reject:(RCTPromiseRejectBlock)reject)
59+
5060
//MARK: Fetch methods
5161
RCT_EXTERN_METHOD(version:(RCTPromiseResolveBlock)resolve
5262
reject:(RCTPromiseRejectBlock)reject)

ios/Ldk.swift

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ enum LdkCallbackResponses: String {
6464
case add_peer_success = "add_peer_success"
6565
case chain_sync_success = "chain_sync_success"
6666
case invoice_payment_success = "invoice_payment_success"
67+
case tx_set_confirmed = "tx_set_confirmed"
68+
case tx_set_unconfirmed = "tx_set_unconfirmed"
6769
}
6870

6971
@objc(Ldk)
@@ -329,6 +331,48 @@ class Ldk: NSObject {
329331
handleResolve(resolve, .add_peer_success)
330332
}
331333

334+
@objc
335+
func setTxConfirmed(_ header: NSString, transaction: NSString, pos: NSInteger, height: NSInteger, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
336+
guard let channelManager = channelManager else {
337+
return handleReject(reject, .init_channel_manager)
338+
}
339+
340+
guard let chainMonitor = chainMonitor else {
341+
return handleReject(reject, .init_chain_monitor)
342+
}
343+
344+
let txData = [C2Tuple_usizeTransactionZ.new(a: UInt(pos), b: String(transaction).hexaBytes)]
345+
346+
channelManager.as_Confirm().transactions_confirmed(
347+
header: String(header).hexaBytes,
348+
txdata: txData,
349+
height: UInt32(height)
350+
)
351+
chainMonitor.as_Confirm().transactions_confirmed(
352+
header: String(header).hexaBytes,
353+
txdata: txData,
354+
height: UInt32(height)
355+
)
356+
357+
handleResolve(resolve, .tx_set_confirmed)
358+
}
359+
360+
@objc
361+
func setTxUnconfirmed(_ txId: NSString, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
362+
guard let channelManager = channelManager else {
363+
return handleReject(reject, .init_channel_manager)
364+
}
365+
366+
guard let chainMonitor = chainMonitor else {
367+
return handleReject(reject, .init_chain_monitor)
368+
}
369+
370+
channelManager.as_Confirm().transaction_unconfirmed(txid: String(txId).hexaBytes)
371+
chainMonitor.as_Confirm().transaction_unconfirmed(txid: String(txId).hexaBytes)
372+
373+
handleResolve(resolve, .tx_set_unconfirmed)
374+
}
375+
332376
//MARK: Payments
333377
@objc
334378
func decode(_ paymentRequest: NSString, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {

src/ldk.ts

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import {
1212
TLogListener,
1313
TPaymentReq,
1414
TSyncTipReq,
15-
TCreatePaymentReq
15+
TCreatePaymentReq,
16+
TSetTxConfirmedReq,
17+
TSetTxUnconfirmedReq
1618
} from './utils/types';
1719

1820
const LINKING_ERROR =
@@ -204,6 +206,13 @@ class LDK {
204206
}
205207
}
206208

209+
/**
210+
* Connect to remote peer
211+
* @param pubKey
212+
* @param address
213+
* @param port
214+
* @returns {Promise<Err<unknown> | Ok<Ok<string> | Err<string>>>}
215+
*/
207216
async addPeer({ pubKey, address, port }: TAddPeerReq): Promise<Result<string>> {
208217
try {
209218
const res = await NativeLDK.addPeer(address, port, pubKey);
@@ -213,6 +222,42 @@ class LDK {
213222
}
214223
}
215224

225+
/**
226+
* Updates a watched transaction as confirmed
227+
* @param txId
228+
* @param transaction
229+
* @param height
230+
* @param pos
231+
* @returns {Promise<Err<unknown> | Ok<Ok<string> | Err<string>>>}
232+
*/
233+
async setTxConfirmed({
234+
header,
235+
transaction,
236+
height,
237+
pos
238+
}: TSetTxConfirmedReq): Promise<Result<string>> {
239+
try {
240+
const res = await NativeLDK.setTxConfirmed(header, transaction, pos, height);
241+
return ok(res);
242+
} catch (e) {
243+
return err(e);
244+
}
245+
}
246+
247+
/**
248+
* Updates a watched transaction as unconfirmed in the event of a reorg
249+
* @param txId
250+
* @returns {Promise<Err<unknown> | Ok<Ok<string> | Err<string>>>}
251+
*/
252+
async setTxUnconfirmed({ txId }: TSetTxUnconfirmedReq): Promise<Result<string>> {
253+
try {
254+
const res = await NativeLDK.setTxUnconfirmed(txId);
255+
return ok(res);
256+
} catch (e) {
257+
return err(e);
258+
}
259+
}
260+
216261
/**
217262
* Decodes a bolt11 payment request
218263
* @param paymentRequest
@@ -244,7 +289,6 @@ class LDK {
244289
return err(e);
245290
}
246291
}
247-
//createPaymentRequest
248292

249293
/**
250294
* Pays a bolt11 payment request
@@ -262,6 +306,9 @@ class LDK {
262306
}
263307
}
264308

309+
//TODO pay_zero_value_invoice
310+
//TODO pay_pubkey
311+
265312
/**
266313
* Listen on LDK events
267314
* @param event
@@ -389,6 +436,7 @@ class LDK {
389436
* @returns {Promise<Err<unknown> | Ok<string[]>>}
390437
*/
391438
async getLogFileContent(limit: number = 100): Promise<Result<string[]>> {
439+
//TODO
392440
// try {
393441
// const content: string[] = await this.ldk.logFileContent(network, limit);
394442
// return ok(content);

src/lightning-manager.ts

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ import {
4545
// Step 13: Initialize networking ✅
4646
// Step 14: Connect and Disconnect Blocks ✅
4747
// Step 15: Handle LDK Events [WIP]
48-
// Step 16: Initialize routing ProbabilisticScorer
48+
// Step 16: Initialize routing ProbabilisticScorer [Not sure if required]
4949
// Step 17: Create InvoicePayer ✅
5050
// Step 18: Persist ChannelManager and NetworkGraph
5151
// Step 19: Background Processing
@@ -231,29 +231,35 @@ class LightningManager {
231231
}
232232

233233
/**
234-
* Fetches current best block and sends to LDK.
235-
* Updates both channelManager and chainMonitor.
234+
* Fetches current best block and sends to LDK to update both channelManager and chainMonitor.
235+
* Also watches transactions and outputs for confirmed and unconfirmed transactions and updated LDK.
236236
* @returns {Promise<Err<string> | Ok<string>>}
237237
*/
238238
async syncLdk() {
239239
const { bestblockhash, blocks } = await regtestBestBlock();
240240

241-
if (this.currentBlockHash === bestblockhash) {
242-
return; //No need to update
243-
}
241+
//Don't update unnecessarily
242+
if (this.currentBlockHash !== bestblockhash) {
243+
const header = await regtestBlockHeaderHex(bestblockhash);
244+
const syncToTip = await ldk.syncToTip({
245+
header,
246+
height: blocks
247+
});
248+
if (syncToTip.isErr()) {
249+
return syncToTip;
250+
}
244251

245-
const header = await regtestBlockHeaderHex(bestblockhash);
246-
const syncToTip = await ldk.syncToTip({
247-
header,
248-
height: blocks
249-
});
250-
if (syncToTip.isErr()) {
251-
return syncToTip;
252+
this.currentBlockHash = bestblockhash;
252253
}
253254

254-
this.currentBlockHash = bestblockhash;
255-
256-
//TODO fetch latest data for watchTxs and watchOutputs. Feed to transactions_confirmed() and transactions_confirmed()
255+
//TODO fetch latest data for watchTxs and watchOutputs. Feed any updates to LDK.
256+
// const setRes = await ldk.setTxConfirmed({
257+
// header: 'hex_encoded_header',
258+
// height: 1,
259+
// transaction: 'hex_encoded_tx',
260+
// pos: 1
261+
// });
262+
// const unsetRes = await ldk.setTxUnconfirmed({ txId: 'set_me' });
257263

258264
return ok(`Synced to block ${blocks}`);
259265
}
@@ -314,7 +320,7 @@ class LightningManager {
314320
}
315321

316322
private onChannelManagerPaymentPathSuccessful(res: TChannelManagerPaymentPathSuccessful) {
317-
//Nothing to here. Optionally notify user?
323+
//Nothing to do here. Optionally notify user?
318324
console.log(`onChannelManagerPaymentPathSuccessful: ${JSON.stringify(res)}`); //TODO
319325
}
320326

src/utils/types.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,17 @@ export type TAddPeerReq = {
160160
pubKey: string;
161161
};
162162

163+
export type TSetTxConfirmedReq = {
164+
header: string;
165+
transaction: string;
166+
pos: number;
167+
height: number;
168+
};
169+
170+
export type TSetTxUnconfirmedReq = {
171+
txId: string;
172+
};
173+
163174
export type TPaymentReq = {
164175
paymentRequest: string;
165176
};

0 commit comments

Comments
 (0)