Skip to content

Commit 1dfe19e

Browse files
committed
Merge #20153: wallet: do not import a descriptor with hardened derivations into a watch-only wallet
538be42 wallet: fix importdescriptor silent fail (Ivan Metlushko) Pull request description: Currently `importdescriptor` command will successfully import a descriptor with hardened derivations into a watch-only wallet while silently failing to expand the descriptor to fill the cache. This leads to a broken wallet state and failure to load such wallet due to missing cache on subsequent restart. ACKs for top commit: laanwj: Code review ACK 538be42 achow101: ACK 538be42 meshcollider: utACK 538be42 Tree-SHA512: 4bdd0ab4437d55b3f1a79c3a300a0b186089155c020fe220a73d0cce274de47d90371d88918d39fd795f9fccf8db328f1e322d29a6062f9ce94a1c254398f004
2 parents 79a3b59 + 538be42 commit 1dfe19e

File tree

3 files changed

+16
-2
lines changed

3 files changed

+16
-2
lines changed

src/wallet/rpcdump.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1523,7 +1523,9 @@ static UniValue ProcessDescriptorImport(CWallet * const pwallet, const UniValue&
15231523
// Need to ExpandPrivate to check if private keys are available for all pubkeys
15241524
FlatSigningProvider expand_keys;
15251525
std::vector<CScript> scripts;
1526-
parsed_desc->Expand(0, keys, scripts, expand_keys);
1526+
if (!parsed_desc->Expand(0, keys, scripts, expand_keys)) {
1527+
throw JSONRPCError(RPC_WALLET_ERROR, "Cannot expand descriptor. Probably because of hardened derivations without private keys provided");
1528+
}
15271529
parsed_desc->ExpandPrivate(0, keys, expand_keys);
15281530

15291531
// Check if all private keys are provided

src/wallet/wallet.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4556,7 +4556,10 @@ ScriptPubKeyMan* CWallet::AddWalletDescriptor(WalletDescriptor& desc, const Flat
45564556
}
45574557

45584558
// Top up key pool, the manager will generate new scriptPubKeys internally
4559-
new_spk_man->TopUp();
4559+
if (!new_spk_man->TopUp()) {
4560+
WalletLogPrintf("Could not top up scriptPubKeys\n");
4561+
return nullptr;
4562+
}
45604563

45614564
// Apply the label if necessary
45624565
// Note: we disable labels for ranged descriptors

test/functional/wallet_importdescriptors.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,15 @@ def run_test(self):
221221
success=False,
222222
error_code=-4,
223223
error_message='Cannot import private keys to a wallet with private keys disabled')
224+
225+
self.log.info("Should not import a descriptor with hardened derivations when private keys are disabled")
226+
self.test_importdesc({"desc": descsum_create("wpkh(" + xpub + "/1h/*)"),
227+
"timestamp": "now",
228+
"range": 1},
229+
success=False,
230+
error_code=-4,
231+
error_message='Cannot expand descriptor. Probably because of hardened derivations without private keys provided')
232+
224233
for address in addresses:
225234
test_address(w1,
226235
address,

0 commit comments

Comments
 (0)