Bitcoin Core 29.99.0
P2P Digital Currency
walletutil.cpp
Go to the documentation of this file.
1// Copyright (c) 2017-2022 The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#include <wallet/walletutil.h>
6
7#include <chainparams.h>
8#include <common/args.h>
9#include <key_io.h>
10#include <logging.h>
11
12namespace wallet {
13fs::path GetWalletDir()
14{
15 fs::path path;
16
17 if (gArgs.IsArgSet("-walletdir")) {
18 path = gArgs.GetPathArg("-walletdir");
19 if (!fs::is_directory(path)) {
20 // If the path specified doesn't exist, we return the deliberately
21 // invalid empty string.
22 path = "";
23 }
24 } else {
25 path = gArgs.GetDataDirNet();
26 // If a wallets directory exists, use that, otherwise default to GetDataDir
27 if (fs::is_directory(path / "wallets")) {
28 path /= "wallets";
29 }
30 }
31
32 return path;
33}
34
35WalletDescriptor GenerateWalletDescriptor(const CExtPubKey& master_key, const OutputType& addr_type, bool internal)
36{
37 int64_t creation_time = GetTime();
38
39 std::string xpub = EncodeExtPubKey(master_key);
40
41 // Build descriptor string
42 std::string desc_prefix;
43 std::string desc_suffix = "/*)";
44 switch (addr_type) {
45 case OutputType::LEGACY: {
46 desc_prefix = "pkh(" + xpub + "/44h";
47 break;
48 }
50 desc_prefix = "sh(wpkh(" + xpub + "/49h";
51 desc_suffix += ")";
52 break;
53 }
54 case OutputType::BECH32: {
55 desc_prefix = "wpkh(" + xpub + "/84h";
56 break;
57 }
59 desc_prefix = "tr(" + xpub + "/86h";
60 break;
61 }
63 // We should never have a DescriptorScriptPubKeyMan for an UNKNOWN OutputType,
64 // so if we get to this point something is wrong
65 assert(false);
66 }
67 } // no default case, so the compiler can warn about missing cases
68 assert(!desc_prefix.empty());
69
70 // Mainnet derives at 0', testnet and regtest derive at 1'
71 if (Params().IsTestChain()) {
72 desc_prefix += "/1h";
73 } else {
74 desc_prefix += "/0h";
75 }
76
77 std::string internal_path = internal ? "/1" : "/0";
78 std::string desc_str = desc_prefix + "/0h" + internal_path + desc_suffix;
79
80 // Make the descriptor
82 std::string error;
83 std::vector<std::unique_ptr<Descriptor>> desc = Parse(desc_str, keys, error, false);
84 WalletDescriptor w_desc(std::move(desc.at(0)), creation_time, 0, 0, 0);
85 return w_desc;
86}
87
88} // namespace wallet
ArgsManager gArgs
Definition: args.cpp:42
const CChainParams & Params()
Return the currently selected parameters.
fs::path GetDataDirNet() const
Get data directory path with appended network identifier.
Definition: args.h:234
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
Definition: args.cpp:371
fs::path GetPathArg(std::string arg, const fs::path &default_value={}) const
Return path argument or default value.
Definition: args.cpp:272
Descriptor with some wallet metadata.
Definition: walletutil.h:64
static UniValue Parse(std::string_view raw)
Parse string to UniValue or throw runtime_error if string contains invalid JSON.
Definition: client.cpp:321
std::string EncodeExtPubKey(const CExtPubKey &key)
Definition: key_io.cpp:257
fs::path GetWalletDir()
Get the path of the wallet directory.
Definition: walletutil.cpp:13
WalletDescriptor GenerateWalletDescriptor(const CExtPubKey &master_key, const OutputType &addr_type, bool internal)
Definition: walletutil.cpp:35
OutputType
Definition: outputtype.h:17
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
Definition: time.cpp:77
assert(!tx.IsCoinBase())