| 287 | } |
| 288 | |
| 289 | CMutableTransaction ConsumeTransaction(FuzzedDataProvider& fuzzed_data_provider, const std::optional<std::vector<uint256>>& prevout_txids, const int max_num_in, const int max_num_out) noexcept |
| 290 | { |
| 291 | CMutableTransaction tx_mut; |
| 292 | const auto p2wsh_op_true = fuzzed_data_provider.ConsumeBool(); |
| 293 | tx_mut.nVersion = fuzzed_data_provider.ConsumeBool() ? |
| 294 | CTransaction::CURRENT_VERSION : |
| 295 | fuzzed_data_provider.ConsumeIntegral<int32_t>(); |
| 296 | tx_mut.nLockTime = fuzzed_data_provider.ConsumeIntegral<uint32_t>(); |
| 297 | const auto num_in = fuzzed_data_provider.ConsumeIntegralInRange<int>(0, max_num_in); |
| 298 | const auto num_out = fuzzed_data_provider.ConsumeIntegralInRange<int>(0, max_num_out); |
| 299 | for (int i = 0; i < num_in; ++i) { |
| 300 | const auto& txid_prev = prevout_txids ? |
| 301 | PickValue(fuzzed_data_provider, *prevout_txids) : |
| 302 | ConsumeUInt256(fuzzed_data_provider); |
| 303 | const auto index_out = fuzzed_data_provider.ConsumeIntegralInRange<uint32_t>(0, max_num_out); |
| 304 | const auto sequence = ConsumeSequence(fuzzed_data_provider); |
| 305 | const auto script_sig = p2wsh_op_true ? CScript{} : ConsumeScript(fuzzed_data_provider); |
| 306 | CScriptWitness script_wit; |
| 307 | if (p2wsh_op_true) { |
| 308 | script_wit.stack = std::vector<std::vector<uint8_t>>{WITNESS_STACK_ELEM_OP_TRUE}; |
| 309 | } else { |
| 310 | script_wit = ConsumeScriptWitness(fuzzed_data_provider); |
| 311 | } |
| 312 | CTxIn in; |
| 313 | in.prevout = COutPoint{txid_prev, index_out}; |
| 314 | in.nSequence = sequence; |
| 315 | in.scriptSig = script_sig; |
| 316 | |
| 317 | CTxInWitness in_wit; |
| 318 | in_wit.scriptWitness = script_wit; |
| 319 | |
| 320 | tx_mut.vin.push_back(in); |
| 321 | tx_mut.witness.vtxinwit.push_back(in_wit); |
| 322 | } |
| 323 | for (int i = 0; i < num_out; ++i) { |
| 324 | const auto amount = fuzzed_data_provider.ConsumeIntegralInRange<CAmount>(-10, 50 * COIN + 10); |
| 325 | const auto script_pk = p2wsh_op_true ? |
| 326 | P2WSH_OP_TRUE : |
| 327 | ConsumeScript(fuzzed_data_provider, /*maybe_p2wsh=*/true); |
| 328 | tx_mut.vout.emplace_back(CAsset(), amount, script_pk); |
| 329 | } |
| 330 | return tx_mut; |
| 331 | } |
| 332 | |
| 333 | CScriptWitness ConsumeScriptWitness(FuzzedDataProvider& fuzzed_data_provider, const size_t max_stack_elem_size) noexcept |
| 334 | { |
no test coverage detected