Browse Source

Update token.h

Michael Vines 5 years ago
parent
commit
a6ef5bcea8
1 changed files with 360 additions and 76 deletions
  1. 360 76
      program/inc/token.h

+ 360 - 76
program/inc/token.h

@@ -17,6 +17,89 @@
  */
 #define Token_MIN_SIGNERS 1
 
+/**
+ * Account state.
+ */
+enum Token_AccountState
+#ifdef __cplusplus
+  : uint8_t
+#endif // __cplusplus
+ {
+    /**
+     * Account is not yet initialized
+     */
+    Token_AccountState_Uninitialized,
+    /**
+     * Account is initialized; the account owner and/or delegate may perform permitted operations
+     * on this account
+     */
+    Token_AccountState_Initialized,
+    /**
+     * 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_AccountState_Frozen,
+};
+#ifndef __cplusplus
+typedef uint8_t Token_AccountState;
+#endif // __cplusplus
+
+/**
+ * Specifies the authority type for SetAuthority instructions
+ */
+enum Token_AuthorityType
+#ifdef __cplusplus
+  : uint8_t
+#endif // __cplusplus
+ {
+    /**
+     * Authority to mint new tokens
+     */
+    Token_AuthorityType_MintTokens,
+    /**
+     * Authority to freeze any account associated with the Mint
+     */
+    Token_AuthorityType_FreezeAccount,
+    /**
+     * Holder of a given token account
+     */
+    Token_AuthorityType_AccountHolder,
+    /**
+     * Authority to close a token account
+     */
+    Token_AuthorityType_CloseAccount,
+};
+#ifndef __cplusplus
+typedef uint8_t Token_AuthorityType;
+#endif // __cplusplus
+
+typedef uint8_t Token_Pubkey[32];
+
+/**
+ * A C representation of Rust's `std::option::Option`
+ */
+typedef enum Token_COption_Pubkey_Tag {
+    /**
+     * No value
+     */
+    Token_COption_Pubkey_None_Pubkey,
+    /**
+     * Some value `T`
+     */
+    Token_COption_Pubkey_Some_Pubkey,
+} Token_COption_Pubkey_Tag;
+
+typedef struct Token_COption_Pubkey_Token_Some_Body_Pubkey {
+    Token_Pubkey _0;
+} Token_COption_Pubkey_Token_Some_Body_Pubkey;
+
+typedef struct Token_COption_Pubkey {
+    Token_COption_Pubkey_Tag tag;
+    union {
+        Token_COption_Pubkey_Token_Some_Body_Pubkey some;
+    };
+} Token_COption_Pubkey;
+
 /**
  * Instructions supported by the token program.
  */
@@ -31,17 +114,15 @@ typedef enum Token_TokenInstruction_Tag {
      * 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.
+     *   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.
+     * 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
@@ -52,6 +133,7 @@ typedef enum Token_TokenInstruction_Tag {
      *   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,
     /**
@@ -68,7 +150,8 @@ typedef enum Token_TokenInstruction_Tag {
      * 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.
+     *   1. `[]` Rent sysvar
+     *   2. ..2+N. `[]` The signer accounts, must equal to N where 1 <= N <= 11.
      */
     Token_TokenInstruction_InitializeMultisig,
     /**
@@ -81,18 +164,19 @@ typedef enum Token_TokenInstruction_Tag {
      *   * Single owner/delegate
      *   0. `[writable]` The source account.
      *   1. `[writable]` The destination account.
-     *   2. '[signer]' The source account's owner/delegate.
+     *   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.
+     *   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
@@ -103,8 +187,8 @@ typedef enum Token_TokenInstruction_Tag {
      *   * Multisignature owner
      *   0. `[writable]` The source account.
      *   1. `[]` The delegate.
-     *   2. '[]' The source account's multisignature owner.
-     *   3. ..3+M '[signer]' M signer accounts
+     *   2. `[]` The source account's multisignature owner.
+     *   3. ..3+M `[signer]` M signer accounts
      */
     Token_TokenInstruction_Approve,
     /**
@@ -118,42 +202,40 @@ typedef enum Token_TokenInstruction_Tag {
      *
      *   * Multisignature owner
      *   0. `[writable]` The source account.
-     *   1. '[]' The source account's multisignature owner.
-     *   2. ..2+M '[signer]' M signer accounts
+     *   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.
+     * Sets a new authority 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.
+     *   * Single authority
+     *   0. `[writable]` The mint or account to change the authority of.
+     *   1. `[signer]` The current authority 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
+     *   * 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_SetOwner,
+    Token_TokenInstruction_SetAuthority,
     /**
      * Mints new tokens to an account.  The native mint does not support minting.
      *
      * Accounts expected by this instruction:
      *
-     *   * Single owner
+     *   * Single authority
      *   0. `[writable]` The mint.
      *   1. `[writable]` The account to mint tokens to.
-     *   2. `[signer]` The mint's owner.
+     *   2. `[signer]` The mint's minting authority.
      *
-     *   * Multisignature owner
+     *   * Multisignature authority
      *   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.
+     *   2. `[]` The mint's multisignature mint-tokens authority.
+     *   3. ..3+M `[signer]` M signer accounts.
      */
     Token_TokenInstruction_MintTo,
     /**
@@ -164,12 +246,14 @@ typedef enum Token_TokenInstruction_Tag {
      *
      *   * Single owner/delegate
      *   0. `[writable]` The account to burn from.
-     *   1. `[signer]` The account's owner/delegate.
+     *   1. `[writable]` The token mint.
+     *   2. `[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.
+     *   1. '[writable]' The token mint.
+     *   2. `[]` The account's multisignature owner/delegate.
+     *   3. ..3+M '[signer]' M signer accounts.
      */
     Token_TokenInstruction_Burn,
     /**
@@ -180,27 +264,155 @@ typedef enum Token_TokenInstruction_Tag {
      *
      *   * Single owner
      *   0. `[writable]` The account to close.
-     *   1. '[writable]' The destination account.
+     *   1. `[writable]` The destination account.
      *   2. `[signer]` The account's owner.
      *
      *   * Multisignature owner
      *   0. `[writable]` The account to close.
-     *   1. '[writable]' The destination account.
+     *   1. `[writable]` The destination account.
      *   2. `[]` The account's multisignature owner.
-     *   3. ..3+M '[signer]' M signer accounts.
+     *   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 {
-    /**
-     * Initial amount of tokens to mint.
-     */
-    uint64_t amount;
     /**
      * 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 {
@@ -224,6 +436,17 @@ typedef struct Token_TokenInstruction_Token_Approve_Body {
     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.
@@ -238,6 +461,50 @@ typedef struct Token_TokenInstruction_Token_Burn_Body {
     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 {
@@ -245,48 +512,30 @@ typedef struct Token_TokenInstruction {
         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;
 
-typedef uint8_t Token_Pubkey[32];
-
-/**
- * A C representation of Rust's `std::option::Option`
- */
-typedef enum Token_COption_Pubkey_Tag {
-    /**
-     * No value
-     */
-    Token_COption_Pubkey_None_Pubkey,
-    /**
-     * Some value `T`
-     */
-    Token_COption_Pubkey_Some_Pubkey,
-} Token_COption_Pubkey_Tag;
-
-typedef struct Token_COption_Pubkey_Token_Some_Body_Pubkey {
-    Token_Pubkey _0;
-} Token_COption_Pubkey_Token_Some_Body_Pubkey;
-
-typedef struct Token_COption_Pubkey {
-    Token_COption_Pubkey_Tag tag;
-    union {
-        Token_COption_Pubkey_Token_Some_Body_Pubkey some;
-    };
-} Token_COption_Pubkey;
-
 /**
  * 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 mint_authority;
+    /**
+     * Total supply of tokens.
      */
-    Token_COption_Pubkey owner;
+    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;
 
 /**