From f01d36bb014026678a7e6dd90b19536a09aac496 Mon Sep 17 00:00:00 2001 From: Leo Nash Date: Sun, 18 Jan 2026 03:00:55 +0000 Subject: [PATCH 1/4] Add announcement addresses setting --- ldk-server/ldk-server-config.toml | 1 + ldk-server/src/main.rs | 1 + ldk-server/src/util/config.rs | 23 +++++++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/ldk-server/ldk-server-config.toml b/ldk-server/ldk-server-config.toml index f4485e9..8e6c268 100644 --- a/ldk-server/ldk-server-config.toml +++ b/ldk-server/ldk-server-config.toml @@ -2,6 +2,7 @@ [node] network = "regtest" # Bitcoin network to use listening_address = "localhost:3001" # Lightning node listening address +announcement_addresses = ["54.3.7.81:3001"] # Lightning node announcement addresses rest_service_address = "127.0.0.1:3002" # LDK Server REST address api_key = "your-secret-api-key" # API key for authenticating REST requests diff --git a/ldk-server/src/main.rs b/ldk-server/src/main.rs index 934098f..393dc27 100644 --- a/ldk-server/src/main.rs +++ b/ldk-server/src/main.rs @@ -102,6 +102,7 @@ fn main() { ldk_node_config.storage_dir_path = config_file.storage_dir_path.clone(); ldk_node_config.listening_addresses = Some(vec![config_file.listening_addr]); + ldk_node_config.announcement_addresses = config_file.announcement_addrs; ldk_node_config.network = config_file.network; let mut builder = Builder::from_config(ldk_node_config); diff --git a/ldk-server/src/util/config.rs b/ldk-server/src/util/config.rs index 4044f6a..8c4204e 100644 --- a/ldk-server/src/util/config.rs +++ b/ldk-server/src/util/config.rs @@ -23,6 +23,7 @@ use serde::{Deserialize, Serialize}; #[derive(Debug)] pub struct Config { pub listening_addr: SocketAddress, + pub announcement_addrs: Option>, pub alias: Option, pub network: Network, pub api_key: String, @@ -62,6 +63,23 @@ impl TryFrom for Config { format!("Invalid listening address configured: {}", e), ) })?; + let announcement_addrs = toml_config + .node + .announcement_addresses + .map(|addresses| { + addresses + .into_iter() + .map(|addr| { + SocketAddress::from_str(&addr).map_err(|e| { + io::Error::new( + io::ErrorKind::InvalidInput, + format!("Invalid announcement address configured: {}", e), + ) + }) + }) + .collect() + }) + .transpose()?; let rest_service_addr = SocketAddr::from_str(&toml_config.node.rest_service_address) .map_err(|e| { io::Error::new( @@ -162,6 +180,7 @@ impl TryFrom for Config { Ok(Config { listening_addr, + announcement_addrs, network: toml_config.node.network, alias, rest_service_addr, @@ -196,6 +215,7 @@ pub struct TomlConfig { struct NodeConfig { network: Network, listening_address: String, + announcement_addresses: Option>, rest_service_address: String, alias: Option, api_key: String, @@ -332,6 +352,7 @@ mod tests { [node] network = "regtest" listening_address = "localhost:3001" + announcement_addresses = ["54.3.7.81:3001"] rest_service_address = "127.0.0.1:3002" alias = "LDK Server" api_key = "test_api_key" @@ -376,6 +397,7 @@ mod tests { let config = load_config(storage_path.join(config_file_name)).unwrap(); let expected = Config { listening_addr: SocketAddress::from_str("localhost:3001").unwrap(), + announcement_addrs: Some(vec![SocketAddress::from_str("54.3.7.81:3001").unwrap()]), alias: Some(NodeAlias(bytes)), network: Network::Regtest, rest_service_addr: SocketAddr::from_str("127.0.0.1:3002").unwrap(), @@ -408,6 +430,7 @@ mod tests { }; assert_eq!(config.listening_addr, expected.listening_addr); + assert_eq!(config.announcement_addrs, expected.announcement_addrs); assert_eq!(config.network, expected.network); assert_eq!(config.rest_service_addr, expected.rest_service_addr); assert_eq!(config.api_key, expected.api_key); From 2bb5acd3231308f0cd20f497a36e17d3549a8ccc Mon Sep 17 00:00:00 2001 From: Leo Nash Date: Sun, 18 Jan 2026 04:32:16 +0000 Subject: [PATCH 2/4] Make listening addresses optional, and allow multiple to be set --- ldk-server/ldk-server-config.toml | 2 +- ldk-server/src/main.rs | 2 +- ldk-server/src/util/config.rs | 39 ++++++++++++++++++------------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/ldk-server/ldk-server-config.toml b/ldk-server/ldk-server-config.toml index 8e6c268..3f60a5a 100644 --- a/ldk-server/ldk-server-config.toml +++ b/ldk-server/ldk-server-config.toml @@ -1,7 +1,7 @@ # Lightning node settings [node] network = "regtest" # Bitcoin network to use -listening_address = "localhost:3001" # Lightning node listening address +listening_addresses = ["localhost:3001"] # Lightning node listening addresses announcement_addresses = ["54.3.7.81:3001"] # Lightning node announcement addresses rest_service_address = "127.0.0.1:3002" # LDK Server REST address api_key = "your-secret-api-key" # API key for authenticating REST requests diff --git a/ldk-server/src/main.rs b/ldk-server/src/main.rs index 393dc27..038b219 100644 --- a/ldk-server/src/main.rs +++ b/ldk-server/src/main.rs @@ -101,7 +101,7 @@ fn main() { }; ldk_node_config.storage_dir_path = config_file.storage_dir_path.clone(); - ldk_node_config.listening_addresses = Some(vec![config_file.listening_addr]); + ldk_node_config.listening_addresses = config_file.listening_addrs; ldk_node_config.announcement_addresses = config_file.announcement_addrs; ldk_node_config.network = config_file.network; diff --git a/ldk-server/src/util/config.rs b/ldk-server/src/util/config.rs index 8c4204e..3482243 100644 --- a/ldk-server/src/util/config.rs +++ b/ldk-server/src/util/config.rs @@ -22,7 +22,7 @@ use serde::{Deserialize, Serialize}; /// Configuration for LDK Server. #[derive(Debug)] pub struct Config { - pub listening_addr: SocketAddress, + pub listening_addrs: Option>, pub announcement_addrs: Option>, pub alias: Option, pub network: Network, @@ -56,13 +56,23 @@ impl TryFrom for Config { type Error = io::Error; fn try_from(toml_config: TomlConfig) -> io::Result { - let listening_addr = - SocketAddress::from_str(&toml_config.node.listening_address).map_err(|e| { - io::Error::new( - io::ErrorKind::InvalidInput, - format!("Invalid listening address configured: {}", e), - ) - })?; + let listening_addrs = toml_config + .node + .listening_addresses + .map(|addresses| { + addresses + .into_iter() + .map(|addr| { + SocketAddress::from_str(&addr).map_err(|e| { + io::Error::new( + io::ErrorKind::InvalidInput, + format!("Invalid listening address configured: {}", e), + ) + }) + }) + .collect() + }) + .transpose()?; let announcement_addrs = toml_config .node .announcement_addresses @@ -179,7 +189,7 @@ impl TryFrom for Config { }); Ok(Config { - listening_addr, + listening_addrs, announcement_addrs, network: toml_config.node.network, alias, @@ -214,7 +224,7 @@ pub struct TomlConfig { #[derive(Deserialize, Serialize)] struct NodeConfig { network: Network, - listening_address: String, + listening_addresses: Option>, announcement_addresses: Option>, rest_service_address: String, alias: Option, @@ -351,7 +361,7 @@ mod tests { let toml_config = r#" [node] network = "regtest" - listening_address = "localhost:3001" + listening_addresses = ["localhost:3001"] announcement_addresses = ["54.3.7.81:3001"] rest_service_address = "127.0.0.1:3002" alias = "LDK Server" @@ -396,7 +406,7 @@ mod tests { let config = load_config(storage_path.join(config_file_name)).unwrap(); let expected = Config { - listening_addr: SocketAddress::from_str("localhost:3001").unwrap(), + listening_addrs: Some(vec![SocketAddress::from_str("localhost:3001").unwrap()]), announcement_addrs: Some(vec![SocketAddress::from_str("54.3.7.81:3001").unwrap()]), alias: Some(NodeAlias(bytes)), network: Network::Regtest, @@ -429,7 +439,7 @@ mod tests { log_file_path: Some("/var/log/ldk-server.log".to_string()), }; - assert_eq!(config.listening_addr, expected.listening_addr); + assert_eq!(config.listening_addrs, expected.listening_addrs); assert_eq!(config.announcement_addrs, expected.announcement_addrs); assert_eq!(config.network, expected.network); assert_eq!(config.rest_service_addr, expected.rest_service_addr); @@ -453,7 +463,6 @@ mod tests { let toml_config = r#" [node] network = "regtest" - listening_address = "localhost:3001" rest_service_address = "127.0.0.1:3002" alias = "LDK Server" api_key = "test_api_key" @@ -498,7 +507,6 @@ mod tests { let toml_config = r#" [node] network = "regtest" - listening_address = "localhost:3001" rest_service_address = "127.0.0.1:3002" alias = "LDK Server" api_key = "test_api_key" @@ -547,7 +555,6 @@ mod tests { let toml_config = r#" [node] network = "regtest" - listening_address = "localhost:3001" rest_service_address = "127.0.0.1:3002" alias = "LDK Server" api_key = "test_api_key" From aa930a3d3d9f2e38947a704a51098d8ed672ee2f Mon Sep 17 00:00:00 2001 From: Leo Nash Date: Sun, 18 Jan 2026 03:24:15 +0000 Subject: [PATCH 3/4] Add coverage for a few more fields in `load_config` --- ldk-server/src/util/config.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ldk-server/src/util/config.rs b/ldk-server/src/util/config.rs index 3482243..2969084 100644 --- a/ldk-server/src/util/config.rs +++ b/ldk-server/src/util/config.rs @@ -441,6 +441,7 @@ mod tests { assert_eq!(config.listening_addrs, expected.listening_addrs); assert_eq!(config.announcement_addrs, expected.announcement_addrs); + assert_eq!(config.alias, expected.alias); assert_eq!(config.network, expected.network); assert_eq!(config.rest_service_addr, expected.rest_service_addr); assert_eq!(config.api_key, expected.api_key); @@ -457,6 +458,8 @@ mod tests { assert_eq!(config.rabbitmq_exchange_name, expected.rabbitmq_exchange_name); #[cfg(feature = "experimental-lsps2-support")] assert_eq!(config.lsps2_service_config.is_some(), expected.lsps2_service_config.is_some()); + assert_eq!(config.log_level, expected.log_level); + assert_eq!(config.log_file_path, expected.log_file_path); // Test case where only electrum is set From 7bc012000bcd92636671d4e0640918cd0c08806a Mon Sep 17 00:00:00 2001 From: Leo Nash Date: Sun, 18 Jan 2026 03:36:50 +0000 Subject: [PATCH 4/4] Fix comment in the configuration file --- ldk-server/ldk-server-config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ldk-server/ldk-server-config.toml b/ldk-server/ldk-server-config.toml index 3f60a5a..f7ada16 100644 --- a/ldk-server/ldk-server-config.toml +++ b/ldk-server/ldk-server-config.toml @@ -19,7 +19,7 @@ file_path = "/tmp/ldk-server/ldk-server.log" # Log file path #key_path = "/path/to/tls.key" # Path to TLS private key, by default uses dir_path/tls.key hosts = ["example.com"] # Allowed hosts for TLS, will always include "localhost" and "127.0.0.1" -# Must set either bitcoind or esplora settings, but not both +# Must set one of bitcoind, electrum, or esplora # Bitcoin Core settings [bitcoind]