mwc_bch/messages/
tx_out.rs

1use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
2use script::Script;
3use std::io;
4use std::io::{Read, Write};
5use util::{var_int, Amount, Result, Serializable};
6
7/// Transaction output
8#[derive(Debug, PartialEq, Eq, Hash, Clone)]
9pub struct TxOut {
10    /// Number of satoshis to spend
11    pub amount: Amount,
12    /// Public key script to claim the output
13    pub pk_script: Script,
14}
15
16impl TxOut {
17    /// Returns the size of the transaction output in bytes
18    pub fn size(&self) -> usize {
19        8 + var_int::size(self.pk_script.0.len() as u64) + self.pk_script.0.len()
20    }
21}
22
23impl Serializable<TxOut> for TxOut {
24    fn read(reader: &mut dyn Read) -> Result<TxOut> {
25        let amount = Amount(reader.read_i64::<LittleEndian>()?);
26        let script_len = var_int::read(reader)?;
27        let mut pk_script = Script(vec![0; script_len as usize]);
28        reader.read(&mut pk_script.0)?;
29        Ok(TxOut { amount, pk_script })
30    }
31
32    fn write(&self, writer: &mut dyn Write) -> io::Result<()> {
33        writer.write_i64::<LittleEndian>(self.amount.0)?;
34        var_int::write(self.pk_script.0.len() as u64, writer)?;
35        writer.write(&self.pk_script.0)?;
36        Ok(())
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43    use std::io::Cursor;
44
45    #[test]
46    fn write_read() {
47        let mut v = Vec::new();
48        let t = TxOut {
49            amount: Amount(4400044000),
50            pk_script: Script(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 100, 99, 98, 97, 96]),
51        };
52        t.write(&mut v).unwrap();
53        assert!(v.len() == t.size());
54        assert!(TxOut::read(&mut Cursor::new(&v)).unwrap() == t);
55    }
56}