Skip to content

Commit a6561f4

Browse files
committed
feat: Add external pathfinding scores support for LDK Node
1 parent 75365e5 commit a6561f4

9 files changed

Lines changed: 79 additions & 2 deletions

File tree

android/app/src/main/java/app/zeusln/zeus/LdkNodeModule.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class LdkNodeModule(reactContext: ReactApplicationContext) : ReactContextBaseJav
2828
// Stored builder settings (not part of Config)
2929
private var storedEsploraServerUrl: String? = null
3030
private var storedRgsServerUrl: String? = null
31+
private var storedScorerUrl: String? = null
3132
private var storedLsps1NodeId: PublicKey? = null
3233
private var storedLsps1Address: SocketAddress? = null
3334
private var storedLsps1Token: String? = null
@@ -60,6 +61,7 @@ class LdkNodeModule(reactContext: ReactApplicationContext) : ReactContextBaseJav
6061
storedTrustedPeers0conf = emptyList()
6162
storedEsploraServerUrl = null
6263
storedRgsServerUrl = null
64+
storedScorerUrl = null
6365
storedLsps1NodeId = null
6466
storedLsps1Address = null
6567
storedLsps1Token = null
@@ -151,6 +153,18 @@ class LdkNodeModule(reactContext: ReactApplicationContext) : ReactContextBaseJav
151153
}
152154
}
153155

