chore: bump rust bdk to alpha 11
This commit is contained in:
parent
f27bada9c9
commit
97d9bb6fbf
@ -3,6 +3,9 @@ Changelog information can also be found in each release's git tag (which can be
|
|||||||
|
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [1.0.0-alpha.11]
|
||||||
|
This release adds the new `Amount` type, as well as more fine-grain errors.
|
||||||
|
|
||||||
## [1.0.0-alpha.7]
|
## [1.0.0-alpha.7]
|
||||||
This release brings back into the 1.0 API a number of APIs from the 0.31 release, and adds the new flat file persistence feature, as well as more fine-grain errors.
|
This release brings back into the 1.0 API a number of APIs from the 0.31 release, and adds the new flat file persistence feature, as well as more fine-grain errors.
|
||||||
|
|
||||||
|
@ -33,9 +33,9 @@ class LiveTxBuilderTest {
|
|||||||
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
||||||
wallet.applyUpdate(update)
|
wallet.applyUpdate(update)
|
||||||
wallet.commit()
|
wallet.commit()
|
||||||
println("Balance: ${wallet.getBalance().total}")
|
println("Balance: ${wallet.getBalance().total.toSat()}")
|
||||||
|
|
||||||
assert(wallet.getBalance().total > 0uL) {
|
assert(wallet.getBalance().total.toSat() > 0uL) {
|
||||||
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,9 +59,9 @@ class LiveTxBuilderTest {
|
|||||||
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
||||||
wallet.applyUpdate(update)
|
wallet.applyUpdate(update)
|
||||||
wallet.commit()
|
wallet.commit()
|
||||||
println("Balance: ${wallet.getBalance().total}")
|
println("Balance: ${wallet.getBalance().total.toSat()}")
|
||||||
|
|
||||||
assert(wallet.getBalance().total > 0uL) {
|
assert(wallet.getBalance().total.toSat() > 0uL) {
|
||||||
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,11 +33,11 @@ class LiveWalletTest {
|
|||||||
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
||||||
wallet.applyUpdate(update)
|
wallet.applyUpdate(update)
|
||||||
wallet.commit()
|
wallet.commit()
|
||||||
println("Balance: ${wallet.getBalance().total}")
|
println("Balance: ${wallet.getBalance().total.toSat()}")
|
||||||
val balance: Balance = wallet.getBalance()
|
val balance: Balance = wallet.getBalance()
|
||||||
println("Balance: $balance")
|
println("Balance: $balance")
|
||||||
|
|
||||||
assert(wallet.getBalance().total > 0uL) {
|
assert(wallet.getBalance().total.toSat() > 0uL) {
|
||||||
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,9 +60,9 @@ class LiveWalletTest {
|
|||||||
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
||||||
wallet.applyUpdate(update)
|
wallet.applyUpdate(update)
|
||||||
wallet.commit()
|
wallet.commit()
|
||||||
println("Balance: ${wallet.getBalance().total}")
|
println("Balance: ${wallet.getBalance().total.toSat()}")
|
||||||
|
|
||||||
assert(wallet.getBalance().total > 0uL) {
|
assert(wallet.getBalance().total.toSat() > 0uL) {
|
||||||
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
|
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ class OfflineWalletTest {
|
|||||||
|
|
||||||
assertEquals(
|
assertEquals(
|
||||||
expected = 0uL,
|
expected = 0uL,
|
||||||
actual = wallet.getBalance().total
|
actual = wallet.getBalance().total.toSat()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
20
bdk-ffi/Cargo.lock
generated
20
bdk-ffi/Cargo.lock
generated
@ -138,9 +138,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bdk"
|
name = "bdk"
|
||||||
version = "1.0.0-alpha.10"
|
version = "1.0.0-alpha.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "66fc0ebc2a63463f709cfdfbb7e7877b9975bcaea9d2d4f02f97ad012de37e3b"
|
checksum = "65c23f2903ac5dbb7b35934ae319aadc946201e4fa51b652440bd1c8fa3080ee"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bdk_chain",
|
"bdk_chain",
|
||||||
@ -170,9 +170,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bdk_chain"
|
name = "bdk_chain"
|
||||||
version = "0.13.0"
|
version = "0.14.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e879c03ebf3a64643295152a19a8b0e0a3af22e25539d2bc56ce07d07b059c33"
|
checksum = "440ec5b1c8911f126b540e05c98493b699b497a3cb90c5e9c5eee21cdd8d1e01"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitcoin",
|
"bitcoin",
|
||||||
"miniscript",
|
"miniscript",
|
||||||
@ -181,9 +181,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bdk_esplora"
|
name = "bdk_esplora"
|
||||||
version = "0.12.0"
|
version = "0.13.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b0aad9d99b103cd9c67ce1f4702720f2813db7aeba72abc9628ae9b00462a492"
|
checksum = "9fb5b46f8c256bc083640342bd0d35ec1963971f18800c3fee1a9189eda60ecd"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bdk_chain",
|
"bdk_chain",
|
||||||
"esplora-client",
|
"esplora-client",
|
||||||
@ -191,9 +191,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bdk_file_store"
|
name = "bdk_file_store"
|
||||||
version = "0.10.0"
|
version = "0.11.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "492a011ee853773bce14f2d899fa34fe3ac3b5f39eeb1504d0d2b28de448bd73"
|
checksum = "5dfd7e9a5edb8d384ea1836b0bcd4febdd3211815acc058d64c7e284776d69ab"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bdk_chain",
|
"bdk_chain",
|
||||||
@ -204,9 +204,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bdk_persist"
|
name = "bdk_persist"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f6f7d6b38071ee828329434f86799e0bb6aaa5a4256e225480c2c53b7b2df295"
|
checksum = "aba103c2108dd0f0b452650043d21c449ae07ce866dbaea29a9c59899a5964f0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bdk_chain",
|
"bdk_chain",
|
||||||
|
@ -18,9 +18,9 @@ path = "uniffi-bindgen.rs"
|
|||||||
default = ["uniffi/cli"]
|
default = ["uniffi/cli"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bdk = { version = "1.0.0-alpha.10", features = ["all-keys", "keys-bip39"] }
|
bdk = { version = "1.0.0-alpha.11", features = ["all-keys", "keys-bip39"] }
|
||||||
bdk_esplora = { version = "0.12.0", default-features = false, features = ["std", "blocking", "blocking-https-rustls"] }
|
bdk_esplora = { version = "0.13.0", default-features = false, features = ["std", "blocking", "blocking-https-rustls"] }
|
||||||
bdk_file_store = { version = "0.10.0" }
|
bdk_file_store = { version = "0.11.0" }
|
||||||
|
|
||||||
uniffi = { version = "=0.26.1" }
|
uniffi = { version = "=0.26.1" }
|
||||||
bitcoin-internals = { version = "0.2.0", features = ["alloc"] }
|
bitcoin-internals = { version = "0.2.0", features = ["alloc"] }
|
||||||
|
@ -131,6 +131,19 @@ enum FeeRateError {
|
|||||||
"ArithmeticOverflow"
|
"ArithmeticOverflow"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
[Error]
|
||||||
|
interface ParseAmountError {
|
||||||
|
Negative();
|
||||||
|
TooBig();
|
||||||
|
TooPrecise();
|
||||||
|
InvalidFormat();
|
||||||
|
InputTooLarge();
|
||||||
|
InvalidCharacter(string error_message);
|
||||||
|
UnknownDenomination(string error_message);
|
||||||
|
PossiblyConfusingDenomination(string error_message);
|
||||||
|
OtherParseAmountErr();
|
||||||
|
};
|
||||||
|
|
||||||
[Error]
|
[Error]
|
||||||
interface PersistenceError {
|
interface PersistenceError {
|
||||||
Write(string error_message);
|
Write(string error_message);
|
||||||
@ -185,6 +198,7 @@ interface WalletCreationError {
|
|||||||
NotInitialized();
|
NotInitialized();
|
||||||
LoadedGenesisDoesNotMatch(string expected, string got);
|
LoadedGenesisDoesNotMatch(string expected, string got);
|
||||||
LoadedNetworkDoesNotMatch(Network expected, Network? got);
|
LoadedNetworkDoesNotMatch(Network expected, Network? got);
|
||||||
|
LoadedDescriptorDoesNotMatch(string got, KeychainKind keychain);
|
||||||
};
|
};
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
@ -203,17 +217,17 @@ dictionary AddressInfo {
|
|||||||
};
|
};
|
||||||
|
|
||||||
dictionary Balance {
|
dictionary Balance {
|
||||||
u64 immature;
|
Amount immature;
|
||||||
|
|
||||||
u64 trusted_pending;
|
Amount trusted_pending;
|
||||||
|
|
||||||
u64 untrusted_pending;
|
Amount untrusted_pending;
|
||||||
|
|
||||||
u64 confirmed;
|
Amount confirmed;
|
||||||
|
|
||||||
u64 trusted_spendable;
|
Amount trusted_spendable;
|
||||||
|
|
||||||
u64 total;
|
Amount total;
|
||||||
};
|
};
|
||||||
|
|
||||||
dictionary LocalOutput {
|
dictionary LocalOutput {
|
||||||
@ -302,7 +316,7 @@ interface Update {};
|
|||||||
interface TxBuilder {
|
interface TxBuilder {
|
||||||
constructor();
|
constructor();
|
||||||
|
|
||||||
TxBuilder add_recipient([ByRef] Script script, u64 amount);
|
TxBuilder add_recipient([ByRef] Script script, Amount amount);
|
||||||
|
|
||||||
TxBuilder set_recipients(sequence<ScriptAmount> recipients);
|
TxBuilder set_recipients(sequence<ScriptAmount> recipients);
|
||||||
|
|
||||||
@ -456,12 +470,12 @@ interface EsploraClient {
|
|||||||
|
|
||||||
dictionary ScriptAmount {
|
dictionary ScriptAmount {
|
||||||
Script script;
|
Script script;
|
||||||
u64 amount;
|
Amount amount;
|
||||||
};
|
};
|
||||||
|
|
||||||
dictionary SentAndReceivedValues {
|
dictionary SentAndReceivedValues {
|
||||||
u64 sent;
|
Amount sent;
|
||||||
u64 received;
|
Amount received;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
@ -543,6 +557,18 @@ dictionary OutPoint {
|
|||||||
u32 vout;
|
u32 vout;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
interface Amount {
|
||||||
|
[Name=from_sat]
|
||||||
|
constructor(u64 from_sat);
|
||||||
|
|
||||||
|
[Name=from_btc, Throws=ParseAmountError]
|
||||||
|
constructor(f64 from_btc);
|
||||||
|
|
||||||
|
u64 to_sat();
|
||||||
|
|
||||||
|
f64 to_btc();
|
||||||
|
};
|
||||||
|
|
||||||
interface FeeRate {
|
interface FeeRate {
|
||||||
[Name=from_sat_per_vb, Throws=FeeRateError]
|
[Name=from_sat_per_vb, Throws=FeeRateError]
|
||||||
constructor(u64 sat_per_vb);
|
constructor(u64 sat_per_vb);
|
||||||
|
@ -18,6 +18,43 @@ use std::io::Cursor;
|
|||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
|
use bdk::bitcoin::amount::ParseAmountError;
|
||||||
|
use bdk::bitcoin::Amount as BdkAmount;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||||
|
pub struct Amount(pub(crate) BdkAmount);
|
||||||
|
|
||||||
|
impl Amount {
|
||||||
|
pub fn from_sat(sat: u64) -> Self {
|
||||||
|
Amount(BdkAmount::from_sat(sat))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_btc(btc: f64) -> Result<Self, ParseAmountError> {
|
||||||
|
let bdk_amount = BdkAmount::from_btc(btc).map_err(ParseAmountError::from)?;
|
||||||
|
Ok(Amount(bdk_amount))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_sat(&self) -> u64 {
|
||||||
|
self.0.to_sat()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_btc(&self) -> f64 {
|
||||||
|
self.0.to_btc()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Amount> for BdkAmount {
|
||||||
|
fn from(amount: Amount) -> Self {
|
||||||
|
amount.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<BdkAmount> for Amount {
|
||||||
|
fn from(amount: BdkAmount) -> Self {
|
||||||
|
Amount(amount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||||
pub struct Script(pub(crate) BdkScriptBuf);
|
pub struct Script(pub(crate) BdkScriptBuf);
|
||||||
|
|
||||||
|
@ -17,12 +17,15 @@ use bdk_esplora::esplora_client::{Error as BdkEsploraError, Error};
|
|||||||
use bdk_file_store::FileError as BdkFileError;
|
use bdk_file_store::FileError as BdkFileError;
|
||||||
use bitcoin_internals::hex::display::DisplayHex;
|
use bitcoin_internals::hex::display::DisplayHex;
|
||||||
|
|
||||||
|
use bdk::bitcoin::amount::ParseAmountError as BdkParseAmountError;
|
||||||
|
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
|
|
||||||
use bdk::bitcoin::address::Error as BdkAddressError;
|
use bdk::bitcoin::address::Error as BdkAddressError;
|
||||||
use bdk::bitcoin::consensus::encode::Error as BdkEncodeError;
|
use bdk::bitcoin::consensus::encode::Error as BdkEncodeError;
|
||||||
use bdk::bitcoin::psbt::ExtractTxError as BdkExtractTxError;
|
use bdk::bitcoin::psbt::ExtractTxError as BdkExtractTxError;
|
||||||
use bdk::chain::local_chain::CannotConnectError as BdkCannotConnectError;
|
use bdk::chain::local_chain::CannotConnectError as BdkCannotConnectError;
|
||||||
|
use bdk::KeychainKind;
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// error definitions
|
// error definitions
|
||||||
@ -317,6 +320,37 @@ pub enum FeeRateError {
|
|||||||
ArithmeticOverflow,
|
ArithmeticOverflow,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, thiserror::Error)]
|
||||||
|
pub enum ParseAmountError {
|
||||||
|
#[error("amount is negative")]
|
||||||
|
Negative,
|
||||||
|
|
||||||
|
#[error("amount is too large")]
|
||||||
|
TooBig,
|
||||||
|
|
||||||
|
#[error("amount is too precise")]
|
||||||
|
TooPrecise,
|
||||||
|
|
||||||
|
#[error("invalid amount format")]
|
||||||
|
InvalidFormat,
|
||||||
|
|
||||||
|
#[error("input is too large")]
|
||||||
|
InputTooLarge,
|
||||||
|
|
||||||
|
#[error("invalid character: {error_message}")]
|
||||||
|
InvalidCharacter { error_message: String },
|
||||||
|
|
||||||
|
#[error("unknown denomination: {error_message}")]
|
||||||
|
UnknownDenomination { error_message: String },
|
||||||
|
|
||||||
|
#[error("possibly confusing denomination: {error_message}")]
|
||||||
|
PossiblyConfusingDenomination { error_message: String },
|
||||||
|
|
||||||
|
// Has to handle non-exhaustive
|
||||||
|
#[error("unknown parse amount error")]
|
||||||
|
OtherParseAmountErr,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, thiserror::Error)]
|
#[derive(Debug, thiserror::Error)]
|
||||||
pub enum PersistenceError {
|
pub enum PersistenceError {
|
||||||
#[error("writing to persistence error: {error_message}")]
|
#[error("writing to persistence error: {error_message}")]
|
||||||
@ -434,6 +468,9 @@ pub enum WalletCreationError {
|
|||||||
expected: Network,
|
expected: Network,
|
||||||
got: Option<Network>,
|
got: Option<Network>,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
#[error("loaded descriptor '{got}' does not match what was provided '{keychain:?}'")]
|
||||||
|
LoadedDescriptorDoesNotMatch { got: String, keychain: KeychainKind },
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
@ -800,6 +837,28 @@ impl From<BdkExtractTxError> for ExtractTxError {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<BdkParseAmountError> for ParseAmountError {
|
||||||
|
fn from(error: BdkParseAmountError) -> Self {
|
||||||
|
match error {
|
||||||
|
BdkParseAmountError::Negative => ParseAmountError::Negative,
|
||||||
|
BdkParseAmountError::TooBig => ParseAmountError::TooBig,
|
||||||
|
BdkParseAmountError::InvalidFormat => ParseAmountError::InvalidFormat,
|
||||||
|
BdkParseAmountError::TooPrecise => ParseAmountError::TooPrecise,
|
||||||
|
BdkParseAmountError::InputTooLarge => ParseAmountError::InputTooLarge,
|
||||||
|
BdkParseAmountError::InvalidCharacter(c) => ParseAmountError::InvalidCharacter {
|
||||||
|
error_message: c.to_string(),
|
||||||
|
},
|
||||||
|
BdkParseAmountError::UnknownDenomination(s) => {
|
||||||
|
ParseAmountError::UnknownDenomination { error_message: s }
|
||||||
|
}
|
||||||
|
BdkParseAmountError::PossiblyConfusingDenomination(s) => {
|
||||||
|
ParseAmountError::PossiblyConfusingDenomination { error_message: s }
|
||||||
|
}
|
||||||
|
_ => ParseAmountError::OtherParseAmountErr,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<std::io::Error> for PersistenceError {
|
impl From<std::io::Error> for PersistenceError {
|
||||||
fn from(error: std::io::Error) -> Self {
|
fn from(error: std::io::Error) -> Self {
|
||||||
PersistenceError::Write {
|
PersistenceError::Write {
|
||||||
@ -902,6 +961,12 @@ impl From<NewOrLoadError> for WalletCreationError {
|
|||||||
NewOrLoadError::LoadedNetworkDoesNotMatch { expected, got } => {
|
NewOrLoadError::LoadedNetworkDoesNotMatch { expected, got } => {
|
||||||
WalletCreationError::LoadedNetworkDoesNotMatch { expected, got }
|
WalletCreationError::LoadedNetworkDoesNotMatch { expected, got }
|
||||||
}
|
}
|
||||||
|
NewOrLoadError::LoadedDescriptorDoesNotMatch { got, keychain } => {
|
||||||
|
WalletCreationError::LoadedDescriptorDoesNotMatch {
|
||||||
|
got: format!("{:?}", got),
|
||||||
|
keychain,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -914,13 +979,14 @@ impl From<NewOrLoadError> for WalletCreationError {
|
|||||||
mod test {
|
mod test {
|
||||||
use crate::error::{
|
use crate::error::{
|
||||||
AddressError, Bip32Error, Bip39Error, CannotConnectError, CreateTxError, DescriptorError,
|
AddressError, Bip32Error, Bip39Error, CannotConnectError, CreateTxError, DescriptorError,
|
||||||
DescriptorKeyError, EsploraError, ExtractTxError, FeeRateError, PersistenceError,
|
DescriptorKeyError, EsploraError, ExtractTxError, FeeRateError, ParseAmountError,
|
||||||
PsbtParseError, TransactionError, TxidParseError, WalletCreationError,
|
PersistenceError, PsbtParseError, TransactionError, TxidParseError, WalletCreationError,
|
||||||
};
|
};
|
||||||
use crate::CalculateFeeError;
|
use crate::CalculateFeeError;
|
||||||
use crate::OutPoint;
|
use crate::OutPoint;
|
||||||
use crate::SignerError;
|
use crate::SignerError;
|
||||||
use bdk::bitcoin::Network;
|
use bdk::bitcoin::Network;
|
||||||
|
use bdk::KeychainKind;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_error_address() {
|
fn test_error_address() {
|
||||||
@ -1418,6 +1484,43 @@ mod test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_error_parse_amount() {
|
||||||
|
let cases = vec![
|
||||||
|
(ParseAmountError::Negative, "amount is negative"),
|
||||||
|
(ParseAmountError::TooBig, "amount is too large"),
|
||||||
|
(ParseAmountError::TooPrecise, "amount is too precise"),
|
||||||
|
(ParseAmountError::InvalidFormat, "invalid amount format"),
|
||||||
|
(ParseAmountError::InputTooLarge, "input is too large"),
|
||||||
|
(
|
||||||
|
ParseAmountError::InvalidCharacter {
|
||||||
|
error_message: "invalid char".to_string(),
|
||||||
|
},
|
||||||
|
"invalid character: invalid char",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
ParseAmountError::UnknownDenomination {
|
||||||
|
error_message: "unknown denom".to_string(),
|
||||||
|
},
|
||||||
|
"unknown denomination: unknown denom",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
ParseAmountError::PossiblyConfusingDenomination {
|
||||||
|
error_message: "confusing denom".to_string(),
|
||||||
|
},
|
||||||
|
"possibly confusing denomination: confusing denom",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
ParseAmountError::OtherParseAmountErr,
|
||||||
|
"unknown parse amount error",
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
|
for (error, expected_message) in cases {
|
||||||
|
assert_eq!(error.to_string(), expected_message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_persistence_error() {
|
fn test_persistence_error() {
|
||||||
let cases = vec![
|
let cases = vec![
|
||||||
@ -1605,6 +1708,13 @@ mod test {
|
|||||||
},
|
},
|
||||||
"loaded network type is not bitcoin, got Some(Testnet)".to_string(),
|
"loaded network type is not bitcoin, got Some(Testnet)".to_string(),
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
WalletCreationError::LoadedDescriptorDoesNotMatch {
|
||||||
|
got: "def".to_string(),
|
||||||
|
keychain: KeychainKind::External,
|
||||||
|
},
|
||||||
|
"loaded descriptor 'def' does not match what was provided 'External'".to_string(),
|
||||||
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
for (error, expected) in errors {
|
for (error, expected) in errors {
|
||||||
|
@ -7,6 +7,7 @@ mod types;
|
|||||||
mod wallet;
|
mod wallet;
|
||||||
|
|
||||||
use crate::bitcoin::Address;
|
use crate::bitcoin::Address;
|
||||||
|
use crate::bitcoin::Amount;
|
||||||
use crate::bitcoin::FeeRate;
|
use crate::bitcoin::FeeRate;
|
||||||
use crate::bitcoin::OutPoint;
|
use crate::bitcoin::OutPoint;
|
||||||
use crate::bitcoin::Psbt;
|
use crate::bitcoin::Psbt;
|
||||||
@ -25,6 +26,7 @@ use crate::error::DescriptorKeyError;
|
|||||||
use crate::error::EsploraError;
|
use crate::error::EsploraError;
|
||||||
use crate::error::ExtractTxError;
|
use crate::error::ExtractTxError;
|
||||||
use crate::error::FeeRateError;
|
use crate::error::FeeRateError;
|
||||||
|
use crate::error::ParseAmountError;
|
||||||
use crate::error::PersistenceError;
|
use crate::error::PersistenceError;
|
||||||
use crate::error::PsbtParseError;
|
use crate::error::PsbtParseError;
|
||||||
use crate::error::SignerError;
|
use crate::error::SignerError;
|
||||||
|
@ -11,6 +11,8 @@ use bdk::LocalOutput as BdkLocalOutput;
|
|||||||
|
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
|
use crate::bitcoin::Amount;
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub enum ChainPosition {
|
pub enum ChainPosition {
|
||||||
Confirmed { height: u32, timestamp: u64 },
|
Confirmed { height: u32, timestamp: u64 },
|
||||||
@ -45,7 +47,7 @@ impl From<BdkCanonicalTx<'_, Arc<bdk::bitcoin::Transaction>, ConfirmationTimeHei
|
|||||||
|
|
||||||
pub struct ScriptAmount {
|
pub struct ScriptAmount {
|
||||||
pub script: Arc<Script>,
|
pub script: Arc<Script>,
|
||||||
pub amount: u64,
|
pub amount: Arc<Amount>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct AddressInfo {
|
pub struct AddressInfo {
|
||||||
@ -65,23 +67,23 @@ impl From<BdkAddressInfo> for AddressInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct Balance {
|
pub struct Balance {
|
||||||
pub immature: u64,
|
pub immature: Arc<Amount>,
|
||||||
pub trusted_pending: u64,
|
pub trusted_pending: Arc<Amount>,
|
||||||
pub untrusted_pending: u64,
|
pub untrusted_pending: Arc<Amount>,
|
||||||
pub confirmed: u64,
|
pub confirmed: Arc<Amount>,
|
||||||
pub trusted_spendable: u64,
|
pub trusted_spendable: Arc<Amount>,
|
||||||
pub total: u64,
|
pub total: Arc<Amount>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<BdkBalance> for Balance {
|
impl From<BdkBalance> for Balance {
|
||||||
fn from(bdk_balance: BdkBalance) -> Self {
|
fn from(bdk_balance: BdkBalance) -> Self {
|
||||||
Balance {
|
Balance {
|
||||||
immature: bdk_balance.immature,
|
immature: Arc::new(bdk_balance.immature.into()),
|
||||||
trusted_pending: bdk_balance.trusted_pending,
|
trusted_pending: Arc::new(bdk_balance.trusted_pending.into()),
|
||||||
untrusted_pending: bdk_balance.untrusted_pending,
|
untrusted_pending: Arc::new(bdk_balance.untrusted_pending.into()),
|
||||||
confirmed: bdk_balance.confirmed,
|
confirmed: Arc::new(bdk_balance.confirmed.into()),
|
||||||
trusted_spendable: bdk_balance.trusted_spendable(),
|
trusted_spendable: Arc::new(bdk_balance.trusted_spendable().into()),
|
||||||
total: bdk_balance.total(),
|
total: Arc::new(bdk_balance.total().into()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
use crate::bitcoin::Amount;
|
||||||
use crate::bitcoin::{FeeRate, OutPoint, Psbt, Script, Transaction};
|
use crate::bitcoin::{FeeRate, OutPoint, Psbt, Script, Transaction};
|
||||||
use crate::descriptor::Descriptor;
|
use crate::descriptor::Descriptor;
|
||||||
use crate::error::{
|
use crate::error::{
|
||||||
@ -8,6 +9,7 @@ use crate::types::{
|
|||||||
AddressInfo, Balance, CanonicalTx, FullScanRequest, LocalOutput, ScriptAmount, SyncRequest,
|
AddressInfo, Balance, CanonicalTx, FullScanRequest, LocalOutput, ScriptAmount, SyncRequest,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use bdk::bitcoin::amount::Amount as BdkAmount;
|
||||||
use bdk::bitcoin::blockdata::script::ScriptBuf as BdkScriptBuf;
|
use bdk::bitcoin::blockdata::script::ScriptBuf as BdkScriptBuf;
|
||||||
use bdk::bitcoin::Network;
|
use bdk::bitcoin::Network;
|
||||||
use bdk::bitcoin::Psbt as BdkPsbt;
|
use bdk::bitcoin::Psbt as BdkPsbt;
|
||||||
@ -82,7 +84,7 @@ impl Wallet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_balance(&self) -> Balance {
|
pub fn get_balance(&self) -> Balance {
|
||||||
let bdk_balance: bdk::wallet::Balance = self.get_wallet().get_balance();
|
let bdk_balance = self.get_wallet().get_balance();
|
||||||
Balance::from(bdk_balance)
|
Balance::from(bdk_balance)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,8 +104,11 @@ impl Wallet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn sent_and_received(&self, tx: &Transaction) -> SentAndReceivedValues {
|
pub fn sent_and_received(&self, tx: &Transaction) -> SentAndReceivedValues {
|
||||||
let (sent, received): (u64, u64) = self.get_wallet().sent_and_received(&tx.into());
|
let (sent, received) = self.get_wallet().sent_and_received(&tx.into());
|
||||||
SentAndReceivedValues { sent, received }
|
SentAndReceivedValues {
|
||||||
|
sent: Arc::new(sent.into()),
|
||||||
|
received: Arc::new(received.into()),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn transactions(&self) -> Vec<CanonicalTx> {
|
pub fn transactions(&self) -> Vec<CanonicalTx> {
|
||||||
@ -152,15 +157,15 @@ impl Wallet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct SentAndReceivedValues {
|
pub struct SentAndReceivedValues {
|
||||||
pub sent: u64,
|
pub sent: Arc<Amount>,
|
||||||
pub received: u64,
|
pub received: Arc<Amount>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Update(pub(crate) BdkUpdate);
|
pub struct Update(pub(crate) BdkUpdate);
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct TxBuilder {
|
pub struct TxBuilder {
|
||||||
pub(crate) recipients: Vec<(BdkScriptBuf, u64)>,
|
pub(crate) recipients: Vec<(BdkScriptBuf, BdkAmount)>,
|
||||||
pub(crate) utxos: Vec<OutPoint>,
|
pub(crate) utxos: Vec<OutPoint>,
|
||||||
pub(crate) unspendable: HashSet<OutPoint>,
|
pub(crate) unspendable: HashSet<OutPoint>,
|
||||||
pub(crate) change_policy: ChangeSpendPolicy,
|
pub(crate) change_policy: ChangeSpendPolicy,
|
||||||
@ -190,9 +195,9 @@ impl TxBuilder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn add_recipient(&self, script: &Script, amount: u64) -> Arc<Self> {
|
pub(crate) fn add_recipient(&self, script: &Script, amount: Arc<Amount>) -> Arc<Self> {
|
||||||
let mut recipients: Vec<(BdkScriptBuf, u64)> = self.recipients.clone();
|
let mut recipients: Vec<(BdkScriptBuf, BdkAmount)> = self.recipients.clone();
|
||||||
recipients.append(&mut vec![(script.0.clone(), amount)]);
|
recipients.append(&mut vec![(script.0.clone(), amount.0)]);
|
||||||
|
|
||||||
Arc::new(TxBuilder {
|
Arc::new(TxBuilder {
|
||||||
recipients,
|
recipients,
|
||||||
@ -203,7 +208,7 @@ impl TxBuilder {
|
|||||||
pub(crate) fn set_recipients(&self, recipients: Vec<ScriptAmount>) -> Arc<Self> {
|
pub(crate) fn set_recipients(&self, recipients: Vec<ScriptAmount>) -> Arc<Self> {
|
||||||
let recipients = recipients
|
let recipients = recipients
|
||||||
.iter()
|
.iter()
|
||||||
.map(|script_amount| (script_amount.script.0.clone(), script_amount.amount))
|
.map(|script_amount| (script_amount.script.0.clone(), script_amount.amount.0)) //;
|
||||||
.collect();
|
.collect();
|
||||||
Arc::new(TxBuilder {
|
Arc::new(TxBuilder {
|
||||||
recipients,
|
recipients,
|
||||||
|
@ -31,15 +31,15 @@ class LiveTxBuilderTest {
|
|||||||
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
||||||
wallet.applyUpdate(update)
|
wallet.applyUpdate(update)
|
||||||
wallet.commit()
|
wallet.commit()
|
||||||
println("Balance: ${wallet.getBalance().total}")
|
println("Balance: ${wallet.getBalance().total.toSat()}")
|
||||||
|
|
||||||
assert(wallet.getBalance().total > 0uL) {
|
assert(wallet.getBalance().total.toSat() > 0uL) {
|
||||||
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
||||||
}
|
}
|
||||||
|
|
||||||
val recipient: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.SIGNET)
|
val recipient: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.SIGNET)
|
||||||
val psbt: Psbt = TxBuilder()
|
val psbt: Psbt = TxBuilder()
|
||||||
.addRecipient(recipient.scriptPubkey(), 4200uL)
|
.addRecipient(recipient.scriptPubkey(), Amount.fromSat(4200uL))
|
||||||
.feeRate(FeeRate.fromSatPerVb(2uL))
|
.feeRate(FeeRate.fromSatPerVb(2uL))
|
||||||
.finish(wallet)
|
.finish(wallet)
|
||||||
|
|
||||||
@ -58,17 +58,17 @@ class LiveTxBuilderTest {
|
|||||||
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
||||||
wallet.applyUpdate(update)
|
wallet.applyUpdate(update)
|
||||||
wallet.commit()
|
wallet.commit()
|
||||||
println("Balance: ${wallet.getBalance().total}")
|
println("Balance: ${wallet.getBalance().total.toSat()}")
|
||||||
|
|
||||||
assert(wallet.getBalance().total > 0uL) {
|
assert(wallet.getBalance().total.toSat() > 0uL) {
|
||||||
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
||||||
}
|
}
|
||||||
|
|
||||||
val recipient1: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.SIGNET)
|
val recipient1: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.SIGNET)
|
||||||
val recipient2: Address = Address("tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6", Network.SIGNET)
|
val recipient2: Address = Address("tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6", Network.SIGNET)
|
||||||
val allRecipients: List<ScriptAmount> = listOf(
|
val allRecipients: List<ScriptAmount> = listOf(
|
||||||
ScriptAmount(recipient1.scriptPubkey(), 4200uL),
|
ScriptAmount(recipient1.scriptPubkey(), Amount.fromSat(4200uL)),
|
||||||
ScriptAmount(recipient2.scriptPubkey(), 4200uL),
|
ScriptAmount(recipient2.scriptPubkey(), Amount.fromSat(4200uL)),
|
||||||
)
|
)
|
||||||
|
|
||||||
val psbt: Psbt = TxBuilder()
|
val psbt: Psbt = TxBuilder()
|
||||||
|
@ -31,9 +31,9 @@ class LiveWalletTest {
|
|||||||
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
||||||
wallet.applyUpdate(update)
|
wallet.applyUpdate(update)
|
||||||
wallet.commit()
|
wallet.commit()
|
||||||
println("Balance: ${wallet.getBalance().total}")
|
println("Balance: ${wallet.getBalance().total.toSat()}")
|
||||||
|
|
||||||
assert(wallet.getBalance().total > 0uL) {
|
assert(wallet.getBalance().total.toSat() > 0uL) {
|
||||||
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,16 +56,16 @@ class LiveWalletTest {
|
|||||||
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
|
||||||
wallet.applyUpdate(update)
|
wallet.applyUpdate(update)
|
||||||
wallet.commit()
|
wallet.commit()
|
||||||
println("Balance: ${wallet.getBalance().total}")
|
println("Balance: ${wallet.getBalance().total.toSat()}")
|
||||||
|
|
||||||
assert(wallet.getBalance().total > 0uL) {
|
assert(wallet.getBalance().total.toSat() > 0uL) {
|
||||||
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address.asString()} and try again."
|
||||||
}
|
}
|
||||||
|
|
||||||
val recipient: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.SIGNET)
|
val recipient: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.SIGNET)
|
||||||
|
|
||||||
val psbt: Psbt = TxBuilder()
|
val psbt: Psbt = TxBuilder()
|
||||||
.addRecipient(recipient.scriptPubkey(), 4200uL)
|
.addRecipient(recipient.scriptPubkey(), Amount.fromSat(4200uL))
|
||||||
.feeRate(FeeRate.fromSatPerVb(2uL))
|
.feeRate(FeeRate.fromSatPerVb(2uL))
|
||||||
.finish(wallet)
|
.finish(wallet)
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ class OfflineWalletTest {
|
|||||||
|
|
||||||
assertEquals(
|
assertEquals(
|
||||||
expected = 0uL,
|
expected = 0uL,
|
||||||
actual = wallet.getBalance().total
|
actual = wallet.getBalance().total.toSat()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@ class LiveTxBuilderTest(unittest.TestCase):
|
|||||||
wallet.commit()
|
wallet.commit()
|
||||||
|
|
||||||
self.assertGreater(
|
self.assertGreater(
|
||||||
wallet.get_balance().total,
|
wallet.get_balance().total.to_sat(),
|
||||||
0,
|
0,
|
||||||
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address.as_string()} and try again."
|
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address.as_string()} and try again."
|
||||||
)
|
)
|
||||||
@ -73,7 +73,7 @@ class LiveTxBuilderTest(unittest.TestCase):
|
|||||||
wallet.commit()
|
wallet.commit()
|
||||||
|
|
||||||
self.assertGreater(
|
self.assertGreater(
|
||||||
wallet.get_balance().total,
|
wallet.get_balance().total.to_sat(),
|
||||||
0,
|
0,
|
||||||
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address.as_string()} and try again."
|
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address.as_string()} and try again."
|
||||||
)
|
)
|
||||||
|
@ -33,7 +33,7 @@ class LiveWalletTest(unittest.TestCase):
|
|||||||
wallet.commit()
|
wallet.commit()
|
||||||
|
|
||||||
self.assertGreater(
|
self.assertGreater(
|
||||||
wallet.get_balance().total,
|
wallet.get_balance().total.to_sat(),
|
||||||
0,
|
0,
|
||||||
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address.as_string()} and try again."
|
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address.as_string()} and try again."
|
||||||
)
|
)
|
||||||
@ -69,7 +69,7 @@ class LiveWalletTest(unittest.TestCase):
|
|||||||
wallet.commit()
|
wallet.commit()
|
||||||
|
|
||||||
self.assertGreater(
|
self.assertGreater(
|
||||||
wallet.get_balance().total,
|
wallet.get_balance().total.to_sat(),
|
||||||
0,
|
0,
|
||||||
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address.as_string()} and try again."
|
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address.as_string()} and try again."
|
||||||
)
|
)
|
||||||
|
@ -40,7 +40,7 @@ class OfflineWalletTest(unittest.TestCase):
|
|||||||
bdk.Network.TESTNET
|
bdk.Network.TESTNET
|
||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(wallet.get_balance().total, 0)
|
self.assertEqual(wallet.get_balance().total.to_sat(), 0)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
@ -49,14 +49,14 @@ final class LiveTxBuilderTests: XCTestCase {
|
|||||||
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.asString()
|
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.asString()
|
||||||
|
|
||||||
XCTAssertGreaterThan(
|
XCTAssertGreaterThan(
|
||||||
wallet.getBalance().total,
|
wallet.getBalance().total.toSat(),
|
||||||
UInt64(0),
|
UInt64(0),
|
||||||
"Wallet must have positive balance, please send funds to \(address)"
|
"Wallet must have positive balance, please send funds to \(address)"
|
||||||
)
|
)
|
||||||
|
|
||||||
let recipient: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .signet)
|
let recipient: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .signet)
|
||||||
let psbt: Psbt = try TxBuilder()
|
let psbt: Psbt = try TxBuilder()
|
||||||
.addRecipient(script: recipient.scriptPubkey(), amount: 4200)
|
.addRecipient(script: recipient.scriptPubkey(), amount: Amount.fromSat(fromSat: 4200))
|
||||||
.feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 2))
|
.feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 2))
|
||||||
.finish(wallet: wallet)
|
.finish(wallet: wallet)
|
||||||
|
|
||||||
@ -91,7 +91,7 @@ final class LiveTxBuilderTests: XCTestCase {
|
|||||||
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.asString()
|
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.asString()
|
||||||
|
|
||||||
XCTAssertGreaterThan(
|
XCTAssertGreaterThan(
|
||||||
wallet.getBalance().total,
|
wallet.getBalance().total.toSat(),
|
||||||
UInt64(0),
|
UInt64(0),
|
||||||
"Wallet must have positive balance, please send funds to \(address)"
|
"Wallet must have positive balance, please send funds to \(address)"
|
||||||
)
|
)
|
||||||
@ -99,8 +99,8 @@ final class LiveTxBuilderTests: XCTestCase {
|
|||||||
let recipient1: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .signet)
|
let recipient1: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .signet)
|
||||||
let recipient2: Address = try Address(address: "tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6", network: .signet)
|
let recipient2: Address = try Address(address: "tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6", network: .signet)
|
||||||
let allRecipients: [ScriptAmount] = [
|
let allRecipients: [ScriptAmount] = [
|
||||||
ScriptAmount(script: recipient1.scriptPubkey(), amount: 4200),
|
ScriptAmount(script: recipient1.scriptPubkey(), amount: Amount.fromSat(fromSat: 4200)),
|
||||||
ScriptAmount(script: recipient2.scriptPubkey(), amount: 4200)
|
ScriptAmount(script: recipient2.scriptPubkey(), amount: Amount.fromSat(fromSat: 4200))
|
||||||
]
|
]
|
||||||
|
|
||||||
let psbt: Psbt = try TxBuilder()
|
let psbt: Psbt = try TxBuilder()
|
||||||
|
@ -49,7 +49,7 @@ final class LiveWalletTests: XCTestCase {
|
|||||||
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.asString()
|
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.asString()
|
||||||
|
|
||||||
XCTAssertGreaterThan(
|
XCTAssertGreaterThan(
|
||||||
wallet.getBalance().total,
|
wallet.getBalance().total.toSat(),
|
||||||
UInt64(0),
|
UInt64(0),
|
||||||
"Wallet must have positive balance, please send funds to \(address)"
|
"Wallet must have positive balance, please send funds to \(address)"
|
||||||
)
|
)
|
||||||
@ -87,18 +87,17 @@ final class LiveWalletTests: XCTestCase {
|
|||||||
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.asString()
|
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.asString()
|
||||||
|
|
||||||
XCTAssertGreaterThan(
|
XCTAssertGreaterThan(
|
||||||
wallet.getBalance().total,
|
wallet.getBalance().total.toSat(),
|
||||||
UInt64(0),
|
UInt64(0),
|
||||||
"Wallet must have positive balance, please send funds to \(address)"
|
"Wallet must have positive balance, please send funds to \(address)"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
print("Balance: \(wallet.getBalance().total)")
|
print("Balance: \(wallet.getBalance().total)")
|
||||||
|
|
||||||
let recipient: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .signet)
|
let recipient: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .signet)
|
||||||
let psbt: Psbt = try
|
let psbt: Psbt = try
|
||||||
TxBuilder()
|
TxBuilder()
|
||||||
.addRecipient(script: recipient.scriptPubkey(), amount: 4200)
|
.addRecipient(script: recipient.scriptPubkey(), amount: Amount.fromSat(fromSat: 4200))
|
||||||
.feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 2))
|
.feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 2))
|
||||||
.finish(wallet: wallet)
|
.finish(wallet: wallet)
|
||||||
|
|
||||||
|
@ -60,6 +60,6 @@ final class OfflineWalletTests: XCTestCase {
|
|||||||
network: .testnet
|
network: .testnet
|
||||||
)
|
)
|
||||||
|
|
||||||
XCTAssertEqual(wallet.getBalance().total, 0)
|
XCTAssertEqual(wallet.getBalance().total.toSat(), 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user