fees.cpp raw

   1  // Copyright (c) 2022 The Limenka 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
  76