1 // Copyright (c) 2020 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include <policy/fees.h>
6 #include <primitives/transaction.h>
7 #include <test/fuzz/FuzzedDataProvider.h>
8 #include <test/fuzz/fuzz.h>
9 #include <test/fuzz/util.h>
10 #include <txmempool.h>
11 
12 #include <cstdint>
13 #include <optional>
14 #include <string>
15 #include <vector>
16 
initialize()17 void initialize()
18 {
19     InitializeFuzzingContext();
20 }
21 
test_one_input(const std::vector<uint8_t> & buffer)22 void test_one_input(const std::vector<uint8_t>& buffer)
23 {
24     FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
25     CBlockPolicyEstimator block_policy_estimator;
26     while (fuzzed_data_provider.ConsumeBool()) {
27         switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 3)) {
28         case 0: {
29             const std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider);
30             if (!mtx) {
31                 break;
32             }
33             const CTransaction tx{*mtx};
34             block_policy_estimator.processTransaction(ConsumeTxMemPoolEntry(fuzzed_data_provider, tx), fuzzed_data_provider.ConsumeBool());
35             if (fuzzed_data_provider.ConsumeBool()) {
36                 (void)block_policy_estimator.removeTx(tx.GetHash(), /* inBlock */ fuzzed_data_provider.ConsumeBool());
37             }
38             break;
39         }
40         case 1: {
41             std::vector<CTxMemPoolEntry> mempool_entries;
42             while (fuzzed_data_provider.ConsumeBool()) {
43                 const std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider);
44                 if (!mtx) {
45                     break;
46                 }
47                 const CTransaction tx{*mtx};
48                 mempool_entries.push_back(ConsumeTxMemPoolEntry(fuzzed_data_provider, tx));
49             }
50             std::vector<const CTxMemPoolEntry*> ptrs;
51             ptrs.reserve(mempool_entries.size());
52             for (const CTxMemPoolEntry& mempool_entry : mempool_entries) {
53                 ptrs.push_back(&mempool_entry);
54             }
55             block_policy_estimator.processBlock(fuzzed_data_provider.ConsumeIntegral<unsigned int>(), ptrs);
56             break;
57         }
58         case 2: {
59             (void)block_policy_estimator.removeTx(ConsumeUInt256(fuzzed_data_provider), /* inBlock */ fuzzed_data_provider.ConsumeBool());
60             break;
61         }
62         case 3: {
63             block_policy_estimator.FlushUnconfirmed();
64             break;
65         }
66         }
67         (void)block_policy_estimator.estimateFee(fuzzed_data_provider.ConsumeIntegral<int>());
68         EstimationResult result;
69         (void)block_policy_estimator.estimateRawFee(fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeFloatingPoint<double>(), fuzzed_data_provider.PickValueInArray({FeeEstimateHorizon::SHORT_HALFLIFE, FeeEstimateHorizon::MED_HALFLIFE, FeeEstimateHorizon::LONG_HALFLIFE}), fuzzed_data_provider.ConsumeBool() ? &result : nullptr);
70         FeeCalculation fee_calculation;
71         (void)block_policy_estimator.estimateSmartFee(fuzzed_data_provider.ConsumeIntegral<int>(), fuzzed_data_provider.ConsumeBool() ? &fee_calculation : nullptr, fuzzed_data_provider.ConsumeBool());
72         (void)block_policy_estimator.HighestTargetTracked(fuzzed_data_provider.PickValueInArray({FeeEstimateHorizon::SHORT_HALFLIFE, FeeEstimateHorizon::MED_HALFLIFE, FeeEstimateHorizon::LONG_HALFLIFE}));
73     }
74     {
75         FuzzedAutoFileProvider fuzzed_auto_file_provider = ConsumeAutoFile(fuzzed_data_provider);
76         CAutoFile fuzzed_auto_file = fuzzed_auto_file_provider.open();
77         block_policy_estimator.Write(fuzzed_auto_file);
78         block_policy_estimator.Read(fuzzed_auto_file);
79     }
80 }
81