Skip to main content

light_verifier_sdk/
state.rs

1use std::{marker::PhantomData, mem};
2
3use aligned_sized::aligned_sized;
4use anchor_lang::prelude::*;
5
6use crate::light_transaction::Config;
7
8/// Verifier state is a boiler plate struct which should be versatile enough to serve many use cases.
9/// For specialized use cases with less
10#[derive(AnchorDeserialize, AnchorSerialize, Clone, Debug)]
11#[aligned_sized(anchor)]
12pub struct VerifierState10Ins<
13    const NR_CHECKED_INPUTS: usize,
14    const NR_LEAVES: usize,
15    const NR_NULLIFIERS: usize,
16    T: Config,
17> {
18    pub signer: Pubkey,
19    // TODO(vadorovsky): Use an array.
20    #[size = NR_NULLIFIERS * mem::size_of::<[u8; 32]>()]
21    pub nullifiers: Vec<[u8; 32]>,
22    // TODO(vadorovsky): Use an array.
23    #[size = NR_LEAVES * mem::size_of::<[u8; 32]>()]
24    pub leaves: Vec<[u8; 32]>,
25    pub public_amount_spl: [u8; 32],
26    pub public_amount_sol: [u8; 32],
27    pub mint_pubkey: [u8; 32],
28    pub merkle_root: [u8; 32],
29    pub tx_integrity_hash: [u8; 32],
30    pub relayer_fee: u64,
31    // TODO(vadorovsky): Use an array.
32    // NOTE(vadorovsky): We are probably facing some anchor/borsh/bytemuch bug
33    // here. We are always passing no more than 512 bytes, but for some reason,
34    // allocating less than 1.5kb results in "cannot deserialize account"
35    // errors.
36    #[size = 1536 * mem::size_of::<u8>()]
37    pub encrypted_utxos: Vec<u8>,
38    pub merkle_root_index: u64,
39    pub checked_public_inputs: [[u8; 32]; NR_CHECKED_INPUTS],
40    pub proof_a: [u8; 64],
41    pub proof_b: [u8; 128],
42    pub proof_c: [u8; 64],
43    pub transaction_hash: [u8; 32],
44    pub e_phantom: PhantomData<T>,
45}
46
47impl<
48        const NR_CHECKED_INPUTS: usize,
49        const NR_LEAVES: usize,
50        const NR_NULLIFIERS: usize,
51        T: Config,
52    > anchor_lang::AccountDeserialize
53    for VerifierState10Ins<NR_CHECKED_INPUTS, NR_LEAVES, NR_NULLIFIERS, T>
54{
55    fn try_deserialize_unchecked(buf: &mut &[u8]) -> Result<Self> {
56        match VerifierState10Ins::deserialize(buf) {
57            Ok(v) => Ok(v),
58            Err(_) => err!(anchor_lang::error::ErrorCode::AccountDidNotDeserialize),
59        }
60    }
61}
62
63impl<
64        const NR_CHECKED_INPUTS: usize,
65        const NR_LEAVES: usize,
66        const NR_NULLIFIERS: usize,
67        T: Config,
68    > anchor_lang::AccountSerialize
69    for VerifierState10Ins<NR_CHECKED_INPUTS, NR_LEAVES, NR_NULLIFIERS, T>
70{
71    fn try_serialize<W: std::io::Write>(&self, writer: &mut W) -> Result<()> {
72        self.serialize(writer).unwrap();
73        match self.serialize(writer) {
74            Ok(_) => Ok(()),
75            Err(_) => err!(anchor_lang::error::ErrorCode::AccountDidNotSerialize),
76        }
77    }
78}
79
80impl<
81        const NR_CHECKED_INPUTS: usize,
82        const NR_LEAVES: usize,
83        const NR_NULLIFIERS: usize,
84        T: Config,
85    > anchor_lang::Owner for VerifierState10Ins<NR_CHECKED_INPUTS, NR_LEAVES, NR_NULLIFIERS, T>
86{
87    fn owner() -> Pubkey {
88        T::ID
89    }
90}
91
92#[derive(AnchorDeserialize, AnchorSerialize, Clone, Debug)]
93pub struct TransactionIndexerEvent {
94    pub leaves: Vec<[u8; 32]>,
95    pub public_amount_spl: [u8; 32],
96    pub public_amount_sol: [u8; 32],
97    pub relayer_fee: u64,
98    pub encrypted_utxos: Vec<u8>,
99    pub nullifiers: Vec<[u8; 32]>,
100    pub first_leaf_index: u64,
101    pub message: Vec<u8>,
102}