11use ldk_node:: bitcoin:: Network ;
22use ldk_node:: lightning:: ln:: msgs:: SocketAddress ;
3+ use ldk_node:: liquidity:: LSPS2ServiceConfig ;
34use serde:: { Deserialize , Serialize } ;
45use std:: net:: SocketAddr ;
56use std:: path:: Path ;
67use std:: str:: FromStr ;
78use std:: { fs, io} ;
89
910/// Configuration for LDK Server.
10- #[ derive( PartialEq , Eq , Debug ) ]
11+ #[ derive( Debug ) ]
1112pub struct Config {
1213 pub listening_addr : SocketAddress ,
1314 pub network : Network ,
@@ -18,6 +19,7 @@ pub struct Config {
1819 pub bitcoind_rpc_password : String ,
1920 pub rabbitmq_connection_string : String ,
2021 pub rabbitmq_exchange_name : String ,
22+ pub lsps2_service_config : Option < LSPS2ServiceConfig > ,
2123}
2224
2325impl TryFrom < TomlConfig > for Config {
@@ -61,6 +63,17 @@ impl TryFrom<TomlConfig> for Config {
6163 ( rabbitmq. connection_string , rabbitmq. exchange_name )
6264 } ;
6365
66+ #[ cfg( not( feature = "experimental-lsps2-support" ) ) ]
67+ let lsps2_service_config: Option < LSPS2ServiceConfig > = None ;
68+ #[ cfg( feature = "experimental-lsps2-support" ) ]
69+ let lsps2_service_config = Some ( toml_config. liquidity
70+ . and_then ( |l| l. lsps2_service )
71+ . ok_or_else ( || io:: Error :: new (
72+ io:: ErrorKind :: InvalidInput ,
73+ "`liquidity.lsps2_service` must be defined in config if enabling `experimental-lsps2-support` feature."
74+ ) ) ?
75+ . into ( ) ) ;
76+
6477 Ok ( Config {
6578 listening_addr,
6679 network : toml_config. node . network ,
@@ -71,6 +84,7 @@ impl TryFrom<TomlConfig> for Config {
7184 bitcoind_rpc_password : toml_config. bitcoind . rpc_password ,
7285 rabbitmq_connection_string,
7386 rabbitmq_exchange_name,
87+ lsps2_service_config,
7488 } )
7589 }
7690}
@@ -82,6 +96,7 @@ pub struct TomlConfig {
8296 storage : StorageConfig ,
8397 bitcoind : BitcoindConfig ,
8498 rabbitmq : Option < RabbitmqConfig > ,
99+ liquidity : Option < LiquidityConfig > ,
85100}
86101
87102#[ derive( Deserialize , Serialize ) ]
@@ -114,6 +129,52 @@ struct RabbitmqConfig {
114129 exchange_name : String ,
115130}
116131
132+ #[ derive( Deserialize , Serialize ) ]
133+ struct LiquidityConfig {
134+ lsps2_service : Option < LSPS2ServiceTomlConfig > ,
135+ }
136+
137+ #[ derive( Deserialize , Serialize , Debug ) ]
138+ struct LSPS2ServiceTomlConfig {
139+ advertise_service : bool ,
140+ channel_opening_fee_ppm : u32 ,
141+ channel_over_provisioning_ppm : u32 ,
142+ min_channel_opening_fee_msat : u64 ,
143+ min_channel_lifetime : u32 ,
144+ max_client_to_self_delay : u32 ,
145+ min_payment_size_msat : u64 ,
146+ max_payment_size_msat : u64 ,
147+ require_token : Option < String > ,
148+ }
149+
150+ impl Into < LSPS2ServiceConfig > for LSPS2ServiceTomlConfig {
151+ fn into ( self ) -> LSPS2ServiceConfig {
152+ match self {
153+ LSPS2ServiceTomlConfig {
154+ advertise_service,
155+ channel_opening_fee_ppm,
156+ channel_over_provisioning_ppm,
157+ min_channel_opening_fee_msat,
158+ min_channel_lifetime,
159+ max_client_to_self_delay,
160+ min_payment_size_msat,
161+ max_payment_size_msat,
162+ require_token,
163+ } => LSPS2ServiceConfig {
164+ advertise_service,
165+ channel_opening_fee_ppm,
166+ channel_over_provisioning_ppm,
167+ min_channel_opening_fee_msat,
168+ min_channel_lifetime,
169+ min_payment_size_msat,
170+ max_client_to_self_delay,
171+ max_payment_size_msat,
172+ require_token,
173+ } ,
174+ }
175+ }
176+ }
177+
117178/// Loads the configuration from a TOML file at the given path.
118179pub fn load_config < P : AsRef < Path > > ( config_path : P ) -> io:: Result < Config > {
119180 let file_contents = fs:: read_to_string ( config_path. as_ref ( ) ) . map_err ( |e| {
@@ -160,23 +221,54 @@ mod tests {
160221 [rabbitmq]
161222 connection_string = "rabbitmq_connection_string"
162223 exchange_name = "rabbitmq_exchange_name"
224+
225+ [liquidity.lsps2_service]
226+ advertise_service = false
227+ channel_opening_fee_ppm = 1000 # 0.1% fee
228+ channel_over_provisioning_ppm = 500000 # 50% extra capacity
229+ min_channel_opening_fee_msat = 10000000 # 10,000 satoshis
230+ min_channel_lifetime = 4320 # ~30 days
231+ max_client_to_self_delay = 1440 # ~10 days
232+ min_payment_size_msat = 10000000 # 10,000 satoshis
233+ max_payment_size_msat = 25000000000 # 0.25 BTC
163234 "# ;
164235
165236 fs:: write ( storage_path. join ( config_file_name) , toml_config) . unwrap ( ) ;
166237
167- assert_eq ! (
168- load_config( storage_path. join( config_file_name) ) . unwrap( ) ,
169- Config {
170- listening_addr: SocketAddress :: from_str( "localhost:3001" ) . unwrap( ) ,
171- network: Network :: Regtest ,
172- rest_service_addr: SocketAddr :: from_str( "127.0.0.1:3002" ) . unwrap( ) ,
173- storage_dir_path: "/tmp" . to_string( ) ,
174- bitcoind_rpc_addr: SocketAddr :: from_str( "127.0.0.1:8332" ) . unwrap( ) ,
175- bitcoind_rpc_user: "bitcoind-testuser" . to_string( ) ,
176- bitcoind_rpc_password: "bitcoind-testpassword" . to_string( ) ,
177- rabbitmq_connection_string: "rabbitmq_connection_string" . to_string( ) ,
178- rabbitmq_exchange_name: "rabbitmq_exchange_name" . to_string( ) ,
179- }
180- )
238+ let config = load_config ( storage_path. join ( config_file_name) ) . unwrap ( ) ;
239+ let expected = Config {
240+ listening_addr : SocketAddress :: from_str ( "localhost:3001" ) . unwrap ( ) ,
241+ network : Network :: Regtest ,
242+ rest_service_addr : SocketAddr :: from_str ( "127.0.0.1:3002" ) . unwrap ( ) ,
243+ storage_dir_path : "/tmp" . to_string ( ) ,
244+ bitcoind_rpc_addr : SocketAddr :: from_str ( "127.0.0.1:8332" ) . unwrap ( ) ,
245+ bitcoind_rpc_user : "bitcoind-testuser" . to_string ( ) ,
246+ bitcoind_rpc_password : "bitcoind-testpassword" . to_string ( ) ,
247+ rabbitmq_connection_string : "rabbitmq_connection_string" . to_string ( ) ,
248+ rabbitmq_exchange_name : "rabbitmq_exchange_name" . to_string ( ) ,
249+ lsps2_service_config : Some ( LSPS2ServiceConfig {
250+ require_token : None ,
251+ advertise_service : false ,
252+ channel_opening_fee_ppm : 1000 ,
253+ channel_over_provisioning_ppm : 500000 ,
254+ min_channel_opening_fee_msat : 10000000 ,
255+ min_channel_lifetime : 4320 ,
256+ max_client_to_self_delay : 1440 ,
257+ min_payment_size_msat : 10000000 ,
258+ max_payment_size_msat : 25000000000 ,
259+ } ) ,
260+ } ;
261+
262+ assert_eq ! ( config. listening_addr, expected. listening_addr) ;
263+ assert_eq ! ( config. network, expected. network) ;
264+ assert_eq ! ( config. rest_service_addr, expected. rest_service_addr) ;
265+ assert_eq ! ( config. storage_dir_path, expected. storage_dir_path) ;
266+ assert_eq ! ( config. bitcoind_rpc_addr, expected. bitcoind_rpc_addr) ;
267+ assert_eq ! ( config. bitcoind_rpc_user, expected. bitcoind_rpc_user) ;
268+ assert_eq ! ( config. bitcoind_rpc_password, expected. bitcoind_rpc_password) ;
269+ assert_eq ! ( config. rabbitmq_connection_string, expected. rabbitmq_connection_string) ;
270+ assert_eq ! ( config. rabbitmq_exchange_name, expected. rabbitmq_exchange_name) ;
271+ #[ cfg( feature = "experimental-lsps2-support" ) ]
272+ assert_eq ! ( config. lsps2_service_config. is_some( ) , expected. lsps2_service_config. is_some( ) ) ;
181273 }
182274}
0 commit comments