# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
-version = 3
+version = 4
[[package]]
name = "addr2line"
"bdk_electrum",
"bdk_esplora",
"bdk_kyoto",
+ "bdk_redb",
"bdk_wallet",
"clap",
"dirs",
"kyoto-cbf",
]
+[[package]]
+name = "bdk_redb"
+version = "0.1.0"
+source = "git+https://github.com/110CodingP/bdk_redb#9985249c3f22489ccaf4ae09138fae950eca774b"
+dependencies = [
+ "bdk_chain",
+ "bdk_wallet",
+ "ciborium",
+ "redb",
+ "tempfile",
+ "thiserror",
+]
+
[[package]]
name = "bdk_wallet"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b4b0fc281743d80256607bd65e8beedc42cb0787ea119c85b81b4c0eab85e5f"
+[[package]]
+name = "ciborium"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e"
+dependencies = [
+ "ciborium-io",
+ "ciborium-ll",
+ "serde",
+]
+
+[[package]]
+name = "ciborium-io"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757"
+
+[[package]]
+name = "ciborium-ll"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9"
+dependencies = [
+ "ciborium-io",
+ "half",
+]
+
[[package]]
name = "clang-sys"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+[[package]]
+name = "crunchy"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929"
+
[[package]]
name = "dirs"
version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
+[[package]]
+name = "half"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9"
+dependencies = [
+ "cfg-if",
+ "crunchy",
+]
+
[[package]]
name = "hashbrown"
version = "0.14.5"
"getrandom 0.2.16",
]
+[[package]]
+name = "redb"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cef6a6d3a65ea334d6cdfb31fa2525c20184b7aa7bd1ad1e2e37502610d4609f"
+dependencies = [
+ "libc",
+]
+
[[package]]
name = "redox_syscall"
version = "0.5.17"
"errno",
"libc",
"linux-raw-sys 0.4.15",
- "windows-sys 0.59.0",
+ "windows-sys 0.52.0",
]
[[package]]
use crate::commands::OfflineWalletSubCommand::*;
use crate::commands::*;
use crate::error::BDKCliError as Error;
+#[cfg(any(feature = "sqlite", feature = "redb"))]
+use crate::persister::Persister;
#[cfg(feature = "cbf")]
use crate::utils::BlockchainClient::KyotoClient;
use crate::utils::*;
+#[cfg(feature = "redb")]
+use bdk_redb::Store as RedbStore;
use bdk_wallet::bip39::{Language, Mnemonic};
use bdk_wallet::bitcoin::Network;
use bdk_wallet::bitcoin::bip32::{DerivationPath, KeySource};
#[cfg(feature = "cbf")]
use bdk_kyoto::{Info, LightClient};
use bdk_wallet::bitcoin::base64::prelude::*;
+#[cfg(feature = "redb")]
+use std::sync::Arc;
#[cfg(feature = "cbf")]
use tokio::select;
#[cfg(any(
let home_dir = prepare_home_dir(cli_opts.datadir)?;
let wallet_name = &wallet_opts.wallet;
let database_path = prepare_wallet_db_dir(wallet_name, &home_dir)?;
- #[cfg(feature = "sqlite")]
+
+ #[cfg(any(feature = "sqlite", feature = "redb"))]
let result = {
- let mut persister = match &wallet_opts.database_type {
+ let mut persister: Persister = match &wallet_opts.database_type {
#[cfg(feature = "sqlite")]
DatabaseType::Sqlite => {
let db_file = database_path.join("wallet.sqlite");
let connection = Connection::open(db_file)?;
log::debug!("Sqlite database opened successfully");
- connection
+ Persister::Connection(connection)
+ }
+ #[cfg(feature = "redb")]
+ DatabaseType::Redb => {
+ let db = Arc::new(bdk_redb::redb::Database::create(
+ home_dir.join("wallet.redb"),
+ )?);
+ let store = RedbStore::new(
+ db,
+ wallet_name.as_deref().unwrap_or("wallet").to_string(),
+ )?;
+ log::debug!("Redb database opened successfully");
+ Persister::RedbStore(store)
}
};
wallet.persist(&mut persister)?;
result
};
- #[cfg(not(any(feature = "sqlite")))]
+ #[cfg(not(any(feature = "sqlite", feature = "redb")))]
let result = {
let wallet = new_wallet(network, &wallet_opts)?;
let blockchain_client =
subcommand: WalletSubCommand::OfflineWalletSubCommand(offline_subcommand),
} => {
let network = cli_opts.network;
- #[cfg(feature = "sqlite")]
+ #[cfg(any(feature = "sqlite", feature = "redb"))]
let result = {
let home_dir = prepare_home_dir(cli_opts.datadir)?;
let wallet_name = &wallet_opts.wallet;
- let database_path = prepare_wallet_db_dir(wallet_name, &home_dir)?;
- let mut persister = match &wallet_opts.database_type {
+ let mut persister: Persister = match &wallet_opts.database_type {
#[cfg(feature = "sqlite")]
DatabaseType::Sqlite => {
+ let database_path = prepare_wallet_db_dir(wallet_name, &home_dir)?;
let db_file = database_path.join("wallet.sqlite");
let connection = Connection::open(db_file)?;
log::debug!("Sqlite database opened successfully");
- connection
+ Persister::Connection(connection)
+ }
+ #[cfg(feature = "redb")]
+ DatabaseType::Redb => {
+ let db = Arc::new(bdk_redb::redb::Database::create(
+ home_dir.join("wallet.redb"),
+ )?);
+ let store = RedbStore::new(
+ db,
+ wallet_name.as_deref().unwrap_or("wallet").to_string(),
+ )?;
+ log::debug!("Redb database opened successfully");
+ Persister::RedbStore(store)
}
};
wallet.persist(&mut persister)?;
result
};
- #[cfg(not(any(feature = "sqlite")))]
+ #[cfg(not(any(feature = "sqlite", feature = "redb")))]
let result = {
let mut wallet = new_wallet(network, &wallet_opts)?;
handle_offline_wallet_subcommand(&mut wallet, &wallet_opts, offline_subcommand)?
#[cfg(feature = "repl")]
CliSubCommand::Repl { wallet_opts } => {
let network = cli_opts.network;
- #[cfg(feature = "sqlite")]
+ #[cfg(any(feature = "sqlite", feature = "redb"))]
let (mut wallet, mut persister) = {
let wallet_name = &wallet_opts.wallet;
let home_dir = prepare_home_dir(cli_opts.datadir.clone())?;
- let database_path = prepare_wallet_db_dir(wallet_name, &home_dir)?;
-
- let mut persister = match &wallet_opts.database_type {
+ let mut persister: Persister = match &wallet_opts.database_type {
#[cfg(feature = "sqlite")]
DatabaseType::Sqlite => {
+ let database_path = prepare_wallet_db_dir(wallet_name, &home_dir)?;
let db_file = database_path.join("wallet.sqlite");
let connection = Connection::open(db_file)?;
log::debug!("Sqlite database opened successfully");
- connection
+ Persister::Connection(connection)
+ }
+ #[cfg(feature = "redb")]
+ DatabaseType::Redb => {
+ let db = Arc::new(bdk_redb::redb::Database::create(
+ home_dir.join("wallet.redb"),
+ )?);
+ let store = RedbStore::new(
+ db,
+ wallet_name.as_deref().unwrap_or("wallet").to_string(),
+ )?;
+ log::debug!("Redb database opened successfully");
+ Persister::RedbStore(store)
}
};
let wallet = new_persisted_wallet(network, &mut persister, &wallet_opts)?;
(wallet, persister)
};
- #[cfg(not(any(feature = "sqlite")))]
+ #[cfg(not(any(feature = "sqlite", feature = "redb")))]
let mut wallet = new_wallet(network, &wallet_opts)?;
let home_dir = prepare_home_dir(cli_opts.datadir.clone())?;
let database_path = prepare_wallet_db_dir(&wallet_opts.wallet, &home_dir)?;
database_path.clone(),
)
.await;
- #[cfg(feature = "sqlite")]
+ #[cfg(any(feature = "sqlite", feature = "redb"))]
wallet.persist(&mut persister)?;
match result {
--- /dev/null
+use crate::error::BDKCliError;
+use bdk_wallet::WalletPersister;
+
+pub enum Persister {
+ #[cfg(feature = "sqlite")]
+ Connection(bdk_wallet::rusqlite::Connection),
+ #[cfg(feature = "redb")]
+ RedbStore(bdk_redb::Store),
+}
+
+impl WalletPersister for Persister {
+ type Error = BDKCliError;
+
+ fn initialize(persister: &mut Self) -> Result<bdk_wallet::ChangeSet, Self::Error> {
+ match persister {
+ #[cfg(feature = "sqlite")]
+ Persister::Connection(connection) => {
+ WalletPersister::initialize(connection).map_err(BDKCliError::from)
+ }
+ #[cfg(feature = "redb")]
+ Persister::RedbStore(store) => {
+ WalletPersister::initialize(store).map_err(BDKCliError::from)
+ }
+ }
+ }
+
+ fn persist(persister: &mut Self, changeset: &bdk_wallet::ChangeSet) -> Result<(), Self::Error> {
+ match persister {
+ #[cfg(feature = "sqlite")]
+ Persister::Connection(connection) => {
+ WalletPersister::persist(connection, changeset).map_err(BDKCliError::from)
+ }
+ #[cfg(feature = "redb")]
+ Persister::RedbStore(store) => {
+ WalletPersister::persist(store, changeset).map_err(BDKCliError::from)
+ }
+ }
+ }
+}