From 14da84bd64b84b4020aeb1fc4b2e56107eb4fcde Mon Sep 17 00:00:00 2001 From: yse <70684173+hydra-yse@users.noreply.github.com> Date: Thu, 25 Jul 2024 13:59:14 +0200 Subject: [PATCH] fear: add per-wallet directory structure for persister and lwk (#413) --- lib/core/src/model.rs | 23 ++++++++++++++++++++--- lib/core/src/sdk.rs | 17 ++++++++++++++--- lib/core/src/wallet.rs | 9 ++++++--- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/lib/core/src/model.rs b/lib/core/src/model.rs index 91fe030..d17b833 100644 --- a/lib/core/src/model.rs +++ b/lib/core/src/model.rs @@ -1,9 +1,16 @@ +use std::path::PathBuf; + use anyhow::{anyhow, Result}; -use boltz_client::network::Chain; -use boltz_client::swaps::boltz::{ - CreateChainResponse, CreateReverseResponse, CreateSubmarineResponse, Leaf, Side, SwapTree, + +use boltz_client::{ + network::Chain, + swaps::boltz::{ + CreateChainResponse, CreateReverseResponse, CreateSubmarineResponse, Leaf, Side, SwapTree, + }, + ToHex, }; use boltz_client::{BtcSwapScript, BtcSwapTx, Keypair, LBtcSwapScript, LBtcSwapTx}; +use lwk_signer::SwSigner; use lwk_wollet::ElementsNetwork; use rusqlite::types::{FromSql, FromSqlError, FromSqlResult, ToSqlOutput, ValueRef}; use rusqlite::ToSql; @@ -69,6 +76,16 @@ impl Config { } } + pub(crate) fn get_wallet_working_dir(&self, signer: &SwSigner) -> anyhow::Result { + Ok(PathBuf::from(self.working_dir.clone()) + .join(signer.fingerprint().to_hex()) + .to_str() + .ok_or(anyhow::anyhow!( + "Could not get retrieve current wallet directory" + ))? + .to_string()) + } + pub fn zero_conf_max_amount_sat(&self) -> u64 { self.zero_conf_max_amount_sat .unwrap_or(DEFAULT_ZERO_CONF_MAX_SAT) diff --git a/lib/core/src/sdk.rs b/lib/core/src/sdk.rs index b5c010e..607e5bb 100644 --- a/lib/core/src/sdk.rs +++ b/lib/core/src/sdk.rs @@ -19,6 +19,7 @@ use lwk_wollet::secp256k1::ThirtyTwoByteHash; use lwk_wollet::{elements, ElementsNetwork}; use sdk_common::bitcoin::secp256k1::Secp256k1; use sdk_common::bitcoin::util::bip32::ChildNumber; +use sdk_common::ensure_sdk; use sdk_common::prelude::{FiatAPI, FiatCurrency, LnUrlPayError, LnUrlWithdrawError, Rate}; use tokio::sync::{watch, Mutex, RwLock}; use tokio::time::MissedTickBehavior; @@ -98,7 +99,12 @@ impl LiquidSdk { ) -> Result> { fs::create_dir_all(&config.working_dir)?; - let persister = Arc::new(Persister::new(&config.working_dir, config.network)?); + let onchain_wallet = Arc::new(LiquidOnchainWallet::new(mnemonic, config.clone())?); + + let persister = Arc::new(Persister::new( + &config.get_wallet_working_dir(&onchain_wallet.lwk_signer)?, + config.network, + )?); persister.init()?; let event_manager = Arc::new(EventManager::new()); @@ -116,8 +122,6 @@ impl LiquidSdk { let bitcoin_chain_service = Arc::new(Mutex::new(HybridBitcoinChainService::new(config.clone())?)); - let onchain_wallet = Arc::new(LiquidOnchainWallet::new(mnemonic, config.clone())?); - let send_swap_state_handler = SendSwapStateHandler::new( config.clone(), onchain_wallet.clone(), @@ -1679,6 +1683,13 @@ impl LiquidSdk { .backup_path .map(PathBuf::from) .unwrap_or(self.persister.get_default_backup_path()); + ensure_sdk!( + backup_path.exists(), + SdkError::Generic { + err: "Backup file does not exist".to_string() + } + .into() + ); self.persister.restore_from_backup(backup_path) } diff --git a/lib/core/src/wallet.rs b/lib/core/src/wallet.rs index 9324c4d..89f64a5 100644 --- a/lib/core/src/wallet.rs +++ b/lib/core/src/wallet.rs @@ -50,8 +50,8 @@ pub trait OnchainWallet: Send + Sync { pub(crate) struct LiquidOnchainWallet { wallet: Arc>, - lwk_signer: SwSigner, config: Config, + pub(crate) lwk_signer: SwSigner, } impl LiquidOnchainWallet { @@ -61,8 +61,11 @@ impl LiquidOnchainWallet { let descriptor = LiquidOnchainWallet::get_descriptor(&lwk_signer, config.network)?; let elements_network: ElementsNetwork = config.network.into(); - let lwk_persister = - FsPersister::new(config.working_dir.clone(), elements_network, &descriptor)?; + let lwk_persister = FsPersister::new( + config.get_wallet_working_dir(&lwk_signer)?, + elements_network, + &descriptor, + )?; let wollet = Wollet::new(elements_network, lwk_persister, descriptor)?; Ok(Self { wallet: Arc::new(Mutex::new(wollet)),