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