6#include <chainparams.h>
23#include <validation.h>
47 g_setup = testing_setup.get();
57static bool TooDeepDerivPath(std::string_view desc)
59 const FuzzBufferType desc_buf{
reinterpret_cast<const unsigned char *
>(desc.data()), desc.size()};
63static 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);
91 std::unique_ptr<CWallet> wallet_ptr{std::make_unique<CWallet>(
node.chain.get(),
"", CreateMockableWalletDatabase())};
92 CWallet&
wallet{*wallet_ptr};
95 wallet.SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
96 wallet.SetLastBlockProcessed(chainstate.m_chain.Height(), chainstate.m_chain.Tip()->GetBlockHash());
100 auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
101 if (!wallet_desc.has_value())
return;
103 if (spk_manager ==
nullptr)
return;
106 auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
107 if (!wallet_desc.has_value()) {
111 if (spk_manager->CanUpdateToWalletDescriptor(wallet_desc->first, error)) {
113 if (new_spk_manager !=
nullptr) spk_manager = new_spk_manager;
117 bool good_data{
true};
120 fuzzed_data_provider,
123 auto is_mine{spk_manager->IsMine(
script)};
129 auto spks{spk_manager->GetScriptPubKeys()};
130 for (
const CScript& spk : spks) {
131 assert(spk_manager->IsMine(spk) == ISMINE_SPENDABLE);
136 PKHash pk_hash{std::get_if<PKHash>(&dest) && fuzzed_data_provider.
ConsumeBool() ?
137 *std::get_if<PKHash>(&dest) :
140 (void)spk_manager->SignMessage(msg, pk_hash, str_sig);
141 (void)spk_manager->GetMetadata(dest);
146 auto spks{spk_manager->GetScriptPubKeys()};
148 auto& spk{
PickValue(fuzzed_data_provider, spks)};
149 (void)spk_manager->MarkUnusedAddresses(spk);
153 LOCK(spk_manager->cs_desc_man);
154 auto wallet_desc{spk_manager->GetWalletDescriptor()};
155 if (wallet_desc.descriptor->IsSingleType()) {
156 auto output_type{wallet_desc.descriptor->GetOutputType()};
157 if (output_type.has_value()) {
158 auto dest{spk_manager->GetNewDestination(*output_type)};
161 assert(spk_manager->IsHDEnabled());
175 std::map<COutPoint, Coin> coins{
ConsumeCoins(fuzzed_data_provider)};
177 std::map<int, bilingual_str> input_errors;
178 (void)spk_manager->SignTransaction(tx_to, coins, sighash, input_errors);
186 auto psbt{*opt_psbt};
189 (void)spk_manager->FillPSBT(psbt, txdata, sighash_type, fuzzed_data_provider.
ConsumeBool(), fuzzed_data_provider.
ConsumeBool(),
nullptr, fuzzed_data_provider.
ConsumeBool());
194 std::string descriptor;
195 (void)spk_manager->GetDescriptorString(descriptor, fuzzed_data_provider.
ConsumeBool());
196 (
void)spk_manager->GetEndRange();
197 (
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.
wallet::ScriptPubKeyMan * CreateDescriptor(CWallet &keystore, const std::string &desc_str, const bool success)
static constexpr TransactionSerParams TX_WITH_WITNESS
PrecomputedTransactionData PrecomputePSBTData(const PartiallySignedTransaction &psbt)
Compute a PrecomputedTransactionData object from a psbt.
std::unique_ptr< T > MakeNoLogFileContext(const ChainType chain_type=ChainType::REGTEST, TestOpts opts={})
Make a test setup that has disk access to the debug.log file disabled.
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
auto & PickValue(FuzzedDataProvider &fuzzed_data_provider, Collection &col)
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
std::optional< T > ConsumeDeserializable(FuzzedDataProvider &fuzzed_data_provider, const P ¶ms, const std::optional< size_t > &max_length=std::nullopt) noexcept
uint160 ConsumeUInt160(FuzzedDataProvider &fuzzed_data_provider) noexcept
is a home for public enum and struct type definitions that are used by internally by wallet code,...