1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use anchor_lang::prelude::*;

use crate::{
    event_merkle_tree::EventMerkleTree, utils::constants::EVENT_MERKLE_TREE_SEED,
    RegisteredVerifier,
};

#[derive(Accounts)]
#[instruction(
    leaf_left: [u8; 32],
    leaf_right: [u8; 32],
)]
pub struct InsertTwoLeavesEvent<'info> {
    #[account(
        mut,
        seeds = [__program_id.to_bytes().as_ref()],
        bump,
        seeds::program = registered_verifier.pubkey,
    )]
    pub authority: Signer<'info>,
    #[account(mut, seeds = [
        EVENT_MERKLE_TREE_SEED,
        event_merkle_tree.load().unwrap().merkle_tree_nr.to_le_bytes().as_ref()
    ], bump)]
    pub event_merkle_tree: AccountLoader<'info, EventMerkleTree>,
    pub system_program: Program<'info, System>,
    #[account(
        seeds = [&registered_verifier.pubkey.to_bytes()],
        bump,
    )]
    pub registered_verifier: Account<'info, RegisteredVerifier>,
}

pub fn process_insert_two_leaves_event(
    ctx: Context<InsertTwoLeavesEvent>,
    leaf_left: [u8; 32],
    leaf_right: [u8; 32],
) -> Result<()> {
    let mut merkle_tree = ctx.accounts.event_merkle_tree.load_mut()?;
    merkle_tree.merkle_tree.insert(leaf_left, leaf_right);
    Ok(())
}