tentacles 0.1.1

Client for the tentacles program
Documentation
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_derivation(
//     program_id: &Pubkey,
//     account: &AccountInfo,
//     path: &[&[u8]],
//     error: Option<TentaClesError>,
// ) -> Result<u8> {
//     let (key, bump) = Pubkey::find_program_address(&path, program_id);
//     if !cmp_pubkeys(&key, account.key) {
//         if error.is_some() {
//             let err = error.unwrap();
//             msg!("Derivation {:?}", err);
//             return Err(err.into());
//         }
//         msg!("DerivedKeyInvalid");
//         return Err(TentaClesError::DerivedKeyInvalid.into());
//     }
//     Ok(bump)
// }

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(())
    }
}