6 #include <chainparams.h>
23 #include <validation.h>
44 void initialize_spkm()
46 static const auto testing_setup{MakeNoLogFileContext<const TestingSetup>()};
47 g_setup = testing_setup.get();
57 static bool TooDeepDerivPath(std::string_view desc)
59 const FuzzBufferType desc_buf{
reinterpret_cast<const unsigned char *
>(desc.data()), desc.
size()};
63 static std::optional<std::pair<WalletDescriptor, FlatSigningProvider>> CreateWalletDescriptor(
FuzzedDataProvider& fuzzed_data_provider)
66 if (TooDeepDerivPath(mocked_descriptor))
return {};
68 if (!desc_str.has_value())
return std::nullopt;
72 std::unique_ptr<Descriptor> parsed_desc{
Parse(desc_str.value(), keys, error,
false)};
73 if (!parsed_desc)
return std::nullopt;
75 WalletDescriptor w_desc{std::move(parsed_desc), 0, 0, 1, 1};
76 return std::make_pair(w_desc, keys);
81 LOCK(keystore.cs_wallet);
82 keystore.AddWalletDescriptor(wallet_desc, keys,
"",
false);
83 return keystore.GetDescriptorScriptPubKeyMan(wallet_desc);
92 CWallet&
wallet{*wallet_ptr};
96 wallet.SetLastBlockProcessed(chainstate.m_chain.Height(), chainstate.m_chain.Tip()->GetBlockHash());
99 auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
100 if (!wallet_desc.has_value())
return;
102 if (spk_manager ==
nullptr)
return;
104 bool good_data{
true};
107 fuzzed_data_provider,
109 auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
110 if (!wallet_desc.has_value()) {
115 if (spk_manager->CanUpdateToWalletDescriptor(wallet_desc->first, error)) {
117 if (new_spk_manager !=
nullptr) spk_manager = new_spk_manager;
122 auto is_mine{spk_manager->IsMine(script)};
124 assert(spk_manager->GetScriptPubKeys().count(script));
128 auto spks{spk_manager->GetScriptPubKeys()};
129 for (
const CScript& spk : spks) {
135 PKHash pk_hash{std::get_if<PKHash>(&dest) && fuzzed_data_provider.
ConsumeBool() ?
136 *std::get_if<PKHash>(&dest) :
139 (void)spk_manager->SignMessage(
msg, pk_hash, str_sig);
145 if (!key.IsValid()) {
149 spk_manager->AddDescriptorKey(key, key.GetPubKey());
150 spk_manager->TopUp();
153 std::string descriptor;
154 (void)spk_manager->GetDescriptorString(descriptor, fuzzed_data_provider.
ConsumeBool());
157 LOCK(spk_manager->cs_desc_man);
158 auto wallet_desc{spk_manager->GetWalletDescriptor()};
159 if (wallet_desc.descriptor->IsSingleType()) {
160 auto output_type{wallet_desc.descriptor->GetOutputType()};
161 if (output_type.has_value()) {
162 auto dest{spk_manager->GetNewDestination(*output_type)};
165 assert(spk_manager->IsHDEnabled());
172 const std::optional<CMutableTransaction> opt_tx_to{ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider,
TX_WITH_WITNESS)};
179 std::map<COutPoint, Coin> coins{
ConsumeCoins(fuzzed_data_provider)};
181 std::map<int, bilingual_str> input_errors;
182 (void)spk_manager->SignTransaction(tx_to, coins, sighash, input_errors);
185 std::optional<PartiallySignedTransaction> opt_psbt{ConsumeDeserializable<PartiallySignedTransaction>(fuzzed_data_provider)};
190 auto psbt{*opt_psbt};
193 (void)spk_manager->FillPSBT(psbt, txdata, sighash_type, fuzzed_data_provider.
ConsumeBool(), fuzzed_data_provider.
ConsumeBool(),
nullptr, fuzzed_data_provider.
ConsumeBool());
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination corresponds to one with an address.
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
void SelectParams(const ChainType chain)
Sets the params returned by Params() to those for the given chain type.
An encapsulated private key.
Serialized script, used inside transaction inputs and outputs.
Chainstate stores and provides an API to update our local knowledge of the current best chain.
std::string ConsumeRandomLengthString(size_t max_length)
T ConsumeIntegralInRange(T min, T max)
Converts a mocked descriptor string to a valid one.
void Init()
When initializing the target, populate the list of keys.
std::optional< std::string > GetDescriptor(std::string_view mocked_desc) const
Get an actual descriptor string from a descriptor string whose keys were mocked.
A Span is an object that can refer to a contiguous sequence of objects.
constexpr std::size_t size() const noexcept
static UniValue Parse(std::string_view raw)
Parse string to UniValue or throw runtime_error if string contains invalid JSON.
MockedDescriptorConverter MOCKED_DESC_CONVERTER
The converter of mocked descriptors, needs to be initialized when the target is.
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
FUZZ_TARGET(coin_grinder)
wallet::ScriptPubKeyMan * CreateDescriptor(CWallet &keystore, const std::string &desc_str, const bool success)
std::unique_ptr< WalletDatabase > CreateMockableWalletDatabase(MockableData records)
@ WALLET_FLAG_DESCRIPTORS
Indicate that this wallet supports DescriptorScriptPubKeyMan.
static constexpr TransactionSerParams TX_WITH_WITNESS
PrecomputedTransactionData PrecomputePSBTData(const PartiallySignedTransaction &psbt)
Compute a PrecomputedTransactionData object from a psbt.
A mutable version of CTransaction.
Testing setup that configures a complete environment.
bool HasDeepDerivPath(const FuzzBufferType &buff, const int max_depth)
Whether the buffer, if it represents a valid descriptor, contains a derivation path deeper than a giv...
CScript ConsumeScript(FuzzedDataProvider &fuzzed_data_provider, const bool maybe_p2wsh) noexcept
std::map< COutPoint, Coin > ConsumeCoins(FuzzedDataProvider &fuzzed_data_provider) noexcept
CKey ConsumePrivateKey(FuzzedDataProvider &fuzzed_data_provider, std::optional< bool > compressed) noexcept
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
uint160 ConsumeUInt160(FuzzedDataProvider &fuzzed_data_provider) noexcept