fedimint_gateway_server/
config.rs1use std::net::SocketAddr;
2use std::path::PathBuf;
3use std::str::FromStr;
4
5use bitcoin::Network;
6use clap::{ArgGroup, Parser};
7use fedimint_core::util::SafeUrl;
8use fedimint_gateway_common::{LightningMode, V1_API_ENDPOINT};
9use fedimint_lnv2_common::gateway_api::PaymentFee;
10
11use super::envs;
12use crate::envs::{
13 FM_BITCOIND_PASSWORD_ENV, FM_BITCOIND_URL_ENV, FM_BITCOIND_USERNAME_ENV, FM_ESPLORA_URL_ENV,
14};
15
16#[derive(Debug, Clone, Copy, clap::ValueEnum)]
17pub enum DatabaseBackend {
18 #[value(name = "rocksdb")]
20 RocksDb,
21 #[value(name = "cursed-redb")]
23 CursedRedb,
24}
25
26#[derive(Parser)]
29#[command(version)]
30#[command(
31 group(
32 ArgGroup::new("bitcoind_password_auth")
33 .args(["bitcoind_password"])
34 .multiple(false)
35 ),
36 group(
37 ArgGroup::new("bitcoind_auth")
38 .args(["bitcoind_url"])
39 .requires("bitcoind_password_auth")
40 .requires_all(["bitcoind_username", "bitcoind_url"])
41 ),
42 group(
43 ArgGroup::new("bitcoin_rpc")
44 .required(true)
45 .multiple(true)
46 .args(["bitcoind_url", "esplora_url"])
47 )
48)]
49pub struct GatewayOpts {
50 #[clap(subcommand)]
51 pub mode: LightningMode,
52
53 #[arg(long = "data-dir", env = envs::FM_GATEWAY_DATA_DIR_ENV)]
55 pub data_dir: PathBuf,
56
57 #[arg(long = "listen", env = envs::FM_GATEWAY_LISTEN_ADDR_ENV)]
59 listen: SocketAddr,
60
61 #[arg(long = "api-addr", env = envs::FM_GATEWAY_API_ADDR_ENV)]
63 api_addr: SafeUrl,
64
65 #[arg(long = "bcrypt-password-hash", env = envs::FM_GATEWAY_BCRYPT_PASSWORD_HASH_ENV)]
67 bcrypt_password_hash: String,
68
69 #[arg(long = "network", env = envs::FM_GATEWAY_NETWORK_ENV)]
71 network: Network,
72
73 #[arg(
75 long = "num-route-hints",
76 env = envs::FM_NUMBER_OF_ROUTE_HINTS_ENV,
77 default_value_t = super::DEFAULT_NUM_ROUTE_HINTS
78 )]
79 num_route_hints: u32,
80
81 #[arg(long, env = envs::FM_DB_BACKEND_ENV, value_enum, default_value = "rocksdb")]
83 pub db_backend: DatabaseBackend,
84
85 #[arg(long, env = FM_BITCOIND_USERNAME_ENV)]
87 pub bitcoind_username: Option<String>,
88
89 #[arg(long, env = FM_BITCOIND_PASSWORD_ENV)]
91 pub bitcoind_password: Option<String>,
92
93 #[arg(long, env = FM_BITCOIND_URL_ENV)]
97 pub bitcoind_url: Option<SafeUrl>,
98
99 #[arg(long, env = FM_ESPLORA_URL_ENV)]
101 pub esplora_url: Option<SafeUrl>,
102
103 #[arg(long = "default-routing-fees", env = envs::FM_DEFAULT_ROUTING_FEES_ENV, default_value_t = PaymentFee::TRANSACTION_FEE_DEFAULT)]
105 default_routing_fees: PaymentFee,
106
107 #[arg(long = "default-transaction-fees", env = envs::FM_DEFAULT_TRANSACTION_FEES_ENV, default_value_t = PaymentFee::TRANSACTION_FEE_DEFAULT)]
109 default_transaction_fees: PaymentFee,
110}
111
112impl GatewayOpts {
113 pub fn to_gateway_parameters(&self) -> anyhow::Result<GatewayParameters> {
116 let versioned_api = self.api_addr.join(V1_API_ENDPOINT).map_err(|e| {
117 anyhow::anyhow!(
118 "Failed to version gateway API address: {api_addr:?}, error: {e:?}",
119 api_addr = self.api_addr,
120 )
121 })?;
122
123 let bcrypt_password_hash = bcrypt::HashParts::from_str(&self.bcrypt_password_hash)?;
124
125 Ok(GatewayParameters {
126 listen: self.listen,
127 versioned_api,
128 bcrypt_password_hash,
129 network: self.network,
130 num_route_hints: self.num_route_hints,
131 default_routing_fees: self.default_routing_fees,
132 default_transaction_fees: self.default_transaction_fees,
133 })
134 }
135}
136
137#[derive(Debug)]
144pub struct GatewayParameters {
145 pub listen: SocketAddr,
146 pub versioned_api: SafeUrl,
147 pub bcrypt_password_hash: bcrypt::HashParts,
148 pub network: Network,
149 pub num_route_hints: u32,
150 pub default_routing_fees: PaymentFee,
151 pub default_transaction_fees: PaymentFee,
152}