Skip to main content

cdk_mintd/env_vars/
cln.rs

1//! CLN environment variables
2
3use std::env;
4use std::path::PathBuf;
5
6use crate::config::Cln;
7
8// CLN environment variables
9pub const ENV_CLN_RPC_PATH: &str = "CDK_MINTD_CLN_RPC_PATH";
10pub const ENV_CLN_BOLT12: &str = "CDK_MINTD_CLN_BOLT12";
11pub const ENV_CLN_FEE_PERCENT: &str = "CDK_MINTD_CLN_FEE_PERCENT";
12pub const ENV_CLN_RESERVE_FEE_MIN: &str = "CDK_MINTD_CLN_RESERVE_FEE_MIN";
13pub const ENV_CLN_EXPOSE_PRIVATE_CHANNELS: &str = "CDK_MINTD_CLN_EXPOSE_PRIVATE_CHANNELS";
14
15impl Cln {
16    pub fn from_env(mut self) -> Self {
17        // RPC Path
18        if let Ok(path) = env::var(ENV_CLN_RPC_PATH) {
19            self.rpc_path = PathBuf::from(path);
20        }
21
22        // BOLT12 flag
23        if let Ok(bolt12_str) = env::var(ENV_CLN_BOLT12) {
24            if let Ok(bolt12) = bolt12_str.parse() {
25                self.bolt12 = bolt12;
26            }
27        }
28
29        // Expose private channels
30        if let Ok(expose_str) = env::var(ENV_CLN_EXPOSE_PRIVATE_CHANNELS) {
31            if let Ok(expose) = expose_str.parse() {
32                self.expose_private_channels = expose;
33            }
34        }
35
36        // Fee percent
37        if let Ok(fee_str) = env::var(ENV_CLN_FEE_PERCENT) {
38            if let Ok(fee) = fee_str.parse() {
39                self.fee_percent = fee;
40            }
41        }
42
43        // Reserve fee minimum
44        if let Ok(reserve_fee_str) = env::var(ENV_CLN_RESERVE_FEE_MIN) {
45            if let Ok(reserve_fee) = reserve_fee_str.parse::<u64>() {
46                self.reserve_fee_min = reserve_fee.into();
47            }
48        }
49
50        self
51    }
52}
53
54#[cfg(all(test, feature = "sqlite"))]
55mod tests {
56    use std::path::{Path, PathBuf};
57    use std::sync::Arc;
58
59    use cdk::cdk_payment::MintPayment;
60    use cdk::nuts::CurrencyUnit;
61    use cdk_sqlite::mint::memory;
62
63    use super::*;
64    use crate::config::Settings;
65    use crate::setup::PaymentBackendSetup;
66
67    #[tokio::test]
68    async fn bolt12_false_removes_bolt12_from_cln_capabilities() {
69        let config = {
70            let _guard = crate::test_utils::env_lock();
71            let previous_bolt12 = std::env::var_os(ENV_CLN_BOLT12);
72            std::env::set_var(ENV_CLN_BOLT12, "false");
73
74            let config = Cln {
75                rpc_path: PathBuf::from("/nonexistent/lightning-rpc"),
76                ..Default::default()
77            }
78            .from_env();
79
80            match previous_bolt12 {
81                Some(value) => std::env::set_var(ENV_CLN_BOLT12, value),
82                None => std::env::remove_var(ENV_CLN_BOLT12),
83            }
84
85            config
86        };
87        assert!(!config.bolt12, "the environment override must be applied");
88
89        let kv_store = Arc::new(memory::empty().await.expect("in-memory database"));
90        let backend = config
91            .setup(
92                &Settings::default(),
93                CurrencyUnit::Sat,
94                None,
95                Path::new("."),
96                Some(kv_store),
97            )
98            .await
99            .expect("CLN setup does not connect eagerly");
100
101        let capabilities = backend.get_settings().await.expect("CLN capabilities");
102        assert!(
103            capabilities.bolt12.is_none(),
104            "CDK_MINTD_CLN_BOLT12=false must disable BOLT12 capabilities"
105        );
106    }
107}