Extensions
¿Qué son las Token Extensions?
El Token Extensions Program (Token 2022) proporciona más funcionalidades a través de instrucciones adicionales conocidas como extensiones. Las extensiones son características opcionales que puedes añadir a un mint de token o a una cuenta de token. Puedes encontrar la implementación de estas instrucciones de extensión en el código fuente del Token Extensions Program.
Cada extensión añade un estado específico que generalmente se inicializa durante la creación del mint o de la cuenta de token. Al inicializar cualquiera de estas cuentas, puedes habilitar extensiones específicas simultáneamente para diferentes funcionalidades. La mayoría de las extensiones no se pueden añadir después de que una cuenta haya sido inicializada. Esta es una consideración importante al diseñar tu token, ya que necesitarás planificar con anticipación qué características quieres que soporte tu token. Las guías de integración para cada extensión están disponibles en la documentación para desarrolladores de Token Extensions.
Algunas extensiones son incompatibles entre sí y no puedes habilitarlas
simultáneamente en el mismo mint de token o cuenta de token. Por ejemplo, no
puedes combinar la extensión NonTransferable
con la extensión
TransferFeeConfig
, ya que tienen comportamientos conflictivos.
El Token Extensions Program define un enum
ExtensionType
que lista todas las extensiones disponibles que puedes añadir a un mint de token
o cuenta de token. Cada variante representa una extensión diferente con
funcionalidad única.
El enum ExtensionType
se define de la siguiente manera:
/// 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 extensión añade funcionalidad especializada al incluir estado adicional a
un mint o cuenta de token. Todo el estado específico de la extensión se almacena
en el campo
tlv_data
,
que sigue al tipo de datos de la cuenta base. Debes deserializar adicionalmente
el tlv_data
(que contiene el estado de la extensión) de acuerdo con los tipos
de extensión específicos habilitados para esa cuenta.
/// 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?