From c79a39914e4bafc42b0611ae27591f29a1ceb8d8 Mon Sep 17 00:00:00 2001 From: thunderbiscuit Date: Thu, 7 Dec 2023 14:46:57 -0500 Subject: [PATCH] feat: add enable_rbf method on txbuilder --- bdk-ffi/src/bdk.udl | 2 ++ bdk-ffi/src/types.rs | 6 ++++++ bdk-ffi/src/wallet.rs | 49 +++++++++++++++++++++---------------------- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/bdk-ffi/src/bdk.udl b/bdk-ffi/src/bdk.udl index 5aa887b6..f7697beb 100644 --- a/bdk-ffi/src/bdk.udl +++ b/bdk-ffi/src/bdk.udl @@ -142,6 +142,8 @@ interface TxBuilder { TxBuilder drain_to(Script script); + TxBuilder enable_rbf(); + [Throws=BdkError] PartiallySignedTransaction finish([ByRef] Wallet wallet); }; diff --git a/bdk-ffi/src/types.rs b/bdk-ffi/src/types.rs index 52a1a4a3..b9aa9439 100644 --- a/bdk-ffi/src/types.rs +++ b/bdk-ffi/src/types.rs @@ -146,3 +146,9 @@ impl From for LocalUtxo { } } } + +#[derive(Clone, Debug)] +pub enum RbfValue { + Default, + Value(u32), +} diff --git a/bdk-ffi/src/wallet.rs b/bdk-ffi/src/wallet.rs index a372864d..97d364d1 100644 --- a/bdk-ffi/src/wallet.rs +++ b/bdk-ffi/src/wallet.rs @@ -1,19 +1,18 @@ use crate::bitcoin::{OutPoint, PartiallySignedTransaction, Transaction}; use crate::descriptor::Descriptor; -use crate::types::Balance; +use crate::types::{Balance, RbfValue}; use crate::types::ScriptAmount; use crate::Script; use crate::{AddressIndex, AddressInfo, Network}; -use std::collections::HashSet; use bdk::bitcoin::blockdata::script::ScriptBuf as BdkScriptBuf; -use bdk::bitcoin::OutPoint as BdkOutPoint; +use bdk::bitcoin::{OutPoint as BdkOutPoint, Sequence}; use bdk::wallet::Update as BdkUpdate; use bdk::{Error as BdkError, FeeRate}; use bdk::{SignOptions, Wallet as BdkWallet}; - use bdk::wallet::tx_builder::ChangeSpendPolicy; +use std::collections::HashSet; use std::sync::{Arc, Mutex, MutexGuard}; #[derive(Debug)] @@ -302,7 +301,7 @@ pub struct TxBuilder { pub(crate) fee_absolute: Option, pub(crate) drain_wallet: bool, pub(crate) drain_to: Option, - // pub(crate) rbf: Option, + pub(crate) rbf: Option, // pub(crate) data: Vec, } @@ -318,7 +317,7 @@ impl TxBuilder { fee_absolute: None, drain_wallet: false, drain_to: None, - // rbf: None, + rbf: None, // data: Vec::new(), } } @@ -453,15 +452,15 @@ impl TxBuilder { ..self.clone() }) } - // - // /// Enable signaling RBF. This will use the default `nsequence` value of `0xFFFFFFFD`. - // pub(crate) fn enable_rbf(&self) -> Arc { - // Arc::new(TxBuilder { - // rbf: Some(RbfValue::Default), - // ..self.clone() - // }) - // } - // + + /// Enable signaling RBF. This will use the default `nsequence` value of `0xFFFFFFFD`. + pub(crate) fn enable_rbf(&self) -> Arc { + Arc::new(TxBuilder { + rbf: Some(RbfValue::Default), + ..self.clone() + }) + } + // /// Enable signaling RBF with a specific nSequence value. This can cause conflicts if the wallet's descriptors contain an // /// "older" (OP_CSV) operator and the given `nsequence` is lower than the CSV value. If the `nsequence` is higher than `0xFFFFFFFD` // /// an error will be thrown, since it would not be a valid nSequence to signal RBF. @@ -517,16 +516,16 @@ impl TxBuilder { if let Some(script) = &self.drain_to { tx_builder.drain_to(script.clone()); } - // if let Some(rbf) = &self.rbf { - // match *rbf { - // RbfValue::Default => { - // tx_builder.enable_rbf(); - // } - // RbfValue::Value(nsequence) => { - // tx_builder.enable_rbf_with_sequence(Sequence(nsequence)); - // } - // } - // } + if let Some(rbf) = &self.rbf { + match *rbf { + RbfValue::Default => { + tx_builder.enable_rbf(); + } + RbfValue::Value(nsequence) => { + tx_builder.enable_rbf_with_sequence(Sequence(nsequence)); + } + } + } // if !&self.data.is_empty() { // tx_builder.add_data(self.data.as_slice()); // }