Extensions
Τι είναι τα Token Extensions;
Το Token Extensions Program (Token 2022) παρέχει περισσότερα χαρακτηριστικά μέσω επιπλέον εντολών που αναφέρονται ως επεκτάσεις. Τα Extensions είναι προαιρετικά χαρακτηριστικά που μπορείτε να προσθέσετε σε ένα token mint ή token account. Μπορείτε να βρείτε την υλοποίηση αυτών των εντολών επέκτασης στον πηγαίο κώδικα του Token Extensions Program.
Κάθε επέκταση προσθέτει συγκεκριμένη κατάσταση που συνήθως αρχικοποιείται κατά τη δημιουργία του mint ή του token account. Κατά την αρχικοποίηση οποιουδήποτε λογαριασμού, μπορείτε να ενεργοποιήσετε συγκεκριμένες επεκτάσεις ταυτόχρονα για διαφορετικές λειτουργίες. Οι περισσότερες επεκτάσεις δεν μπορούν να προστεθούν μετά την αρχικοποίηση ενός λογαριασμού. Αυτό είναι ένα σημαντικό στοιχείο που πρέπει να λάβετε υπόψη κατά το σχεδιασμό του token σας, καθώς θα πρέπει να σχεδιάσετε εκ των προτέρων ποια χαρακτηριστικά θέλετε να υποστηρίζει το token σας. Οδηγοί ενσωμάτωσης για κάθε επέκταση είναι διαθέσιμοι στην τεκμηρίωση για προγραμματιστές του Token Extensions.
Ορισμένες επεκτάσεις είναι ασύμβατες μεταξύ τους και δεν μπορείτε να τις
ενεργοποιήσετε ταυτόχρονα στο ίδιο token mint ή token account. Για παράδειγμα,
δεν μπορείτε να συνδυάσετε την επέκταση NonTransferable
με την επέκταση
TransferFeeConfig
, καθώς έχουν αντικρουόμενες συμπεριφορές.
Το Token Extensions Program ορίζει ένα
ExtensionType
enum που παραθέτει όλες τις διαθέσιμες επεκτάσεις που μπορείτε να προσθέσετε σε
ένα token mint ή token account. Κάθε παραλλαγή αντιπροσωπεύει μια διαφορετική
επέκταση με μοναδική λειτουργικότητα.
Το enum ExtensionType
ορίζεται ως εξής:
/// 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,}
Κάθε επέκταση προσθέτει εξειδικευμένη λειτουργικότητα συμπεριλαμβάνοντας
επιπλέον κατάσταση σε ένα mint ή token account. Όλη η ειδική κατάσταση επέκτασης
αποθηκεύεται στο πεδίο
tlv_data
,
που ακολουθεί τον βασικό τύπο δεδομένων του λογαριασμού. Πρέπει να
αποσειριοποιήσετε περαιτέρω το tlv_data
(που περιέχει την κατάσταση επέκτασης)
σύμφωνα με τους συγκεκριμένους τύπους επέκτασης που είναι ενεργοποιημένοι για
αυτόν τον λογαριασμό.
/// 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?