| 40 | } |
| 41 | |
| 42 | CMutableTransaction ConsumeTransaction(FuzzedDataProvider& fuzzed_data_provider, const std::optional<std::vector<Txid>>& prevout_txids, const int max_num_in, const int max_num_out) noexcept |
| 43 | { |
| 44 | CMutableTransaction tx_mut; |
| 45 | const auto p2wsh_op_true = fuzzed_data_provider.ConsumeBool(); |
| 46 | tx_mut.version = fuzzed_data_provider.ConsumeBool() ? |
| 47 | CTransaction::CURRENT_VERSION : |
| 48 | fuzzed_data_provider.ConsumeIntegral<uint32_t>(); |
| 49 | tx_mut.nLockTime = fuzzed_data_provider.ConsumeIntegral<uint32_t>(); |
| 50 | const auto num_in = fuzzed_data_provider.ConsumeIntegralInRange<int>(0, max_num_in); |
| 51 | const auto num_out = fuzzed_data_provider.ConsumeIntegralInRange<int>(0, max_num_out); |
| 52 | for (int i = 0; i < num_in; ++i) { |
| 53 | const auto& txid_prev = prevout_txids ? |
| 54 | PickValue(fuzzed_data_provider, *prevout_txids) : |
| 55 | Txid::FromUint256(ConsumeUInt256(fuzzed_data_provider)); |
| 56 | const auto index_out = fuzzed_data_provider.ConsumeIntegralInRange<uint32_t>(0, max_num_out); |
| 57 | const auto sequence = ConsumeSequence(fuzzed_data_provider); |
| 58 | const auto script_sig = p2wsh_op_true ? CScript{} : ConsumeScript(fuzzed_data_provider); |
| 59 | CScriptWitness script_wit; |
| 60 | if (p2wsh_op_true) { |
| 61 | script_wit.stack = std::vector<std::vector<uint8_t>>{WITNESS_STACK_ELEM_OP_TRUE}; |
| 62 | } else { |
| 63 | script_wit = ConsumeScriptWitness(fuzzed_data_provider); |
| 64 | } |
| 65 | CTxIn in; |
| 66 | in.prevout = COutPoint{txid_prev, index_out}; |
| 67 | in.nSequence = sequence; |
| 68 | in.scriptSig = script_sig; |
| 69 | in.scriptWitness = script_wit; |
| 70 | |
| 71 | tx_mut.vin.push_back(in); |
| 72 | } |
| 73 | for (int i = 0; i < num_out; ++i) { |
| 74 | const auto amount = fuzzed_data_provider.ConsumeIntegralInRange<CAmount>(-10, 50 * COIN + 10); |
| 75 | const auto script_pk = p2wsh_op_true ? |
| 76 | P2WSH_OP_TRUE : |
| 77 | ConsumeScript(fuzzed_data_provider, /*maybe_p2wsh=*/true); |
| 78 | tx_mut.vout.emplace_back(amount, script_pk); |
| 79 | } |
| 80 | return tx_mut; |
| 81 | } |
| 82 | |
| 83 | CScriptWitness ConsumeScriptWitness(FuzzedDataProvider& fuzzed_data_provider, const size_t max_stack_elem_size) noexcept |
| 84 | { |
no test coverage detected