//! # use bdk::*;
//! # use bdk::wallet::coin_selection::decide_change;
//! # use anyhow::Error;
-//! # const TXIN_BASE_WEIGHT: usize = (32 + 4 + 4) * 4;
//! #[derive(Debug)]
//! struct AlwaysSpendEverything;
//!
//! |(selected_amount, additional_weight), weighted_utxo| {
//! **selected_amount += weighted_utxo.utxo.txout().value;
//! **additional_weight += Weight::from_wu(
-//! (TXIN_BASE_WEIGHT + weighted_utxo.satisfaction_weight) as u64,
+//! (TxIn::default().segwit_weight() + weighted_utxo.satisfaction_weight)
+//! as u64,
//! );
//! Some(weighted_utxo.utxo)
//! },
use alloc::vec::Vec;
use bitcoin::consensus::encode::serialize;
use bitcoin::OutPoint;
+use bitcoin::TxIn;
use bitcoin::{Script, Weight};
use core::convert::TryInto;
/// overridden
pub type DefaultCoinSelectionAlgorithm = BranchAndBoundCoinSelection;
-// Base weight of a Txin, not counting the weight needed for satisfying it.
-// prev_txid (32 bytes) + prev_vout (4 bytes) + sequence (4 bytes)
-pub(crate) const TXIN_BASE_WEIGHT: usize = (32 + 4 + 4) * 4;
-
/// Errors that can be thrown by the [`coin_selection`](crate::wallet::coin_selection) module
#[derive(Debug)]
pub enum Error {
if must_use || **selected_amount < target_amount + **fee_amount {
**fee_amount += (fee_rate
* Weight::from_wu(
- (TXIN_BASE_WEIGHT + weighted_utxo.satisfaction_weight) as u64,
+ (TxIn::default().segwit_weight() + weighted_utxo.satisfaction_weight)
+ as u64,
))
.to_sat();
-
**selected_amount += weighted_utxo.utxo.txout().value;
Some(weighted_utxo.utxo)
} else {
impl OutputGroup {
fn new(weighted_utxo: WeightedUtxo, fee_rate: FeeRate) -> Self {
let fee = (fee_rate
- * Weight::from_wu((TXIN_BASE_WEIGHT + weighted_utxo.satisfaction_weight) as u64))
+ * Weight::from_wu(
+ (TxIn::default().segwit_weight() + weighted_utxo.satisfaction_weight) as u64,
+ ))
.to_sat();
-
let effective_value = weighted_utxo.utxo.txout().value as i64 - fee as i64;
OutputGroup {
weighted_utxo,
use core::str::FromStr;
use bdk_chain::ConfirmationTime;
- use bitcoin::{Amount, OutPoint, ScriptBuf, TxOut};
+ use bitcoin::{Amount, OutPoint, ScriptBuf, TxIn, TxOut};
use super::*;
use crate::types::*;
use rand::seq::SliceRandom;
use rand::{Rng, RngCore, SeedableRng};
- // n. of items on witness (1WU) + signature len (1WU) + signature and sighash (72WU)
- // + pubkey len (1WU) + pubkey (33WU) + script sig len (1 byte, 4WU)
- const P2WPKH_SATISFACTION_SIZE: usize = 1 + 1 + 72 + 1 + 33 + 4;
+ // signature len (1WU) + signature and sighash (72WU)
+ // + pubkey len (1WU) + pubkey (33WU)
+ const P2WPKH_SATISFACTION_SIZE: usize = 1 + 72 + 1 + 33;
const FEE_AMOUNT: u64 = 50;
assert_eq!(result.selected.len(), 1);
assert_eq!(result.selected_amount(), 100_000);
- let input_weight = (TXIN_BASE_WEIGHT + P2WPKH_SATISFACTION_SIZE) as u64;
+ let input_weight = (TxIn::default().segwit_weight() + P2WPKH_SATISFACTION_SIZE) as u64;
// the final fee rate should be exactly the same as the fee rate given
let result_feerate = Amount::from_sat(result.fee_amount) / Weight::from_wu(input_weight);
assert_eq!(result_feerate, feerate);
pub mod error;
pub use utils::IsDust;
-#[allow(deprecated)]
use coin_selection::DefaultCoinSelectionAlgorithm;
use signer::{SignOptions, SignerOrdering, SignersContainer, TransactionSigner};
use tx_builder::{BumpFee, CreateTx, FeePolicy, TxBuilder, TxParams};
let weighted_utxo = match txout_index.index_of_spk(&txout.script_pubkey) {
Some((keychain, derivation_index)) => {
- #[allow(deprecated)]
let satisfaction_weight = self
.get_descriptor_for_keychain(keychain)
- .max_satisfaction_weight()
+ .max_weight_to_satisfy()
.unwrap();
WeightedUtxo {
utxo: Utxo::Local(LocalOutput {
let satisfaction_weight =
serialize(&txin.script_sig).len() * 4 + serialize(&txin.witness).len();
WeightedUtxo {
- satisfaction_weight,
utxo: Utxo::Foreign {
outpoint: txin.previous_output,
sequence: Some(txin.sequence),
..Default::default()
}),
},
+ satisfaction_weight,
}
}
};
self.list_unspent()
.map(|utxo| {
let keychain = utxo.keychain;
- #[allow(deprecated)]
- (
- utxo,
+ (utxo, {
self.get_descriptor_for_keychain(keychain)
- .max_satisfaction_weight()
- .unwrap(),
- )
+ .max_weight_to_satisfy()
+ .unwrap()
+ })
})
.collect()
}
for utxo in utxos {
let descriptor = wallet.get_descriptor_for_keychain(utxo.keychain);
- #[allow(deprecated)]
- let satisfaction_weight = descriptor.max_satisfaction_weight().unwrap();
+ let satisfaction_weight = descriptor.max_weight_to_satisfy().unwrap();
self.params.utxos.push(WeightedUtxo {
satisfaction_weight,
utxo: Utxo::Local(utxo),
/// causing you to pay a fee that is too high. The party who is broadcasting the transaction can
/// of course check the real input weight matches the expected weight prior to broadcasting.
///
- /// To guarantee the `satisfaction_weight` is correct, you can require the party providing the
+ /// To guarantee the `max_weight_to_satisfy` is correct, you can require the party providing the
/// `psbt_input` provide a miniscript descriptor for the input so you can check it against the
- /// `script_pubkey` and then ask it for the [`max_satisfaction_weight`].
+ /// `script_pubkey` and then ask it for the [`max_weight_to_satisfy`].
///
/// This is an **EXPERIMENTAL** feature, API and other major changes are expected.
///
///
/// [`only_witness_utxo`]: Self::only_witness_utxo
/// [`finish`]: Self::finish
- /// [`max_satisfaction_weight`]: miniscript::Descriptor::max_satisfaction_weight
+ /// [`max_weight_to_satisfy`]: miniscript::Descriptor::max_weight_to_satisfy
pub fn add_foreign_utxo(
&mut self,
outpoint: OutPoint,
.unwrap()
.assume_checked();
let utxo = wallet2.list_unspent().next().expect("must take!");
- #[allow(deprecated)]
let foreign_utxo_satisfaction = wallet2
.get_descriptor_for_keychain(KeychainKind::External)
- .max_satisfaction_weight()
+ .max_weight_to_satisfy()
.unwrap();
let psbt_input = psbt::Input {
.unwrap()
.assume_checked();
let utxo = wallet2.list_unspent().next().expect("must take!");
- #[allow(deprecated)]
let foreign_utxo_satisfaction = wallet2
.get_descriptor_for_keychain(KeychainKind::External)
- .max_satisfaction_weight()
+ .max_weight_to_satisfy()
.unwrap();
let psbt_input = psbt::Input {
fn test_add_foreign_utxo_invalid_psbt_input() {
let (mut wallet, _) = get_funded_wallet(get_test_wpkh());
let outpoint = wallet.list_unspent().next().expect("must exist").outpoint;
- #[allow(deprecated)]
let foreign_utxo_satisfaction = wallet
.get_descriptor_for_keychain(KeychainKind::External)
- .max_satisfaction_weight()
+ .max_weight_to_satisfy()
.unwrap();
let mut builder = wallet.build_tx();
let tx1 = wallet1.get_tx(txid1).unwrap().tx_node.tx.clone();
let tx2 = wallet2.get_tx(txid2).unwrap().tx_node.tx.clone();
- #[allow(deprecated)]
let satisfaction_weight = wallet2
.get_descriptor_for_keychain(KeychainKind::External)
- .max_satisfaction_weight()
+ .max_weight_to_satisfy()
.unwrap();
let mut builder = wallet1.build_tx();
.assume_checked();
let utxo2 = wallet2.list_unspent().next().unwrap();
- #[allow(deprecated)]
let satisfaction_weight = wallet2
.get_descriptor_for_keychain(KeychainKind::External)
- .max_satisfaction_weight()
+ .max_weight_to_satisfy()
.unwrap();
let mut builder = wallet1.build_tx();
.assume_checked();
let utxo = wallet2.list_unspent().next().unwrap();
let psbt_input = wallet2.get_psbt_input(utxo.clone(), None, false).unwrap();
- #[allow(deprecated)]
let foreign_utxo_satisfaction = wallet2
.get_descriptor_for_keychain(KeychainKind::External)
- .max_satisfaction_weight()
+ .max_weight_to_satisfy()
.unwrap();
assert!(