Extensions
Cosa sono le Token Extensions?
Il Token Extensions Program (Token 2022) fornisce più funzionalità attraverso istruzioni extra chiamate estensioni. Le Extensions sono funzionalità opzionali che puoi aggiungere a un mint account o token account. Puoi trovare l'implementazione di queste istruzioni di estensione nel codice sorgente del Token Extensions Program.
Ogni estensione aggiunge uno stato specifico che viene generalmente inizializzato durante la creazione del mint o del token account. Durante l'inizializzazione di uno dei due account, puoi abilitare contemporaneamente estensioni specifiche per diverse funzionalità. La maggior parte delle estensioni non può essere aggiunta dopo l'inizializzazione di un account. Questa è una considerazione importante quando progetti il tuo token, poiché dovrai pianificare in anticipo quali funzionalità vuoi che il tuo token supporti. Le guide di integrazione per ciascuna estensione sono disponibili nella documentazione per sviluppatori delle Token Extensions.
Alcune estensioni sono incompatibili tra loro e non puoi abilitarle
contemporaneamente sullo stesso mint account o token account. Ad esempio, non
puoi combinare l'estensione NonTransferable
con l'estensione
TransferFeeConfig
, poiché hanno comportamenti in conflitto.
Il Token Extensions Program definisce un enum
ExtensionType
che elenca tutte le estensioni disponibili che puoi aggiungere a un mint account
o token account. Ogni variante rappresenta un'estensione diversa con
funzionalità uniche.
L'enum ExtensionType
è definito come segue:
/// 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,}
Ogni estensione aggiunge funzionalità specializzate includendo uno stato extra a
un mint o token account. Tutti gli stati specifici dell'estensione sono
memorizzati nel campo
tlv_data
,
che segue il tipo di dati dell'account di base. Devi deserializzare
ulteriormente il tlv_data
(contenente lo stato dell'estensione) in base ai
tipi di estensione specifici abilitati per quell'account.
/// 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?