// Copyright (c) 2022 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include #include #include #include #include #include #include #include bool SanityCheckForConsumeTxMemPoolEntry(const CTransaction& tx) noexcept { try { (void)tx.GetValueOut(); return true; } catch (const std::runtime_error&) { return false; } } // NOTE: Transaction must pass SanityCheckForConsumeTxMemPoolEntry first CTxMemPoolEntry ConsumeTxMemPoolEntry(FuzzedDataProvider& fuzzed_data_provider, const CTransaction& tx) noexcept { // Avoid: // policy/feerate.cpp:28:34: runtime error: signed integer overflow: 34873208148477500 * 1000 cannot be represented in type 'long' // // Reproduce using CFeeRate(348732081484775, 10).GetFeePerK() const CAmount fee{ConsumeMoney(fuzzed_data_provider, /*max=*/std::numeric_limits::max() / CAmount{100'000})}; assert(MoneyRange(fee)); const int64_t time = fuzzed_data_provider.ConsumeIntegral(); const double coinage_priority = fuzzed_data_provider.ConsumeFloatingPoint(); const unsigned int entry_height = fuzzed_data_provider.ConsumeIntegralInRange(0, std::numeric_limits::max() - 1); const bool spends_coinbase = fuzzed_data_provider.ConsumeBool(); const int32_t extra_weight = fuzzed_data_provider.ConsumeIntegralInRange(0, GetTransactionWeight(tx) * 3); const unsigned int sig_op_cost = fuzzed_data_provider.ConsumeIntegralInRange(0, MAX_BLOCK_SIGOPS_COST); return CTxMemPoolEntry{MakeTransactionRef(tx), fee, time, coinage_priority, entry_height, tx.GetValueOut(), spends_coinbase, extra_weight, sig_op_cost, {}}; }