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); }; 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 {