use std::io::{Read, Write};
use crate::script::locking_script::LockingScript;
use crate::transaction::error::TransactionError;
use crate::transaction::{read_u64_le, read_varint, write_u64_le, write_varint};
#[derive(Debug, Clone)]
pub struct TransactionOutput {
pub satoshis: Option<u64>,
pub locking_script: LockingScript,
pub change: bool,
}
impl Default for TransactionOutput {
fn default() -> Self {
Self {
satoshis: None,
locking_script: LockingScript::from_binary(&[]),
change: false,
}
}
}
impl TransactionOutput {
pub fn from_binary(reader: &mut impl Read) -> Result<Self, TransactionError> {
let satoshis = read_u64_le(reader)?;
let script_len = read_varint(reader)? as usize;
let mut script_bytes = vec![0u8; script_len];
if script_len > 0 {
reader.read_exact(&mut script_bytes)?;
}
let locking_script = LockingScript::from_binary(&script_bytes);
Ok(TransactionOutput {
satoshis: Some(satoshis),
locking_script,
change: false,
})
}
pub fn to_binary(&self, writer: &mut impl Write) -> Result<(), TransactionError> {
write_u64_le(writer, self.satoshis.unwrap_or(0))?;
let script_bin = self.locking_script.to_binary();
write_varint(writer, script_bin.len() as u64)?;
writer.write_all(&script_bin)?;
Ok(())
}
}