use anchor_lang::prelude::*;
use anchor_lang::solana_program::pubkey::PUBKEY_BYTES;
use anchor_lang::solana_program::program_memory::sol_memcmp;
use anchor_spl::associated_token::get_associated_token_address;
use crate::error::TentaClesError;
use crate::MemberInfo;
pub fn cmp_pubkeys(a: &Pubkey, b: &Pubkey) -> bool {
sol_memcmp(a.as_ref(), b.as_ref(), PUBKEY_BYTES) == 0
}
pub fn assert_ata(
account: &AccountInfo,
target: &Pubkey,
mint: &Pubkey,
err: Option<TentaClesError>,
) -> Result<()> {
let ata = get_associated_token_address(target, mint);
if !cmp_pubkeys(&ata, account.key) {
match err {
Some(e) => Err(e.into()),
None => Err(TentaClesError::InvalidArgument.into()),
}
} else {
Ok(())
}
}
pub fn assert_ata_for_pubkey(
member_token_account: &Pubkey,
member: &Pubkey,
mint: &Pubkey,
err: Option<TentaClesError>,
) -> Result<()> {
let ata = get_associated_token_address(member, mint);
if !cmp_pubkeys(&ata, member_token_account) {
match err {
Some(e) => Err(e.into()),
None => Err(TentaClesError::InvalidArgument.into()),
}
} else {
Ok(())
}
}
pub fn assert_ata_for_keys(
wallet_token_account: &Pubkey,
wallet: &Pubkey,
mint: &Pubkey,
err: Option<TentaClesError>,
) -> Result<()> {
let ata = get_associated_token_address(wallet, mint);
if !cmp_pubkeys(&ata, wallet_token_account) {
match err {
Some(e) => Err(e.into()),
None => Err(TentaClesError::InvalidArgument.into()),
}
} else {
Ok(())
}
}
pub fn assert_members_length(members: &Vec<MemberInfo>, max_length: usize, err: Option<TentaClesError>) -> Result<()> {
if members.len() == max_length {
match err {
Some(e) => Err(e.into()),
None => Err(error!(TentaClesError::MaxMembersReached)),
}
} else {
Ok(())
}
}
pub fn assert_available_shares(total_available_shares: u64, shares: u64, err: Option<TentaClesError>) -> Result<()> {
if shares > total_available_shares {
match err {
Some(e) => Err(e.into()),
None => Err(error!(TentaClesError::NotEnoughAvailableShares)),
}
} else {
Ok(())
}
}