1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use {
    crate::{errors::ErrorCode, state::*},
    anchor_lang::prelude::*,
    anchor_spl::token::TokenAccount,
};

pub fn assert_payment_token_account(token_account: &Account<TokenAccount>, token_manager: &Account<TokenManager>, remaining_accounts: &mut std::slice::Iter<AccountInfo>) -> Result<()> {
    if token_manager.receipt_mint.is_none() {
        if token_account.owner != token_manager.issuer {
            return Err(error!(ErrorCode::InvalidIssuer));
        }
    } else {
        let receipt_token_account_info = next_account_info(remaining_accounts)?;
        let receipt_token_account = Account::<TokenAccount>::try_from(receipt_token_account_info)?;
        if !(receipt_token_account.mint == token_manager.receipt_mint.expect("No receipt mint") && receipt_token_account.amount > 0) {
            return Err(error!(ErrorCode::InvalidReceiptMint));
        }
        if receipt_token_account.owner != token_account.owner {
            return Err(error!(ErrorCode::InvalidReceiptMintOwner));
        }
    }
    Ok(())
}