feat: update wallet::Balance
to use bitcoin::Amount
- update all fields `immature`, ` trusted_pending`, `unstrusted_pending` and `confirmed` to use the `bitcoin::Amount` instead of `u64` - update all `impl Balance` methods to use `bitcoin::Amount` - update all tests that relies on `keychain::Balance`
This commit is contained in:
parent
08fac47c29
commit
8a33d98db9
@ -32,14 +32,14 @@ use bdk_chain::{
|
|||||||
IndexedTxGraph,
|
IndexedTxGraph,
|
||||||
};
|
};
|
||||||
use bdk_persist::{Persist, PersistBackend};
|
use bdk_persist::{Persist, PersistBackend};
|
||||||
use bitcoin::constants::genesis_block;
|
|
||||||
use bitcoin::secp256k1::{All, Secp256k1};
|
use bitcoin::secp256k1::{All, Secp256k1};
|
||||||
use bitcoin::sighash::{EcdsaSighashType, TapSighashType};
|
use bitcoin::sighash::{EcdsaSighashType, TapSighashType};
|
||||||
use bitcoin::{
|
use bitcoin::{
|
||||||
absolute, psbt, Address, Block, FeeRate, Network, OutPoint, Script, ScriptBuf, Sequence,
|
absolute, psbt, Address, Block, FeeRate, Network, OutPoint, Script, ScriptBuf, Sequence,
|
||||||
Transaction, TxOut, Txid, Witness,
|
Transaction, TxOut, Txid, Witness,
|
||||||
};
|
};
|
||||||
use bitcoin::{consensus::encode::serialize, transaction, Amount, BlockHash, Psbt};
|
use bitcoin::{consensus::encode::serialize, transaction, BlockHash, Psbt};
|
||||||
|
use bitcoin::{constants::genesis_block, Amount};
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use core::ops::Deref;
|
use core::ops::Deref;
|
||||||
use descriptor::error::Error as DescriptorError;
|
use descriptor::error::Error as DescriptorError;
|
||||||
@ -950,7 +950,7 @@ impl Wallet {
|
|||||||
/// [`insert_txout`]: Self::insert_txout
|
/// [`insert_txout`]: Self::insert_txout
|
||||||
pub fn calculate_fee_rate(&self, tx: &Transaction) -> Result<FeeRate, CalculateFeeError> {
|
pub fn calculate_fee_rate(&self, tx: &Transaction) -> Result<FeeRate, CalculateFeeError> {
|
||||||
self.calculate_fee(tx)
|
self.calculate_fee(tx)
|
||||||
.map(|fee| bitcoin::Amount::from_sat(fee) / tx.weight())
|
.map(|fee| Amount::from_sat(fee) / tx.weight())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Compute the `tx`'s sent and received amounts (in satoshis).
|
/// Compute the `tx`'s sent and received amounts (in satoshis).
|
||||||
|
@ -718,6 +718,7 @@ impl<'a, Cs: CoinSelectionAlgorithm> TxBuilder<'a, Cs, CreateTx> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: (@leonardo) Should this expect/use `bitcoin::Amount` instead ? Would it be a huge breaking change ?
|
||||||
/// Add a recipient to the internal list
|
/// Add a recipient to the internal list
|
||||||
pub fn add_recipient(&mut self, script_pubkey: ScriptBuf, amount: u64) -> &mut Self {
|
pub fn add_recipient(&mut self, script_pubkey: ScriptBuf, amount: u64) -> &mut Self {
|
||||||
self.params.recipients.push((script_pubkey, amount));
|
self.params.recipients.push((script_pubkey, amount));
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use bdk::bitcoin::{Amount, FeeRate, Psbt, TxIn};
|
use bdk::bitcoin::{FeeRate, Psbt, TxIn};
|
||||||
use bdk::{psbt, KeychainKind, SignOptions};
|
use bdk::{psbt, KeychainKind, SignOptions};
|
||||||
use core::str::FromStr;
|
use core::str::FromStr;
|
||||||
mod common;
|
mod common;
|
||||||
@ -201,7 +201,7 @@ fn test_psbt_multiple_internalkey_signers() {
|
|||||||
// the prevout we're spending
|
// the prevout we're spending
|
||||||
let prevouts = &[TxOut {
|
let prevouts = &[TxOut {
|
||||||
script_pubkey: send_to.script_pubkey(),
|
script_pubkey: send_to.script_pubkey(),
|
||||||
value: Amount::from_sat(to_spend),
|
value: to_spend,
|
||||||
}];
|
}];
|
||||||
let prevouts = Prevouts::All(prevouts);
|
let prevouts = Prevouts::All(prevouts);
|
||||||
let input_index = 0;
|
let input_index = 0;
|
||||||
|
@ -200,7 +200,7 @@ fn test_get_funded_wallet_balance() {
|
|||||||
// The funded wallet contains a tx with a 76_000 sats input and two outputs, one spending 25_000
|
// The funded wallet contains a tx with a 76_000 sats input and two outputs, one spending 25_000
|
||||||
// to a foreign address and one returning 50_000 back to the wallet as change. The remaining 1000
|
// to a foreign address and one returning 50_000 back to the wallet as change. The remaining 1000
|
||||||
// sats are the transaction fee.
|
// sats are the transaction fee.
|
||||||
assert_eq!(wallet.get_balance().confirmed, 50_000);
|
assert_eq!(wallet.get_balance().confirmed.to_sat(), 50_000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -3582,10 +3582,10 @@ fn test_spend_coinbase() {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
balance,
|
balance,
|
||||||
Balance {
|
Balance {
|
||||||
immature: 25_000,
|
immature: Amount::from_sat(25_000),
|
||||||
trusted_pending: 0,
|
trusted_pending: Amount::ZERO,
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 0
|
confirmed: Amount::ZERO
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -3596,7 +3596,7 @@ fn test_spend_coinbase() {
|
|||||||
.assume_checked();
|
.assume_checked();
|
||||||
let mut builder = wallet.build_tx();
|
let mut builder = wallet.build_tx();
|
||||||
builder
|
builder
|
||||||
.add_recipient(addr.script_pubkey(), balance.immature / 2)
|
.add_recipient(addr.script_pubkey(), balance.immature.to_sat() / 2)
|
||||||
.current_height(confirmation_height);
|
.current_height(confirmation_height);
|
||||||
assert!(matches!(
|
assert!(matches!(
|
||||||
builder.finish(),
|
builder.finish(),
|
||||||
@ -3611,7 +3611,7 @@ fn test_spend_coinbase() {
|
|||||||
// Still unspendable...
|
// Still unspendable...
|
||||||
let mut builder = wallet.build_tx();
|
let mut builder = wallet.build_tx();
|
||||||
builder
|
builder
|
||||||
.add_recipient(addr.script_pubkey(), balance.immature / 2)
|
.add_recipient(addr.script_pubkey(), balance.immature.to_sat() / 2)
|
||||||
.current_height(not_yet_mature_time);
|
.current_height(not_yet_mature_time);
|
||||||
assert_matches!(
|
assert_matches!(
|
||||||
builder.finish(),
|
builder.finish(),
|
||||||
@ -3633,15 +3633,15 @@ fn test_spend_coinbase() {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
balance,
|
balance,
|
||||||
Balance {
|
Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 0,
|
trusted_pending: Amount::ZERO,
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 25_000
|
confirmed: Amount::from_sat(25_000)
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
let mut builder = wallet.build_tx();
|
let mut builder = wallet.build_tx();
|
||||||
builder
|
builder
|
||||||
.add_recipient(addr.script_pubkey(), balance.confirmed / 2)
|
.add_recipient(addr.script_pubkey(), balance.confirmed.to_sat() / 2)
|
||||||
.current_height(maturity_time);
|
.current_height(maturity_time);
|
||||||
builder.finish().unwrap();
|
builder.finish().unwrap();
|
||||||
}
|
}
|
||||||
|
@ -377,7 +377,7 @@ fn tx_can_become_unconfirmed_after_reorg() -> anyhow::Result<()> {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
get_balance(&recv_chain, &recv_graph)?,
|
get_balance(&recv_chain, &recv_graph)?,
|
||||||
Balance {
|
Balance {
|
||||||
confirmed: SEND_AMOUNT.to_sat() * ADDITIONAL_COUNT as u64,
|
confirmed: SEND_AMOUNT * ADDITIONAL_COUNT as u64,
|
||||||
..Balance::default()
|
..Balance::default()
|
||||||
},
|
},
|
||||||
"initial balance must be correct",
|
"initial balance must be correct",
|
||||||
@ -391,8 +391,8 @@ fn tx_can_become_unconfirmed_after_reorg() -> anyhow::Result<()> {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
get_balance(&recv_chain, &recv_graph)?,
|
get_balance(&recv_chain, &recv_graph)?,
|
||||||
Balance {
|
Balance {
|
||||||
confirmed: SEND_AMOUNT.to_sat() * (ADDITIONAL_COUNT - reorg_count) as u64,
|
confirmed: SEND_AMOUNT * (ADDITIONAL_COUNT - reorg_count) as u64,
|
||||||
trusted_pending: SEND_AMOUNT.to_sat() * reorg_count as u64,
|
trusted_pending: SEND_AMOUNT * reorg_count as u64,
|
||||||
..Balance::default()
|
..Balance::default()
|
||||||
},
|
},
|
||||||
"reorg_count: {}",
|
"reorg_count: {}",
|
||||||
|
@ -14,6 +14,7 @@ use crate::{collections::BTreeMap, Append};
|
|||||||
|
|
||||||
#[cfg(feature = "miniscript")]
|
#[cfg(feature = "miniscript")]
|
||||||
mod txout_index;
|
mod txout_index;
|
||||||
|
use bitcoin::Amount;
|
||||||
#[cfg(feature = "miniscript")]
|
#[cfg(feature = "miniscript")]
|
||||||
pub use txout_index::*;
|
pub use txout_index::*;
|
||||||
|
|
||||||
@ -90,13 +91,13 @@ impl<K> AsRef<BTreeMap<K, u32>> for ChangeSet<K> {
|
|||||||
)]
|
)]
|
||||||
pub struct Balance {
|
pub struct Balance {
|
||||||
/// All coinbase outputs not yet matured
|
/// All coinbase outputs not yet matured
|
||||||
pub immature: u64,
|
pub immature: Amount,
|
||||||
/// Unconfirmed UTXOs generated by a wallet tx
|
/// Unconfirmed UTXOs generated by a wallet tx
|
||||||
pub trusted_pending: u64,
|
pub trusted_pending: Amount,
|
||||||
/// Unconfirmed UTXOs received from an external wallet
|
/// Unconfirmed UTXOs received from an external wallet
|
||||||
pub untrusted_pending: u64,
|
pub untrusted_pending: Amount,
|
||||||
/// Confirmed and immediately spendable balance
|
/// Confirmed and immediately spendable balance
|
||||||
pub confirmed: u64,
|
pub confirmed: Amount,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Balance {
|
impl Balance {
|
||||||
@ -104,12 +105,12 @@ impl Balance {
|
|||||||
///
|
///
|
||||||
/// This is the balance you can spend right now that shouldn't get cancelled via another party
|
/// This is the balance you can spend right now that shouldn't get cancelled via another party
|
||||||
/// double spending it.
|
/// double spending it.
|
||||||
pub fn trusted_spendable(&self) -> u64 {
|
pub fn trusted_spendable(&self) -> Amount {
|
||||||
self.confirmed + self.trusted_pending
|
self.confirmed + self.trusted_pending
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the whole balance visible to the wallet.
|
/// Get the whole balance visible to the wallet.
|
||||||
pub fn total(&self) -> u64 {
|
pub fn total(&self) -> Amount {
|
||||||
self.confirmed + self.trusted_pending + self.untrusted_pending + self.immature
|
self.confirmed + self.trusted_pending + self.untrusted_pending + self.immature
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -270,6 +270,7 @@ impl<I: Clone + Ord> SpkTxOutIndex<I> {
|
|||||||
self.spk_indices.get(script)
|
self.spk_indices.get(script)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: (@leonardo) Should this also be updated to return `(bitcoin::Amount, bitcoin::Amount)` instead of (u64, u64)
|
||||||
/// Computes the total value transfer effect `tx` has on the script pubkeys in `range`. Value is
|
/// Computes the total value transfer effect `tx` has on the script pubkeys in `range`. Value is
|
||||||
/// *sent* when a script pubkey in the `range` is on an input and *received* when it is on an
|
/// *sent* when a script pubkey in the `range` is on an input and *received* when it is on an
|
||||||
/// output. For `sent` to be computed correctly, the output being spent must have already been
|
/// output. For `sent` to be computed correctly, the output being spent must have already been
|
||||||
|
@ -95,7 +95,7 @@ use crate::{
|
|||||||
use alloc::collections::vec_deque::VecDeque;
|
use alloc::collections::vec_deque::VecDeque;
|
||||||
use alloc::sync::Arc;
|
use alloc::sync::Arc;
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use bitcoin::{OutPoint, Script, Transaction, TxOut, Txid};
|
use bitcoin::{Amount, OutPoint, Script, Transaction, TxOut, Txid};
|
||||||
use core::fmt::{self, Formatter};
|
use core::fmt::{self, Formatter};
|
||||||
use core::{
|
use core::{
|
||||||
convert::Infallible,
|
convert::Infallible,
|
||||||
@ -1155,27 +1155,28 @@ impl<A: Anchor> TxGraph<A> {
|
|||||||
outpoints: impl IntoIterator<Item = (OI, OutPoint)>,
|
outpoints: impl IntoIterator<Item = (OI, OutPoint)>,
|
||||||
mut trust_predicate: impl FnMut(&OI, &Script) -> bool,
|
mut trust_predicate: impl FnMut(&OI, &Script) -> bool,
|
||||||
) -> Result<Balance, C::Error> {
|
) -> Result<Balance, C::Error> {
|
||||||
let mut immature = 0;
|
let mut immature = Amount::ZERO;
|
||||||
let mut trusted_pending = 0;
|
let mut trusted_pending = Amount::ZERO;
|
||||||
let mut untrusted_pending = 0;
|
let mut untrusted_pending = Amount::ZERO;
|
||||||
let mut confirmed = 0;
|
let mut confirmed = Amount::ZERO;
|
||||||
|
|
||||||
for res in self.try_filter_chain_unspents(chain, chain_tip, outpoints) {
|
for res in self.try_filter_chain_unspents(chain, chain_tip, outpoints) {
|
||||||
let (spk_i, txout) = res?;
|
let (spk_i, txout) = res?;
|
||||||
|
|
||||||
|
// TODO: (@leonardo) Should these operations use `bitcoin::Amount::checked_add()` instead ?
|
||||||
match &txout.chain_position {
|
match &txout.chain_position {
|
||||||
ChainPosition::Confirmed(_) => {
|
ChainPosition::Confirmed(_) => {
|
||||||
if txout.is_confirmed_and_spendable(chain_tip.height) {
|
if txout.is_confirmed_and_spendable(chain_tip.height) {
|
||||||
confirmed += txout.txout.value.to_sat();
|
confirmed += txout.txout.value;
|
||||||
} else if !txout.is_mature(chain_tip.height) {
|
} else if !txout.is_mature(chain_tip.height) {
|
||||||
immature += txout.txout.value.to_sat();
|
immature += txout.txout.value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ChainPosition::Unconfirmed(_) => {
|
ChainPosition::Unconfirmed(_) => {
|
||||||
if trust_predicate(&spk_i, &txout.txout.script_pubkey) {
|
if trust_predicate(&spk_i, &txout.txout.script_pubkey) {
|
||||||
trusted_pending += txout.txout.value.to_sat();
|
trusted_pending += txout.txout.value;
|
||||||
} else {
|
} else {
|
||||||
untrusted_pending += txout.txout.value.to_sat();
|
untrusted_pending += txout.txout.value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -341,10 +341,10 @@ fn test_list_owned_txouts() {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
balance,
|
balance,
|
||||||
Balance {
|
Balance {
|
||||||
immature: 70000, // immature coinbase
|
immature: Amount::from_sat(70000), // immature coinbase
|
||||||
trusted_pending: 25000, // tx3 + tx5
|
trusted_pending: Amount::from_sat(25000), // tx3 + tx5
|
||||||
untrusted_pending: 20000, // tx4
|
untrusted_pending: Amount::from_sat(20000), // tx4
|
||||||
confirmed: 0 // Nothing is confirmed yet
|
confirmed: Amount::ZERO // Nothing is confirmed yet
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -376,10 +376,10 @@ fn test_list_owned_txouts() {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
balance,
|
balance,
|
||||||
Balance {
|
Balance {
|
||||||
immature: 70000, // immature coinbase
|
immature: Amount::from_sat(70000), // immature coinbase
|
||||||
trusted_pending: 25000, // tx3 + tx5
|
trusted_pending: Amount::from_sat(25000), // tx3 + tx5
|
||||||
untrusted_pending: 20000, // tx4
|
untrusted_pending: Amount::from_sat(20000), // tx4
|
||||||
confirmed: 0 // Nothing is confirmed yet
|
confirmed: Amount::ZERO // Nothing is confirmed yet
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -408,10 +408,10 @@ fn test_list_owned_txouts() {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
balance,
|
balance,
|
||||||
Balance {
|
Balance {
|
||||||
immature: 70000, // immature coinbase
|
immature: Amount::from_sat(70000), // immature coinbase
|
||||||
trusted_pending: 15000, // tx5
|
trusted_pending: Amount::from_sat(15000), // tx5
|
||||||
untrusted_pending: 20000, // tx4
|
untrusted_pending: Amount::from_sat(20000), // tx4
|
||||||
confirmed: 10000 // tx3 got confirmed
|
confirmed: Amount::from_sat(10000) // tx3 got confirmed
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -439,10 +439,10 @@ fn test_list_owned_txouts() {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
balance,
|
balance,
|
||||||
Balance {
|
Balance {
|
||||||
immature: 70000, // immature coinbase
|
immature: Amount::from_sat(70000), // immature coinbase
|
||||||
trusted_pending: 15000, // tx5
|
trusted_pending: Amount::from_sat(15000), // tx5
|
||||||
untrusted_pending: 20000, // tx4
|
untrusted_pending: Amount::from_sat(20000), // tx4
|
||||||
confirmed: 10000 // tx1 got matured
|
confirmed: Amount::from_sat(10000) // tx1 got matured
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -455,10 +455,10 @@ fn test_list_owned_txouts() {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
balance,
|
balance,
|
||||||
Balance {
|
Balance {
|
||||||
immature: 0, // coinbase matured
|
immature: Amount::ZERO, // coinbase matured
|
||||||
trusted_pending: 15000, // tx5
|
trusted_pending: Amount::from_sat(15000), // tx5
|
||||||
untrusted_pending: 20000, // tx4
|
untrusted_pending: Amount::from_sat(20000), // tx4
|
||||||
confirmed: 80000 // tx1 + tx3
|
confirmed: Amount::from_sat(80000) // tx1 + tx3
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ mod common;
|
|||||||
use std::collections::{BTreeSet, HashSet};
|
use std::collections::{BTreeSet, HashSet};
|
||||||
|
|
||||||
use bdk_chain::{keychain::Balance, BlockId};
|
use bdk_chain::{keychain::Balance, BlockId};
|
||||||
use bitcoin::{OutPoint, Script};
|
use bitcoin::{Amount, OutPoint, Script};
|
||||||
use common::*;
|
use common::*;
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
@ -79,10 +79,10 @@ fn test_tx_conflict_handling() {
|
|||||||
exp_chain_txouts: HashSet::from([("confirmed_genesis", 0), ("confirmed_conflict", 0)]),
|
exp_chain_txouts: HashSet::from([("confirmed_genesis", 0), ("confirmed_conflict", 0)]),
|
||||||
exp_unspents: HashSet::from([("confirmed_conflict", 0)]),
|
exp_unspents: HashSet::from([("confirmed_conflict", 0)]),
|
||||||
exp_balance: Balance {
|
exp_balance: Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 0,
|
trusted_pending: Amount::ZERO,
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 20000,
|
confirmed: Amount::from_sat(20000),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Scenario {
|
Scenario {
|
||||||
@ -115,10 +115,10 @@ fn test_tx_conflict_handling() {
|
|||||||
exp_chain_txouts: HashSet::from([("tx1", 0), ("tx_conflict_2", 0)]),
|
exp_chain_txouts: HashSet::from([("tx1", 0), ("tx_conflict_2", 0)]),
|
||||||
exp_unspents: HashSet::from([("tx_conflict_2", 0)]),
|
exp_unspents: HashSet::from([("tx_conflict_2", 0)]),
|
||||||
exp_balance: Balance {
|
exp_balance: Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 30000,
|
trusted_pending: Amount::from_sat(30000),
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 0,
|
confirmed: Amount::ZERO,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Scenario {
|
Scenario {
|
||||||
@ -150,10 +150,10 @@ fn test_tx_conflict_handling() {
|
|||||||
exp_chain_txouts: HashSet::from([("tx1", 0), ("tx1", 1), ("tx_conflict_2", 0)]),
|
exp_chain_txouts: HashSet::from([("tx1", 0), ("tx1", 1), ("tx_conflict_2", 0)]),
|
||||||
exp_unspents: HashSet::from([("tx_conflict_2", 0)]),
|
exp_unspents: HashSet::from([("tx_conflict_2", 0)]),
|
||||||
exp_balance: Balance {
|
exp_balance: Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 30000,
|
trusted_pending: Amount::from_sat(30000),
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 0,
|
confirmed: Amount::ZERO,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Scenario {
|
Scenario {
|
||||||
@ -192,10 +192,10 @@ fn test_tx_conflict_handling() {
|
|||||||
exp_chain_txouts: HashSet::from([("tx1", 0), ("tx_conflict_3", 0)]),
|
exp_chain_txouts: HashSet::from([("tx1", 0), ("tx_conflict_3", 0)]),
|
||||||
exp_unspents: HashSet::from([("tx_conflict_3", 0)]),
|
exp_unspents: HashSet::from([("tx_conflict_3", 0)]),
|
||||||
exp_balance: Balance {
|
exp_balance: Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 40000,
|
trusted_pending: Amount::from_sat(40000),
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 0,
|
confirmed: Amount::ZERO,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Scenario {
|
Scenario {
|
||||||
@ -227,10 +227,10 @@ fn test_tx_conflict_handling() {
|
|||||||
exp_chain_txouts: HashSet::from([("tx1", 0), ("tx_orphaned_conflict", 0)]),
|
exp_chain_txouts: HashSet::from([("tx1", 0), ("tx_orphaned_conflict", 0)]),
|
||||||
exp_unspents: HashSet::from([("tx_orphaned_conflict", 0)]),
|
exp_unspents: HashSet::from([("tx_orphaned_conflict", 0)]),
|
||||||
exp_balance: Balance {
|
exp_balance: Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 30000,
|
trusted_pending: Amount::from_sat(30000),
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 0,
|
confirmed: Amount::ZERO,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Scenario {
|
Scenario {
|
||||||
@ -262,10 +262,10 @@ fn test_tx_conflict_handling() {
|
|||||||
exp_chain_txouts: HashSet::from([("tx1", 0), ("tx_conflict_1", 0)]),
|
exp_chain_txouts: HashSet::from([("tx1", 0), ("tx_conflict_1", 0)]),
|
||||||
exp_unspents: HashSet::from([("tx_conflict_1", 0)]),
|
exp_unspents: HashSet::from([("tx_conflict_1", 0)]),
|
||||||
exp_balance: Balance {
|
exp_balance: Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 20000,
|
trusted_pending: Amount::from_sat(20000),
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 0,
|
confirmed: Amount::ZERO,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Scenario {
|
Scenario {
|
||||||
@ -311,10 +311,10 @@ fn test_tx_conflict_handling() {
|
|||||||
exp_chain_txouts: HashSet::from([("tx1", 0), ("tx_confirmed_conflict", 0)]),
|
exp_chain_txouts: HashSet::from([("tx1", 0), ("tx_confirmed_conflict", 0)]),
|
||||||
exp_unspents: HashSet::from([("tx_confirmed_conflict", 0)]),
|
exp_unspents: HashSet::from([("tx_confirmed_conflict", 0)]),
|
||||||
exp_balance: Balance {
|
exp_balance: Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 0,
|
trusted_pending: Amount::ZERO,
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 50000,
|
confirmed: Amount::from_sat(50000),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Scenario {
|
Scenario {
|
||||||
@ -356,10 +356,10 @@ fn test_tx_conflict_handling() {
|
|||||||
exp_chain_txouts: HashSet::from([("A", 0), ("B", 0), ("C", 0)]),
|
exp_chain_txouts: HashSet::from([("A", 0), ("B", 0), ("C", 0)]),
|
||||||
exp_unspents: HashSet::from([("C", 0)]),
|
exp_unspents: HashSet::from([("C", 0)]),
|
||||||
exp_balance: Balance {
|
exp_balance: Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 30000,
|
trusted_pending: Amount::from_sat(30000),
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 0,
|
confirmed: Amount::ZERO,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Scenario {
|
Scenario {
|
||||||
@ -397,10 +397,10 @@ fn test_tx_conflict_handling() {
|
|||||||
exp_chain_txouts: HashSet::from([("A", 0), ("B'", 0)]),
|
exp_chain_txouts: HashSet::from([("A", 0), ("B'", 0)]),
|
||||||
exp_unspents: HashSet::from([("B'", 0)]),
|
exp_unspents: HashSet::from([("B'", 0)]),
|
||||||
exp_balance: Balance {
|
exp_balance: Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 0,
|
trusted_pending: Amount::ZERO,
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 20000,
|
confirmed: Amount::from_sat(20000),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Scenario {
|
Scenario {
|
||||||
@ -442,10 +442,10 @@ fn test_tx_conflict_handling() {
|
|||||||
]),
|
]),
|
||||||
exp_unspents: HashSet::from([("C", 0)]),
|
exp_unspents: HashSet::from([("C", 0)]),
|
||||||
exp_balance: Balance {
|
exp_balance: Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 30000,
|
trusted_pending: Amount::from_sat(30000),
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 0,
|
confirmed: Amount::ZERO,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Scenario {
|
Scenario {
|
||||||
@ -487,10 +487,10 @@ fn test_tx_conflict_handling() {
|
|||||||
exp_chain_txouts: HashSet::from([("A", 0), ("B'", 0)]),
|
exp_chain_txouts: HashSet::from([("A", 0), ("B'", 0)]),
|
||||||
exp_unspents: HashSet::from([("B'", 0)]),
|
exp_unspents: HashSet::from([("B'", 0)]),
|
||||||
exp_balance: Balance {
|
exp_balance: Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 30000,
|
trusted_pending: Amount::from_sat(30000),
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 0,
|
confirmed: Amount::ZERO,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Scenario {
|
Scenario {
|
||||||
@ -532,10 +532,10 @@ fn test_tx_conflict_handling() {
|
|||||||
exp_chain_txouts: HashSet::from([("A", 0), ("B'", 0)]),
|
exp_chain_txouts: HashSet::from([("A", 0), ("B'", 0)]),
|
||||||
exp_unspents: HashSet::from([("B'", 0)]),
|
exp_unspents: HashSet::from([("B'", 0)]),
|
||||||
exp_balance: Balance {
|
exp_balance: Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 0,
|
trusted_pending: Amount::ZERO,
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 50000,
|
confirmed: Amount::from_sat(50000),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Scenario {
|
Scenario {
|
||||||
@ -583,10 +583,10 @@ fn test_tx_conflict_handling() {
|
|||||||
exp_chain_txouts: HashSet::from([("A", 0), ("B'", 0)]),
|
exp_chain_txouts: HashSet::from([("A", 0), ("B'", 0)]),
|
||||||
exp_unspents: HashSet::from([("B'", 0)]),
|
exp_unspents: HashSet::from([("B'", 0)]),
|
||||||
exp_balance: Balance {
|
exp_balance: Balance {
|
||||||
immature: 0,
|
immature: Amount::ZERO,
|
||||||
trusted_pending: 0,
|
trusted_pending: Amount::ZERO,
|
||||||
untrusted_pending: 0,
|
untrusted_pending: Amount::ZERO,
|
||||||
confirmed: 50000,
|
confirmed: Amount::from_sat(50000),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
@ -78,7 +78,7 @@ fn scan_detects_confirmed_tx() -> Result<()> {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
get_balance(&recv_chain, &recv_graph)?,
|
get_balance(&recv_chain, &recv_graph)?,
|
||||||
Balance {
|
Balance {
|
||||||
confirmed: SEND_AMOUNT.to_sat(),
|
confirmed: SEND_AMOUNT,
|
||||||
..Balance::default()
|
..Balance::default()
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
@ -147,7 +147,7 @@ fn tx_can_become_unconfirmed_after_reorg() -> Result<()> {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
get_balance(&recv_chain, &recv_graph)?,
|
get_balance(&recv_chain, &recv_graph)?,
|
||||||
Balance {
|
Balance {
|
||||||
confirmed: SEND_AMOUNT.to_sat() * REORG_COUNT as u64,
|
confirmed: SEND_AMOUNT * REORG_COUNT as u64,
|
||||||
..Balance::default()
|
..Balance::default()
|
||||||
},
|
},
|
||||||
"initial balance must be correct",
|
"initial balance must be correct",
|
||||||
@ -178,8 +178,8 @@ fn tx_can_become_unconfirmed_after_reorg() -> Result<()> {
|
|||||||
assert_eq!(
|
assert_eq!(
|
||||||
get_balance(&recv_chain, &recv_graph)?,
|
get_balance(&recv_chain, &recv_graph)?,
|
||||||
Balance {
|
Balance {
|
||||||
confirmed: SEND_AMOUNT.to_sat() * (REORG_COUNT - depth) as u64,
|
confirmed: SEND_AMOUNT * (REORG_COUNT - depth) as u64,
|
||||||
trusted_pending: SEND_AMOUNT.to_sat() * depth as u64,
|
trusted_pending: SEND_AMOUNT * depth as u64,
|
||||||
..Balance::default()
|
..Balance::default()
|
||||||
},
|
},
|
||||||
"reorg_count: {}",
|
"reorg_count: {}",
|
||||||
|
@ -506,11 +506,11 @@ where
|
|||||||
let chain = &*chain.lock().unwrap();
|
let chain = &*chain.lock().unwrap();
|
||||||
fn print_balances<'a>(
|
fn print_balances<'a>(
|
||||||
title_str: &'a str,
|
title_str: &'a str,
|
||||||
items: impl IntoIterator<Item = (&'a str, u64)>,
|
items: impl IntoIterator<Item = (&'a str, Amount)>,
|
||||||
) {
|
) {
|
||||||
println!("{}:", title_str);
|
println!("{}:", title_str);
|
||||||
for (name, amount) in items.into_iter() {
|
for (name, amount) in items.into_iter() {
|
||||||
println!(" {:<10} {:>12} sats", name, amount)
|
println!(" {:<10} {:>12} sats", name, amount.to_sat())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ const BATCH_SIZE: usize = 5;
|
|||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use bdk::bitcoin::Address;
|
use bdk::bitcoin::{Address, Amount};
|
||||||
use bdk::wallet::Update;
|
use bdk::wallet::Update;
|
||||||
use bdk::{bitcoin::Network, Wallet};
|
use bdk::{bitcoin::Network, Wallet};
|
||||||
use bdk::{KeychainKind, SignOptions};
|
use bdk::{KeychainKind, SignOptions};
|
||||||
@ -81,7 +81,8 @@ fn main() -> Result<(), anyhow::Error> {
|
|||||||
let balance = wallet.get_balance();
|
let balance = wallet.get_balance();
|
||||||
println!("Wallet balance after syncing: {} sats", balance.total());
|
println!("Wallet balance after syncing: {} sats", balance.total());
|
||||||
|
|
||||||
if balance.total() < SEND_AMOUNT {
|
// TODO: (@leonardo) Should we format here, or update on constant and TxBuilder::add_recipient() instead ?
|
||||||
|
if balance.total() < Amount::from_sat(SEND_AMOUNT) {
|
||||||
println!(
|
println!(
|
||||||
"Please send at least {} sats to the receiving address",
|
"Please send at least {} sats to the receiving address",
|
||||||
SEND_AMOUNT
|
SEND_AMOUNT
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use std::{collections::BTreeSet, io::Write, str::FromStr};
|
use std::{collections::BTreeSet, io::Write, str::FromStr};
|
||||||
|
|
||||||
use bdk::{
|
use bdk::{
|
||||||
bitcoin::{Address, Network, Script},
|
bitcoin::{Address, Amount, Network, Script},
|
||||||
KeychainKind, SignOptions, Wallet,
|
KeychainKind, SignOptions, Wallet,
|
||||||
};
|
};
|
||||||
use bdk_esplora::{esplora_client, EsploraAsyncExt};
|
use bdk_esplora::{esplora_client, EsploraAsyncExt};
|
||||||
@ -81,7 +81,8 @@ async fn main() -> Result<(), anyhow::Error> {
|
|||||||
let balance = wallet.get_balance();
|
let balance = wallet.get_balance();
|
||||||
println!("Wallet balance after syncing: {} sats", balance.total());
|
println!("Wallet balance after syncing: {} sats", balance.total());
|
||||||
|
|
||||||
if balance.total() < SEND_AMOUNT {
|
// TODO: (@leonardo) Should we format here, or update on constant and TxBuilder::add_recipient() instead ?
|
||||||
|
if balance.total() < Amount::from_sat(SEND_AMOUNT) {
|
||||||
println!(
|
println!(
|
||||||
"Please send at least {} sats to the receiving address",
|
"Please send at least {} sats to the receiving address",
|
||||||
SEND_AMOUNT
|
SEND_AMOUNT
|
||||||
|
@ -6,7 +6,7 @@ const PARALLEL_REQUESTS: usize = 1;
|
|||||||
use std::{collections::BTreeSet, io::Write, str::FromStr};
|
use std::{collections::BTreeSet, io::Write, str::FromStr};
|
||||||
|
|
||||||
use bdk::{
|
use bdk::{
|
||||||
bitcoin::{Address, Network},
|
bitcoin::{Address, Amount, Network},
|
||||||
KeychainKind, SignOptions, Wallet,
|
KeychainKind, SignOptions, Wallet,
|
||||||
};
|
};
|
||||||
use bdk_esplora::{esplora_client, EsploraExt};
|
use bdk_esplora::{esplora_client, EsploraExt};
|
||||||
@ -57,7 +57,8 @@ fn main() -> Result<(), anyhow::Error> {
|
|||||||
let balance = wallet.get_balance();
|
let balance = wallet.get_balance();
|
||||||
println!("Wallet balance after syncing: {} sats", balance.total());
|
println!("Wallet balance after syncing: {} sats", balance.total());
|
||||||
|
|
||||||
if balance.total() < SEND_AMOUNT {
|
// TODO: (@leonardo) Should we format here, or update on constant and TxBuilder::add_recipient() instead ?
|
||||||
|
if balance.total() < Amount::from_sat(SEND_AMOUNT) {
|
||||||
println!(
|
println!(
|
||||||
"Please send at least {} sats to the receiving address",
|
"Please send at least {} sats to the receiving address",
|
||||||
SEND_AMOUNT
|
SEND_AMOUNT
|
||||||
|
Loading…
x
Reference in New Issue
Block a user