Merge bitcoindevkit/bdk-ffi#140: Add RBF methods to TxBuilder

220835cffd9288fc6dbccd27551a3c9b25d74a95 Add RBF to TxBuilder (Sudarsan Balaji)
b3c93b0435934bc361de58c1e6008ddf0c26e019 Expose functions (Sudarsan Balaji)

Pull request description:

  Fix #133

  We need to create another `RbfValue` enum because the actual type is only visible within the crate in `bdk`.

ACKs for top commit:
  notmandatory:
    tACK 220835cffd9288fc6dbccd27551a3c9b25d74a95

Tree-SHA512: 648ea26a9742c8a395876f38c7299ff0dabb4ccad64e2f6a47d29ceecf44d9e54d845410fa68665e4d4d03d8eda1e51f680d0b89df307b003de49cf7b98e8701
This commit is contained in:
Steve Myers 2022-04-16 22:35:43 -07:00
commit 236360e8c4
No known key found for this signature in database
GPG Key ID: 8105A46B22C2D051
2 changed files with 44 additions and 0 deletions

View File

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

View File

@ -283,11 +283,18 @@ fn to_script_pubkey(address: &str) -> Result<Script, BdkError> {
.map_err(|e| BdkError::Generic(e.to_string()))
}
#[derive(Clone)]
enum RbfValue {
Default,
Value(u32),
}
struct TxBuilder {
recipients: Vec<(String, u64)>,
fee_rate: Option<f32>,
drain_wallet: bool,
drain_to: Option<String>,
rbf: Option<RbfValue>,
}
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<Self> {
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<Self> {
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 {