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 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:

Token Extensions
/// 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
/// multisig
Uninitialized,
/// Includes transfer fee rate info and accompanying authorities to withdraw
/// and set the fee
TransferFeeConfig,
/// Includes withheld transfer fees
TransferFeeAmount,
/// Includes an optional mint close authority
MintCloseAuthority,
/// Auditor configuration for confidential transfers
ConfidentialTransferMint,
/// State for confidential transfers
ConfidentialTransferAccount,
/// Specifies the default Account::state for new Accounts
DefaultAccountState,
/// Indicates that the Account owner authority cannot be changed
ImmutableOwner,
/// Require inbound transfers to have memo
MemoTransfer,
/// Indicates that the tokens from this mint can't be transferred
NonTransferable,
/// Tokens accrue interest over time,
InterestBearingConfig,
/// Locks privileged token instructions from happening via CPI
CpiGuard,
/// Includes an optional permanent delegate
PermanentDelegate,
/// Indicates that the tokens in this account belong to a non-transferable
/// mint
NonTransferableAccount,
/// Mint requires a CPI to a program implementing the "transfer hook"
/// interface
TransferHook,
/// Indicates that the tokens in this account belong to a mint with a
/// transfer hook
TransferHookAccount,
/// Includes encrypted withheld fees and the encryption public that they are
/// encrypted under
ConfidentialTransferFeeConfig,
/// Includes confidential withheld transfer fees
ConfidentialTransferFeeAmount,
/// Mint contains a pointer to another account (or the same account) that
/// holds metadata
MetadataPointer,
/// Mint contains token-metadata
TokenMetadata,
/// Mint contains a pointer to another account (or the same account) that
/// holds group configurations
GroupPointer,
/// Mint contains token group configurations
TokenGroup,
/// Mint contains a pointer to another account (or the same account) that
/// holds group member configurations
GroupMemberPointer,
/// Mint contains token group member configurations
TokenGroupMember,
/// Mint allowing the minting and burning of confidential tokens
ConfidentialMintBurn,
/// Tokens whose UI amount is scaled by a given amount
ScaledUiAmount,
/// Tokens where minting / burning / transferring can be paused
Pausable,
/// Indicates that the account belongs to a pausable mint
PausableAccount,
/// 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.

Token Extensions
/// 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 data
pub base: &'data S,
/// Slice of data containing all TLV data, deserialized on demand
tlv_data: &'data [u8],
}

Is this page helpful?

Índice

Editar Página
© 2026 Fundação Solana. Todos os direitos reservados.