Browse Source

Move c header generation out of build.rs

Michael Vines 5 years ago
parent
commit
70edf1b866
3 changed files with 65 additions and 421 deletions
  1. 0 3
      program/Cargo.toml
  2. 0 65
      program/build.rs
  3. 65 353
      program/inc/token.h

+ 0 - 3
program/Cargo.toml

@@ -29,8 +29,5 @@ num_enum = "0.5.1"
 [dev-dependencies]
 rand = { version = "0.7.0"}
 
-[build-dependencies]
-cbindgen = "=0.14.2"
-
 [lib]
 crate-type = ["cdylib", "lib"]

+ 0 - 65
program/build.rs

@@ -1,65 +0,0 @@
-extern crate cbindgen;
-
-use std::env;
-
-fn main() {
-    println!("cargo:rerun-if-env-changed=SPL_CBINDGEN");
-    println!("cargo:rerun-if-changed=inc/token.h");
-    if std::path::Path::new("inc/token.h").exists() && env::var("SPL_CBINDGEN").is_err() {
-        return;
-    }
-
-    println!("cargo:warning=Generating inc/token.h");
-    let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
-    let config = cbindgen::Config {
-        header: Some("/* Autogenerated SPL Token program C Bindings */".to_string()),
-        after_includes: Some(format!(
-            "{}{}{}",
-            format!(
-                "\n#define TOKEN_MAJOR_VERSION {}",
-                env!("CARGO_PKG_VERSION_MAJOR")
-            ),
-            format!(
-                "\n#define TOKEN_MINOR_VERSION {}",
-                env!("CARGO_PKG_VERSION_MINOR")
-            ),
-            format!(
-                "\n#define TOKEN_PATCH_VERSION {}",
-                env!("CARGO_PKG_VERSION_PATCH")
-            )
-        )),
-        language: cbindgen::Language::C,
-        line_length: 80,
-        style: cbindgen::Style::Both,
-        tab_width: 4,
-        cpp_compat: true,
-        pragma_once: true,
-        enumeration: cbindgen::EnumConfig {
-            prefix_with_name: true,
-            ..cbindgen::EnumConfig::default()
-        },
-        export: cbindgen::ExportConfig {
-            prefix: Some("Token_".to_string()),
-            include: vec![
-                "TokenInstruction".to_string(),
-                "Mint".to_string(),
-                "Account".to_string(),
-                "Multisig".to_string(),
-            ],
-            exclude: vec!["DECIMALS".to_string()],
-            ..cbindgen::ExportConfig::default()
-        },
-        parse: cbindgen::ParseConfig {
-            parse_deps: true,
-            include: Some(vec!["solana-sdk".to_string()]),
-            ..cbindgen::ParseConfig::default()
-        },
-        ..cbindgen::Config::default()
-    };
-    cbindgen::Builder::new()
-        .with_crate(crate_dir)
-        .with_config(config)
-        .generate()
-        .unwrap()
-        .write_to_file("inc/token.h");
-}

+ 65 - 353
program/inc/token.h

@@ -7,10 +7,6 @@
 #include <stdint.h>
 #include <stdlib.h>
 
-#define TOKEN_MAJOR_VERSION 1
-#define TOKEN_MINOR_VERSION 1
-#define TOKEN_PATCH_VERSION 0
-
 /**
  * Maximum number of multisignature signers (max N)
  */
@@ -21,89 +17,6 @@
  */
 #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.
  */
