ما هي إضافات التوكن؟
يوفر برنامج إضافات التوكن (Token 2022) المزيد من الميزات من خلال تعليمات إضافية تُعرف باسم الإضافات. الإضافات هي ميزات اختيارية يمكنك إضافتها إلى حساب إصدار التوكن أو حساب التوكن. يمكنك العثور على تنفيذ تعليمات هذه الإضافات في الكود المصدري لبرنامج Token Extensions Program.
تضيف كل امتداد حالةً محددة يتم تهيئتها عادةً أثناء إنشاء حساب الإصدار أو token account. عند تهيئة أي من الحسابين، يمكنك تفعيل امتدادات محددة في آنٍ واحد للحصول على وظائف مختلفة. لا يمكن إضافة معظم الامتدادات بعد تهيئة الحساب، وهذا اعتبار مهم عند تصميم رمزك المميز، إذ ستحتاج إلى التخطيط مسبقاً للميزات التي تريد أن يدعمها. تصف الأقسام أدناه كل امتداد وكيفية دمجه.
بعض الإضافات غير متوافقة مع بعضها البعض ولا يمكنك تفعيلها في نفس الوقت على نفس
حساب إصدار التوكن أو حساب التوكن. على سبيل المثال، لا يمكنك دمج إضافة
NonTransferable مع إضافة TransferFeeConfig، حيث أن لديهما سلوكيات
متعارضة.
يُعرّف Token Extensions Program تعداداً
ExtensionType
يسرد جميع الإضافات المتاحة التي يمكنك إضافتها إلى حساب إصدار التوكن أو حساب
التوكن. كل متغير يمثل إضافة مختلفة ذات وظيفة فريدة.
يتم تعريف تعداد 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 instructions 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,}
تضيف كل إضافة وظيفة متخصصة من خلال تضمين حالة إضافية إلى حساب الإصدار أو حساب
التوكن. يتم تخزين جميع الحالات الخاصة بالإضافة في حقل
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?