diff --git a/token/program/inc/token.h b/token/program/inc/token.h index 75f394b9..3a156faa 100644 --- a/token/program/inc/token.h +++ b/token/program/inc/token.h @@ -18,237 +18,60 @@ #define Token_MIN_SIGNERS 1 /** - * Instructions supported by the token program. + * Account state. */ -typedef enum Token_TokenInstruction_Tag { +enum Token_AccountState +#ifdef __cplusplus + : uint8_t +#endif // __cplusplus + { /** - * Initializes a new mint and optionally deposits all the newly minted tokens in an account. - * - * The `InitializeMint` instruction requires no signers and MUST be included within - * the same Transaction as the system program's `CreateInstruction` that creates the account - * being initialized. Otherwise another party can acquire ownership of the uninitialized account. - * - * Accounts expected by this instruction: - * - * 0. `[writable]` The mint to initialize. - * 1. - * * If supply is non-zero: `[writable]` The account to hold all the newly minted tokens. - * * If supply is zero: `[]` The owner/multisignature of the mint. - * 2. `[]` (optional) The owner/multisignature of the mint if supply is non-zero, if - * present then further minting is supported. - * + * Account is not yet initialized */ - Token_TokenInstruction_InitializeMint, + Token_AccountState_Uninitialized, /** - * Initializes a new account to hold tokens. If this account is associated with the native mint - * then the token balance of the initialized account will be equal to the amount of SOL in the account. - * - * The `InitializeAccount` instruction requires no signers and MUST be included within - * the same Transaction as the system program's `CreateInstruction` that creates the account - * being initialized. Otherwise another party can acquire ownership of the uninitialized account. - * - * Accounts expected by this instruction: - * - * 0. `[writable]` The account to initialize. - * 1. `[]` The mint this account will be associated with. - * 2. `[]` The new account's owner/multisignature. + * Account is initialized; the account owner and/or delegate may perform permitted operations + * on this account */ - Token_TokenInstruction_InitializeAccount, + Token_AccountState_Initialized, /** - * Initializes a multisignature account with N provided signers. - * - * Multisignature accounts can used in place of any single owner/delegate accounts in any - * token instruction that require an owner/delegate to be present. The variant field represents the - * number of signers (M) required to validate this multisignature account. - * - * The `InitializeMultisig` instruction requires no signers and MUST be included within - * the same Transaction as the system program's `CreateInstruction` that creates the account - * being initialized. Otherwise another party can acquire ownership of the uninitialized account. - * - * Accounts expected by this instruction: - * - * 0. `[writable]` The multisignature account to initialize. - * 1. ..1+N. `[]` The signer accounts, must equal to N where 1 <= N <= 11. + * Account has been frozen by the mint freeze authority. Neither the account owner nor + * the delegate are able to perform operations on this account. */ - Token_TokenInstruction_InitializeMultisig, - /** - * Transfers tokens from one account to another either directly or via a delegate. If this - * account is associated with the native mint then equal amounts of SOL and Tokens will be - * transferred to the destination account. - * - * Accounts expected by this instruction: - * - * * Single owner/delegate - * 0. `[writable]` The source account. - * 1. `[writable]` The destination account. - * 2. '[signer]' The source account's owner/delegate. - * - * * Multisignature owner/delegate - * 0. `[writable]` The source account. - * 1. `[writable]` The destination account. - * 2. '[]' The source account's multisignature owner/delegate. - * 3. ..3+M '[signer]' M signer accounts. - */ - Token_TokenInstruction_Transfer, - /** - * Approves a delegate. A delegate is given the authority over - * tokens on behalf of the source account's owner. - * Accounts expected by this instruction: - * - * * Single owner - * 0. `[writable]` The source account. - * 1. `[]` The delegate. - * 2. `[signer]` The source account owner. - * - * * Multisignature owner - * 0. `[writable]` The source account. - * 1. `[]` The delegate. - * 2. '[]' The source account's multisignature owner. - * 3. ..3+M '[signer]' M signer accounts - */ - Token_TokenInstruction_Approve, - /** - * Revokes the delegate's authority. - * - * Accounts expected by this instruction: - * - * * Single owner - * 0. `[writable]` The source account. - * 1. `[signer]` The source account owner. - * - * * Multisignature owner - * 0. `[writable]` The source account. - * 1. '[]' The source account's multisignature owner. - * 2. ..2+M '[signer]' M signer accounts - */ - Token_TokenInstruction_Revoke, - /** - * Sets a new owner of a mint or account. - * - * Accounts expected by this instruction: - * - * * Single owner - * 0. `[writable]` The mint or account to change the owner of. - * 1. `[]` The new owner/delegate/multisignature. - * 2. `[signer]` The owner of the mint or account. - * - * * Multisignature owner - * 0. `[writable]` The mint or account to change the owner of. - * 1. `[]` The new owner/delegate/multisignature. - * 2. `[]` The mint's or account's multisignature owner. - * 3. ..3+M '[signer]' M signer accounts - */ - Token_TokenInstruction_SetOwner, - /** - * Mints new tokens to an account. The native mint does not support minting. - * - * Accounts expected by this instruction: - * - * * Single owner - * 0. `[writable]` The mint. - * 1. `[writable]` The account to mint tokens to. - * 2. `[signer]` The mint's owner. - * - * * Multisignature owner - * 0. `[writable]` The mint. - * 1. `[writable]` The account to mint tokens to. - * 2. `[]` The mint's multisignature owner. - * 3. ..3+M '[signer]' M signer accounts. - */ - Token_TokenInstruction_MintTo, - /** - * Burns tokens by removing them from an account. `Burn` does not support accounts - * associated with the native mint, use `CloseAccount` instead. - * - * Accounts expected by this instruction: - * - * * Single owner/delegate - * 0. `[writable]` The account to burn from. - * 1. `[signer]` The account's owner/delegate. - * - * * Multisignature owner/delegate - * 0. `[writable]` The account to burn from. - * 1. `[]` The account's multisignature owner/delegate. - * 2. ..2+M '[signer]' M signer accounts. - */ - Token_TokenInstruction_Burn, - /** - * Close an account by transferring all its SOL to the destination account. - * Non-native accounts may only be closed if its token amount is zero. - * - * Accounts expected by this instruction: - * - * * Single owner - * 0. `[writable]` The account to close. - * 1. '[writable]' The destination account. - * 2. `[signer]` The account's owner. - * - * * Multisignature owner - * 0. `[writable]` The account to close. - * 1. '[writable]' The destination account. - * 2. `[]` The account's multisignature owner. - * 3. ..3+M '[signer]' M signer accounts. - */ - Token_TokenInstruction_CloseAccount, -} Token_TokenInstruction_Tag; + Token_AccountState_Frozen, +}; +#ifndef __cplusplus +typedef uint8_t Token_AccountState; +#endif // __cplusplus -typedef struct Token_TokenInstruction_Token_InitializeMint_Body { +/** + * Specifies the authority type for SetAuthority instructions + */ +enum Token_AuthorityType +#ifdef __cplusplus + : uint8_t +#endif // __cplusplus + { /** - * Initial amount of tokens to mint. + * Authority to mint new tokens */ - uint64_t amount; + Token_AuthorityType_MintTokens, /** - * Number of base 10 digits to the right of the decimal place. + * Authority to freeze any account associated with the Mint */ - uint8_t decimals; -} Token_TokenInstruction_Token_InitializeMint_Body; - -typedef struct Token_TokenInstruction_Token_InitializeMultisig_Body { + Token_AuthorityType_FreezeAccount, /** - * The number of signers (M) required to validate this multisignature account. + * Holder of a given token account */ - uint8_t m; -} Token_TokenInstruction_Token_InitializeMultisig_Body; - -typedef struct Token_TokenInstruction_Token_Transfer_Body { + Token_AuthorityType_AccountHolder, /** - * The amount of tokens to transfer. + * Authority to close a token account */ - uint64_t amount; -} Token_TokenInstruction_Token_Transfer_Body; - -typedef struct Token_TokenInstruction_Token_Approve_Body { - /** - * The amount of tokens the delegate is approved for. - */ - uint64_t amount; -} Token_TokenInstruction_Token_Approve_Body; - -typedef struct Token_TokenInstruction_Token_MintTo_Body { - /** - * The amount of new tokens to mint. - */ - uint64_t amount; -} Token_TokenInstruction_Token_MintTo_Body; - -typedef struct Token_TokenInstruction_Token_Burn_Body { - /** - * The amount of tokens to burn. - */ - uint64_t amount; -} Token_TokenInstruction_Token_Burn_Body; - -typedef struct Token_TokenInstruction { - Token_TokenInstruction_Tag tag; - union { - Token_TokenInstruction_Token_InitializeMint_Body initialize_mint; - Token_TokenInstruction_Token_InitializeMultisig_Body initialize_multisig; - Token_TokenInstruction_Token_Transfer_Body transfer; - Token_TokenInstruction_Token_Approve_Body approve; - Token_TokenInstruction_Token_MintTo_Body mint_to; - Token_TokenInstruction_Token_Burn_Body burn; - }; -} Token_TokenInstruction; + Token_AuthorityType_CloseAccount, +}; +#ifndef __cplusplus +typedef uint8_t Token_AuthorityType; +#endif // __cplusplus typedef uint8_t Token_Pubkey[32]; @@ -277,16 +100,442 @@ typedef struct Token_COption_Pubkey { }; } Token_COption_Pubkey; +/** + * Instructions supported by the token program. + */ +typedef enum Token_TokenInstruction_Tag { + /** + * Initializes a new mint and optionally deposits all the newly minted tokens in an account. + * + * The `InitializeMint` instruction requires no signers and MUST be included within + * the same Transaction as the system program's `CreateInstruction` that creates the account + * being initialized. Otherwise another party can acquire ownership of the uninitialized account. + * + * Accounts expected by this instruction: + * + * 0. `[writable]` The mint to initialize. + * 1. `[]` Rent sysvar + * + */ + Token_TokenInstruction_InitializeMint, + /** + * Initializes a new account to hold tokens. If this account is associated with the native + * mint then the token balance of the initialized account will be equal to the amount of SOL + * in the account. If this account is associated with another mint, that mint must be + * initialized before this command can succeed. + * + * The `InitializeAccount` instruction requires no signers and MUST be included within + * the same Transaction as the system program's `CreateInstruction` that creates the account + * being initialized. Otherwise another party can acquire ownership of the uninitialized account. + * + * Accounts expected by this instruction: + * + * 0. `[writable]` The account to initialize. + * 1. `[]` The mint this account will be associated with. + * 2. `[]` The new account's owner/multisignature. + * 3. `[]` Rent sysvar + */ + Token_TokenInstruction_InitializeAccount, + /** + * Initializes a multisignature account with N provided signers. + * + * Multisignature accounts can used in place of any single owner/delegate accounts in any + * token instruction that require an owner/delegate to be present. The variant field represents the + * number of signers (M) required to validate this multisignature account. + * + * The `InitializeMultisig` instruction requires no signers and MUST be included within + * the same Transaction as the system program's `CreateInstruction` that creates the account + * being initialized. Otherwise another party can acquire ownership of the uninitialized account. + * + * Accounts expected by this instruction: + * + * 0. `[writable]` The multisignature account to initialize. + * 1. `[]` Rent sysvar + * 2. ..2+N. `[]` The signer accounts, must equal to N where 1 <= N <= 11. + */ + Token_TokenInstruction_InitializeMultisig, + /** + * Transfers tokens from one account to another either directly or via a delegate. If this + * account is associated with the native mint then equal amounts of SOL and Tokens will be + * transferred to the destination account. + * + * Accounts expected by this instruction: + * + * * Single owner/delegate + * 0. `[writable]` The source account. + * 1. `[writable]` The destination account. + * 2. `[signer]` The source account's owner/delegate. + * + * * Multisignature owner/delegate + * 0. `[writable]` The source account. + * 1. `[writable]` The destination account. + * 2. `[]` The source account's multisignature owner/delegate. + * 3. ..3+M `[signer]` M signer accounts. + */ + Token_TokenInstruction_Transfer, + /** + * Approves a delegate. A delegate is given the authority over + * tokens on behalf of the source account's owner. + * + * Accounts expected by this instruction: + * + * * Single owner + * 0. `[writable]` The source account. + * 1. `[]` The delegate. + * 2. `[signer]` The source account owner. + * + * * Multisignature owner + * 0. `[writable]` The source account. + * 1. `[]` The delegate. + * 2. `[]` The source account's multisignature owner. + * 3. ..3+M `[signer]` M signer accounts + */ + Token_TokenInstruction_Approve, + /** + * Revokes the delegate's authority. + * + * Accounts expected by this instruction: + * + * * Single owner + * 0. `[writable]` The source account. + * 1. `[signer]` The source account owner. + * + * * Multisignature owner + * 0. `[writable]` The source account. + * 1. `[]` The source account's multisignature owner. + * 2. ..2+M `[signer]` M signer accounts + */ + Token_TokenInstruction_Revoke, + /** + * Sets a new authority of a mint or account. + * + * Accounts expected by this instruction: + * + * * Single authority + * 0. `[writable]` The mint or account to change the authority of. + * 1. `[signer]` The current authority of the mint or account. + * + * * Multisignature authority + * 0. `[writable]` The mint or account to change the authority of. + * 1. `[]` The mint's or account's multisignature authority. + * 2. ..2+M `[signer]` M signer accounts + */ + Token_TokenInstruction_SetAuthority, + /** + * Mints new tokens to an account. The native mint does not support minting. + * + * Accounts expected by this instruction: + * + * * Single authority + * 0. `[writable]` The mint. + * 1. `[writable]` The account to mint tokens to. + * 2. `[signer]` The mint's minting authority. + * + * * Multisignature authority + * 0. `[writable]` The mint. + * 1. `[writable]` The account to mint tokens to. + * 2. `[]` The mint's multisignature mint-tokens authority. + * 3. ..3+M `[signer]` M signer accounts. + */ + Token_TokenInstruction_MintTo, + /** + * Burns tokens by removing them from an account. `Burn` does not support accounts + * associated with the native mint, use `CloseAccount` instead. + * + * Accounts expected by this instruction: + * + * * Single owner/delegate + * 0. `[writable]` The account to burn from. + * 1. `[writable]` The token mint. + * 2. `[signer]` The account's owner/delegate. + * + * * Multisignature owner/delegate + * 0. `[writable]` The account to burn from. + * 1. '[writable]' The token mint. + * 2. `[]` The account's multisignature owner/delegate. + * 3. ..3+M '[signer]' M signer accounts. + */ + Token_TokenInstruction_Burn, + /** + * Close an account by transferring all its SOL to the destination account. + * Non-native accounts may only be closed if its token amount is zero. + * + * Accounts expected by this instruction: + * + * * Single owner + * 0. `[writable]` The account to close. + * 1. `[writable]` The destination account. + * 2. `[signer]` The account's owner. + * + * * Multisignature owner + * 0. `[writable]` The account to close. + * 1. `[writable]` The destination account. + * 2. `[]` The account's multisignature owner. + * 3. ..3+M `[signer]` M signer accounts. + */ + Token_TokenInstruction_CloseAccount, + /** + * Freeze an Initialized account using the Mint's freeze_authority (if set). + * + * Accounts expected by this instruction: + * + * * Single owner + * 0. `[writable]` The account to freeze. + * 1. `[]` The token mint. + * 2. `[signer]` The mint freeze authority. + * + * * Multisignature owner + * 0. `[writable]` The account to freeze. + * 1. `[]` The token mint. + * 2. `[]` The mint's multisignature freeze authority. + * 3. ..3+M `[signer]` M signer accounts. + */ + Token_TokenInstruction_FreezeAccount, + /** + * Thaw a Frozen account using the Mint's freeze_authority (if set). + * + * Accounts expected by this instruction: + * + * * Single owner + * 0. `[writable]` The account to freeze. + * 1. `[]` The token mint. + * 2. `[signer]` The mint freeze authority. + * + * * Multisignature owner + * 0. `[writable]` The account to freeze. + * 1. `[]` The token mint. + * 2. `[]` The mint's multisignature freeze authority. + * 3. ..3+M `[signer]` M signer accounts. + */ + Token_TokenInstruction_ThawAccount, + /** + * Transfers tokens from one account to another either directly or via a delegate. If this + * account is associated with the native mint then equal amounts of SOL and Tokens will be + * transferred to the destination account. + * + * This instruction differs from Transfer in that the token mint and decimals value is + * asserted by the caller. This may be useful when creating transactions offline or within a + * hardware wallet. + * + * Accounts expected by this instruction: + * + * * Single owner/delegate + * 0. `[writable]` The source account. + * 1. `[]` The token mint. + * 2. `[writable]` The destination account. + * 3. `[signer]` The source account's owner/delegate. + * + * * Multisignature owner/delegate + * 0. `[writable]` The source account. + * 1. `[]` The token mint. + * 2. `[writable]` The destination account. + * 3. `[]` The source account's multisignature owner/delegate. + * 4. ..4+M `[signer]` M signer accounts. + */ + Token_TokenInstruction_Transfer2, + /** + * Approves a delegate. A delegate is given the authority over + * tokens on behalf of the source account's owner. + * + * This instruction differs from Approve in that the token mint and decimals value is asserted + * by the caller. This may be useful when creating transactions offline or within a hardware + * wallet. + * + * Accounts expected by this instruction: + * + * * Single owner + * 0. `[writable]` The source account. + * 1. `[]` The token mint. + * 2. `[]` The delegate. + * 3. `[signer]` The source account owner. + * + * * Multisignature owner + * 0. `[writable]` The source account. + * 1. `[]` The token mint. + * 2. `[]` The delegate. + * 3. `[]` The source account's multisignature owner. + * 4. ..4+M `[signer]` M signer accounts + */ + Token_TokenInstruction_Approve2, + /** + * Mints new tokens to an account. The native mint does not support minting. + * + * This instruction differs from MintTo in that the decimals value is asserted by the + * caller. This may be useful when creating transactions offline or within a hardware wallet. + * + * Accounts expected by this instruction: + * + * * Single authority + * 0. `[writable]` The mint. + * 1. `[writable]` The account to mint tokens to. + * 2. `[signer]` The mint's minting authority. + * + * * Multisignature authority + * 0. `[writable]` The mint. + * 1. `[writable]` The account to mint tokens to. + * 2. `[]` The mint's multisignature mint-tokens authority. + * 3. ..3+M `[signer]` M signer accounts. + */ + Token_TokenInstruction_MintTo2, + /** + * Burns tokens by removing them from an account. `Burn2` does not support accounts + * associated with the native mint, use `CloseAccount` instead. + * + * This instruction differs from Burn in that the decimals value is asserted by the caller. + * This may be useful when creating transactions offline or within a hardware wallet. + * + * Accounts expected by this instruction: + * + * * Single owner/delegate + * 0. `[writable]` The account to burn from. + * 1. `[writable]` The token mint. + * 2. `[signer]` The account's owner/delegate. + * + * * Multisignature owner/delegate + * 0. `[writable]` The account to burn from. + * 1. `[writable]` The token mint. + * 2. `[]` The account's multisignature owner/delegate. + * 3. ..3+M `[signer]` M signer accounts. + */ + Token_TokenInstruction_Burn2, +} Token_TokenInstruction_Tag; + +typedef struct Token_TokenInstruction_Token_InitializeMint_Body { + /** + * Number of base 10 digits to the right of the decimal place. + */ + uint8_t decimals; + /** + * The authority/multisignature to mint tokens. + */ + Token_Pubkey mint_authority; + /** + * The freeze authority/multisignature of the mint. + */ + Token_COption_Pubkey freeze_authority; +} Token_TokenInstruction_Token_InitializeMint_Body; + +typedef struct Token_TokenInstruction_Token_InitializeMultisig_Body { + /** + * The number of signers (M) required to validate this multisignature account. + */ + uint8_t m; +} Token_TokenInstruction_Token_InitializeMultisig_Body; + +typedef struct Token_TokenInstruction_Token_Transfer_Body { + /** + * The amount of tokens to transfer. + */ + uint64_t amount; +} Token_TokenInstruction_Token_Transfer_Body; + +typedef struct Token_TokenInstruction_Token_Approve_Body { + /** + * The amount of tokens the delegate is approved for. + */ + uint64_t amount; +} Token_TokenInstruction_Token_Approve_Body; + +typedef struct Token_TokenInstruction_Token_SetAuthority_Body { + /** + * The type of authority to update. + */ + Token_AuthorityType authority_type; + /** + * The new authority + */ + Token_COption_Pubkey new_authority; +} Token_TokenInstruction_Token_SetAuthority_Body; + +typedef struct Token_TokenInstruction_Token_MintTo_Body { + /** + * The amount of new tokens to mint. + */ + uint64_t amount; +} Token_TokenInstruction_Token_MintTo_Body; + +typedef struct Token_TokenInstruction_Token_Burn_Body { + /** + * The amount of tokens to burn. + */ + uint64_t amount; +} Token_TokenInstruction_Token_Burn_Body; + +typedef struct Token_TokenInstruction_Token_Transfer2_Body { + /** + * The amount of tokens to transfer. + */ + uint64_t amount; + /** + * Expected number of base 10 digits to the right of the decimal place. + */ + uint8_t decimals; +} Token_TokenInstruction_Token_Transfer2_Body; + +typedef struct Token_TokenInstruction_Token_Approve2_Body { + /** + * The amount of tokens the delegate is approved for. + */ + uint64_t amount; + /** + * Expected number of base 10 digits to the right of the decimal place. + */ + uint8_t decimals; +} Token_TokenInstruction_Token_Approve2_Body; + +typedef struct Token_TokenInstruction_Token_MintTo2_Body { + /** + * The amount of new tokens to mint. + */ + uint64_t amount; + /** + * Expected number of base 10 digits to the right of the decimal place. + */ + uint8_t decimals; +} Token_TokenInstruction_Token_MintTo2_Body; + +typedef struct Token_TokenInstruction_Token_Burn2_Body { + /** + * The amount of tokens to burn. + */ + uint64_t amount; + /** + * Expected number of base 10 digits to the right of the decimal place. + */ + uint8_t decimals; +} Token_TokenInstruction_Token_Burn2_Body; + +typedef struct Token_TokenInstruction { + Token_TokenInstruction_Tag tag; + union { + Token_TokenInstruction_Token_InitializeMint_Body initialize_mint; + Token_TokenInstruction_Token_InitializeMultisig_Body initialize_multisig; + Token_TokenInstruction_Token_Transfer_Body transfer; + Token_TokenInstruction_Token_Approve_Body approve; + Token_TokenInstruction_Token_SetAuthority_Body set_authority; + Token_TokenInstruction_Token_MintTo_Body mint_to; + Token_TokenInstruction_Token_Burn_Body burn; + Token_TokenInstruction_Token_Transfer2_Body transfer2; + Token_TokenInstruction_Token_Approve2_Body approve2; + Token_TokenInstruction_Token_MintTo2_Body mint_to2; + Token_TokenInstruction_Token_Burn2_Body burn2; + }; +} Token_TokenInstruction; + /** * Mint data. */ typedef struct Token_Mint { /** - * Optional owner, used to mint new tokens. The owner may only - * be provided during mint creation. If no owner is present then the mint - * has a fixed supply and no further tokens may be minted. + * Optional authority used to mint new tokens. The mint authority may only be provided during + * mint creation. If no mint authority is present then the mint has a fixed supply and no + * further tokens may be minted. */ - Token_COption_Pubkey owner; + Token_COption_Pubkey mint_authority; + /** + * Total supply of tokens. + */ + uint64_t supply; /** * Number of base 10 digits to the right of the decimal place. */ @@ -295,8 +544,37 @@ typedef struct Token_Mint { * Is `true` if this structure has been initialized */ bool is_initialized; + /** + * Optional authority to freeze token accounts. + */ + Token_COption_Pubkey freeze_authority; } Token_Mint; +/** + * A C representation of Rust's `std::option::Option` + */ +typedef enum Token_COption_u64_Tag { + /** + * No value + */ + Token_COption_u64_None_u64, + /** + * Some value `T` + */ + Token_COption_u64_Some_u64, +} Token_COption_u64_Tag; + +typedef struct Token_COption_u64_Token_Some_Body_u64 { + uint64_t _0; +} Token_COption_u64_Token_Some_Body_u64; + +typedef struct Token_COption_u64 { + Token_COption_u64_Tag tag; + union { + Token_COption_u64_Token_Some_Body_u64 some; + }; +} Token_COption_u64; + /** * Account data. */ @@ -319,17 +597,23 @@ typedef struct Token_Account { */ Token_COption_Pubkey delegate; /** - * Is `true` if this structure has been initialized + * The account's state */ - bool is_initialized; + Token_AccountState state; /** - * Is this a native token + * If is_some, this is a native token, and the value logs the rent-exempt reserve. An Account + * is required to be rent-exempt, so the value is used by the Processor to ensure that wrapped + * SOL accounts do not drop below this threshold. */ - bool is_native; + Token_COption_u64 is_native; /** * The amount delegated */ uint64_t delegated_amount; + /** + * Optional authority to close the account. + */ + Token_COption_Pubkey close_authority; } Token_Account; /**