solana_zk_token_sdk/
zk_token_proof_state.rs1use {
2 crate::{zk_token_elgamal::pod::PodProofType, zk_token_proof_instruction::ProofType},
3 bytemuck::{bytes_of, Pod, Zeroable},
4 num_traits::ToPrimitive,
5 solana_instruction::error::{InstructionError, InstructionError::InvalidAccountData},
6 solana_pubkey::Pubkey,
7 std::mem::size_of,
8};
9
10#[derive(Clone, Copy, Debug, PartialEq)]
12#[repr(C)]
13pub struct ProofContextState<T: Pod> {
14 pub context_state_authority: Pubkey,
16 pub proof_type: PodProofType,
18 pub proof_context: T,
20}
21
22unsafe impl<T: Pod> Zeroable for ProofContextState<T> {}
27unsafe impl<T: Pod> Pod for ProofContextState<T> {}
28
29impl<T: Pod> ProofContextState<T> {
30 pub fn encode(
31 context_state_authority: &Pubkey,
32 proof_type: ProofType,
33 proof_context: &T,
34 ) -> Vec<u8> {
35 let mut buf = Vec::with_capacity(size_of::<Self>());
36 buf.extend_from_slice(context_state_authority.as_ref());
37 buf.push(ToPrimitive::to_u8(&proof_type).unwrap());
38 buf.extend_from_slice(bytes_of(proof_context));
39 buf
40 }
41
42 pub fn try_from_bytes(input: &[u8]) -> Result<&Self, InstructionError> {
48 bytemuck::try_from_bytes(input).map_err(|_| InvalidAccountData)
49 }
50}
51
52#[derive(Clone, Copy, Debug, PartialEq, bytemuck_derive::Pod, bytemuck_derive::Zeroable)]
55#[repr(C)]
56pub struct ProofContextStateMeta {
57 pub context_state_authority: Pubkey,
59 pub proof_type: PodProofType,
61}
62
63impl ProofContextStateMeta {
64 pub fn try_from_bytes(input: &[u8]) -> Result<&Self, InstructionError> {
65 input
66 .get(..size_of::<ProofContextStateMeta>())
67 .and_then(|data| bytemuck::try_from_bytes(data).ok())
68 .ok_or(InvalidAccountData)
69 }
70}