poseidon_client/transactions/
transaction.rs

1use crate::{Message, PoseidonResult, Signature};
2use core::fmt;
3use generic_array::GenericArray;
4use serde::{Deserialize, Serialize};
5
6#[derive(PartialEq, Eq, Clone, Deserialize, Serialize)]
7pub struct Transaction {
8    #[serde(with = "short_vec")]
9    pub signatures: Vec<Signature>,
10    pub message: Message,
11}
12
13impl Transaction {
14    pub fn new(message: Message) -> Self {
15        Transaction {
16            signatures: Vec::default(),
17            message,
18        }
19    }
20
21    pub fn add_signature(&mut self, signature: [u8; 64]) -> &mut Self {
22        self.signatures
23            .push(GenericArray::clone_from_slice(&signature));
24
25        self
26    }
27
28    pub fn to_bytes(&self) -> PoseidonResult<Vec<u8>> {
29        Ok(bincode::serialize(&self)?)
30    }
31
32    pub fn to_base58(&self) -> PoseidonResult<String> {
33        let serialized_tx = bincode::serialize(&self)?;
34
35        Ok(bs58::encode(&serialized_tx).into_string())
36    }
37}
38
39impl fmt::Debug for Transaction {
40    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
41        let signatures: Vec<String> = self
42            .signatures
43            .iter()
44            .map(|signature| bs58::encode(signature).into_string())
45            .collect();
46        f.debug_struct("Transaction")
47            .field("signatures", &signatures)
48            .field("message", &self.message)
49            .finish()
50    }
51}