hydra/processors/init/
init_for_mint.rs1use crate::error::HydraError;
2use crate::state::{Fanout, FanoutMint};
3use crate::utils::validation::assert_ata;
4use anchor_lang::prelude::*;
5use anchor_spl::token::{Mint, TokenAccount};
6
7#[derive(Accounts)]
8#[instruction(bump_seed: u8)]
9pub struct InitializeFanoutForMint<'info> {
10 #[account(mut)]
11 pub authority: Signer<'info>,
12 #[account(
13 mut,
14 seeds = [b"fanout-config", fanout.name.as_bytes()],
15 has_one = authority,
16 bump = fanout.bump_seed,
17 )]
18 pub fanout: Account<'info, Fanout>,
19 #[account(
20 init,
21 payer= authority,
22 space = 200,
23 seeds = [b"fanout-config", fanout.key().as_ref(), mint.key().as_ref()],
24 bump
25 )]
26 pub fanout_for_mint: Account<'info, FanoutMint>,
27 #[account(
28 mut,
29 constraint = mint_holding_account.owner == fanout.key(),
30 constraint = mint_holding_account.delegate.is_none(),
31 constraint = mint_holding_account.close_authority.is_none(),
32 constraint = mint_holding_account.is_native() == false,
33 constraint = mint_holding_account.mint == mint.key(),
34 )
35 ]
36 pub mint_holding_account: Account<'info, TokenAccount>,
37 pub mint: Account<'info, Mint>,
38 pub system_program: Program<'info, System>,
39 pub rent: Sysvar<'info, Rent>,
40}
41
42pub fn init_for_mint(ctx: Context<InitializeFanoutForMint>, bump_seed: u8) -> Result<()> {
43 let fanout_mint = &mut ctx.accounts.fanout_for_mint;
44 let fanout = &ctx.accounts.fanout;
45 let mint_holding_account = &ctx.accounts.mint_holding_account;
46 fanout_mint.fanout = fanout.to_account_info().key();
47 fanout_mint.total_inflow = mint_holding_account.amount;
48 fanout_mint.last_snapshot_amount = mint_holding_account.amount;
49 fanout_mint.bump_seed = bump_seed;
50 fanout_mint.mint = ctx.accounts.mint.to_account_info().key();
51 assert_ata(
52 &mint_holding_account.to_account_info(),
53 &fanout.key(),
54 &ctx.accounts.mint.key(),
55 Some(HydraError::HoldingAccountMustBeAnATA.into()),
56 )?;
57 fanout_mint.token_account = mint_holding_account.to_account_info().key();
58 Ok(())
59}