/* Autogenerated SPL Token-Swap program C Bindings */

#pragma once

#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

/**
 * fee rate as a ratio
 */
typedef struct TokenSwap_Fee {
    /**
     * denominator of the fee ratio
     */
    uint64_t denominator;
    /**
     * numerator of the fee ratio
     */
    uint64_t numerator;
} TokenSwap_Fee;

/**
 * Instructions supported by the SwapInfo program.
 */
typedef enum TokenSwap_SwapInstruction_Tag {
    /**
     *   Initializes a new SwapInfo.
     *
     *   0. `[writable, signer]` New Token-swap to create.
     *   1. `[]` $authority derived from `create_program_address(&[Token-swap account])`
     *   2. `[]` token_a Account. Must be non zero, owned by $authority.
     *   3. `[]` token_b Account. Must be non zero, owned by $authority.
     *   4. `[writable]` pool Token. Must be empty, owned by $authority.
     *   5. `[writable]` Pool Account to deposit the generated tokens, user is the owner.
     *   6. '[]` Token program id
     *   userdata: fee rate as a ratio
     */
    Initialize,
    /**
     *   Swap the tokens in the pool.
     *
     *   0. `[]` Token-swap
     *   1. `[]` $authority
     *   2. `[writable]` token_(A|B) SOURCE Account, amount is transferable by $authority,
     *   4. `[writable]` token_(A|B) Base Account to swap INTO.  Must be the SOURCE token.
     *   5. `[writable]` token_(A|B) Base Account to swap FROM.  Must be the DEST token.
     *   6. `[writable]` token_(A|B) DEST Account assigned to USER as the owner.
     *   7. '[]` Token program id
     *   userdata: SOURCE amount to transfer, output to DEST is based on the exchange rate
     */
    Swap,
    /**
     *   Deposit some tokens into the pool.  The output is a "pool" token representing ownership
     *   into the pool. Inputs are converted to the current ratio.
     *
     *   0. `[]` Token-swap
     *   1. `[]` $authority
     *   2. `[writable]` token_a $authority can transfer amount,
     *   4. `[writable]` token_b $authority can transfer amount,
     *   6. `[writable]` token_a Base Account to deposit into.
     *   7. `[writable]` token_b Base Account to deposit into.
     *   8. `[writable]` Pool MINT account, $authority is the owner.
     *   9. `[writable]` Pool Account to deposit the generated tokens, user is the owner.
     *   10. '[]` Token program id
     *   userdata: token_a amount to transfer.  token_b amount is set by the current exchange rate.
     */
    Deposit,
    /**
     *   Withdraw the token from the pool at the current ratio.
     *
     *   0. `[]` Token-swap
     *   1. `[]` $authority
     *   2. `[writable]` SOURCE Pool account, amount is transferable by $authority.
     *   5. `[writable]` token_a Account to withdraw FROM.
     *   6. `[writable]` token_b Account to withdraw FROM.
     *   7. `[writable]` token_a user Account.
     *   8. `[writable]` token_b user Account.
     *   9. '[]` Token program id
     *   userdata: SOURCE amount of pool tokens to transfer. User receives an output based on the
     *   percentage of the pool tokens that are returned.
     */
    Withdraw,
} TokenSwap_SwapInstruction_Tag;

typedef struct TokenSwap_Initialize_Body {
    TokenSwap_Fee _0;
} TokenSwap_Initialize_Body;

typedef struct TokenSwap_Swap_Body {
    uint64_t _0;
} TokenSwap_Swap_Body;

typedef struct TokenSwap_Deposit_Body {
    uint64_t _0;
} TokenSwap_Deposit_Body;

typedef struct TokenSwap_Withdraw_Body {
    uint64_t _0;
} TokenSwap_Withdraw_Body;

typedef struct TokenSwap_SwapInstruction {
    TokenSwap_SwapInstruction_Tag tag;
    union {
        TokenSwap_Initialize_Body initialize;
        TokenSwap_Swap_Body swap;
        TokenSwap_Deposit_Body deposit;
        TokenSwap_Withdraw_Body withdraw;
    };
} TokenSwap_SwapInstruction;

typedef uint8_t TokenSwap_Pubkey[32];

/**
 * Initialized program details.
 */
typedef struct TokenSwap_SwapInfo {
    /**
     * Token A
     * The Liquidity token is issued against this value.
     */
    TokenSwap_Pubkey token_a;
    /**
     * Token B
     */
    TokenSwap_Pubkey token_b;
    /**
     * Pool tokens are issued when A or B tokens are deposited.
     * Pool tokens can be withdrawn back to the original A or B token.
     */
    TokenSwap_Pubkey pool_mint;
    /**
     * Fee applied to the input token amount prior to output calculation.
     */
    TokenSwap_Fee fee;
} TokenSwap_SwapInfo;

/**
 * Program states.
 */
typedef enum TokenSwap_State_Tag {
    /**
     * Unallocated state, may be initialized into another state.
     */
    Unallocated,
    /**
     * Initialized state.
     */
    Init,
} TokenSwap_State_Tag;

typedef struct TokenSwap_Init_Body {
    TokenSwap_SwapInfo _0;
} TokenSwap_Init_Body;

typedef struct TokenSwap_State {
    TokenSwap_State_Tag tag;
    union {
        TokenSwap_Init_Body init;
    };
} TokenSwap_State;
