cardinal-use-invalidator 1.4.1

Cardinal usage invalidator and counter
Documentation
use {
    crate::state::*,
    anchor_lang::prelude::*,
    cardinal_token_manager::state::{TokenManager, TokenManagerState},
};

#[derive(AnchorSerialize, AnchorDeserialize)]
pub struct InitIx {
    pub collector: Pubkey,
    pub payment_manager: Pubkey,
    pub total_usages: Option<u64>,
    pub max_usages: Option<u64>,
    pub use_authority: Option<Pubkey>,
    pub extension_payment_amount: Option<u64>,
    pub extension_payment_mint: Option<Pubkey>,
    pub extension_usages: Option<u64>,
}

#[derive(Accounts)]
pub struct InitCtx<'info> {
    token_manager: Box<Account<'info, TokenManager>>,

    #[account(
        init_if_needed,
        payer = payer,
        space = USE_INVALIDATOR_SIZE,
        seeds = [USE_INVALIDATOR_SEED.as_bytes(), token_manager.key().as_ref()], bump,
    )]
    use_invalidator: Box<Account<'info, UseInvalidator>>,

    #[account(mut)]
    issuer: Signer<'info>,
    #[account(mut)]
    payer: Signer<'info>,
    system_program: Program<'info, System>,
}

pub fn handler(ctx: Context<InitCtx>, ix: InitIx) -> Result<()> {
    let use_invalidator = &mut ctx.accounts.use_invalidator;
    use_invalidator.bump = *ctx.bumps.get("use_invalidator").unwrap();
    use_invalidator.token_manager = ctx.accounts.token_manager.key();
    use_invalidator.collector = ix.collector;
    use_invalidator.payment_manager = ix.payment_manager;
    if ctx.accounts.token_manager.state == TokenManagerState::Initialized as u8 && ctx.accounts.issuer.key() == ctx.accounts.token_manager.issuer {
        use_invalidator.usages = 0;
        use_invalidator.total_usages = ix.total_usages;
        use_invalidator.max_usages = ix.max_usages;
        use_invalidator.use_authority = ix.use_authority;
        use_invalidator.extension_payment_amount = ix.extension_payment_amount;
        use_invalidator.extension_payment_mint = ix.extension_payment_mint;
        use_invalidator.extension_usages = ix.extension_usages;
    }
    Ok(())
}