156+
@ReactMethod
157+
fun setPathfindingScoresSource(url: String, promise: Promise) {
158+
try {
159+
val builder = this.builder ?: throw Exception("Builder not initialized")
160+
this.storedScorerUrl = url
161+
builder.setPathfindingScoresSource(url)
162+
promise.resolve(null)
163+
} catch (e: Exception) {
164+
promise.reject("error", errorMessage(e))
165+
}
166+
}
167+
154168
@ReactMethod
155169
fun setGossipSourceP2p(promise: Promise) {
156170
try {
@@ -468,6 +482,10 @@ class LdkNodeModule(reactContext: ReactApplicationContext) : ReactContextBaseJav
468482
Log.d("LdkNodeModule", "applyBuilderSettings: RGS server = $it")
469483
builder.setGossipSourceRgs(it)
470484
}
485+
this.storedScorerUrl?.let {
486+
Log.d("LdkNodeModule", "applyBuilderSettings: Scorer URL = $it")
487+
builder.setPathfindingScoresSource(it)
488+
}
471489
this.storedLsps1NodeId?.let { nodeId ->
472490
this.storedLsps1Address?.let { address ->
473491
builder.setLiquiditySourceLsps1(nodeId, address, this.storedLsps1Token)

ios/LdkNodeMobile/LdkNodeModule.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class LdkNodeModule: RCTEventEmitter {
1919
// Stored builder settings (not part of Config)
2020
private var storedEsploraServerUrl: String?
2121
private var storedRgsServerUrl: String?
22+
private var storedScorerUrl: String?
2223
private var storedLsps1NodeId: PublicKey?
2324
private var storedLsps1Address: SocketAddress?
2425
private var storedLsps1Token: String?
@@ -79,6 +80,7 @@ class LdkNodeModule: RCTEventEmitter {
7980
storedTrustedPeers0conf = []
8081
storedEsploraServerUrl = nil
8182
storedRgsServerUrl = nil
83+
storedScorerUrl = nil
8284
storedLsps1NodeId = nil
8385
storedLsps1Address = nil
8486
storedLsps1Token = nil
@@ -166,6 +168,18 @@ class LdkNodeModule: RCTEventEmitter {
166168
resolve(["status": "ok"])
167169
}
168170

171+
@objc(setPathfindingScoresSource:resolver:rejecter:)
172+
func setPathfindingScoresSource(_ url: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
173+
guard let builder = self.builder else {
174+
reject("error", "Builder not initialized", nil)
175+
return
176+
}
177+
178+
self.storedScorerUrl = url
179+
builder.setPathfindingScoresSource(url: url)
180+
resolve(nil)
181+
}
182+
169183
@objc(setTrustedPeers0conf:resolver:rejecter:)
170184
func setTrustedPeers0conf(_ peers: [String], resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
171185
guard self.builder != nil else {
@@ -469,6 +483,10 @@ class LdkNodeModule: RCTEventEmitter {
469483
NSLog("LdkNodeModule: applyBuilderSettings: RGS server = \(rgsUrl)")
470484
builder.setGossipSourceRgs(rgsServerUrl: rgsUrl)
471485
}
486+
if let scorerUrl = self.storedScorerUrl {
487+
NSLog("LdkNodeModule: applyBuilderSettings: Scorer URL = \(scorerUrl)")
488+
builder.setPathfindingScoresSource(url: scorerUrl)
489+
}
472490
if let lsps1NodeId = self.storedLsps1NodeId, let lsps1Address = self.storedLsps1Address {
473491
builder.setLiquiditySourceLsps1(nodeId: lsps1NodeId, address: lsps1Address, token: self.storedLsps1Token)
474492
}

ldknode/LdkNode.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ export interface ILdkNodeModule {
442442
setStorageDirPath(path: string): Promise<void>;
443443
setEsploraServer(serverUrl: string): Promise<void>;
444444
setGossipSourceRgs(rgsServerUrl: string): Promise<void>;
445+
setPathfindingScoresSource(url: string): Promise<void>;
445446
setGossipSourceP2p(): Promise<void>;
446447
setListeningAddresses(addresses: string[]): Promise<void>;
447448

ldknode/LdkNodeInjection.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ const setGossipSourceRgs = async (rgsServerUrl: string): Promise<void> => {
4747
return await LdkNodeModule.setGossipSourceRgs(rgsServerUrl);
4848
};
4949

50+
const setPathfindingScoresSource = async (url: string): Promise<void> => {
51+
return await LdkNodeModule.setPathfindingScoresSource(url);
52+
};
53+
5054
const setGossipSourceP2p = async (): Promise<void> => {
5155
return await LdkNodeModule.setGossipSourceP2p();
5256
};
@@ -802,6 +806,7 @@ const initializeNode = async ({
802806
mnemonic,
803807
passphrase,
804808
rgsServerUrl,
809+
scorerUrl,
805810
listeningAddresses,
806811
lsps1Config,
807812
trustedPeers0conf,
@@ -814,6 +819,7 @@ const initializeNode = async ({
814819
mnemonic: string;
815820
passphrase?: string | null;
816821
rgsServerUrl?: string;
822+
scorerUrl?: string;
817823
listeningAddresses?: string[];
818824
lsps1Config?: {
819825
nodeId: string;
@@ -846,6 +852,11 @@ const initializeNode = async ({
846852
console.log('LDK Node: No RGS server configured, using P2P gossip');
847853
}
848854

855+
if (scorerUrl) {
856+
await setPathfindingScoresSource(scorerUrl);
857+
console.log(`LDK Node: Scorer URL set to ${scorerUrl}`);
858+
}
859+
849860
if (listeningAddresses && listeningAddresses.length > 0) {
850861
await setListeningAddresses(listeningAddresses);
851862
}
@@ -976,6 +987,7 @@ export interface ILdkNodeInjections {
976987
setStorageDirPath: (path: string) => Promise<void>;
977988
setEsploraServer: (serverUrl: string) => Promise<void>;
978989
setGossipSourceRgs: (rgsServerUrl: string) => Promise<void>;
990+
setPathfindingScoresSource: (url: string) => Promise<void>;
979991
setGossipSourceP2p: () => Promise<void>;
980992
setListeningAddresses: (addresses: string[]) => Promise<void>;
981993
setLiquiditySourceLsps1: (params: {
@@ -1210,6 +1222,7 @@ export interface ILdkNodeInjections {
12101222
mnemonic: string;
12111223
passphrase?: string | null;
12121224
rgsServerUrl?: string;
1225+
scorerUrl?: string;
12131226
listeningAddresses?: string[];
12141227
lsps1Config?: {
12151228
nodeId: string;
@@ -1240,6 +1253,7 @@ const LdkNodeInjection: ILdkNodeInjections = {
12401253
setStorageDirPath,
12411254
setEsploraServer,
12421255
setGossipSourceRgs,
1256+
setPathfindingScoresSource,
12431257
setGossipSourceP2p,
12441258
setListeningAddresses,
12451259
setLiquiditySourceLsps1,

stores/SettingsStore.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export interface Node {
5555
ldkPassphrase?: string;
5656
ldkEsploraServer?: string;
5757
ldkRgsServer?: string;
58+
ldkScorerUrl?: string;
5859
ldkVssServer?: string;
5960
}
6061

@@ -1650,6 +1651,7 @@ export default class SettingsStore {
16501651
@observable public ldkNetwork?: string;
16511652
@observable public ldkEsploraServer?: string;
16521653
@observable public ldkRgsServer?: string;
1654+
@observable public ldkScorerUrl?: string;
16531655
@observable public ldkVssServer?: string;
16541656
@observable public ldkNodeSyncing: boolean = false;
16551657
@observable public isChannelMigrating: boolean = false;
@@ -1859,6 +1861,7 @@ export default class SettingsStore {
18591861
this.ldkNetwork = node.ldkNetwork;
18601862
this.ldkEsploraServer = node.ldkEsploraServer;
18611863
this.ldkRgsServer = node.ldkRgsServer;
1864+
this.ldkScorerUrl = node.ldkScorerUrl;
18621865
this.ldkVssServer = node.ldkVssServer;
18631866
// NWC
18641867
this.nostrWalletConnectUrl = node.nostrWalletConnectUrl;
@@ -1873,6 +1876,7 @@ export default class SettingsStore {
18731876
this.ldkNetwork = undefined;
18741877
this.ldkEsploraServer = undefined;
18751878
this.ldkRgsServer = undefined;
1879+
this.ldkScorerUrl = undefined;
18761880
this.ldkVssServer = undefined;
18771881
}
18781882
};

utils/LdkNodeUtils.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ export const RGS_SERVERS_TESTNET = [
4646
'https://rapidsync.lightningdevkit.org/testnet/snapshot'
4747
];
4848

49+
// Default pathfinding scores server
50+
export const DEFAULT_SCORER_URL = 'https://scores.zeusln.com/latest.bin';
51+
4952
/**
5053
* Get the storage directory path for LDK Node data
5154
*/
@@ -164,6 +167,7 @@ async function initNode({
164167
network,
165168
esploraServerUrl,
166169
rgsServerUrl,
170+
scorerUrl,
167171
listeningAddresses,
168172
lsps1Config,
169173
trustedPeers0conf,
@@ -175,6 +179,7 @@ async function initNode({
175179
network: SupportedNetwork;
176180
esploraServerUrl?: string;
177181
rgsServerUrl?: string;
182+
scorerUrl?: string;
178183
listeningAddresses?: string[];
179184
lsps1Config?: {
180185
nodeId: string;
@@ -202,6 +207,7 @@ async function initNode({
202207
mnemonic,
203208
passphrase: passphrase || null,
204209
rgsServerUrl: rgsUrl,
210+
scorerUrl,
205211
listeningAddresses,
206212
lsps1Config,
207213
trustedPeers0conf,
@@ -223,6 +229,7 @@ export async function createLdkNodeWallet({
223229
network,
224230
esploraServerUrl,
225231
rgsServerUrl,
232+
scorerUrl,
226233
listeningAddresses,
227234
lsps1Config,
228235
trustedPeers0conf,
@@ -234,6 +241,7 @@ export async function createLdkNodeWallet({
234241
network: SupportedNetwork;
235242
esploraServerUrl?: string;
236243
rgsServerUrl?: string;
244+
scorerUrl?: string;
237245
listeningAddresses?: string[];
238246
lsps1Config?: {
239247
nodeId: string;
@@ -263,6 +271,7 @@ export async function createLdkNodeWallet({
263271
network,
264272
esploraServerUrl,
265273
rgsServerUrl,
274+
scorerUrl,
266275
listeningAddresses,
267276
lsps1Config,
268277
trustedPeers0conf,
@@ -286,6 +295,7 @@ export async function startLdkNodeWallet({
286295
network,
287296
esploraServerUrl,
288297
rgsServerUrl,
298+
scorerUrl,
289299
listeningAddresses,
290300
lsps1Config,
291301
trustedPeers0conf,
@@ -299,6 +309,7 @@ export async function startLdkNodeWallet({
299309
network: SupportedNetwork;
300310
esploraServerUrl?: string;
301311
rgsServerUrl?: string;
312+
scorerUrl?: string;
302313
listeningAddresses?: string[];
303314
lsps1Config?: {
304315
nodeId: string;
@@ -321,6 +332,7 @@ export async function startLdkNodeWallet({
321332
network,
322333
esploraServerUrl,
323334
rgsServerUrl,
335+
scorerUrl,
324336
listeningAddresses,
325337
lsps1Config,
326338
trustedPeers0conf,

views/Settings/SeedRecovery.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ import {
6262
stopLdkNode,
6363
getDefaultEsploraServer,
6464
getDefaultRgsServer,
65-
DEFAULT_VSS_SERVER
65+
DEFAULT_VSS_SERVER,
66+
DEFAULT_SCORER_URL
6667
} from '../../utils/LdkNodeUtils';
6768

6869
import { BIP39_WORD_LIST } from '../../utils/Bip39Utils';
@@ -755,6 +756,7 @@ export default class SeedRecovery extends React.PureComponent<
755756
network: networkType,
756757
esploraServerUrl: getDefaultEsploraServer(networkType),
757758
rgsServerUrl: getDefaultRgsServer(networkType),
759+
scorerUrl: DEFAULT_SCORER_URL,
758760
lsps1Config,
759761
trustedPeers0conf: trustedPeers,
760762
vssServerUrl: DEFAULT_VSS_SERVER

views/Settings/WalletConfiguration.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ import {
7878
getDefaultEsploraServer,
7979
getDefaultRgsServer,
8080
DEFAULT_VSS_SERVER,
81+
DEFAULT_SCORER_URL,
8182
SupportedNetwork
8283
} from '../../utils/LdkNodeUtils';
8384

@@ -1115,6 +1116,7 @@ export default class WalletConfiguration extends React.Component<
11151116
esploraServerUrl:
11161117
ldkEsploraServer || getDefaultEsploraServer(networkType),
11171118
rgsServerUrl: ldkRgsServer || getDefaultRgsServer(networkType),
1119+
scorerUrl: DEFAULT_SCORER_URL,
11181120
lsps1Config,
11191121
trustedPeers0conf: trustedPeers,
11201122
vssServerUrl: DEFAULT_VSS_SERVER

views/Wallet/Wallet.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ import {
6060
import {
6161
startLdkNodeWallet,
6262
stopLdkNode,
63-
DEFAULT_VSS_SERVER
63+
DEFAULT_VSS_SERVER,
64+
DEFAULT_SCORER_URL
6465
} from '../../utils/LdkNodeUtils';
6566
import { localeString, bridgeJavaStrings } from '../../utils/LocaleUtils';
6667
import { isBatterySaverEnabled } from '../../utils/BatteryUtils';
@@ -555,6 +556,7 @@ export default class Wallet extends React.Component<WalletProps, WalletState> {
555556
ldkNetwork,
556557
ldkEsploraServer,
557558
ldkRgsServer,
559+
ldkScorerUrl,
558560
ldkVssServer,
559561
updateSettings,
560562
fetchLock
@@ -666,6 +668,10 @@ export default class Wallet extends React.Component<WalletProps, WalletState> {
666668
| 'regtest',
667669
esploraServerUrl: ldkEsploraServer,
668670
rgsServerUrl: ldkRgsServer,
671+
scorerUrl:
672+
ldkScorerUrl === undefined
673+
? DEFAULT_SCORER_URL
674+
: ldkScorerUrl,
669675
lsps1Config,
670676
trustedPeers0conf: trustedPeers,
671677
vssServerUrl: ldkVssServer || DEFAULT_VSS_SERVER,

0 commit comments

Comments
 (0)