O que são Token Extensions?
O Token Extensions Program (Token 2022) fornece mais recursos através de instruções extras conhecidas como extensões. Extensions são recursos opcionais que você pode adicionar a um mint account ou token account. Você pode encontrar a implementação dessas instruções de extensão no código-fonte do Token Extensions Program.
Cada extensão adiciona um estado específico que geralmente é inicializado durante a criação da cunhagem ou do token account. Ao inicializar qualquer uma das contas, você pode habilitar extensões específicas simultaneamente para diferentes funcionalidades. A maioria das extensões não pode ser adicionada após a inicialização de uma conta. Esta é uma consideração importante ao projetar seu token, pois você precisará planejar com antecedência quais recursos deseja que seu token suporte. As seções abaixo descrevem cada extensão e como integrá-la.
Algumas extensões são incompatíveis entre si e você não pode habilitá-las
simultaneamente no mesmo mint account ou token account. Por exemplo, você não
pode combinar a extensão NonTransferable com a extensão
TransferFeeConfig, pois elas têm comportamentos conflitantes.
O Token Extensions Program define um enum
ExtensionType
que lista todas as extensões disponíveis que você pode adicionar a um mint
account ou token account. Cada variante representa uma extensão diferente com
funcionalidade única.
O enum ExtensionType é definido da seguinte forma:
/// Extensions that can be applied to mints or accounts. Mint extensions must/// only be applied to mint accounts, and account extensions must only be/// applied to token holding accounts.#[repr(u16)]#[cfg_attr(feature = "serde-traits", derive(Serialize, Deserialize))]#[cfg_attr(feature = "serde-traits", serde(rename_all = "camelCase"))]#[derive(Clone, Copy, Debug, PartialEq, TryFromPrimitive, IntoPrimitive)]pub enum ExtensionType {/// Used as padding if the account size would otherwise be 355, same as a/// multisigUninitialized,/// Includes transfer fee rate info and accompanying authorities to withdraw/// and set the feeTransferFeeConfig,/// Includes withheld transfer feesTransferFeeAmount,/// Includes an optional mint close authorityMintCloseAuthority,/// Auditor configuration for confidential transfersConfidentialTransferMint,/// State for confidential transfersConfidentialTransferAccount,/// Specifies the default Account::state for new AccountsDefaultAccountState,/// Indicates that the Account owner authority cannot be changedImmutableOwner,/// Require inbound transfers to have memoMemoTransfer,/// Indicates that the tokens from this mint can't be transferredNonTransferable,/// Tokens accrue interest over time,InterestBearingConfig,/// Locks privileged token instructions from happening via CPICpiGuard,/// Includes an optional permanent delegatePermanentDelegate,/// Indicates that the tokens in this account belong to a non-transferable/// mintNonTransferableAccount,/// Mint requires a CPI to a program implementing the "transfer hook"/// interfaceTransferHook,/// Indicates that the tokens in this account belong to a mint with a/// transfer hookTransferHookAccount,/// Includes encrypted withheld fees and the encryption public that they are/// encrypted underConfidentialTransferFeeConfig,/// Includes confidential withheld transfer feesConfidentialTransferFeeAmount,/// Mint contains a pointer to another account (or the same account) that/// holds metadataMetadataPointer,/// Mint contains token-metadataTokenMetadata,/// Mint contains a pointer to another account (or the same account) that/// holds group configurationsGroupPointer,/// Mint contains token group configurationsTokenGroup,/// Mint contains a pointer to another account (or the same account) that/// holds group member configurationsGroupMemberPointer,/// Mint contains token group member configurationsTokenGroupMember,/// Mint allowing the minting and burning of confidential tokensConfidentialMintBurn,/// Tokens whose UI amount is scaled by a given amountScaledUiAmount,/// Tokens where minting / burning / transferring can be pausedPausable,/// Indicates that the account belongs to a pausable mintPausableAccount,/// Test variable-length mint extension#[cfg(test)]VariableLenMintTest = u16::MAX - 2,/// Padding extension used to make an account exactly Multisig::LEN, used/// for testing#[cfg(test)]AccountPaddingTest,/// Padding extension used to make a mint exactly Multisig::LEN, used for/// testing#[cfg(test)]MintPaddingTest,}
Cada extensão adiciona funcionalidade especializada ao incluir estado extra a um
mint ou token account. Todo o estado específico da extensão é armazenado no
campo
tlv_data,
que segue o tipo de dados da conta base. Você deve desserializar ainda mais o
tlv_data (contendo o estado da extensão) de acordo com os tipos de extensão
específicos habilitados para essa conta.
/// Encapsulates immutable base state data (mint or account) with possible/// extensions, where the base state is Pod for zero-copy serde.#[derive(Debug, PartialEq)]pub struct PodStateWithExtensions<'data, S: BaseState + Pod> {/// Unpacked base datapub base: &'data S,/// Slice of data containing all TLV data, deserialized on demandtlv_data: &'data [u8],}
Is this page helpful?