light_compressed_account/instruction_data/
traits.rs1use 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}