use anchor_lang::prelude::*;
use borsh::{BorshDeserialize, BorshSerialize};
#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)]
pub struct PublicTransactionEvent {
pub input_compressed_account_hashes: Vec<[u8; 32]>,
pub output_compressed_account_hashes: Vec<[u8; 32]>,
pub input_compressed_accounts: Vec<CompressedAccountWithMerkleContext>,
pub output_compressed_accounts: Vec<CompressedAccount>,
pub output_state_merkle_tree_account_indices: Vec<u8>,
pub output_leaf_indices: Vec<u32>,
pub relay_fee: Option<u64>,
pub is_compress: bool,
pub de_compress_amount: Option<u64>,
pub pubkey_array: Vec<Pubkey>,
pub message: Option<Vec<u8>>,
}
#[derive(Debug, PartialEq, Default, Clone, AnchorSerialize, AnchorDeserialize)]
pub struct CompressedAccountWithMerkleContext {
pub compressed_account: CompressedAccount,
pub merkle_tree_pubkey_index: u8,
pub nullifier_queue_pubkey_index: u8,
pub leaf_index: u32,
}
#[derive(Debug, PartialEq, Default, Clone, AnchorSerialize, AnchorDeserialize)]
pub struct CompressedAccount {
pub owner: Pubkey,
pub lamports: u64,
pub address: Option<[u8; 32]>,
pub data: Option<CompressedAccountData>,
}
#[derive(Debug, PartialEq, Default, Clone, AnchorSerialize, AnchorDeserialize)]
pub struct CompressedAccountData {
pub discriminator: [u8; 8],
pub data: Vec<u8>,
pub data_hash: [u8; 32],
}
#[derive(BorshDeserialize, BorshSerialize, Debug)]
pub struct Changelogs {
pub changelogs: Vec<ChangelogEvent>,
}
#[derive(BorshDeserialize, BorshSerialize, Debug)]
#[repr(C)]
pub enum ChangelogEvent {
V1(ChangelogEventV1),
}
#[derive(BorshDeserialize, BorshSerialize, Debug, Clone)]
pub struct PathNode {
pub node: [u8; 32],
pub index: u32,
}
#[derive(BorshDeserialize, BorshSerialize, Debug)]
pub struct ChangelogEventV1 {
pub id: [u8; 32],
pub paths: Vec<Vec<PathNode>>,
pub seq: u64,
pub index: u32,
}