Extensions
Token Extensionsとは何ですか?
Token Extensions Program(Token 2022)は、エクステンションと呼ばれる追加の命令を通じてより多くの機能を提供します。エクステンションはトークンミントまたはトークンアカウントに追加できるオプション機能です。これらのエクステンション命令の実装はToken Extensions Programのソースコードで確認できます。
各エクステンションは、通常ミントまたはトークンアカウントの作成時に初期化される特定の状態を追加します。どちらのアカウントを初期化する際も、異なる機能のために特定のエクステンションを同時に有効にすることができます。ほとんどのエクステンションはアカウントが初期化された後に追加することはできません。これはトークンを設計する際の重要な考慮事項であり、トークンがサポートしたい機能を事前に計画する必要があります。各エクステンションの統合ガイドはToken Extensions開発者ドキュメントで利用可能です。
一部のエクステンションは互いに互換性がなく、同じトークンミントやトークンアカウントで同時に有効にすることはできません。例えば、_rsNonTransferable
_エクステンションと_rsTransferFeeConfig
_エクステンションは、互いに競合する動作を持つため組み合わせることができません。
Token Extensions
Programは、トークンミントまたはトークンアカウントに追加できるすべての利用可能なエクステンションをリストするExtensionType
列挙型を定義しています。各バリアントは、固有の機能を持つ異なるエクステンションを表しています。
*rsExtensionType
*列挙型は次のように定義されています:
/// 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,}
各エクステンションは、ミントまたはトークンアカウントに追加の状態を含めることで、特殊な機能を追加します。すべてのエクステンション固有の状態は、基本アカウントデータ型に続く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?