6#include <chainparams.h>
24#include <validation.h>
47 static const auto testing_setup{MakeNoLogFileContext<const TestingSetup>()};
48 g_setup = testing_setup.get();
58static bool TooDeepDerivPath(std::string_view desc)
60 const FuzzBufferType desc_buf{
reinterpret_cast<const unsigned char *
>(desc.data()), desc.size()};
64static std::optional<std::pair<WalletDescriptor, FlatSigningProvider>> CreateWalletDescriptor(
FuzzedDataProvider& fuzzed_data_provider)
67 if (TooDeepDerivPath(mocked_descriptor))
return {};
69 if (!desc_str.has_value())
return std::nullopt;
73 std::vector<std::unique_ptr<Descriptor>> parsed_descs =
Parse(desc_str.value(), keys, error,
false);
74 if (parsed_descs.empty())
return std::nullopt;
76 WalletDescriptor w_desc{std::move(parsed_descs.at(0)), 0, 0, 1, 1};
77 return std::make_pair(w_desc, keys);
82 LOCK(keystore.cs_wallet);
83 keystore.AddWalletDescriptor(wallet_desc, keys,
"",
false);
84 return keystore.GetDescriptorScriptPubKeyMan(wallet_desc);
95 CWallet&
wallet{*wallet_ptr};
99 wallet.SetLastBlockProcessed(chainstate.m_chain.Height(), chainstate.m_chain.Tip()->GetBlockHash());
100 wallet.m_keypool_size = 1;
103 auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
104 if (!wallet_desc.has_value())
return;
106 if (spk_manager ==
nullptr)
return;
109 auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
110 if (!wallet_desc.has_value()) {
114 if (spk_manager->CanUpdateToWalletDescriptor(wallet_desc->first, error)) {
116 if (new_spk_manager !=
nullptr) spk_manager = new_spk_manager;
120 bool good_data{
true};
123 fuzzed_data_provider,
126 auto is_mine{spk_manager->IsMine(
script)};
132 auto spks{spk_manager->GetScriptPubKeys()};
133 for (
const CScript& spk : spks) {
139 PKHash pk_hash{std::get_if<PKHash>(&dest) && fuzzed_data_provider.
ConsumeBool() ?
140 *std::get_if<PKHash>(&dest) :
143 (void)spk_manager->SignMessage(
msg, pk_hash, str_sig);
144 (void)spk_manager->GetMetadata(dest);
149 auto spks{spk_manager->GetScriptPubKeys()};
151 auto& spk{
PickValue(fuzzed_data_provider, spks)};
152 (void)spk_manager->MarkUnusedAddresses(spk);
156 LOCK(spk_manager->cs_desc_man);
157 auto wallet_desc{spk_manager->GetWalletDescriptor()};
158 if (wallet_desc.descriptor->IsSingleType()) {
159 auto output_type{wallet_desc.descriptor->GetOutputType()};
160 if (output_type.has_value()) {
161 auto dest{spk_manager->GetNewDestination(*output_type)};
164 assert(spk_manager->IsHDEnabled());
171 const std::optional<CMutableTransaction> opt_tx_to{ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider,
TX_WITH_WITNESS)};
178 std::map<COutPoint, Coin> coins{
ConsumeCoins(fuzzed_data_provider)};
180 std::map<int, bilingual_str> input_errors;
181 (void)spk_manager->SignTransaction(tx_to, coins, sighash, input_errors);
184 std::optional<PartiallySignedTransaction> opt_psbt{ConsumeDeserializable<PartiallySignedTransaction>(fuzzed_data_provider)};
189 auto psbt{*opt_psbt};
193 auto bip32derivs = fuzzed_data_provider.
ConsumeBool();
194 auto finalize = fuzzed_data_provider.
ConsumeBool();
195 (void)spk_manager->FillPSBT(psbt, txdata, sighash_type,
sign, bip32derivs,
nullptr, finalize);
200 std::string descriptor;
201 (void)spk_manager->GetDescriptorString(descriptor, fuzzed_data_provider.
ConsumeBool());
202 (void)spk_manager->GetEndRange();
203 (void)spk_manager->GetKeyPoolSize();
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, PayToAnchor, 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.
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.
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.
std::span< const uint8_t > FuzzBufferType
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
static int sign(const secp256k1_context *ctx, struct signer_secrets *signer_secrets, struct signer *signer, const secp256k1_musig_keyagg_cache *cache, const unsigned char *msg32, unsigned char *sig64)
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
int64_t ConsumeTime(FuzzedDataProvider &fuzzed_data_provider, const std::optional< int64_t > &min, const std::optional< int64_t > &max) noexcept
std::map< COutPoint, Coin > ConsumeCoins(FuzzedDataProvider &fuzzed_data_provider) noexcept
auto & PickValue(FuzzedDataProvider &fuzzed_data_provider, Collection &col)
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
uint160 ConsumeUInt160(FuzzedDataProvider &fuzzed_data_provider) noexcept
void SeedRandomStateForTest(SeedRand seedtype)
Seed the global RNG state for testing and log the seed value.
@ ZEROS
Seed with a compile time constant of zeros.
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
is a home for public enum and struct type definitions that are used by internally by wallet code,...