1use borsh::{BorshDeserialize, BorshSerialize};
2use light_compressed_account::{
3 instruction_data::{
4 data::OutputCompressedAccountWithPackedContext,
5 insert_into_queues::MerkleTreeSequenceNumber as InstructionDataSequenceNumber,
6 },
7 Pubkey,
8};
9
10#[derive(Debug, Clone, Default, PartialEq)]
11pub struct BatchPublicTransactionEvent {
12 pub event: PublicTransactionEvent,
13 pub new_addresses: Vec<NewAddress>,
14 pub input_sequence_numbers: Vec<MerkleTreeSequenceNumber>,
15 pub address_sequence_numbers: Vec<MerkleTreeSequenceNumber>,
16 pub tx_hash: [u8; 32],
17 pub batch_input_accounts: Vec<BatchNullifyContext>,
18}
19
20#[derive(Debug, Clone, BorshSerialize, BorshDeserialize, Default, PartialEq)]
21pub struct PublicTransactionEvent {
22 pub input_compressed_account_hashes: Vec<[u8; 32]>,
23 pub output_compressed_account_hashes: Vec<[u8; 32]>,
24 pub output_compressed_accounts: Vec<OutputCompressedAccountWithPackedContext>,
25 pub output_leaf_indices: Vec<u32>,
26 pub sequence_numbers: Vec<MerkleTreeSequenceNumberV1>,
27 pub relay_fee: Option<u64>,
28 pub is_compress: bool,
29 pub compress_or_decompress_lamports: Option<u64>,
30 pub pubkey_array: Vec<Pubkey>,
31 pub message: Option<Vec<u8>>,
32}
33
34#[derive(Debug, Clone, Copy, PartialEq, Eq)]
35pub struct NewAddress {
36 pub address: [u8; 32],
37 pub mt_pubkey: Pubkey,
38 pub queue_index: u64,
39}
40
41#[derive(Default, Debug, Clone, PartialEq, Eq)]
42pub struct BatchNullifyContext {
43 pub tx_hash: [u8; 32],
44 pub account_hash: [u8; 32],
45 pub nullifier: [u8; 32],
46 pub nullifier_queue_index: u64,
47}
48
49#[derive(Debug, Clone, Copy, BorshSerialize, BorshDeserialize, Default, PartialEq)]
51pub struct MerkleTreeSequenceNumber {
52 pub tree_pubkey: Pubkey,
53 pub queue_pubkey: Pubkey,
54 pub tree_type: u64,
55 pub seq: u64,
56}
57
58#[derive(Debug, Clone, Copy, BorshSerialize, BorshDeserialize, Default, PartialEq)]
59pub struct MerkleTreeSequenceNumberV1 {
60 pub tree_pubkey: Pubkey,
61 pub seq: u64,
62}
63
64impl MerkleTreeSequenceNumber {
65 pub fn is_empty(&self) -> bool {
66 self.tree_pubkey == Pubkey::default()
67 }
68}
69
70impl From<&InstructionDataSequenceNumber> for MerkleTreeSequenceNumber {
71 fn from(seq: &InstructionDataSequenceNumber) -> Self {
72 Self {
73 tree_pubkey: seq.tree_pubkey,
74 queue_pubkey: seq.queue_pubkey,
75 tree_type: seq.tree_type.into(),
76 seq: seq.seq.into(),
77 }
78 }
79}