Rename the library to bdk
This commit is contained in:
parent
efdd11762c
commit
d7ee38cc52
10
Cargo.toml
10
Cargo.toml
@ -1,11 +1,11 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "magical"
|
name = "bdk"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
authors = ["Alekos Filini <alekos.filini@gmail.com>", "Riccardo Casatta <riccardo@casatta.it>"]
|
authors = ["Alekos Filini <alekos.filini@gmail.com>", "Riccardo Casatta <riccardo@casatta.it>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
magical-macros = { version = "0.1.0-beta.1", path = "./macros" }
|
bdk-macros = { version = "0.1.0-beta.1", path = "./macros" }
|
||||||
log = "^0.4"
|
log = "^0.4"
|
||||||
bitcoin = { version = "0.23", features = ["use-serde"] }
|
bitcoin = { version = "0.23", features = ["use-serde"] }
|
||||||
miniscript = { version = "1.0" }
|
miniscript = { version = "1.0" }
|
||||||
@ -49,13 +49,13 @@ cli-utils = ["clap", "base64"]
|
|||||||
async-interface = ["async-trait"]
|
async-interface = ["async-trait"]
|
||||||
|
|
||||||
# Debug/Test features
|
# Debug/Test features
|
||||||
debug-proc-macros = ["magical-macros/debug", "magical-testutils-macros/debug"]
|
debug-proc-macros = ["bdk-macros/debug", "bdk-testutils-macros/debug"]
|
||||||
test-electrum = ["electrum"]
|
test-electrum = ["electrum"]
|
||||||
test-md-docs = ["base64", "electrum"]
|
test-md-docs = ["base64", "electrum"]
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
magical-testutils = { version = "0.1.0-beta.1", path = "./testutils" }
|
bdk-testutils = { version = "0.1.0-beta.1", path = "./testutils" }
|
||||||
magical-testutils-macros = { version = "0.1.0-beta.1", path = "./testutils-macros" }
|
bdk-testutils-macros = { version = "0.1.0-beta.1", path = "./testutils-macros" }
|
||||||
serial_test = "0.4"
|
serial_test = "0.4"
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
rustyline = "6.0"
|
rustyline = "6.0"
|
||||||
|
32
README.md
32
README.md
@ -36,13 +36,13 @@ The `magical` library aims to be the core building block for Bitcoin wallets of
|
|||||||
### Sync the balance of a descriptor
|
### Sync the balance of a descriptor
|
||||||
|
|
||||||
```no_run
|
```no_run
|
||||||
use magical::Wallet;
|
use bdk::Wallet;
|
||||||
use magical::database::MemoryDatabase;
|
use bdk::database::MemoryDatabase;
|
||||||
use magical::blockchain::{noop_progress, ElectrumBlockchain};
|
use bdk::blockchain::{noop_progress, ElectrumBlockchain};
|
||||||
|
|
||||||
use magical::electrum_client::Client;
|
use bdk::electrum_client::Client;
|
||||||
|
|
||||||
fn main() -> Result<(), magical::Error> {
|
fn main() -> Result<(), bdk::Error> {
|
||||||
let client = Client::new("ssl://electrum.blockstream.info:60002", None)?;
|
let client = Client::new("ssl://electrum.blockstream.info:60002", None)?;
|
||||||
let wallet = Wallet::new(
|
let wallet = Wallet::new(
|
||||||
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
|
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
|
||||||
@ -63,10 +63,10 @@ fn main() -> Result<(), magical::Error> {
|
|||||||
### Generate a few addresses
|
### Generate a few addresses
|
||||||
|
|
||||||
```
|
```
|
||||||
use magical::{Wallet, OfflineWallet};
|
use bdk::{Wallet, OfflineWallet};
|
||||||
use magical::database::MemoryDatabase;
|
use bdk::database::MemoryDatabase;
|
||||||
|
|
||||||
fn main() -> Result<(), magical::Error> {
|
fn main() -> Result<(), bdk::Error> {
|
||||||
let wallet: OfflineWallet<_> = Wallet::new_offline(
|
let wallet: OfflineWallet<_> = Wallet::new_offline(
|
||||||
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
|
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
|
||||||
Some("wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)"),
|
Some("wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)"),
|
||||||
@ -85,15 +85,15 @@ fn main() -> Result<(), magical::Error> {
|
|||||||
### Create a transaction
|
### Create a transaction
|
||||||
|
|
||||||
```no_run
|
```no_run
|
||||||
use magical::{FeeRate, TxBuilder, Wallet};
|
use bdk::{FeeRate, TxBuilder, Wallet};
|
||||||
use magical::database::MemoryDatabase;
|
use bdk::database::MemoryDatabase;
|
||||||
use magical::blockchain::{noop_progress, ElectrumBlockchain};
|
use bdk::blockchain::{noop_progress, ElectrumBlockchain};
|
||||||
|
|
||||||
use magical::electrum_client::Client;
|
use bdk::electrum_client::Client;
|
||||||
|
|
||||||
use bitcoin::consensus::serialize;
|
use bitcoin::consensus::serialize;
|
||||||
|
|
||||||
fn main() -> Result<(), magical::Error> {
|
fn main() -> Result<(), bdk::Error> {
|
||||||
let client = Client::new("ssl://electrum.blockstream.info:60002", None)?;
|
let client = Client::new("ssl://electrum.blockstream.info:60002", None)?;
|
||||||
let wallet = Wallet::new(
|
let wallet = Wallet::new(
|
||||||
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
|
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
|
||||||
@ -123,12 +123,12 @@ fn main() -> Result<(), magical::Error> {
|
|||||||
### Sign a transaction
|
### Sign a transaction
|
||||||
|
|
||||||
```no_run
|
```no_run
|
||||||
use magical::{Wallet, OfflineWallet};
|
use bdk::{Wallet, OfflineWallet};
|
||||||
use magical::database::MemoryDatabase;
|
use bdk::database::MemoryDatabase;
|
||||||
|
|
||||||
use bitcoin::consensus::deserialize;
|
use bitcoin::consensus::deserialize;
|
||||||
|
|
||||||
fn main() -> Result<(), magical::Error> {
|
fn main() -> Result<(), bdk::Error> {
|
||||||
let wallet: OfflineWallet<_> = Wallet::new_offline(
|
let wallet: OfflineWallet<_> = Wallet::new_offline(
|
||||||
"wpkh([c258d2e4/84h/1h/0h]tprv8griRPhA7342zfRyB6CqeKF8CJDXYu5pgnj1cjL1u2ngKcJha5jjTRimG82ABzJQ4MQe71CV54xfn25BbhCNfEGGJZnxvCDQCd6JkbvxW6h/0/*)",
|
"wpkh([c258d2e4/84h/1h/0h]tprv8griRPhA7342zfRyB6CqeKF8CJDXYu5pgnj1cjL1u2ngKcJha5jjTRimG82ABzJQ4MQe71CV54xfn25BbhCNfEGGJZnxvCDQCd6JkbvxW6h/0/*)",
|
||||||
Some("wpkh([c258d2e4/84h/1h/0h]tprv8griRPhA7342zfRyB6CqeKF8CJDXYu5pgnj1cjL1u2ngKcJha5jjTRimG82ABzJQ4MQe71CV54xfn25BbhCNfEGGJZnxvCDQCd6JkbvxW6h/1/*)"),
|
Some("wpkh([c258d2e4/84h/1h/0h]tprv8griRPhA7342zfRyB6CqeKF8CJDXYu5pgnj1cjL1u2ngKcJha5jjTRimG82ABzJQ4MQe71CV54xfn25BbhCNfEGGJZnxvCDQCd6JkbvxW6h/1/*)"),
|
||||||
|
@ -24,12 +24,12 @@
|
|||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use magical::bitcoin;
|
use bdk::bitcoin;
|
||||||
use magical::database::MemoryDatabase;
|
use bdk::database::MemoryDatabase;
|
||||||
use magical::descriptor::HDKeyPaths;
|
use bdk::descriptor::HDKeyPaths;
|
||||||
use magical::wallet::address_validator::{AddressValidator, AddressValidatorError};
|
use bdk::wallet::address_validator::{AddressValidator, AddressValidatorError};
|
||||||
use magical::ScriptType;
|
use bdk::ScriptType;
|
||||||
use magical::{OfflineWallet, Wallet};
|
use bdk::{OfflineWallet, Wallet};
|
||||||
|
|
||||||
use bitcoin::hashes::hex::FromHex;
|
use bitcoin::hashes::hex::FromHex;
|
||||||
use bitcoin::util::bip32::Fingerprint;
|
use bitcoin::util::bip32::Fingerprint;
|
||||||
@ -57,7 +57,7 @@ impl AddressValidator for DummyValidator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<(), magical::Error> {
|
fn main() -> Result<(), bdk::Error> {
|
||||||
let descriptor = "sh(and_v(v:pk(tpubDDpWvmUrPZrhSPmUzCMBHffvC3HyMAPnWDSAQNBTnj1iZeJa7BZQEttFiP4DS4GCcXQHezdXhn86Hj6LHX5EDstXPWrMaSneRWM8yUf6NFd/*),after(630000)))";
|
let descriptor = "sh(and_v(v:pk(tpubDDpWvmUrPZrhSPmUzCMBHffvC3HyMAPnWDSAQNBTnj1iZeJa7BZQEttFiP4DS4GCcXQHezdXhn86Hj6LHX5EDstXPWrMaSneRWM8yUf6NFd/*),after(630000)))";
|
||||||
let mut wallet: OfflineWallet<_> =
|
let mut wallet: OfflineWallet<_> =
|
||||||
Wallet::new_offline(descriptor, None, Network::Regtest, MemoryDatabase::new())?;
|
Wallet::new_offline(descriptor, None, Network::Regtest, MemoryDatabase::new())?;
|
||||||
|
@ -22,10 +22,10 @@
|
|||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
// SOFTWARE.
|
// SOFTWARE.
|
||||||
|
|
||||||
|
extern crate bdk;
|
||||||
extern crate bitcoin;
|
extern crate bitcoin;
|
||||||
extern crate clap;
|
extern crate clap;
|
||||||
extern crate log;
|
extern crate log;
|
||||||
extern crate magical;
|
|
||||||
extern crate miniscript;
|
extern crate miniscript;
|
||||||
extern crate serde_json;
|
extern crate serde_json;
|
||||||
|
|
||||||
@ -39,8 +39,8 @@ use bitcoin::Network;
|
|||||||
use miniscript::policy::Concrete;
|
use miniscript::policy::Concrete;
|
||||||
use miniscript::Descriptor;
|
use miniscript::Descriptor;
|
||||||
|
|
||||||
use magical::database::memory::MemoryDatabase;
|
use bdk::database::memory::MemoryDatabase;
|
||||||
use magical::{OfflineWallet, ScriptType, Wallet};
|
use bdk::{OfflineWallet, ScriptType, Wallet};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
env_logger::init_from_env(
|
env_logger::init_from_env(
|
||||||
|
@ -22,14 +22,14 @@
|
|||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
// SOFTWARE.
|
// SOFTWARE.
|
||||||
|
|
||||||
extern crate magical;
|
extern crate bdk;
|
||||||
extern crate serde_json;
|
extern crate serde_json;
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use magical::bitcoin::util::bip32::ChildNumber;
|
use bdk::bitcoin::util::bip32::ChildNumber;
|
||||||
use magical::bitcoin::*;
|
use bdk::bitcoin::*;
|
||||||
use magical::descriptor::*;
|
use bdk::descriptor::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let desc = "wsh(or_d(\
|
let desc = "wsh(or_d(\
|
||||||
|
@ -36,17 +36,17 @@ use log::{debug, error, info, trace, LevelFilter};
|
|||||||
|
|
||||||
use bitcoin::Network;
|
use bitcoin::Network;
|
||||||
|
|
||||||
use magical::bitcoin;
|
use bdk::bitcoin;
|
||||||
use magical::blockchain::ElectrumBlockchain;
|
use bdk::blockchain::ElectrumBlockchain;
|
||||||
use magical::cli;
|
use bdk::cli;
|
||||||
use magical::electrum_client::Client;
|
use bdk::electrum_client::Client;
|
||||||
use magical::sled;
|
use bdk::sled;
|
||||||
use magical::Wallet;
|
use bdk::Wallet;
|
||||||
|
|
||||||
fn prepare_home_dir() -> PathBuf {
|
fn prepare_home_dir() -> PathBuf {
|
||||||
let mut dir = PathBuf::new();
|
let mut dir = PathBuf::new();
|
||||||
dir.push(&dirs::home_dir().unwrap());
|
dir.push(&dirs::home_dir().unwrap());
|
||||||
dir.push(".magical-bitcoin");
|
dir.push(".bdk-bitcoin");
|
||||||
|
|
||||||
if !dir.exists() {
|
if !dir.exists() {
|
||||||
info!("Creating home directory {}", dir.as_path().display());
|
info!("Creating home directory {}", dir.as_path().display());
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "magical-macros"
|
name = "bdk-macros"
|
||||||
version = "0.1.0-beta.1"
|
version = "0.1.0-beta.1"
|
||||||
authors = ["Alekos Filini <alekos.filini@gmail.com>"]
|
authors = ["Alekos Filini <alekos.filini@gmail.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
@ -42,8 +42,8 @@
|
|||||||
//! ```no_run
|
//! ```no_run
|
||||||
//! # use std::sync::Arc;
|
//! # use std::sync::Arc;
|
||||||
//! # use bitcoin::*;
|
//! # use bitcoin::*;
|
||||||
//! # use magical::*;
|
//! # use bdk::*;
|
||||||
//! # use magical::blockchain::compact_filters::*;
|
//! # use bdk::blockchain::compact_filters::*;
|
||||||
//! let num_threads = 4;
|
//! let num_threads = 4;
|
||||||
//!
|
//!
|
||||||
//! let mempool = Arc::new(Mempool::default());
|
//! let mempool = Arc::new(Mempool::default());
|
||||||
@ -55,7 +55,7 @@
|
|||||||
//! ))
|
//! ))
|
||||||
//! .collect::<Result<_, _>>()?;
|
//! .collect::<Result<_, _>>()?;
|
||||||
//! let blockchain = CompactFiltersBlockchain::new(peers, "./wallet-filters", Some(500_000))?;
|
//! let blockchain = CompactFiltersBlockchain::new(peers, "./wallet-filters", Some(500_000))?;
|
||||||
//! # Ok::<(), magical::error::Error>(())
|
//! # Ok::<(), bdk::error::Error>(())
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
@ -31,10 +31,10 @@
|
|||||||
//! ## Example
|
//! ## Example
|
||||||
//!
|
//!
|
||||||
//! ```no_run
|
//! ```no_run
|
||||||
//! # use magical::blockchain::electrum::ElectrumBlockchain;
|
//! # use bdk::blockchain::electrum::ElectrumBlockchain;
|
||||||
//! let client = electrum_client::Client::new("ssl://electrum.blockstream.info:50002", None)?;
|
//! let client = electrum_client::Client::new("ssl://electrum.blockstream.info:50002", None)?;
|
||||||
//! let blockchain = ElectrumBlockchain::from(client);
|
//! let blockchain = ElectrumBlockchain::from(client);
|
||||||
//! # Ok::<(), magical::Error>(())
|
//! # Ok::<(), bdk::Error>(())
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
@ -60,7 +60,7 @@ pub struct ElectrumBlockchain(Client);
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
#[cfg(feature = "test-electrum")]
|
#[cfg(feature = "test-electrum")]
|
||||||
#[magical_blockchain_tests(crate)]
|
#[bdk_blockchain_tests(crate)]
|
||||||
fn local_electrs() -> ElectrumBlockchain {
|
fn local_electrs() -> ElectrumBlockchain {
|
||||||
ElectrumBlockchain::from(Client::new(&testutils::get_electrum_url(), None).unwrap())
|
ElectrumBlockchain::from(Client::new(&testutils::get_electrum_url(), None).unwrap())
|
||||||
}
|
}
|
||||||
|
@ -30,9 +30,9 @@
|
|||||||
//! ## Example
|
//! ## Example
|
||||||
//!
|
//!
|
||||||
//! ```no_run
|
//! ```no_run
|
||||||
//! # use magical::blockchain::esplora::EsploraBlockchain;
|
//! # use bdk::blockchain::esplora::EsploraBlockchain;
|
||||||
//! let blockchain = EsploraBlockchain::new("https://blockstream.info/testnet/api");
|
//! let blockchain = EsploraBlockchain::new("https://blockstream.info/testnet/api");
|
||||||
//! # Ok::<(), magical::Error>(())
|
//! # Ok::<(), bdk::Error>(())
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
//!
|
//!
|
||||||
//! ```
|
//! ```
|
||||||
//! # use std::sync::Arc;
|
//! # use std::sync::Arc;
|
||||||
//! # use magical::descriptor::*;
|
//! # use bdk::descriptor::*;
|
||||||
//! let desc = "wsh(and_v(v:pk(cV3oCth6zxZ1UVsHLnGothsWNsaoxRhC6aeNi5VbSdFpwUkgkEci),or_d(pk(cVMTy7uebJgvFaSBwcgvwk8qn8xSLc97dKow4MBetjrrahZoimm2),older(12960))))";
|
//! let desc = "wsh(and_v(v:pk(cV3oCth6zxZ1UVsHLnGothsWNsaoxRhC6aeNi5VbSdFpwUkgkEci),or_d(pk(cVMTy7uebJgvFaSBwcgvwk8qn8xSLc97dKow4MBetjrrahZoimm2),older(12960))))";
|
||||||
//!
|
//!
|
||||||
//! let (extended_desc, key_map) = ExtendedDescriptor::parse_secret(desc)?;
|
//! let (extended_desc, key_map) = ExtendedDescriptor::parse_secret(desc)?;
|
||||||
@ -40,7 +40,7 @@
|
|||||||
//! let signers = Arc::new(key_map.into());
|
//! let signers = Arc::new(key_map.into());
|
||||||
//! let policy = extended_desc.extract_policy(signers)?;
|
//! let policy = extended_desc.extract_policy(signers)?;
|
||||||
//! println!("policy: {}", serde_json::to_string(&policy)?);
|
//! println!("policy: {}", serde_json::to_string(&policy)?);
|
||||||
//! # Ok::<(), magical::Error>(())
|
//! # Ok::<(), bdk::Error>(())
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use std::cmp::max;
|
use std::cmp::max;
|
||||||
|
@ -40,7 +40,7 @@ extern crate serde_json;
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate async_trait;
|
extern crate async_trait;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate magical_macros;
|
extern crate bdk_macros;
|
||||||
|
|
||||||
#[cfg(any(test, feature = "compact_filters"))]
|
#[cfg(any(test, feature = "compact_filters"))]
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
|
@ -42,9 +42,9 @@
|
|||||||
//! ```
|
//! ```
|
||||||
//! # use std::sync::Arc;
|
//! # use std::sync::Arc;
|
||||||
//! # use bitcoin::*;
|
//! # use bitcoin::*;
|
||||||
//! # use magical::address_validator::*;
|
//! # use bdk::address_validator::*;
|
||||||
//! # use magical::database::*;
|
//! # use bdk::database::*;
|
||||||
//! # use magical::*;
|
//! # use bdk::*;
|
||||||
//! struct PrintAddressAndContinue;
|
//! struct PrintAddressAndContinue;
|
||||||
//!
|
//!
|
||||||
//! impl AddressValidator for PrintAddressAndContinue {
|
//! impl AddressValidator for PrintAddressAndContinue {
|
||||||
@ -71,7 +71,7 @@
|
|||||||
//!
|
//!
|
||||||
//! let address = wallet.get_new_address()?;
|
//! let address = wallet.get_new_address()?;
|
||||||
//! println!("Address: {}", address);
|
//! println!("Address: {}", address);
|
||||||
//! # Ok::<(), magical::Error>(())
|
//! # Ok::<(), bdk::Error>(())
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
@ -43,8 +43,8 @@
|
|||||||
//! # use std::str::FromStr;
|
//! # use std::str::FromStr;
|
||||||
//! # use bitcoin::*;
|
//! # use bitcoin::*;
|
||||||
//! # use bitcoin::consensus::serialize;
|
//! # use bitcoin::consensus::serialize;
|
||||||
//! # use magical::wallet::coin_selection::*;
|
//! # use bdk::wallet::coin_selection::*;
|
||||||
//! # use magical::*;
|
//! # use bdk::*;
|
||||||
//! #[derive(Debug)]
|
//! #[derive(Debug)]
|
||||||
//! struct AlwaysSpendEverything;
|
//! struct AlwaysSpendEverything;
|
||||||
//!
|
//!
|
||||||
@ -57,7 +57,7 @@
|
|||||||
//! amount_needed: u64,
|
//! amount_needed: u64,
|
||||||
//! input_witness_weight: usize,
|
//! input_witness_weight: usize,
|
||||||
//! fee_amount: f32,
|
//! fee_amount: f32,
|
||||||
//! ) -> Result<CoinSelectionResult, magical::Error> {
|
//! ) -> Result<CoinSelectionResult, bdk::Error> {
|
||||||
//! let selected_amount = utxos.iter().fold(0, |acc, utxo| acc + utxo.txout.value);
|
//! let selected_amount = utxos.iter().fold(0, |acc, utxo| acc + utxo.txout.value);
|
||||||
//! let all_utxos_selected = utxos
|
//! let all_utxos_selected = utxos
|
||||||
//! .into_iter()
|
//! .into_iter()
|
||||||
@ -77,7 +77,7 @@
|
|||||||
//! let additional_fees = additional_weight as f32 * fee_rate.as_sat_vb() / 4.0;
|
//! let additional_fees = additional_weight as f32 * fee_rate.as_sat_vb() / 4.0;
|
||||||
//!
|
//!
|
||||||
//! if (fee_amount + additional_fees).ceil() as u64 + amount_needed > selected_amount {
|
//! if (fee_amount + additional_fees).ceil() as u64 + amount_needed > selected_amount {
|
||||||
//! return Err(magical::Error::InsufficientFunds);
|
//! return Err(bdk::Error::InsufficientFunds);
|
||||||
//! }
|
//! }
|
||||||
//!
|
//!
|
||||||
//! Ok(CoinSelectionResult {
|
//! Ok(CoinSelectionResult {
|
||||||
@ -88,7 +88,7 @@
|
|||||||
//! }
|
//! }
|
||||||
//! }
|
//! }
|
||||||
//!
|
//!
|
||||||
//! # let wallet: OfflineWallet<_> = Wallet::new_offline("", None, Network::Testnet, magical::database::MemoryDatabase::default())?;
|
//! # let wallet: OfflineWallet<_> = Wallet::new_offline("", None, Network::Testnet, bdk::database::MemoryDatabase::default())?;
|
||||||
//! // create wallet, sync, ...
|
//! // create wallet, sync, ...
|
||||||
//!
|
//!
|
||||||
//! let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap();
|
//! let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap();
|
||||||
@ -99,7 +99,7 @@
|
|||||||
//!
|
//!
|
||||||
//! // inspect, sign, broadcast, ...
|
//! // inspect, sign, broadcast, ...
|
||||||
//!
|
//!
|
||||||
//! # Ok::<(), magical::Error>(())
|
//! # Ok::<(), bdk::Error>(())
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use bitcoin::consensus::encode::serialize;
|
use bitcoin::consensus::encode::serialize;
|
||||||
|
@ -33,9 +33,9 @@
|
|||||||
//! ```
|
//! ```
|
||||||
//! # use std::str::FromStr;
|
//! # use std::str::FromStr;
|
||||||
//! # use bitcoin::*;
|
//! # use bitcoin::*;
|
||||||
//! # use magical::database::*;
|
//! # use bdk::database::*;
|
||||||
//! # use magical::wallet::export::*;
|
//! # use bdk::wallet::export::*;
|
||||||
//! # use magical::*;
|
//! # use bdk::*;
|
||||||
//! let import = r#"{
|
//! let import = r#"{
|
||||||
//! "descriptor": "wpkh([c258d2e4\/84h\/1h\/0h]tpubDD3ynpHgJQW8VvWRzQ5WFDCrs4jqVFGHB3vLC3r49XHJSqP8bHKdK4AriuUKLccK68zfzowx7YhmDN8SiSkgCDENUFx9qVw65YyqM78vyVe\/0\/*)",
|
//! "descriptor": "wpkh([c258d2e4\/84h\/1h\/0h]tpubDD3ynpHgJQW8VvWRzQ5WFDCrs4jqVFGHB3vLC3r49XHJSqP8bHKdK4AriuUKLccK68zfzowx7YhmDN8SiSkgCDENUFx9qVw65YyqM78vyVe\/0\/*)",
|
||||||
//! "blockheight":1782088,
|
//! "blockheight":1782088,
|
||||||
@ -44,15 +44,15 @@
|
|||||||
//!
|
//!
|
||||||
//! let import = WalletExport::from_str(import)?;
|
//! let import = WalletExport::from_str(import)?;
|
||||||
//! let wallet: OfflineWallet<_> = Wallet::new_offline(&import.descriptor(), import.change_descriptor().as_deref(), Network::Testnet, MemoryDatabase::default())?;
|
//! let wallet: OfflineWallet<_> = Wallet::new_offline(&import.descriptor(), import.change_descriptor().as_deref(), Network::Testnet, MemoryDatabase::default())?;
|
||||||
//! # Ok::<_, magical::Error>(())
|
//! # Ok::<_, bdk::Error>(())
|
||||||
//! ```
|
//! ```
|
||||||
//!
|
//!
|
||||||
//! ### Export a `Wallet`
|
//! ### Export a `Wallet`
|
||||||
//! ```
|
//! ```
|
||||||
//! # use bitcoin::*;
|
//! # use bitcoin::*;
|
||||||
//! # use magical::database::*;
|
//! # use bdk::database::*;
|
||||||
//! # use magical::wallet::export::*;
|
//! # use bdk::wallet::export::*;
|
||||||
//! # use magical::*;
|
//! # use bdk::*;
|
||||||
//! let wallet: OfflineWallet<_> = Wallet::new_offline(
|
//! let wallet: OfflineWallet<_> = Wallet::new_offline(
|
||||||
//! "wpkh([c258d2e4/84h/1h/0h]tpubDD3ynpHgJQW8VvWRzQ5WFDCrs4jqVFGHB3vLC3r49XHJSqP8bHKdK4AriuUKLccK68zfzowx7YhmDN8SiSkgCDENUFx9qVw65YyqM78vyVe/0/*)",
|
//! "wpkh([c258d2e4/84h/1h/0h]tpubDD3ynpHgJQW8VvWRzQ5WFDCrs4jqVFGHB3vLC3r49XHJSqP8bHKdK4AriuUKLccK68zfzowx7YhmDN8SiSkgCDENUFx9qVw65YyqM78vyVe/0/*)",
|
||||||
//! Some("wpkh([c258d2e4/84h/1h/0h]tpubDD3ynpHgJQW8VvWRzQ5WFDCrs4jqVFGHB3vLC3r49XHJSqP8bHKdK4AriuUKLccK68zfzowx7YhmDN8SiSkgCDENUFx9qVw65YyqM78vyVe/1/*)"),
|
//! Some("wpkh([c258d2e4/84h/1h/0h]tpubDD3ynpHgJQW8VvWRzQ5WFDCrs4jqVFGHB3vLC3r49XHJSqP8bHKdK4AriuUKLccK68zfzowx7YhmDN8SiSkgCDENUFx9qVw65YyqM78vyVe/1/*)"),
|
||||||
@ -61,10 +61,10 @@
|
|||||||
//! )?;
|
//! )?;
|
||||||
//! let export = WalletExport::export_wallet(&wallet, "exported wallet", true)
|
//! let export = WalletExport::export_wallet(&wallet, "exported wallet", true)
|
||||||
//! .map_err(ToString::to_string)
|
//! .map_err(ToString::to_string)
|
||||||
//! .map_err(magical::Error::Generic)?;
|
//! .map_err(bdk::Error::Generic)?;
|
||||||
//!
|
//!
|
||||||
//! println!("Exported: {}", export.to_string());
|
//! println!("Exported: {}", export.to_string());
|
||||||
//! # Ok::<_, magical::Error>(())
|
//! # Ok::<_, bdk::Error>(())
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
@ -229,8 +229,8 @@ where
|
|||||||
/// ```no_run
|
/// ```no_run
|
||||||
/// # use std::str::FromStr;
|
/// # use std::str::FromStr;
|
||||||
/// # use bitcoin::*;
|
/// # use bitcoin::*;
|
||||||
/// # use magical::*;
|
/// # use bdk::*;
|
||||||
/// # use magical::database::*;
|
/// # use bdk::database::*;
|
||||||
/// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
|
/// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
|
||||||
/// # let wallet: OfflineWallet<_> = Wallet::new_offline(descriptor, None, Network::Testnet, MemoryDatabase::default())?;
|
/// # let wallet: OfflineWallet<_> = Wallet::new_offline(descriptor, None, Network::Testnet, MemoryDatabase::default())?;
|
||||||
/// # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap();
|
/// # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap();
|
||||||
@ -238,7 +238,7 @@ where
|
|||||||
/// TxBuilder::with_recipients(vec![(to_address.script_pubkey(), 50_000)])
|
/// TxBuilder::with_recipients(vec![(to_address.script_pubkey(), 50_000)])
|
||||||
/// )?;
|
/// )?;
|
||||||
/// // sign and broadcast ...
|
/// // sign and broadcast ...
|
||||||
/// # Ok::<(), magical::Error>(())
|
/// # Ok::<(), bdk::Error>(())
|
||||||
/// ```
|
/// ```
|
||||||
pub fn create_tx<Cs: coin_selection::CoinSelectionAlgorithm>(
|
pub fn create_tx<Cs: coin_selection::CoinSelectionAlgorithm>(
|
||||||
&self,
|
&self,
|
||||||
@ -453,8 +453,8 @@ where
|
|||||||
/// ```no_run
|
/// ```no_run
|
||||||
/// # use std::str::FromStr;
|
/// # use std::str::FromStr;
|
||||||
/// # use bitcoin::*;
|
/// # use bitcoin::*;
|
||||||
/// # use magical::*;
|
/// # use bdk::*;
|
||||||
/// # use magical::database::*;
|
/// # use bdk::database::*;
|
||||||
/// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
|
/// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
|
||||||
/// # let wallet: OfflineWallet<_> = Wallet::new_offline(descriptor, None, Network::Testnet, MemoryDatabase::default())?;
|
/// # let wallet: OfflineWallet<_> = Wallet::new_offline(descriptor, None, Network::Testnet, MemoryDatabase::default())?;
|
||||||
/// let txid = Txid::from_str("faff0a466b70f5d5f92bd757a92c1371d4838bdd5bc53a06764e2488e51ce8f8").unwrap();
|
/// let txid = Txid::from_str("faff0a466b70f5d5f92bd757a92c1371d4838bdd5bc53a06764e2488e51ce8f8").unwrap();
|
||||||
@ -463,7 +463,7 @@ where
|
|||||||
/// TxBuilder::new().fee_rate(FeeRate::from_sat_per_vb(5.0)),
|
/// TxBuilder::new().fee_rate(FeeRate::from_sat_per_vb(5.0)),
|
||||||
/// )?;
|
/// )?;
|
||||||
/// // sign and broadcast ...
|
/// // sign and broadcast ...
|
||||||
/// # Ok::<(), magical::Error>(())
|
/// # Ok::<(), bdk::Error>(())
|
||||||
/// ```
|
/// ```
|
||||||
// TODO: support for merging multiple transactions while bumping the fees
|
// TODO: support for merging multiple transactions while bumping the fees
|
||||||
// TODO: option to force addition of an extra output? seems bad for privacy to update the
|
// TODO: option to force addition of an extra output? seems bad for privacy to update the
|
||||||
@ -691,13 +691,13 @@ where
|
|||||||
/// ```no_run
|
/// ```no_run
|
||||||
/// # use std::str::FromStr;
|
/// # use std::str::FromStr;
|
||||||
/// # use bitcoin::*;
|
/// # use bitcoin::*;
|
||||||
/// # use magical::*;
|
/// # use bdk::*;
|
||||||
/// # use magical::database::*;
|
/// # use bdk::database::*;
|
||||||
/// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
|
/// # let descriptor = "wpkh(tpubD6NzVbkrYhZ4Xferm7Pz4VnjdcDPFyjVu5K4iZXQ4pVN8Cks4pHVowTBXBKRhX64pkRyJZJN5xAKj4UDNnLPb5p2sSKXhewoYx5GbTdUFWq/*)";
|
||||||
/// # let wallet: OfflineWallet<_> = Wallet::new_offline(descriptor, None, Network::Testnet, MemoryDatabase::default())?;
|
/// # let wallet: OfflineWallet<_> = Wallet::new_offline(descriptor, None, Network::Testnet, MemoryDatabase::default())?;
|
||||||
/// # let (psbt, _) = wallet.create_tx(TxBuilder::new())?;
|
/// # let (psbt, _) = wallet.create_tx(TxBuilder::new())?;
|
||||||
/// let (signed_psbt, finalized) = wallet.sign(psbt, None)?;
|
/// let (signed_psbt, finalized) = wallet.sign(psbt, None)?;
|
||||||
/// # Ok::<(), magical::Error>(())
|
/// # Ok::<(), bdk::Error>(())
|
||||||
pub fn sign(&self, mut psbt: PSBT, assume_height: Option<u32>) -> Result<(PSBT, bool), Error> {
|
pub fn sign(&self, mut psbt: PSBT, assume_height: Option<u32>) -> Result<(PSBT, bool), Error> {
|
||||||
// this helps us doing our job later
|
// this helps us doing our job later
|
||||||
self.add_input_hd_keypaths(&mut psbt)?;
|
self.add_input_hd_keypaths(&mut psbt)?;
|
||||||
|
@ -33,9 +33,9 @@
|
|||||||
//! # use bitcoin::*;
|
//! # use bitcoin::*;
|
||||||
//! # use bitcoin::util::psbt;
|
//! # use bitcoin::util::psbt;
|
||||||
//! # use bitcoin::util::bip32::Fingerprint;
|
//! # use bitcoin::util::bip32::Fingerprint;
|
||||||
//! # use magical::signer::*;
|
//! # use bdk::signer::*;
|
||||||
//! # use magical::database::*;
|
//! # use bdk::database::*;
|
||||||
//! # use magical::*;
|
//! # use bdk::*;
|
||||||
//! # #[derive(Debug)]
|
//! # #[derive(Debug)]
|
||||||
//! # struct CustomHSM;
|
//! # struct CustomHSM;
|
||||||
//! # impl CustomHSM {
|
//! # impl CustomHSM {
|
||||||
@ -85,7 +85,7 @@
|
|||||||
//! Arc::new(Box::new(custom_signer))
|
//! Arc::new(Box::new(custom_signer))
|
||||||
//! );
|
//! );
|
||||||
//!
|
//!
|
||||||
//! # Ok::<_, magical::Error>(())
|
//! # Ok::<_, bdk::Error>(())
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
//! ```
|
//! ```
|
||||||
//! # use std::str::FromStr;
|
//! # use std::str::FromStr;
|
||||||
//! # use bitcoin::*;
|
//! # use bitcoin::*;
|
||||||
//! # use magical::*;
|
//! # use bdk::*;
|
||||||
//! # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap();
|
//! # let to_address = Address::from_str("2N4eQYCbKUHCCTUjBJeHcJp9ok6J2GZsTDt").unwrap();
|
||||||
//! // Create a transaction with one output to `to_address` of 50_000 satoshi, with a custom fee rate
|
//! // Create a transaction with one output to `to_address` of 50_000 satoshi, with a custom fee rate
|
||||||
//! // of 5.0 satoshi/vbyte, only spending non-change outputs and with RBF signaling
|
//! // of 5.0 satoshi/vbyte, only spending non-change outputs and with RBF signaling
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "magical-testutils-macros"
|
name = "bdk-testutils-macros"
|
||||||
version = "0.1.0-beta.1"
|
version = "0.1.0-beta.1"
|
||||||
authors = ["Alekos Filini <alekos.filini@gmail.com>"]
|
authors = ["Alekos Filini <alekos.filini@gmail.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
@ -31,7 +31,7 @@ use syn::spanned::Spanned;
|
|||||||
use syn::{parse, parse2, Ident, ReturnType};
|
use syn::{parse, parse2, Ident, ReturnType};
|
||||||
|
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn magical_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream {
|
pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||||
let root_ident = if !attr.is_empty() {
|
let root_ident = if !attr.is_empty() {
|
||||||
match parse::<syn::ExprPath>(attr) {
|
match parse::<syn::ExprPath>(attr) {
|
||||||
Ok(parsed) => parsed,
|
Ok(parsed) => parsed,
|
||||||
@ -44,12 +44,12 @@ pub fn magical_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenSt
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
parse2::<syn::ExprPath>(quote! { magical }).unwrap()
|
parse2::<syn::ExprPath>(quote! { bdk }).unwrap()
|
||||||
};
|
};
|
||||||
|
|
||||||
match parse::<syn::ItemFn>(item) {
|
match parse::<syn::ItemFn>(item) {
|
||||||
Err(_) => (quote! {
|
Err(_) => (quote! {
|
||||||
compile_error!("#[magical_blockchain_tests] can only be used on `fn`s")
|
compile_error!("#[bdk_blockchain_tests] can only be used on `fn`s")
|
||||||
})
|
})
|
||||||
.into(),
|
.into(),
|
||||||
Ok(parsed) => {
|
Ok(parsed) => {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "magical-testutils"
|
name = "bdk-testutils"
|
||||||
version = "0.1.0-beta.1"
|
version = "0.1.0-beta.1"
|
||||||
authors = ["Alekos Filini <alekos.filini@gmail.com>"]
|
authors = ["Alekos Filini <alekos.filini@gmail.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user