1
1
use ldk_node:: bitcoin:: Network ;
2
2
use ldk_node:: lightning:: ln:: msgs:: SocketAddress ;
3
+ use ldk_node:: liquidity:: LSPS2ServiceConfig ;
3
4
use serde:: { Deserialize , Serialize } ;
4
5
use std:: net:: SocketAddr ;
5
6
use std:: path:: Path ;
6
7
use std:: str:: FromStr ;
7
8
use std:: { fs, io} ;
8
9
9
10
/// Configuration for LDK Server.
10
- #[ derive( PartialEq , Eq , Debug ) ]
11
+ #[ derive( Debug ) ]
11
12
pub struct Config {
12
13
pub listening_addr : SocketAddress ,
13
14
pub network : Network ,
@@ -18,6 +19,7 @@ pub struct Config {
18
19
pub bitcoind_rpc_password : String ,
19
20
pub rabbitmq_connection_string : String ,
20
21
pub rabbitmq_exchange_name : String ,
22
+ pub lsps2_service_config : Option < LSPS2ServiceConfig > ,
21
23
}
22
24
23
25
impl TryFrom < TomlConfig > for Config {
@@ -61,6 +63,17 @@ impl TryFrom<TomlConfig> for Config {
61
63
( rabbitmq. connection_string , rabbitmq. exchange_name )
62
64
} ;
63
65
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
+
64
77
Ok ( Config {
65
78
listening_addr,
66
79
network : toml_config. node . network ,
@@ -71,6 +84,7 @@ impl TryFrom<TomlConfig> for Config {
71
84
bitcoind_rpc_password : toml_config. bitcoind . rpc_password ,
72
85
rabbitmq_connection_string,
73
86
rabbitmq_exchange_name,
87
+ lsps2_service_config,
74
88
} )
75
89
}
76
90
}
@@ -82,6 +96,7 @@ pub struct TomlConfig {
82
96
storage : StorageConfig ,
83
97
bitcoind : BitcoindConfig ,
84
98
rabbitmq : Option < RabbitmqConfig > ,
99
+ liquidity : Option < LiquidityConfig > ,
85
100
}
86
101
87
102
#[ derive( Deserialize , Serialize ) ]
@@ -114,6 +129,52 @@ struct RabbitmqConfig {
114
129
exchange_name : String ,
115
130
}
116
131
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
+
117
178
/// Loads the configuration from a TOML file at the given path.
118
179
pub fn load_config < P : AsRef < Path > > ( config_path : P ) -> io:: Result < Config > {
119
180
let file_contents = fs:: read_to_string ( config_path. as_ref ( ) ) . map_err ( |e| {
@@ -160,23 +221,54 @@ mod tests {
160
221
[rabbitmq]
161
222
connection_string = "rabbitmq_connection_string"
162
223
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
163
234
"# ;
164
235
165
236
fs:: write ( storage_path. join ( config_file_name) , toml_config) . unwrap ( ) ;
166
237
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( ) ) ;
181
273
}
182
274
}
0 commit comments