pub struct Token {
pub mint: Pubkey,
pub owner: Pubkey,
pub amount: u64,
pub delegate: Option<Pubkey>,
pub state: AccountState,
pub is_native: Option<u64>,
pub delegated_amount: u64,
pub close_authority: Option<Pubkey>,
pub account_type: u8,
pub extensions: Option<Vec<ExtensionStruct>>,
}Expand description
Ctoken account structure (same as SPL Token Account but with extensions). Ctokens are solana accounts, compressed tokens are stored as TokenData that is optimized for compressed accounts.
Fields§
§mint: PubkeyThe mint associated with this account
owner: PubkeyThe owner of this account.
amount: u64The amount of tokens this account holds.
delegate: Option<Pubkey>If delegate is Some then delegated_amount represents
the amount authorized by the delegate
state: AccountStateThe account’s state
is_native: Option<u64>If is_some, this is a native token, and the value logs the rent-exempt
reserve. An Account is required to be rent-exempt, so the value is
used by the Processor to ensure that wrapped SOL accounts do not
drop below this threshold.
delegated_amount: u64The amount delegated
Optional authority to close the account.
account_type: u8Account type discriminator (at byte 165 when extensions present). For valid Token accounts this is ACCOUNT_TYPE_TOKEN_ACCOUNT (2).
extensions: Option<Vec<ExtensionStruct>>Extensions for the token account (including compressible config)
Implementations§
Source§impl Token
impl Token
Sourcepub fn amount_from_slice(data: &[u8]) -> Result<u64, ZeroCopyError>
pub fn amount_from_slice(data: &[u8]) -> Result<u64, ZeroCopyError>
Extract amount directly from account data slice using hardcoded offset Token layout: mint (32 bytes) + owner (32 bytes) + amount (8 bytes)
Sourcepub fn is_initialized(&self) -> bool
pub fn is_initialized(&self) -> bool
Checks if account is initialized
Sourcepub fn account_type(&self) -> u8
pub fn account_type(&self) -> u8
Returns the account type discriminator
Sourcepub fn is_token_account(&self) -> bool
pub fn is_token_account(&self) -> bool
Checks if account_type matches Token discriminator value
Source§impl Token
impl Token
Sourcepub fn zero_copy_at_checked(
bytes: &[u8],
) -> Result<(ZToken<'_>, &[u8]), TokenError>
pub fn zero_copy_at_checked( bytes: &[u8], ) -> Result<(ZToken<'_>, &[u8]), TokenError>
Zero-copy deserialization with initialization and account_type check. Returns an error if:
- Account is uninitialized (byte 108 == 0)
- Account type is not ACCOUNT_TYPE_TOKEN_ACCOUNT (byte 165 != 2) Allows both Initialized (1) and Frozen (2) states.
Sourcepub fn zero_copy_at_mut_checked(
bytes: &mut [u8],
) -> Result<(ZTokenMut<'_>, &mut [u8]), TokenError>
pub fn zero_copy_at_mut_checked( bytes: &mut [u8], ) -> Result<(ZTokenMut<'_>, &mut [u8]), TokenError>
Mutable zero-copy deserialization with initialization and account_type check. Returns an error if:
- Account is uninitialized (state == 0)
- Account type is not ACCOUNT_TYPE_TOKEN_ACCOUNT
Sourcepub fn from_account_info_checked<'a>(
account_info: &AccountInfo,
) -> Result<ZToken<'a>, TokenError>
pub fn from_account_info_checked<'a>( account_info: &AccountInfo, ) -> Result<ZToken<'a>, TokenError>
Deserialize a Token from account info with validation using zero-copy.
Checks:
- Account is owned by the CTOKEN program
- Account is initialized (state != 0)
- Account type is ACCOUNT_TYPE_TOKEN_ACCOUNT (byte 165 == 2)
- No trailing bytes after the Token structure
Safety: The returned ZToken references the account data which is valid for the duration of the transaction. The caller must ensure the account is not modified through other means while this reference exists.
Sourcepub fn from_account_info_mut_checked<'a>(
account_info: &AccountInfo,
) -> Result<ZTokenMut<'a>, TokenError>
pub fn from_account_info_mut_checked<'a>( account_info: &AccountInfo, ) -> Result<ZTokenMut<'a>, TokenError>
Mutable version of from_account_info_checked. Deserialize a Token from account info with validation using zero-copy.
Checks:
- Account is owned by the CTOKEN program
- Account is initialized (state != 0)
- Account type is ACCOUNT_TYPE_TOKEN_ACCOUNT (byte 165 == 2)
- No trailing bytes after the Token structure
Trait Implementations§
Source§impl BorshDeserialize for Token
impl BorshDeserialize for Token
fn deserialize_reader<R>(buf: &mut R) -> Result<Token, Error>where
R: Read,
Source§fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>
fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>
Source§fn try_from_slice(v: &[u8]) -> Result<Self, Error>
fn try_from_slice(v: &[u8]) -> Result<Self, Error>
fn try_from_reader<R>(reader: &mut R) -> Result<Self, Error>where
R: Read,
Source§impl BorshSerialize for Token
impl BorshSerialize for Token
Source§impl<'a> ZeroCopyAt<'a> for Token
impl<'a> ZeroCopyAt<'a> for Token
type ZeroCopyAt = ZToken<'a>
fn zero_copy_at( bytes: &'a [u8], ) -> Result<(<Token as ZeroCopyAt<'a>>::ZeroCopyAt, &'a [u8]), ZeroCopyError>
Source§impl<'a> ZeroCopyAtMut<'a> for Token
impl<'a> ZeroCopyAtMut<'a> for Token
type ZeroCopyAtMut = ZTokenMut<'a>
fn zero_copy_at_mut( bytes: &'a mut [u8], ) -> Result<(<Token as ZeroCopyAtMut<'a>>::ZeroCopyAtMut, &'a mut [u8]), ZeroCopyError>
Source§impl<'a> ZeroCopyNew<'a> for Token
impl<'a> ZeroCopyNew<'a> for Token
Source§type ZeroCopyConfig = TokenConfig
type ZeroCopyConfig = TokenConfig
Source§fn byte_len(
config: &<Token as ZeroCopyNew<'a>>::ZeroCopyConfig,
) -> Result<usize, ZeroCopyError>
fn byte_len( config: &<Token as ZeroCopyNew<'a>>::ZeroCopyConfig, ) -> Result<usize, ZeroCopyError>
Source§fn new_zero_copy(
bytes: &'a mut [u8],
config: <Token as ZeroCopyNew<'a>>::ZeroCopyConfig,
) -> Result<(<Token as ZeroCopyNew<'a>>::Output, &'a mut [u8]), ZeroCopyError>
fn new_zero_copy( bytes: &'a mut [u8], config: <Token as ZeroCopyNew<'a>>::ZeroCopyConfig, ) -> Result<(<Token as ZeroCopyNew<'a>>::Output, &'a mut [u8]), ZeroCopyError>
impl Eq for Token
impl StructuralPartialEq for Token
Auto Trait Implementations§
impl Freeze for Token
impl RefUnwindSafe for Token
impl Send for Token
impl Sync for Token
impl Unpin for Token
impl UnwindSafe for Token
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> HashToFieldSize for Twhere
T: BorshSerialize,
impl<T> HashToFieldSize for Twhere
T: BorshSerialize,
fn hash_to_field_size(&self) -> Result<[u8; 32], HasherError>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.