| 
					
				 | 
			
			
				@@ -14,7 +14,7 @@ use anyhow::{anyhow, bail, Result}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use axum::Router; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use bip39::Mnemonic; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // internal crate modules 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-use cdk::cdk_database::{self, MintDatabase, MintKeysDatabase}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+use cdk::cdk_database::{self, MintDatabase, MintKVStore, MintKeysDatabase}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use cdk::cdk_payment; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use cdk::cdk_payment::MintPayment; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use cdk::mint::{Mint, MintBuilder, MintMeltLimits}; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -94,9 +94,10 @@ async fn initial_setup( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) -> Result<( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     Arc<dyn MintDatabase<cdk_database::Error> + Send + Sync>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     Arc<dyn MintKeysDatabase<Err = cdk_database::Error> + Send + Sync>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Arc<dyn MintKVStore<Err = cdk_database::Error> + Send + Sync>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 )> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    let (localstore, keystore) = setup_database(settings, work_dir, db_password).await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    Ok((localstore, keystore)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let (localstore, keystore, kv) = setup_database(settings, work_dir, db_password).await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Ok((localstore, keystore, kv)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /// Sets up and initializes a tracing subscriber with custom log filtering. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -253,14 +254,16 @@ async fn setup_database( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) -> Result<( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     Arc<dyn MintDatabase<cdk_database::Error> + Send + Sync>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     Arc<dyn MintKeysDatabase<Err = cdk_database::Error> + Send + Sync>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Arc<dyn MintKVStore<Err = cdk_database::Error> + Send + Sync>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 )> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     match settings.database.engine { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         #[cfg(feature = "sqlite")] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         DatabaseEngine::Sqlite => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let db = setup_sqlite_database(_work_dir, _db_password).await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let localstore: Arc<dyn MintDatabase<cdk_database::Error> + Send + Sync> = db.clone(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let kv: Arc<dyn MintKVStore<Err = cdk_database::Error> + Send + Sync> = db.clone(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let keystore: Arc<dyn MintKeysDatabase<Err = cdk_database::Error> + Send + Sync> = db; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Ok((localstore, keystore)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Ok((localstore, keystore, kv)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         #[cfg(feature = "postgres")] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         DatabaseEngine::Postgres => { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -279,11 +282,13 @@ async fn setup_database( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let localstore: Arc<dyn MintDatabase<cdk_database::Error> + Send + Sync> = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 pg_db.clone(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             #[cfg(feature = "postgres")] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let kv: Arc<dyn MintKVStore<Err = cdk_database::Error> + Send + Sync> = pg_db.clone(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            #[cfg(feature = "postgres")] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let keystore: Arc< 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 dyn MintKeysDatabase<Err = cdk_database::Error> + Send + Sync, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             > = pg_db; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             #[cfg(feature = "postgres")] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return Ok((localstore, keystore)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return Ok((localstore, keystore, kv)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             #[cfg(not(feature = "postgres"))] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             bail!("PostgreSQL support not compiled in. Enable the 'postgres' feature to use PostgreSQL database.") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -326,6 +331,7 @@ async fn configure_mint_builder( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     mint_builder: MintBuilder, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     runtime: Option<std::sync::Arc<tokio::runtime::Runtime>>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     work_dir: &Path, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    kv_store: Option<Arc<dyn MintKVStore<Err = cdk::cdk_database::Error> + Send + Sync>>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) -> Result<(MintBuilder, Vec<Router>)> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     let mut ln_routers = vec![]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -333,9 +339,15 @@ async fn configure_mint_builder( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     let mint_builder = configure_basic_info(settings, mint_builder); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Configure lightning backend 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    let mint_builder = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        configure_lightning_backend(settings, mint_builder, &mut ln_routers, runtime, work_dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            .await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let mint_builder = configure_lightning_backend( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        settings, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mint_builder, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        &mut ln_routers, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        runtime, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        work_dir, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        kv_store, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    .await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Configure caching 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     let mint_builder = configure_cache(settings, mint_builder); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -400,6 +412,7 @@ async fn configure_lightning_backend( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ln_routers: &mut Vec<Router>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     _runtime: Option<std::sync::Arc<tokio::runtime::Runtime>>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     work_dir: &Path, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _kv_store: Option<Arc<dyn MintKVStore<Err = cdk::cdk_database::Error> + Send + Sync>>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) -> Result<MintBuilder> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     let mint_melt_limits = MintMeltLimits { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         mint_min: settings.ln.min_mint, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -418,7 +431,14 @@ async fn configure_lightning_backend( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .clone() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .expect("Config checked at load that cln is some"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let cln = cln_settings 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .setup(ln_routers, settings, CurrencyUnit::Msat, None, work_dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .setup( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ln_routers, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    settings, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    CurrencyUnit::Msat, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    None, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    work_dir, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    None, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             mint_builder = configure_backend_for_unit( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -434,7 +454,14 @@ async fn configure_lightning_backend( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         LnBackend::LNbits => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let lnbits_settings = settings.clone().lnbits.expect("Checked on config load"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let lnbits = lnbits_settings 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .setup(ln_routers, settings, CurrencyUnit::Sat, None, work_dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .setup( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ln_routers, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    settings, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    CurrencyUnit::Sat, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    None, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    work_dir, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    None, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             mint_builder = configure_backend_for_unit( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -450,7 +477,14 @@ async fn configure_lightning_backend( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         LnBackend::Lnd => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let lnd_settings = settings.clone().lnd.expect("Checked at config load"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let lnd = lnd_settings 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .setup(ln_routers, settings, CurrencyUnit::Msat, None, work_dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .setup( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ln_routers, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    settings, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    CurrencyUnit::Msat, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    None, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    work_dir, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    None, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             mint_builder = configure_backend_for_unit( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -469,7 +503,14 @@ async fn configure_lightning_backend( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for unit in fake_wallet.clone().supported_units { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 let fake = fake_wallet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    .setup(ln_routers, settings, unit.clone(), None, work_dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .setup( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ln_routers, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        settings, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        unit.clone(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        None, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        work_dir, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        _kv_store.clone(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     .await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 mint_builder = configure_backend_for_unit( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -498,7 +539,7 @@ async fn configure_lightning_backend( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for unit in grpc_processor.clone().supported_units { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 tracing::debug!("Adding unit: {:?}", unit); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 let processor = grpc_processor 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    .setup(ln_routers, settings, unit.clone(), None, work_dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    .setup(ln_routers, settings, unit.clone(), None, work_dir, None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     .await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 mint_builder = configure_backend_for_unit( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -517,7 +558,14 @@ async fn configure_lightning_backend( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             tracing::info!("Using LDK Node backend: {:?}", ldk_node_settings); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let ldk_node = ldk_node_settings 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .setup(ln_routers, settings, CurrencyUnit::Sat, _runtime, work_dir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .setup( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ln_routers, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    settings, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    CurrencyUnit::Sat, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    _runtime, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    work_dir, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    None, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             mint_builder = configure_backend_for_unit( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1015,12 +1063,12 @@ pub async fn run_mintd_with_shutdown( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     db_password: Option<String>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     runtime: Option<std::sync::Arc<tokio::runtime::Runtime>>, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) -> Result<()> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    let (localstore, keystore) = initial_setup(work_dir, settings, db_password.clone()).await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let (localstore, keystore, kv) = initial_setup(work_dir, settings, db_password.clone()).await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     let mint_builder = MintBuilder::new(localstore); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     let (mint_builder, ln_routers) = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        configure_mint_builder(settings, mint_builder, runtime, work_dir).await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        configure_mint_builder(settings, mint_builder, runtime, work_dir, Some(kv)).await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     #[cfg(feature = "auth")] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     let mint_builder = setup_authentication(settings, work_dir, mint_builder, db_password).await?; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |