/ src / wallet / test / fuzz / fees.cpp
fees.cpp
 1  // Copyright (c) 2022 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 <test/fuzz/FuzzedDataProvider.h>
 6  #include <test/fuzz/fuzz.h>
 7  #include <test/fuzz/util.h>
 8  #include <test/util/setup_common.h>
 9  #include <wallet/coincontrol.h>
10  #include <wallet/fees.h>
11  #include <wallet/wallet.h>
12  #include <wallet/test/util.h>
13  #include <validation.h>
14  
15  namespace wallet {
16  namespace {
17  const TestingSetup* g_setup;
18  static std::unique_ptr<CWallet> g_wallet_ptr;
19  
20  void initialize_setup()
21  {
22      static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
23      g_setup = testing_setup.get();
24      const auto& node{g_setup->m_node};
25      g_wallet_ptr = std::make_unique<CWallet>(node.chain.get(), "", CreateMockableWalletDatabase());
26  }
27  
28  FUZZ_TARGET(wallet_fees, .init = initialize_setup)
29  {
30      FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
31      const auto& node{g_setup->m_node};
32      Chainstate* chainstate = &node.chainman->ActiveChainstate();
33      CWallet& wallet = *g_wallet_ptr;
34      {
35          LOCK(wallet.cs_wallet);
36          wallet.SetLastBlockProcessed(chainstate->m_chain.Height(), chainstate->m_chain.Tip()->GetBlockHash());
37      }
38  
39      if (fuzzed_data_provider.ConsumeBool()) {
40          wallet.m_fallback_fee = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)};
41      }
42  
43      if (fuzzed_data_provider.ConsumeBool()) {
44          wallet.m_discard_rate = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)};
45      }
46      (void)GetDiscardRate(wallet);
47  
48      const auto tx_bytes{fuzzed_data_provider.ConsumeIntegral<unsigned int>()};
49  
50      if (fuzzed_data_provider.ConsumeBool()) {
51          wallet.m_pay_tx_fee = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)};
52          wallet.m_min_fee = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)};
53      }
54  
55      (void)GetRequiredFee(wallet, tx_bytes);
56      (void)GetRequiredFeeRate(wallet);
57  
58      CCoinControl coin_control;
59      if (fuzzed_data_provider.ConsumeBool()) {
60          coin_control.m_feerate = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)};
61      }
62      if (fuzzed_data_provider.ConsumeBool()) {
63          coin_control.m_confirm_target = fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(0, 999'000);
64      }
65      if (fuzzed_data_provider.ConsumeBool()) {
66          coin_control.m_fee_mode = fuzzed_data_provider.ConsumeBool() ? FeeEstimateMode::CONSERVATIVE : FeeEstimateMode::ECONOMICAL;
67      }
68  
69      FeeCalculation fee_calculation;
70      FeeCalculation* maybe_fee_calculation{fuzzed_data_provider.ConsumeBool() ? nullptr : &fee_calculation};
71      (void)GetMinimumFeeRate(wallet, coin_control, maybe_fee_calculation);
72      (void)GetMinimumFee(wallet, tx_bytes, coin_control, maybe_fee_calculation);
73  }
74  } // namespace
75  } // namespace wallet