Skip to content

Commit cf8d5a3

Browse files
committed
merge bitcoin#23288: remove usage of LegacyScriptPubKeyMan from some wallet tests
Dash-specific tests have not been migrated to use descriptor wallets and the old AddKey() logic has been retained as AddLegacyKey(). final_hex needed to be recalculated in psbt_updater_test as one of the input scripts were an invalid-to-Dash address and its replacement with a descriptor that doesn't correspond to the same script requires recalculating the unsigned PSBT. excludes: - 9951628 (we don't support bech32 addresses)
1 parent e99d065 commit cf8d5a3

File tree

9 files changed

+115
-77
lines changed

9 files changed

+115
-77
lines changed

src/bench/coin_selection.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ static void CoinSelection(benchmark::Bench& bench)
3232
NodeContext node;
3333
auto chain = interfaces::MakeChain(node);
3434
CWallet wallet(chain.get(), /*coinjoin_loader=*/ nullptr, "", CreateDummyWalletDatabase());
35-
wallet.SetupLegacyScriptPubKeyMan();
3635
std::vector<std::unique_ptr<CWalletTx>> wtxs;
3736
LOCK(wallet.cs_wallet);
3837

src/bench/wallet_balance.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,21 @@
1313

1414
#include <optional>
1515

16-
static void WalletBalance(benchmark::Bench& bench, const bool set_dirty, const bool add_watchonly, const bool add_mine, const uint32_t epoch_iters)
16+
static void WalletBalance(benchmark::Bench& bench, const bool set_dirty, const bool add_mine, const uint32_t epoch_iters)
1717
{
1818
const auto test_setup = MakeNoLogFileContext<const TestingSetup>();
1919
const auto& ADDRESS_WATCHONLY = ADDRESS_B58T_UNSPENDABLE;
2020

2121
CWallet wallet{test_setup->m_node.chain.get(), test_setup->m_node.coinjoin_loader.get(), "", CreateMockWalletDatabase()};
2222
{
23-
wallet.SetupLegacyScriptPubKeyMan();
23+
LOCK(wallet.cs_wallet);
24+
wallet.SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
25+
wallet.SetupDescriptorScriptPubKeyMans();
2426
if (wallet.LoadWallet() != DBErrors::LOAD_OK) assert(false);
2527
}
2628
auto handler = test_setup->m_node.chain->handleNotifications({&wallet, [](CWallet*) {}});
2729

2830
const std::optional<std::string> address_mine{add_mine ? std::optional<std::string>{getnewaddress(wallet)} : std::nullopt};
29-
if (add_watchonly) importaddress(wallet, ADDRESS_WATCHONLY);
3031

3132
for (int i = 0; i < 100; ++i) {
3233
generatetoaddress(test_setup->m_node, address_mine.value_or(ADDRESS_WATCHONLY));
@@ -40,14 +41,13 @@ static void WalletBalance(benchmark::Bench& bench, const bool set_dirty, const b
4041
if (set_dirty) wallet.MarkDirty();
4142
bal = wallet.GetBalance();
4243
if (add_mine) assert(bal.m_mine_trusted > 0);
43-
if (add_watchonly) assert(bal.m_watchonly_trusted > 0);
4444
});
4545
}
4646

47-
static void WalletBalanceDirty(benchmark::Bench& bench) { WalletBalance(bench, /* set_dirty */ true, /* add_watchonly */ true, /* add_mine */ true, 2500); }
48-
static void WalletBalanceClean(benchmark::Bench& bench) {WalletBalance(bench, /* set_dirty */ false, /* add_watchonly */ true, /* add_mine */ true, 8000); }
49-
static void WalletBalanceMine(benchmark::Bench& bench) { WalletBalance(bench, /* set_dirty */ false, /* add_watchonly */ false, /* add_mine */ true, 16000); }
50-
static void WalletBalanceWatch(benchmark::Bench& bench) { WalletBalance(bench, /* set_dirty */ false, /* add_watchonly */ true, /* add_mine */ false, 8000); }
47+
static void WalletBalanceDirty(benchmark::Bench& bench) { WalletBalance(bench, /* set_dirty */ true, /* add_mine */ true, 2500); }
48+
static void WalletBalanceClean(benchmark::Bench& bench) {WalletBalance(bench, /* set_dirty */ false, /* add_mine */ true, 8000); }
49+
static void WalletBalanceMine(benchmark::Bench& bench) { WalletBalance(bench, /* set_dirty */ false, /* add_mine */ true, 16000); }
50+
static void WalletBalanceWatch(benchmark::Bench& bench) { WalletBalance(bench, /* set_dirty */ false, /* add_mine */ false, 8000); }
5151

