Skip to content

Commit 4c8a95f

Browse files
committed
Fee estimator init and updates
1 parent b3bbc6a commit 4c8a95f

File tree

8 files changed

+138
-14
lines changed

8 files changed

+138
-14
lines changed

example/App.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,34 @@ const App = () => {
6262
}
6363
}}
6464
/>
65+
66+
<Button
67+
title={'initFeeEstimator'}
68+
onPress={async () => {
69+
const res = await ldk.initFeeEstimator({
70+
high: 1000,
71+
normal: 500,
72+
low: 100,
73+
});
74+
if (res.isOk()) {
75+
alert(res.value);
76+
}
77+
}}
78+
/>
79+
80+
<Button
81+
title={'updateFees'}
82+
onPress={async () => {
83+
const res = await ldk.updateFees({
84+
high: 1000,
85+
normal: 500,
86+
low: 100,
87+
});
88+
if (res.isOk()) {
89+
alert(res.value);
90+
}
91+
}}
92+
/>
6593
</ScrollView>
6694
</SafeAreaView>
6795
</>

ios/Classes/LdkFeeEstimator.swift

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,14 @@ import Foundation
99
import LDKFramework
1010

1111
class LdkFeeEstimator: FeeEstimator {
12-
var high: UInt32 = 0
13-
var normal: UInt32 = 0
14-
var low: UInt32 = 0
15-
16-
init(high: UInt32, normal: UInt32, low: UInt32) {
12+
private var high: UInt32 = 0
13+
private var normal: UInt32 = 0
14+
private var low: UInt32 = 0
15+
16+
func update(high: UInt32, normal: UInt32, low: UInt32) {
1717
self.high = high
1818
self.normal = normal
1919
self.low = low
20-
super.init()
2120
}
2221

2322
override func get_est_sat_per_1000_weight(confirmation_target: LDKConfirmationTarget) -> UInt32 {
@@ -35,6 +34,6 @@ class LdkFeeEstimator: FeeEstimator {
3534
return low
3635
}
3736

38-
return UInt32(1)
37+
return normal
3938
}
4039
}

ios/Helpers.swift

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import Foundation
99

10-
//TODO replicate in typescript
10+
//TODO replicate in typescript and kotlin
1111
enum LdkEventNames: String {
1212
case register_tx = "register_tx"
1313
case register_output = "register_output"
@@ -18,6 +18,38 @@ enum LdkEventNames: String {
1818
case update_persisted_channel = "update_persisted_channel"
1919
}
2020

21+
enum LdkError: Error {
22+
case unknown_error
23+
case init_fee_estimator
24+
}
25+
26+
extension LdkError: LocalizedError {
27+
public var errorDescription: String? {
28+
switch self {
29+
case .unknown_error:
30+
return "unknown_error"
31+
case .init_fee_estimator:
32+
return "init_fee_estimator"
33+
}
34+
}
35+
}
36+
37+
enum LdkCallbackResponses: String {
38+
case fee_estimator_initialised = "fee_estimator_initialised"
39+
case fees_updated = "fees_updated"
40+
}
41+
42+
func handleResolve(_ resolve: RCTPromiseResolveBlock, _ res: LdkCallbackResponses) {
43+
//TODO log
44+
resolve(res.rawValue)
45+
}
46+
47+
func handleReject(_ reject: RCTPromiseRejectBlock, _ error: LdkError) {
48+
//TODO log
49+
reject(error.errorDescription, error.localizedDescription, error)
50+
}
51+
52+
2153
func sendEvent(eventName: LdkEventNames, eventBody: [String: String]) {
2254
// ReactEventEmitter.sharedInstance()?.sendEvent(withName: eventName, body: eventBody)
2355
print("\(eventName)")
@@ -35,3 +67,11 @@ extension Data {
3567
return self.map { String(format: format, $0) }.joined()
3668
}
3769
}
70+
71+
72+
extension Ldk {
73+
@objc
74+
static func requiresMainQueueSetup() -> Bool {
75+
return true
76+
}
77+
}

ios/Ldk.m

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,14 @@ @interface RCT_EXTERN_MODULE(Ldk, NSObject)
66

77
RCT_EXTERN_METHOD(startChainMonitor:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
88

9+
//Startup methods
10+
RCT_EXTERN_METHOD(initFeeEstimator:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
11+
12+
//Update state methods
13+
RCT_EXTERN_METHOD(updateFees:(NSInteger *)high
14+
normal:(NSInteger *)normal
15+
low:(NSInteger *)low
16+
resolve:(RCTPromiseResolveBlock)resolve
17+
reject:(RCTPromiseRejectBlock)reject)
18+
919
@end

ios/Ldk.swift

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import LDKFramework
33

44
@objc(Ldk)
55
class Ldk: NSObject {
6-
var networkGraphPath = ""
6+
var feeEstimator: LdkFeeEstimator?
77

88
lazy var ldkStorage: URL = {
99
let docsurl = try! FileManager.default.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
@@ -26,14 +26,33 @@ class Ldk: NSObject {
2626
resolve(String(data: try! JSONEncoder().encode(res), encoding: .utf8)!)
2727
}
2828

29+
@objc
30+
func initFeeEstimator(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
31+
feeEstimator = LdkFeeEstimator()
32+
handleResolve(resolve, .fee_estimator_initialised)
33+
}
34+
35+
@objc
36+
func updateFees(_ high: NSInteger, normal: NSInteger, low: NSInteger, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
37+
guard let feeEstimator = feeEstimator else {
38+
return handleReject(reject, .init_fee_estimator)
39+
}
40+
41+
feeEstimator.update(high: UInt32(high), normal: UInt32(normal), low: UInt32(low))
42+
handleResolve(resolve, .fees_updated)
43+
}
2944

3045
@objc
3146
func startChainMonitor(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
47+
guard let feeEstimator = feeEstimator else {
48+
return handleReject(reject, .init_fee_estimator)
49+
}
50+
3251
let filter = LdkFilter()
3352
let broadcaster = LdkBroadcaster()
3453
let logger = LdkLogger()
3554
//TODO set these fees from the JS code. They should be able to be updated live.
36-
let feeEstimator = LdkFeeEstimator(high: 1000, normal: 500, low: 100)
55+
3756
let persister = LdkPersister()
3857

3958
let chainMonitor = ChainMonitor(
@@ -44,14 +63,25 @@ class Ldk: NSObject {
4463
persister: persister
4564
)
4665

66+
67+
68+
let seed: [UInt8] = [0] //TODO
69+
70+
let seconds = UInt64(NSDate().timeIntervalSince1970)
71+
let nanoSeconds = UInt32.init(truncating: NSNumber(value: seconds * 1000 * 1000))
72+
73+
let keysManager = KeysManager(seed: seed, starting_time_secs: seconds, starting_time_nanos: nanoSeconds)
74+
75+
let network = LDKNetwork_Bitcoin
76+
4777
let _ = ChannelManager(
4878
fee_est: feeEstimator,
4979
chain_monitor: Watch(),
5080
tx_broadcaster: broadcaster,
5181
logger: logger,
52-
keys_manager: KeysInterface(),
82+
keys_manager: keysManager.as_KeysInterface(),
5383
config: UserConfig(),
54-
params: ChainParameters(network_arg: LDKNetwork_Bitcoin, best_block_arg: BestBlock(block_hash: [], height: 0))
84+
params: ChainParameters(network_arg: network, best_block_arg: BestBlock(block_hash: [], height: 0))
5585
)
5686

5787
resolve("Chain monitor started")
Binary file not shown.

src/ldk.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { NativeModules, Platform } from 'react-native';
22
import { err, ok, Result } from './utils/result';
3-
import { TLogListener } from './utils/types';
3+
import { TFeeUpdateReq, TLogListener } from './utils/types';
44

55
const LINKING_ERROR =
66
`The package 'react-native-ldk' doesn't seem to be linked. Make sure: \n\n` +
@@ -33,7 +33,7 @@ class LDK {
3333
}
3434

3535
//TODO
36-
// Step 1: Initialize the FeeEstimator
36+
// Step 1: Initialize the FeeEstimator
3737
// Step 2: Initialize the Logger
3838
// Step 3: Initialize the BroadcasterInterface
3939
// Step 4: Initialize Persist
@@ -53,6 +53,17 @@ class LDK {
5353
// Step 18: Persist ChannelManager and NetworkGraph
5454
// Step 19: Background Processing
5555

56+
async initFeeEstimator(fees: TFeeUpdateReq): Promise<Result<string>> {
57+
const res = await NativeLDK.initFeeEstimator();
58+
await this.updateFees(fees);
59+
return ok(res);
60+
}
61+
62+
async updateFees({ high, normal, low }: TFeeUpdateReq): Promise<Result<string>> {
63+
const res = await NativeLDK.updateFees(high, normal, low);
64+
return ok(res);
65+
}
66+
5667
/**
5768
* Starts the startChainMonitor service
5869
* @return {Promise<Err<unknown> | Ok<string>>}

src/utils/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,9 @@ export type TLogListener = {
2525
id: string;
2626
callback: (log: string) => void;
2727
};
28+
29+
export type TFeeUpdateReq = {
30+
high: number,
31+
normal: number,
32+
low: number
33+
}

0 commit comments

Comments
 (0)