From 003dc9cf4d80c2a6d614de1e3a1c7c4b1d5372e0 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Fri, 18 Oct 2024 14:20:49 +1100 Subject: [PATCH] Move TxOut to primitives The `TxOut` has all public fields; move the `TxOut` to `primitives`. --- bitcoin/src/blockdata/transaction.rs | 35 +------------------------ primitives/src/lib.rs | 2 +- primitives/src/transaction.rs | 38 +++++++++++++++++++++++++++- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/bitcoin/src/blockdata/transaction.rs b/bitcoin/src/blockdata/transaction.rs index cb91bfc25..9f571e53e 100644 --- a/bitcoin/src/blockdata/transaction.rs +++ b/bitcoin/src/blockdata/transaction.rs @@ -32,7 +32,7 @@ use crate::{Amount, FeeRate, SignedAmount}; #[rustfmt::skip] // Keep public re-exports separate. #[doc(inline)] -pub use primitives::transaction::{OutPoint, ParseOutPointError, Txid, Wtxid, Version, TxIn}; +pub use primitives::transaction::{OutPoint, ParseOutPointError, Txid, Wtxid, Version, TxIn, TxOut}; impl_hashencode!(Txid); impl_hashencode!(Wtxid); @@ -151,32 +151,6 @@ crate::internal_macros::define_extension_trait! { } } -/// Bitcoin transaction output. -/// -/// Defines new coins to be created as a result of the transaction, -/// along with spending conditions ("script", aka "output script"), -/// which an input spending it must satisfy. -/// -/// An output that is not yet spent by an input is called Unspent Transaction Output ("UTXO"). -/// -/// ### Bitcoin Core References -/// -/// * [CTxOut definition](https://github.com/bitcoin/bitcoin/blob/345457b542b6a980ccfbc868af0970a6f91d1b82/src/primitives/transaction.h#L148) -#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub struct TxOut { - /// The value of the output, in satoshis. - pub value: Amount, - /// The script which must be satisfied for the output to be spent. - pub script_pubkey: ScriptBuf, -} - -impl TxOut { - /// This is used as a "null txout" in consensus signing code. - pub const NULL: Self = - TxOut { value: Amount::from_sat(0xffffffffffffffff), script_pubkey: ScriptBuf::new() }; -} - crate::internal_macros::define_extension_trait! { /// Extension functionality for the [`TxOut`] type. pub trait TxOutExt impl for TxOut { @@ -231,13 +205,6 @@ crate::internal_macros::define_extension_trait! { } } -#[cfg(feature = "arbitrary")] -impl<'a> Arbitrary<'a> for TxOut { - fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { - Ok(TxOut { value: Amount::arbitrary(u)?, script_pubkey: ScriptBuf::arbitrary(u)? }) - } -} - /// Returns the total number of bytes that this script pubkey would contribute to a transaction. fn size_from_script_pubkey(script_pubkey: &Script) -> usize { let len = script_pubkey.len(); diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index ba7c0293b..51ff69297 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -59,7 +59,7 @@ pub use self::{ pub use self::{ locktime::{absolute, relative}, witness::Witness, - transaction::TxIn, + transaction::{TxIn, TxOut}, }; #[rustfmt::skip] diff --git a/primitives/src/transaction.rs b/primitives/src/transaction.rs index 608d26013..a1649deb6 100644 --- a/primitives/src/transaction.rs +++ b/primitives/src/transaction.rs @@ -18,7 +18,7 @@ use hashes::sha256d; #[cfg(feature = "alloc")] use internals::write_err; #[cfg(feature = "alloc")] -use units::parse; +use units::{parse, Amount}; #[cfg(feature = "alloc")] use crate::script::ScriptBuf; @@ -69,6 +69,34 @@ impl TxIn { }; } +/// Bitcoin transaction output. +/// +/// Defines new coins to be created as a result of the transaction, +/// along with spending conditions ("script", aka "output script"), +/// which an input spending it must satisfy. +/// +/// An output that is not yet spent by an input is called Unspent Transaction Output ("UTXO"). +/// +/// ### Bitcoin Core References +/// +/// * [CTxOut definition](https://github.com/bitcoin/bitcoin/blob/345457b542b6a980ccfbc868af0970a6f91d1b82/src/primitives/transaction.h#L148) +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg(feature = "alloc")] +pub struct TxOut { + /// The value of the output, in satoshis. + pub value: Amount, + /// The script which must be satisfied for the output to be spent. + pub script_pubkey: ScriptBuf, +} + +#[cfg(feature = "alloc")] +impl TxOut { + /// This is used as a "null txout" in consensus signing code. + pub const NULL: Self = + TxOut { value: Amount::from_sat(0xffffffffffffffff), script_pubkey: ScriptBuf::new() }; +} + /// A reference to a transaction output. /// /// ### Bitcoin Core References @@ -261,6 +289,14 @@ impl<'a> Arbitrary<'a> for TxIn { } } +#[cfg(feature = "arbitrary")] +#[cfg(feature = "alloc")] +impl<'a> Arbitrary<'a> for TxOut { + fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { + Ok(TxOut { value: Amount::arbitrary(u)?, script_pubkey: ScriptBuf::arbitrary(u)? }) + } +} + #[cfg(feature = "arbitrary")] impl<'a> Arbitrary<'a> for OutPoint { fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result {