From 8e9d2ddc14155af45ba623251a2f5bb731cdf81f Mon Sep 17 00:00:00 2001 From: Matthew Date: Tue, 16 Jan 2024 14:17:56 -0600 Subject: [PATCH] feat: use FeeRate type in TxBuilder --- .../kotlin/org/bitcoindevkit/LiveTxBuilderTest.kt | 4 ++-- .../kotlin/org/bitcoindevkit/LiveWalletTest.kt | 2 +- .../kotlin/org/bitcoindevkit/OfflineDescriptorTest.kt | 1 - .../kotlin/org/bitcoindevkit/OfflineWalletTest.kt | 1 + bdk-ffi/src/bdk.udl | 9 ++++++++- bdk-ffi/src/types.rs | 9 +++++++++ bdk-ffi/src/wallet.rs | 10 +++++----- .../test/kotlin/org/bitcoindevkit/LiveTxBuilderTest.kt | 4 ++-- .../test/kotlin/org/bitcoindevkit/LiveWalletTest.kt | 2 +- bdk-python/tests/test_live_tx_builder.py | 4 ++-- bdk-python/tests/test_live_wallet.py | 2 +- .../Tests/BitcoinDevKitTests/LiveTxBuilderTests.swift | 4 ++-- .../Tests/BitcoinDevKitTests/LiveWalletTests.swift | 2 +- 13 files changed, 35 insertions(+), 19 deletions(-) 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 4e5454e..6943878 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 f0cf786..f514e69 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 c9e46e1..7051cef 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 35d5fcd..cbdfbc1 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 760c41d..81132e0 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 f06affb..5acd3a7 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 18248d8..97f33a4 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 e314968..837ae08 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 9b49cb9..6ec9468 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 56e020d..8eb82a2 100644 --- a/bdk-python/tests/test_live_tx_builder.py +++ b/bdk-python/tests/test_live_tx_builder.py @@ -28,7 +28,7 @@ class TestLiveTxBuilder(unittest.TestCase): 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 @@ class TestLiveTxBuilder(unittest.TestCase): 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 b8ec716..6c7ebe4 100644 --- a/bdk-python/tests/test_live_wallet.py +++ b/bdk-python/tests/test_live_wallet.py @@ -57,7 +57,7 @@ class TestLiveWallet(unittest.TestCase): 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 9d03366..4c55249 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 863a103..d802c41 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())