#include "elementsJets.h"
#include "ops.h"
#include "txEnv.h"
#include "../taptweak.h"
#include "../simplicity_assert.h"
static void readHash(sha256_midstate* h, frameItem *src) {
read32s(h->s, 8, src);
}
static void writeHash(frameItem* dst, const sha256_midstate* h) {
write32s(dst, h->s, 8);
}
static void prevOutpoint(frameItem* dst, const outpoint* op) {
writeHash(dst, &op->txid);
rustsimplicity_0_6_write32(dst, op->ix);
}
static void asset(frameItem* dst, const confidential* asset) {
if (writeBit(dst, EXPLICIT == asset->prefix)) {
skipBits(dst, 1);
} else {
writeBit(dst, ODD_Y == asset->prefix);
}
writeHash(dst, &asset->data);
}
static void amt(frameItem* dst, const confAmount* amt) {
if (writeBit(dst, EXPLICIT == amt->prefix)) {
skipBits(dst, 1 + 256 - 64);
rustsimplicity_0_6_write64(dst, amt->explicit);
} else {
writeBit(dst, ODD_Y == amt->prefix);
writeHash(dst, &amt->confidential);
}
}
static void nonce(frameItem* dst, const confidential* nonce) {
if (writeBit(dst, NONE != nonce->prefix)) {
if (writeBit(dst, EXPLICIT == nonce->prefix)) {
skipBits(dst, 1);
} else {
writeBit(dst, ODD_Y == nonce->prefix);
}
writeHash(dst, &nonce->data);
} else {
skipBits(dst, 1+1+256);
}
}
static void reissuanceBlinding(frameItem* dst, const assetIssuance* issuance) {
if (writeBit(dst, REISSUANCE == issuance->type)) {
writeHash(dst, &issuance->blindingNonce);
} else {
skipBits(dst, 256);
}
}
static void newIssuanceContract(frameItem* dst, const assetIssuance* issuance) {
if (writeBit(dst, NEW_ISSUANCE == issuance->type)) {
writeHash(dst, &issuance->contractHash);
} else {
skipBits(dst, 256);
}
}
static void reissuanceEntropy(frameItem* dst, const assetIssuance* issuance) {
if (writeBit(dst, REISSUANCE == issuance->type)) {
writeHash(dst, &issuance->entropy);
} else {
skipBits(dst, 256);
}
}
static void issuanceAssetAmt(frameItem* dst, const assetIssuance* issuance) {
if (writeBit(dst, NO_ISSUANCE != issuance->type)) {
amt(dst, &issuance->assetAmt);
} else {
skipBits(dst, 258);
}
}
static void issuanceTokenAmt(frameItem* dst, const assetIssuance* issuance) {
if (writeBit(dst, NO_ISSUANCE != issuance->type)) {
amt(dst, NEW_ISSUANCE == issuance->type ? &issuance->tokenAmt : &(confAmount){ .prefix = EXPLICIT, .explicit = 0});
} else {
skipBits(dst, 258);
}
}
static uint_fast32_t lockHeight(const elementsTransaction* tx) {
return !tx->isFinal && tx->lockTime < 500000000U ? tx->lockTime : 0;
}
static uint_fast32_t lockTime(const elementsTransaction* tx) {
return !tx->isFinal && 500000000U <= tx->lockTime ? tx->lockTime : 0;
}
static uint_fast16_t lockDistance(const elementsTransaction* tx) {
return 2 <= tx->version ? tx->lockDistance : 0;
}
static uint_fast16_t lockDuration(const elementsTransaction* tx) {
return 2 <= tx->version ? tx->lockDuration : 0;
}
static bool isFee(const sigOutput* output) {
return output->emptyScript && EXPLICIT == output->asset.prefix && EXPLICIT == output->amt.prefix;
}
static uint_fast64_t lookup_fee(const sha256_midstate* assetid, const sigOutput* const * feeOutputs, uint_fast32_t len) {
while(len) {
int cmp = memcmp(assetid->s, feeOutputs[len/2]->asset.data.s, sizeof(assetid->s));
if (0 == cmp) return feeOutputs[len/2]->assetFee;
if (0 < cmp) {
feeOutputs += len/2 + 1;
len -= len/2 + 1;
} else {
len /= 2;
}
}
return 0;
}
bool rustsimplicity_0_6_version(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; rustsimplicity_0_6_write32(dst, env->tx->version);
return true;
}
bool rustsimplicity_0_6_lock_time(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; rustsimplicity_0_6_write32(dst, env->tx->lockTime);
return true;
}
bool rustsimplicity_0_6_input_pegin(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
if (writeBit(dst, env->tx->input[i].isPegin)) {
writeHash(dst, &env->tx->input[i].pegin);
} else {
skipBits(dst, 256);
}
} else {
skipBits(dst, 257);
}
return true;
}
bool rustsimplicity_0_6_input_prev_outpoint(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
prevOutpoint(dst, &env->tx->input[i].prevOutpoint);
} else {
skipBits(dst, 288);
}
return true;
}
bool rustsimplicity_0_6_input_asset(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
asset(dst, &env->tx->input[i].txo.asset);
} else {
skipBits(dst, 258);
}
return true;
}
bool rustsimplicity_0_6_input_amount(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
asset(dst, &env->tx->input[i].txo.asset);
amt(dst, &env->tx->input[i].txo.amt);
} else {
skipBits(dst, 516);
}
return true;
}
bool rustsimplicity_0_6_input_script_hash(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
writeHash(dst, &env->tx->input[i].txo.scriptPubKey);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_input_sequence(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
rustsimplicity_0_6_write32(dst, env->tx->input[i].sequence);
} else {
skipBits(dst, 32);
}
return true;
}
bool rustsimplicity_0_6_reissuance_blinding(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
reissuanceBlinding(dst, &env->tx->input[i].issuance);
} else {
skipBits(dst, 257);
}
return true;
}
bool rustsimplicity_0_6_new_issuance_contract(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
newIssuanceContract(dst, &env->tx->input[i].issuance);
} else {
skipBits(dst, 257);
}
return true;
}
bool rustsimplicity_0_6_reissuance_entropy(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
reissuanceEntropy(dst, &env->tx->input[i].issuance);
} else {
skipBits(dst, 257);
}
return true;
}
bool rustsimplicity_0_6_issuance_asset_amount(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
issuanceAssetAmt(dst, &env->tx->input[i].issuance);
} else {
skipBits(dst, 259);
}
return true;
}
bool rustsimplicity_0_6_issuance_token_amount(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
issuanceTokenAmt(dst, &env->tx->input[i].issuance);
} else {
skipBits(dst, 259);
}
return true;
}
bool rustsimplicity_0_6_issuance_asset_proof(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
writeHash(dst, &env->tx->input[i].issuance.assetRangeProofHash);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_issuance_token_proof(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
writeHash(dst, &env->tx->input[i].issuance.tokenRangeProofHash);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_input_annex_hash(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
if (writeBit(dst, env->tx->input[i].hasAnnex)) {
writeHash(dst, &env->tx->input[i].annexHash);
} else {
skipBits(dst, 256);
}
} else {
skipBits(dst, 257);
}
return true;
}
bool rustsimplicity_0_6_input_script_sig_hash(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
writeHash(dst, &env->tx->input[i].scriptSigHash);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_output_asset(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numOutputs)) {
asset(dst, &env->tx->output[i].asset);
} else {
skipBits(dst, 258);
}
return true;
}
bool rustsimplicity_0_6_output_amount(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numOutputs)) {
asset(dst, &env->tx->output[i].asset);
amt(dst, &env->tx->output[i].amt);
} else {
skipBits(dst, 516);
}
return true;
}
bool rustsimplicity_0_6_output_nonce(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numOutputs)) {
nonce(dst, &env->tx->output[i].nonce);
} else {
skipBits(dst, 259);
}
return true;
}
bool rustsimplicity_0_6_output_script_hash(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numOutputs)) {
writeHash(dst, &env->tx->output[i].scriptPubKey);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_output_null_datum(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numOutputs && env->tx->output[i].isNullData)) {
uint_fast32_t j = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, j < env->tx->output[i].pnd.len)) {
if (writeBit(dst, OP_PUSHDATA4 < env->tx->output[i].pnd.op[j].code)) {
skipBits(dst, 2 + 256 - 5);
if (writeBit(dst, OP_1 <= env->tx->output[i].pnd.op[j].code)) {
switch (env->tx->output[i].pnd.op[j].code) {
case OP_1 : writeBit(dst, 0); writeBit(dst, 0); writeBit(dst, 0); writeBit(dst, 0); break;
case OP_2 : writeBit(dst, 0); writeBit(dst, 0); writeBit(dst, 0); writeBit(dst, 1); break;
case OP_3 : writeBit(dst, 0); writeBit(dst, 0); writeBit(dst, 1); writeBit(dst, 0); break;
case OP_4 : writeBit(dst, 0); writeBit(dst, 0); writeBit(dst, 1); writeBit(dst, 1); break;
case OP_5 : writeBit(dst, 0); writeBit(dst, 1); writeBit(dst, 0); writeBit(dst, 0); break;
case OP_6 : writeBit(dst, 0); writeBit(dst, 1); writeBit(dst, 0); writeBit(dst, 1); break;
case OP_7 : writeBit(dst, 0); writeBit(dst, 1); writeBit(dst, 1); writeBit(dst, 0); break;
case OP_8 : writeBit(dst, 0); writeBit(dst, 1); writeBit(dst, 1); writeBit(dst, 1); break;
case OP_9 : writeBit(dst, 1); writeBit(dst, 0); writeBit(dst, 0); writeBit(dst, 0); break;
case OP_10: writeBit(dst, 1); writeBit(dst, 0); writeBit(dst, 0); writeBit(dst, 1); break;
case OP_11: writeBit(dst, 1); writeBit(dst, 0); writeBit(dst, 1); writeBit(dst, 0); break;
case OP_12: writeBit(dst, 1); writeBit(dst, 0); writeBit(dst, 1); writeBit(dst, 1); break;
case OP_13: writeBit(dst, 1); writeBit(dst, 1); writeBit(dst, 0); writeBit(dst, 0); break;
case OP_14: writeBit(dst, 1); writeBit(dst, 1); writeBit(dst, 0); writeBit(dst, 1); break;
case OP_15: writeBit(dst, 1); writeBit(dst, 1); writeBit(dst, 1); writeBit(dst, 0); break;
case OP_16: writeBit(dst, 1); writeBit(dst, 1); writeBit(dst, 1); writeBit(dst, 1); break;
default: SIMPLICITY_UNREACHABLE;
}
} else {
rustsimplicity_0_6_debug_assert(OP_RESERVED == env->tx->output[i].pnd.op[j].code ||
OP_1NEGATE == env->tx->output[i].pnd.op[j].code);
skipBits(dst, 3);
writeBit(dst, OP_RESERVED == env->tx->output[i].pnd.op[j].code);
}
} else {
switch (env->tx->output[i].pnd.op[j].code) {
case OP_IMMEDIATE: writeBit(dst, 0); writeBit(dst, 0); break;
case OP_PUSHDATA: writeBit(dst, 0); writeBit(dst, 1); break;
case OP_PUSHDATA2: writeBit(dst, 1); writeBit(dst, 0); break;
case OP_PUSHDATA4: writeBit(dst, 1); writeBit(dst, 1); break;
default: SIMPLICITY_UNREACHABLE;
}
writeHash(dst, &env->tx->output[i].pnd.op[j].dataHash);
}
} else {
skipBits(dst, 1 + 2 + 256);
}
} else {
skipBits(dst, 1 + 1 + 2 + 256);
}
return true;
}
bool rustsimplicity_0_6_output_is_fee(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numOutputs)) {
writeBit(dst, isFee(&env->tx->output[i]));
} else {
skipBits(dst, 1);
}
return true;
}
bool rustsimplicity_0_6_output_surjection_proof(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numOutputs)) {
writeHash(dst, &env->tx->output[i].surjectionProofHash);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_output_range_proof(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numOutputs)) {
writeHash(dst, &env->tx->output[i].rangeProofHash);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_total_fee(frameItem* dst, frameItem src, const txEnv* env) {
sha256_midstate assetid;
readHash(&assetid, &src);
rustsimplicity_0_6_write64(dst, lookup_fee(&assetid, env->tx->feeOutputs, env->tx->numFees));
return true;
}
bool rustsimplicity_0_6_genesis_block_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; write32s(dst, env->genesisHash.s, 8);
return true;
}
bool rustsimplicity_0_6_script_cmr(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; write32s(dst, env->taproot->scriptCMR.s, 8);
return true;
}
bool rustsimplicity_0_6_transaction_id(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; write32s(dst, env->tx->txid.s, 8);
return true;
}
bool rustsimplicity_0_6_current_index(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; rustsimplicity_0_6_write32(dst, env->ix);
return true;
}
bool rustsimplicity_0_6_current_pegin(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
if (writeBit(dst, env->tx->input[env->ix].isPegin)) {
writeHash(dst, &env->tx->input[env->ix].pegin);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_current_prev_outpoint(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
prevOutpoint(dst, &env->tx->input[env->ix].prevOutpoint);
return true;
}
bool rustsimplicity_0_6_current_asset(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
asset(dst, &env->tx->input[env->ix].txo.asset);
return true;
}
bool rustsimplicity_0_6_current_amount(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
asset(dst, &env->tx->input[env->ix].txo.asset);
amt(dst, &env->tx->input[env->ix].txo.amt);
return true;
}
bool rustsimplicity_0_6_current_script_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
writeHash(dst, &env->tx->input[env->ix].txo.scriptPubKey);
return true;
}
bool rustsimplicity_0_6_current_sequence(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
rustsimplicity_0_6_write32(dst, env->tx->input[env->ix].sequence);
return true;
}
bool rustsimplicity_0_6_current_reissuance_blinding(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
reissuanceBlinding(dst, &env->tx->input[env->ix].issuance);
return true;
}
bool rustsimplicity_0_6_current_new_issuance_contract(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
newIssuanceContract(dst, &env->tx->input[env->ix].issuance);
return true;
}
bool rustsimplicity_0_6_current_reissuance_entropy(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
reissuanceEntropy(dst, &env->tx->input[env->ix].issuance);
return true;
}
bool rustsimplicity_0_6_current_issuance_asset_amount(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
issuanceAssetAmt(dst, &env->tx->input[env->ix].issuance);
return true;
}
bool rustsimplicity_0_6_current_issuance_token_amount(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
issuanceTokenAmt(dst, &env->tx->input[env->ix].issuance);
return true;
}
bool rustsimplicity_0_6_current_issuance_asset_proof(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
writeHash(dst, &env->tx->input[env->ix].issuance.assetRangeProofHash);
return true;
}
bool rustsimplicity_0_6_current_issuance_token_proof(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
writeHash(dst, &env->tx->input[env->ix].issuance.tokenRangeProofHash);
return true;
}
bool rustsimplicity_0_6_current_script_sig_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
writeHash(dst, &env->tx->input[env->ix].scriptSigHash);
return true;
}
bool rustsimplicity_0_6_current_annex_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; if (env->tx->numInputs <= env->ix) return false;
if (writeBit(dst, env->tx->input[env->ix].hasAnnex)) {
writeHash(dst, &env->tx->input[env->ix].annexHash);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_tapleaf_version(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; rustsimplicity_0_6_write8(dst, env->taproot->leafVersion);
return true;
}
bool rustsimplicity_0_6_tappath(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast8_t i = rustsimplicity_0_6_read8(&src);
if (writeBit(dst, i < env->taproot->pathLen)) {
writeHash(dst, &env->taproot->path[i]);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_internal_key(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->taproot->internalKey);
return true;
}
bool rustsimplicity_0_6_num_inputs(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; rustsimplicity_0_6_write32(dst, env->tx->numInputs);
return true;
}
bool rustsimplicity_0_6_num_outputs(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; rustsimplicity_0_6_write32(dst, env->tx->numOutputs);
return true;
}
bool rustsimplicity_0_6_tx_is_final(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeBit(dst, env->tx->isFinal);
return true;
}
bool rustsimplicity_0_6_tx_lock_height(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; rustsimplicity_0_6_write32(dst, lockHeight(env->tx));
return true;
}
bool rustsimplicity_0_6_tx_lock_time(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; rustsimplicity_0_6_write32(dst, lockTime(env->tx));
return true;
}
bool rustsimplicity_0_6_tx_lock_distance(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; rustsimplicity_0_6_write16(dst, lockDistance(env->tx));
return true;
}
bool rustsimplicity_0_6_tx_lock_duration(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; rustsimplicity_0_6_write16(dst, lockDuration(env->tx));
return true;
}
bool rustsimplicity_0_6_check_lock_height(frameItem* dst, frameItem src, const txEnv* env) {
(void) dst; uint_fast32_t x = rustsimplicity_0_6_read32(&src);
return x <= lockHeight(env->tx);
}
bool rustsimplicity_0_6_check_lock_time(frameItem* dst, frameItem src, const txEnv* env) {
(void) dst; uint_fast32_t x = rustsimplicity_0_6_read32(&src);
return x <= lockTime(env->tx);
}
bool rustsimplicity_0_6_check_lock_distance(frameItem* dst, frameItem src, const txEnv* env) {
(void) dst; uint_fast16_t x = rustsimplicity_0_6_read16(&src);
return x <= lockDistance(env->tx);
}
bool rustsimplicity_0_6_check_lock_duration(frameItem* dst, frameItem src, const txEnv* env) {
(void) dst; uint_fast16_t x = rustsimplicity_0_6_read16(&src);
return x <= lockDuration(env->tx);
}
bool rustsimplicity_0_6_calculate_issuance_entropy(frameItem* dst, frameItem src, const txEnv* env) {
(void) env; outpoint op;
sha256_midstate contract;
sha256_midstate result;
read32s(op.txid.s, 8, &src);
op.ix = rustsimplicity_0_6_read32(&src);
read32s(contract.s, 8, &src);
result = rustsimplicity_0_6_generateIssuanceEntropy(&op, &contract);
writeHash(dst, &result);
return true;
}
bool rustsimplicity_0_6_calculate_asset(frameItem* dst, frameItem src, const txEnv* env) {
(void) env; sha256_midstate entropy;
sha256_midstate result;
read32s(entropy.s, 8, &src);
result = rustsimplicity_0_6_calculateAsset(&entropy);
writeHash(dst, &result);
return true;
}
bool rustsimplicity_0_6_calculate_explicit_token(frameItem* dst, frameItem src, const txEnv* env) {
(void) env; sha256_midstate entropy;
sha256_midstate result;
read32s(entropy.s, 8, &src);
result = rustsimplicity_0_6_calculateToken(&entropy, EXPLICIT);
writeHash(dst, &result);
return true;
}
bool rustsimplicity_0_6_calculate_confidential_token(frameItem* dst, frameItem src, const txEnv* env) {
(void) env; sha256_midstate entropy;
sha256_midstate result;
read32s(entropy.s, 8, &src);
result = rustsimplicity_0_6_calculateToken(&entropy, EVEN_Y );
writeHash(dst, &result);
return true;
}
bool rustsimplicity_0_6_lbtc_asset(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; (void) env; const sha256_midstate lbtc_assetid = {{
0x6d521c38u, 0xec1ea157u, 0x34ae22b7u, 0xc4606441u, 0x2829c0d0u, 0x579f0a71u, 0x3d1c04edu, 0xe979026fu
}};
writeHash(dst, &lbtc_assetid);
return true;
}
bool rustsimplicity_0_6_build_tapleaf_simplicity(frameItem* dst, frameItem src, const txEnv* env) {
(void) env; sha256_midstate cmr;
readHash(&cmr, &src);
sha256_midstate result = rustsimplicity_0_6_make_tapleaf(0xbe, &cmr);
writeHash(dst, &result);
return true;
}
bool rustsimplicity_0_6_build_tapbranch(frameItem* dst, frameItem src, const txEnv* env) {
(void) env; sha256_midstate a, b;
readHash(&a, &src);
readHash(&b, &src);
sha256_midstate result = rustsimplicity_0_6_make_tapbranch(&a, &b);
writeHash(dst, &result);
return true;
}
bool rustsimplicity_0_6_build_taptweak(frameItem* dst, frameItem src, const txEnv* env) {
(void) env; static unsigned char taptweak[] = "TapTweak/elements";
return rustsimplicity_0_6_generic_taptweak(dst, &src, taptweak, sizeof(taptweak)-1);
}
bool rustsimplicity_0_6_outpoint_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) env; sha256_midstate midstate;
unsigned char buf[36];
sha256_context ctx = {.output = midstate.s};
if (!rustsimplicity_0_6_read_sha256_context(&ctx, &src)) return false;
if (readBit(&src)) {
read8s(buf, 32, &src);
sha256_uchar(&ctx, 0x01);
sha256_uchars(&ctx, buf, 32);
} else {
sha256_uchar(&ctx, 0x00);
forwardBits(&src, 256);
}
read8s(buf, 36, &src);
sha256_uchars(&ctx, buf, 36);
return rustsimplicity_0_6_write_sha256_context(dst, &ctx);
}
bool rustsimplicity_0_6_asset_amount_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) env; sha256_midstate midstate;
unsigned char buf[32];
sha256_context ctx = {.output = midstate.s};
if (!rustsimplicity_0_6_read_sha256_context(&ctx, &src)) return false;
if (readBit(&src)) {
forwardBits(&src, 1);
sha256_uchar(&ctx, 0x01);
} else {
if (readBit(&src)) {
sha256_uchar(&ctx, 0x0b);
} else {
sha256_uchar(&ctx, 0x0a);
}
}
read8s(buf, 32, &src);
sha256_uchars(&ctx, buf, 32);
if (readBit(&src)) {
sha256_uchar(&ctx, 0x01);
forwardBits(&src, 257-64);
read8s(buf, 8, &src);
sha256_uchars(&ctx, buf, 8);
} else {
if (readBit(&src)) {
sha256_uchar(&ctx, 0x09);
} else {
sha256_uchar(&ctx, 0x08);
}
read8s(buf, 32, &src);
sha256_uchars(&ctx, buf, 32);
}
return rustsimplicity_0_6_write_sha256_context(dst, &ctx);
}
bool rustsimplicity_0_6_nonce_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) env; sha256_midstate midstate;
unsigned char buf[32];
sha256_context ctx = {.output = midstate.s};
if (!rustsimplicity_0_6_read_sha256_context(&ctx, &src)) return false;
if (readBit(&src)) {
if (readBit(&src)) {
forwardBits(&src, 1);
sha256_uchar(&ctx, 0x01);
} else {
if (readBit(&src)) {
sha256_uchar(&ctx, 0x03);
} else {
sha256_uchar(&ctx, 0x02);
}
}
read8s(buf, 32, &src);
sha256_uchars(&ctx, buf, 32);
} else {
sha256_uchar(&ctx, 0x00);
}
return rustsimplicity_0_6_write_sha256_context(dst, &ctx);
}
bool rustsimplicity_0_6_annex_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) env; sha256_midstate midstate;
unsigned char buf[32];
sha256_context ctx = {.output = midstate.s};
if (!rustsimplicity_0_6_read_sha256_context(&ctx, &src)) return false;
if (readBit(&src)) {
read8s(buf, 32, &src);
sha256_uchar(&ctx, 0x01);
sha256_uchars(&ctx, buf, 32);
} else {
sha256_uchar(&ctx, 0x00);
}
return rustsimplicity_0_6_write_sha256_context(dst, &ctx);
}
bool rustsimplicity_0_6_issuance(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
const sigInput* input = &env->tx->input[i];
if (writeBit(dst, NO_ISSUANCE != input->issuance.type)) {
writeBit(dst, REISSUANCE == input->issuance.type);
} else {
skipBits(dst, 1);
}
} else {
skipBits(dst, 2);
}
return true;
}
bool rustsimplicity_0_6_issuance_entropy(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
const sigInput* input = &env->tx->input[i];
if (writeBit(dst, NO_ISSUANCE != input->issuance.type)) {
writeHash(dst, &input->issuance.entropy);
} else {
skipBits(dst, 256);
}
} else {
skipBits(dst, 257);
}
return true;
}
bool rustsimplicity_0_6_issuance_asset(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
const sigInput* input = &env->tx->input[i];
if (writeBit(dst, NO_ISSUANCE != input->issuance.type)) {
writeHash(dst, &input->issuance.assetId);
} else {
skipBits(dst, 256);
}
} else {
skipBits(dst, 257);
}
return true;
}
bool rustsimplicity_0_6_issuance_token(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
const sigInput* input = &env->tx->input[i];
if (writeBit(dst, NO_ISSUANCE != input->issuance.type)) {
writeHash(dst, &input->issuance.tokenId);
} else {
skipBits(dst, 256);
}
} else {
skipBits(dst, 257);
}
return true;
}
bool rustsimplicity_0_6_output_amounts_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->outputAssetAmountsHash);
return true;
}
bool rustsimplicity_0_6_output_nonces_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->outputNoncesHash);
return true;
}
bool rustsimplicity_0_6_output_scripts_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->outputScriptsHash);
return true;
}
bool rustsimplicity_0_6_output_range_proofs_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->outputRangeProofsHash);
return true;
}
bool rustsimplicity_0_6_output_surjection_proofs_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->outputSurjectionProofsHash);
return true;
}
bool rustsimplicity_0_6_outputs_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->outputsHash);
return true;
}
bool rustsimplicity_0_6_output_hash(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numOutputs)) {
const sigOutput* output = &env->tx->output[i];
sha256_midstate midstate;
sha256_context ctx = sha256_init(midstate.s);
rustsimplicity_0_6_sha256_confAsset(&ctx, &output->asset);
rustsimplicity_0_6_sha256_confAmt(&ctx, &output->amt);
rustsimplicity_0_6_sha256_confNonce(&ctx, &output->nonce);
sha256_hash(&ctx, &output->scriptPubKey);
sha256_hash(&ctx, &output->rangeProofHash);
sha256_finalize(&ctx);
writeHash(dst, &midstate);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_input_outpoints_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->inputOutpointsHash);
return true;
}
bool rustsimplicity_0_6_input_amounts_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->inputAssetAmountsHash);
return true;
}
bool rustsimplicity_0_6_input_scripts_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->inputScriptsHash);
return true;
}
bool rustsimplicity_0_6_input_utxos_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->inputUTXOsHash);
return true;
}
bool rustsimplicity_0_6_input_utxo_hash(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
const utxo* txo = &env->tx->input[i].txo;
sha256_midstate midstate;
sha256_context ctx = sha256_init(midstate.s);
rustsimplicity_0_6_sha256_confAsset(&ctx, &txo->asset);
rustsimplicity_0_6_sha256_confAmt(&ctx, &txo->amt);
sha256_hash(&ctx, &txo->scriptPubKey);
sha256_finalize(&ctx);
writeHash(dst, &midstate);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_input_sequences_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->inputSequencesHash);
return true;
}
bool rustsimplicity_0_6_input_annexes_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->inputAnnexesHash);
return true;
}
bool rustsimplicity_0_6_input_script_sigs_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->inputScriptSigsHash);
return true;
}
bool rustsimplicity_0_6_inputs_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->inputsHash);
return true;
}
bool rustsimplicity_0_6_input_hash(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
const sigInput* input = &env->tx->input[i];
sha256_midstate midstate;
sha256_context ctx = sha256_init(midstate.s);
if (input->isPegin) {
sha256_uchar(&ctx, 1);
sha256_hash(&ctx, &input->pegin);
} else {
sha256_uchar(&ctx, 0);
}
sha256_hash(&ctx, &input->prevOutpoint.txid);
sha256_u32be(&ctx, input->prevOutpoint.ix);
sha256_u32be(&ctx, input->sequence);
if (input->hasAnnex) {
sha256_uchar(&ctx, 1);
sha256_hash(&ctx, &input->annexHash);
} else {
sha256_uchar(&ctx, 0);
}
sha256_finalize(&ctx);
writeHash(dst, &midstate);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_issuance_asset_amounts_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->issuanceAssetAmountsHash);
return true;
}
bool rustsimplicity_0_6_issuance_token_amounts_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->issuanceTokenAmountsHash);
return true;
}
bool rustsimplicity_0_6_issuance_range_proofs_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->issuanceRangeProofsHash);
return true;
}
bool rustsimplicity_0_6_issuance_blinding_entropy_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->issuanceBlindingEntropyHash);
return true;
}
bool rustsimplicity_0_6_issuances_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->issuancesHash);
return true;
}
bool rustsimplicity_0_6_issuance_hash(frameItem* dst, frameItem src, const txEnv* env) {
uint_fast32_t i = rustsimplicity_0_6_read32(&src);
if (writeBit(dst, i < env->tx->numInputs)) {
const assetIssuance* issuance = &env->tx->input[i].issuance;
sha256_midstate midstate;
sha256_context ctx = sha256_init(midstate.s);
if (NO_ISSUANCE == issuance->type) {
sha256_uchar(&ctx, 0);
sha256_uchar(&ctx, 0);
sha256_uchar(&ctx, 0);
sha256_uchar(&ctx, 0);
sha256_hash(&ctx, &issuance->assetRangeProofHash);
sha256_hash(&ctx, &issuance->tokenRangeProofHash);
sha256_uchar(&ctx, 0);
} else {
rustsimplicity_0_6_sha256_confAsset(&ctx, &(confidential){ .prefix = EXPLICIT, .data = issuance->assetId});
rustsimplicity_0_6_sha256_confAmt(&ctx, &issuance->assetAmt);
rustsimplicity_0_6_sha256_confAsset(&ctx, &(confidential){ .prefix = EXPLICIT, .data = issuance->tokenId});
rustsimplicity_0_6_sha256_confAmt(&ctx, NEW_ISSUANCE == issuance->type
? &issuance->tokenAmt
: &(confAmount){ .prefix = EXPLICIT, .explicit = 0});
sha256_hash(&ctx, &issuance->assetRangeProofHash);
sha256_hash(&ctx, &issuance->tokenRangeProofHash);
sha256_uchar(&ctx, 1);
if (NEW_ISSUANCE == issuance->type) {
sha256_uchars(&ctx, (unsigned char[32]){0}, 32);
sha256_hash(&ctx, &issuance->contractHash);
} else {
sha256_hash(&ctx, &issuance->blindingNonce);
sha256_hash(&ctx, &issuance->entropy);
}
}
sha256_finalize(&ctx);
writeHash(dst, &midstate);
} else {
skipBits(dst, 256);
}
return true;
}
bool rustsimplicity_0_6_tx_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->tx->txHash);
return true;
}
bool rustsimplicity_0_6_tapleaf_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->taproot->tapLeafHash);
return true;
}
bool rustsimplicity_0_6_tappath_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->taproot->tappathHash);
return true;
}
bool rustsimplicity_0_6_tap_env_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->taproot->tapEnvHash);
return true;
}
bool rustsimplicity_0_6_sig_all_hash(frameItem* dst, frameItem src, const txEnv* env) {
(void) src; writeHash(dst, &env->sigAllHash);
return true;
}