Extensions
Wat zijn Token Extensions?
Het Token Extensions Program (Token 2022) biedt meer functies via extra instructies die extensions worden genoemd. Extensions zijn optionele functies die je kunt toevoegen aan een token mint of token account. Je kunt de implementatie van deze extension-instructies vinden in de Token Extensions Program broncode.
Elke extension voegt specifieke state toe die meestal wordt geïnitialiseerd tijdens de aanmaak van een mint of token account. Bij het initialiseren van een account kun je specifieke extensions tegelijkertijd inschakelen voor verschillende functionaliteiten. De meeste extensions kunnen niet worden toegevoegd nadat een account is geïnitialiseerd. Dit is een belangrijke overweging bij het ontwerpen van je token, omdat je vooraf moet plannen welke functies je token moet ondersteunen. Integratiegidsen voor elke extension zijn beschikbaar in de Token Extensions ontwikkelaarsdocumentatie.
Sommige extensions zijn niet compatibel met elkaar en kunnen niet
tegelijkertijd worden ingeschakeld op dezelfde token mint of token account. Je
kunt bijvoorbeeld niet de NonTransferable
extension combineren met de
TransferFeeConfig
extension, omdat ze conflicterend gedrag hebben.
Het Token Extensions Program definieert een
ExtensionType
enum die alle beschikbare extensions opsomt die je kunt toevoegen aan een token
mint of token account. Elke variant vertegenwoordigt een andere extension met
unieke functionaliteit.
De ExtensionType
enum is als volgt gedefinieerd:
/// 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,}
Elke extension voegt gespecialiseerde functionaliteit toe door extra state toe
te voegen aan een mint of token account. Alle extensie-specifieke state wordt
opgeslagen in het
tlv_data
veld, dat volgt op het basis account datatype. Je moet de tlv_data
(die
extension state bevat) verder deserialiseren volgens de specifieke extension
types die voor dat account zijn ingeschakeld.
/// 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?