light_compressed_account/instruction_data/
traits.rs

1use std::fmt::Debug;
2
3use light_program_profiler::profile;
4use zerocopy::Ref;
5
6use super::{
7    compressed_proof::CompressedProof,
8    cpi_context::CompressedCpiContext,
9    zero_copy::{ZPackedMerkleContext, ZPackedReadOnlyAddress, ZPackedReadOnlyCompressedAccount},
10};
11use crate::{
12    compressed_account::CompressedAccountData, pubkey::Pubkey, AnchorSerialize,
13    CompressedAccountError,
14};
15
16pub trait InstructionDiscriminator {
17    fn discriminator(&self) -> &'static [u8];
18}
19
20pub trait LightInstructionData: InstructionDiscriminator + AnchorSerialize {
21    #[profile]
22    fn data(&self) -> Result<Vec<u8>, CompressedAccountError> {
23        let inputs = self
24            .try_to_vec()
25            .map_err(|_| CompressedAccountError::InvalidArgument)?;
26        let mut data = Vec::with_capacity(8 + inputs.len());
27        data.extend_from_slice(self.discriminator());
28        data.extend_from_slice(inputs.as_slice());
29        Ok(data)
30    }
31}
32
33pub trait InstructionData<'a> {
34    fn owner(&self) -> Pubkey;
35    fn new_addresses(&self) -> &[impl NewAddress<'a>];
36    fn input_accounts(&self) -> &[impl InputAccount<'a>];
37    fn output_accounts(&self) -> &[impl OutputAccount<'a>];
38    fn read_only_accounts(&self) -> Option<&[ZPackedReadOnlyCompressedAccount]>;
39    fn read_only_addresses(&self) -> Option<&[ZPackedReadOnlyAddress]>;
40    fn is_compress(&self) -> bool;
41    fn compress_or_decompress_lamports(&self) -> Option<u64>;
42    fn proof(&self) -> Option<Ref<&'a [u8], CompressedProof>>;
43    fn cpi_context(&self) -> Option<CompressedCpiContext>;
44    fn bump(&self) -> Option<u8>;
45    fn account_option_config(&self) -> Result<AccountOptions, CompressedAccountError>;
46    fn with_transaction_hash(&self) -> bool;
47}
48
49pub trait NewAddress<'a>
50where
51    Self: Debug,
52{
53    fn seed(&self) -> [u8; 32];
54    fn address_queue_index(&self) -> u8;
55    fn address_merkle_tree_account_index(&self) -> u8;
56    fn address_merkle_tree_root_index(&self) -> u16;
57    fn assigned_compressed_account_index(&self) -> Option<usize>;
58    fn owner(&self) -> Option<&[u8; 32]> {
59        None
60    }
61}
62
63pub trait InputAccount<'a>
64where
65    Self: Debug,
66{
67    fn owner(&self) -> &crate::pubkey::Pubkey;
68    fn lamports(&self) -> u64;
69    fn address(&self) -> Option<[u8; 32]>;
70    fn merkle_context(&self) -> ZPackedMerkleContext;
71    fn has_data(&self) -> bool;
72    fn data(&self) -> Option<CompressedAccountData>;
73    fn skip(&self) -> bool;
74    fn hash_with_hashed_values(
75        &self,
76        owner_hashed: &[u8; 32],
77        merkle_tree_hashed: &[u8; 32],
78        leaf_index: &u32,
79        is_batched: bool,
80    ) -> Result<[u8; 32], CompressedAccountError>;
81
82    fn root_index(&self) -> u16;
83}
84
85pub trait OutputAccount<'a>
86where
87    Self: Debug,
88{
89    fn lamports(&self) -> u64;
90    fn address(&self) -> Option<[u8; 32]>;
91    fn has_data(&self) -> bool;
92    fn skip(&self) -> bool;
93    fn data(&self) -> Option<CompressedAccountData>;
94    fn owner(&self) -> Pubkey;
95    fn merkle_tree_index(&self) -> u8;
96    fn hash_with_hashed_values(
97        &self,
98        owner_hashed: &[u8; 32],
99        merkle_tree_hashed: &[u8; 32],
100        leaf_index: &u32,
101        is_batched: bool,
102    ) -> Result<[u8; 32], CompressedAccountError>;
103}
104
105#[derive(Debug, Clone, Copy, PartialEq, Eq)]
106pub struct AccountOptions {
107    pub sol_pool_pda: bool,
108    pub decompression_recipient: bool,
109    pub cpi_context_account: bool,
110    pub write_to_cpi_context: bool,
111}