diff --git a/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/LiveTxBuilderTest.kt b/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/LiveTxBuilderTest.kt index 4e5454e0..6943878a 100644 --- a/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/LiveTxBuilderTest.kt +++ b/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/LiveTxBuilderTest.kt @@ -21,7 +21,7 @@ class LiveTxBuilderTest { val recipient: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.TESTNET) val psbt: PartiallySignedTransaction = TxBuilder() .addRecipient(recipient.scriptPubkey(), 4200uL) - .feeRate(2.0f) + .feeRate(FeeRate.fromSatPerVb(2.0f)) .finish(wallet) println(psbt.serialize()) @@ -49,7 +49,7 @@ class LiveTxBuilderTest { val psbt: PartiallySignedTransaction = TxBuilder() .setRecipients(allRecipients) - .feeRate(4.0f) + .feeRate(FeeRate.fromSatPerVb(4.0f)) .changePolicy(ChangeSpendPolicy.CHANGE_FORBIDDEN) .enableRbf() .finish(wallet) diff --git a/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/LiveWalletTest.kt b/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/LiveWalletTest.kt index f0cf7863..f514e695 100644 --- a/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/LiveWalletTest.kt +++ b/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/LiveWalletTest.kt @@ -49,7 +49,7 @@ class LiveWalletTest { val psbt: PartiallySignedTransaction = TxBuilder() .addRecipient(recipient.scriptPubkey(), 4200uL) - .feeRate(4.0f) + .feeRate(FeeRate.fromSatPerVb(4.0f)) .finish(wallet) println(psbt.serialize()) diff --git a/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/OfflineDescriptorTest.kt b/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/OfflineDescriptorTest.kt index c9e46e12..7051cef0 100644 --- a/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/OfflineDescriptorTest.kt +++ b/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/OfflineDescriptorTest.kt @@ -4,7 +4,6 @@ import kotlin.test.Test import kotlin.test.assertEquals import androidx.test.ext.junit.runners.AndroidJUnit4 import org.junit.runner.RunWith -import kotlin.test.assertEquals @RunWith(AndroidJUnit4::class) class OfflineDescriptorTest { diff --git a/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/OfflineWalletTest.kt b/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/OfflineWalletTest.kt index 35d5fcd8..cbdfbc14 100644 --- a/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/OfflineWalletTest.kt +++ b/bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/OfflineWalletTest.kt @@ -3,6 +3,7 @@ package org.bitcoindevkit import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue +import kotlin.test.assertFalse import androidx.test.ext.junit.runners.AndroidJUnit4 import org.junit.runner.RunWith diff --git a/bdk-ffi/src/bdk.udl b/bdk-ffi/src/bdk.udl index 760c41d8..81132e0c 100644 --- a/bdk-ffi/src/bdk.udl +++ b/bdk-ffi/src/bdk.udl @@ -68,7 +68,14 @@ dictionary TxOut { // ------------------------------------------------------------------------ interface FeeRate { + [Name=from_sat_per_vb] + constructor(f32 sat_per_vb); + + [Name=from_sat_per_kwu] + constructor(f32 sat_per_kwu); + f32 as_sat_per_vb(); + f32 sat_per_kwu(); }; @@ -132,7 +139,7 @@ interface TxBuilder { TxBuilder manually_selected_only(); - TxBuilder fee_rate(float sat_per_vbyte); + TxBuilder fee_rate([ByRef] FeeRate fee_rate); TxBuilder fee_absolute(u64 fee); diff --git a/bdk-ffi/src/types.rs b/bdk-ffi/src/types.rs index f06affbf..5acd3a7a 100644 --- a/bdk-ffi/src/types.rs +++ b/bdk-ffi/src/types.rs @@ -11,9 +11,18 @@ use bdk::FeeRate as BdkFeeRate; use std::sync::Arc; +#[derive(Clone, Debug)] pub struct FeeRate(pub BdkFeeRate); impl FeeRate { + pub fn from_sat_per_vb(sat_per_vb: f32) -> Self { + FeeRate(BdkFeeRate::from_sat_per_vb(sat_per_vb)) + } + + pub fn from_sat_per_kwu(sat_per_kwu: f32) -> Self { + FeeRate(BdkFeeRate::from_sat_per_kwu(sat_per_kwu)) + } + pub fn as_sat_per_vb(&self) -> f32 { self.0.as_sat_per_vb() } diff --git a/bdk-ffi/src/wallet.rs b/bdk-ffi/src/wallet.rs index 18248d81..97f33a45 100644 --- a/bdk-ffi/src/wallet.rs +++ b/bdk-ffi/src/wallet.rs @@ -309,7 +309,7 @@ pub struct TxBuilder { pub(crate) unspendable: HashSet, pub(crate) change_policy: ChangeSpendPolicy, pub(crate) manually_selected_only: bool, - pub(crate) fee_rate: Option, + pub(crate) fee_rate: Option, pub(crate) fee_absolute: Option, pub(crate) drain_wallet: bool, pub(crate) drain_to: Option, @@ -412,9 +412,9 @@ impl TxBuilder { }) } - pub(crate) fn fee_rate(&self, sat_per_vb: f32) -> Arc { + pub(crate) fn fee_rate(&self, fee_rate: &FeeRate) -> Arc { Arc::new(TxBuilder { - fee_rate: Some(sat_per_vb), + fee_rate: Some(fee_rate.clone()), ..self.clone() }) } @@ -486,8 +486,8 @@ impl TxBuilder { if self.manually_selected_only { tx_builder.manually_selected_only(); } - if let Some(sat_per_vb) = self.fee_rate { - tx_builder.fee_rate(BdkFeeRate::from_sat_per_vb(sat_per_vb)); + if let Some(fee_rate) = &self.fee_rate { + tx_builder.fee_rate(fee_rate.0); } if let Some(fee_amount) = self.fee_absolute { tx_builder.fee_absolute(fee_amount); diff --git a/bdk-jvm/lib/src/test/kotlin/org/bitcoindevkit/LiveTxBuilderTest.kt b/bdk-jvm/lib/src/test/kotlin/org/bitcoindevkit/LiveTxBuilderTest.kt index e3149682..837ae083 100644 --- a/bdk-jvm/lib/src/test/kotlin/org/bitcoindevkit/LiveTxBuilderTest.kt +++ b/bdk-jvm/lib/src/test/kotlin/org/bitcoindevkit/LiveTxBuilderTest.kt @@ -18,7 +18,7 @@ class LiveTxBuilderTest { val recipient: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.TESTNET) val psbt: PartiallySignedTransaction = TxBuilder() .addRecipient(recipient.scriptPubkey(), 4200uL) - .feeRate(2.0f) + .feeRate(FeeRate.fromSatPerVb(2.0f)) .finish(wallet) println(psbt.serialize()) @@ -47,7 +47,7 @@ class LiveTxBuilderTest { val psbt: PartiallySignedTransaction = TxBuilder() .setRecipients(allRecipients) - .feeRate(4.0f) + .feeRate(FeeRate.fromSatPerVb(4.0f)) .changePolicy(ChangeSpendPolicy.CHANGE_FORBIDDEN) .enableRbf() .finish(wallet) diff --git a/bdk-jvm/lib/src/test/kotlin/org/bitcoindevkit/LiveWalletTest.kt b/bdk-jvm/lib/src/test/kotlin/org/bitcoindevkit/LiveWalletTest.kt index 9b49cb98..6ec9468d 100644 --- a/bdk-jvm/lib/src/test/kotlin/org/bitcoindevkit/LiveWalletTest.kt +++ b/bdk-jvm/lib/src/test/kotlin/org/bitcoindevkit/LiveWalletTest.kt @@ -45,7 +45,7 @@ class LiveWalletTest { val psbt: PartiallySignedTransaction = TxBuilder() .addRecipient(recipient.scriptPubkey(), 4200uL) - .feeRate(2.0f) + .feeRate(FeeRate.fromSatPerVb(2.0f)) .finish(wallet) println(psbt.serialize()) diff --git a/bdk-python/tests/test_live_tx_builder.py b/bdk-python/tests/test_live_tx_builder.py index 56e020d9..8eb82a2e 100644 --- a/bdk-python/tests/test_live_tx_builder.py +++ b/bdk-python/tests/test_live_tx_builder.py @@ -28,7 +28,7 @@ def test_tx_builder(self): network = bdk.Network.TESTNET ) - psbt = bdk.TxBuilder().add_recipient(script=recipient.script_pubkey(), amount=4200).fee_rate(2.0).finish(wallet) + psbt = bdk.TxBuilder().add_recipient(script=recipient.script_pubkey(), amount=4200).fee_rate(fee_rate=bdk.FeeRate.from_sat_per_vb(2.0)).finish(wallet) # print(psbt.serialize()) self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi") @@ -70,7 +70,7 @@ def complex_tx_builder(self): bdk.ScriptAmount(recipient2.script_pubkey, 4200) ) - psbt: bdk.PartiallySignedTransaction = bdk.TxBuilder().set_recipients(all_recipients).fee_rate(4.0).change_policy(bdk.ChangeSpendPolicy.CHANGE_FORBIDDEN).enable_rbf().finish(wallet) + psbt: bdk.PartiallySignedTransaction = bdk.TxBuilder().add_recipient(script=recipient.script_pubkey(), amount=4200).fee_rate(fee_rate=bdk.FeeRate.from_sat_per_vb(2.0)).finish(wallet) wallet.sign(psbt) self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi") diff --git a/bdk-python/tests/test_live_wallet.py b/bdk-python/tests/test_live_wallet.py index b8ec7161..6c7ebe4c 100644 --- a/bdk-python/tests/test_live_wallet.py +++ b/bdk-python/tests/test_live_wallet.py @@ -57,7 +57,7 @@ def test_broadcast_transaction(self): network = bdk.Network.TESTNET ) - psbt = bdk.TxBuilder().add_recipient(script=recipient.script_pubkey(), amount=4200).fee_rate(2.0).finish(wallet) + psbt = bdk.TxBuilder().add_recipient(script=recipient.script_pubkey(), amount=4200).fee_rate(fee_rate=bdk.FeeRate.from_sat_per_vb(2.0)).finish(wallet) # print(psbt.serialize()) self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi") diff --git a/bdk-swift/Tests/BitcoinDevKitTests/LiveTxBuilderTests.swift b/bdk-swift/Tests/BitcoinDevKitTests/LiveTxBuilderTests.swift index 9d033667..4c552498 100644 --- a/bdk-swift/Tests/BitcoinDevKitTests/LiveTxBuilderTests.swift +++ b/bdk-swift/Tests/BitcoinDevKitTests/LiveTxBuilderTests.swift @@ -25,7 +25,7 @@ final class LiveTxBuilderTests: XCTestCase { let recipient: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .testnet) let psbt: PartiallySignedTransaction = try TxBuilder() .addRecipient(script: recipient.scriptPubkey(), amount: 4200) - .feeRate(satPerVbyte: 2.0) + .feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 2.0)) .finish(wallet: wallet) print(psbt.serialize()) @@ -65,7 +65,7 @@ final class LiveTxBuilderTests: XCTestCase { let psbt: PartiallySignedTransaction = try TxBuilder() .setRecipients(recipients: allRecipients) - .feeRate(satPerVbyte: 4.0) + .feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 4.0)) .changePolicy(changePolicy: ChangeSpendPolicy.changeForbidden) .enableRbf() .finish(wallet: wallet) diff --git a/bdk-swift/Tests/BitcoinDevKitTests/LiveWalletTests.swift b/bdk-swift/Tests/BitcoinDevKitTests/LiveWalletTests.swift index 863a1037..d802c419 100644 --- a/bdk-swift/Tests/BitcoinDevKitTests/LiveWalletTests.swift +++ b/bdk-swift/Tests/BitcoinDevKitTests/LiveWalletTests.swift @@ -58,7 +58,7 @@ final class LiveWalletTests: XCTestCase { let psbt: PartiallySignedTransaction = try TxBuilder() .addRecipient(script: recipient.scriptPubkey(), amount: 4200) - .feeRate(satPerVbyte: 2.0) + .feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 2.0)) .finish(wallet: wallet) print(psbt.serialize())