Skip to content

Commit d1ee703

Browse files
committed
feat: ios fund created channel
1 parent 2212575 commit d1ee703

File tree

5 files changed

+67
-0
lines changed

5 files changed

+67
-0
lines changed

example/utils/helpers.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,3 +240,18 @@ export const ldkNetwork = (network: TAvailableNetworks): ENetworks => {
240240
return ENetworks.signet;
241241
}
242242
};
243+
244+
245+
export const scriptToAddress = (outputScript: string): string => {
246+
if (!outputScript.startsWith('0020')) {
247+
throw new Error('Invalid output script, currently example app only supports P2WSH');
248+
}
249+
250+
outputScript = outputScript.slice(4);
251+
252+
const scriptPubKey = Buffer.from(outputScript, 'hex');
253+
const network = getNetwork(selectedNetwork);
254+
const address = bitcoin.payments.p2wsh({ hash: scriptPubKey, network }).address;
255+
256+
return address ?? "";
257+
}

lib/ios/Ldk.m

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ @interface RCT_EXTERN_MODULE(Ldk, NSObject)
9191
pushSats:(NSInteger *)pushSats
9292
resolve:(RCTPromiseResolveBlock)resolve
9393
reject:(RCTPromiseRejectBlock)reject)
94+
RCT_EXTERN_METHOD(fundChannel:(NSString *)temporaryChannelId
95+
counterpartyNodeId:(NSString *)counterpartyNodeId
96+
fundingTransaction:(NSString *)fundingTransaction
97+
resolve:(RCTPromiseResolveBlock)resolve
98+
reject:(RCTPromiseRejectBlock)reject)
9499
RCT_EXTERN_METHOD(forceCloseAllChannels:(BOOL *)broadcastLatestTx
95100
resolve:(RCTPromiseResolveBlock)resolve
96101
reject:(RCTPromiseRejectBlock)reject)

lib/ios/Ldk.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ enum LdkErrors: String {
5959
case channel_close_fail
6060
case channel_accept_fail
6161
case start_create_channel_fail
62+
case fund_channel_fail
6263
case spend_outputs_fail
6364
case failed_signing_request
6465
case write_fail
@@ -104,6 +105,7 @@ enum LdkCallbackResponses: String {
104105
case accept_channel_success
105106
case close_channel_success
106107
case start_create_channel_success
108+
case fund_channel_success
107109
case file_write_success
108110
case abandon_payment_success
109111
case backup_client_setup_success
@@ -935,6 +937,25 @@ class Ldk: NSObject {
935937
handleReject(reject, .start_create_channel_fail)
936938
}
937939

940+
@objc
941+
func fundChannel(_ temporaryChannelId: NSString, counterpartyNodeId: NSString, fundingTransaction: NSString, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
942+
guard let channelManager = channelManager else {
943+
return handleReject(reject, .init_channel_manager)
944+
}
945+
946+
let res = channelManager.fundingTransactionGenerated(
947+
temporaryChannelId: .initWith(aArg: String(temporaryChannelId).hexaBytes),
948+
counterpartyNodeId: String(counterpartyNodeId).hexaBytes,
949+
fundingTransaction: String(fundingTransaction).hexaBytes
950+
)
951+
952+
if res.isOk() {
953+
return handleResolve(resolve, .fund_channel_success)
954+
}
955+
956+
handleReject(reject, .fund_channel_fail)
957+
}
958+
938959
@objc
939960
func forceCloseAllChannels(_ broadcastLatestTx: Bool, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
940961
guard let channelManager = channelManager else {

lib/src/ldk.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import {
4040
TSpendRecoveredForceCloseOutputsReq,
4141
TChannelMonitor,
4242
TCreateChannelReq,
43+
TFundChannelReq,
4344
} from './utils/types';
4445
import { extractPaymentRequest } from './utils/helpers';
4546

@@ -500,6 +501,25 @@ class LDK {
500501
}
501502
}
502503

504+
/**
505+
* Funds an already created channel with a signed transaction.
506+
* https://docs.rs/lightning/latest/lightning/ln/channelmanager/struct.ChannelManager.html#method.funding_transaction_generated
507+
* @param temporaryChannelId
508+
* @param counterPartyNodeId
509+
* @param fundingTransaction
510+
* @returns {Promise<Err<unknown> | Ok<Ok<string> | Err<string>>>}
511+
*/
512+
async fundChannel({temporaryChannelId, counterPartyNodeId, fundingTransaction}: TFundChannelReq): Promise<Result<string>> {
513+
try {
514+
const res = await NativeLDK.fundChannel(temporaryChannelId, counterPartyNodeId, fundingTransaction);
515+
this.writeDebugToLog('fundChannel');
516+
return ok(res);
517+
} catch (e) {
518+
this.writeErrorToLog('fundChannel', e);
519+
return err(e);
520+
}
521+
}
522+
503523
/**
504524
* Force close all channels
505525
* @param broadcastLatestTx

lib/src/utils/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,12 @@ export type TCreateChannelReq = {
287287
pushSats: number;
288288
};
289289

290+
export type TFundChannelReq = {
291+
temporaryChannelId: string;
292+
counterPartyNodeId: string;
293+
fundingTransaction: string;
294+
};
295+
290296
export type TAcceptChannelReq = {
291297
temporaryChannelId: string;
292298
counterPartyNodeId: string;

0 commit comments

Comments
 (0)