Skip to content
This repository was archived by the owner on Feb 9, 2026. It is now read-only.

Commit 5c6822b

Browse files
authored
Merge pull request #138 from synonymdev/signet-support
Signet support
2 parents a9519b0 + 1c3c4a4 commit 5c6822b

10 files changed

Lines changed: 95 additions & 67 deletions

File tree

example/utils/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,5 @@ export const customPeers = {
3636
protocol: 'tcp',
3737
},
3838
],
39+
bitcoinSignet: [],
3940
};

example/utils/helpers.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import RNFS from 'react-native-fs';
1414
import * as bip32 from 'bip32';
1515
import * as bip39 from 'bip39';
1616
import { ENetworks } from '@synonymdev/react-native-ldk/dist/utils/types';
17+
import networks from '@synonymdev/react-native-ldk/dist/utils/networks';
1718
import ldk from '@synonymdev/react-native-ldk/dist/ldk';
1819
import Clipboard from '@react-native-clipboard/clipboard';
1920

@@ -125,13 +126,15 @@ export const getNetwork = (
125126
): bitcoin.networks.Network => {
126127
switch (network) {
127128
case 'bitcoin':
128-
return bitcoin.networks.bitcoin;
129+
return networks.bitcoin;
129130
case 'bitcoinTestnet':
130-
return bitcoin.networks.testnet;
131+
return networks.testnet;
131132
case 'bitcoinRegtest':
132-
return bitcoin.networks.regtest;
133+
return networks.regtest;
134+
case 'bitcoinSignet':
135+
return networks.signet;
133136
default:
134-
return bitcoin.networks.regtest;
137+
return networks.regtest;
135138
}
136139
};
137140

@@ -209,6 +212,8 @@ export const ldkNetwork = (network: TAvailableNetworks): ENetworks => {
209212
return ENetworks.testnet;
210213
case 'bitcoin':
211214
return ENetworks.mainnet;
215+
case 'bitcoinSignet':
216+
return ENetworks.signet;
212217
}
213218
};
214219

lib/android/src/main/java/com/reactnativeldk/Helpers.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ val Invoice.asJson: WritableMap
8181
result.putHexString("payment_secret", payment_secret())
8282
result.putInt("timestamp", timestamp().toInt())
8383
result.putHexString("features", features()?.write())
84-
result.putInt("currency", currency().ordinal)
84+
result.putString("currency", currencyString(currency()))
8585
result.putString("to_str", signedInv.to_str())
8686

