#ifndef SIMPLICITY_BITCOIN_TXENV_H
#define SIMPLICITY_BITCOIN_TXENV_H
#include <stdbool.h>
#include "../sha256.h"
typedef struct outpoint {
sha256_midstate txid;
uint_fast32_t ix;
} outpoint;
typedef struct sigOutput {
uint_fast64_t value;
sha256_midstate scriptPubKey;
} sigOutput;
typedef struct sigInput {
sha256_midstate annexHash;
sha256_midstate scriptSigHash;
outpoint prevOutpoint;
sigOutput txo;
uint_fast32_t sequence;
bool hasAnnex;
} sigInput;
typedef struct bitcoinTransaction {
const sigInput* input;
const sigOutput* output;
sha256_midstate outputValuesHash;
sha256_midstate outputScriptsHash;
sha256_midstate outputsHash;
sha256_midstate inputOutpointsHash;
sha256_midstate inputValuesHash;
sha256_midstate inputScriptsHash;
sha256_midstate inputUTXOsHash;
sha256_midstate inputSequencesHash;
sha256_midstate inputAnnexesHash;
sha256_midstate inputScriptSigsHash;
sha256_midstate inputsHash;
sha256_midstate txHash;
sha256_midstate txid;
uint_fast64_t totalInputValue;
uint_fast64_t totalOutputValue;
uint_fast32_t numInputs;
uint_fast32_t numOutputs;
uint_fast32_t version;
uint_fast32_t lockTime;
bool isFinal;
} bitcoinTransaction;
typedef struct bitcoinTapEnv {
const sha256_midstate *path;
sha256_midstate tapLeafHash;
sha256_midstate tappathHash;
sha256_midstate tapEnvHash;
sha256_midstate internalKey;
sha256_midstate scriptCMR;
unsigned char pathLen;
unsigned char leafVersion;
} bitcoinTapEnv;
typedef struct txEnv {
const bitcoinTransaction* tx;
const bitcoinTapEnv* taproot;
sha256_midstate sigAllHash;
uint_fast32_t ix;
} txEnv;
txEnv rustsimplicity_0_7_bitcoin_build_txEnv(const bitcoinTransaction* tx, const bitcoinTapEnv* taproot, uint_fast32_t ix);
#endif