5252
BENCHMARK(WalletBalanceDirty);
5353
BENCHMARK(WalletBalanceClean);

src/qt/test/addressbooktests.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,12 @@ void TestAddAddressesToSendBook(interfaces::Node& node)
6565
TestChain100Setup test;
6666
node.setContext(&test.m_node);
6767
const std::shared_ptr<CWallet> wallet = std::make_shared<CWallet>(node.context()->chain.get(), node.context()->coinjoin_loader.get(), "", CreateMockWalletDatabase());
68-
wallet->SetupLegacyScriptPubKeyMan();
6968
wallet->LoadWallet();
69+
wallet->SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
70+
{
71+
LOCK(wallet->cs_wallet);
72+
wallet->SetupDescriptorScriptPubKeyMans();
73+
}
7074

7175
auto build_address = [wallet]() {
7276
CKey key;

src/qt/test/wallettests.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,20 @@ void TestGUI(interfaces::Node& node)
113113
const std::shared_ptr<CWallet> wallet = std::make_shared<CWallet>(node.context()->chain.get(), node.context()->coinjoin_loader.get(), "", CreateMockWalletDatabase());
114114
AddWallet(context, wallet);
115115
wallet->LoadWallet();
116+
wallet->SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
116117
{
117-
auto spk_man = wallet->GetOrCreateLegacyScriptPubKeyMan();
118-
LOCK2(wallet->cs_wallet, spk_man->cs_KeyStore);
119-
wallet->SetAddressBook(PKHash(test.coinbaseKey.GetPubKey()), "", "receive");
120-
spk_man->AddKeyPubKey(test.coinbaseKey, test.coinbaseKey.GetPubKey());
118+
LOCK(wallet->cs_wallet);
119+
wallet->SetupDescriptorScriptPubKeyMans();
120+
121+
// Add the coinbase key
122+
FlatSigningProvider provider;
123+
std::string error;
124+
std::unique_ptr<Descriptor> desc = Parse("combo(" + EncodeSecret(test.coinbaseKey) + ")", provider, error, /* require_checksum=*/ false);
125+
assert(desc);
126+
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
127+
if (!wallet->AddWalletDescriptor(w_desc, provider, "", false)) assert(false);
128+
CTxDestination dest = PKHash(test.coinbaseKey.GetPubKey());
129+
wallet->SetAddressBook(dest, "", "receive");
121130
wallet->SetLastBlockProcessed(105, node.context()->chainman->ActiveChain().Tip()->GetBlockHash());
122131
}
123132
{

src/test/util/wallet.cpp

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,4 @@ std::string getnewaddress(CWallet& w)
2929
return EncodeDestination(dest);
3030
}
3131

32-
void importaddress(CWallet& wallet, const std::string& address)
33-
{
34-
auto spk_man = wallet.GetLegacyScriptPubKeyMan();
35-
assert(spk_man != nullptr);
36-
LOCK2(wallet.cs_wallet, spk_man->cs_KeyStore);
37-
const auto dest = DecodeDestination(address);
38-
assert(IsValidDestination(dest));
39-
const auto script = GetScriptForDestination(dest);
40-
wallet.MarkDirty();
41-
assert(!spk_man->HaveWatchOnly(script));
42-
if (!spk_man->AddWatchOnly(script, 0 /* nCreateTime */)) assert(false);
43-
wallet.SetAddressBook(dest, /* label */ "", "receive");
44-
}
4532
#endif // ENABLE_WALLET

src/wallet/test/coinselector_tests.cpp

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,10 @@ BOOST_FIXTURE_TEST_SUITE(coinselector_tests, WalletTestingSetup)
2929

3030
typedef std::set<CInputCoin> CoinSet;
3131

32-
/* TODO: Revert current globals removal and backport pull requests implementing it */
3332
static const CoinEligibilityFilter filter_standard(1, 6, 0);
3433
static const CoinEligibilityFilter filter_confirmed(1, 1, 0);
3534
static const CoinEligibilityFilter filter_standard_extra(6, 6, 0);
3635

37-
CoinSelectionParams coin_selection_params(/* change_output_size= */ 0,
38-
/* change_spend_size= */ 0, /* effective_feerate= */ CFeeRate(0),
39-
/* long_term_feerate= */ CFeeRate(0), /* discard_feerate= */ CFeeRate(0),
40-
/* tx_noinputs_size= */ 0, /* avoid_partial= */ false);
41-
4236
static void add_coin(const CAmount& nValue, int nInput, std::vector<CInputCoin>& set)
4337
{
4438
CMutableTransaction tx;
@@ -281,9 +275,10 @@ BOOST_AUTO_TEST_CASE(bnb_search_test)
281275
/* tx_noinputs_size= */ 0, /* avoid_partial= */ false);
282276
{
283277
std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain.get(), /* coinjoin_loader = */ nullptr, "", CreateMockWalletDatabase());
284-
wallet->SetupLegacyScriptPubKeyMan();
285278
wallet->LoadWallet();
286279
LOCK(wallet->cs_wallet);
280+
wallet->SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
281+
wallet->SetupDescriptorScriptPubKeyMans();
287282

288283
std::vector<COutput> coins;
289284
CoinSet setCoinsRet;
@@ -305,8 +300,9 @@ BOOST_AUTO_TEST_CASE(bnb_search_test)
305300
{
306301
std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain.get(), /* coinjoin_loader = */ nullptr, "", CreateMockWalletDatabase());
307302
wallet->LoadWallet();
308-
wallet->SetupLegacyScriptPubKeyMan();
309303
LOCK(wallet->cs_wallet);
304+
wallet->SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
305+
wallet->SetupDescriptorScriptPubKeyMans();
310306

311307
std::vector<COutput> coins;
312308
CoinSet setCoinsRet;
@@ -327,8 +323,9 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
327323
{
328324
std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain.get(), /* coinjoin_loader = */ nullptr, "", CreateMockWalletDatabase());
329325
wallet->LoadWallet();
330-
wallet->SetupLegacyScriptPubKeyMan();
331326
LOCK(wallet->cs_wallet);
327+
wallet->SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
328+
wallet->SetupDescriptorScriptPubKeyMans();
332329

333330
CoinSet setCoinsRet, setCoinsRet2;
334331
CAmount nValueRet;
@@ -533,9 +530,9 @@ BOOST_AUTO_TEST_CASE(knapsack_solver_test)
533530
for (uint16_t j = 0; j < 676; j++)
534531
add_coin(coins, *wallet, amt);
535532

536-
// We only create the wallet once to save time, but we still run the coin selection RUN_TESTS times.
537-
for (int i = 0; i < RUN_TESTS; i++) {
538-
BOOST_CHECK(KnapsackSolver(2000, KnapsackGroupOutputs(coins, *wallet, filter_confirmed), setCoinsRet, nValueRet));
533+
// We only create the wallet once to save time, but we still run the coin selection RUN_TESTS times.
534+
for (int i = 0; i < RUN_TESTS; i++) {
535+
BOOST_CHECK(KnapsackSolver(2000, KnapsackGroupOutputs(coins, *wallet, filter_confirmed), setCoinsRet, nValueRet));
539536

540537
if (amt - 2000 < MIN_CHANGE) {
541538
// needs more than one input:
@@ -607,8 +604,9 @@ BOOST_AUTO_TEST_CASE(ApproximateBestSubset)
607604
{
608605
std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain.get(), /* coinjoin_loader = */ nullptr, "", CreateMockWalletDatabase());
609606
wallet->LoadWallet();
610-
wallet->SetupLegacyScriptPubKeyMan();
611607
LOCK(wallet->cs_wallet);
608+
wallet->SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
609+
wallet->SetupDescriptorScriptPubKeyMans();
612610

613611
CoinSet setCoinsRet;
614612
CAmount nValueRet;
@@ -629,8 +627,9 @@ BOOST_AUTO_TEST_CASE(SelectCoins_test)
629627
{
630628
std::unique_ptr<CWallet> wallet = std::make_unique<CWallet>(m_node.chain.get(), /* coinjoin_loader = */ nullptr, "", CreateMockWalletDatabase());
631629
wallet->LoadWallet();
632-
wallet->SetupLegacyScriptPubKeyMan();
633630
LOCK(wallet->cs_wallet);
631+
wallet->SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
632+
wallet->SetupDescriptorScriptPubKeyMans();
634633

635634
// Random generator stuff
636635
std::default_random_engine generator;

src/wallet/test/psbt_wallet_tests.cpp

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,21 @@
1212

1313
BOOST_FIXTURE_TEST_SUITE(psbt_wallet_tests, WalletTestingSetup)
1414

15+
static void import_descriptor(CWallet& wallet, const std::string& descriptor)
16+
{
17+
LOCK(wallet.cs_wallet);
18+
FlatSigningProvider provider;
19+
std::string error;
20+
std::unique_ptr<Descriptor> desc = Parse(descriptor, provider, error, /* require_checksum=*/ false);
21+
assert(desc);
22+
WalletDescriptor w_desc(std::move(desc), 0, 0, 10, 0);
23+
wallet.AddWalletDescriptor(w_desc, provider, "", false);
24+
}
25+
1526
BOOST_AUTO_TEST_CASE(psbt_updater_test)
1627
{
17-
auto spk_man = m_wallet.GetOrCreateLegacyScriptPubKeyMan();
18-
LOCK2(m_wallet.cs_wallet, spk_man->cs_KeyStore);
28+
LOCK(m_wallet.cs_wallet);
29+
m_wallet.SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
1930

2031
// Create prevtxs and add to wallet
2132
CDataStream s_prev_tx1(ParseHex("0200000000010158e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd7501000000171600145f275f436b09a8cc9a2eb2a2f528485c68a56323feffffff02d8231f1b0100000017a914aed962d6654f9a2b36608eb9d64d2b260db4f1118700c2eb0b0000000017a914b7f5faf40e3d40a5a459b1db3535f2b72fa921e88702483045022100a22edcc6e5bc511af4cc4ae0de0fcd75c7e04d8c1c3a8aa9d820ed4b967384ec02200642963597b9b1bc22c75e9f3e117284a962188bf5e8a74c895089046a20ad770121035509a48eb623e10aace8bfd0212fdb8a8e5af3c94b0b133b95e114cab89e4f7965000000"), SER_NETWORK, PROTOCOL_VERSION);
@@ -28,21 +39,10 @@ BOOST_AUTO_TEST_CASE(psbt_updater_test)
2839
s_prev_tx2 >> prev_tx2;
2940
m_wallet.mapWallet.emplace(std::piecewise_construct, std::forward_as_tuple(prev_tx2->GetHash()), std::forward_as_tuple(&m_wallet, prev_tx2));
3041

31-
// Add scripts
32-
CScript rs1;
33-
CDataStream s_rs1(ParseHex("475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae"), SER_NETWORK, PROTOCOL_VERSION);
34-
s_rs1 >> rs1;
35-
spk_man->AddCScript(rs1);
36-
37-
CScript rs2;
38-
CDataStream s_rs2(ParseHex("2200208c2353173743b595dfb4a07b72ba8e42e3797da74e87fe7d9d7497e3b2028903"), SER_NETWORK, PROTOCOL_VERSION);
39-
s_rs2 >> rs2;
40-
spk_man->AddCScript(rs2);
41-
42-
CScript ws1;
43-
CDataStream s_ws1(ParseHex("47522103089dc10c7ac6db54f91329af617333db388cead0c231f723379d1b99030b02dc21023add904f3d6dcf59ddb906b0dee23529b7ffb9ed50e5e86151926860221f0e7352ae"), SER_NETWORK, PROTOCOL_VERSION);
44-
s_ws1 >> ws1;
45-
spk_man->AddCScript(ws1);
42+
// Import descriptors for keys and scripts
43+
import_descriptor(m_wallet, "sh(multi(2,xprv9s21ZrQH143K2LE7W4Xf3jATf9jECxSb7wj91ZnmY4qEJrS66Qru9RFqq8xbkgT32ya6HqYJweFdJUEDf5Q6JFV7jMiUws7kQfe6Tv4RbfN/0h/0h/0h,xprv9s21ZrQH143K2LE7W4Xf3jATf9jECxSb7wj91ZnmY4qEJrS66Qru9RFqq8xbkgT32ya6HqYJweFdJUEDf5Q6JFV7jMiUws7kQfe6Tv4RbfN/0h/0h/1h))");
44+
import_descriptor(m_wallet, "sh(multi(2,xprv9s21ZrQH143K2LE7W4Xf3jATf9jECxSb7wj91ZnmY4qEJrS66Qru9RFqq8xbkgT32ya6HqYJweFdJUEDf5Q6JFV7jMiUws7kQfe6Tv4RbfN/0h/0h/2h,xprv9s21ZrQH143K2LE7W4Xf3jATf9jECxSb7wj91ZnmY4qEJrS66Qru9RFqq8xbkgT32ya6HqYJweFdJUEDf5Q6JFV7jMiUws7kQfe6Tv4RbfN/0h/0h/3h))");
45+
import_descriptor(m_wallet, "pkh(xprv9s21ZrQH143K2LE7W4Xf3jATf9jECxSb7wj91ZnmY4qEJrS66Qru9RFqq8xbkgT32ya6HqYJweFdJUEDf5Q6JFV7jMiUws7kQfe6Tv4RbfN/0h/0h/*h)");
4646

4747
// Call FillPSBT
4848
PartiallySignedTransaction psbtx;
@@ -62,14 +62,15 @@ BOOST_AUTO_TEST_CASE(psbt_updater_test)
6262
ssTx << psbtx;
6363
std::string final_hex = HexStr(ssTx);
6464

65-
BOOST_CHECK_EQUAL(final_hex, "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f049c4942a9220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d704b9147fd300000000");
65+
BOOST_CHECK_EQUAL(final_hex, "70736274ff01009a020000000258e87a21b56daf0c23be8e7070456c336f7cbaa5c8757924f545887bb2abdd750000000000ffffffff838d0427d0ec650a68aa46bb0b098aea4422c071b2ca78352a077959d07cea1d0100000000ffffffff0270aaf00800000000160014d85c2b71d0060b09c9886aeb815e50991dda124d00e1f5050000000016001400aea9a2e5f0f876a588df5546e8742d1d87008f00000000000100bb0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f6187650000000104475221029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f2102dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d752ae2206029583bf39ae0a609747ad199addd634fa6108559d6c5cd39b4c2183f1ab96e07f10d90c6a4f000000800000008000000080220602dab61ff49a14db6a7d02b0cd1fbb78fc4b18312b5b4e54dae4dba2fbfef536d710d90c6a4f00000080000000800100008000000000");
6666

6767
// Mutate the transaction so that one of the inputs is invalid
6868
psbtx.tx->vin[0].prevout.n = 2;
6969

7070
// Try to sign the mutated input
7171
SignatureData sigdata;
72-
BOOST_CHECK(spk_man->FillPSBT(psbtx, PrecomputePSBTData(psbtx), SIGHASH_ALL, true, true) != TransactionError::OK);
72+
BOOST_CHECK(m_wallet.FillPSBT(psbtx, complete, SIGHASH_ALL, true, true) != TransactionError::OK);
73+
// BOOST_CHECK(spk_man->FillPSBT(psbtx, PrecomputePSBTData(psbtx), SIGHASH_ALL, true, true) != TransactionError::OK);
7374
}
7475

7576
BOOST_AUTO_TEST_CASE(parse_hd_keypath)

src/wallet/test/util.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <chain.h>
88
#include <key.h>
9+
#include <key_io.h>
910
#include <test/util/setup_common.h>
1011
#include <wallet/wallet.h>
1112
#include <wallet/walletdb.h>
@@ -23,9 +24,16 @@ std::unique_ptr<CWallet> CreateSyncedWallet(interfaces::Chain& chain, interfaces
2324
}
2425
wallet->LoadWallet();
2526
{
26-
auto spk_man = wallet->GetOrCreateLegacyScriptPubKeyMan();
27-
LOCK2(wallet->cs_wallet, spk_man->cs_KeyStore);
28-
spk_man->AddKeyPubKey(key, key.GetPubKey());
27+
LOCK(wallet->cs_wallet);
28+
wallet->SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
29+
wallet->SetupDescriptorScriptPubKeyMans();
30+
31+
FlatSigningProvider provider;
32+
std::string error;
33+
std::unique_ptr<Descriptor> desc = Parse("combo(" + EncodeSecret(key) + ")", provider, error, /* require_checksum=*/ false);
34+
assert(desc);
35+
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
36+
if (!wallet->AddWalletDescriptor(w_desc, provider, "", false)) assert(false);
2937
}
3038
WalletRescanReserver reserver(*wallet);
3139
reserver.reserve();

0 commit comments

Comments
 (0)