use crate::*;
pub fn handler(ctx: Context<NewMinter>) -> Result<()> {
let minter = &mut ctx.accounts.minter;
minter.mint_wrapper = ctx.accounts.auth.mint_wrapper.key();
minter.minter_authority = ctx.accounts.new_minter_authority.key();
minter.bump = unwrap_bump!(ctx, "minter");
let index = ctx.accounts.auth.mint_wrapper.num_minters;
minter.index = index;
let mint_wrapper = &mut ctx.accounts.auth.mint_wrapper;
mint_wrapper.num_minters = unwrap_int!(index.checked_add(1));
minter.allowance = 0;
minter.total_minted = 0;
emit!(NewMinterEvent {
mint_wrapper: minter.mint_wrapper,
minter: minter.key(),
index: minter.index,
minter_authority: minter.minter_authority,
});
Ok(())
}
#[derive(Accounts)]
pub struct NewMinter<'info> {
pub auth: OnlyAdmin<'info>,
pub new_minter_authority: UncheckedAccount<'info>,
#[account(
init,
seeds = [
b"MintWrapperMinter".as_ref(),
auth.mint_wrapper.key().to_bytes().as_ref(),
new_minter_authority.key().to_bytes().as_ref()
],
bump,
payer = payer,
space = 8 + Minter::LEN
)]
pub minter: Account<'info, Minter>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
}
impl<'info> Validate<'info> for NewMinter<'info> {
fn validate(&self) -> Result<()> {
self.auth.validate()?;
Ok(())
}
}