Skip to content

Commit 7c6b112

Browse files
committed
Allow configuring electrum/esplora sync configs
1 parent 137e571 commit 7c6b112

2 files changed

Lines changed: 89 additions & 11 deletions

File tree

ldk-server/src/main.rs

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use hex::DisplayHex;
2323
use hyper::server::conn::http1;
2424
use hyper_util::rt::TokioIo;
2525
use ldk_node::bitcoin::Network;
26-
use ldk_node::config::Config;
26+
use ldk_node::config::{BackgroundSyncConfig, Config, ElectrumSyncConfig, EsploraSyncConfig};
2727
use ldk_node::entropy::NodeEntropy;
2828
use ldk_node::lightning::ln::channelmanager::PaymentId;
2929
use ldk_node::{Builder, Event, Node};
@@ -72,6 +72,24 @@ pub fn get_default_data_dir() -> Option<PathBuf> {
7272
}
7373
}
7474

75+
fn build_background_sync_config(
76+
onchain_wallet_sync_interval_secs: Option<u64>,
77+
lightning_wallet_sync_interval_secs: Option<u64>,
78+
) -> Option<BackgroundSyncConfig> {
79+
if onchain_wallet_sync_interval_secs.is_none() && lightning_wallet_sync_interval_secs.is_none()
80+
{
81+
return None;
82+
}
83+
let mut bg = BackgroundSyncConfig::default();
84+
if let Some(interval) = onchain_wallet_sync_interval_secs {
85+
bg.onchain_wallet_sync_interval_secs = interval;
86+
}
87+
if let Some(interval) = lightning_wallet_sync_interval_secs {
88+
bg.lightning_wallet_sync_interval_secs = interval;
89+
}
90+
Some(bg)
91+
}
92+
7593
fn main() {
7694
let args_config = ArgsConfig::parse();
7795

@@ -155,11 +173,32 @@ fn main() {
155173
ChainSource::Rpc { rpc_host, rpc_port, rpc_user, rpc_password } => {
156174
builder.set_chain_source_bitcoind_rpc(rpc_host, rpc_port, rpc_user, rpc_password);
157175
},
158-
ChainSource::Electrum { server_url } => {
159-
builder.set_chain_source_electrum(server_url, None);
176+
ChainSource::Electrum {
177+
server_url,
178+
onchain_wallet_sync_interval_secs,
179+
lightning_wallet_sync_interval_secs,
180+
} => {
181+
let sync_config = build_background_sync_config(
182+
onchain_wallet_sync_interval_secs,
183+
lightning_wallet_sync_interval_secs,
184+
)
185+
.map(|bg| ElectrumSyncConfig {
186+
background_sync_config: Some(bg),
187+
..Default::default()
188+
});
189+
builder.set_chain_source_electrum(server_url, sync_config);
160190
},
161-
ChainSource::Esplora { server_url } => {
162-
builder.set_chain_source_esplora(server_url, None);
191+
ChainSource::Esplora {
192+
server_url,
193+
onchain_wallet_sync_interval_secs,
194+
lightning_wallet_sync_interval_secs,
195+
} => {
196+
let sync_config = build_background_sync_config(
197+
onchain_wallet_sync_interval_secs,
198+
lightning_wallet_sync_interval_secs,
199+
)
200+
.map(|bg| EsploraSyncConfig { background_sync_config: Some(bg), ..Default::default() });
201+
builder.set_chain_source_esplora(server_url, sync_config);
163202
},
164203
}
165204

ldk-server/src/util/config.rs

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,22 @@ pub struct TlsConfig {
6262

6363
#[derive(Debug, PartialEq, Eq)]
6464
pub enum ChainSource {
65-
Rpc { rpc_host: String, rpc_port: u16, rpc_user: String, rpc_password: String },
66-
Electrum { server_url: String },
67-
Esplora { server_url: String },
65+
Rpc {
66+
rpc_host: String,
67+
rpc_port: u16,
68+
rpc_user: String,
69+
rpc_password: String,
70+
},
71+
Electrum {
72+
server_url: String,
73+
onchain_wallet_sync_interval_secs: Option<u64>,
74+
lightning_wallet_sync_interval_secs: Option<u64>,
75+
},
76+
Esplora {
77+
server_url: String,
78+
onchain_wallet_sync_interval_secs: Option<u64>,
79+
lightning_wallet_sync_interval_secs: Option<u64>,
80+
},
6881
}
6982

7083
/// A builder for `Config`.
@@ -79,6 +92,8 @@ struct ConfigBuilder {
7992
storage_dir_path: Option<String>,
8093
electrum_url: Option<String>,
8194
esplora_url: Option<String>,
95+
onchain_wallet_sync_interval_secs: Option<u64>,
96+
lightning_wallet_sync_interval_secs: Option<u64>,
8297
bitcoind_rpc_address: Option<String>,
8398
bitcoind_rpc_user: Option<String>,
8499
bitcoind_rpc_password: Option<String>,
@@ -116,10 +131,22 @@ impl ConfigBuilder {
116131

117132
if let Some(electrum) = toml.electrum {
118133
self.electrum_url = Some(electrum.server_url);
134+
self.onchain_wallet_sync_interval_secs = electrum
135+
.onchain_wallet_sync_interval_secs
136+
.or(self.onchain_wallet_sync_interval_secs);
137+
self.lightning_wallet_sync_interval_secs = electrum
138+
.lightning_wallet_sync_interval_secs
139+
.or(self.lightning_wallet_sync_interval_secs);
119140
}
120141

121142
if let Some(esplora) = toml.esplora {
122143
self.esplora_url = Some(esplora.server_url);
144+
self.onchain_wallet_sync_interval_secs = esplora
145+
.onchain_wallet_sync_interval_secs
146+
.or(self.onchain_wallet_sync_interval_secs);
147+
self.lightning_wallet_sync_interval_secs = esplora
148+
.lightning_wallet_sync_interval_secs
149+
.or(self.lightning_wallet_sync_interval_secs);
123150
}
124151

125152
if let Some(log) = toml.log {
@@ -269,9 +296,17 @@ impl ConfigBuilder {
269296

270297
ChainSource::Rpc { rpc_host, rpc_port, rpc_user, rpc_password }
271298
} else if let Some(url) = self.electrum_url {
272-
ChainSource::Electrum { server_url: url }
299+
ChainSource::Electrum {
300+
server_url: url,
301+
onchain_wallet_sync_interval_secs: self.onchain_wallet_sync_interval_secs,
302+
lightning_wallet_sync_interval_secs: self.lightning_wallet_sync_interval_secs,
303+
}
273304
} else if let Some(url) = self.esplora_url {
274-
ChainSource::Esplora { server_url: url }
305+
ChainSource::Esplora {
306+
server_url: url,
307+
onchain_wallet_sync_interval_secs: self.onchain_wallet_sync_interval_secs,
308+
lightning_wallet_sync_interval_secs: self.lightning_wallet_sync_interval_secs,
309+
}
275310
} else {
276311
return Err(io::Error::new(io::ErrorKind::InvalidInput, "No valid Chain Source configured. Provide Bitcoind RPC, Electrum, or Esplora details."));
277312
};
@@ -391,11 +426,15 @@ struct BitcoindConfig {
391426
#[derive(Deserialize, Serialize)]
392427
struct ElectrumConfig {
393428
server_url: String,
429+
onchain_wallet_sync_interval_secs: Option<u64>,
430+
lightning_wallet_sync_interval_secs: Option<u64>,
394431
}
395432

396433
#[derive(Deserialize, Serialize)]
397434
struct EsploraConfig {
398435
server_url: String,
436+
onchain_wallet_sync_interval_secs: Option<u64>,
437+
lightning_wallet_sync_interval_secs: Option<u64>,
399438
}
400439

401440
#[derive(Deserialize, Serialize)]
@@ -805,7 +844,7 @@ mod tests {
805844
fs::write(storage_path.join(config_file_name), toml_config).unwrap();
806845
let config = load_config(&args_config).unwrap();
807846

808-
let ChainSource::Electrum { server_url } = config.chain_source else {
847+
let ChainSource::Electrum { server_url, .. } = config.chain_source else {
809848
panic!("unexpected chain source");
810849
};
811850

0 commit comments

Comments
 (0)