Skip to main content

cardinal_scanner/instructions/
init_event_entry.rs

1use {
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}