From b3c93b0435934bc361de58c1e6008ddf0c26e019 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Fri, 15 Apr 2022 21:04:04 +0100 Subject: [PATCH 1/2] Expose functions --- src/bdk.udl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bdk.udl b/src/bdk.udl index e185deb..00dbd8e 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -146,6 +146,8 @@ interface TxBuilder { TxBuilder fee_rate(float sat_per_vbyte); TxBuilder drain_wallet(); TxBuilder drain_to(string address); + TxBuilder enable_rbf(); + TxBuilder enable_rbf_with_sequence(u32 nsequence); [Throws=BdkError] PartiallySignedBitcoinTransaction build([ByRef] Wallet wallet); }; From 220835cffd9288fc6dbccd27551a3c9b25d74a95 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Fri, 15 Apr 2022 21:04:21 +0100 Subject: [PATCH 2/2] Add RBF to TxBuilder --- src/lib.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index bdfec3c..2e69c3c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -283,11 +283,18 @@ fn to_script_pubkey(address: &str) -> Result { .map_err(|e| BdkError::Generic(e.to_string())) } +#[derive(Clone)] +enum RbfValue { + Default, + Value(u32), +} + struct TxBuilder { recipients: Vec<(String, u64)>, fee_rate: Option, drain_wallet: bool, drain_to: Option, + rbf: Option, } impl TxBuilder { @@ -297,6 +304,7 @@ impl TxBuilder { fee_rate: None, drain_wallet: false, drain_to: None, + rbf: None, } } @@ -308,6 +316,7 @@ impl TxBuilder { fee_rate: self.fee_rate, drain_wallet: self.drain_wallet, drain_to: self.drain_to.clone(), + rbf: self.rbf.clone(), }) } @@ -317,6 +326,7 @@ impl TxBuilder { fee_rate: Some(sat_per_vb), drain_wallet: self.drain_wallet, drain_to: self.drain_to.clone(), + rbf: self.rbf.clone(), }) } @@ -326,6 +336,7 @@ impl TxBuilder { fee_rate: self.fee_rate, drain_wallet: true, drain_to: self.drain_to.clone(), + rbf: self.rbf.clone(), }) } @@ -335,6 +346,27 @@ impl TxBuilder { fee_rate: self.fee_rate, drain_wallet: self.drain_wallet, drain_to: Some(address), + rbf: self.rbf.clone(), + }) + } + + fn enable_rbf(&self) -> Arc { + Arc::new(TxBuilder { + recipients: self.recipients.to_vec(), + fee_rate: self.fee_rate, + drain_wallet: self.drain_wallet, + drain_to: self.drain_to.clone(), + rbf: Some(RbfValue::Default), + }) + } + + fn enable_rbf_with_sequence(&self, nsequence: u32) -> Arc { + Arc::new(TxBuilder { + recipients: self.recipients.to_vec(), + fee_rate: self.fee_rate, + drain_wallet: self.drain_wallet, + drain_to: self.drain_to.clone(), + rbf: Some(RbfValue::Value(nsequence)), }) } @@ -353,6 +385,16 @@ impl TxBuilder { if let Some(address) = &self.drain_to { tx_builder.drain_to(to_script_pubkey(address)?); } + if let Some(rbf) = &self.rbf { + match *rbf { + RbfValue::Default => { + tx_builder.enable_rbf(); + } + RbfValue::Value(nsequence) => { + tx_builder.enable_rbf_with_sequence(nsequence); + } + } + } tx_builder .finish() .map(|(psbt, _)| PartiallySignedBitcoinTransaction {