cardinal_scanner/instructions/
init_event_entry.rs1use {
2 crate::{errors::ErrorCode, state::*},
3 anchor_lang::prelude::*,
4 anchor_spl::token::{Mint, TokenAccount},
5};
6
7#[derive(Accounts)]
8pub struct InitEventEntryCtx<'info> {
9 #[account(
10 init,
11 payer = payer,
12 space = EVENT_ENTRY_SIZE,
13 seeds = [EVENT_ENTRY_SEED_PREFIX.as_bytes(), event.key().as_ref(), mint.key().as_ref()],
14 bump
15 )]
16 event_entry: Account<'info, EventEntry>,
17 event: Box<Account<'info, Event>>,
18 mint: Box<Account<'info, Mint>>,
19 #[account(mut, constraint = mint_token_account.mint == mint.key() && mint_token_account.amount > 0 @ ErrorCode::InvalidAuthority)]
20 mint_token_account: Box<Account<'info, TokenAccount>>,
21 #[account(mut, constraint = authority.key() == event.authority || mint_token_account.owner == authority.key() @ ErrorCode::InvalidAuthority)]
22 authority: Signer<'info>,
23
24 #[account(mut)]
25 payer: Signer<'info>,
26 #[account(mut)]
27 user: Signer<'info>,
28 system_program: Program<'info, System>,
29}
30
31pub fn handler(ctx: Context<InitEventEntryCtx>) -> Result<()> {
32 let event_entry = &mut ctx.accounts.event_entry;
33 event_entry.bump = *ctx.bumps.get("event_entry").unwrap();
34 event_entry.event = ctx.accounts.event.key();
35 event_entry.mint = ctx.accounts.mint.key();
36 event_entry.user = ctx.accounts.user.key();
37 event_entry.last_used_timestamp = Clock::get().unwrap().unix_timestamp;
38
39 Ok(())
40}