Extensions
Apa itu Token Extensions?
Token Extensions Program (Token 2022) menyediakan lebih banyak fitur melalui instruksi tambahan yang disebut sebagai ekstensi. Extensions adalah fitur opsional yang dapat Anda tambahkan ke token mint atau token account. Anda dapat menemukan implementasi dari instruksi ekstensi ini di kode sumber Token Extensions Program.
Setiap ekstensi menambahkan state spesifik yang umumnya diinisialisasi selama pembuatan mint atau token account. Saat menginisialisasi salah satu akun, Anda dapat mengaktifkan ekstensi tertentu secara bersamaan untuk fungsionalitas yang berbeda. Sebagian besar ekstensi tidak dapat ditambahkan setelah akun diinisialisasi. Ini adalah pertimbangan penting saat merancang token Anda, karena Anda perlu merencanakan terlebih dahulu fitur mana yang ingin didukung oleh token Anda. Panduan integrasi untuk setiap ekstensi tersedia di dokumentasi pengembang Token Extensions.
Beberapa ekstensi tidak kompatibel satu sama lain dan Anda tidak dapat
mengaktifkannya secara bersamaan pada token mint atau token account yang sama.
Misalnya, Anda tidak dapat menggabungkan ekstensi NonTransferable
dengan
ekstensi TransferFeeConfig
, karena keduanya memiliki perilaku yang
bertentangan.
Token Extensions Program mendefinisikan enum
ExtensionType
yang mencantumkan semua ekstensi yang tersedia yang dapat Anda tambahkan ke
token mint atau token account. Setiap varian mewakili ekstensi berbeda dengan
fungsionalitas unik.
Enum ExtensionType
didefinisikan sebagai berikut:
/// 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,}
Setiap ekstensi menambahkan fungsionalitas khusus dengan menyertakan state
tambahan ke mint atau token account. Semua state khusus ekstensi disimpan di
field
tlv_data
,
yang mengikuti tipe data akun dasar. Anda harus melakukan deserialisasi lebih
lanjut pada tlv_data
(yang berisi state ekstensi) sesuai dengan tipe ekstensi
spesifik yang diaktifkan untuk akun tersebut.
/// 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?