#[repr(C)]pub struct TokenData {
pub mint: Pubkey,
pub owner: Pubkey,
pub amount: u64,
pub delegate: Option<Pubkey>,
pub state: u8,
pub tlv: Option<Vec<ExtensionStruct>>,
}Expand description
TokenData of Compressed Tokens.
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: u8The account’s state
tlv: Option<Vec<ExtensionStruct>>Extensions for the compressed token account
Implementations§
Source§impl TokenData
Hashing schema: H(mint, owner, amount, delegate, delegated_amount,
is_native, state)
impl TokenData
Hashing schema: H(mint, owner, amount, delegate, delegated_amount, is_native, state)
delegate, delegated_amount, is_native and state have dynamic positions. Always hash mint, owner and amount If delegate hash delegate and delegated_amount together. If is native hash is_native else is omitted. If frozen hash AccountState::Frozen else is omitted.
Security: to prevent the possibility that different fields with the same value to result in the same hash we add a prefix to the delegated amount, is native and state fields. This way we can have a dynamic hashing schema and hash only used values.
Sourcepub fn is_native(&self) -> bool
pub fn is_native(&self) -> bool
Only the spl representation of native tokens (wrapped SOL) is compressed. The sol value is stored in the token pool account. The sol value in the compressed account is independent from the wrapped sol amount.
pub fn hash_with_hashed_values( hashed_mint: &[u8; 32], hashed_owner: &[u8; 32], amount_bytes: &[u8; 32], hashed_delegate: &Option<&[u8; 32]>, ) -> Result<[u8; 32], HasherError>
pub fn hash_frozen_with_hashed_values( hashed_mint: &[u8; 32], hashed_owner: &[u8; 32], amount_bytes: &[u8; 32], hashed_delegate: &Option<&[u8; 32]>, ) -> Result<[u8; 32], HasherError>
Sourcepub fn hash_inputs_with_hashed_values<const FROZEN_INPUTS: bool>(
mint: &[u8; 32],
owner: &[u8; 32],
amount_bytes: &[u8],
hashed_delegate: &Option<&[u8; 32]>,
) -> Result<[u8; 32], HasherError>
pub fn hash_inputs_with_hashed_values<const FROZEN_INPUTS: bool>( mint: &[u8; 32], owner: &[u8; 32], amount_bytes: &[u8], hashed_delegate: &Option<&[u8; 32]>, ) -> Result<[u8; 32], HasherError>
We should not hash pubkeys multiple times. For all we can assume mints are equal. For all input compressed accounts we assume owners are equal.
Source§impl TokenData
impl TokenData
Sourcepub fn hash_sha_flat(&self) -> Result<[u8; 32], HasherError>
pub fn hash_sha_flat(&self) -> Result<[u8; 32], HasherError>
TokenDataVersion 3 CompressedAccount Discriminator [0,0,0,0,0,0,0,4]
Sourcepub fn hash_v2(&self) -> Result<[u8; 32], HasherError>
pub fn hash_v2(&self) -> Result<[u8; 32], HasherError>
Hashes token data of token accounts.
Note, hashing changed for token account data in batched Merkle trees. For hashing of token account data stored in concurrent Merkle trees use hash_v1(). TokenDataVersion 2 CompressedAccount Discriminator [0,0,0,0,0,0,0,3]
Source§impl TokenData
impl TokenData
pub fn state(&self) -> Result<CompressedTokenAccountState, TokenError>
Trait Implementations§
Source§impl BorshDeserialize for TokenData
impl BorshDeserialize for TokenData
fn deserialize_reader<R: Read>(reader: &mut R) -> Result<Self, Error>
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 TokenDatawhere
Pubkey: BorshSerialize,
u64: BorshSerialize,
Option<Pubkey>: BorshSerialize,
u8: BorshSerialize,
Option<Vec<ExtensionStruct>>: BorshSerialize,
impl BorshSerialize for TokenDatawhere
Pubkey: BorshSerialize,
u64: BorshSerialize,
Option<Pubkey>: BorshSerialize,
u8: BorshSerialize,
Option<Vec<ExtensionStruct>>: BorshSerialize,
Source§impl<'a> ZeroCopyAt<'a> for TokenData
impl<'a> ZeroCopyAt<'a> for TokenData
type ZeroCopyAt = ZTokenData<'a>
fn zero_copy_at( __remaining_bytes: &'a [u8], ) -> Result<(Self::ZeroCopyAt, &'a [u8]), ZeroCopyError>
Source§impl<'a> ZeroCopyAtMut<'a> for TokenData
impl<'a> ZeroCopyAtMut<'a> for TokenData
type ZeroCopyAtMut = ZTokenDataMut<'a>
fn zero_copy_at_mut( __remaining_bytes: &'a mut [u8], ) -> Result<(Self::ZeroCopyAtMut, &'a mut [u8]), ZeroCopyError>
Source§impl<'a> ZeroCopyNew<'a> for TokenData
impl<'a> ZeroCopyNew<'a> for TokenData
Source§type ZeroCopyConfig = TokenDataConfig
type ZeroCopyConfig = TokenDataConfig
Source§type Output = <TokenData as ZeroCopyAtMut<'a>>::ZeroCopyAtMut
type Output = <TokenData as ZeroCopyAtMut<'a>>::ZeroCopyAtMut
Source§fn byte_len(config: &Self::ZeroCopyConfig) -> Result<usize, ZeroCopyError>
fn byte_len(config: &Self::ZeroCopyConfig) -> Result<usize, ZeroCopyError>
Source§fn new_zero_copy(
__remaining_bytes: &'a mut [u8],
config: Self::ZeroCopyConfig,
) -> Result<(Self::Output, &'a mut [u8]), ZeroCopyError>
fn new_zero_copy( __remaining_bytes: &'a mut [u8], config: Self::ZeroCopyConfig, ) -> Result<(Self::Output, &'a mut [u8]), ZeroCopyError>
Source§impl ZeroCopyStructInner for TokenData
impl ZeroCopyStructInner for TokenData
type ZeroCopyInner = ZTokenData<'static>
Source§impl ZeroCopyStructInnerMut for TokenData
impl ZeroCopyStructInnerMut for TokenData
type ZeroCopyInnerMut = ZTokenDataMut<'static>
impl Eq for TokenData
impl StructuralPartialEq for TokenData
Auto Trait Implementations§
impl Freeze for TokenData
impl RefUnwindSafe for TokenData
impl Send for TokenData
impl Sync for TokenData
impl Unpin for TokenData
impl UnwindSafe for TokenData
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<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 more