use rpc::{Rpc, RpcError};
use rpc_client::RpcClient;
use solana_program::program_pack::Pack;
use tape_api::utils::ata;
use tape_core::types::coin::{SOL, TAPE};
use tape_crypto::prelude::Address;
use crate::error::TapedriveError;
pub async fn sol_balance_of<Blockchain: Rpc>(
rpc: &RpcClient<Blockchain>,
address: &Address,
) -> Result<SOL, TapedriveError> {
match rpc.rpc().get_account(address).await {
Ok(account) => Ok(SOL(account.lamports)),
Err(RpcError::AccountNotFound(_)) => Ok(SOL(0)),
Err(error) => Err(error.into()),
}
}
pub async fn tape_balance_of<Blockchain: Rpc>(
rpc: &RpcClient<Blockchain>,
owner: &Address,
) -> Result<TAPE, TapedriveError> {
match rpc.rpc().get_account(&ata(owner)).await {
Ok(account) => spl_token::state::Account::unpack(&account.data)
.map(|token_account| TAPE(token_account.amount))
.map_err(|error| TapedriveError::Encoding(format!("token account: {error}"))),
Err(RpcError::AccountNotFound(_)) => Ok(TAPE(0)),
Err(error) => Err(error.into()),
}
}