Rozszerzenia
Czym są Token Extensions?
Token Extensions Program (Token 2022) oferuje więcej funkcji dzięki dodatkowym instrukcjom nazywanym rozszerzeniami. Rozszerzenia to opcjonalne funkcje, które można dodać do tokenów lub kont tokenów. Implementację tych instrukcji rozszerzeń można znaleźć w Token Extensions Program kodzie źródłowym.
Każde rozszerzenie dodaje określony stan, który jest zazwyczaj inicjalizowany podczas tworzenia tokena lub konta tokena. Podczas inicjalizacji dowolnego konta można jednocześnie włączyć określone rozszerzenia dla różnych funkcji. Większości rozszerzeń nie można dodać po zainicjalizowaniu konta. Jest to ważne rozważanie podczas projektowania tokena, ponieważ trzeba wcześniej zaplanować, jakie funkcje ma obsługiwać token. Przewodniki integracyjne dla każdego rozszerzenia są dostępne w dokumentacji dla deweloperów Token Extensions.
Niektóre rozszerzenia są ze sobą niekompatybilne i nie można ich włączyć
jednocześnie na tym samym tokenie lub koncie tokena. Na przykład nie można
połączyć rozszerzenia NonTransferable
z rozszerzeniem
TransferFeeConfig
, ponieważ mają one sprzeczne zachowania.
Token Extensions Program definiuje
ExtensionType
enum, który zawiera listę wszystkich dostępnych rozszerzeń, które można dodać do
tokena lub konta tokena. Każdy wariant reprezentuje inne rozszerzenie z unikalną
funkcjonalnością.
Enum ExtensionType
jest zdefiniowany w następujący sposób:
/// 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,}
Każde rozszerzenie dodaje specjalistyczną funkcjonalność, włączając dodatkowy
stan do tokena lub konta tokena. Wszystkie specyficzne dla rozszerzeń stany są
przechowywane w polu
tlv_data
,
które znajduje się po podstawowym typie danych konta. Należy dodatkowo
deserializować tlv_data
(zawierające stan rozszerzenia) zgodnie z typami
rozszerzeń włączonymi dla tego konta.
/// 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?