@@ -118,15 +31,17 @@ typedef enum Token_TokenInstruction_Tag {
      * Accounts expected by this instruction:
      *
      *   0. `[writable]` The mint to initialize.
-     *   1. `[]` Rent sysvar
+     *   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.
      *
      */
     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.
+     * 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
@@ -137,7 +52,6 @@ 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,
     /**
@@ -154,8 +68,7 @@ typedef enum Token_TokenInstruction_Tag {
      * 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.
+     *   1. ..1+N. `[]` The signer accounts, must equal to N where 1 <= N <= 11.
      */
     Token_TokenInstruction_InitializeMultisig,
     /**
@@ -180,7 +93,6 @@ typedef enum Token_TokenInstruction_Tag {
     /**
      * 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
@@ -211,34 +123,36 @@ typedef enum Token_TokenInstruction_Tag {
      */
     Token_TokenInstruction_Revoke,
     /**
-     * Sets a new authority of a mint or account.
+     * Sets a new owner 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.
+     *   * 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 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
+     *   * 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_SetAuthority,
+    Token_TokenInstruction_SetOwner,
     /**
      * Mints new tokens to an account.  The native mint does not support minting.
      *
      * Accounts expected by this instruction:
      *
-     *   * Single authority
+     *   * Single owner
      *   0. `[writable]` The mint.
      *   1. `[writable]` The account to mint tokens to.
-     *   2. `[signer]` The mint's minting authority.
+     *   2. `[signer]` The mint's owner.
      *
-     *   * Multisignature authority
+     *   * Multisignature owner
      *   0. `[writable]` The mint.
      *   1. `[writable]` The account to mint tokens to.
-     *   2. `[]` The mint's multisignature mint-tokens authority.
+     *   2. `[]` The mint's multisignature owner.
      *   3. ..3+M '[signer]' M signer accounts.
      */
     Token_TokenInstruction_MintTo,
@@ -250,14 +164,12 @@ typedef enum Token_TokenInstruction_Tag {
      *
      *   * Single owner/delegate
      *   0. `[writable]` The account to burn from.
-     *   1. '[writable]' The token mint.
-     *   2. `[signer]` The account's owner/delegate.
+     *   1. `[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.
+     *   1. `[]` The account's multisignature owner/delegate.
+     *   2. ..2+M '[signer]' M signer accounts.
      */
     Token_TokenInstruction_Burn,
     /**
@@ -278,145 +190,17 @@ typedef enum Token_TokenInstruction_Tag {
      *   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.
+     * Initial amount of tokens to mint.
      */
-    Token_Pubkey mint_authority;
+    uint64_t amount;
     /**
-     * The freeze authority/multisignature of the mint.
+     * Number of base 10 digits to the right of the decimal place.
      */
-    Token_COption_Pubkey freeze_authority;
+    uint8_t decimals;
 } Token_TokenInstruction_Token_InitializeMint_Body;
 
 typedef struct Token_TokenInstruction_Token_InitializeMultisig_Body {
@@ -440,17 +224,6 @@ 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.
@@ -465,50 +238,6 @@ 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 {
@@ -516,30 +245,48 @@ 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];
+
 /**
- * Mint data.
+ * A C representation of Rust's `std::option::Option`
  */
-typedef struct Token_Mint {
+typedef enum Token_COption_Pubkey_Tag {
     /**
-     * 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.
+     * No value
      */
-    Token_COption_Pubkey mint_authority;
+    Token_COption_Pubkey_None_Pubkey,
     /**
-     * Total supply of tokens.
+     * Some value `T`
      */
-    uint64_t supply;
+    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.
+     */
+    Token_COption_Pubkey owner;
     /**
      * Number of base 10 digits to the right of the decimal place.
      */
@@ -548,37 +295,8 @@ 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.
  */
@@ -601,23 +319,17 @@ typedef struct Token_Account {
      */
     Token_COption_Pubkey delegate;
     /**
-     * The account's state
+     * Is `true` if this structure has been initialized
      */
-    Token_AccountState state;
+    bool is_initialized;
     /**
-     * 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.
+     * Is this a native token
      */
-    Token_COption_u64 is_native;
+    bool is_native;
     /**
      * The amount delegated
      */
     uint64_t delegated_amount;
-    /**
-     * Optional authority to close the account.
-     */
-    Token_COption_Pubkey close_authority;
 } Token_Account;
 
 /**