steel 4.0.9

Solana smart contract framework
Documentation
use solana_program::{program_option::COption, pubkey::Pubkey};

pub enum TokenAccount {
    V0(spl_token::state::Account),
    V1(spl_token_2022::state::Account),
}

impl TokenAccount {
    pub fn mint(&self) -> Pubkey {
        match self {
            TokenAccount::V0(account) => account.mint,
            TokenAccount::V1(account) => account.mint,
        }
    }

    pub fn owner(&self) -> Pubkey {
        match self {
            TokenAccount::V0(account) => account.owner,
            TokenAccount::V1(account) => account.owner,
        }
    }

    pub fn amount(&self) -> u64 {
        match self {
            TokenAccount::V0(account) => account.amount,
            TokenAccount::V1(account) => account.amount,
        }
    }

    pub fn delegate(&self) -> COption<Pubkey> {
        match self {
            TokenAccount::V0(account) => account.delegate,
            TokenAccount::V1(account) => account.delegate,
        }
    }

    pub fn is_frozen(&self) -> bool {
        match self {
            TokenAccount::V0(account) => account.is_frozen(),
            TokenAccount::V1(account) => account.is_frozen(),
        }
    }

    pub fn is_native(&self) -> COption<u64> {
        match self {
            TokenAccount::V0(account) => account.is_native,
            TokenAccount::V1(account) => account.is_native,
        }
    }

    pub fn delegated_amount(&self) -> u64 {
        match self {
            TokenAccount::V0(account) => account.delegated_amount,
            TokenAccount::V1(account) => account.delegated_amount,
        }
    }

    pub fn close_authority(&self) -> COption<Pubkey> {
        match self {
            TokenAccount::V0(account) => account.close_authority,
            TokenAccount::V1(account) => account.close_authority,
        }
    }
}