Skip to content

Commit 785e140

Browse files
committed
wallet: Use util::Error throughout AddWalletDescriptor
32023 changed AddWalletDescriptor to return util::Error, but did not change all of the failure cases to do so. This may result in some callers continuing when there was actually an error. Unify all of the failure cases to use util::Error so that all callers handle AddWalletDescriptor errors in the same way. The encapsulated return type is changed from ScriptPubKeyMan* to std::reference_wrapper<DescriptorScriptPubKeyMan>. This avoids having a value that can be interpreted as a bool, and also removes the need to constantly dynamic_cast the returned value. The only kind of ScriptPubKeyMan that can come out of AddWalletDescriptor is a DescriptorScriptPubKeyMan anyways.
1 parent c461d15 commit 785e140

File tree

13 files changed

+28
-44
lines changed

13 files changed

+28
-44
lines changed

src/bench/wallet_ismine.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ static void WalletIsMine(benchmark::Bench& bench, int num_combo = 0)
5050
std::string error;
5151
std::vector<std::unique_ptr<Descriptor>> desc = Parse("combo(" + EncodeSecret(key) + ")", keys, error, /*require_checksum=*/false);
5252
WalletDescriptor w_desc(std::move(desc.at(0)), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/0, /*next_index=*/0);
53-
auto spk_manager = *Assert(wallet->AddWalletDescriptor(w_desc, keys, /*label=*/"", /*internal=*/false));
54-
assert(spk_manager);
53+
Assert(wallet->AddWalletDescriptor(w_desc, keys, /*label=*/"", /*internal=*/false));
5554
}
5655
}
5756

src/qt/test/wallettests.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,7 @@ std::shared_ptr<CWallet> SetupDescriptorsWallet(interfaces::Node& node, TestChai
215215
assert(descs.size() == 1);
216216
auto& desc = descs.at(0);
217217
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
218-
auto spk_manager = *Assert(wallet->AddWalletDescriptor(w_desc, provider, "", false));
219-
assert(spk_manager);
218+
Assert(wallet->AddWalletDescriptor(w_desc, provider, "", false));
220219
const PKHash dest{test.coinbaseKey.GetPubKey()};
221220
wallet->SetAddressBook(dest, "", wallet::AddressPurpose::RECEIVE);
222221
wallet->SetLastBlockProcessed(105, WITH_LOCK(node.context()->chainman->GetMutex(), return node.context()->chainman->ActiveChain().Tip()->GetBlockHash()));

src/test/fuzz/util/wallet.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,8 @@ struct FuzzedWallet {
5959
WalletDescriptor w_desc{std::move(parsed_desc), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/1, /*next_index=*/0};
6060
assert(!wallet->GetDescriptorScriptPubKeyMan(w_desc));
6161
LOCK(wallet->cs_wallet);
62-
auto spk_manager = *Assert(wallet->AddWalletDescriptor(w_desc, keys, /*label=*/"", internal));
63-
assert(spk_manager);
64-
wallet->AddActiveScriptPubKeyMan(spk_manager->GetID(), *Assert(w_desc.descriptor->GetOutputType()), internal);
62+
auto& spk_manager = Assert(wallet->AddWalletDescriptor(w_desc, keys, /*label=*/"", internal))->get();
63+
wallet->AddActiveScriptPubKeyMan(spk_manager.GetID(), *Assert(w_desc.descriptor->GetOutputType()), internal);
6564
}
6665
}
6766
}

src/wallet/rpc/backup.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -262,25 +262,21 @@ static UniValue ProcessDescriptorImport(CWallet& wallet, const UniValue& data, c
262262
auto spk_manager_res = wallet.AddWalletDescriptor(w_desc, keys, label, desc_internal);
263263

264264
if (!spk_manager_res) {
265-
throw JSONRPCError(RPC_INVALID_PARAMETER, util::ErrorString(spk_manager_res).original);
265+
throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Could not add descriptor '%s': %s", descriptor, util::ErrorString(spk_manager_res).original));
266266
}
267267

268-
auto spk_manager = spk_manager_res.value();
269-
270-
if (spk_manager == nullptr) {
271-
throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Could not add descriptor '%s'", descriptor));
272-
}
268+
auto& spk_manager = spk_manager_res.value().get();
273269

274270
// Set descriptor as active if necessary
275271
if (active) {
276272
if (!w_desc.descriptor->GetOutputType()) {
277273
warnings.push_back("Unknown output type, cannot set descriptor to active.");
278274
} else {
279-
wallet.AddActiveScriptPubKeyMan(spk_manager->GetID(), *w_desc.descriptor->GetOutputType(), desc_internal);
275+
wallet.AddActiveScriptPubKeyMan(spk_manager.GetID(), *w_desc.descriptor->GetOutputType(), desc_internal);
280276
}
281277
} else {
282278
if (w_desc.descriptor->GetOutputType()) {
283-
wallet.DeactivateScriptPubKeyMan(spk_manager->GetID(), *w_desc.descriptor->GetOutputType(), desc_internal);
279+
wallet.DeactivateScriptPubKeyMan(spk_manager.GetID(), *w_desc.descriptor->GetOutputType(), desc_internal);
284280
}
285281
}
286282
}

