Extensions
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 de token ou conta de token. 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 do mint ou da conta de token. Ao inicializar qualquer uma das contas, você pode ativar 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 antecipadamente quais recursos deseja que seu token suporte. Guias de integração para cada extensão estão disponíveis na documentação para desenvolvedores do Token Extensions.
Algumas extensões são incompatíveis entre si e você não pode ativá-las
simultaneamente no mesmo mint de token ou conta de token. 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 de
token ou conta de token. 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 operations 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 incluindo estado extra a um
mint ou conta de token. Todo estado específico de extensão é armazenado no campo
tlv_data
,
que segue o tipo de dados da conta base. Você deve deserializar ainda mais o
tlv_data
(contendo o estado da extensão) de acordo com os tipos específicos de
extensão 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?