use core::ops::Sub;
use bdk_chain::ConfirmationTime;
-use bitcoin::blockdata::transaction::{OutPoint, TxOut};
+use bitcoin::blockdata::transaction::{OutPoint, Sequence, TxOut};
use bitcoin::{psbt, Weight};
use serde::{Deserialize, Serialize};
Foreign {
/// The location of the output.
outpoint: OutPoint,
+ /// The nSequence value to set for this input.
+ sequence: Option<Sequence>,
/// The information about the input we require to add it to a PSBT.
// Box it to stop the type being too big.
psbt_input: Box<psbt::Input>,
Utxo::Foreign {
outpoint,
psbt_input,
+ ..
} => {
if let Some(prev_tx) = &psbt_input.non_witness_utxo {
return &prev_tx.output[outpoint.vout as usize];
}
}
}
+
+ /// Get the sequence number if an explicit sequence number has to be set for this input.
+ pub fn sequence(&self) -> Option<Sequence> {
+ match self {
+ Utxo::Local(_) => None,
+ Utxo::Foreign { sequence, .. } => *sequence,
+ }
+ }
}
#[cfg(test)]
}
};
+ // The nSequence to be by default for inputs unless an explicit sequence is specified.
let n_sequence = match (params.rbf, requirements.csv) {
// No RBF or CSV but there's an nLockTime, so the nSequence cannot be final
(None, None) if lock_time != absolute::LockTime::ZERO => {
.map(|u| bitcoin::TxIn {
previous_output: u.outpoint(),
script_sig: ScriptBuf::default(),
- sequence: n_sequence,
+ sequence: u.sequence().unwrap_or(n_sequence),
witness: Witness::new(),
})
.collect();
satisfaction_weight,
utxo: Utxo::Foreign {
outpoint: txin.previous_output,
+ sequence: Some(txin.sequence),
psbt_input: Box::new(psbt::Input {
witness_utxo: Some(txout.clone()),
non_witness_utxo: Some(prev_tx.clone()),
}
}
Utxo::Foreign {
- psbt_input: foreign_psbt_input,
outpoint,
+ psbt_input: foreign_psbt_input,
+ ..
} => {
let is_taproot = foreign_psbt_input
.witness_utxo
outpoint: OutPoint,
psbt_input: psbt::Input,
satisfaction_weight: usize,
+ ) -> Result<&mut Self, AddForeignUtxoError> {
+ self.add_foreign_utxo_with_sequence(
+ outpoint,
+ psbt_input,
+ satisfaction_weight,
+ Sequence::MAX,
+ )
+ }
+
+ /// Same as [add_foreign_utxo](TxBuilder::add_foreign_utxo) but allows to set the nSequence value.
+ pub fn add_foreign_utxo_with_sequence(
+ &mut self,
+ outpoint: OutPoint,
+ psbt_input: psbt::Input,
+ satisfaction_weight: usize,
+ sequence: Sequence,
) -> Result<&mut Self, AddForeignUtxoError> {
if psbt_input.witness_utxo.is_none() {
match psbt_input.non_witness_utxo.as_ref() {
satisfaction_weight,
utxo: Utxo::Foreign {
outpoint,
+ sequence: Some(sequence),
psbt_input: Box::new(psbt_input),
},
});