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;
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));
}
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,
});
}
}
}
- if drain_val.is_dust() {
+ if drain_val.is_dust(&drain_output.script_pubkey) {
fee_amount += drain_val;
} else {
drain_output.value = drain_val;
.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!(
// 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;
// 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()
}
}