Extensions
Que sont les Extensions de Token ?
Le Programme d'Extensions de Token (Token 2022) fournit davantage de fonctionnalités via des instructions supplémentaires appelées extensions. Les extensions sont des fonctionnalités optionnelles que vous pouvez ajouter à une émission de token ou à un compte de token. Vous pouvez trouver l'implémentation de ces instructions d'extension dans le code source du Programme d'Extensions de Token.
Chaque extension ajoute un état spécifique qui est généralement initialisé lors de la création de l'émission ou du compte de token. Lors de l'initialisation de l'un ou l'autre compte, vous pouvez activer simultanément des extensions spécifiques pour différentes fonctionnalités. La plupart des extensions ne peuvent pas être ajoutées après l'initialisation d'un compte. C'est une considération importante lors de la conception de votre token, car vous devrez planifier à l'avance les fonctionnalités que vous souhaitez que votre token prenne en charge. Des guides d'intégration pour chaque extension sont disponibles dans la documentation développeur des Extensions de Token.
Certaines extensions sont incompatibles entre elles et vous ne pouvez pas les
activer simultanément sur la même émission de token ou le même compte de
token. Par exemple, vous ne pouvez pas combiner l'extension
NonTransferable
avec l'extension TransferFeeConfig
, car elles ont
des comportements contradictoires.
Le Programme d'Extensions de Token définit une énumération
ExtensionType
qui liste toutes les extensions disponibles que vous pouvez ajouter à une
émission de token ou à un compte de token. Chaque variante représente une
extension différente avec une fonctionnalité unique.
L'énumération ExtensionType
est définie comme suit :
/// 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,}
Chaque extension ajoute une fonctionnalité spécialisée en incluant un état
supplémentaire à une émission ou à un compte de token. Tous les états
spécifiques à l'extension sont stockés dans le champ
tlv_data
,
qui suit le type de données de compte de base. Vous devez désérialiser davantage
le tlv_data
(contenant l'état de l'extension) selon les types d'extension
spécifiques activés pour ce compte.
/// 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?