use std::path::Path;
use std::sync::Arc;
use std::str::FromStr;
use anyhow::Context;
use log::{debug, warn};
use bark::{Config, Wallet as BarkWallet, SqliteClient};
use bark::onchain::OnchainWallet;
use bark::persist::BarkPersister;
const MNEMONIC_FILE: &str = "mnemonic";
const DB_FILE: &str = "db.sqlite";
pub async fn open_wallet(datadir: &Path) -> anyhow::Result<(BarkWallet, OnchainWallet)> {
debug!("Opening bark wallet in {}", datadir.display());
let mnemonic_path = datadir.join(MNEMONIC_FILE);
let mnemonic_str = tokio::fs::read_to_string(&mnemonic_path).await
.with_context(|| format!("failed to read mnemonic file at {}", mnemonic_path.display()))?;
let mnemonic = bip39::Mnemonic::from_str(&mnemonic_str).context("broken mnemonic")?;
let seed = mnemonic.to_seed("");
let db = Arc::new(SqliteClient::open(datadir.join(DB_FILE))?);
let properties = db.read_properties()?.context("failed to read properties")?;
let config_path = datadir.join("config.toml");
let config = Config::load(properties.network, config_path)
.context("error loading bark config file")?;
let bdk_wallet = OnchainWallet::load_or_create(properties.network, seed, db.clone())?;
let bark_wallet = BarkWallet::open_with_onchain(&mnemonic, db, &bdk_wallet, config).await?;
if let Err(e) = bark_wallet.require_chainsource_version() {
warn!("{}", e);
}
Ok((bark_wallet, bdk_wallet))
}