8787
val hints = Arguments.createArray()
@@ -377,13 +377,25 @@ fun UserConfig.mergeWithMap(map: ReadableMap): UserConfig {
377377
/// Helper for returning real network and currency as a tuple from a string
378378
fun getNetwork(chain: String): Pair<Network, Currency> {
379379
return when (chain) {
380-
"regtest" -> Pair(Network.LDKNetwork_Regtest, Currency.LDKCurrency_Regtest)
381-
"testnet" -> Pair(Network.LDKNetwork_Testnet, Currency.LDKCurrency_BitcoinTestnet)
382380
"mainnet" -> Pair(Network.LDKNetwork_Bitcoin, Currency.LDKCurrency_Bitcoin)
381+
"testnet" -> Pair(Network.LDKNetwork_Testnet, Currency.LDKCurrency_BitcoinTestnet)
382+
"regtest" -> Pair(Network.LDKNetwork_Regtest, Currency.LDKCurrency_Regtest)
383+
"signet" -> Pair(Network.LDKNetwork_Signet, Currency.LDKCurrency_Signet)
383384
else -> Pair(Network.LDKNetwork_Bitcoin, Currency.LDKCurrency_Bitcoin)
384385
}
385386
}
386387

388+
fun currencyString(currency: Currency): String {
389+
return when (currency) {
390+
Currency.LDKCurrency_Bitcoin -> "Bitcoin"
391+
Currency.LDKCurrency_BitcoinTestnet -> "BitcoinTestnet"
392+
Currency.LDKCurrency_Regtest -> "Regtest"
393+
Currency.LDKCurrency_Simnet -> "Simnet"
394+
Currency.LDKCurrency_Signet -> "Signet"
395+
else -> "Unknown"
396+
}
397+
}
398+
387399
fun mergeObj(obj1: JSONObject, obj2: HashMap<String, Any>): HashMap<String, Any> {
388400
val newObj = HashMap<String, Any>()
389401

lib/android/src/main/java/com/reactnativeldk/LdkModule.kt

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
271271
}
272272

273273
if (networkGraph == null) {
274-
var ldkNetwork = getNetwork(network);
274+
val ldkNetwork = getNetwork(network);
275275
networkGraph = NetworkGraph.of(ldkNetwork.first, logger.logger)
276276

277277
LdkEventEmitter.send(EventTypes.native_log, "Failed to load cached network graph from disk. Will sync from scratch.")
@@ -294,7 +294,7 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
294294
rapidGossipSync = RapidGossipSync.of(networkGraph, logger.logger)
295295

296296
//If it's been more than 24 hours then we need to update RGS
297-
var timestamp = if (networkGraph!!._last_rapid_gossip_sync_timestamp is Option_u32Z.Some) (networkGraph!!._last_rapid_gossip_sync_timestamp as Option_u32Z.Some).some.toLong() else 0 // (networkGraph!!._last_rapid_gossip_sync_timestamp as Option_u32Z.Some).some
297+
val timestamp = if (networkGraph!!._last_rapid_gossip_sync_timestamp is Option_u32Z.Some) (networkGraph!!._last_rapid_gossip_sync_timestamp as Option_u32Z.Some).some.toLong() else 0 // (networkGraph!!._last_rapid_gossip_sync_timestamp as Option_u32Z.Some).some
298298
val hoursDiffSinceLastRGS = (System.currentTimeMillis() / 1000 - timestamp) / 60 / 60
299299
if (hoursDiffSinceLastRGS < 24) {
300300
LdkEventEmitter.send(EventTypes.native_log, "Skipping rapid gossip sync. Last updated $hoursDiffSinceLastRGS hours ago.")
@@ -354,23 +354,8 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
354354
return handleReject(promise, LdkErrors.init_storage_path)
355355
}
356356

357-
when (network) {
358-
"regtest" -> {
359-
ldkNetwork = Network.LDKNetwork_Regtest
360-
ldkCurrency = Currency.LDKCurrency_Regtest
361-
}
362-
"testnet" -> {
363-
ldkNetwork = Network.LDKNetwork_Testnet
364-
ldkCurrency = Currency.LDKCurrency_BitcoinTestnet
365-
}
366-
"mainnet" -> {
367-
ldkNetwork = Network.LDKNetwork_Bitcoin
368-
ldkCurrency = Currency.LDKCurrency_Bitcoin
369-
}
370-
else -> {
371-
return handleReject(promise, LdkErrors.invalid_network)
372-
}
373-
}
357+
ldkNetwork = getNetwork(network).first
358+
ldkCurrency = getNetwork(network).second
374359

375360
val enableP2PGossip = rapidGossipSync == null
376361

lib/ios/Helpers.swift

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,6 @@ func handleReject(_ reject: RCTPromiseRejectBlock, _ ldkError: LdkErrors, _ erro
2626
reject(ldkError.rawValue, message ?? ldkError.rawValue, NSError(domain: ldkError.rawValue, code: ldkError.hashValue))
2727
}
2828

29-
func currencyString(_ currency: Currency) -> String {
30-
switch currency {
31-
case .Bitcoin:
32-
return "Bitcoin"
33-
case .BitcoinTestnet:
34-
return "BitcoinTestnet"
35-
case .Regtest:
36-
return "Regtest"
37-
case .Simnet:
38-
return "Simnet"
39-
case .Signet:
40-
return "Signet"
41-
@unknown default:
42-
return "Unknown"
43-
}
44-
}
45-
4629
/// Loads the cached scorer from disk or creates a new one
4730
/// - Parameters:
4831
/// - path
@@ -438,17 +421,36 @@ func handlePaymentSendFailure(_ reject: RCTPromiseRejectBlock, error: Bindings.P
438421
/// - Returns: network and currency tuple
439422
func getNetwork(_ network: String) -> (Network, Currency)? {
440423
switch network {
441-
case "regtest":
442-
return (Network.Regtest, Currency.Regtest)
443-
case "testnet":
444-
return (Network.Testnet, Currency.BitcoinTestnet)
445424
case "mainnet":
446425
return (Network.Bitcoin, Currency.Bitcoin)
426+
case "testnet":
427+
return (Network.Testnet, Currency.BitcoinTestnet)
428+
case "regtest":
429+
return (Network.Regtest, Currency.Regtest)
430+
case "signet":
431+
return (Network.Signet, Currency.Signet)
447432
default:
448433
return nil
449434
}
450435
}
451436

437+
func currencyString(_ currency: Currency) -> String {
438+
switch currency {
439+
case .Bitcoin:
440+
return "Bitcoin"
441+
case .BitcoinTestnet:
442+
return "BitcoinTestnet"
443+
case .Regtest:
444+
return "Regtest"
445+
case .Simnet:
446+
return "Simnet"
447+
case .Signet:
448+
return "Signet"
449+
@unknown default:
450+
return "Unknown"
451+
}
452+
}
453+
452454
func mergeObj(_ obj1: [String: Any], _ obj2: [String: Any]) -> [String: Any] {
453455
var newObj = obj1
454456
obj2.keys.forEach { key in

lib/src/lightning-manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ import {
6161
startParamCheck,
6262
} from './utils/helpers';
6363
import * as bitcoin from 'bitcoinjs-lib';
64-
import { networks } from 'bitcoinjs-lib';
64+
import networks from './utils/networks';
6565
import { EmitterSubscription } from 'react-native';
6666

6767
//TODO startup steps
@@ -384,7 +384,7 @@ class LightningManager {
384384
// Step 7: Read ChannelMonitors state from disk
385385
// Handled in initChannelManager below
386386

387-
if (network !== 'mainnet') {
387+
if (network !== ENetworks.mainnet) {
388388
//RGS only currently working for mainnet
389389
rapidGossipSyncUrl = '';
390390
}

lib/src/mock.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { ENetworks } from './utils/types';
2+
13
export * from './utils/types';
24

35
const noop = (): void => {};
@@ -50,7 +52,7 @@ export default {
5052
backupSubscriptions: {},
5153
backupSubscriptionsId: 1,
5254
backupSubscriptionsDebounceTimer: 1,
53-
network: 'mainnet',
55+
network: ENetworks.mainnet,
5456
baseStoragePath: '/ldk/',
5557
logFilePath: '/ldk/wallet0bitcoinldkaccount/logs/1.log',
5658
};

lib/src/utils/helpers.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { ENetworks, TLdkStart } from './types';
22
import { err, ok, Result } from './result';
33
import * as bitcoin from 'bitcoinjs-lib';
4-
import { networks } from 'bitcoinjs-lib';
5-
4+
import networks from './networks';
65
/**
76
* This method runs a check on each parameter passed to the start method
87
* to ensure that they are providing the expected data.
@@ -31,15 +30,12 @@ export const startParamCheck = async ({
3130
if (typeof network !== 'string') {
3231
return err('network must be a string.');
3332
}
34-
if (
35-
!(
36-
network === ENetworks.mainnet ||
37-
network === ENetworks.testnet ||
38-
network === ENetworks.regtest
39-
)
40-
) {
33+
34+
if (!Object.values(ENetworks).includes(network)) {
4135
return err(
42-
`The provided network (${network}) is invalid. It must be either '${ENetworks.mainnet}', '${ENetworks.testnet}' or '${ENetworks.regtest}'.`,
36+
`The provided network (${network}) is invalid. It must on of the following: '${Object.values(
37+
ENetworks,
38+
).join(', ')}'.`,
4339
);
4440
}
4541

@@ -90,7 +86,7 @@ export const startParamCheck = async ({
9086
}
9187

9288
// Test getTransactionData response if using mainnet or testnet.
93-
if (network !== ENetworks.regtest) {
89+
if (network === ENetworks.mainnet || network === ENetworks.testnet) {
9490
const expectedData = {
9591
[ENetworks.mainnet]: {
9692
txid: '0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098',

lib/src/utils/networks.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import * as bitcoin from 'bitcoinjs-lib';
2+
import { ENetworks } from './types';
3+
4+
const networks: {
5+
[ENetworks.mainnet]: bitcoin.networks.Network;
6+
[ENetworks.testnet]: bitcoin.networks.Network;
7+
[ENetworks.regtest]: bitcoin.networks.Network;
8+
[ENetworks.signet]: bitcoin.networks.Network;
9+
} = {
10+
...bitcoin.networks,
11+
signet: {
12+
messagePrefix: '\x18Bitcoin Signed Message:\n',
13+
bech32: 'ts',
14+
bip32: {
15+
public: 0x043587cf,
16+
private: 0x04358394,
17+
},
18+
pubKeyHash: 0x7d,
19+
scriptHash: 0x6e,
20+
wif: 0xef,
21+
},
22+
};
23+
export default networks;

lib/src/utils/types.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
export enum ENetworks {
2+
signet = 'signet',
23
regtest = 'regtest',
34
testnet = 'testnet',
4-
mainnet = 'mainnet',
5+
mainnet = 'bitcoin',
56
}
67

8+
export type TAvailableNetworks =
9+
| 'bitcoin'
10+
| 'bitcoinTestnet'
11+
| 'bitcoinRegtest'
12+
| 'bitcoinSignet';
13+
714
export enum EEventTypes {
815
ldk_log = 'ldk_log',
916
native_log = 'native_log',
@@ -496,11 +503,6 @@ export const DefaultLdkDataShape: TLdkData = {
496503
[ELdkData.payments_sent]: [],
497504
};
498505

499-
export type TAvailableNetworks =
500-
| 'bitcoin'
501-
| 'bitcoinTestnet'
502-
| 'bitcoinRegtest';
503-
504506
export type TAccount = {
505507
name: string;
506508
seed: string;

0 commit comments

Comments
 (0)