src/wallet/test/fuzz/scriptpubkeyman.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,9 @@ static std::optional<std::pair<WalletDescriptor, FlatSigningProvider>> CreateWal
8080
static DescriptorScriptPubKeyMan* CreateDescriptor(WalletDescriptor& wallet_desc, FlatSigningProvider& keys, CWallet& keystore)
8181
{
8282
LOCK(keystore.cs_wallet);
83-
DescriptorScriptPubKeyMan* descriptor_spk_manager = nullptr;
84-
auto spk_manager = *Assert(keystore.AddWalletDescriptor(wallet_desc, keys, /*label=*/"", /*internal=*/false));
85-
if (spk_manager) {
86-
descriptor_spk_manager = dynamic_cast<DescriptorScriptPubKeyMan*>(spk_manager);
87-
}
88-
return descriptor_spk_manager;
83+
auto spk_manager_res = keystore.AddWalletDescriptor(wallet_desc, keys, /*label=*/"", /*internal=*/false);
84+
if (!spk_manager_res) return nullptr;
85+
return &spk_manager_res.value().get();
8986
};
9087

9188
FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)

src/wallet/test/psbt_wallet_tests.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ static void import_descriptor(CWallet& wallet, const std::string& descriptor)
2727
assert(descs.size() == 1);
2828
auto& desc = descs.at(0);
2929
WalletDescriptor w_desc(std::move(desc), 0, 0, 10, 0);
30-
auto spk_manager = *Assert(wallet.AddWalletDescriptor(w_desc, provider, "", false));
31-
assert(spk_manager);
30+
Assert(wallet.AddWalletDescriptor(w_desc, provider, "", false));
3231
}
3332

3433
BOOST_AUTO_TEST_CASE(psbt_updater_test)

src/wallet/test/scriptpubkeyman_tests.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ BOOST_AUTO_TEST_CASE(DescriptorScriptPubKeyManTests)
2525
// Verify that a SigningProvider for a pubkey is only returned if its corresponding private key is available
2626
auto key_internal = GenerateRandomKey();
2727
std::string desc_str = "tr(" + EncodeSecret(key_internal) + ",pk(" + HexStr(key_scriptpath.GetPubKey()) + "))";
28-
auto spk_man1 = dynamic_cast<DescriptorScriptPubKeyMan*>(CreateDescriptor(keystore, desc_str, true));
28+
auto spk_man1 = CreateDescriptor(keystore, desc_str, true);
2929
BOOST_CHECK(spk_man1 != nullptr);
3030
auto signprov_keypath_spendable = spk_man1->GetSigningProvider(key_internal.GetPubKey());
3131
BOOST_CHECK(signprov_keypath_spendable != nullptr);
3232

3333
desc_str = "tr(" + HexStr(XOnlyPubKey::NUMS_H) + ",pk(" + HexStr(key_scriptpath.GetPubKey()) + "))";
34-
auto spk_man2 = dynamic_cast<DescriptorScriptPubKeyMan*>(CreateDescriptor(keystore, desc_str, true));
34+
auto spk_man2 = CreateDescriptor(keystore, desc_str, true);
3535
BOOST_CHECK(spk_man2 != nullptr);
3636
auto signprov_keypath_nums_h = spk_man2->GetSigningProvider(XOnlyPubKey::NUMS_H.GetEvenCorrespondingCPubKey());
3737
BOOST_CHECK(signprov_keypath_nums_h == nullptr);

src/wallet/test/util.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ std::unique_ptr<CWallet> CreateSyncedWallet(interfaces::Chain& chain, CChain& cc
3535
assert(descs.size() == 1);
3636
auto& desc = descs.at(0);
3737
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
38-
auto spk_manager = *Assert(wallet->AddWalletDescriptor(w_desc, provider, "", false));
39-
assert(spk_manager);
38+
Assert(wallet->AddWalletDescriptor(w_desc, provider, "", false));
4039
}
4140
WalletRescanReserver reserver(*wallet);
4241
reserver.reserve();
@@ -194,7 +193,7 @@ MockableDatabase& GetMockableDatabase(CWallet& wallet)
194193
return dynamic_cast<MockableDatabase&>(wallet.GetDatabase());
195194
}
196195

197-
wallet::ScriptPubKeyMan* CreateDescriptor(CWallet& keystore, const std::string& desc_str, const bool success)
196+
wallet::DescriptorScriptPubKeyMan* CreateDescriptor(CWallet& keystore, const std::string& desc_str, const bool success)
198197
{
199198
keystore.SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
200199

@@ -211,6 +210,6 @@ wallet::ScriptPubKeyMan* CreateDescriptor(CWallet& keystore, const std::string&
211210

212211
LOCK(keystore.cs_wallet);
213212
auto spkm = Assert(keystore.AddWalletDescriptor(w_desc, keys,/*label=*/"", /*internal=*/false));
214-
return spkm.value();
213+
return &spkm.value().get();
215214
};
216215
} // namespace wallet

src/wallet/test/util.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ class MockableDatabase : public WalletDatabase
116116
std::unique_ptr<WalletDatabase> CreateMockableWalletDatabase(MockableData records = {});
117117
MockableDatabase& GetMockableDatabase(CWallet& wallet);
118118

119-
ScriptPubKeyMan* CreateDescriptor(CWallet& keystore, const std::string& desc_str, const bool success);
119+
DescriptorScriptPubKeyMan* CreateDescriptor(CWallet& keystore, const std::string& desc_str, const bool success);
120120
} // namespace wallet
121121

122122
#endif // BITCOIN_WALLET_TEST_UTIL_H

src/wallet/test/wallet_tests.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ static void AddKey(CWallet& wallet, const CKey& key)
6666
assert(descs.size() == 1);
6767
auto& desc = descs.at(0);
6868
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
69-
auto spk_manager = *Assert(wallet.AddWalletDescriptor(w_desc, provider, "", false));
70-
assert(spk_manager);
69+
Assert(wallet.AddWalletDescriptor(w_desc, provider, "", false));
7170
}
7271

7372
BOOST_FIXTURE_TEST_CASE(scan_for_wallet_transactions, TestChain100Setup)

0 commit comments

Comments
 (0)