hydra/processors/init/
init_for_mint.rs

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