bsv/transaction/
transaction_output.rs1use 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#[derive(Debug, Clone)]
11pub struct TransactionOutput {
12 pub satoshis: Option<u64>,
14 pub locking_script: LockingScript,
16 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 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 pub fn to_binary(&self, writer: &mut impl Write) -> Result<(), TransactionError> {
52 write_u64_le(writer, self.satoshis.unwrap_or(0))?;
54
55 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}