From 162602b208493e7da1984044e661402c3e52932b Mon Sep 17 00:00:00 2001 From: brunoerg Date: Fri, 12 May 2023 12:53:59 -0300 Subject: [PATCH] fuzz: wallet, add target for `fees` --- src/Makefile.test.include | 1 + src/wallet/test/fuzz/fees.cpp | 68 +++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/wallet/test/fuzz/fees.cpp diff --git a/src/Makefile.test.include b/src/Makefile.test.include index 8e45c797bf1..2ee32a58c9b 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -195,6 +195,7 @@ endif FUZZ_WALLET_SRC = \ wallet/test/fuzz/coinselection.cpp \ + wallet/test/fuzz/fees.cpp \ wallet/test/fuzz/parse_iso8601.cpp if USE_SQLITE diff --git a/src/wallet/test/fuzz/fees.cpp b/src/wallet/test/fuzz/fees.cpp new file mode 100644 index 00000000000..8453ecb720a --- /dev/null +++ b/src/wallet/test/fuzz/fees.cpp @@ -0,0 +1,68 @@ +// 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 + +namespace wallet { +namespace { +const TestingSetup* g_setup; +static std::unique_ptr g_wallet_ptr; + +void initialize_setup() +{ + static const auto testing_setup = MakeNoLogFileContext(); + g_setup = testing_setup.get(); + const auto& node{g_setup->m_node}; + g_wallet_ptr = std::make_unique(node.chain.get(), "", CreateMockableWalletDatabase()); +} + +FUZZ_TARGET_INIT(wallet_fees, initialize_setup) +{ + FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()}; + const auto& node{g_setup->m_node}; + Chainstate* chainstate = &node.chainman->ActiveChainstate(); + CWallet& wallet = *g_wallet_ptr; + { + LOCK(wallet.cs_wallet); + wallet.SetLastBlockProcessed(chainstate->m_chain.Height(), chainstate->m_chain.Tip()->GetBlockHash()); + } + + if (fuzzed_data_provider.ConsumeBool()) { + wallet.m_discard_rate = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)}; + } + (void)GetDiscardRate(wallet); + + const auto tx_bytes{fuzzed_data_provider.ConsumeIntegral()}; + + if (fuzzed_data_provider.ConsumeBool()) { + wallet.m_pay_tx_fee = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)}; + wallet.m_min_fee = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)}; + } + + (void)GetRequiredFee(wallet, tx_bytes); + (void)GetRequiredFeeRate(wallet); + + CCoinControl coin_control; + if (fuzzed_data_provider.ConsumeBool()) { + coin_control.m_feerate = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)}; + } + if (fuzzed_data_provider.ConsumeBool()) { + coin_control.m_confirm_target = fuzzed_data_provider.ConsumeIntegral(); + } + + FeeCalculation fee_calculation; + FeeCalculation* maybe_fee_calculation{fuzzed_data_provider.ConsumeBool() ? nullptr : &fee_calculation}; + (void)GetMinimumFeeRate(wallet, coin_control, maybe_fee_calculation); + (void)GetMinimumFee(wallet, tx_bytes, coin_control, maybe_fee_calculation); +} +} // namespace +} // namespace wallet