From: James Taylor <54148103+jatayl@users.noreply.github.com> Date: Sun, 19 Dec 2021 07:55:24 +0000 (-0500) Subject: using dust value from rust-bitcoin X-Git-Tag: v0.16.0~2^2~3 X-Git-Url: http://internal-gitweb-vhost/script/%22https:/database/struct.GetBlocksMessage.html?a=commitdiff_plain;h=ca682819b396c44c9139086b1537d32b212499a1;p=bdk using dust value from rust-bitcoin --- diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index 8062ea9d..bf7993d4 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -53,7 +53,7 @@ use address_validator::AddressValidator; use coin_selection::DefaultCoinSelectionAlgorithm; use signer::{SignOptions, Signer, SignerOrdering, SignersContainer}; use tx_builder::{BumpFee, CreateTx, FeePolicy, TxBuilder, TxParams}; -use utils::{check_nlocktime, check_nsequence_rbf, After, Older, SecpCtx, DUST_LIMIT_SATOSHI}; +use utils::{check_nlocktime, check_nsequence_rbf, After, Older, SecpCtx}; use crate::blockchain::{Blockchain, Progress}; use crate::database::memory::MemoryDatabase; @@ -601,7 +601,7 @@ where let recipients = params.recipients.iter().map(|(r, v)| (r, *v)); for (index, (script_pubkey, value)) in recipients.enumerate() { - if value.is_dust() && !script_pubkey.is_provably_unspendable() { + if value.is_dust(script_pubkey) && !script_pubkey.is_provably_unspendable() { return Err(Error::OutputBelowDustLimit(index)); } @@ -677,9 +677,9 @@ where if tx.output.is_empty() { if params.drain_to.is_some() { - if drain_val.is_dust() { + if drain_val.is_dust(&drain_output.script_pubkey) { return Err(Error::InsufficientFunds { - needed: DUST_LIMIT_SATOSHI, + needed: drain_output.script_pubkey.dust_value().as_sat(), available: drain_val, }); } @@ -688,7 +688,7 @@ where } } - if drain_val.is_dust() { + if drain_val.is_dust(&drain_output.script_pubkey) { fee_amount += drain_val; } else { drain_output.value = drain_val; @@ -3424,7 +3424,7 @@ pub(crate) mod test { .unwrap(); let mut builder = wallet.build_fee_bump(txid).unwrap(); - builder.fee_rate(FeeRate::from_sat_per_vb(140.0)); + builder.fee_rate(FeeRate::from_sat_per_vb(141.0)); let (psbt, details) = builder.finish().unwrap(); assert_eq!( diff --git a/src/wallet/utils.rs b/src/wallet/utils.rs index 2b19eb80..50163dce 100644 --- a/src/wallet/utils.rs +++ b/src/wallet/utils.rs @@ -9,13 +9,11 @@ // You may not use this file except in accordance with one or both of these // licenses. +use bitcoin::blockdata::script::Script; use bitcoin::secp256k1::{All, Secp256k1}; use miniscript::{MiniscriptKey, Satisfier, ToPublicKey}; -// De-facto standard "dust limit" (even though it should change based on the output type) -pub const DUST_LIMIT_SATOSHI: u64 = 546; - // MSB of the nSequence. If set there's no consensus-constraint, so it must be disabled when // spending using CSV in order to enforce CSV rules pub(crate) const SEQUENCE_LOCKTIME_DISABLE_FLAG: u32 = 1 << 31; @@ -34,12 +32,12 @@ pub(crate) const BLOCKS_TIMELOCK_THRESHOLD: u32 = 500000000; // encourage the usage of this trait. pub trait IsDust { /// Check whether or not a value is below dust limit - fn is_dust(&self) -> bool; + fn is_dust(&self, script: &Script) -> bool; } impl IsDust for u64 { - fn is_dust(&self) -> bool { - *self <= DUST_LIMIT_SATOSHI + fn is_dust(&self, script: &Script) -> bool { + *self <= script.dust_value().as_sat() } }