Skip to content

Commit 7a8c07b

Browse files
committed
pset: correctly mask transaction input indices in Psbt::extract_tx
We have a convention that in memory, we don't have the pegin or witness flags on the input index for TxIn, but we *do* keep these around in the Psbt::Input map.
1 parent d41f4ef commit 7a8c07b

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

src/pset/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,8 +287,14 @@ impl PartiallySignedTransaction {
287287
let mut outputs = vec![];
288288

289289
for psetin in &self.inputs {
290+
let prev_index = if psetin.previous_output_index == 0xffff_ffff {
291+
// special-case coinbase inputs, which do not have flags
292+
psetin.previous_output_index
293+
} else {
294+
psetin.previous_output_index & !((1u32 << 30) | (1 << 31))
295+
};
290296
let txin = TxIn {
291-
previous_output: OutPoint::new(psetin.previous_txid, psetin.previous_output_index),
297+
previous_output: OutPoint::new(psetin.previous_txid, prev_index),
292298
is_pegin: psetin.is_pegin(),
293299
script_sig: psetin.final_script_sig.clone().unwrap_or_default(),
294300
sequence: psetin.sequence.unwrap_or(Sequence::MAX),
@@ -781,6 +787,7 @@ mod tests {
781787
use super::*;
782788
use crate::hex::{FromHex, ToHex};
783789

790+
#[track_caller]
784791
fn tx_pset_rtt(tx_hex: &str) {
785792
let tx: Transaction =
786793
encode::deserialize(&Vec::<u8>::from_hex(tx_hex).unwrap()[..]).unwrap();

0 commit comments

Comments
 (0)