From 7d27941d6a9cd357a4a208baf3344a967da9e2be Mon Sep 17 00:00:00 2001 From: Dario Anongba Varela Date: Mon, 10 Nov 2025 12:30:12 +0100 Subject: [PATCH 1/3] dust checks --- src/types/address.rs | 71 +----------------------------------- src/types/amount.rs | 12 ++++-- src/types/mod.rs | 2 + src/types/script.rs | 87 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+), 72 deletions(-) create mode 100644 src/types/script.rs diff --git a/src/types/address.rs b/src/types/address.rs index 04ca220..64e8f28 100644 --- a/src/types/address.rs +++ b/src/types/address.rs @@ -1,7 +1,7 @@ use std::{ops::Deref, str::FromStr}; use bdk_wallet::{ - bitcoin::{Address as BdkAddress, AddressType as BdkAddressType, Network as BdkNetwork, ScriptBuf as BdkScriptBuf}, + bitcoin::{Address as BdkAddress, AddressType as BdkAddressType, Network as BdkNetwork}, AddressInfo as BdkAddressInfo, }; use bitcoin::address::ParseError; @@ -9,7 +9,7 @@ use wasm_bindgen::prelude::wasm_bindgen; use crate::{ result::JsResult, - types::{BdkError, BdkErrorCode}, + types::{BdkError, BdkErrorCode, ScriptBuf}, }; use super::{KeychainKind, Network}; @@ -143,73 +143,6 @@ impl From for BdkError { } } -/// An owned, growable script. -/// -/// `ScriptBuf` is the most common script type that has the ownership over the contents of the -/// script. It has a close relationship with its borrowed counterpart, [`Script`]. -#[wasm_bindgen] -#[derive(Clone)] -pub struct ScriptBuf(BdkScriptBuf); - -impl Deref for ScriptBuf { - type Target = BdkScriptBuf; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -#[wasm_bindgen] -impl ScriptBuf { - pub fn from_hex(s: &str) -> JsResult { - let script = BdkScriptBuf::from_hex(s)?; - Ok(script.into()) - } - - pub fn from_bytes(bytes: Vec) -> Self { - BdkScriptBuf::from_bytes(bytes).into() - } - - #[allow(clippy::inherent_to_string)] - #[wasm_bindgen(js_name = toString)] - pub fn to_string(&self) -> String { - self.0.to_string() - } - - pub fn as_bytes(&self) -> Vec { - self.0.as_bytes().to_vec() - } - - pub fn to_asm_string(&self) -> String { - self.0.to_asm_string() - } - - pub fn to_hex_string(&self) -> String { - self.0.to_hex_string() - } - - pub fn is_op_return(&self) -> bool { - self.0.is_op_return() - } - - #[wasm_bindgen(js_name = clone)] - pub fn js_clone(&self) -> ScriptBuf { - self.clone() - } -} - -impl From for ScriptBuf { - fn from(inner: BdkScriptBuf) -> Self { - ScriptBuf(inner) - } -} - -impl From for BdkScriptBuf { - fn from(script_buf: ScriptBuf) -> Self { - script_buf.0 - } -} - /// The different types of addresses. #[wasm_bindgen] #[derive(Clone, Copy, PartialEq, Eq)] diff --git a/src/types/amount.rs b/src/types/amount.rs index 93402d1..29464ea 100644 --- a/src/types/amount.rs +++ b/src/types/amount.rs @@ -1,11 +1,11 @@ use std::ops::Deref; -use bdk_wallet::bitcoin::{Amount as BdkAmount, Denomination as BdkDenomination}; -use bitcoin::amount::ParseAmountError; +use bdk_wallet::{IsDust, bitcoin::{Amount as BdkAmount, Denomination as BdkDenomination}}; +use bitcoin::{amount::ParseAmountError}; use serde::Serialize; use wasm_bindgen::prelude::wasm_bindgen; -use crate::types::{BdkError, BdkErrorCode}; +use crate::types::{ BdkError, BdkErrorCode, ScriptBuf}; /// Amount /// @@ -44,6 +44,12 @@ impl Amount { pub fn to_float_in(&self, denom: Denomination) -> f64 { self.0.to_float_in(denom.into()) } + + /// Check whether or not a value is below dust limit + /// for a given script + pub fn is_dust(&self, script: ScriptBuf) -> bool { + self.0.is_dust(&script) + } } impl Deref for Amount { diff --git a/src/types/mod.rs b/src/types/mod.rs index 505f8b1..f1e9d55 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -14,6 +14,7 @@ mod output; mod psbt; mod slip10; mod transaction; +mod script; pub use address::*; pub use amount::*; @@ -31,3 +32,4 @@ pub use output::*; pub use psbt::*; pub use slip10::*; pub use transaction::*; +pub use script::*; \ No newline at end of file diff --git a/src/types/script.rs b/src/types/script.rs new file mode 100644 index 0000000..fcf2df1 --- /dev/null +++ b/src/types/script.rs @@ -0,0 +1,87 @@ +use std::ops::Deref; + +use bdk_wallet::bitcoin::ScriptBuf as BdkScriptBuf; +use wasm_bindgen::prelude::wasm_bindgen; + +use crate::{result::JsResult, types::{Amount, FeeRate}}; + +/// An owned, growable script. +/// +/// `ScriptBuf` is the most common script type that has the ownership over the contents of the +/// script. It has a close relationship with its borrowed counterpart, [`Script`]. +#[wasm_bindgen] +#[derive(Clone)] +pub struct ScriptBuf(BdkScriptBuf); + +impl Deref for ScriptBuf { + type Target = BdkScriptBuf; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +#[wasm_bindgen] +impl ScriptBuf { + pub fn from_hex(s: &str) -> JsResult { + let script = BdkScriptBuf::from_hex(s)?; + Ok(script.into()) + } + + pub fn from_bytes(bytes: Vec) -> Self { + BdkScriptBuf::from_bytes(bytes).into() + } + + #[allow(clippy::inherent_to_string)] + #[wasm_bindgen(js_name = toString)] + pub fn to_string(&self) -> String { + self.0.to_string() + } + + pub fn as_bytes(&self) -> Vec { + self.0.as_bytes().to_vec() + } + + pub fn to_asm_string(&self) -> String { + self.0.to_asm_string() + } + + pub fn to_hex_string(&self) -> String { + self.0.to_hex_string() + } + + pub fn is_op_return(&self) -> bool { + self.0.is_op_return() + } + + #[wasm_bindgen(js_name = clone)] + pub fn js_clone(&self) -> ScriptBuf { + self.clone() + } + + /// Returns the minimum value an output with this script should have in order to be + /// broadcastable on today's Bitcoin network. + #[wasm_bindgen(getter)] + pub fn minimal_non_dust(&self) -> Amount { + self.0.minimal_non_dust().into() + } + + /// Returns the minimum value an output with this script should have in order to be + /// broadcastable on today's Bitcoin network. + #[wasm_bindgen(getter)] + pub fn minimal_non_dust_custom(&self, dust_relay_fee: FeeRate) -> Amount { + self.0.minimal_non_dust_custom(dust_relay_fee.into()).into() + } +} + +impl From for ScriptBuf { + fn from(inner: BdkScriptBuf) -> Self { + ScriptBuf(inner) + } +} + +impl From for BdkScriptBuf { + fn from(script_buf: ScriptBuf) -> Self { + script_buf.0 + } +} From cc7a906a79f6bba63325fdf1ce414bb5474c40c3 Mon Sep 17 00:00:00 2001 From: Dario Anongba Varela Date: Mon, 10 Nov 2025 12:32:34 +0100 Subject: [PATCH 2/3] fmt --- src/types/amount.rs | 9 ++++++--- src/types/mod.rs | 4 ++-- src/types/script.rs | 5 ++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/types/amount.rs b/src/types/amount.rs index 29464ea..f20ebbe 100644 --- a/src/types/amount.rs +++ b/src/types/amount.rs @@ -1,11 +1,14 @@ use std::ops::Deref; -use bdk_wallet::{IsDust, bitcoin::{Amount as BdkAmount, Denomination as BdkDenomination}}; -use bitcoin::{amount::ParseAmountError}; +use bdk_wallet::{ + bitcoin::{Amount as BdkAmount, Denomination as BdkDenomination}, + IsDust, +}; +use bitcoin::amount::ParseAmountError; use serde::Serialize; use wasm_bindgen::prelude::wasm_bindgen; -use crate::types::{ BdkError, BdkErrorCode, ScriptBuf}; +use crate::types::{BdkError, BdkErrorCode, ScriptBuf}; /// Amount /// diff --git a/src/types/mod.rs b/src/types/mod.rs index f1e9d55..2df2338 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -12,9 +12,9 @@ mod keychain; mod network; mod output; mod psbt; +mod script; mod slip10; mod transaction; -mod script; pub use address::*; pub use amount::*; @@ -30,6 +30,6 @@ pub use keychain::*; pub use network::*; pub use output::*; pub use psbt::*; +pub use script::*; pub use slip10::*; pub use transaction::*; -pub use script::*; \ No newline at end of file diff --git a/src/types/script.rs b/src/types/script.rs index fcf2df1..6a3c0ac 100644 --- a/src/types/script.rs +++ b/src/types/script.rs @@ -3,7 +3,10 @@ use std::ops::Deref; use bdk_wallet::bitcoin::ScriptBuf as BdkScriptBuf; use wasm_bindgen::prelude::wasm_bindgen; -use crate::{result::JsResult, types::{Amount, FeeRate}}; +use crate::{ + result::JsResult, + types::{Amount, FeeRate}, +}; /// An owned, growable script. /// From 63082cf3957834b78fb86fe0db1c47fe0c2d5400 Mon Sep 17 00:00:00 2001 From: Dario Anongba Varela Date: Mon, 10 Nov 2025 12:35:50 +0100 Subject: [PATCH 3/3] no getter --- src/types/script.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/types/script.rs b/src/types/script.rs index 6a3c0ac..bdaf011 100644 --- a/src/types/script.rs +++ b/src/types/script.rs @@ -64,14 +64,12 @@ impl ScriptBuf { /// Returns the minimum value an output with this script should have in order to be /// broadcastable on today's Bitcoin network. - #[wasm_bindgen(getter)] pub fn minimal_non_dust(&self) -> Amount { self.0.minimal_non_dust().into() } /// Returns the minimum value an output with this script should have in order to be /// broadcastable on today's Bitcoin network. - #[wasm_bindgen(getter)] pub fn minimal_non_dust_custom(&self, dust_relay_fee: FeeRate) -> Amount { self.0.minimal_non_dust_custom(dust_relay_fee.into()).into() }