]> Untitled Git - bdk/commitdiff
using dust value from rust-bitcoin
authorJames Taylor <54148103+jatayl@users.noreply.github.com>
Sun, 19 Dec 2021 07:55:24 +0000 (02:55 -0500)
committerJames Taylor <54148103+jatayl@users.noreply.github.com>
Sun, 19 Dec 2021 07:55:24 +0000 (02:55 -0500)
src/wallet/mod.rs
src/wallet/utils.rs

index 8062ea9db77ea175cf60352e86f083d44ba97321..bf7993d40a5e5f0ac26edaa75c39ae4da68a094d 100644 (file)
@@ -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!(
index 2b19eb80306e16f39ad2e4df9a9c27c460507b1d..50163dce892bcd167fd0bd7d31b8001d7231da91 100644 (file)
@@ -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()
     }
 }