Skip to main content

bsv/transaction/
transaction_output.rs

1//! Bitcoin transaction output type.
2
3use std::io::{Read, Write};
4
5use crate::script::locking_script::LockingScript;
6use crate::transaction::error::TransactionError;
7use crate::transaction::{read_u64_le, read_varint, write_u64_le, write_varint};
8
9/// A single output in a Bitcoin transaction.
10#[derive(Debug, Clone)]
11pub struct TransactionOutput {
12    /// The value in satoshis (None for outputs not yet assigned a value).
13    pub satoshis: Option<u64>,
14    /// The locking script (scriptPubKey).
15    pub locking_script: LockingScript,
16    /// Whether this output is a change output (not serialized).
17    pub change: bool,
18}
19
20impl Default for TransactionOutput {
21    fn default() -> Self {
22        Self {
23            satoshis: None,
24            locking_script: LockingScript::from_binary(&[]),
25            change: false,
26        }
27    }
28}
29
30impl TransactionOutput {
31    /// Deserialize a transaction output from binary wire format.
32    ///
33    /// Wire format: satoshis(8 LE) + varint(script_len) + script
34    pub fn from_binary(reader: &mut impl Read) -> Result<Self, TransactionError> {
35        let satoshis = read_u64_le(reader)?;
36        let script_len = read_varint(reader)? as usize;
37        let mut script_bytes = vec![0u8; script_len];
38        if script_len > 0 {
39            reader.read_exact(&mut script_bytes)?;
40        }
41        let locking_script = LockingScript::from_binary(&script_bytes);
42
43        Ok(TransactionOutput {
44            satoshis: Some(satoshis),
45            locking_script,
46            change: false,
47        })
48    }
49
50    /// Serialize a transaction output to binary wire format.
51    pub fn to_binary(&self, writer: &mut impl Write) -> Result<(), TransactionError> {
52        // Write satoshis (default 0 if None)
53        write_u64_le(writer, self.satoshis.unwrap_or(0))?;
54
55        // Write script
56        let script_bin = self.locking_script.to_binary();
57        write_varint(writer, script_bin.len() as u64)?;
58        writer.write_all(&script_bin)?;
59
60        Ok(())
61    }
62}