bitcoin/blockdata/
transaction.rs

1// SPDX-License-Identifier: CC0-1.0
2
3//! Bitcoin transactions.
4//!
5//! A transaction describes a transfer of money. It consumes previously-unspent
6//! transaction outputs and produces new ones, satisfying the condition to spend
7//! the old outputs (typically a digital signature with a specific key must be
8//! provided) and defining the condition to spend the new ones. The use of digital
9//! signatures ensures that coins cannot be spent by unauthorized parties.
10//!
11//! This module provides the structures and functions needed to support transactions.
12//!
13
14use core::{cmp, fmt};
15use core::str::FromStr;
16
17use hashes::{sha256d, Hash};
18use internals::write_err;
19use io::{Read, Write};
20use units::parse::{self, ParseIntError};
21
22use super::Weight;
23use crate::blockdata::locktime::absolute::{self, Height, Time};
24use crate::blockdata::locktime::relative::{self, TimeOverflowError};
25use crate::blockdata::script::{Script, ScriptBuf};
26use crate::blockdata::witness::Witness;
27use crate::blockdata::FeeRate;
28use crate::consensus::{encode, Decodable, Encodable};
29use crate::error::{ContainsPrefixError, MissingPrefixError, PrefixedHexError, UnprefixedHexError};
30use crate::internal_macros::{impl_consensus_encoding, impl_hashencode};
31use crate::prelude::*;
32#[cfg(doc)]
33use crate::sighash::{EcdsaSighashType, TapSighashType};
34use crate::{Amount, SignedAmount, VarInt};
35
36#[rustfmt::skip]                // Keep public re-exports separate.
37#[cfg(feature = "bitcoinconsensus")]
38#[doc(inline)]
39pub use crate::consensus::validation::TxVerifyError;
40
41hashes::hash_newtype! {
42    /// A bitcoin transaction hash/transaction ID.
43    ///
44    /// For compatibility with the existing Bitcoin infrastructure and historical and current
45    /// versions of the Bitcoin Core software itself, this and other [`sha256d::Hash`] types, are
46    /// serialized in reverse byte order when converted to a hex string via [`std::fmt::Display`]
47    /// trait operations. See [`hashes::Hash::DISPLAY_BACKWARD`] for more details.
48    pub struct Txid(sha256d::Hash);
49
50    /// A bitcoin witness transaction ID.
51    pub struct Wtxid(sha256d::Hash);
52}
53impl_hashencode!(Txid);
54impl_hashencode!(Wtxid);
55
56/// The marker MUST be a 1-byte zero value: 0x00. (BIP-141)
57const SEGWIT_MARKER: u8 = 0x00;
58/// The flag MUST be a 1-byte non-zero value. Currently, 0x01 MUST be used. (BIP-141)
59const SEGWIT_FLAG: u8 = 0x01;
60
61/// A reference to a transaction output.
62///
63/// ### Bitcoin Core References
64///
65/// * [COutPoint definition](https://github.com/bitcoin/bitcoin/blob/345457b542b6a980ccfbc868af0970a6f91d1b82/src/primitives/transaction.h#L26)
66#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
67pub struct OutPoint {
68    /// The referenced transaction's txid.
69    pub txid: Txid,
70    /// The index of the referenced output in its transaction's vout.
71    pub vout: u32,
72}
73#[cfg(feature = "serde")]
74crate::serde_utils::serde_struct_human_string_impl!(OutPoint, "an OutPoint", txid, vout);
75
76impl OutPoint {
77    /// The number of bytes that an outpoint contributes to the size of a transaction.
78    const SIZE: usize = 32 + 4; // The serialized lengths of txid and vout.
79
80    /// Creates a new [`OutPoint`].
81    #[inline]
82    pub const fn new(txid: Txid, vout: u32) -> OutPoint { OutPoint { txid, vout } }
83
84    /// Creates a "null" `OutPoint`.
85    ///
86    /// This value is used for coinbase transactions because they don't have any previous outputs.
87    #[inline]
88    pub fn null() -> OutPoint { OutPoint { txid: Hash::all_zeros(), vout: u32::MAX } }
89
90    /// Checks if an `OutPoint` is "null".
91    ///
92    /// # Examples
93    ///
94    /// ```rust
95    /// use bitcoin::consensus::params;
96    /// use bitcoin::constants::genesis_block;
97    /// use bitcoin::Network;
98    ///
99    /// let block = genesis_block(&params::MAINNET);
100    /// let tx = &block.txdata[0];
101    ///
102    /// // Coinbase transactions don't have any previous output.
103    /// assert!(tx.input[0].previous_output.is_null());
104    /// ```
105    #[inline]
106    pub fn is_null(&self) -> bool { *self == OutPoint::null() }
107}
108
109impl Default for OutPoint {
110    fn default() -> Self { OutPoint::null() }
111}
112
113impl fmt::Display for OutPoint {
114    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
115        write!(f, "{}:{}", self.txid, self.vout)
116    }
117}
118
119/// An error in parsing an OutPoint.
120#[derive(Debug, Clone, PartialEq, Eq)]
121#[non_exhaustive]
122pub enum ParseOutPointError {
123    /// Error in TXID part.
124    Txid(hex::HexToArrayError),
125    /// Error in vout part.
126    Vout(crate::error::ParseIntError),
127    /// Error in general format.
128    Format,
129    /// Size exceeds max.
130    TooLong,
131    /// Vout part is not strictly numeric without leading zeroes.
132    VoutNotCanonical,
133}
134
135internals::impl_from_infallible!(ParseOutPointError);
136
137impl fmt::Display for ParseOutPointError {
138    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
139        use ParseOutPointError::*;
140
141        match *self {
142            Txid(ref e) => write_err!(f, "error parsing TXID"; e),
143            Vout(ref e) => write_err!(f, "error parsing vout"; e),
144            Format => write!(f, "OutPoint not in <txid>:<vout> format"),
145            TooLong => write!(f, "vout should be at most 10 digits"),
146            VoutNotCanonical => write!(f, "no leading zeroes or + allowed in vout part"),
147        }
148    }
149}
150
151#[cfg(feature = "std")]
152impl std::error::Error for ParseOutPointError {
153    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
154        use ParseOutPointError::*;
155
156        match self {
157            Txid(e) => Some(e),
158            Vout(e) => Some(e),
159            Format | TooLong | VoutNotCanonical => None,
160        }
161    }
162}
163
164/// Parses a string-encoded transaction index (vout).
165///
166/// Does not permit leading zeroes or non-digit characters.
167fn parse_vout(s: &str) -> Result<u32, ParseOutPointError> {
168    if s.len() > 1 {
169        let first = s.chars().next().unwrap();
170        if first == '0' || first == '+' {
171            return Err(ParseOutPointError::VoutNotCanonical);
172        }
173    }
174    parse::int(s).map_err(ParseOutPointError::Vout)
175}
176
177impl core::str::FromStr for OutPoint {
178    type Err = ParseOutPointError;
179
180    fn from_str(s: &str) -> Result<Self, Self::Err> {
181        if s.len() > 75 {
182            // 64 + 1 + 10
183            return Err(ParseOutPointError::TooLong);
184        }
185        let find = s.find(':');
186        if find.is_none() || find != s.rfind(':') {
187            return Err(ParseOutPointError::Format);
188        }
189        let colon = find.unwrap();
190        if colon == 0 || colon == s.len() - 1 {
191            return Err(ParseOutPointError::Format);
192        }
193        Ok(OutPoint {
194            txid: s[..colon].parse().map_err(ParseOutPointError::Txid)?,
195            vout: parse_vout(&s[colon + 1..])?,
196        })
197    }
198}
199
200/// Bitcoin transaction input.
201///
202/// It contains the location of the previous transaction's output,
203/// that it spends and set of scripts that satisfy its spending
204/// conditions.
205///
206/// ### Bitcoin Core References
207///
208/// * [CTxIn definition](https://github.com/bitcoin/bitcoin/blob/345457b542b6a980ccfbc868af0970a6f91d1b82/src/primitives/transaction.h#L65)
209#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
210#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
211#[cfg_attr(feature = "serde", serde(crate = "actual_serde"))]
212pub struct TxIn {
213    /// The reference to the previous output that is being used as an input.
214    pub previous_output: OutPoint,
215    /// The script which pushes values on the stack which will cause
216    /// the referenced output's script to be accepted.
217    pub script_sig: ScriptBuf,
218    /// The sequence number, which suggests to miners which of two
219    /// conflicting transactions should be preferred, or 0xFFFFFFFF
220    /// to ignore this feature. This is generally never used since
221    /// the miner behavior cannot be enforced.
222    pub sequence: Sequence,
223    /// Witness data: an array of byte-arrays.
224    /// Note that this field is *not* (de)serialized with the rest of the TxIn in
225    /// Encodable/Decodable, as it is (de)serialized at the end of the full
226    /// Transaction. It *is* (de)serialized with the rest of the TxIn in other
227    /// (de)serialization routines.
228    pub witness: Witness,
229}
230
231impl TxIn {
232    /// Returns the input base weight.
233    ///
234    /// Base weight excludes the witness and script.
235    const BASE_WEIGHT: Weight =
236        Weight::from_vb_unwrap(OutPoint::SIZE as u64 + Sequence::SIZE as u64);
237
238    /// Returns true if this input enables the [`absolute::LockTime`] (aka `nLockTime`) of its
239    /// [`Transaction`].
240    ///
241    /// `nLockTime` is enabled if *any* input enables it. See [`Transaction::is_lock_time_enabled`]
242    ///  to check the overall state. If none of the inputs enables it, the lock time value is simply
243    ///  ignored. If this returns false and OP_CHECKLOCKTIMEVERIFY is used in the redeem script with
244    ///  this input then the script execution will fail [BIP-0065].
245    ///
246    /// [BIP-65](https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki)
247    pub fn enables_lock_time(&self) -> bool { self.sequence != Sequence::MAX }
248
249    /// The weight of the TxIn when it's included in a legacy transaction (i.e., a transaction
250    /// having only legacy inputs).
251    ///
252    /// The witness weight is ignored here even when the witness is non-empty.
253    /// If you want the witness to be taken into account, use `TxIn::segwit_weight` instead.
254    ///
255    /// Keep in mind that when adding a TxIn to a transaction, the total weight of the transaction
256    /// might increase more than `TxIn::legacy_weight`. This happens when the new input added causes
257    /// the input length `VarInt` to increase its encoding length.
258    pub fn legacy_weight(&self) -> Weight {
259        Weight::from_non_witness_data_size(self.base_size() as u64)
260    }
261
262    /// The weight of the TxIn when it's included in a segwit transaction (i.e., a transaction
263    /// having at least one segwit input).
264    ///
265    /// This always takes into account the witness, even when empty, in which
266    /// case 1WU for the witness length varint (`00`) is included.
267    ///
268    /// Keep in mind that when adding a TxIn to a transaction, the total weight of the transaction
269    /// might increase more than `TxIn::segwit_weight`. This happens when:
270    /// - the new input added causes the input length `VarInt` to increase its encoding length
271    /// - the new input is the first segwit input added - this will add an additional 2WU to the
272    ///   transaction weight to take into account the segwit marker
273    pub fn segwit_weight(&self) -> Weight {
274        Weight::from_non_witness_data_size(self.base_size() as u64)
275            + Weight::from_witness_data_size(self.witness.size() as u64)
276    }
277
278    /// Returns the base size of this input.
279    ///
280    /// Base size excludes the witness data (see [`Self::total_size`]).
281    pub fn base_size(&self) -> usize {
282        let mut size = OutPoint::SIZE;
283
284        size += VarInt::from(self.script_sig.len()).size();
285        size += self.script_sig.len();
286
287        size + Sequence::SIZE
288    }
289
290    /// Returns the total number of bytes that this input contributes to a transaction.
291    ///
292    /// Total size includes the witness data (for base size see [`Self::base_size`]).
293    pub fn total_size(&self) -> usize { self.base_size() + self.witness.size() }
294}
295
296impl Default for TxIn {
297    fn default() -> TxIn {
298        TxIn {
299            previous_output: OutPoint::default(),
300            script_sig: ScriptBuf::new(),
301            sequence: Sequence::MAX,
302            witness: Witness::default(),
303        }
304    }
305}
306
307/// Bitcoin transaction input sequence number.
308///
309/// The sequence field is used for:
310/// - Indicating whether absolute lock-time (specified in `lock_time` field of [`Transaction`])
311///   is enabled.
312/// - Indicating and encoding [BIP-68] relative lock-times.
313/// - Indicating whether a transaction opts-in to [BIP-125] replace-by-fee.
314///
315/// Note that transactions spending an output with `OP_CHECKLOCKTIMEVERIFY`MUST NOT use
316/// `Sequence::MAX` for the corresponding input. [BIP-65]
317///
318/// [BIP-65]: <https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki>
319/// [BIP-68]: <https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki>
320/// [BIP-125]: <https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki>
321#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
322#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
323#[cfg_attr(feature = "serde", serde(crate = "actual_serde"))]
324pub struct Sequence(pub u32);
325
326impl Sequence {
327    /// The maximum allowable sequence number.
328    ///
329    /// This sequence number disables absolute lock time and replace-by-fee.
330    pub const MAX: Self = Sequence(0xFFFFFFFF);
331    /// Zero value sequence.
332    ///
333    /// This sequence number enables replace-by-fee and absolute lock time.
334    pub const ZERO: Self = Sequence(0);
335    /// The sequence number that enables absolute lock time but disables replace-by-fee
336    /// and relative lock time.
337    pub const ENABLE_LOCKTIME_NO_RBF: Self = Sequence::MIN_NO_RBF;
338    /// The sequence number that enables replace-by-fee and absolute lock time but
339    /// disables relative lock time.
340    pub const ENABLE_RBF_NO_LOCKTIME: Self = Sequence(0xFFFFFFFD);
341
342    /// The number of bytes that a sequence number contributes to the size of a transaction.
343    const SIZE: usize = 4; // Serialized length of a u32.
344
345    /// The lowest sequence number that does not opt-in for replace-by-fee.
346    ///
347    /// A transaction is considered to have opted in to replacement of itself
348    /// if any of it's inputs have a `Sequence` number less than this value
349    /// (Explicit Signalling [BIP-125]).
350    ///
351    /// [BIP-125]: <https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki]>
352    const MIN_NO_RBF: Self = Sequence(0xFFFFFFFE);
353    /// BIP-68 relative lock time disable flag mask.
354    const LOCK_TIME_DISABLE_FLAG_MASK: u32 = 0x80000000;
355    /// BIP-68 relative lock time type flag mask.
356    const LOCK_TYPE_MASK: u32 = 0x00400000;
357
358    /// Returns `true` if the sequence number enables absolute lock-time ([`Transaction::lock_time`]).
359    #[inline]
360    pub fn enables_absolute_lock_time(&self) -> bool { *self != Sequence::MAX }
361
362    /// Returns `true` if the sequence number indicates that the transaction is finalized.
363    ///
364    /// Instead of this method please consider using `!enables_absolute_lock_time` because it
365    /// is equivalent and improves readability for those not steeped in Bitcoin folklore.
366    ///
367    /// ## Historical note
368    ///
369    /// The term 'final' is an archaic Bitcoin term, it may have come about because the sequence
370    /// number in the original Bitcoin code was intended to be incremented in order to replace a
371    /// transaction, so once the sequence number got to `u64::MAX` it could no longer be increased,
372    /// hence it was 'final'.
373    ///
374    ///
375    /// Some other references to the term:
376    /// - `CTxIn::SEQUENCE_FINAL` in the Bitcoin Core code.
377    /// - [BIP-112]: "BIP 68 prevents a non-final transaction from being selected for inclusion in a
378    ///   block until the corresponding input has reached the specified age"
379    ///
380    /// [BIP-112]: <https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki>
381    #[inline]
382    pub fn is_final(&self) -> bool { !self.enables_absolute_lock_time() }
383
384    /// Returns true if the transaction opted-in to BIP125 replace-by-fee.
385    ///
386    /// Replace by fee is signaled by the sequence being less than 0xfffffffe which is checked by
387    /// this method. Note, this is the highest "non-final" value (see [`Sequence::is_final`]).
388    #[inline]
389    pub fn is_rbf(&self) -> bool { *self < Sequence::MIN_NO_RBF }
390
391    /// Returns `true` if the sequence has a relative lock-time.
392    #[inline]
393    pub fn is_relative_lock_time(&self) -> bool {
394        self.0 & Sequence::LOCK_TIME_DISABLE_FLAG_MASK == 0
395    }
396
397    /// Returns `true` if the sequence number encodes a block based relative lock-time.
398    #[inline]
399    pub fn is_height_locked(&self) -> bool {
400        self.is_relative_lock_time() & (self.0 & Sequence::LOCK_TYPE_MASK == 0)
401    }
402
403    /// Returns `true` if the sequence number encodes a time interval based relative lock-time.
404    #[inline]
405    pub fn is_time_locked(&self) -> bool {
406        self.is_relative_lock_time() & (self.0 & Sequence::LOCK_TYPE_MASK > 0)
407    }
408
409    /// Creates a `Sequence` from an prefixed hex string.
410    pub fn from_hex(s: &str) -> Result<Self, PrefixedHexError> {
411        let stripped = if let Some(stripped) = s.strip_prefix("0x") {
412            stripped
413        } else if let Some(stripped) = s.strip_prefix("0X") {
414            stripped
415        } else {
416            return Err(MissingPrefixError::new(s).into());
417        };
418
419        let sequence = parse::hex_u32(stripped)?;
420        Ok(Self::from_consensus(sequence))
421    }
422
423    /// Creates a `Sequence` from an unprefixed hex string.
424    pub fn from_unprefixed_hex(s: &str) -> Result<Self, UnprefixedHexError> {
425        if s.starts_with("0x") || s.starts_with("0X") {
426            return Err(ContainsPrefixError::new(s).into());
427        }
428        let lock_time = parse::hex_u32(s)?;
429        Ok(Self::from_consensus(lock_time))
430    }
431
432    /// Creates a relative lock-time using block height.
433    #[inline]
434    pub fn from_height(height: u16) -> Self { Sequence(u32::from(height)) }
435
436    /// Creates a relative lock-time using time intervals where each interval is equivalent
437    /// to 512 seconds.
438    ///
439    /// Encoding finer granularity of time for relative lock-times is not supported in Bitcoin
440    #[inline]
441    pub fn from_512_second_intervals(intervals: u16) -> Self {
442        Sequence(u32::from(intervals) | Sequence::LOCK_TYPE_MASK)
443    }
444
445    /// Creates a relative lock-time from seconds, converting the seconds into 512 second
446    /// interval with floor division.
447    ///
448    /// Will return an error if the input cannot be encoded in 16 bits.
449    #[inline]
450    pub fn from_seconds_floor(seconds: u32) -> Result<Self, TimeOverflowError> {
451        if let Ok(interval) = u16::try_from(seconds / 512) {
452            Ok(Sequence::from_512_second_intervals(interval))
453        } else {
454            Err(TimeOverflowError::new(seconds))
455        }
456    }
457
458    /// Creates a relative lock-time from seconds, converting the seconds into 512 second
459    /// interval with ceiling division.
460    ///
461    /// Will return an error if the input cannot be encoded in 16 bits.
462    #[inline]
463    pub fn from_seconds_ceil(seconds: u32) -> Result<Self, TimeOverflowError> {
464        if let Ok(interval) = u16::try_from((seconds + 511) / 512) {
465            Ok(Sequence::from_512_second_intervals(interval))
466        } else {
467            Err(TimeOverflowError::new(seconds))
468        }
469    }
470
471    /// Creates a sequence from a u32 value.
472    #[inline]
473    pub fn from_consensus(n: u32) -> Self { Sequence(n) }
474
475    /// Returns the inner 32bit integer value of Sequence.
476    #[inline]
477    pub fn to_consensus_u32(self) -> u32 { self.0 }
478
479    /// Creates a [`relative::LockTime`] from this [`Sequence`] number.
480    #[inline]
481    pub fn to_relative_lock_time(&self) -> Option<relative::LockTime> {
482        use crate::locktime::relative::{Height, LockTime, Time};
483
484        if !self.is_relative_lock_time() {
485            return None;
486        }
487
488        let lock_value = self.low_u16();
489
490        if self.is_time_locked() {
491            Some(LockTime::from(Time::from_512_second_intervals(lock_value)))
492        } else {
493            Some(LockTime::from(Height::from(lock_value)))
494        }
495    }
496
497    /// Returns the low 16 bits from sequence number.
498    ///
499    /// BIP-68 only uses the low 16 bits for relative lock value.
500    fn low_u16(&self) -> u16 { self.0 as u16 }
501}
502
503impl Default for Sequence {
504    /// The default value of sequence is 0xffffffff.
505    fn default() -> Self { Sequence::MAX }
506}
507
508impl From<Sequence> for u32 {
509    fn from(sequence: Sequence) -> u32 { sequence.0 }
510}
511
512impl fmt::Display for Sequence {
513    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::Display::fmt(&self.0, f) }
514}
515
516impl fmt::LowerHex for Sequence {
517    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::LowerHex::fmt(&self.0, f) }
518}
519
520impl fmt::UpperHex for Sequence {
521    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::UpperHex::fmt(&self.0, f) }
522}
523
524impl fmt::Debug for Sequence {
525    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
526        // 10 because its 8 digits + 2 for the '0x'
527        write!(f, "Sequence({:#010x})", self.0)
528    }
529}
530
531impl FromStr for Sequence {
532    type Err = ParseIntError;
533
534    fn from_str(s: &str) -> Result<Self, Self::Err> {
535        parse::int::<u32, &str>(s).map(Sequence::from_consensus)
536    }
537}
538
539impl TryFrom<&str> for Sequence {
540    type Error = ParseIntError;
541
542    fn try_from(s: &str) -> Result<Self, Self::Error> {
543        Sequence::from_str(s)
544    }
545}
546
547impl TryFrom<String> for Sequence {
548    type Error = ParseIntError;
549
550    fn try_from(s: String) -> Result<Self, Self::Error> {
551        Sequence::from_str(&s)
552    }
553}
554
555impl TryFrom<Box<str>> for Sequence {
556    type Error = ParseIntError;
557
558    fn try_from(s: Box<str>) -> Result<Self, Self::Error> {
559        Sequence::from_str(&s)
560    }
561}
562
563/// Bitcoin transaction output.
564///
565/// Defines new coins to be created as a result of the transaction,
566/// along with spending conditions ("script", aka "output script"),
567/// which an input spending it must satisfy.
568///
569/// An output that is not yet spent by an input is called Unspent Transaction Output ("UTXO").
570///
571/// ### Bitcoin Core References
572///
573/// * [CTxOut definition](https://github.com/bitcoin/bitcoin/blob/345457b542b6a980ccfbc868af0970a6f91d1b82/src/primitives/transaction.h#L148)
574#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
575#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
576#[cfg_attr(feature = "serde", serde(crate = "actual_serde"))]
577pub struct TxOut {
578    /// The value of the output, in satoshis.
579    pub value: Amount,
580    /// The script which must be satisfied for the output to be spent.
581    pub script_pubkey: ScriptBuf,
582}
583
584impl TxOut {
585    /// This is used as a "null txout" in consensus signing code.
586    pub const NULL: Self =
587        TxOut { value: Amount::from_sat(0xffffffffffffffff), script_pubkey: ScriptBuf::new() };
588
589    /// The weight of this output.
590    ///
591    /// Keep in mind that when adding a [`TxOut`] to a [`Transaction`] the total weight of the
592    /// transaction might increase more than `TxOut::weight`. This happens when the new output added
593    /// causes the output length `VarInt` to increase its encoding length.
594    ///
595    /// # Panics
596    ///
597    /// If output size * 4 overflows, this should never happen under normal conditions. Use
598    /// `Weght::from_vb_checked(self.size() as u64)` if you are concerned.
599    pub fn weight(&self) -> Weight {
600        // Size is equivalent to virtual size since all bytes of a TxOut are non-witness bytes.
601        Weight::from_vb(self.size() as u64).expect("should never happen under normal conditions")
602    }
603
604    /// Returns the total number of bytes that this output contributes to a transaction.
605    ///
606    /// There is no difference between base size vs total size for outputs.
607    pub fn size(&self) -> usize { size_from_script_pubkey(&self.script_pubkey) }
608
609    /// Creates a `TxOut` with given script and the smallest possible `value` that is **not** dust
610    /// per current Core policy.
611    ///
612    /// Dust depends on the -dustrelayfee value of the Bitcoin Core node you are broadcasting to.
613    /// This function uses the default value of 0.00003 BTC/kB (3 sat/vByte).
614    ///
615    /// To use a custom value, use [`minimal_non_dust_custom`].
616    ///
617    /// [`minimal_non_dust_custom`]: TxOut::minimal_non_dust_custom
618    pub fn minimal_non_dust(script_pubkey: ScriptBuf) -> Self {
619        TxOut { value: script_pubkey.minimal_non_dust(), script_pubkey }
620    }
621
622    /// Creates a `TxOut` with given script and the smallest possible `value` that is **not** dust
623    /// per current Core policy.
624    ///
625    /// Dust depends on the -dustrelayfee value of the Bitcoin Core node you are broadcasting to.
626    /// This function lets you set the fee rate used in dust calculation.
627    ///
628    /// The current default value in Bitcoin Core (as of v26) is 3 sat/vByte.
629    ///
630    /// To use the default Bitcoin Core value, use [`minimal_non_dust`].
631    ///
632    /// [`minimal_non_dust`]: TxOut::minimal_non_dust
633    pub fn minimal_non_dust_custom(script_pubkey: ScriptBuf, dust_relay_fee: FeeRate) -> Self {
634        TxOut { value: script_pubkey.minimal_non_dust_custom(dust_relay_fee), script_pubkey }
635    }
636}
637
638/// Returns the total number of bytes that this script pubkey would contribute to a transaction.
639fn size_from_script_pubkey(script_pubkey: &Script) -> usize {
640    let len = script_pubkey.len();
641    Amount::SIZE + VarInt::from(len).size() + len
642}
643
644/// Bitcoin transaction.
645///
646/// An authenticated movement of coins.
647///
648/// See [Bitcoin Wiki: Transaction][wiki-transaction] for more information.
649///
650/// [wiki-transaction]: https://en.bitcoin.it/wiki/Transaction
651///
652/// ### Bitcoin Core References
653///
654/// * [CTtransaction definition](https://github.com/bitcoin/bitcoin/blob/345457b542b6a980ccfbc868af0970a6f91d1b82/src/primitives/transaction.h#L279)
655///
656/// ### Serialization notes
657///
658/// If any inputs have nonempty witnesses, the entire transaction is serialized
659/// in the post-BIP141 Segwit format which includes a list of witnesses. If all
660/// inputs have empty witnesses, the transaction is serialized in the pre-BIP141
661/// format.
662///
663/// There is one major exception to this: to avoid deserialization ambiguity,
664/// if the transaction has no inputs, it is serialized in the BIP141 style. Be
665/// aware that this differs from the transaction format in PSBT, which _never_
666/// uses BIP141. (Ordinarily there is no conflict, since in PSBT transactions
667/// are always unsigned and therefore their inputs have empty witnesses.)
668///
669/// The specific ambiguity is that Segwit uses the flag bytes `0001` where an old
670/// serializer would read the number of transaction inputs. The old serializer
671/// would interpret this as "no inputs, one output", which means the transaction
672/// is invalid, and simply reject it. Segwit further specifies that this encoding
673/// should *only* be used when some input has a nonempty witness; that is,
674/// witness-less transactions should be encoded in the traditional format.
675///
676/// However, in protocols where transactions may legitimately have 0 inputs, e.g.
677/// when parties are cooperatively funding a transaction, the "00 means Segwit"
678/// heuristic does not work. Since Segwit requires such a transaction be encoded
679/// in the original transaction format (since it has no inputs and therefore
680/// no input witnesses), a traditionally encoded transaction may have the `0001`
681/// Segwit flag in it, which confuses most Segwit parsers including the one in
682/// Bitcoin Core.
683///
684/// We therefore deviate from the spec by always using the Segwit witness encoding
685/// for 0-input transactions, which results in unambiguously parseable transactions.
686///
687/// ### A note on ordering
688///
689/// This type implements `Ord`, even though it contains a locktime, which is not
690/// itself `Ord`. This was done to simplify applications that may need to hold
691/// transactions inside a sorted container. We have ordered the locktimes based
692/// on their representation as a `u32`, which is not a semantically meaningful
693/// order, and therefore the ordering on `Transaction` itself is not semantically
694/// meaningful either.
695///
696/// The ordering is, however, consistent with the ordering present in this library
697/// before this change, so users should not notice any breakage (here) when
698/// transitioning from 0.29 to 0.30.
699#[derive(Clone, PartialEq, Eq, Debug, Hash)]
700#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
701#[cfg_attr(feature = "serde", serde(crate = "actual_serde"))]
702pub struct Transaction {
703    /// The protocol version, is currently expected to be 1 or 2 (BIP 68).
704    pub version: Version,
705    /// Block height or timestamp. Transaction cannot be included in a block until this height/time.
706    ///
707    /// ### Relevant BIPs
708    ///
709    /// * [BIP-65 OP_CHECKLOCKTIMEVERIFY](https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki)
710    /// * [BIP-113 Median time-past as endpoint for lock-time calculations](https://github.com/bitcoin/bips/blob/master/bip-0113.mediawiki)
711    pub lock_time: absolute::LockTime,
712    /// List of transaction inputs.
713    pub input: Vec<TxIn>,
714    /// List of transaction outputs.
715    pub output: Vec<TxOut>,
716}
717
718impl cmp::PartialOrd for Transaction {
719    fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> { Some(self.cmp(other)) }
720}
721impl cmp::Ord for Transaction {
722    fn cmp(&self, other: &Self) -> cmp::Ordering {
723        self.version
724            .cmp(&other.version)
725            .then(self.lock_time.to_consensus_u32().cmp(&other.lock_time.to_consensus_u32()))
726            .then(self.input.cmp(&other.input))
727            .then(self.output.cmp(&other.output))
728    }
729}
730
731impl Transaction {
732    // https://github.com/bitcoin/bitcoin/blob/44b05bf3fef2468783dcebf651654fdd30717e7e/src/policy/policy.h#L27
733    /// Maximum transaction weight for Bitcoin Core 25.0.
734    pub const MAX_STANDARD_WEIGHT: Weight = Weight::from_wu(400_000);
735
736    /// Computes a "normalized TXID" which does not include any signatures.
737    ///
738    /// This method is deprecated.  Use `compute_ntxid` instead.
739    #[deprecated(
740        since = "0.31.0",
741        note = "ntxid has been renamed to compute_ntxid to note that it's computationally expensive.  use compute_ntxid() instead."
742    )]
743    pub fn ntxid(&self) -> sha256d::Hash { self.compute_ntxid() }
744
745    /// Computes a "normalized TXID" which does not include any signatures.
746    ///
747    /// This gives a way to identify a transaction that is "the same" as
748    /// another in the sense of having same inputs and outputs.
749    #[doc(alias = "ntxid")]
750    pub fn compute_ntxid(&self) -> sha256d::Hash {
751        let cloned_tx = Transaction {
752            version: self.version,
753            lock_time: self.lock_time,
754            input: self
755                .input
756                .iter()
757                .map(|txin| TxIn {
758                    script_sig: ScriptBuf::new(),
759                    witness: Witness::default(),
760                    ..*txin
761                })
762                .collect(),
763            output: self.output.clone(),
764        };
765        cloned_tx.compute_txid().into()
766    }
767
768    /// Computes the [`Txid`].
769    ///
770    /// This method is deprecated.  Use `compute_txid` instead.
771    #[deprecated(
772        since = "0.31.0",
773        note = "txid has been renamed to compute_txid to note that it's computationally expensive.  use compute_txid() instead."
774    )]
775    pub fn txid(&self) -> Txid { self.compute_txid() }
776
777    /// Computes the [`Txid`].
778    ///
779    /// Hashes the transaction **excluding** the segwit data (i.e. the marker, flag bytes, and the
780    /// witness fields themselves). For non-segwit transactions which do not have any segwit data,
781    /// this will be equal to [`Transaction::compute_wtxid()`].
782    #[doc(alias = "txid")]
783    pub fn compute_txid(&self) -> Txid {
784        let mut enc = Txid::engine();
785        self.version.consensus_encode(&mut enc).expect("engines don't error");
786        self.input.consensus_encode(&mut enc).expect("engines don't error");
787        self.output.consensus_encode(&mut enc).expect("engines don't error");
788        self.lock_time.consensus_encode(&mut enc).expect("engines don't error");
789        Txid::from_engine(enc)
790    }
791
792    /// Computes the segwit version of the transaction id.
793    ///
794    /// This method is deprecated.  Use `compute_wtxid` instead.
795    #[deprecated(
796        since = "0.31.0",
797        note = "wtxid has been renamed to compute_wtxid to note that it's computationally expensive.  use compute_wtxid() instead."
798    )]
799    pub fn wtxid(&self) -> Wtxid { self.compute_wtxid() }
800
801    /// Computes the segwit version of the transaction id.
802    ///
803    /// Hashes the transaction **including** all segwit data (i.e. the marker, flag bytes, and the
804    /// witness fields themselves). For non-segwit transactions which do not have any segwit data,
805    /// this will be equal to [`Transaction::txid()`].
806    #[doc(alias = "wtxid")]
807    pub fn compute_wtxid(&self) -> Wtxid {
808        let mut enc = Wtxid::engine();
809        self.consensus_encode(&mut enc).expect("engines don't error");
810        Wtxid::from_engine(enc)
811    }
812
813    /// Returns the weight of this transaction, as defined by BIP-141.
814    ///
815    /// > Transaction weight is defined as Base transaction size * 3 + Total transaction size (ie.
816    /// > the same method as calculating Block weight from Base size and Total size).
817    ///
818    /// For transactions with an empty witness, this is simply the consensus-serialized size times
819    /// four. For transactions with a witness, this is the non-witness consensus-serialized size
820    /// multiplied by three plus the with-witness consensus-serialized size.
821    ///
822    /// For transactions with no inputs, this function will return a value 2 less than the actual
823    /// weight of the serialized transaction. The reason is that zero-input transactions, post-segwit,
824    /// cannot be unambiguously serialized; we make a choice that adds two extra bytes. For more
825    /// details see [BIP 141](https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki)
826    /// which uses a "input count" of `0x00` as a `marker` for a Segwit-encoded transaction.
827    ///
828    /// If you need to use 0-input transactions, we strongly recommend you do so using the PSBT
829    /// API. The unsigned transaction encoded within PSBT is always a non-segwit transaction
830    /// and can therefore avoid this ambiguity.
831    #[inline]
832    pub fn weight(&self) -> Weight {
833        // This is the exact definition of a weight unit, as defined by BIP-141 (quote above).
834        let wu = self.base_size() * 3 + self.total_size();
835        Weight::from_wu_usize(wu)
836    }
837
838    /// Returns the base transaction size.
839    ///
840    /// > Base transaction size is the size of the transaction serialised with the witness data stripped.
841    pub fn base_size(&self) -> usize {
842        let mut size: usize = 4; // Serialized length of a u32 for the version number.
843
844        size += VarInt::from(self.input.len()).size();
845        size += self.input.iter().map(|input| input.base_size()).sum::<usize>();
846
847        size += VarInt::from(self.output.len()).size();
848        size += self.output.iter().map(|output| output.size()).sum::<usize>();
849
850        size + absolute::LockTime::SIZE
851    }
852
853    /// Returns the total transaction size.
854    ///
855    /// > Total transaction size is the transaction size in bytes serialized as described in BIP144,
856    /// > including base data and witness data.
857    #[inline]
858    pub fn total_size(&self) -> usize {
859        let mut size: usize = 4; // Serialized length of a u32 for the version number.
860        let uses_segwit = self.uses_segwit_serialization();
861
862        if uses_segwit {
863            size += 2; // 1 byte for the marker and 1 for the flag.
864        }
865
866        size += VarInt::from(self.input.len()).size();
867        size += self
868            .input
869            .iter()
870            .map(|input| if uses_segwit { input.total_size() } else { input.base_size() })
871            .sum::<usize>();
872
873        size += VarInt::from(self.output.len()).size();
874        size += self.output.iter().map(|output| output.size()).sum::<usize>();
875
876        size + absolute::LockTime::SIZE
877    }
878
879    /// Returns the "virtual size" (vsize) of this transaction.
880    ///
881    /// Will be `ceil(weight / 4.0)`. Note this implements the virtual size as per [`BIP141`], which
882    /// is different to what is implemented in Bitcoin Core. The computation should be the same for
883    /// any remotely sane transaction, and a standardness-rule-correct version is available in the
884    /// [`policy`] module.
885    ///
886    /// > Virtual transaction size is defined as Transaction weight / 4 (rounded up to the next integer).
887    ///
888    /// [`BIP141`]: https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki
889    /// [`policy`]: ../../policy/index.html
890    #[inline]
891    pub fn vsize(&self) -> usize {
892        // No overflow because it's computed from data in memory
893        self.weight().to_vbytes_ceil() as usize
894    }
895
896    /// Checks if this is a coinbase transaction.
897    ///
898    /// The first transaction in the block distributes the mining reward and is called the coinbase
899    /// transaction. It is impossible to check if the transaction is first in the block, so this
900    /// function checks the structure of the transaction instead - the previous output must be
901    /// all-zeros (creates satoshis "out of thin air").
902    #[doc(alias = "is_coin_base")] // method previously had this name
903    pub fn is_coinbase(&self) -> bool {
904        self.input.len() == 1 && self.input[0].previous_output.is_null()
905    }
906
907    /// Returns `true` if the transaction itself opted in to be BIP-125-replaceable (RBF).
908    ///
909    /// # Warning
910    ///
911    /// **Incorrectly relying on RBF may lead to monetary loss!**
912    ///
913    /// This **does not** cover the case where a transaction becomes replaceable due to ancestors
914    /// being RBF. Please note that transactions **may be replaced** even if they **do not** include
915    /// the RBF signal: <https://bitcoinops.org/en/newsletters/2022/10/19/#transaction-replacement-option>.
916    pub fn is_explicitly_rbf(&self) -> bool {
917        self.input.iter().any(|input| input.sequence.is_rbf())
918    }
919
920    /// Returns true if this [`Transaction`]'s absolute timelock is satisfied at `height`/`time`.
921    ///
922    /// # Returns
923    ///
924    /// By definition if the lock time is not enabled the transaction's absolute timelock is
925    /// considered to be satisfied i.e., there are no timelock constraints restricting this
926    /// transaction from being mined immediately.
927    pub fn is_absolute_timelock_satisfied(&self, height: Height, time: Time) -> bool {
928        if !self.is_lock_time_enabled() {
929            return true;
930        }
931        self.lock_time.is_satisfied_by(height, time)
932    }
933
934    /// Returns `true` if this transactions nLockTime is enabled ([BIP-65]).
935    ///
936    /// [BIP-65]: https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki
937    pub fn is_lock_time_enabled(&self) -> bool { self.input.iter().any(|i| i.enables_lock_time()) }
938
939    /// Returns an iterator over lengths of `script_pubkey`s in the outputs.
940    ///
941    /// This is useful in combination with [`predict_weight`] if you have the transaction already
942    /// constructed with a dummy value in the fee output which you'll adjust after calculating the
943    /// weight.
944    pub fn script_pubkey_lens(&self) -> impl Iterator<Item = usize> + '_ {
945        self.output.iter().map(|txout| txout.script_pubkey.len())
946    }
947
948    /// Counts the total number of sigops.
949    ///
950    /// This value is for pre-taproot transactions only.
951    ///
952    /// > In taproot, a different mechanism is used. Instead of having a global per-block limit,
953    /// > there is a per-transaction-input limit, proportional to the size of that input.
954    /// > ref: <https://bitcoin.stackexchange.com/questions/117356/what-is-sigop-signature-operation#117359>
955    ///
956    /// The `spent` parameter is a closure/function that looks up the output being spent by each input
957    /// It takes in an [`OutPoint`] and returns a [`TxOut`]. If you can't provide this, a placeholder of
958    /// `|_| None` can be used. Without access to the previous [`TxOut`], any sigops in a redeemScript (P2SH)
959    /// as well as any segwit sigops will not be counted for that input.
960    pub fn total_sigop_cost<S>(&self, mut spent: S) -> usize
961    where
962        S: FnMut(&OutPoint) -> Option<TxOut>,
963    {
964        let mut cost = self.count_p2pk_p2pkh_sigops().saturating_mul(4);
965
966        // coinbase tx is correctly handled because `spent` will always returns None.
967        cost = cost.saturating_add(self.count_p2sh_sigops(&mut spent).saturating_mul(4));
968        cost.saturating_add(self.count_witness_sigops(&mut spent))
969    }
970
971    /// Gets the sigop count.
972    ///
973    /// Counts sigops for this transaction's input scriptSigs and output scriptPubkeys i.e., doesn't
974    /// count sigops in the redeemScript for p2sh or the sigops in the witness (use
975    /// `count_p2sh_sigops` and `count_witness_sigops` respectively).
976    fn count_p2pk_p2pkh_sigops(&self) -> usize {
977        let mut count: usize = 0;
978        for input in &self.input {
979            // 0 for p2wpkh, p2wsh, and p2sh (including wrapped segwit).
980            count = count.saturating_add(input.script_sig.count_sigops_legacy());
981        }
982        for output in &self.output {
983            count = count.saturating_add(output.script_pubkey.count_sigops_legacy());
984        }
985        count
986    }
987
988    /// Does not include wrapped segwit (see `count_witness_sigops`).
989    fn count_p2sh_sigops<S>(&self, spent: &mut S) -> usize
990    where
991        S: FnMut(&OutPoint) -> Option<TxOut>,
992    {
993        fn count_sigops(prevout: &TxOut, input: &TxIn) -> usize {
994            let mut count: usize = 0;
995            if prevout.script_pubkey.is_p2sh() {
996                if let Some(redeem) = input.script_sig.last_pushdata() {
997                    count =
998                        count.saturating_add(Script::from_bytes(redeem.as_bytes()).count_sigops());
999                }
1000            }
1001            count
1002        }
1003
1004        let mut count: usize = 0;
1005        for input in &self.input {
1006            if let Some(prevout) = spent(&input.previous_output) {
1007                count = count.saturating_add(count_sigops(&prevout, input));
1008            }
1009        }
1010        count
1011    }
1012
1013    /// Includes wrapped segwit (returns 0 for taproot spends).
1014    fn count_witness_sigops<S>(&self, spent: &mut S) -> usize
1015    where
1016        S: FnMut(&OutPoint) -> Option<TxOut>,
1017    {
1018        fn count_sigops_with_witness_program(witness: &Witness, witness_program: &Script) -> usize {
1019            if witness_program.is_p2wpkh() {
1020                1
1021            } else if witness_program.is_p2wsh() {
1022                // Treat the last item of the witness as the witnessScript
1023                return witness
1024                    .last()
1025                    .map(Script::from_bytes)
1026                    .map(|s| s.count_sigops())
1027                    .unwrap_or(0);
1028            } else {
1029                0
1030            }
1031        }
1032
1033        fn count_sigops(prevout: TxOut, input: &TxIn) -> usize {
1034            let script_sig = &input.script_sig;
1035            let witness = &input.witness;
1036
1037            let witness_program = if prevout.script_pubkey.is_witness_program() {
1038                &prevout.script_pubkey
1039            } else if prevout.script_pubkey.is_p2sh() && script_sig.is_push_only() {
1040                // If prevout is P2SH and scriptSig is push only
1041                // then we wrap the last push (redeemScript) in a Script
1042                if let Some(push_bytes) = script_sig.last_pushdata() {
1043                    Script::from_bytes(push_bytes.as_bytes())
1044                } else {
1045                    return 0;
1046                }
1047            } else {
1048                return 0;
1049            };
1050
1051            // This will return 0 if the redeemScript wasn't a witness program
1052            count_sigops_with_witness_program(witness, witness_program)
1053        }
1054
1055        let mut count: usize = 0;
1056        for input in &self.input {
1057            if let Some(prevout) = spent(&input.previous_output) {
1058                count = count.saturating_add(count_sigops(prevout, input));
1059            }
1060        }
1061        count
1062    }
1063
1064    /// Returns whether or not to serialize transaction as specified in BIP-144.
1065    fn uses_segwit_serialization(&self) -> bool {
1066        if self.input.iter().any(|input| !input.witness.is_empty()) {
1067            return true;
1068        }
1069        // To avoid serialization ambiguity, no inputs means we use BIP141 serialization (see
1070        // `Transaction` docs for full explanation).
1071        self.input.is_empty()
1072    }
1073
1074    /// Returns a reference to the input at `input_index` if it exists.
1075    #[inline]
1076    pub fn tx_in(&self, input_index: usize) -> Result<&TxIn, InputsIndexError> {
1077        self.input
1078            .get(input_index)
1079            .ok_or(IndexOutOfBoundsError { index: input_index, length: self.input.len() }.into())
1080    }
1081
1082    /// Returns a reference to the output at `output_index` if it exists.
1083    #[inline]
1084    pub fn tx_out(&self, output_index: usize) -> Result<&TxOut, OutputsIndexError> {
1085        self.output
1086            .get(output_index)
1087            .ok_or(IndexOutOfBoundsError { index: output_index, length: self.output.len() }.into())
1088    }
1089}
1090
1091/// Error attempting to do an out of bounds access on the transaction inputs vector.
1092#[derive(Debug, Clone, PartialEq, Eq)]
1093pub struct InputsIndexError(pub IndexOutOfBoundsError);
1094
1095impl fmt::Display for InputsIndexError {
1096    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1097        write_err!(f, "invalid input index"; self.0)
1098    }
1099}
1100
1101#[cfg(feature = "std")]
1102impl std::error::Error for InputsIndexError {
1103    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { Some(&self.0) }
1104}
1105
1106impl From<IndexOutOfBoundsError> for InputsIndexError {
1107    fn from(e: IndexOutOfBoundsError) -> Self { Self(e) }
1108}
1109
1110/// Error attempting to do an out of bounds access on the transaction outputs vector.
1111#[derive(Debug, Clone, PartialEq, Eq)]
1112pub struct OutputsIndexError(pub IndexOutOfBoundsError);
1113
1114impl fmt::Display for OutputsIndexError {
1115    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1116        write_err!(f, "invalid output index"; self.0)
1117    }
1118}
1119
1120#[cfg(feature = "std")]
1121impl std::error::Error for OutputsIndexError {
1122    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { Some(&self.0) }
1123}
1124
1125impl From<IndexOutOfBoundsError> for OutputsIndexError {
1126    fn from(e: IndexOutOfBoundsError) -> Self { Self(e) }
1127}
1128
1129/// Error attempting to do an out of bounds access on a vector.
1130#[derive(Debug, Clone, PartialEq, Eq)]
1131#[non_exhaustive]
1132pub struct IndexOutOfBoundsError {
1133    /// Attempted index access.
1134    pub index: usize,
1135    /// Length of the vector where access was attempted.
1136    pub length: usize,
1137}
1138
1139impl fmt::Display for IndexOutOfBoundsError {
1140    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1141        write!(f, "index {} is out-of-bounds for vector with length {}", self.index, self.length)
1142    }
1143}
1144
1145#[cfg(feature = "std")]
1146impl std::error::Error for IndexOutOfBoundsError {
1147    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
1148}
1149
1150/// The transaction version.
1151///
1152/// Currently, as specified by [BIP-68], only version 1 and 2 are considered standard.
1153///
1154/// Standardness of the inner `i32` is not an invariant because you are free to create transactions
1155/// of any version, transactions with non-standard version numbers will not be relayed by the
1156/// Bitcoin network.
1157///
1158/// [BIP-68]: https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki
1159#[derive(Copy, PartialEq, Eq, Clone, Debug, PartialOrd, Ord, Hash)]
1160#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1161#[cfg_attr(feature = "serde", serde(crate = "actual_serde"))]
1162pub struct Version(pub i32);
1163
1164impl Version {
1165    /// The original Bitcoin transaction version (pre-BIP-68).
1166    pub const ONE: Self = Self(1);
1167
1168    /// The second Bitcoin transaction version (post-BIP-68).
1169    pub const TWO: Self = Self(2);
1170
1171    /// Creates a non-standard transaction version.
1172    pub fn non_standard(version: i32) -> Version { Self(version) }
1173
1174    /// Returns true if this transaction version number is considered standard.
1175    pub fn is_standard(&self) -> bool { *self == Version::ONE || *self == Version::TWO }
1176}
1177
1178impl Encodable for Version {
1179    fn consensus_encode<W: Write + ?Sized>(&self, w: &mut W) -> Result<usize, io::Error> {
1180        self.0.consensus_encode(w)
1181    }
1182}
1183
1184impl Decodable for Version {
1185    fn consensus_decode<R: Read + ?Sized>(r: &mut R) -> Result<Self, encode::Error> {
1186        Decodable::consensus_decode(r).map(Version)
1187    }
1188}
1189
1190impl fmt::Display for Version {
1191    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Display::fmt(&self.0, f) }
1192}
1193
1194impl_consensus_encoding!(TxOut, value, script_pubkey);
1195
1196impl Encodable for OutPoint {
1197    fn consensus_encode<W: Write + ?Sized>(&self, w: &mut W) -> Result<usize, io::Error> {
1198        let len = self.txid.consensus_encode(w)?;
1199        Ok(len + self.vout.consensus_encode(w)?)
1200    }
1201}
1202impl Decodable for OutPoint {
1203    fn consensus_decode<R: Read + ?Sized>(r: &mut R) -> Result<Self, encode::Error> {
1204        Ok(OutPoint {
1205            txid: Decodable::consensus_decode(r)?,
1206            vout: Decodable::consensus_decode(r)?,
1207        })
1208    }
1209}
1210
1211impl Encodable for TxIn {
1212    fn consensus_encode<W: Write + ?Sized>(&self, w: &mut W) -> Result<usize, io::Error> {
1213        let mut len = 0;
1214        len += self.previous_output.consensus_encode(w)?;
1215        len += self.script_sig.consensus_encode(w)?;
1216        len += self.sequence.consensus_encode(w)?;
1217        Ok(len)
1218    }
1219}
1220impl Decodable for TxIn {
1221    #[inline]
1222    fn consensus_decode_from_finite_reader<R: Read + ?Sized>(
1223        r: &mut R,
1224    ) -> Result<Self, encode::Error> {
1225        Ok(TxIn {
1226            previous_output: Decodable::consensus_decode_from_finite_reader(r)?,
1227            script_sig: Decodable::consensus_decode_from_finite_reader(r)?,
1228            sequence: Decodable::consensus_decode_from_finite_reader(r)?,
1229            witness: Witness::default(),
1230        })
1231    }
1232}
1233
1234impl Encodable for Sequence {
1235    fn consensus_encode<W: Write + ?Sized>(&self, w: &mut W) -> Result<usize, io::Error> {
1236        self.0.consensus_encode(w)
1237    }
1238}
1239
1240impl Decodable for Sequence {
1241    fn consensus_decode<R: Read + ?Sized>(r: &mut R) -> Result<Self, encode::Error> {
1242        Decodable::consensus_decode(r).map(Sequence)
1243    }
1244}
1245
1246impl Encodable for Transaction {
1247    fn consensus_encode<W: Write + ?Sized>(&self, w: &mut W) -> Result<usize, io::Error> {
1248        let mut len = 0;
1249        len += self.version.consensus_encode(w)?;
1250
1251        // Legacy transaction serialization format only includes inputs and outputs.
1252        if !self.uses_segwit_serialization() {
1253            len += self.input.consensus_encode(w)?;
1254            len += self.output.consensus_encode(w)?;
1255        } else {
1256            // BIP-141 (segwit) transaction serialization also includes marker, flag, and witness data.
1257            len += SEGWIT_MARKER.consensus_encode(w)?;
1258            len += SEGWIT_FLAG.consensus_encode(w)?;
1259            len += self.input.consensus_encode(w)?;
1260            len += self.output.consensus_encode(w)?;
1261            for input in &self.input {
1262                len += input.witness.consensus_encode(w)?;
1263            }
1264        }
1265        len += self.lock_time.consensus_encode(w)?;
1266        Ok(len)
1267    }
1268}
1269
1270impl Decodable for Transaction {
1271    fn consensus_decode_from_finite_reader<R: Read + ?Sized>(
1272        r: &mut R,
1273    ) -> Result<Self, encode::Error> {
1274        let version = Version::consensus_decode_from_finite_reader(r)?;
1275        let input = Vec::<TxIn>::consensus_decode_from_finite_reader(r)?;
1276        // segwit
1277        if input.is_empty() {
1278            let segwit_flag = u8::consensus_decode_from_finite_reader(r)?;
1279            match segwit_flag {
1280                // BIP144 input witnesses
1281                1 => {
1282                    let mut input = Vec::<TxIn>::consensus_decode_from_finite_reader(r)?;
1283                    let output = Vec::<TxOut>::consensus_decode_from_finite_reader(r)?;
1284                    for txin in input.iter_mut() {
1285                        txin.witness = Decodable::consensus_decode_from_finite_reader(r)?;
1286                    }
1287                    if !input.is_empty() && input.iter().all(|input| input.witness.is_empty()) {
1288                        Err(encode::Error::ParseFailed("witness flag set but no witnesses present"))
1289                    } else {
1290                        Ok(Transaction {
1291                            version,
1292                            input,
1293                            output,
1294                            lock_time: Decodable::consensus_decode_from_finite_reader(r)?,
1295                        })
1296                    }
1297                }
1298                // We don't support anything else
1299                x => Err(encode::Error::UnsupportedSegwitFlag(x)),
1300            }
1301        // non-segwit
1302        } else {
1303            Ok(Transaction {
1304                version,
1305                input,
1306                output: Decodable::consensus_decode_from_finite_reader(r)?,
1307                lock_time: Decodable::consensus_decode_from_finite_reader(r)?,
1308            })
1309        }
1310    }
1311}
1312
1313impl From<Transaction> for Txid {
1314    fn from(tx: Transaction) -> Txid { tx.compute_txid() }
1315}
1316
1317impl From<&Transaction> for Txid {
1318    fn from(tx: &Transaction) -> Txid { tx.compute_txid() }
1319}
1320
1321impl From<Transaction> for Wtxid {
1322    fn from(tx: Transaction) -> Wtxid { tx.compute_wtxid() }
1323}
1324
1325impl From<&Transaction> for Wtxid {
1326    fn from(tx: &Transaction) -> Wtxid { tx.compute_wtxid() }
1327}
1328
1329/// Computes the value of an output accounting for the cost of spending it.
1330///
1331/// The effective value is the value of an output value minus the amount to spend it.  That is, the
1332/// effective_value can be calculated as: value - (fee_rate * weight).
1333///
1334/// Note: the effective value of a [`Transaction`] may increase less than the effective value of
1335/// a [`TxOut`] when adding another [`TxOut`] to the transaction.  This happens when the new
1336/// [`TxOut`] added causes the output length `VarInt` to increase its encoding length.
1337///
1338/// # Arguments
1339///
1340/// * `fee_rate` - the fee rate of the transaction being created.
1341/// * `satisfaction_weight` - satisfied spending conditions weight.
1342pub fn effective_value(
1343    fee_rate: FeeRate,
1344    satisfaction_weight: Weight,
1345    value: Amount,
1346) -> Option<SignedAmount> {
1347    let weight = satisfaction_weight.checked_add(TxIn::BASE_WEIGHT)?;
1348    let signed_input_fee = fee_rate.checked_mul_by_weight(weight)?.to_signed().ok()?;
1349    value.to_signed().ok()?.checked_sub(signed_input_fee)
1350}
1351
1352/// Predicts the weight of a to-be-constructed transaction.
1353///
1354/// This function computes the weight of a transaction which is not fully known. All that is needed
1355/// is the lengths of scripts and witness elements.
1356///
1357/// # Arguments
1358///
1359/// * `inputs` - an iterator which returns `InputWeightPrediction` for each input of the
1360///   to-be-constructed transaction.
1361/// * `output_script_lens` - an iterator which returns the length of `script_pubkey` of each output
1362///   of the to-be-constructed transaction.
1363///
1364/// Note that lengths of the scripts and witness elements must be non-serialized, IOW *without* the
1365/// preceding compact size. The length of preceding compact size is computed and added inside the
1366/// function for convenience.
1367///
1368/// If you  have the transaction already constructed (except for signatures) with a dummy value for
1369/// fee output you can use the return value of [`Transaction::script_pubkey_lens`] method directly
1370/// as the second argument.
1371///
1372/// # Usage
1373///
1374/// When signing a transaction one doesn't know the signature before knowing the transaction fee and
1375/// the transaction fee is not known before knowing the transaction size which is not known before
1376/// knowing the signature. This apparent dependency cycle can be broken by knowing the length of the
1377/// signature without knowing the contents of the signature e.g., we know all Schnorr signatures
1378/// are 64 bytes long.
1379///
1380/// Additionally, some protocols may require calculating the amounts before knowing various parts
1381/// of the transaction (assuming their length is known).
1382///
1383/// # Notes on integer overflow
1384///
1385/// Overflows are intentionally not checked because one of the following holds:
1386///
1387/// * The transaction is valid (obeys the block size limit) and the code feeds correct values to
1388///   this function - no overflow can happen.
1389/// * The transaction will be so large it doesn't fit in the memory - overflow will happen but
1390///   then the transaction will fail to construct and even if one serialized it on disk directly
1391///   it'd be invalid anyway so overflow doesn't matter.
1392/// * The values fed into this function are inconsistent with the actual lengths the transaction
1393///   will have - the code is already broken and checking overflows doesn't help. Unfortunately
1394///   this probably cannot be avoided.
1395pub fn predict_weight<I, O>(inputs: I, output_script_lens: O) -> Weight
1396where
1397    I: IntoIterator<Item = InputWeightPrediction>,
1398    O: IntoIterator<Item = usize>,
1399{
1400    // This fold() does three things:
1401    // 1) Counts the inputs and returns the sum as `input_count`.
1402    // 2) Sums all of the input weights and returns the sum as `partial_input_weight`
1403    //    For every input: script_size * 4 + witness_size
1404    //    Since script_size is non-witness data, it gets a 4x multiplier.
1405    // 3) Counts the number of inputs that have a witness data and returns the count as
1406    //    `num_inputs_with_witnesses`.
1407    let (input_count, partial_input_weight, inputs_with_witnesses) = inputs.into_iter().fold(
1408        (0, 0, 0),
1409        |(count, partial_input_weight, inputs_with_witnesses), prediction| {
1410            (
1411                count + 1,
1412                partial_input_weight + prediction.weight().to_wu() as usize,
1413                inputs_with_witnesses + (prediction.witness_size > 0) as usize,
1414            )
1415        },
1416    );
1417
1418    // This fold() does two things:
1419    // 1) Counts the outputs and returns the sum as `output_count`.
1420    // 2) Sums the output script sizes and returns the sum as `output_scripts_size`.
1421    //    script_len + the length of a VarInt struct that stores the value of script_len
1422    let (output_count, output_scripts_size) = output_script_lens.into_iter().fold(
1423        (0, 0),
1424        |(output_count, total_scripts_size), script_len| {
1425            let script_size = script_len + VarInt(script_len as u64).size();
1426            (output_count + 1, total_scripts_size + script_size)
1427        },
1428    );
1429    predict_weight_internal(
1430        input_count,
1431        partial_input_weight,
1432        inputs_with_witnesses,
1433        output_count,
1434        output_scripts_size,
1435    )
1436}
1437
1438const fn predict_weight_internal(
1439    input_count: usize,
1440    partial_input_weight: usize,
1441    inputs_with_witnesses: usize,
1442    output_count: usize,
1443    output_scripts_size: usize,
1444) -> Weight {
1445    // Lengths of txid, index and sequence: (32, 4, 4).
1446    // Multiply the lengths by 4 since the fields are all non-witness fields.
1447    let input_weight = partial_input_weight + input_count * 4 * (32 + 4 + 4);
1448
1449    // The value field of a TxOut is 8 bytes.
1450    let output_size = 8 * output_count + output_scripts_size;
1451    let non_input_size =
1452    // version:
1453        4 +
1454    // count varints:
1455        VarInt(input_count as u64).size() +
1456        VarInt(output_count as u64).size() +
1457        output_size +
1458    // lock_time
1459        4;
1460    let weight = if inputs_with_witnesses == 0 {
1461        non_input_size * 4 + input_weight
1462    } else {
1463        non_input_size * 4 + input_weight + input_count - inputs_with_witnesses + 2
1464    };
1465    Weight::from_wu(weight as u64)
1466}
1467
1468/// Predicts the weight of a to-be-constructed transaction in const context.
1469///
1470/// This is a `const` version of [`predict_weight`] which only allows slices due to current Rust
1471/// limitations around `const fn`. Because of these limitations it may be less efficient than
1472/// `predict_weight` and thus is intended to be only used in `const` context.
1473///
1474/// Please see the documentation of `predict_weight` to learn more about this function.
1475pub const fn predict_weight_from_slices(
1476    inputs: &[InputWeightPrediction],
1477    output_script_lens: &[usize],
1478) -> Weight {
1479    let mut partial_input_weight = 0;
1480    let mut inputs_with_witnesses = 0;
1481
1482    // for loops not supported in const fn
1483    let mut i = 0;
1484    while i < inputs.len() {
1485        let prediction = inputs[i];
1486        partial_input_weight += prediction.weight().to_wu() as usize;
1487        inputs_with_witnesses += (prediction.witness_size > 0) as usize;
1488        i += 1;
1489    }
1490
1491    let mut output_scripts_size = 0;
1492
1493    i = 0;
1494    while i < output_script_lens.len() {
1495        let script_len = output_script_lens[i];
1496        output_scripts_size += script_len + VarInt(script_len as u64).size();
1497        i += 1;
1498    }
1499
1500    predict_weight_internal(
1501        inputs.len(),
1502        partial_input_weight,
1503        inputs_with_witnesses,
1504        output_script_lens.len(),
1505        output_scripts_size,
1506    )
1507}
1508
1509/// Weight prediction of an individual input.
1510///
1511/// This helper type collects information about an input to be used in [`predict_weight`] function.
1512/// It can only be created using the [`new`](InputWeightPrediction::new) function or using other
1513/// associated constants/methods.
1514#[derive(Copy, Clone, Debug)]
1515pub struct InputWeightPrediction {
1516    script_size: usize,
1517    witness_size: usize,
1518}
1519
1520impl InputWeightPrediction {
1521    /// Input weight prediction corresponding to spending of P2WPKH output with the largest possible
1522    /// DER-encoded signature.
1523    ///
1524    /// If the input in your transaction uses P2WPKH you can use this instead of
1525    /// [`InputWeightPrediction::new`].
1526    ///
1527    /// This is useful when you **do not** use [signature grinding] and want to ensure you are not
1528    /// under-paying. See [`ground_p2wpkh`](Self::ground_p2wpkh) if you do use signature grinding.
1529    ///
1530    /// [signature grinding]: https://bitcoin.stackexchange.com/questions/111660/what-is-signature-grinding
1531    pub const P2WPKH_MAX: Self = InputWeightPrediction::from_slice(0, &[72, 33]);
1532
1533    /// Input weight prediction corresponding to spending of a P2PKH output with the largest possible
1534    /// DER-encoded signature, and a compressed public key.
1535    ///
1536    /// If the input in your transaction uses P2PKH with a compressed key, you can use this instead of
1537    /// [`InputWeightPrediction::new`].
1538    ///
1539    /// This is useful when you **do not** use [signature grinding] and want to ensure you are not
1540    /// under-paying. See [`ground_p2pkh_compressed`](Self::ground_p2pkh_compressed) if you do use
1541    /// signature grinding.
1542    ///
1543    /// [signature grinding]: https://bitcoin.stackexchange.com/questions/111660/what-is-signature-grinding
1544    pub const P2PKH_COMPRESSED_MAX: Self = InputWeightPrediction::from_slice(107, &[]);
1545
1546    /// Input weight prediction corresponding to spending of a P2PKH output with the largest possible
1547    /// DER-encoded signature, and an uncompressed public key.
1548    ///
1549    /// If the input in your transaction uses P2PKH with an uncompressed key, you can use this instead of
1550    /// [`InputWeightPrediction::new`].
1551    pub const P2PKH_UNCOMPRESSED_MAX: Self = InputWeightPrediction::from_slice(139, &[]);
1552
1553    /// Input weight prediction corresponding to spending of taproot output using the key and
1554    /// default sighash.
1555    ///
1556    /// If the input in your transaction uses Taproot key spend you can use this instead of
1557    /// [`InputWeightPrediction::new`].
1558    pub const P2TR_KEY_DEFAULT_SIGHASH: Self = InputWeightPrediction::from_slice(0, &[64]);
1559
1560    /// Input weight prediction corresponding to spending of taproot output using the key and
1561    /// **non**-default sighash.
1562    ///
1563    /// If the input in your transaction uses Taproot key spend you can use this instead of
1564    /// [`InputWeightPrediction::new`].
1565    pub const P2TR_KEY_NON_DEFAULT_SIGHASH: Self = InputWeightPrediction::from_slice(0, &[65]);
1566
1567    /// Input weight prediction corresponding to spending of P2WPKH output using [signature
1568    /// grinding].
1569    ///
1570    /// If the input in your transaction uses P2WPKH and you use signature grinding you can use this
1571    /// instead of [`InputWeightPrediction::new`]. See [`P2WPKH_MAX`](Self::P2WPKH_MAX) if you don't
1572    /// use signature grinding.
1573    ///
1574    /// Note: `bytes_to_grind` is usually `1` because of exponential cost of higher values.
1575    ///
1576    /// # Panics
1577    ///
1578    /// The funcion panics in const context and debug builds if `bytes_to_grind` is higher than 62.
1579    ///
1580    /// [signature grinding]: https://bitcoin.stackexchange.com/questions/111660/what-is-signature-grinding
1581    pub const fn ground_p2wpkh(bytes_to_grind: usize) -> Self {
1582        // Written to trigger const/debug panic for unreasonably high values.
1583        let der_signature_size = 10 + (62 - bytes_to_grind);
1584        InputWeightPrediction::from_slice(0, &[der_signature_size, 33])
1585    }
1586
1587    /// Input weight prediction corresponding to spending of a P2PKH output using [signature
1588    /// grinding], and a compressed public key.
1589    ///
1590    /// If the input in your transaction uses compressed P2PKH and you use signature grinding you
1591    /// can use this instead of [`InputWeightPrediction::new`]. See
1592    /// [`P2PKH_COMPRESSED_MAX`](Self::P2PKH_COMPRESSED_MAX) if you don't use signature grinding.
1593    ///
1594    /// Note: `bytes_to_grind` is usually `1` because of exponential cost of higher values.
1595    ///
1596    /// # Panics
1597    ///
1598    /// The funcion panics in const context and debug builds if `bytes_to_grind` is higher than 62.
1599    ///
1600    /// [signature grinding]: https://bitcoin.stackexchange.com/questions/111660/what-is-signature-grinding
1601    pub const fn ground_p2pkh_compressed(bytes_to_grind: usize) -> Self {
1602        // Written to trigger const/debug panic for unreasonably high values.
1603        let der_signature_size = 10 + (62 - bytes_to_grind);
1604
1605        InputWeightPrediction::from_slice(2 + 33 + der_signature_size, &[])
1606    }
1607
1608    /// Computes the prediction for a single input.
1609    pub fn new<T>(input_script_len: usize, witness_element_lengths: T) -> Self
1610    where
1611        T: IntoIterator,
1612        T::Item: Borrow<usize>,
1613    {
1614        let (count, total_size) =
1615            witness_element_lengths.into_iter().fold((0, 0), |(count, total_size), elem_len| {
1616                let elem_len = *elem_len.borrow();
1617                let elem_size = elem_len + VarInt(elem_len as u64).size();
1618                (count + 1, total_size + elem_size)
1619            });
1620        let witness_size = if count > 0 { total_size + VarInt(count as u64).size() } else { 0 };
1621        let script_size = input_script_len + VarInt(input_script_len as u64).size();
1622
1623        InputWeightPrediction { script_size, witness_size }
1624    }
1625
1626    /// Computes the prediction for a single input in `const` context.
1627    ///
1628    /// This is a `const` version of [`new`](Self::new) which only allows slices due to current Rust
1629    /// limitations around `const fn`. Because of these limitations it may be less efficient than
1630    /// `new` and thus is intended to be only used in `const` context.
1631    pub const fn from_slice(input_script_len: usize, witness_element_lengths: &[usize]) -> Self {
1632        let mut i = 0;
1633        let mut total_size = 0;
1634        // for loops not supported in const fn
1635        while i < witness_element_lengths.len() {
1636            let elem_len = witness_element_lengths[i];
1637            let elem_size = elem_len + VarInt(elem_len as u64).size();
1638            total_size += elem_size;
1639            i += 1;
1640        }
1641        let witness_size = if !witness_element_lengths.is_empty() {
1642            total_size + VarInt(witness_element_lengths.len() as u64).size()
1643        } else {
1644            0
1645        };
1646        let script_size = input_script_len + VarInt(input_script_len as u64).size();
1647
1648        InputWeightPrediction { script_size, witness_size }
1649    }
1650
1651    /// Tallies the total weight added to a transaction by an input with this weight prediction,
1652    /// not counting potential witness flag bytes or the witness count varint.
1653    pub const fn weight(&self) -> Weight {
1654        Weight::from_wu_usize(self.script_size * 4 + self.witness_size)
1655    }
1656}
1657
1658#[cfg(test)]
1659mod tests {
1660    use core::str::FromStr;
1661
1662    use hex::{test_hex_unwrap as hex, FromHex};
1663
1664    use super::*;
1665    use crate::blockdata::constants::WITNESS_SCALE_FACTOR;
1666    use crate::consensus::encode::{deserialize, serialize};
1667    use crate::sighash::EcdsaSighashType;
1668
1669    const SOME_TX: &str = "0100000001a15d57094aa7a21a28cb20b59aab8fc7d1149a3bdbcddba9c622e4f5f6a99ece010000006c493046022100f93bb0e7d8db7bd46e40132d1f8242026e045f03a0efe71bbb8e3f475e970d790221009337cd7f1f929f00cc6ff01f03729b069a7c21b59b1736ddfee5db5946c5da8c0121033b9b137ee87d5a812d6f506efdd37f0affa7ffc310711c06c7f3e097c9447c52ffffffff0100e1f505000000001976a9140389035a9225b3839e2bbf32d826a1e222031fd888ac00000000";
1670
1671    #[test]
1672    fn encode_to_unsized_writer() {
1673        let mut buf = [0u8; 1024];
1674        let raw_tx = hex!(SOME_TX);
1675        let tx: Transaction = Decodable::consensus_decode(&mut raw_tx.as_slice()).unwrap();
1676
1677        let size = tx.consensus_encode(&mut &mut buf[..]).unwrap();
1678        assert_eq!(size, SOME_TX.len() / 2);
1679        assert_eq!(raw_tx, &buf[..size]);
1680    }
1681
1682    #[test]
1683    fn outpoint() {
1684        assert_eq!(OutPoint::from_str("i don't care"), Err(ParseOutPointError::Format));
1685        assert_eq!(
1686            OutPoint::from_str(
1687                "5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456:1:1"
1688            ),
1689            Err(ParseOutPointError::Format)
1690        );
1691        assert_eq!(
1692            OutPoint::from_str("5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456:"),
1693            Err(ParseOutPointError::Format)
1694        );
1695        assert_eq!(
1696            OutPoint::from_str(
1697                "5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456:11111111111"
1698            ),
1699            Err(ParseOutPointError::TooLong)
1700        );
1701        assert_eq!(
1702            OutPoint::from_str(
1703                "5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456:01"
1704            ),
1705            Err(ParseOutPointError::VoutNotCanonical)
1706        );
1707        assert_eq!(
1708            OutPoint::from_str(
1709                "5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456:+42"
1710            ),
1711            Err(ParseOutPointError::VoutNotCanonical)
1712        );
1713        assert_eq!(
1714            OutPoint::from_str("i don't care:1"),
1715            Err(ParseOutPointError::Txid("i don't care".parse::<Txid>().unwrap_err()))
1716        );
1717        assert_eq!(
1718            OutPoint::from_str(
1719                "5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c945X:1"
1720            ),
1721            Err(ParseOutPointError::Txid(
1722                "5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c945X"
1723                    .parse::<Txid>()
1724                    .unwrap_err()
1725            ))
1726        );
1727        assert_eq!(
1728            OutPoint::from_str(
1729                "5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456:lol"
1730            ),
1731            Err(ParseOutPointError::Vout(parse::int::<u32, _>("lol").unwrap_err()))
1732        );
1733
1734        assert_eq!(
1735            OutPoint::from_str(
1736                "5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456:42"
1737            ),
1738            Ok(OutPoint {
1739                txid: "5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456"
1740                    .parse()
1741                    .unwrap(),
1742                vout: 42,
1743            })
1744        );
1745        assert_eq!(
1746            OutPoint::from_str(
1747                "5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456:0"
1748            ),
1749            Ok(OutPoint {
1750                txid: "5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456"
1751                    .parse()
1752                    .unwrap(),
1753                vout: 0,
1754            })
1755        );
1756    }
1757
1758    #[test]
1759    fn txin() {
1760        let txin: Result<TxIn, _> = deserialize(&hex!("a15d57094aa7a21a28cb20b59aab8fc7d1149a3bdbcddba9c622e4f5f6a99ece010000006c493046022100f93bb0e7d8db7bd46e40132d1f8242026e045f03a0efe71bbb8e3f475e970d790221009337cd7f1f929f00cc6ff01f03729b069a7c21b59b1736ddfee5db5946c5da8c0121033b9b137ee87d5a812d6f506efdd37f0affa7ffc310711c06c7f3e097c9447c52ffffffff"));
1761        assert!(txin.is_ok());
1762    }
1763
1764    #[test]
1765    fn txin_default() {
1766        let txin = TxIn::default();
1767        assert_eq!(txin.previous_output, OutPoint::default());
1768        assert_eq!(txin.script_sig, ScriptBuf::new());
1769        assert_eq!(txin.sequence, Sequence::from_consensus(0xFFFFFFFF));
1770        assert_eq!(txin.previous_output, OutPoint::default());
1771        assert_eq!(txin.witness.len(), 0);
1772    }
1773
1774    #[test]
1775    fn is_coinbase() {
1776        use crate::blockdata::constants;
1777        use crate::network::Network;
1778
1779        let genesis = constants::genesis_block(Network::Bitcoin);
1780        assert!(genesis.txdata[0].is_coinbase());
1781        let tx_bytes = hex!("0100000001a15d57094aa7a21a28cb20b59aab8fc7d1149a3bdbcddba9c622e4f5f6a99ece010000006c493046022100f93bb0e7d8db7bd46e40132d1f8242026e045f03a0efe71bbb8e3f475e970d790221009337cd7f1f929f00cc6ff01f03729b069a7c21b59b1736ddfee5db5946c5da8c0121033b9b137ee87d5a812d6f506efdd37f0affa7ffc310711c06c7f3e097c9447c52ffffffff0100e1f505000000001976a9140389035a9225b3839e2bbf32d826a1e222031fd888ac00000000");
1782        let tx: Transaction = deserialize(&tx_bytes).unwrap();
1783        assert!(!tx.is_coinbase());
1784    }
1785
1786    #[test]
1787    fn nonsegwit_transaction() {
1788        let tx_bytes = hex!("0100000001a15d57094aa7a21a28cb20b59aab8fc7d1149a3bdbcddba9c622e4f5f6a99ece010000006c493046022100f93bb0e7d8db7bd46e40132d1f8242026e045f03a0efe71bbb8e3f475e970d790221009337cd7f1f929f00cc6ff01f03729b069a7c21b59b1736ddfee5db5946c5da8c0121033b9b137ee87d5a812d6f506efdd37f0affa7ffc310711c06c7f3e097c9447c52ffffffff0100e1f505000000001976a9140389035a9225b3839e2bbf32d826a1e222031fd888ac00000000");
1789        let tx: Result<Transaction, _> = deserialize(&tx_bytes);
1790        assert!(tx.is_ok());
1791        let realtx = tx.unwrap();
1792        // All these tests aren't really needed because if they fail, the hash check at the end
1793        // will also fail. But these will show you where the failure is so I'll leave them in.
1794        assert_eq!(realtx.version, Version::ONE);
1795        assert_eq!(realtx.input.len(), 1);
1796        // In particular this one is easy to get backward -- in bitcoin hashes are encoded
1797        // as little-endian 256-bit numbers rather than as data strings.
1798        assert_eq!(
1799            format!("{:x}", realtx.input[0].previous_output.txid),
1800            "ce9ea9f6f5e422c6a9dbcddb3b9a14d1c78fab9ab520cb281aa2a74a09575da1".to_string()
1801        );
1802        assert_eq!(realtx.input[0].previous_output.vout, 1);
1803        assert_eq!(realtx.output.len(), 1);
1804        assert_eq!(realtx.lock_time, absolute::LockTime::ZERO);
1805
1806        assert_eq!(
1807            format!("{:x}", realtx.compute_txid()),
1808            "a6eab3c14ab5272a58a5ba91505ba1a4b6d7a3a9fcbd187b6cd99a7b6d548cb7".to_string()
1809        );
1810        assert_eq!(
1811            format!("{:x}", realtx.compute_wtxid()),
1812            "a6eab3c14ab5272a58a5ba91505ba1a4b6d7a3a9fcbd187b6cd99a7b6d548cb7".to_string()
1813        );
1814        assert_eq!(realtx.weight().to_wu() as usize, tx_bytes.len() * WITNESS_SCALE_FACTOR);
1815        assert_eq!(realtx.total_size(), tx_bytes.len());
1816        assert_eq!(realtx.vsize(), tx_bytes.len());
1817        assert_eq!(realtx.base_size(), tx_bytes.len());
1818    }
1819
1820    #[test]
1821    fn segwit_invalid_transaction() {
1822        let tx_bytes = hex!("0000fd000001021921212121212121212121f8b372b0239cc1dff600000000004f4f4f4f4f4f4f4f000000000000000000000000000000333732343133380d000000000000000000000000000000ff000000000009000dff000000000000000800000000000000000d");
1823        let tx: Result<Transaction, _> = deserialize(&tx_bytes);
1824        assert!(tx.is_err());
1825        assert!(tx.unwrap_err().to_string().contains("witness flag set but no witnesses present"));
1826    }
1827
1828    #[test]
1829    fn segwit_transaction() {
1830        let tx_bytes = hex!(
1831            "02000000000101595895ea20179de87052b4046dfe6fd515860505d6511a9004cf12a1f93cac7c01000000\
1832            00ffffffff01deb807000000000017a9140f3444e271620c736808aa7b33e370bd87cb5a078702483045022\
1833            100fb60dad8df4af2841adc0346638c16d0b8035f5e3f3753b88db122e70c79f9370220756e6633b17fd271\
1834            0e626347d28d60b0a2d6cbb41de51740644b9fb3ba7751040121028fa937ca8cba2197a37c007176ed89410\
1835            55d3bcb8627d085e94553e62f057dcc00000000"
1836        );
1837        let tx: Result<Transaction, _> = deserialize(&tx_bytes);
1838        assert!(tx.is_ok());
1839        let realtx = tx.unwrap();
1840        // All these tests aren't really needed because if they fail, the hash check at the end
1841        // will also fail. But these will show you where the failure is so I'll leave them in.
1842        assert_eq!(realtx.version, Version::TWO);
1843        assert_eq!(realtx.input.len(), 1);
1844        // In particular this one is easy to get backward -- in bitcoin hashes are encoded
1845        // as little-endian 256-bit numbers rather than as data strings.
1846        assert_eq!(
1847            format!("{:x}", realtx.input[0].previous_output.txid),
1848            "7cac3cf9a112cf04901a51d605058615d56ffe6d04b45270e89d1720ea955859".to_string()
1849        );
1850        assert_eq!(realtx.input[0].previous_output.vout, 1);
1851        assert_eq!(realtx.output.len(), 1);
1852        assert_eq!(realtx.lock_time, absolute::LockTime::ZERO);
1853
1854        assert_eq!(
1855            format!("{:x}", realtx.compute_txid()),
1856            "f5864806e3565c34d1b41e716f72609d00b55ea5eac5b924c9719a842ef42206".to_string()
1857        );
1858        assert_eq!(
1859            format!("{:x}", realtx.compute_wtxid()),
1860            "80b7d8a82d5d5bf92905b06f2014dd699e03837ca172e3a59d51426ebbe3e7f5".to_string()
1861        );
1862        const EXPECTED_WEIGHT: Weight = Weight::from_wu(442);
1863        assert_eq!(realtx.weight(), EXPECTED_WEIGHT);
1864        assert_eq!(realtx.total_size(), tx_bytes.len());
1865        assert_eq!(realtx.vsize(), 111);
1866
1867        let expected_strippedsize = (442 - realtx.total_size()) / 3;
1868        assert_eq!(realtx.base_size(), expected_strippedsize);
1869
1870        // Construct a transaction without the witness data.
1871        let mut tx_without_witness = realtx;
1872        tx_without_witness.input.iter_mut().for_each(|input| input.witness.clear());
1873        assert_eq!(tx_without_witness.total_size(), tx_without_witness.total_size());
1874        assert_eq!(tx_without_witness.total_size(), expected_strippedsize);
1875    }
1876
1877    // We temporarily abuse `Transaction` for testing consensus serde adapter.
1878    #[cfg(feature = "serde")]
1879    #[test]
1880    fn consensus_serde() {
1881        use crate::consensus::serde as con_serde;
1882        let json = "\"010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff3603da1b0e00045503bd5704c7dd8a0d0ced13bb5785010800000000000a636b706f6f6c122f4e696e6a61506f6f6c2f5345475749542fffffffff02b4e5a212000000001976a914876fbb82ec05caa6af7a3b5e5a983aae6c6cc6d688ac0000000000000000266a24aa21a9edf91c46b49eb8a29089980f02ee6b57e7d63d33b18b4fddac2bcd7db2a39837040120000000000000000000000000000000000000000000000000000000000000000000000000\"";
1883        let mut deserializer = serde_json::Deserializer::from_str(json);
1884        let tx =
1885            con_serde::With::<con_serde::Hex>::deserialize::<'_, Transaction, _>(&mut deserializer)
1886                .unwrap();
1887        let tx_bytes = Vec::from_hex(&json[1..(json.len() - 1)]).unwrap();
1888        let expected = deserialize::<Transaction>(&tx_bytes).unwrap();
1889        assert_eq!(tx, expected);
1890        let mut bytes = Vec::new();
1891        let mut serializer = serde_json::Serializer::new(&mut bytes);
1892        con_serde::With::<con_serde::Hex>::serialize(&tx, &mut serializer).unwrap();
1893        assert_eq!(bytes, json.as_bytes())
1894    }
1895
1896    #[test]
1897    fn transaction_version() {
1898        let tx_bytes = hex!("ffffff7f0100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000");
1899        let tx: Result<Transaction, _> = deserialize(&tx_bytes);
1900        assert!(tx.is_ok());
1901        let realtx = tx.unwrap();
1902        assert_eq!(realtx.version, Version::non_standard(2147483647));
1903
1904        let tx2_bytes = hex!("000000800100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000");
1905        let tx2: Result<Transaction, _> = deserialize(&tx2_bytes);
1906        assert!(tx2.is_ok());
1907        let realtx2 = tx2.unwrap();
1908        assert_eq!(realtx2.version, Version::non_standard(-2147483648));
1909    }
1910
1911    #[test]
1912    fn tx_no_input_deserialization() {
1913        let tx_bytes = hex!(
1914            "010000000001000100e1f505000000001976a9140389035a9225b3839e2bbf32d826a1e222031fd888ac00000000"
1915        );
1916        let tx: Transaction = deserialize(&tx_bytes).expect("deserialize tx");
1917
1918        assert_eq!(tx.input.len(), 0);
1919        assert_eq!(tx.output.len(), 1);
1920
1921        let reser = serialize(&tx);
1922        assert_eq!(tx_bytes, reser);
1923    }
1924
1925    #[test]
1926    fn ntxid() {
1927        let tx_bytes = hex!("0100000001a15d57094aa7a21a28cb20b59aab8fc7d1149a3bdbcddba9c622e4f5f6a99ece010000006c493046022100f93bb0e7d8db7bd46e40132d1f8242026e045f03a0efe71bbb8e3f475e970d790221009337cd7f1f929f00cc6ff01f03729b069a7c21b59b1736ddfee5db5946c5da8c0121033b9b137ee87d5a812d6f506efdd37f0affa7ffc310711c06c7f3e097c9447c52ffffffff0100e1f505000000001976a9140389035a9225b3839e2bbf32d826a1e222031fd888ac00000000");
1928        let mut tx: Transaction = deserialize(&tx_bytes).unwrap();
1929
1930        let old_ntxid = tx.compute_ntxid();
1931        assert_eq!(
1932            format!("{:x}", old_ntxid),
1933            "c3573dbea28ce24425c59a189391937e00d255150fa973d59d61caf3a06b601d"
1934        );
1935        // changing sigs does not affect it
1936        tx.input[0].script_sig = ScriptBuf::new();
1937        assert_eq!(old_ntxid, tx.compute_ntxid());
1938        // changing pks does
1939        tx.output[0].script_pubkey = ScriptBuf::new();
1940        assert!(old_ntxid != tx.compute_ntxid());
1941    }
1942
1943    #[test]
1944    fn txid() {
1945        // segwit tx from Liquid integration tests, txid/hash from Core decoderawtransaction
1946        let tx_bytes = hex!(
1947            "01000000000102ff34f95a672bb6a4f6ff4a7e90fa8c7b3be7e70ffc39bc99be3bda67942e836c00000000\
1948             23220020cde476664d3fa347b8d54ef3aee33dcb686a65ced2b5207cbf4ec5eda6b9b46e4f414d4c934ad8\
1949             1d330314e888888e3bd22c7dde8aac2ca9227b30d7c40093248af7812201000000232200200af6f6a071a6\
1950             9d5417e592ed99d256ddfd8b3b2238ac73f5da1b06fc0b2e79d54f414d4c0ba0c8f505000000001976a914\
1951             dcb5898d9036afad9209e6ff0086772795b1441088ac033c0f000000000017a914889f8c10ff2bd4bb9dab\
1952             b68c5c0d700a46925e6c87033c0f000000000017a914889f8c10ff2bd4bb9dabb68c5c0d700a46925e6c87\
1953             033c0f000000000017a914889f8c10ff2bd4bb9dabb68c5c0d700a46925e6c87033c0f000000000017a914\
1954             889f8c10ff2bd4bb9dabb68c5c0d700a46925e6c87033c0f000000000017a914889f8c10ff2bd4bb9dabb6\
1955             8c5c0d700a46925e6c87033c0f000000000017a914889f8c10ff2bd4bb9dabb68c5c0d700a46925e6c8703\
1956             3c0f000000000017a914889f8c10ff2bd4bb9dabb68c5c0d700a46925e6c87033c0f000000000017a91488\
1957             9f8c10ff2bd4bb9dabb68c5c0d700a46925e6c87033c0f000000000017a914889f8c10ff2bd4bb9dabb68c\
1958             5c0d700a46925e6c87033c0f000000000017a914889f8c10ff2bd4bb9dabb68c5c0d700a46925e6c870500\
1959             47304402200380b8663e727d7e8d773530ef85d5f82c0b067c97ae927800a0876a1f01d8e2022021ee611e\
1960             f6507dfd217add2cd60a8aea3cbcfec034da0bebf3312d19577b8c290147304402207bd9943ce1c2c5547b\
1961             120683fd05d78d23d73be1a5b5a2074ff586b9c853ed4202202881dcf435088d663c9af7b23efb3c03b9db\
1962             c0c899b247aa94a74d9b4b3c84f501483045022100ba12bba745af3f18f6e56be70f8382ca8e107d1ed5ce\
1963             aa3e8c360d5ecf78886f022069b38ebaac8fe6a6b97b497cbbb115f3176f7213540bef08f9292e5a72de52\
1964             de01695321023c9cd9c6950ffee24772be948a45dc5ef1986271e46b686cb52007bac214395a2102756e27\
1965             cb004af05a6e9faed81fd68ff69959e3c64ac8c9f6cd0e08fd0ad0e75d2103fa40da236bd82202a985a910\
1966             4e851080b5940812685769202a3b43e4a8b13e6a53ae050048304502210098b9687b81d725a7970d1eee91\
1967             ff6b89bc9832c2e0e3fb0d10eec143930b006f02206f77ce19dc58ecbfef9221f81daad90bb4f468df3912\
1968             12abc4f084fe2cc9bdef01483045022100e5479f81a3ad564103da5e2ec8e12f61f3ac8d312ab68763c1dd\
1969             d7bae94c20610220789b81b7220b27b681b1b2e87198897376ba9d033bc387f084c8b8310c8539c2014830\
1970             45022100aa1cc48a2d256c0e556616444cc08ae4959d464e5ffff2ae09e3550bdab6ce9f02207192d5e332\
1971             9a56ba7b1ead724634d104f1c3f8749fe6081e6233aee3e855817a016953210260de9cc68658c61af984e3\
1972             ab0281d17cfca1cc035966d335f474932d5e6c5422210355fbb768ce3ce39360277345dbb5f376e706459e\
1973             5a2b5e0e09a535e61690647021023222ceec58b94bd25925dd9743dae6b928737491bd940fc5dd7c6f5d5f\
1974             2adc1e53ae00000000"
1975        );
1976        let tx: Transaction = deserialize(&tx_bytes).unwrap();
1977
1978        assert_eq!(
1979            format!("{:x}", tx.compute_wtxid()),
1980            "d6ac4a5e61657c4c604dcde855a1db74ec6b3e54f32695d72c5e11c7761ea1b4"
1981        );
1982        assert_eq!(
1983            format!("{:x}", tx.compute_txid()),
1984            "9652aa62b0e748caeec40c4cb7bc17c6792435cc3dfe447dd1ca24f912a1c6ec"
1985        );
1986        assert_eq!(format!("{:.10x}", tx.compute_txid()), "9652aa62b0");
1987        assert_eq!(tx.weight(), Weight::from_wu(2718));
1988
1989        // non-segwit tx from my mempool
1990        let tx_bytes = hex!(
1991            "01000000010c7196428403d8b0c88fcb3ee8d64f56f55c8973c9ab7dd106bb4f3527f5888d000000006a47\
1992             30440220503a696f55f2c00eee2ac5e65b17767cd88ed04866b5637d3c1d5d996a70656d02202c9aff698f\
1993             343abb6d176704beda63fcdec503133ea4f6a5216b7f925fa9910c0121024d89b5a13d6521388969209df2\
1994             7a8469bd565aff10e8d42cef931fad5121bfb8ffffffff02b825b404000000001976a914ef79e7ee9fff98\
1995             bcfd08473d2b76b02a48f8c69088ac0000000000000000296a273236303039343836393731373233313237\
1996             3633313032313332353630353838373931323132373000000000"
1997        );
1998        let tx: Transaction = deserialize(&tx_bytes).unwrap();
1999
2000        assert_eq!(
2001            format!("{:x}", tx.compute_wtxid()),
2002            "971ed48a62c143bbd9c87f4bafa2ef213cfa106c6e140f111931d0be307468dd"
2003        );
2004        assert_eq!(
2005            format!("{:x}", tx.compute_txid()),
2006            "971ed48a62c143bbd9c87f4bafa2ef213cfa106c6e140f111931d0be307468dd"
2007        );
2008    }
2009
2010    #[test]
2011    #[cfg(feature = "serde")]
2012    fn txn_encode_decode() {
2013        let tx_bytes = hex!("0100000001a15d57094aa7a21a28cb20b59aab8fc7d1149a3bdbcddba9c622e4f5f6a99ece010000006c493046022100f93bb0e7d8db7bd46e40132d1f8242026e045f03a0efe71bbb8e3f475e970d790221009337cd7f1f929f00cc6ff01f03729b069a7c21b59b1736ddfee5db5946c5da8c0121033b9b137ee87d5a812d6f506efdd37f0affa7ffc310711c06c7f3e097c9447c52ffffffff0100e1f505000000001976a9140389035a9225b3839e2bbf32d826a1e222031fd888ac00000000");
2014        let tx: Transaction = deserialize(&tx_bytes).unwrap();
2015        serde_round_trip!(tx);
2016    }
2017
2018    // Test decoding transaction `4be105f158ea44aec57bf12c5817d073a712ab131df6f37786872cfc70734188`
2019    // from testnet, which is the first BIP144-encoded transaction I encountered.
2020    #[test]
2021    #[cfg(feature = "serde")]
2022    fn segwit_tx_decode() {
2023        let tx_bytes = hex!("010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff3603da1b0e00045503bd5704c7dd8a0d0ced13bb5785010800000000000a636b706f6f6c122f4e696e6a61506f6f6c2f5345475749542fffffffff02b4e5a212000000001976a914876fbb82ec05caa6af7a3b5e5a983aae6c6cc6d688ac0000000000000000266a24aa21a9edf91c46b49eb8a29089980f02ee6b57e7d63d33b18b4fddac2bcd7db2a39837040120000000000000000000000000000000000000000000000000000000000000000000000000");
2024        let tx: Transaction = deserialize(&tx_bytes).unwrap();
2025        assert_eq!(tx.weight(), Weight::from_wu(780));
2026        serde_round_trip!(tx);
2027
2028        let consensus_encoded = serialize(&tx);
2029        assert_eq!(consensus_encoded, tx_bytes);
2030    }
2031
2032    #[test]
2033    fn sighashtype_fromstr_display() {
2034        let sighashtypes = vec![
2035            ("SIGHASH_ALL", EcdsaSighashType::All),
2036            ("SIGHASH_NONE", EcdsaSighashType::None),
2037            ("SIGHASH_SINGLE", EcdsaSighashType::Single),
2038            ("SIGHASH_ALL|SIGHASH_ANYONECANPAY", EcdsaSighashType::AllPlusAnyoneCanPay),
2039            ("SIGHASH_NONE|SIGHASH_ANYONECANPAY", EcdsaSighashType::NonePlusAnyoneCanPay),
2040            ("SIGHASH_SINGLE|SIGHASH_ANYONECANPAY", EcdsaSighashType::SinglePlusAnyoneCanPay),
2041        ];
2042        for (s, sht) in sighashtypes {
2043            assert_eq!(sht.to_string(), s);
2044            assert_eq!(EcdsaSighashType::from_str(s).unwrap(), sht);
2045        }
2046        let sht_mistakes = vec![
2047            "SIGHASH_ALL | SIGHASH_ANYONECANPAY",
2048            "SIGHASH_NONE |SIGHASH_ANYONECANPAY",
2049            "SIGHASH_SINGLE| SIGHASH_ANYONECANPAY",
2050            "SIGHASH_ALL SIGHASH_ANYONECANPAY",
2051            "SIGHASH_NONE |",
2052            "SIGHASH_SIGNLE",
2053            "sighash_none",
2054            "Sighash_none",
2055            "SigHash_None",
2056            "SigHash_NONE",
2057        ];
2058        for s in sht_mistakes {
2059            assert_eq!(
2060                EcdsaSighashType::from_str(s).unwrap_err().to_string(),
2061                format!("unrecognized SIGHASH string '{}'", s)
2062            );
2063        }
2064    }
2065
2066    #[test]
2067    fn huge_witness() {
2068        deserialize::<Transaction>(&hex!(include_str!("../../tests/data/huge_witness.hex").trim()))
2069            .unwrap();
2070    }
2071
2072    #[test]
2073    #[cfg(feature = "bitcoinconsensus")]
2074    fn transaction_verify() {
2075        use std::collections::HashMap;
2076
2077        use crate::blockdata::witness::Witness;
2078
2079        // a random recent segwit transaction from blockchain using both old and segwit inputs
2080        let mut spending: Transaction = deserialize(hex!("020000000001031cfbc8f54fbfa4a33a30068841371f80dbfe166211242213188428f437445c91000000006a47304402206fbcec8d2d2e740d824d3d36cc345b37d9f65d665a99f5bd5c9e8d42270a03a8022013959632492332200c2908459547bf8dbf97c65ab1a28dec377d6f1d41d3d63e012103d7279dfb90ce17fe139ba60a7c41ddf605b25e1c07a4ddcb9dfef4e7d6710f48feffffff476222484f5e35b3f0e43f65fc76e21d8be7818dd6a989c160b1e5039b7835fc00000000171600140914414d3c94af70ac7e25407b0689e0baa10c77feffffffa83d954a62568bbc99cc644c62eb7383d7c2a2563041a0aeb891a6a4055895570000000017160014795d04cc2d4f31480d9a3710993fbd80d04301dffeffffff06fef72f000000000017a91476fd7035cd26f1a32a5ab979e056713aac25796887a5000f00000000001976a914b8332d502a529571c6af4be66399cd33379071c588ac3fda0500000000001976a914fc1d692f8de10ae33295f090bea5fe49527d975c88ac522e1b00000000001976a914808406b54d1044c429ac54c0e189b0d8061667e088ac6eb68501000000001976a914dfab6085f3a8fb3e6710206a5a959313c5618f4d88acbba20000000000001976a914eb3026552d7e3f3073457d0bee5d4757de48160d88ac0002483045022100bee24b63212939d33d513e767bc79300051f7a0d433c3fcf1e0e3bf03b9eb1d70220588dc45a9ce3a939103b4459ce47500b64e23ab118dfc03c9caa7d6bfc32b9c601210354fd80328da0f9ae6eef2b3a81f74f9a6f66761fadf96f1d1d22b1fd6845876402483045022100e29c7e3a5efc10da6269e5fc20b6a1cb8beb92130cc52c67e46ef40aaa5cac5f0220644dd1b049727d991aece98a105563416e10a5ac4221abac7d16931842d5c322012103960b87412d6e169f30e12106bdf70122aabb9eb61f455518322a18b920a4dfa887d30700")
2081            .as_slice()).unwrap();
2082        let spent1: Transaction = deserialize(hex!("020000000001040aacd2c49f5f3c0968cfa8caf9d5761436d95385252e3abb4de8f5dcf8a582f20000000017160014bcadb2baea98af0d9a902e53a7e9adff43b191e9feffffff96cd3c93cac3db114aafe753122bd7d1afa5aa4155ae04b3256344ecca69d72001000000171600141d9984579ceb5c67ebfbfb47124f056662fe7adbfeffffffc878dd74d3a44072eae6178bb94b9253177db1a5aaa6d068eb0e4db7631762e20000000017160014df2a48cdc53dae1aba7aa71cb1f9de089d75aac3feffffffe49f99275bc8363f5f593f4eec371c51f62c34ff11cc6d8d778787d340d6896c0100000017160014229b3b297a0587e03375ab4174ef56eeb0968735feffffff03360d0f00000000001976a9149f44b06f6ee92ddbc4686f71afe528c09727a5c788ac24281b00000000001976a9140277b4f68ff20307a2a9f9b4487a38b501eb955888ac227c0000000000001976a9148020cd422f55eef8747a9d418f5441030f7c9c7788ac0247304402204aa3bd9682f9a8e101505f6358aacd1749ecf53a62b8370b97d59243b3d6984f02200384ad449870b0e6e89c92505880411285ecd41cf11e7439b973f13bad97e53901210205b392ffcb83124b1c7ce6dd594688198ef600d34500a7f3552d67947bbe392802473044022033dfd8d190a4ae36b9f60999b217c775b96eb10dee3a1ff50fb6a75325719106022005872e4e36d194e49ced2ebcf8bb9d843d842e7b7e0eb042f4028396088d292f012103c9d7cbf369410b090480de2aa15c6c73d91b9ffa7d88b90724614b70be41e98e0247304402207d952de9e59e4684efed069797e3e2d993e9f98ec8a9ccd599de43005fe3f713022076d190cc93d9513fc061b1ba565afac574e02027c9efbfa1d7b71ab8dbb21e0501210313ad44bc030cc6cb111798c2bf3d2139418d751c1e79ec4e837ce360cc03b97a024730440220029e75edb5e9413eb98d684d62a077b17fa5b7cc19349c1e8cc6c4733b7b7452022048d4b9cae594f03741029ff841e35996ef233701c1ea9aa55c301362ea2e2f68012103590657108a72feb8dc1dec022cf6a230bb23dc7aaa52f4032384853b9f8388baf9d20700")
2083            .as_slice()).unwrap();
2084        let spent2: Transaction = deserialize(hex!("0200000000010166c3d39490dc827a2594c7b17b7d37445e1f4b372179649cd2ce4475e3641bbb0100000017160014e69aa750e9bff1aca1e32e57328b641b611fc817fdffffff01e87c5d010000000017a914f3890da1b99e44cd3d52f7bcea6a1351658ea7be87024830450221009eb97597953dc288de30060ba02d4e91b2bde1af2ecf679c7f5ab5989549aa8002202a98f8c3bd1a5a31c0d72950dd6e2e3870c6c5819a6c3db740e91ebbbc5ef4800121023f3d3b8e74b807e32217dea2c75c8d0bd46b8665b3a2d9b3cb310959de52a09bc9d20700")
2085            .as_slice()).unwrap();
2086        let spent3: Transaction = deserialize(hex!("01000000027a1120a30cef95422638e8dab9dedf720ec614b1b21e451a4957a5969afb869d000000006a47304402200ecc318a829a6cad4aa9db152adbf09b0cd2de36f47b53f5dade3bc7ef086ca702205722cda7404edd6012eedd79b2d6f24c0a0c657df1a442d0a2166614fb164a4701210372f4b97b34e9c408741cd1fc97bcc7ffdda6941213ccfde1cb4075c0f17aab06ffffffffc23b43e5a18e5a66087c0d5e64d58e8e21fcf83ce3f5e4f7ecb902b0e80a7fb6010000006b483045022100f10076a0ea4b4cf8816ed27a1065883efca230933bf2ff81d5db6258691ff75202206b001ef87624e76244377f57f0c84bc5127d0dd3f6e0ef28b276f176badb223a01210309a3a61776afd39de4ed29b622cd399d99ecd942909c36a8696cfd22fc5b5a1affffffff0200127a000000000017a914f895e1dd9b29cb228e9b06a15204e3b57feaf7cc8769311d09000000001976a9144d00da12aaa51849d2583ae64525d4a06cd70fde88ac00000000")
2087            .as_slice()).unwrap();
2088
2089        let mut spent = HashMap::new();
2090        spent.insert(spent1.compute_txid(), spent1);
2091        spent.insert(spent2.compute_txid(), spent2);
2092        spent.insert(spent3.compute_txid(), spent3);
2093        let mut spent2 = spent.clone();
2094        let mut spent3 = spent.clone();
2095
2096        spending
2097            .verify(|point: &OutPoint| {
2098                if let Some(tx) = spent.remove(&point.txid) {
2099                    return tx.output.get(point.vout as usize).cloned();
2100                }
2101                None
2102            })
2103            .unwrap();
2104
2105        // test that we fail with repeated use of same input
2106        let mut double_spending = spending.clone();
2107        let re_use = double_spending.input[0].clone();
2108        double_spending.input.push(re_use);
2109
2110        assert!(double_spending
2111            .verify(|point: &OutPoint| {
2112                if let Some(tx) = spent2.remove(&point.txid) {
2113                    return tx.output.get(point.vout as usize).cloned();
2114                }
2115                None
2116            })
2117            .is_err());
2118
2119        // test that we get a failure if we corrupt a signature
2120        let mut witness: Vec<_> = spending.input[1].witness.to_vec();
2121        witness[0][10] = 42;
2122        spending.input[1].witness = Witness::from_slice(&witness);
2123
2124        let error = spending
2125            .verify(|point: &OutPoint| {
2126                if let Some(tx) = spent3.remove(&point.txid) {
2127                    return tx.output.get(point.vout as usize).cloned();
2128                }
2129                None
2130            })
2131            .err()
2132            .unwrap();
2133
2134        match error {
2135            TxVerifyError::ScriptVerification(_) => {}
2136            _ => panic!("Wrong error type"),
2137        }
2138    }
2139
2140    #[test]
2141    fn sequence_number() {
2142        let seq_final = Sequence::from_consensus(0xFFFFFFFF);
2143        let seq_non_rbf = Sequence::from_consensus(0xFFFFFFFE);
2144        let block_time_lock = Sequence::from_consensus(0xFFFF);
2145        let unit_time_lock = Sequence::from_consensus(0x40FFFF);
2146        let lock_time_disabled = Sequence::from_consensus(0x80000000);
2147
2148        assert!(seq_final.is_final());
2149        assert!(!seq_final.is_rbf());
2150        assert!(!seq_final.is_relative_lock_time());
2151        assert!(!seq_non_rbf.is_rbf());
2152        assert!(block_time_lock.is_relative_lock_time());
2153        assert!(block_time_lock.is_height_locked());
2154        assert!(block_time_lock.is_rbf());
2155        assert!(unit_time_lock.is_relative_lock_time());
2156        assert!(unit_time_lock.is_time_locked());
2157        assert!(unit_time_lock.is_rbf());
2158        assert!(!lock_time_disabled.is_relative_lock_time());
2159    }
2160
2161    #[test]
2162    fn sequence_from_hex_lower() {
2163        let sequence = Sequence::from_hex("0xffffffff").unwrap();
2164        assert_eq!(sequence, Sequence::MAX);
2165    }
2166
2167    #[test]
2168    fn sequence_from_hex_upper() {
2169        let sequence = Sequence::from_hex("0XFFFFFFFF").unwrap();
2170        assert_eq!(sequence, Sequence::MAX);
2171    }
2172
2173    #[test]
2174    fn sequence_from_unprefixed_hex_lower() {
2175        let sequence = Sequence::from_unprefixed_hex("ffffffff").unwrap();
2176        assert_eq!(sequence, Sequence::MAX);
2177    }
2178
2179    #[test]
2180    fn sequence_from_unprefixed_hex_upper() {
2181        let sequence = Sequence::from_unprefixed_hex("FFFFFFFF").unwrap();
2182        assert_eq!(sequence, Sequence::MAX);
2183    }
2184
2185    #[test]
2186    fn sequence_from_str_hex_invalid_hex_should_err() {
2187        let hex = "0xzb93";
2188        let result = Sequence::from_hex(hex);
2189        assert!(result.is_err());
2190    }
2191
2192    #[test]
2193    fn effective_value_happy_path() {
2194        let value = Amount::from_str("1 cBTC").unwrap();
2195        let fee_rate = FeeRate::from_sat_per_kwu(10);
2196        let satisfaction_weight = Weight::from_wu(204);
2197        let effective_value = effective_value(fee_rate, satisfaction_weight, value).unwrap();
2198
2199        // 10 sat/kwu * (204wu + BASE_WEIGHT) = 4 sats
2200        let expected_fee = SignedAmount::from_str("4 sats").unwrap();
2201        let expected_effective_value = value.to_signed().unwrap() - expected_fee;
2202        assert_eq!(effective_value, expected_effective_value);
2203    }
2204
2205    #[test]
2206    fn effective_value_fee_rate_does_not_overflow() {
2207        let eff_value = effective_value(FeeRate::MAX, Weight::ZERO, Amount::ZERO);
2208        assert!(eff_value.is_none());
2209    }
2210
2211    #[test]
2212    fn effective_value_weight_does_not_overflow() {
2213        let eff_value = effective_value(FeeRate::ZERO, Weight::MAX, Amount::ZERO);
2214        assert!(eff_value.is_none());
2215    }
2216
2217    #[test]
2218    fn effective_value_value_does_not_overflow() {
2219        let eff_value = effective_value(FeeRate::ZERO, Weight::ZERO, Amount::MAX);
2220        assert!(eff_value.is_none());
2221    }
2222
2223    #[test]
2224    fn txin_txout_weight() {
2225        // [(is_segwit, tx_hex, expected_weight)]
2226        let txs = [
2227                // one segwit input (P2WPKH)
2228                (true, "020000000001018a763b78d3e17acea0625bf9e52b0dc1beb2241b2502185348ba8ff4a253176e0100000000ffffffff0280d725000000000017a914c07ed639bd46bf7087f2ae1dfde63b815a5f8b488767fda20300000000160014869ec8520fa2801c8a01bfdd2e82b19833cd0daf02473044022016243edad96b18c78b545325aaff80131689f681079fb107a67018cb7fb7830e02205520dae761d89728f73f1a7182157f6b5aecf653525855adb7ccb998c8e6143b012103b9489bde92afbcfa85129a82ffa512897105d1a27ad9806bded27e0532fc84e700000000", Weight::from_wu(565)),
2229                // one segwit input (P2WSH)
2230                (true, "01000000000101a3ccad197118a2d4975fadc47b90eacfdeaf8268adfdf10ed3b4c3b7e1ad14530300000000ffffffff0200cc5501000000001976a91428ec6f21f4727bff84bb844e9697366feeb69f4d88aca2a5100d00000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d04004730440220548f11130353b3a8f943d2f14260345fc7c20bde91704c9f1cbb5456355078cd0220383ed4ed39b079b618bcb279bbc1f2ca18cb028c4641cb522c9c5868c52a0dc20147304402203c332ecccb3181ca82c0600520ee51fee80d3b4a6ab110945e59475ec71e44ac0220679a11f3ca9993b04ccebda3c834876f353b065bb08f50076b25f5bb93c72ae1016952210375e00eb72e29da82b89367947f29ef34afb75e8654f6ea368e0acdfd92976b7c2103a1b26313f430c4b15bb1fdce663207659d8cac749a0e53d70eff01874496feff2103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae00000000", Weight::from_wu(766)),
2231                // one segwit input (P2WPKH) and two legacy inputs (P2PKH)
2232                (true, "010000000001036b6b6ac7e34e97c53c1cc74c99c7948af2e6aac75d8778004ae458d813456764000000006a473044022001deec7d9075109306320b3754188f81a8236d0d232b44bc69f8309115638b8f02204e17a5194a519cf994d0afeea1268740bdc10616b031a521113681cc415e815c012103488d3272a9fad78ee887f0684cb8ebcfc06d0945e1401d002e590c7338b163feffffffffc75bd7aa6424aee972789ec28ba181254ee6d8311b058d165bd045154d7660b0000000006b483045022100c8641bcbee3e4c47a00417875015d8c5d5ea918fb7e96f18c6ffe51bc555b401022074e2c46f5b1109cd79e39a9aa203eadd1d75356415e51d80928a5fb5feb0efee0121033504b4c6dfc3a5daaf7c425aead4c2dbbe4e7387ce8e6be2648805939ecf7054ffffffff494df3b205cd9430a26f8e8c0dc0bb80496fbc555a524d6ea307724bc7e60eee0100000000ffffffff026d861500000000001976a9145c54ed1360072ebaf56e87693b88482d2c6a101588ace407000000000000160014761e31e2629c6e11936f2f9888179d60a5d4c1f900000247304402201fa38a67a63e58b67b6cfffd02f59121ca1c8a1b22e1efe2573ae7e4b4f06c2b022002b9b431b58f6e36b3334fb14eaecee7d2f06967a77ef50d8d5f90dda1057f0c01210257dc6ce3b1100903306f518ee8fa113d778e403f118c080b50ce079fba40e09a00000000", Weight::from_wu(1755)),
2233                // three legacy inputs (P2PKH)
2234                (false, "0100000003e4d7be4314204a239d8e00691128dca7927e19a7339c7948bde56f669d27d797010000006b483045022100b988a858e2982e2daaf0755b37ad46775d6132057934877a5badc91dee2f66ff022020b967c1a2f0916007662ec609987e951baafa6d4fda23faaad70715611d6a2501210254a2dccd8c8832d4677dc6f0e562eaaa5d11feb9f1de2c50a33832e7c6190796ffffffff9e22eb1b3f24c260187d716a8a6c2a7efb5af14a30a4792a6eeac3643172379c000000006a47304402207df07f0cd30dca2cf7bed7686fa78d8a37fe9c2254dfdca2befed54e06b779790220684417b8ff9f0f6b480546a9e90ecee86a625b3ea1e4ca29b080da6bd6c5f67e01210254a2dccd8c8832d4677dc6f0e562eaaa5d11feb9f1de2c50a33832e7c6190796ffffffff1123df3bfb503b59769731da103d4371bc029f57979ebce68067768b958091a1000000006a47304402207a016023c2b0c4db9a7d4f9232fcec2193c2f119a69125ad5bcedcba56dd525e02206a734b3a321286c896759ac98ebfd9d808df47f1ce1fbfbe949891cc3134294701210254a2dccd8c8832d4677dc6f0e562eaaa5d11feb9f1de2c50a33832e7c6190796ffffffff0200c2eb0b000000001976a914e5eb3e05efad136b1405f5c2f9adb14e15a35bb488ac88cfff1b000000001976a9144846db516db3130b7a3c92253599edec6bc9630b88ac00000000", Weight::from_wu(2080)),
2235                // one segwit input (P2TR)
2236                (true, "01000000000101b5cee87f1a60915c38bb0bc26aaf2b67be2b890bbc54bb4be1e40272e0d2fe0b0000000000ffffffff025529000000000000225120106daad8a5cb2e6fc74783714273bad554a148ca2d054e7a19250e9935366f3033760000000000002200205e6d83c44f57484fd2ef2a62b6d36cdcd6b3e06b661e33fd65588a28ad0dbe060141df9d1bfce71f90d68bf9e9461910b3716466bfe035c7dbabaa7791383af6c7ef405a3a1f481488a91d33cd90b098d13cb904323a3e215523aceaa04e1bb35cdb0100000000", Weight::from_wu(617)),
2237                // one legacy input (P2PKH)
2238                (false, "0100000001c336895d9fa674f8b1e294fd006b1ac8266939161600e04788c515089991b50a030000006a47304402204213769e823984b31dcb7104f2c99279e74249eacd4246dabcf2575f85b365aa02200c3ee89c84344ae326b637101a92448664a8d39a009c8ad5d147c752cbe112970121028b1b44b4903c9103c07d5a23e3c7cf7aeb0ba45ddbd2cfdce469ab197381f195fdffffff040000000000000000536a4c5058325bb7b7251cf9e36cac35d691bd37431eeea426d42cbdecca4db20794f9a4030e6cb5211fabf887642bcad98c9994430facb712da8ae5e12c9ae5ff314127d33665000bb26c0067000bb0bf00322a50c300000000000017a9145ca04fdc0a6d2f4e3f67cfeb97e438bb6287725f8750c30000000000001976a91423086a767de0143523e818d4273ddfe6d9e4bbcc88acc8465003000000001976a914c95cbacc416f757c65c942f9b6b8a20038b9b12988ac00000000", Weight::from_wu(1396)),
2239            ];
2240
2241        let empty_transaction_weight = Transaction {
2242            version: Version::TWO,
2243            lock_time: absolute::LockTime::ZERO,
2244            input: vec![],
2245            output: vec![],
2246        }
2247        .weight();
2248
2249        for (is_segwit, tx, expected_weight) in &txs {
2250            let txin_weight = if *is_segwit { TxIn::segwit_weight } else { TxIn::legacy_weight };
2251            let tx: Transaction = deserialize(Vec::from_hex(tx).unwrap().as_slice()).unwrap();
2252            assert_eq!(*is_segwit, tx.uses_segwit_serialization());
2253
2254            let mut calculated_weight = empty_transaction_weight
2255                + tx.input.iter().fold(Weight::ZERO, |sum, i| sum + txin_weight(i))
2256                + tx.output.iter().fold(Weight::ZERO, |sum, o| sum + o.weight());
2257
2258            // The empty tx uses segwit serialization but a legacy tx does not.
2259            if !tx.uses_segwit_serialization() {
2260                calculated_weight -= Weight::from_wu(2);
2261            }
2262
2263            assert_eq!(calculated_weight, *expected_weight);
2264            assert_eq!(tx.weight(), *expected_weight);
2265        }
2266    }
2267
2268    #[test]
2269    fn tx_sigop_count() {
2270        let tx_hexes = [
2271            // 0 sigops (p2pkh in + p2wpkh out)
2272            (
2273                "0200000001725aab4d23f76ad10bb569a68f8702ebfb8b076e015179ff9b9425234953\
2274                ac63000000006a47304402204cae7dc9bb68b588dd6b8afb8b881b752fd65178c25693e\
2275                a6d5d9a08388fd2a2022011c753d522d5c327741a6d922342c86e05c928309d7e566f68\
2276                8148432e887028012103f14b11cfb58b113716e0fa277ab4a32e4d3ed64c6b09b1747ef\
2277                7c828d5b06a94fdffffff01e5d4830100000000160014e98527b55cae861e5b9c3a6794\
2278                86514c012d6fce00000000",
2279                0,                                             // Expected (Some)
2280                return_none as fn(&OutPoint) -> Option<TxOut>, // spent fn
2281                0,                                             // Expected (None)
2282            ),
2283            // 5 sigops (p2wpkh in + p2pkh out (x4))
2284            (
2285                "020000000001018c47330b1c4d30e7e2244e8ccb56d411b71e10073bb42fa1813f3f01\
2286                e144cc4d0100000000fdffffff01f7e30300000000001976a9143b49fd16f7562cfeedc\
2287                6a4ba84805f8c2f8e1a2c88ac024830450221009a4dbf077a63f6e4c3628a5fef2a09ec\
2288                6f7ca4a4d95bc8bb69195b6b671e9272022074da9ffff5a677fc7b37d66bb4ff1f316c9\
2289                dbacb92058291d84cd4b83f7c63c9012103d013e9e53c9ca8dd2ddffab1e9df27811503\
2290                feea7eb0700ff058851bbb37d99000000000",
2291                5,
2292                return_p2wpkh,
2293                4,
2294            ),
2295            // 8 sigops (P2WSH 3-of-4 MS (4) in + P2WSH out + P2PKH out (1x4))
2296            (
2297                "01000000000101e70d7b4d957122909a665070b0c5bbb693982d09e4e66b9e6b7a8390\
2298                ce65ef1f0100000000ffffffff02095f2b0000000000220020800a016ea57a08f30c273\
2299                ae7624f8f91c505ccbd3043829349533f317168248c52594500000000001976a914607f\
2300                643372477c044c6d40b814288e40832a602688ac05004730440220282943649e687b5a3\
2301                bda9403c16f363c2ee2be0ec43fb8df40a08b96a4367d47022014e8f36938eef41a09ee\
2302                d77a815b0fa120a35f25e3a185310f050959420cee360147304402201e555f894036dd5\
2303                78045701e03bf10e093d7e93cd9997e44c1fc65a7b669852302206893f7261e52c9d779\
2304                5ba39d99aad30663da43ed675c389542805469fa8eb26a014730440220510fc99bc37d6\
2305                dbfa7e8724f4802cebdb17b012aaf70ce625e22e6158b139f40022022e9b811751d491f\
2306                bdec7691b697e88ba84315f6739b9e3bd4425ac40563aed2018b5321029ddecf0cc2013\
2307                514961550e981a0b8b60e7952f70561a5bb552aa7f075e71e3c2103316195a59c35a3b2\
2308                7b6dfcc3192cc10a7a6bbccd5658dfbe98ca62a13d6a02c121034629d906165742def4e\
2309                f53c6dade5dcbf88b775774cad151e35ae8285e613b0221035826a29938de2076950811\
2310                13c58bcf61fe6adacc3aacceb21c4827765781572d54ae00000000",
2311                8,
2312                return_p2wsh,
2313                4,
2314            ),
2315            // 5 sigops (P2SH-P2WPKH in (1), 2 P2SH outs (0), 1 P2PKH out (1x4))
2316            (
2317                "010000000001018aec7e0729ba5a2d284303c89b3f397e92d54472a225d28eb0ae2fa6\
2318                5a7d1a2e02000000171600145ad5db65f313ab76726eb178c2fd8f21f977838dfdfffff\
2319                f03102700000000000017a914dca89e03ba124c2c70e55533f91100f2d9dab04587f2d7\
2320                1d00000000001976a91442a34f4b0a65bc81278b665d37fd15910d261ec588ac292c3b0\
2321                00000000017a91461978dcebd0db2da0235c1ba3e8087f9fd74c57f8702473044022000\
2322                9226f8def30a8ffa53e55ca5d71a72a64cd20ae7f3112562e3413bd0731d2c0220360d2\
2323                20435e67eef7f2bf0258d1dded706e3824f06d961ba9eeaed300b16c2cc012103180cff\
2324                753d3e4ee1aa72b2b0fd72ce75956d04f4c19400a3daed0b18c3ab831e00000000",
2325                5,
2326                return_p2sh,
2327                4,
2328            ),
2329            // 12 sigops (1 P2SH 2-of-3 MS in (3x4), P2SH outs (0))
2330            (
2331                "010000000115fe9ec3dc964e41f5267ea26cfe505f202bf3b292627496b04bece84da9\
2332                b18903000000fc004730440220442827f1085364bda58c5884cee7b289934083362db6d\
2333                fb627dc46f6cdbf5793022078cfa524252c381f2a572f0c41486e2838ca94aa268f2384\
2334                d0e515744bf0e1e9014730440220160e49536bb29a49c7626744ee83150174c22fa40d5\
2335                8fb4cd554a907a6a7b825022045f6cf148504b334064686795f0968c689e542f475b8ef\
2336                5a5fa42383948226a3014c69522103e54bc61efbcb8eeff3a5ab2a92a75272f5f6820e3\
2337                8e3d28edb54beb06b86c0862103a553e30733d7a8df6d390d59cc136e2c9d9cf4e808f3\
2338                b6ab009beae68dd60822210291c5a54bb8b00b6f72b90af0ac0ecaf78fab026d8eded28\
2339                2ad95d4d65db268c953aeffffffff024c4f0d000000000017a9146ebf0484bd5053f727\
2340                c755a750aa4c815dfa112887a06b12020000000017a91410065dd50b3a7f299fef3b1c5\
2341                3b8216399916ab08700000000",
2342                12,
2343                return_p2sh,
2344                0,
2345            ),
2346            // 3 sigops (1 P2SH-P2WSH 2-of-3 MS in (3), P2SH + P2WSH outs (0))
2347            (
2348                "0100000000010117a31277a8ba3957be351fe4cffd080e05e07f9ee1594d638f55dd7d\
2349                707a983c01000000232200203a33fc9628c29f36a492d9fd811fd20231fbd563f7863e7\
2350                9c4dc0ed34ea84b15ffffffff033bed03000000000017a914fb00d9a49663fd8ae84339\
2351                8ae81299a1941fb8d287429404000000000017a9148fe08d81882a339cf913281eca8af\
2352                39110507c798751ab1300000000002200208819e4bac0109b659de6b9168b83238a050b\
2353                ef16278e470083b39d28d2aa5a6904004830450221009faf81f72ec9b14a39f0f0e12f0\
2354                1a7175a4fe3239cd9a015ff2085985a9b0e3f022059e1aaf96c9282298bdc9968a46d8a\
2355                d28e7299799835cf982b02c35e217caeae0147304402202b1875355ee751e0c8b21990b\
2356                7ea73bd84dfd3bd17477b40fc96552acba306ad02204913bc43acf02821a3403132aa0c\
2357                33ac1c018d64a119f6cb55dfb8f408d997ef01695221023c15bf3436c0b4089e0ed0428\
2358                5101983199d0967bd6682d278821c1e2ac3583621034d924ccabac6d190ce8343829834\
2359                cac737aa65a9abe521bcccdcc3882d97481f21035d01d092bb0ebcb793ba3ffa0aeb143\
2360                2868f5277d5d3d2a7d2bc1359ec13abbd53aee1560c00",
2361                3,
2362                return_p2sh,
2363                0,
2364            ),
2365            // 80 sigops (1 P2PKH ins (0), 1 BARE MS outs (20x4))
2366            (
2367                "0100000001628c1726fecd23331ae9ff2872341b82d2c03180aa64f9bceefe457448db\
2368                e579020000006a47304402204799581a5b34ae5adca21ef22c55dbfcee58527127c95d0\
2369                1413820fe7556ed970220391565b24dc47ce57fe56bf029792f821a392cdb5a3d45ed85\
2370                c158997e7421390121037b2fb5b602e51c493acf4bf2d2423bcf63a09b3b99dfb7bd3c8\
2371                d74733b5d66f5ffffffff011c0300000000000069512103a29472a1848105b2225f0eca\
2372                5c35ada0b0abbc3c538818a53eca177f4f4dcd9621020c8fd41b65ae6b980c072c5a9f3\
2373                aec9f82162c92eb4c51d914348f4390ac39122102222222222222222222222222222222\
2374                222222222222222222222222222222222253ae00000000",
2375                80,
2376                return_none,
2377                80,
2378            ),
2379        ];
2380
2381        // All we need is to trigger 3 cases for prevout
2382        fn return_p2sh(_outpoint: &OutPoint) -> Option<TxOut> {
2383            Some(
2384                deserialize(&hex!(
2385                    "cc721b000000000017a91428203c10cc8f18a77412caaa83dabaf62b8fbb0f87"
2386                ))
2387                .unwrap(),
2388            )
2389        }
2390        fn return_p2wpkh(_outpoint: &OutPoint) -> Option<TxOut> {
2391            Some(
2392                deserialize(&hex!(
2393                    "e695779d000000001600141c6977423aa4b82a0d7f8496cdf3fc2f8b4f580c"
2394                ))
2395                .unwrap(),
2396            )
2397        }
2398        fn return_p2wsh(_outpoint: &OutPoint) -> Option<TxOut> {
2399            Some(
2400                deserialize(&hex!(
2401                    "66b51e0900000000220020dbd6c9d5141617eff823176aa226eb69153c1e31334ac37469251a2539fc5c2b"
2402                ))
2403                .unwrap(),
2404            )
2405        }
2406        fn return_none(_outpoint: &OutPoint) -> Option<TxOut> { None }
2407
2408        for (hx, expected, spent_fn, expected_none) in tx_hexes.iter() {
2409            let tx_bytes = hex!(hx);
2410            let tx: Transaction = deserialize(&tx_bytes).unwrap();
2411            assert_eq!(tx.total_sigop_cost(spent_fn), *expected);
2412            assert_eq!(tx.total_sigop_cost(return_none), *expected_none);
2413        }
2414    }
2415
2416    #[test]
2417    fn weight_predictions() {
2418        // TXID 3d3381f968e3a73841cba5e73bf47dcea9f25a9f7663c51c81f1db8229a309a0
2419        let tx_raw = hex!(
2420            "01000000000103fc9aa70afba04da865f9821734b556cca9fb5710\
2421             fc1338b97fba811033f755e308000000000000000019b37457784d\
2422             d04936f011f733b8016c247a9ef08d40007a54a5159d1fc62ee216\
2423             00000000000000004c4f2937c6ccf8256d9711a19df1ae62172297\
2424             0bf46be925ff15f490efa1633d01000000000000000002c0e1e400\
2425             0000000017a9146983f776902c1d1d0355ae0962cb7bc69e9afbde\
2426             8706a1e600000000001600144257782711458506b89f255202d645\
2427             e25c41144702483045022100dcada0499865a49d0aab8cb113c5f8\
2428             3fd5a97abc793f97f3f53aa4b9d1192ed702202094c7934666a30d\
2429             6adb1cc9e3b6bc14d2ffebd3200f3908c40053ef2df640b5012103\
2430             15434bb59b615a383ae87316e784fc11835bb97fab33fdd2578025\
2431             e9968d516e0247304402201d90b3197650569eba4bc0e0b1e2dca7\
2432             7dfac7b80d4366f335b67e92e0546e4402203b4be1d443ad7e3a5e\
2433             a92aafbcdc027bf9ccf5fe68c0bc8f3ebb6ab806c5464c012103e0\
2434             0d92b0fe60731a54fdbcc6920934159db8ffd69d55564579b69a22\
2435             ec5bb7530247304402205ab83b734df818e64d8b9e86a8a75f9d00\
2436             5c0c6e1b988d045604853ab9ccbde002205a580235841df609d6bd\
2437             67534bdcd301999b18e74e197e9e476cdef5fdcbf822012102ebb3\
2438             e8a4638ede4721fb98e44e3a3cd61fecfe744461b85e0b6a6a1017\
2439             5d5aca00000000"
2440        );
2441
2442        let tx = Transaction::consensus_decode::<&[u8]>(&mut tx_raw.as_ref()).unwrap();
2443        let input_weights = vec![
2444            InputWeightPrediction::P2WPKH_MAX,
2445            InputWeightPrediction::ground_p2wpkh(1),
2446            InputWeightPrediction::ground_p2wpkh(1),
2447        ];
2448        // Outputs: [P2SH, P2WPKH]
2449
2450        // Confirm the transaction's predicted weight matches its actual weight.
2451        let predicted = predict_weight(input_weights, tx.script_pubkey_lens());
2452        let expected = tx.weight();
2453        assert_eq!(predicted, expected);
2454
2455        // Confirm signature grinding input weight predictions are aligned with constants.
2456        assert_eq!(
2457            InputWeightPrediction::ground_p2wpkh(0).weight(),
2458            InputWeightPrediction::P2WPKH_MAX.weight()
2459        );
2460        assert_eq!(
2461            InputWeightPrediction::ground_p2pkh_compressed(0).weight(),
2462            InputWeightPrediction::P2PKH_COMPRESSED_MAX.weight()
2463        );
2464    }
2465
2466    #[test]
2467    fn sequence_debug_output() {
2468        let seq = Sequence::from_seconds_floor(1000);
2469        println!("{:?}", seq)
2470    }
2471
2472    #[test]
2473    fn outpoint_format() {
2474        let outpoint = OutPoint::default();
2475
2476        let debug = "OutPoint { txid: 0000000000000000000000000000000000000000000000000000000000000000, vout: 4294967295 }";
2477        assert_eq!(debug, format!("{:?}", &outpoint));
2478
2479        let display = "0000000000000000000000000000000000000000000000000000000000000000:4294967295";
2480        assert_eq!(display, format!("{}", &outpoint));
2481
2482        let pretty_debug = "OutPoint {\n    txid: 0000000000000000000000000000000000000000000000000000000000000000,\n    vout: 4294967295,\n}";
2483        assert_eq!(pretty_debug, format!("{:#?}", &outpoint));
2484
2485        let debug_txid = "0000000000000000000000000000000000000000000000000000000000000000";
2486        assert_eq!(debug_txid, format!("{:?}", &outpoint.txid));
2487
2488        let display_txid = "0000000000000000000000000000000000000000000000000000000000000000";
2489        assert_eq!(display_txid, format!("{}", &outpoint.txid));
2490
2491        let pretty_txid = "0x0000000000000000000000000000000000000000000000000000000000000000";
2492        assert_eq!(pretty_txid, format!("{:#}", &outpoint.txid));
2493    }
2494}
2495
2496#[cfg(bench)]
2497mod benches {
2498    use hex_lit::hex;
2499    use io::sink;
2500    use test::{black_box, Bencher};
2501
2502    use super::Transaction;
2503    use crate::consensus::{deserialize, Encodable};
2504
2505    const SOME_TX: &str = "0100000001a15d57094aa7a21a28cb20b59aab8fc7d1149a3bdbcddba9c622e4f5f6a99ece010000006c493046022100f93bb0e7d8db7bd46e40132d1f8242026e045f03a0efe71bbb8e3f475e970d790221009337cd7f1f929f00cc6ff01f03729b069a7c21b59b1736ddfee5db5946c5da8c0121033b9b137ee87d5a812d6f506efdd37f0affa7ffc310711c06c7f3e097c9447c52ffffffff0100e1f505000000001976a9140389035a9225b3839e2bbf32d826a1e222031fd888ac00000000";
2506
2507    #[bench]
2508    pub fn bench_transaction_size(bh: &mut Bencher) {
2509        let raw_tx = hex!(SOME_TX);
2510
2511        let mut tx: Transaction = deserialize(&raw_tx).unwrap();
2512
2513        bh.iter(|| {
2514            black_box(black_box(&mut tx).total_size());
2515        });
2516    }
2517
2518    #[bench]
2519    pub fn bench_transaction_serialize(bh: &mut Bencher) {
2520        let raw_tx = hex!(SOME_TX);
2521        let tx: Transaction = deserialize(&raw_tx).unwrap();
2522
2523        let mut data = Vec::with_capacity(raw_tx.len());
2524
2525        bh.iter(|| {
2526            let result = tx.consensus_encode(&mut data);
2527            black_box(&result);
2528            data.clear();
2529        });
2530    }
2531
2532    #[bench]
2533    pub fn bench_transaction_serialize_logic(bh: &mut Bencher) {
2534        let raw_tx = hex!(SOME_TX);
2535        let tx: Transaction = deserialize(&raw_tx).unwrap();
2536
2537        bh.iter(|| {
2538            let size = tx.consensus_encode(&mut sink());
2539            black_box(&size);
2540        });
2541    }
2542
2543    #[bench]
2544    pub fn bench_transaction_deserialize(bh: &mut Bencher) {
2545        let raw_tx = hex!(SOME_TX);
2546
2547        bh.iter(|| {
2548            let tx: Transaction = deserialize(&raw_tx).unwrap();
2549            black_box(&tx);
2550        });
2551    }
2552}