diff --git a/crates/cdk-integration-tests/src/bin/start_regtest_mints.rs b/crates/cdk-integration-tests/src/bin/start_regtest_mints.rs index 154db6139..9fd3d80a7 100644 --- a/crates/cdk-integration-tests/src/bin/start_regtest_mints.rs +++ b/crates/cdk-integration-tests/src/bin/start_regtest_mints.rs @@ -280,25 +280,37 @@ fn create_ldk_settings( logging: LoggingConfig::default(), }, mint_info: cdk_mintd::config::MintInfo::default(), - ln: cdk_mintd::config::Ln { - ln_backend: cdk_mintd::config::LnBackend::LdkNode, + payment_backend: cdk_mintd::config::PaymentBackend { + kind: cdk_mintd::config::PaymentBackendKind::LdkNode, invoice_description: None, min_mint: 1.into(), max_mint: 500_000.into(), min_melt: 1.into(), max_melt: 500_000.into(), + ldk_node: Some(ldk_config.clone()), + ..Default::default() }, + database: cdk_mintd::config::Database::default(), + auth_database: None, + mint_management_rpc: None, + prometheus: None, + auth: None, cln: None, lnbits: None, lnd: None, ldk_node: Some(ldk_config), fake_wallet: None, grpc_processor: None, - database: cdk_mintd::config::Database::default(), - auth_database: None, - mint_management_rpc: None, - prometheus: None, - auth: None, + using_deprecated_config: None, + ln: cdk_mintd::config::PaymentBackend { + ln_backend: cdk_mintd::config::PaymentBackendKind::LdkNode, + invoice_description: None, + min_mint: 1.into(), + max_mint: 500_000.into(), + min_melt: 1.into(), + max_melt: 500_000.into(), + ..Default::default() + }, } } diff --git a/crates/cdk-integration-tests/src/shared.rs b/crates/cdk-integration-tests/src/shared.rs index fe9d0afe4..d36480f01 100644 --- a/crates/cdk-integration-tests/src/shared.rs +++ b/crates/cdk-integration-tests/src/shared.rs @@ -201,20 +201,21 @@ pub fn create_fake_wallet_settings( enable_swagger_ui: None, }, mint_info: cdk_mintd::config::MintInfo::default(), - ln: cdk_mintd::config::Ln { - ln_backend: cdk_mintd::config::LnBackend::FakeWallet, + payment_backend: cdk_mintd::config::PaymentBackend { + kind: cdk_mintd::config::PaymentBackendKind::FakeWallet, + ln_backend: cdk_mintd::config::PaymentBackendKind::None, invoice_description: None, min_mint: DEFAULT_MIN_MINT.into(), max_mint: DEFAULT_MAX_MINT.into(), min_melt: DEFAULT_MIN_MELT.into(), max_melt: DEFAULT_MAX_MELT.into(), + fake_wallet: fake_wallet_config, + cln: None, + lnd: None, + lnbits: None, + ldk_node: None, + grpc_processor: None, }, - cln: None, - lnbits: None, - lnd: None, - ldk_node: None, - fake_wallet: fake_wallet_config, - grpc_processor: None, database: Database { engine: DatabaseEngine::from_str(database).expect("valid database"), postgres: None, @@ -223,6 +224,22 @@ pub fn create_fake_wallet_settings( mint_management_rpc: None, auth: None, prometheus: Some(Default::default()), + cln: None, + lnbits: None, + lnd: None, + ldk_node: None, + fake_wallet: None, + grpc_processor: None, + using_deprecated_config: None, + ln: cdk_mintd::config::PaymentBackend { + ln_backend: cdk_mintd::config::PaymentBackendKind::LdkNode, + invoice_description: None, + min_mint: 1.into(), + max_mint: 500_000.into(), + min_melt: 1.into(), + max_melt: 500_000.into(), + ..Default::default() + }, } } @@ -254,25 +271,37 @@ pub fn create_cln_settings( enable_swagger_ui: None, }, mint_info: cdk_mintd::config::MintInfo::default(), - ln: cdk_mintd::config::Ln { - ln_backend: cdk_mintd::config::LnBackend::Cln, + payment_backend: cdk_mintd::config::PaymentBackend { + kind: cdk_mintd::config::PaymentBackendKind::Cln, invoice_description: None, min_mint: DEFAULT_MIN_MINT.into(), max_mint: DEFAULT_MAX_MINT.into(), min_melt: DEFAULT_MIN_MELT.into(), max_melt: DEFAULT_MAX_MELT.into(), + cln: Some(cln_config.clone()), + ..Default::default() }, - cln: Some(cln_config), - lnbits: None, - lnd: None, - ldk_node: None, - fake_wallet: None, - grpc_processor: None, database: cdk_mintd::config::Database::default(), auth_database: None, mint_management_rpc: None, auth: None, prometheus: Some(Default::default()), + cln: None, + lnbits: None, + lnd: None, + ldk_node: None, + fake_wallet: None, + grpc_processor: None, + using_deprecated_config: None, + ln: cdk_mintd::config::PaymentBackend { + ln_backend: cdk_mintd::config::PaymentBackendKind::LdkNode, + invoice_description: None, + min_mint: 1.into(), + max_mint: 500_000.into(), + min_melt: 1.into(), + max_melt: 500_000.into(), + ..Default::default() + }, } } @@ -302,24 +331,36 @@ pub fn create_lnd_settings( enable_swagger_ui: None, }, mint_info: cdk_mintd::config::MintInfo::default(), - ln: cdk_mintd::config::Ln { - ln_backend: cdk_mintd::config::LnBackend::Lnd, + payment_backend: cdk_mintd::config::PaymentBackend { + kind: cdk_mintd::config::PaymentBackendKind::Lnd, invoice_description: None, min_mint: DEFAULT_MIN_MINT.into(), max_mint: DEFAULT_MAX_MINT.into(), min_melt: DEFAULT_MIN_MELT.into(), max_melt: DEFAULT_MAX_MELT.into(), + lnd: Some(lnd_config), + ..Default::default() }, - cln: None, - lnbits: None, - ldk_node: None, - lnd: Some(lnd_config), - fake_wallet: None, - grpc_processor: None, database: cdk_mintd::config::Database::default(), auth_database: None, mint_management_rpc: None, auth: None, prometheus: Some(Default::default()), + cln: None, + lnbits: None, + lnd: None, + ldk_node: None, + fake_wallet: None, + grpc_processor: None, + using_deprecated_config: None, + ln: cdk_mintd::config::PaymentBackend { + ln_backend: cdk_mintd::config::PaymentBackendKind::LdkNode, + invoice_description: None, + min_mint: 1.into(), + max_mint: 500_000.into(), + min_melt: 1.into(), + max_melt: 500_000.into(), + ..Default::default() + }, } } diff --git a/crates/cdk-integration-tests/tests/happy_path_mint_wallet.rs b/crates/cdk-integration-tests/tests/happy_path_mint_wallet.rs index 2612d13e9..c3303a9ce 100644 --- a/crates/cdk-integration-tests/tests/happy_path_mint_wallet.rs +++ b/crates/cdk-integration-tests/tests/happy_path_mint_wallet.rs @@ -583,12 +583,12 @@ async fn test_fake_melt_change_in_quote() { #[tokio::test(flavor = "multi_thread", worker_threads = 1)] async fn test_pay_invoice_twice() { - let ln_backend = match env::var("LN_BACKEND") { + let payment_backend = match env::var("PAYMENT_BACKEND") { Ok(val) => Some(val), - Err(_) => env::var("CDK_MINTD_LN_BACKEND").ok(), + Err(_) => env::var("CDK_MINTD_PAYMENT_BACKEND").ok(), }; - if ln_backend.map(|ln| ln.to_uppercase()) == Some("FAKEWALLET".to_string()) { + if payment_backend.map(|ln| ln.to_uppercase()) == Some("FAKEWALLET".to_string()) { // We can only perform this test on regtest backends as fake wallet just marks the quote as paid return; } diff --git a/crates/cdk-ldk-node/NETWORK_GUIDE.md b/crates/cdk-ldk-node/NETWORK_GUIDE.md index 50488db4c..9eb3cdcdc 100644 --- a/crates/cdk-ldk-node/NETWORK_GUIDE.md +++ b/crates/cdk-ldk-node/NETWORK_GUIDE.md @@ -26,10 +26,10 @@ listen_port = 8085 [database] engine = "sqlite" -[ln] -ln_backend = "ldk-node" +[payment_backend] +kind = "ldk-node" -[ldk_node] +[payment_backend.ldk_node] bitcoin_network = "signet" chain_source_type = "esplora" esplora_url = "https://mutinynet.com/api" @@ -42,7 +42,7 @@ webserver_port = 8091 ### Environment Variables ```bash -export CDK_MINTD_LN_BACKEND="ldk-node" +export CDK_MINTD_PAYMENT_BACKEND="ldk-node" export CDK_MINTD_LDK_NODE_BITCOIN_NETWORK="signet" export CDK_MINTD_LDK_NODE_ESPLORA_URL="https://mutinynet.com/api" export CDK_MINTD_LDK_NODE_RGS_URL="https://rgs.mutinynet.com/snapshot/0" @@ -59,10 +59,10 @@ cdk-mintd ## Bitcoin Testnet ```toml -[ln] -ln_backend = "ldk-node" +[payment_backend] +kind = "ldk-node" -[ldk_node] +[payment_backend.ldk_node] bitcoin_network = "testnet" esplora_url = "https://blockstream.info/testnet/api" rgs_url = "https://rapidsync.lightningdevkit.org/snapshot" @@ -77,10 +77,10 @@ storage_dir_path = "~/.cdk-ldk-node/testnet" ⚠️ **WARNING**: Uses real Bitcoin! ```toml -[ln] -ln_backend = "ldk-node" +[payment_backend] +kind = "ldk-node" -[ldk_node] +[payment_backend.ldk_node] bitcoin_network = "mainnet" esplora_url = "https://blockstream.info/api" rgs_url = "https://rapidsync.lightningdevkit.org/snapshot" @@ -104,10 +104,10 @@ webserver_port = 8091 ## Regtest (Development) ```toml -[ln] -ln_backend = "ldk-node" +[payment_backend] +kind = "ldk-node" -[ldk_node] +[payment_backend.ldk_node] bitcoin_network = "regtest" chain_source_type = "bitcoinrpc" bitcoind_rpc_host = "127.0.0.1" @@ -128,7 +128,7 @@ For complete regtest environment: `just regtest` (see [REGTEST_GUIDE.md](../../R docker run -d \ --name cdk-mintd \ -p 8085:8085 -p 8091:8091 \ - -e CDK_MINTD_LN_BACKEND=ldk-node \ + -e CDK_MINTD_PAYMENT_BACKEND=ldk-node \ -e CDK_MINTD_LDK_NODE_BITCOIN_NETWORK=signet \ -e CDK_MINTD_LDK_NODE_ESPLORA_URL=https://mutinynet.com/api \ -e CDK_MINTD_LDK_NODE_RGS_URL=https://rgs.mutinynet.com/snapshot/0 \ @@ -140,7 +140,7 @@ docker run -d \ --name cdk-mintd \ -p 8085:8085 \ --network host \ - -e CDK_MINTD_LN_BACKEND=ldk-node \ + -e CDK_MINTD_PAYMENT_BACKEND=ldk-node \ -e CDK_MINTD_LDK_NODE_BITCOIN_NETWORK=mainnet \ -e CDK_MINTD_LDK_NODE_WEBSERVER_HOST=127.0.0.1 \ cashubtc/cdk-mintd:latest diff --git a/crates/cdk-ldk-node/README.md b/crates/cdk-ldk-node/README.md index db7dcaa0c..525bdf28c 100644 --- a/crates/cdk-ldk-node/README.md +++ b/crates/cdk-ldk-node/README.md @@ -17,7 +17,7 @@ CDK lightning backend for ldk-node, providing Lightning Network functionality fo ```bash # Using environment variables (simplest) -export CDK_MINTD_LN_BACKEND="ldk-node" +export CDK_MINTD_PAYMENT_BACKEND="ldk-node" export CDK_MINTD_LDK_NODE_BITCOIN_NETWORK="signet" export CDK_MINTD_LDK_NODE_ESPLORA_URL="https://mutinynet.com/api" export CDK_MINTD_LDK_NODE_RGS_URL="https://rgs.mutinynet.com/snapshot/0" @@ -62,10 +62,10 @@ Or via environment variables: ### Config File Example ```toml -[ln] -ln_backend = "ldk-node" +[payment_backend] +kind = "ldk-node" -[ldk_node] +[payment_backend.ldk_node] bitcoin_network = "signet" # mainnet, testnet, signet, regtest esplora_url = "https://mutinynet.com/api" rgs_url = "https://rgs.mutinynet.com/snapshot/0" diff --git a/crates/cdk-mintd/Cargo.toml b/crates/cdk-mintd/Cargo.toml index ae83b7515..b0ee86936 100644 --- a/crates/cdk-mintd/Cargo.toml +++ b/crates/cdk-mintd/Cargo.toml @@ -61,6 +61,7 @@ tracing-subscriber.workspace = true tracing-appender.workspace = true futures.workspace = true serde.workspace = true +serde_json.workspace = true bip39.workspace = true tower-http = { workspace = true, features = ["compression-full", "decompression-full"] } tower.workspace = true diff --git a/crates/cdk-mintd/README.md b/crates/cdk-mintd/README.md index f42bf0847..6afdbff30 100644 --- a/crates/cdk-mintd/README.md +++ b/crates/cdk-mintd/README.md @@ -80,7 +80,7 @@ cdk-mintd --work-dir /my/custom/path **Environment variables only**: ```bash export CDK_MINTD_LISTEN_PORT=3000 -export CDK_MINTD_LN_BACKEND=fakewallet +export CDK_MINTD_PAYMENT_BACKEND=fakewallet export CDK_MINTD_DATABASE=sqlite cdk-mintd ``` @@ -89,10 +89,10 @@ cdk-mintd ### With LDK Node (Recommended for Testing) ```toml -[ln] -ln_backend = "ldk-node" +[payment_backend] +kind = "ldk-node" -[ldk_node] +[payment_backend.ldk_node] bitcoin_network = "signet" # Use "mainnet" for production esplora_url = "https://mutinynet.com/api" rgs_url = "https://rgs.mutinynet.com/snapshot/0" @@ -103,10 +103,10 @@ storage_dir_path = "/var/lib/cdk-mintd/ldk-node" ### With CLN Lightning Backend ```toml -[ln] -ln_backend = "cln" +[payment_backend] +kind = "cln" -[cln] +[payment_backend.cln] rpc_path = "/home/bitcoin/.lightning/bitcoin/lightning-rpc" # fee_percent = 0.02 # Optional, defaults to 2% # reserve_fee_min = 2 # Optional, defaults to 2 sats @@ -114,10 +114,10 @@ rpc_path = "/home/bitcoin/.lightning/bitcoin/lightning-rpc" ### With LND Lightning Backend ```toml -[ln] -ln_backend = "lnd" +[payment_backend] +kind = "lnd" -[lnd] +[payment_backend.lnd] address = "https://localhost:10009" macaroon_file = "/home/bitcoin/.lnd/data/chain/bitcoin/mainnet/admin.macaroon" cert_file = "/home/bitcoin/.lnd/tls.cert" @@ -190,7 +190,7 @@ All configuration can be done through environment variables: ```yaml environment: - - CDK_MINTD_LN_BACKEND=ldk-node + - CDK_MINTD_PAYMENT_BACKEND=ldk-node - CDK_MINTD_DATABASE=sqlite - CDK_MINTD_LISTEN_HOST=0.0.0.0 - CDK_MINTD_LISTEN_PORT=8085 @@ -250,7 +250,7 @@ cdk-mintd --help - `CDK_MINTD_DATABASE`: Database engine (`sqlite`/`postgres`/`redb`) - `CDK_MINTD_DATABASE_URL`: PostgreSQL connection string -- `CDK_MINTD_LN_BACKEND`: Lightning backend (`cln`/`lnd`/`lnbits`/`ldk-node`/`fakewallet`) +- `CDK_MINTD_PAYMENT_BACKEND`: Lightning backend (`cln`/`lnd`/`lnbits`/`ldk-node`/`fakewallet`) - `CDK_MINTD_LISTEN_HOST`: Host to bind to (default: `127.0.0.1`) - `CDK_MINTD_LISTEN_PORT`: Port to bind to (default: `8085`) diff --git a/crates/cdk-mintd/example.config.toml b/crates/cdk-mintd/example.config.toml index 0fcc86fef..1e3bfc80f 100644 --- a/crates/cdk-mintd/example.config.toml +++ b/crates/cdk-mintd/example.config.toml @@ -86,21 +86,21 @@ max_connections = 20 # Connection timeout in seconds (optional, defaults to 10) connection_timeout_seconds = 10 -[ln] -# Required ln backend `cln`, `lnd`, `fakewallet`, 'lnbits', 'ldknode' -ln_backend = "fakewallet" +[payment_backend] +# Required ln backend `cln`, `lnd`, `fake_wallet`, 'lnbits', 'ldknode' +kind = "fake_wallet" # min_mint=1 # max_mint=500000 # min_melt=1 # max_melt=500000 -# [cln] +# [payment_backend.cln] # rpc_path = "/path/to/.lightning/bitcoin/lightning-rpc" # bolt12 = true # Optional, defaults to true # fee_percent = 0.02 # Optional, defaults to 2% # reserve_fee_min = 2 # Optional, defaults to 2 sats -# [lnbits] +# [payment_backend.lnbits] # admin_api_key = "" # invoice_api_key = "" # lnbits_api = "" @@ -108,14 +108,14 @@ ln_backend = "fakewallet" # reserve_fee_min = 2 # Optional, defaults to 2 sats # Note: Only LNBits v1 API is supported (websocket-based) -# [lnd] +# [payment_backend.lnd] # address = "https://localhost:10009" # cert_file = "/path/to/.lnd/tls.cert" # macaroon_file = "/path/to/.lnd/data/chain/bitcoin/mainnet/admin.macaroon" # fee_percent = 0.02 # Optional, defaults to 2% # reserve_fee_min = 2 # Optional, defaults to 2 sats -# [ldk_node] +# [payment_backend.ldk_node] # fee_percent = 0.02 # Optional, defaults to 2% # reserve_fee_min = 2 # Optional, defaults to 2 sats # bitcoin_network = "signet" # mainnet, testnet, signet, regtest @@ -156,14 +156,14 @@ ln_backend = "fakewallet" # webserver_host = "127.0.0.1" # Default: 127.0.0.1 # webserver_port = 0 # 0 = auto-assign available port -[fake_wallet] +[payment_backend.fake_wallet] supported_units = ["sat"] fee_percent = 0.02 reserve_fee_min = 1 min_delay_time = 1 max_delay_time = 3 -# [grpc_processor] +# [payment_backend.grpc_processor] # gRPC Payment Processor configuration # supported_units = ["sat"] # addr = "127.0.0.1" diff --git a/crates/cdk-mintd/src/config.rs b/crates/cdk-mintd/src/config.rs index b0d73dc46..17f08ac6f 100644 --- a/crates/cdk-mintd/src/config.rs +++ b/crates/cdk-mintd/src/config.rs @@ -5,7 +5,7 @@ use cdk::nuts::{CurrencyUnit, PublicKey}; use cdk::Amount; use cdk_axum::cache; use cdk_common::common::QuoteTTL; -use config::{Config, ConfigError, File}; +use config::{Config, ConfigError}; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)] @@ -123,7 +123,7 @@ impl std::fmt::Debug for Info { #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)] #[serde(rename_all = "lowercase")] -pub enum LnBackend { +pub enum PaymentBackendKind { #[default] None, #[cfg(feature = "cln")] @@ -131,56 +131,92 @@ pub enum LnBackend { #[cfg(feature = "lnbits")] LNbits, #[cfg(feature = "fakewallet")] + #[serde(alias = "fake_wallet")] FakeWallet, #[cfg(feature = "lnd")] Lnd, #[cfg(feature = "ldk-node")] + #[serde(alias = "ldk_node", alias = "ldk-node")] LdkNode, #[cfg(feature = "grpc-processor")] + #[serde(alias = "grpc_processor", alias = "grpc-processor")] GrpcProcessor, } -impl std::str::FromStr for LnBackend { +impl std::str::FromStr for PaymentBackendKind { type Err = String; fn from_str(s: &str) -> Result { match s.to_lowercase().as_str() { #[cfg(feature = "cln")] - "cln" => Ok(LnBackend::Cln), + "cln" => Ok(PaymentBackendKind::Cln), #[cfg(feature = "lnbits")] - "lnbits" => Ok(LnBackend::LNbits), + "lnbits" => Ok(PaymentBackendKind::LNbits), #[cfg(feature = "fakewallet")] - "fakewallet" => Ok(LnBackend::FakeWallet), + "fakewallet" | "fake_wallet" => Ok(PaymentBackendKind::FakeWallet), #[cfg(feature = "lnd")] - "lnd" => Ok(LnBackend::Lnd), + "lnd" => Ok(PaymentBackendKind::Lnd), #[cfg(feature = "ldk-node")] - "ldk-node" | "ldknode" => Ok(LnBackend::LdkNode), + "ldk-node" | "ldknode" | "ldk_node" => Ok(PaymentBackendKind::LdkNode), #[cfg(feature = "grpc-processor")] - "grpcprocessor" => Ok(LnBackend::GrpcProcessor), + "grpcprocessor" | "grpc-processor" | "grpc_processor" => { + Ok(PaymentBackendKind::GrpcProcessor) + } _ => Err(format!("Unknown Lightning backend: {s}")), } } } #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Ln { - pub ln_backend: LnBackend, +pub struct PaymentBackend { + /// deprecated -- do not use this + pub ln_backend: PaymentBackendKind, + pub kind: PaymentBackendKind, pub invoice_description: Option, pub min_mint: Amount, pub max_mint: Amount, pub min_melt: Amount, pub max_melt: Amount, + #[cfg(feature = "cln")] + pub cln: Option, + #[cfg(feature = "lnbits")] + pub lnbits: Option, + #[cfg(feature = "lnd")] + pub lnd: Option, + #[cfg(feature = "ldk-node")] + pub ldk_node: Option, + #[cfg(feature = "fakewallet")] + #[serde(rename = "fake_wallet", alias = "fakewallet")] + pub fake_wallet: Option, + #[serde( + rename = "grpc_processor", + alias = "grpcprocessor", + alias = "grpc-processor" + )] + pub grpc_processor: Option, } -impl Default for Ln { +impl Default for PaymentBackend { fn default() -> Self { - Ln { - ln_backend: LnBackend::default(), + PaymentBackend { + kind: PaymentBackendKind::default(), + ln_backend: PaymentBackendKind::default(), invoice_description: None, min_mint: 1.into(), max_mint: 500_000.into(), min_melt: 1.into(), max_melt: 500_000.into(), + #[cfg(feature = "cln")] + cln: None, + #[cfg(feature = "lnd")] + lnd: None, + #[cfg(feature = "fakewallet")] + fake_wallet: None, + #[cfg(feature = "lnbits")] + lnbits: None, + #[cfg(feature = "ldk-node")] + ldk_node: None, + grpc_processor: None, } } } @@ -552,18 +588,29 @@ fn default_blind() -> AuthType { pub struct Settings { pub info: Info, pub mint_info: MintInfo, - pub ln: Ln, + /// deprecated -- please do not use this + pub ln: PaymentBackend, #[cfg(feature = "cln")] + /// deprecated -- please do not use this pub cln: Option, #[cfg(feature = "lnbits")] + /// deprecated -- please do not use this pub lnbits: Option, #[cfg(feature = "lnd")] + /// deprecated -- please do not use this pub lnd: Option, #[cfg(feature = "ldk-node")] + /// deprecated -- please do not use this pub ldk_node: Option, #[cfg(feature = "fakewallet")] + /// deprecated -- please do not use this pub fake_wallet: Option, + /// deprecated -- please do not use this pub grpc_processor: Option, + /// deprecated -- please do not use this + pub using_deprecated_config: Option, + + pub payment_backend: PaymentBackend, pub database: Database, #[cfg(feature = "auth")] pub auth_database: Option, @@ -628,8 +675,9 @@ impl Settings { Ok(f) => f, Err(e) => { tracing::error!( - "Error reading config file, falling back to defaults. Error: {e:?}" + "Error reading config f ile, falling back to defaults. Error: {e:?}" ); + eprintln!("[mintd] Failed to load config file: {}", e); default_settings } } @@ -651,12 +699,13 @@ impl Settings { Some(value) => value.into().to_string_lossy().to_string(), None => default_config_file_name.to_string_lossy().to_string(), }; + let builder = Config::builder(); let config: Config = builder // use defaults .add_source(Config::try_from(default)?) // override with file contents - .add_source(File::with_name(&config)) + .add_source(config::File::from(std::path::Path::new(&config))) .build()?; let settings: Settings = config.try_deserialize()?; @@ -782,7 +831,7 @@ max_melt = 500000 fs::write(&config_path, config_content).expect("Failed to write config file"); // Set environment variables for LND configuration - env::set_var(crate::env_vars::ENV_LN_BACKEND, "lnd"); + env::set_var(crate::env_vars::ENV_PAYMENT_BACKEND, "lnd"); env::set_var(crate::env_vars::ENV_LND_ADDRESS, "https://localhost:10009"); env::set_var(crate::env_vars::ENV_LND_CERT_FILE, "/tmp/test_tls.cert"); env::set_var( @@ -797,8 +846,8 @@ max_melt = 500000 settings.from_env().expect("Failed to apply env vars"); // Verify that settings were populated from env vars - assert!(settings.lnd.is_some()); - let lnd_config = settings.lnd.as_ref().unwrap(); + assert!(settings.payment_backend.lnd.is_some()); + let lnd_config = settings.payment_backend.lnd.as_ref().unwrap(); assert_eq!(lnd_config.address, "https://localhost:10009"); assert_eq!(lnd_config.cert_file, PathBuf::from("/tmp/test_tls.cert")); assert_eq!( @@ -810,7 +859,7 @@ max_melt = 500000 assert_eq!(reserve_fee_u64, 4); // Cleanup env vars - env::remove_var(crate::env_vars::ENV_LN_BACKEND); + env::remove_var(crate::env_vars::ENV_PAYMENT_BACKEND); env::remove_var(crate::env_vars::ENV_LND_ADDRESS); env::remove_var(crate::env_vars::ENV_LND_CERT_FILE); env::remove_var(crate::env_vars::ENV_LND_MACAROON_FILE); @@ -843,7 +892,7 @@ max_melt = 500000 fs::write(&config_path, config_content).expect("Failed to write config file"); // Set environment variables for CLN configuration - env::set_var(crate::env_vars::ENV_LN_BACKEND, "cln"); + env::set_var(crate::env_vars::ENV_PAYMENT_BACKEND, "cln"); env::set_var(crate::env_vars::ENV_CLN_RPC_PATH, "/tmp/lightning-rpc"); env::set_var(crate::env_vars::ENV_CLN_BOLT12, "false"); env::set_var(crate::env_vars::ENV_CLN_FEE_PERCENT, "0.01"); @@ -854,8 +903,8 @@ max_melt = 500000 settings.from_env().expect("Failed to apply env vars"); // Verify that settings were populated from env vars - assert!(settings.cln.is_some()); - let cln_config = settings.cln.as_ref().unwrap(); + assert!(settings.payment_backend.cln.is_some()); + let cln_config = settings.payment_backend.cln.as_ref().unwrap(); assert_eq!(cln_config.rpc_path, PathBuf::from("/tmp/lightning-rpc")); assert_eq!(cln_config.bolt12, false); assert_eq!(cln_config.fee_percent, 0.01); @@ -863,7 +912,7 @@ max_melt = 500000 assert_eq!(reserve_fee_u64, 4); // Cleanup env vars - env::remove_var(crate::env_vars::ENV_LN_BACKEND); + env::remove_var(crate::env_vars::ENV_PAYMENT_BACKEND); env::remove_var(crate::env_vars::ENV_CLN_RPC_PATH); env::remove_var(crate::env_vars::ENV_CLN_BOLT12); env::remove_var(crate::env_vars::ENV_CLN_FEE_PERCENT); @@ -894,7 +943,7 @@ max_melt = 500000 fs::write(&config_path, config_content).expect("Failed to write config file"); // Set environment variables for LNbits configuration - env::set_var(crate::env_vars::ENV_LN_BACKEND, "lnbits"); + env::set_var(crate::env_vars::ENV_PAYMENT_BACKEND, "lnbits"); env::set_var(crate::env_vars::ENV_LNBITS_ADMIN_API_KEY, "test_admin_key"); env::set_var( crate::env_vars::ENV_LNBITS_INVOICE_API_KEY, @@ -912,8 +961,8 @@ max_melt = 500000 settings.from_env().expect("Failed to apply env vars"); // Verify that settings were populated from env vars - assert!(settings.lnbits.is_some()); - let lnbits_config = settings.lnbits.as_ref().unwrap(); + assert!(settings.payment_backend.lnbits.is_some()); + let lnbits_config = settings.payment_backend.lnbits.as_ref().unwrap(); assert_eq!(lnbits_config.admin_api_key, "test_admin_key"); assert_eq!(lnbits_config.invoice_api_key, "test_invoice_key"); assert_eq!(lnbits_config.lnbits_api, "https://lnbits.example.com"); @@ -922,7 +971,7 @@ max_melt = 500000 assert_eq!(reserve_fee_u64, 5); // Cleanup env vars - env::remove_var(crate::env_vars::ENV_LN_BACKEND); + env::remove_var(crate::env_vars::ENV_PAYMENT_BACKEND); env::remove_var(crate::env_vars::ENV_LNBITS_ADMIN_API_KEY); env::remove_var(crate::env_vars::ENV_LNBITS_INVOICE_API_KEY); env::remove_var(crate::env_vars::ENV_LNBITS_API); @@ -954,7 +1003,7 @@ max_melt = 500000 fs::write(&config_path, config_content).expect("Failed to write config file"); // Set environment variables for FakeWallet configuration - env::set_var(crate::env_vars::ENV_LN_BACKEND, "fakewallet"); + env::set_var(crate::env_vars::ENV_PAYMENT_BACKEND, "fakewallet"); env::set_var(crate::env_vars::ENV_FAKE_WALLET_SUPPORTED_UNITS, "sat,msat"); env::set_var(crate::env_vars::ENV_FAKE_WALLET_FEE_PERCENT, "0.0"); env::set_var(crate::env_vars::ENV_FAKE_WALLET_RESERVE_FEE_MIN, "0"); @@ -966,8 +1015,8 @@ max_melt = 500000 settings.from_env().expect("Failed to apply env vars"); // Verify that settings were populated from env vars - assert!(settings.fake_wallet.is_some()); - let fakewallet_config = settings.fake_wallet.as_ref().unwrap(); + assert!(settings.payment_backend.fake_wallet.is_some()); + let fakewallet_config = settings.payment_backend.fake_wallet.as_ref().unwrap(); assert_eq!(fakewallet_config.fee_percent, 0.0); let reserve_fee_u64: u64 = fakewallet_config.reserve_fee_min.into(); assert_eq!(reserve_fee_u64, 0); @@ -975,7 +1024,7 @@ max_melt = 500000 assert_eq!(fakewallet_config.max_delay_time, 5); // Cleanup env vars - env::remove_var(crate::env_vars::ENV_LN_BACKEND); + env::remove_var(crate::env_vars::ENV_PAYMENT_BACKEND); env::remove_var(crate::env_vars::ENV_FAKE_WALLET_SUPPORTED_UNITS); env::remove_var(crate::env_vars::ENV_FAKE_WALLET_FEE_PERCENT); env::remove_var(crate::env_vars::ENV_FAKE_WALLET_RESERVE_FEE_MIN); @@ -1007,7 +1056,7 @@ max_melt = 500000 fs::write(&config_path, config_content).expect("Failed to write config file"); // Set environment variables for GRPC Processor configuration - env::set_var(crate::env_vars::ENV_LN_BACKEND, "grpcprocessor"); + env::set_var(crate::env_vars::ENV_PAYMENT_BACKEND, "grpcprocessor"); env::set_var( crate::env_vars::ENV_GRPC_PROCESSOR_SUPPORTED_UNITS, "sat,msat", @@ -1020,13 +1069,13 @@ max_melt = 500000 settings.from_env().expect("Failed to apply env vars"); // Verify that settings were populated from env vars - assert!(settings.grpc_processor.is_some()); - let grpc_config = settings.grpc_processor.as_ref().unwrap(); + assert!(settings.payment_backend.grpc_processor.is_some()); + let grpc_config = settings.payment_backend.grpc_processor.as_ref().unwrap(); assert_eq!(grpc_config.addr, "localhost"); assert_eq!(grpc_config.port, 50051); // Cleanup env vars - env::remove_var(crate::env_vars::ENV_LN_BACKEND); + env::remove_var(crate::env_vars::ENV_PAYMENT_BACKEND); env::remove_var(crate::env_vars::ENV_GRPC_PROCESSOR_SUPPORTED_UNITS); env::remove_var(crate::env_vars::ENV_GRPC_PROCESSOR_ADDRESS); env::remove_var(crate::env_vars::ENV_GRPC_PROCESSOR_PORT); @@ -1056,7 +1105,7 @@ max_melt = 500000 fs::write(&config_path, config_content).expect("Failed to write config file"); // Set environment variables for LDK Node configuration - env::set_var(crate::env_vars::ENV_LN_BACKEND, "ldknode"); + env::set_var(crate::env_vars::ENV_PAYMENT_BACKEND, "ldknode"); env::set_var(crate::env_vars::LDK_NODE_FEE_PERCENT_ENV_VAR, "0.01"); env::set_var(crate::env_vars::LDK_NODE_RESERVE_FEE_MIN_ENV_VAR, "4"); env::set_var(crate::env_vars::LDK_NODE_BITCOIN_NETWORK_ENV_VAR, "regtest"); @@ -1078,8 +1127,8 @@ max_melt = 500000 settings.from_env().expect("Failed to apply env vars"); // Verify that settings were populated from env vars - assert!(settings.ldk_node.is_some()); - let ldk_config = settings.ldk_node.as_ref().unwrap(); + assert!(settings.payment_backend.ldk_node.is_some()); + let ldk_config = settings.payment_backend.ldk_node.as_ref().unwrap(); assert_eq!(ldk_config.fee_percent, 0.01); let reserve_fee_u64: u64 = ldk_config.reserve_fee_min.into(); assert_eq!(reserve_fee_u64, 4); @@ -1092,7 +1141,7 @@ max_melt = 500000 assert_eq!(ldk_config.storage_dir_path, Some("/tmp/ldk".to_string())); // Cleanup env vars - env::remove_var(crate::env_vars::ENV_LN_BACKEND); + env::remove_var(crate::env_vars::ENV_PAYMENT_BACKEND); env::remove_var(crate::env_vars::LDK_NODE_FEE_PERCENT_ENV_VAR); env::remove_var(crate::env_vars::LDK_NODE_RESERVE_FEE_MIN_ENV_VAR); env::remove_var(crate::env_vars::LDK_NODE_BITCOIN_NETWORK_ENV_VAR); diff --git a/crates/cdk-mintd/src/env_vars/ln.rs b/crates/cdk-mintd/src/env_vars/ln.rs index 4d1ed357c..7381ca3e7 100644 --- a/crates/cdk-mintd/src/env_vars/ln.rs +++ b/crates/cdk-mintd/src/env_vars/ln.rs @@ -2,52 +2,53 @@ use std::env; -use crate::config::Ln; +use crate::config::PaymentBackend; // LN environment variables -pub const ENV_LN_BACKEND: &str = "CDK_MINTD_LN_BACKEND"; -pub const ENV_LN_INVOICE_DESCRIPTION: &str = "CDK_MINTD_LN_INVOICE_DESCRIPTION"; -pub const ENV_LN_MIN_MINT: &str = "CDK_MINTD_LN_MIN_MINT"; -pub const ENV_LN_MAX_MINT: &str = "CDK_MINTD_LN_MAX_MINT"; -pub const ENV_LN_MIN_MELT: &str = "CDK_MINTD_LN_MIN_MELT"; -pub const ENV_LN_MAX_MELT: &str = "CDK_MINTD_LN_MAX_MELT"; - -impl Ln { +pub const ENV_PAYMENT_BACKEND: &str = "CDK_MINTD_PAYMENT_BACKEND"; +pub const ENV_PAYMENT_BACKEND_INVOICE_DESCRIPTION: &str = + "CDK_MINTD_PAYMENT_BACKEND_INVOICE_DESCRIPTION"; +pub const ENV_PAYMENT_BACKEND_MIN_MINT: &str = "CDK_MINTD_PAYMENT_BACKEND_MIN_MINT"; +pub const ENV_PAYMENT_BACKEND_MAX_MINT: &str = "CDK_MINTD_PAYMENT_BACKEND_MAX_MINT"; +pub const ENV_PAYMENT_BACKEND_MIN_MELT: &str = "CDK_MINTD_PAYMENT_BACKEND_MIN_MELT"; +pub const ENV_PAYMENT_BACKEND_MAX_MELT: &str = "CDK_MINTD_PAYMENT_BACKEND_MAX_MELT"; + +impl PaymentBackend { pub fn from_env(mut self) -> Self { // LnBackend - if let Ok(backend_str) = env::var(ENV_LN_BACKEND) { + if let Ok(backend_str) = env::var(ENV_PAYMENT_BACKEND) { if let Ok(backend) = backend_str.parse() { - self.ln_backend = backend; + self.kind = backend; } else { tracing::warn!("Unknown payment backend set in env var will attempt to use config file. {backend_str}"); } } // Optional invoice description - if let Ok(description) = env::var(ENV_LN_INVOICE_DESCRIPTION) { + if let Ok(description) = env::var(ENV_PAYMENT_BACKEND_INVOICE_DESCRIPTION) { self.invoice_description = Some(description); } // Amount fields - if let Ok(min_mint_str) = env::var(ENV_LN_MIN_MINT) { + if let Ok(min_mint_str) = env::var(ENV_PAYMENT_BACKEND_MIN_MINT) { if let Ok(amount) = min_mint_str.parse::() { self.min_mint = amount.into(); } } - if let Ok(max_mint_str) = env::var(ENV_LN_MAX_MINT) { + if let Ok(max_mint_str) = env::var(ENV_PAYMENT_BACKEND_MAX_MINT) { if let Ok(amount) = max_mint_str.parse::() { self.max_mint = amount.into(); } } - if let Ok(min_melt_str) = env::var(ENV_LN_MIN_MELT) { + if let Ok(min_melt_str) = env::var(ENV_PAYMENT_BACKEND_MIN_MELT) { if let Ok(amount) = min_melt_str.parse::() { self.min_melt = amount.into(); } } - if let Ok(max_melt_str) = env::var(ENV_LN_MAX_MELT) { + if let Ok(max_melt_str) = env::var(ENV_PAYMENT_BACKEND_MAX_MELT) { if let Ok(amount) = max_melt_str.parse::() { self.max_melt = amount.into(); } diff --git a/crates/cdk-mintd/src/env_vars/mod.rs b/crates/cdk-mintd/src/env_vars/mod.rs index a3f4c5979..ebd0c433d 100644 --- a/crates/cdk-mintd/src/env_vars/mod.rs +++ b/crates/cdk-mintd/src/env_vars/mod.rs @@ -55,7 +55,7 @@ pub use mint_info::*; #[cfg(feature = "prometheus")] pub use prometheus::*; -use crate::config::{DatabaseEngine, LnBackend, Settings}; +use crate::config::{DatabaseEngine, PaymentBackendKind, Settings}; impl Settings { pub fn from_env(&mut self) -> Result { @@ -92,14 +92,30 @@ impl Settings { self.info = self.info.clone().from_env(); self.mint_info = self.mint_info.clone().from_env(); - self.ln = self.ln.clone().from_env(); - + self.payment_backend = self.payment_backend.clone().from_env(); + // The following section is providing backwards compatibility #1127 + // todo -- remove this section + if self.payment_backend.kind == PaymentBackendKind::None + && self.ln.ln_backend != PaymentBackendKind::None + { + self.using_deprecated_config = Some(true); + let mut ln = self.ln.clone(); + // old ln_backend to kind + ln.kind = ln.ln_backend.clone(); + // old specific settings to payment_backend + ln.lnbits = self.lnbits.clone(); + ln.fake_wallet = self.fake_wallet.clone(); + ln.cln = self.cln.clone(); + ln.lnd = self.lnd.clone(); + ln.grpc_processor = self.grpc_processor.clone(); + self.payment_backend = ln; + } #[cfg(feature = "auth")] { // Check env vars for auth config even if None let auth = self.auth.clone().unwrap_or_default().from_env(); - // Only set auth if auth_enabled flag is true + // Only set auth if the auth_enabled flag is true if auth.auth_enabled { self.auth = Some(auth); } else { @@ -122,33 +138,68 @@ impl Settings { self.prometheus = Some(self.prometheus.clone().unwrap_or_default().from_env()); } - match self.ln.ln_backend { + match self.payment_backend.kind { #[cfg(feature = "cln")] - LnBackend::Cln => { - self.cln = Some(self.cln.clone().unwrap_or_default().from_env()); + PaymentBackendKind::Cln => { + self.payment_backend.cln = Some( + self.payment_backend + .cln + .clone() + .unwrap_or_default() + .from_env(), + ); } #[cfg(feature = "lnbits")] - LnBackend::LNbits => { - self.lnbits = Some(self.lnbits.clone().unwrap_or_default().from_env()); + PaymentBackendKind::LNbits => { + self.payment_backend.lnbits = Some( + self.payment_backend + .lnbits + .clone() + .unwrap_or_default() + .from_env(), + ); } #[cfg(feature = "fakewallet")] - LnBackend::FakeWallet => { - self.fake_wallet = Some(self.fake_wallet.clone().unwrap_or_default().from_env()); + PaymentBackendKind::FakeWallet => { + self.payment_backend.fake_wallet = Some( + self.payment_backend + .fake_wallet + .clone() + .unwrap_or_default() + .from_env(), + ); } #[cfg(feature = "lnd")] - LnBackend::Lnd => { - self.lnd = Some(self.lnd.clone().unwrap_or_default().from_env()); + PaymentBackendKind::Lnd => { + self.payment_backend.lnd = Some( + self.payment_backend + .lnd + .clone() + .unwrap_or_default() + .from_env(), + ); } #[cfg(feature = "ldk-node")] - LnBackend::LdkNode => { - self.ldk_node = Some(self.ldk_node.clone().unwrap_or_default().from_env()); + PaymentBackendKind::LdkNode => { + self.payment_backend.ldk_node = Some( + self.payment_backend + .ldk_node + .clone() + .unwrap_or_default() + .from_env(), + ); } #[cfg(feature = "grpc-processor")] - LnBackend::GrpcProcessor => { - self.grpc_processor = - Some(self.grpc_processor.clone().unwrap_or_default().from_env()); + PaymentBackendKind::GrpcProcessor => { + self.payment_backend.grpc_processor = Some( + self.payment_backend + .grpc_processor + .clone() + .unwrap_or_default() + .from_env(), + ); } - LnBackend::None => bail!("Ln backend must be set"), + PaymentBackendKind::None => bail!("Ln backend must be set"), #[allow(unreachable_patterns)] _ => bail!("Selected Ln backend is not enabled in this build"), } diff --git a/crates/cdk-mintd/src/lib.rs b/crates/cdk-mintd/src/lib.rs index 8b7514c1a..f55cf5133 100644 --- a/crates/cdk-mintd/src/lib.rs +++ b/crates/cdk-mintd/src/lib.rs @@ -54,7 +54,7 @@ use cdk_sqlite::MintSqliteDatabase; use cli::CLIArgs; #[cfg(feature = "auth")] use config::AuthType; -use config::{DatabaseEngine, LnBackend}; +use config::{DatabaseEngine, PaymentBackendKind}; use env_vars::ENV_WORK_DIR; use setup::LnBackendSetup; use tower::ServiceBuilder; @@ -344,7 +344,7 @@ async fn configure_mint_builder( // Configure lightning backend let mint_builder = - configure_lightning_backend(settings, mint_builder, runtime, work_dir, kv_store).await?; + configure_payment_backend(settings, mint_builder, runtime, work_dir, kv_store).await?; // Configure caching let mint_builder = configure_cache(settings, mint_builder); @@ -403,7 +403,7 @@ fn configure_basic_info(settings: &config::Settings, mint_builder: MintBuilder) builder } /// Configures Lightning Network backend based on the specified backend type -async fn configure_lightning_backend( +async fn configure_payment_backend( settings: &config::Settings, mut mint_builder: MintBuilder, _runtime: Option>, @@ -411,18 +411,19 @@ async fn configure_lightning_backend( _kv_store: Option + Send + Sync>>, ) -> Result { let mint_melt_limits = MintMeltLimits { - mint_min: settings.ln.min_mint, - mint_max: settings.ln.max_mint, - melt_min: settings.ln.min_melt, - melt_max: settings.ln.max_melt, + mint_min: settings.payment_backend.min_mint, + mint_max: settings.payment_backend.max_mint, + melt_min: settings.payment_backend.min_melt, + melt_max: settings.payment_backend.max_melt, }; - tracing::debug!("Ln backend: {:?}", settings.ln.ln_backend); + tracing::debug!("Ln backend: {:?}", settings.payment_backend.kind); - match settings.ln.ln_backend { + match settings.payment_backend.kind { #[cfg(feature = "cln")] - LnBackend::Cln => { + PaymentBackendKind::Cln => { let cln_settings = settings + .payment_backend .cln .clone() .expect("Config checked at load that cln is some"); @@ -442,8 +443,12 @@ async fn configure_lightning_backend( .await?; } #[cfg(feature = "lnbits")] - LnBackend::LNbits => { - let lnbits_settings = settings.clone().lnbits.expect("Checked on config load"); + PaymentBackendKind::LNbits => { + let lnbits_settings = settings + .payment_backend + .clone() + .lnbits + .expect("Checked on config load"); let lnbits = lnbits_settings .setup(settings, CurrencyUnit::Sat, None, work_dir, None) .await?; @@ -460,8 +465,12 @@ async fn configure_lightning_backend( .await?; } #[cfg(feature = "lnd")] - LnBackend::Lnd => { - let lnd_settings = settings.clone().lnd.expect("Checked at config load"); + PaymentBackendKind::Lnd => { + let lnd_settings = settings + .payment_backend + .clone() + .lnd + .expect("Checked at config load"); let lnd = lnd_settings .setup(settings, CurrencyUnit::Msat, None, work_dir, _kv_store) .await?; @@ -478,8 +487,12 @@ async fn configure_lightning_backend( .await?; } #[cfg(feature = "fakewallet")] - LnBackend::FakeWallet => { - let fake_wallet = settings.clone().fake_wallet.expect("Fake wallet defined"); + PaymentBackendKind::FakeWallet => { + let fake_wallet = settings + .payment_backend + .clone() + .fake_wallet + .expect("Fake wallet defined"); tracing::info!("Using fake wallet: {:?}", fake_wallet); for unit in fake_wallet.clone().supported_units { @@ -500,11 +513,12 @@ async fn configure_lightning_backend( } } #[cfg(feature = "grpc-processor")] - LnBackend::GrpcProcessor => { + PaymentBackendKind::GrpcProcessor => { let grpc_processor = settings + .payment_backend .clone() .grpc_processor - .expect("grpc processor config defined"); + .expect("GRPC payment processor defined"); tracing::info!( "Attempting to start with gRPC payment processor at {}:{}.", @@ -531,8 +545,12 @@ async fn configure_lightning_backend( } } #[cfg(feature = "ldk-node")] - LnBackend::LdkNode => { - let ldk_node_settings = settings.clone().ldk_node.expect("Checked at config load"); + PaymentBackendKind::LdkNode => { + let ldk_node_settings = settings + .payment_backend + .clone() + .ldk_node + .expect("Checked at config load"); tracing::info!("Using LDK Node backend: {:?}", ldk_node_settings); let ldk_node = ldk_node_settings @@ -548,10 +566,10 @@ async fn configure_lightning_backend( ) .await?; } - LnBackend::None => { + PaymentBackendKind::None => { tracing::error!( "Payment backend was not set or feature disabled. {:?}", - settings.ln.ln_backend + settings.payment_backend.kind ); bail!("Lightning backend must be configured"); } @@ -1017,7 +1035,9 @@ async fn start_services_with_shutdown( None } }; - + if settings.using_deprecated_config.unwrap_or(false) { + tracing::error!("DEPRECATED: The 'ln' section is deprecated and will be removed in the next version. Please update your TOML configuration. https://github.com/cashubtc/cdk/blob/main/crates/cdk-mintd/example.config.toml"); + } #[cfg(not(feature = "prometheus"))] let prometheus_handle: Option> = None; diff --git a/crates/cdk-payment-processor/README.md b/crates/cdk-payment-processor/README.md index d32ebaf29..f1e9c8979 100644 --- a/crates/cdk-payment-processor/README.md +++ b/crates/cdk-payment-processor/README.md @@ -29,7 +29,7 @@ The server requires different environment variables depending on your chosen Lig #### Core Settings ```sh # Choose backend: CLN, LND, or FAKEWALLET -export CDK_PAYMENT_PROCESSOR_LN_BACKEND="CLN" +export CDK_PAYMENT_PROCESSOR_BACKEND="CLN" # Server configuration export CDK_PAYMENT_PROCESSOR_LISTEN_HOST="127.0.0.1" diff --git a/crates/cdk-payment-processor/src/bin/payment_processor.rs b/crates/cdk-payment-processor/src/bin/payment_processor.rs index aecfa2506..63f5ecabf 100644 --- a/crates/cdk-payment-processor/src/bin/payment_processor.rs +++ b/crates/cdk-payment-processor/src/bin/payment_processor.rs @@ -57,7 +57,7 @@ pub fn init_logging(enable_logging: bool, log_level: tracing::Level) { } } -pub const ENV_LN_BACKEND: &str = "CDK_PAYMENT_PROCESSOR_LN_BACKEND"; +pub const ENV_PAYMENT_BACKEND: &str = "CDK_PAYMENT_PROCESSOR_BACKEND"; pub const ENV_LISTEN_HOST: &str = "CDK_PAYMENT_PROCESSOR_LISTEN_HOST"; pub const ENV_LISTEN_PORT: &str = "CDK_PAYMENT_PROCESSOR_LISTEN_PORT"; pub const ENV_PAYMENT_PROCESSOR_TLS_DIR: &str = "CDK_PAYMENT_PROCESSOR_TLS_DIR"; @@ -91,15 +91,15 @@ async fn main() -> anyhow::Result<()> { #[cfg(any(feature = "cln", feature = "lnd", feature = "fake"))] { - let ln_backend: String = env::var(ENV_LN_BACKEND)?; + let payment_backend: String = env::var(ENV_PAYMENT_BACKEND)?; let listen_addr: String = env::var(ENV_LISTEN_HOST)?; let listen_port: u16 = env::var(ENV_LISTEN_PORT)?.parse()?; let tls_dir: Option = env::var(ENV_PAYMENT_PROCESSOR_TLS_DIR) .ok() .map(PathBuf::from); - let ln_backed: Arc + Send + Sync> = - match ln_backend.to_uppercase().as_str() { + let payment_backend: Arc + Send + Sync> = + match payment_backend.to_uppercase().as_str() { #[cfg(feature = "cln")] "CLN" => { let cln_settings = Cln::default().from_env(); @@ -158,7 +158,7 @@ async fn main() -> anyhow::Result<()> { }; let mut server = cdk_payment_processor::PaymentProcessorServer::new( - ln_backed, + payment_backend, &listen_addr, listen_port, )?; diff --git a/crates/cdk/src/mint/start_up_check.rs b/crates/cdk/src/mint/start_up_check.rs index d6cd843b6..696cd412a 100644 --- a/crates/cdk/src/mint/start_up_check.rs +++ b/crates/cdk/src/mint/start_up_check.rs @@ -215,7 +215,7 @@ impl Mint { saga.operation_id ); - // Fallback: Find quote by matching input_ys (for backward compatibility) + // Fallback: Find quote by matching input_ys (for backwards compatibility) let melt_quotes = match self.localstore.get_melt_quotes().await { Ok(quotes) => quotes, Err(e) => { diff --git a/docker-compose.ldk-node.yaml b/docker-compose.ldk-node.yaml index 8f83386c6..1dc14127f 100644 --- a/docker-compose.ldk-node.yaml +++ b/docker-compose.ldk-node.yaml @@ -49,7 +49,7 @@ services: - "8091:8091" # LDK admin dashboard (WARNING!!! Do not expose to network! Doing so will leave LDK node funds accessible by whole network) environment: - CDK_MINTD_URL=https://example.com - - CDK_MINTD_LN_BACKEND=ldk-node + - CDK_MINTD_PAYMENT_BACKEND=ldk-node - CDK_MINTD_LISTEN_HOST=0.0.0.0 - CDK_MINTD_LISTEN_PORT=8085 - CDK_MINTD_MNEMONIC= diff --git a/docker-compose.postgres.yaml b/docker-compose.postgres.yaml index 54aa9c083..bb3373630 100644 --- a/docker-compose.postgres.yaml +++ b/docker-compose.postgres.yaml @@ -12,7 +12,7 @@ services: - "8085:8085" environment: - CDK_MINTD_URL=https://example.com - - CDK_MINTD_LN_BACKEND=fakewallet + - CDK_MINTD_PAYMENT_BACKEND=fakewallet - CDK_MINTD_LISTEN_HOST=0.0.0.0 - CDK_MINTD_LISTEN_PORT=8085 - CDK_MINTD_MNEMONIC= diff --git a/docker-compose.yaml b/docker-compose.yaml index b364ad633..996ef25b2 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -44,7 +44,7 @@ services: - "8085:8085" environment: - CDK_MINTD_URL=https://example.com - - CDK_MINTD_LN_BACKEND=fakewallet + - CDK_MINTD_PAYMENT_BACKEND=fakewallet - CDK_MINTD_LISTEN_HOST=0.0.0.0 - CDK_MINTD_LISTEN_PORT=8085 - CDK_MINTD_MNEMONIC= diff --git a/justfile b/justfile index f350b924f..8eadbe27a 100644 --- a/justfile +++ b/justfile @@ -202,7 +202,7 @@ test-nutshell: # Set environment variables and run tests export CDK_TEST_MINT_URL=http://127.0.0.1:3338 - export LN_BACKEND=FAKEWALLET + export PAYMENT_BACKEND=FAKEWALLET # Track test results test_exit_code=0 @@ -222,7 +222,7 @@ test-nutshell: fi unset CDK_TEST_MINT_URL - unset LN_BACKEND + unset PAYMENT_BACKEND # Exit with error code if any test failed if [ $test_exit_code -ne 0 ]; then diff --git a/misc/interactive_regtest_mprocs.sh b/misc/interactive_regtest_mprocs.sh index e86215c42..0b641c388 100755 --- a/misc/interactive_regtest_mprocs.sh +++ b/misc/interactive_regtest_mprocs.sh @@ -186,7 +186,7 @@ export CDK_MINTD_URL="http://127.0.0.1:8085" export CDK_MINTD_WORK_DIR="$CDK_ITESTS_DIR/cln_mint" export CDK_MINTD_LISTEN_HOST="127.0.0.1" export CDK_MINTD_LISTEN_PORT=8085 -export CDK_MINTD_LN_BACKEND="cln" +export CDK_MINTD_PAYMENT_BACKEND="cln" export CDK_MINTD_MNEMONIC="eye survey guilt napkin crystal cup whisper salt luggage manage unveil loyal" export CDK_MINTD_LOGGING_OUTPUT="both" export CDK_MINTD_LOGGING_CONSOLE_LEVEL="debug" @@ -215,7 +215,7 @@ export CDK_MINTD_URL="http://127.0.0.1:8087" export CDK_MINTD_WORK_DIR="$CDK_ITESTS_DIR/lnd_mint" export CDK_MINTD_LISTEN_HOST="127.0.0.1" export CDK_MINTD_LISTEN_PORT=8087 -export CDK_MINTD_LN_BACKEND="lnd" +export CDK_MINTD_PAYMENT_BACKEND="lnd" export CDK_MINTD_MNEMONIC="cattle gold bind busy sound reduce tone addict baby spend february strategy" export CDK_MINTD_LOGGING_OUTPUT="both" export CDK_MINTD_LOGGING_CONSOLE_LEVEL="debug" @@ -241,7 +241,7 @@ export CDK_MINTD_URL="http://127.0.0.1:8089" export CDK_MINTD_WORK_DIR="$CDK_ITESTS_DIR/ldk_node_mint" export CDK_MINTD_LISTEN_HOST="127.0.0.1" export CDK_MINTD_LISTEN_PORT=8089 -export CDK_MINTD_LN_BACKEND="ldk-node" +export CDK_MINTD_PAYMENT_BACKEND="ldk-node" export CDK_MINTD_LOGGING_CONSOLE_LEVEL="debug" export CDK_MINTD_LOGGING_FILE_LEVEL="debug" export CDK_MINTD_MNEMONIC="abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" diff --git a/misc/mintd_payment_processor.sh b/misc/mintd_payment_processor.sh index 04afe6490..eead3fc66 100755 --- a/misc/mintd_payment_processor.sh +++ b/misc/mintd_payment_processor.sh @@ -28,7 +28,7 @@ cleanup() { unset CDK_ITESTS_MINT_ADDR unset CDK_ITESTS_MINT_PORT_0 unset CDK_REGTEST_PID - unset LN_BACKEND + unset PAYMENT_BACKEND unset MINT_DATABASE unset CDK_TEST_REGTEST unset CDK_TEST_MINT_URL @@ -36,7 +36,7 @@ cleanup() { unset CDK_PAYMENT_PROCESSOR_LND_ADDRESS unset CDK_PAYMENT_PROCESSOR_LND_CERT_FILE unset CDK_PAYMENT_PROCESSOR_LND_MACAROON_FILE - unset CDK_PAYMENT_PROCESSOR_LN_BACKEND + unset CDK_PAYMENT_PROCESSOR_BACKEND unset CDK_PAYMENT_PROCESSOR_LISTEN_HOST unset CDK_PAYMENT_PROCESSOR_LISTEN_PORT unset CDK_PAYMENT_PROCESSOR_PID @@ -44,7 +44,7 @@ cleanup() { unset CDK_MINTD_WORK_DIR unset CDK_MINTD_LISTEN_HOST unset CDK_MINTD_LISTEN_PORT - unset CDK_MINTD_LN_BACKEND + unset CDK_MINTD_PAYMENT_BACKEND unset CDK_MINTD_GRPC_PAYMENT_PROCESSOR_ADDRESS unset CDK_MINTD_GRPC_PAYMENT_PROCESSOR_PORT unset CDK_MINTD_GRPC_PAYMENT_PROCESSOR_SUPPORTED_UNITS @@ -62,7 +62,7 @@ export CDK_ITESTS_MINT_ADDR="127.0.0.1"; export CDK_ITESTS_MINT_PORT_0=8086; -export LN_BACKEND="$1"; +export PAYMENT_BACKEND="$1"; URL="http://$CDK_ITESTS_MINT_ADDR:$CDK_ITESTS_MINT_PORT_0/v1/info" # Check if the temporary directory was created successfully @@ -78,12 +78,13 @@ cargo build -p cdk-integration-tests export CDK_TEST_REGTEST=0 -if [ "$LN_BACKEND" != "FAKEWALLET" ]; then +if [ "$PAYMENT_BACKEND" != "FAKEWALLET" ]; then export CDK_TEST_REGTEST=1 - cargo run --bin start_regtest "$CDK_ITESTS_DIR" & - CDK_REGTEST_PID=$! mkfifo "$CDK_ITESTS_DIR/progress_pipe" rm -f "$CDK_ITESTS_DIR/signal_received" # Ensure clean state + cargo run --bin start_regtest -- "$CDK_ITESTS_DIR" & + CDK_REGTEST_PID=$! + # Start reading from pipe in background (while read line; do case "$line" in @@ -117,7 +118,7 @@ export CDK_PAYMENT_PROCESSOR_LND_ADDRESS="https://localhost:10010"; export CDK_PAYMENT_PROCESSOR_LND_CERT_FILE="$CDK_ITESTS_DIR/lnd/two/tls.cert"; export CDK_PAYMENT_PROCESSOR_LND_MACAROON_FILE="$CDK_ITESTS_DIR/lnd/two/data/chain/bitcoin/regtest/admin.macaroon"; -export CDK_PAYMENT_PROCESSOR_LN_BACKEND=$LN_BACKEND; +export CDK_PAYMENT_PROCESSOR_BACKEND=$PAYMENT_BACKEND; export CDK_PAYMENT_PROCESSOR_LISTEN_HOST="127.0.0.1"; export CDK_PAYMENT_PROCESSOR_LISTEN_PORT="8090"; @@ -134,7 +135,7 @@ export CDK_MINTD_URL="http://$CDK_ITESTS_MINT_ADDR:$CDK_ITESTS_MINT_PORT_0"; export CDK_MINTD_WORK_DIR="$CDK_ITESTS_DIR"; export CDK_MINTD_LISTEN_HOST=$CDK_ITESTS_MINT_ADDR; export CDK_MINTD_LISTEN_PORT=$CDK_ITESTS_MINT_PORT_0; -export CDK_MINTD_LN_BACKEND="grpcprocessor"; +export CDK_MINTD_PAYMENT_BACKEND="grpcprocessor"; export CDK_MINTD_GRPC_PAYMENT_PROCESSOR_ADDRESS="http://127.0.0.1"; export CDK_MINTD_GRPC_PAYMENT_PROCESSOR_PORT="8090"; export CDK_MINTD_GRPC_PAYMENT_PROCESSOR_SUPPORTED_UNITS="sat"; @@ -182,7 +183,7 @@ cargo test -p cdk-integration-tests --test happy_path_mint_wallet # Capture the exit status of cargo test test_status=$? -if [ "$LN_BACKEND" = "CLN" ]; then +if [ "$PAYMENT_BACKEND" = "CLN" ]; then echo "Running bolt12 tests for CLN backend" cargo test -p cdk-integration-tests --test bolt12 bolt12_test_status=$? diff --git a/misc/nutshell_wallet_itest.sh b/misc/nutshell_wallet_itest.sh index bcc0f65a2..21a424665 100755 --- a/misc/nutshell_wallet_itest.sh +++ b/misc/nutshell_wallet_itest.sh @@ -30,7 +30,7 @@ cleanup() { # Unset variables unset MINT_URL WALLET_URL MINT_PORT WALLET_PORT MINT_CONTAINER_NAME WALLET_CONTAINER_NAME unset CDK_MINTD_PID CDK_MINTD_URL CDK_MINTD_WORK_DIR CDK_MINTD_LISTEN_HOST CDK_MINTD_LISTEN_PORT - unset CDK_MINTD_LN_BACKEND CDK_MINTD_FAKE_WALLET_SUPPORTED_UNITS CDK_MINTD_MNEMONIC + unset CDK_MINTD_PAYMENT_BACKEND CDK_MINTD_FAKE_WALLET_SUPPORTED_UNITS CDK_MINTD_MNEMONIC unset CDK_MINTD_FAKE_WALLET_FEE_PERCENT CDK_MINTD_FAKE_WALLET_RESERVE_FEE_MIN CDK_MINTD_DATABASE unset TEST_STATUS unset CDK_MINTD_INPUT_FEE_PPK @@ -50,7 +50,7 @@ export CDK_MINTD_URL="$MINT_URL" export CDK_MINTD_WORK_DIR="$CDK_ITESTS" export CDK_MINTD_LISTEN_HOST="127.0.0.1" export CDK_MINTD_LISTEN_PORT="8085" -export CDK_MINTD_LN_BACKEND="fakewallet" +export CDK_MINTD_PAYMENT_BACKEND="fakewallet" export CDK_MINTD_FAKE_WALLET_SUPPORTED_UNITS="sat,usd" export CDK_MINTD_MNEMONIC="eye survey guilt napkin crystal cup whisper salt luggage manage unveil loyal" export CDK_MINTD_FAKE_WALLET_FEE_PERCENT="0" diff --git a/misc/regtest_helper.sh b/misc/regtest_helper.sh index 6d858ccbe..0c4046f1b 100755 --- a/misc/regtest_helper.sh +++ b/misc/regtest_helper.sh @@ -318,7 +318,7 @@ restart_mints() { export CDK_MINTD_WORK_DIR="$CDK_ITESTS_DIR/cln_mint" export CDK_MINTD_LISTEN_HOST="127.0.0.1" export CDK_MINTD_LISTEN_PORT=8085 - export CDK_MINTD_LN_BACKEND="cln" + export CDK_MINTD_PAYMENT_BACKEND="cln" export CDK_MINTD_MNEMONIC="eye survey guilt napkin crystal cup whisper salt luggage manage unveil loyal" export RUST_BACKTRACE=1 @@ -353,7 +353,7 @@ restart_mints() { export CDK_MINTD_WORK_DIR="$CDK_ITESTS_DIR/lnd_mint" export CDK_MINTD_LISTEN_HOST="127.0.0.1" export CDK_MINTD_LISTEN_PORT=8087 - export CDK_MINTD_LN_BACKEND="lnd" + export CDK_MINTD_PAYMENT_BACKEND="lnd" export CDK_MINTD_MNEMONIC="cattle gold bind busy sound reduce tone addict baby spend february strategy" cargo run --bin cdk-mintd > "$CDK_MINTD_WORK_DIR/mintd.log" 2>&1 &