Initialize a 'sigInput' from a 'rawElementsInput', copying or hashing the data as needed. * * Precondition: NULL != result; * NULL != input; */
| 66 | * NULL != input; |
| 67 | */ |
| 68 | static void copyInput(sigInput* result, const rawElementsInput* input) { |
| 69 | *result = (sigInput){ .prevOutpoint = { .ix = input->prevIx } |
| 70 | , .sequence = input->sequence |
| 71 | , .isPegin = !!input->pegin |
| 72 | , .hasAnnex = !!input->annex |
| 73 | }; |
| 74 | |
| 75 | if (input->annex) hashBuffer(&result->annexHash, input->annex); |
| 76 | if (input->pegin) sha256_toMidstate(result->pegin.s, input->pegin); |
| 77 | sha256_toMidstate(result->prevOutpoint.txid.s, input->prevTxid); |
| 78 | hashBuffer(&result->txo.scriptPubKey, &input->txo.scriptPubKey); |
| 79 | copyRawConfidential(&result->txo.asset, input->txo.asset); |
| 80 | copyRawAmt(&result->txo.amt, input->txo.value); |
| 81 | hashBuffer(&result->scriptSigHash, &input->scriptSig); |
| 82 | hashBuffer(&result->issuance.assetRangeProofHash, &(rawElementsBuffer){0}); |
| 83 | hashBuffer(&result->issuance.tokenRangeProofHash, &(rawElementsBuffer){0}); |
| 84 | if (input->issuance.amount || input->issuance.inflationKeys) { |
| 85 | sha256_toMidstate(result->issuance.blindingNonce.s, input->issuance.blindingNonce); |
| 86 | copyRawAmt(&result->issuance.assetAmt, input->issuance.amount); |
| 87 | if (is_confidential(result->issuance.assetAmt.prefix)) hashBuffer(&result->issuance.assetRangeProofHash, &input->issuance.amountRangePrf); |
| 88 | if (0 == result->issuance.blindingNonce.s[0] && 0 == result->issuance.blindingNonce.s[1] && |
| 89 | 0 == result->issuance.blindingNonce.s[2] && 0 == result->issuance.blindingNonce.s[3] && |
| 90 | 0 == result->issuance.blindingNonce.s[4] && 0 == result->issuance.blindingNonce.s[5] && |
| 91 | 0 == result->issuance.blindingNonce.s[6] && 0 == result->issuance.blindingNonce.s[7]) { |
| 92 | sha256_toMidstate(result->issuance.contractHash.s, input->issuance.assetEntropy); |
| 93 | result->issuance.entropy = simplicity_generateIssuanceEntropy(&result->prevOutpoint, &result->issuance.contractHash); |
| 94 | copyRawAmt(&result->issuance.tokenAmt, input->issuance.inflationKeys); |
| 95 | if (is_confidential(result->issuance.tokenAmt.prefix)) hashBuffer(&result->issuance.tokenRangeProofHash, &input->issuance.inflationKeysRangePrf); |
| 96 | result->issuance.type = NEW_ISSUANCE; |
| 97 | } else { |
| 98 | sha256_toMidstate(result->issuance.entropy.s, input->issuance.assetEntropy); |
| 99 | result->issuance.type = REISSUANCE; |
| 100 | } |
| 101 | result->issuance.assetId = simplicity_calculateAsset(&result->issuance.entropy); |
| 102 | result->issuance.tokenId = simplicity_calculateToken(&result->issuance.entropy, result->issuance.assetAmt.prefix); |
| 103 | } |
| 104 | } |
| 105 | |
| 106 | /* As specified in https://github.com/ElementsProject/elements/blob/de942511a67c3a3fcbdf002a8ee7e9ba49679b78/src/primitives/transaction.h#L304-L307. */ |
| 107 | static bool isFee(const rawElementsOutput* output) { |
no test coverage detected