Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1// Copyright (c) 2022-present The Bitcoin Core developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.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/test/util.h>12namespace wallet {13namespace {15const TestingSetup* g_setup;17void initialize_coincontrol()18{19static const auto testing_setup = MakeNoLogFileContext<const TestingSetup>();20g_setup = testing_setup.get();21}23FUZZ_TARGET(coincontrol, .init = initialize_coincontrol)24{25FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());26const auto& node = g_setup->m_node;27ArgsManager& args = *node.args;29// for GetBoolArg to return true sometimes30args.ForceSetArg("-avoidpartialspends", fuzzed_data_provider.ConsumeBool()?"1":"0");32CCoinControl coin_control;33COutPoint out_point;35LIMITED_WHILE (fuzzed_data_provider.ConsumeBool(), 10000) {36CallOneOf(37fuzzed_data_provider,38[&] {39std::optional<COutPoint> optional_out_point = ConsumeDeserializable<COutPoint>(fuzzed_data_provider);40if (!optional_out_point) {41return;42}43out_point = *optional_out_point;44},45[&] {46(void)coin_control.HasSelected();47},48[&] {49(void)coin_control.IsSelected(out_point);50},51[&] {52(void)coin_control.IsExternalSelected(out_point);53},54[&] {55(void)coin_control.GetExternalOutput(out_point);56},57[&] {58(void)coin_control.Select(out_point);59assert(coin_control.IsSelected(out_point));60},61[&] {62const CTxOut tx_out{ConsumeMoney(fuzzed_data_provider), ConsumeScript(fuzzed_data_provider)};63auto& input = coin_control.Select(out_point);64const auto set_tx_out{fuzzed_data_provider.ConsumeBool()};65if (set_tx_out) {66input.SetTxOut(tx_out);67}68auto has_tx_out{input.HasTxOut()};69auto is_external_selected{coin_control.IsExternalSelected(out_point)};70if (set_tx_out) {71assert(has_tx_out);72assert(input.GetTxOut() == tx_out);73assert(is_external_selected);74} else if (!has_tx_out) {75assert(!is_external_selected);76}77},78[&] {79coin_control.UnSelect(out_point);80assert(!coin_control.IsSelected(out_point));81},82[&] {83coin_control.UnSelectAll();84assert(!coin_control.HasSelected());85},86[&] {87const std::vector<COutPoint> selected = coin_control.ListSelected();88for (const auto& out : selected) {89assert(coin_control.IsSelected(out));90}91},92[&] {93int64_t weight{fuzzed_data_provider.ConsumeIntegral<int64_t>()};94coin_control.SetInputWeight(out_point, weight);95assert(coin_control.GetInputWeight(out_point) == weight);96},97[&] {98const bool is_selected = coin_control.IsSelected(out_point);99assert(!coin_control.GetInputWeight(out_point) || is_selected);100assert(!coin_control.GetSequence(out_point) || is_selected);101},102[&] {103const auto scripts = coin_control.GetScripts(out_point);104assert(coin_control.IsSelected(out_point) || (!scripts.first && !scripts.second));105},106[&] {107assert(coin_control.HasSelectedOrder() || !coin_control.GetSelectionPos(out_point));108},109[&] {110assert(!coin_control.GetSelectionPos(out_point) || coin_control.IsSelected(out_point));111},112[&] {113auto& input = coin_control.Select(out_point);114uint32_t sequence{fuzzed_data_provider.ConsumeIntegral<uint32_t>()};115input.SetSequence(sequence);116assert(input.GetSequence() == sequence);117assert(coin_control.GetSequence(out_point) == sequence);118},119[&] {120auto& input = coin_control.Select(out_point);121const CScript script{ConsumeScript(fuzzed_data_provider)};122input.SetScriptSig(script);123assert(input.HasScripts());124assert(input.GetScripts().first == script);125assert(coin_control.GetScripts(out_point).first == script);126},127[&] {128auto& input = coin_control.Select(out_point);129const CScriptWitness script_wit{ConsumeScriptWitness(fuzzed_data_provider)};130input.SetScriptWitness(script_wit);131assert(input.HasScripts());132assert(input.GetScripts().second->stack == script_wit.stack);133assert(coin_control.GetScripts(out_point).second->stack == script_wit.stack);134},135[&] {136auto& input = coin_control.Select(out_point);137unsigned int pos{fuzzed_data_provider.ConsumeIntegral<unsigned int>()};138input.SetPosition(pos);139assert(input.GetPosition() == pos);140assert(coin_control.GetSelectionPos(out_point) == pos);141});142}143}144} // namespace145} // namespace wallet
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.