25 void initialize_setup()
27 static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();
28 g_setup = testing_setup.get();
39 FuzzedWallet(
const std::string&
name)
44 DatabaseOptions options;
45 options.require_create =
true;
47 const std::optional<bool> load_on_start;
52 std::vector<bilingual_str> warnings;
62 std::vector<bilingual_str> warnings;
63 std::optional<bool> load_on_start;
90 const auto total_amount{
ConsumeMoney(fuzzed_data_provider)};
91 FuzzedWallet a{
"fuzzed_wallet_a"};
92 FuzzedWallet b{
"fuzzed_wallet_b"};
98 using Coins = std::set<std::tuple<CAmount, COutPoint>>;
99 std::vector<std::tuple<Coins, CBlock>> chain;
102 chain.emplace_back();
103 auto& [coins, block]{chain.back()};
109 fuzzed_data_provider,
111 auto& [coins_orig, block]{chain.back()};
113 Coins coins = coins_orig;
114 while (!coins.empty()) {
116 CMutableTransaction tx{};
118 auto num_inputs{fuzzed_data_provider.ConsumeIntegralInRange<int>(1, coins.size())};
120 while (num_inputs-- > 0) {
121 const auto& [coin_amt, coin_outpoint]{*coins.begin()};
123 tx.vin.emplace_back(coin_outpoint);
124 coins.erase(coins.begin());
129 const auto out_value{
ConsumeMoney(fuzzed_data_provider, in)};
132 tx.vout.emplace_back(out_value,
wallet.GetScriptPubKey(fuzzed_data_provider));
136 tx.vout.emplace_back(in,
wallet.GetScriptPubKey(fuzzed_data_provider));
141 a.wallet->blockConnected(block, chain.size());
142 b.wallet->blockConnected(block, chain.size());
145 for (
const auto& tx : block.vtx) {
147 for (
const auto& out : tx->vout) {
148 coins_new.emplace(out.nValue,
COutPoint{tx->GetHash(), i++});
151 chain.emplace_back(coins_new,
CBlock{});
154 if (chain.size() <= 1)
return;
155 auto& [coins, block]{chain.back()};
156 if (block.vtx.empty())
return;
158 a.wallet->blockDisconnected(block, chain.size() - 1);
159 b.wallet->blockDisconnected(block, chain.size() - 1);
162 auto& [coins, first_block]{chain.front()};
163 if (!first_block.vtx.empty()) {
167 assert(total_amount == bal_a + bal_b);