Bitcoin Core 28.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 {
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
35bool IsFeatureSupported(int wallet_version, int feature_version)
36{
37 return wallet_version >= feature_version;
38}
39
41{
43 for (const WalletFeature& wf : wallet_features) {
44 if (version >= wf) return wf;
45 }
46 return static_cast<WalletFeature>(0);
47}
48
49WalletDescriptor GenerateWalletDescriptor(const CExtPubKey& master_key, const OutputType& addr_type, bool internal)
50{
51 int64_t creation_time = GetTime();
52
53 std::string xpub = EncodeExtPubKey(master_key);
54
55 // Build descriptor string
56 std::string desc_prefix;
57 std::string desc_suffix = "/*)";
58 switch (addr_type) {
59 case OutputType::LEGACY: {
60 desc_prefix = "pkh(" + xpub + "/44h";
61 break;
62 }
64 desc_prefix = "sh(wpkh(" + xpub + "/49h";
65 desc_suffix += ")";
66 break;
67 }
68 case OutputType::BECH32: {
69 desc_prefix = "wpkh(" + xpub + "/84h";
70 break;
71 }
73 desc_prefix = "tr(" + xpub + "/86h";
74 break;
75 }
77 // We should never have a DescriptorScriptPubKeyMan for an UNKNOWN OutputType,
78 // so if we get to this point something is wrong
79 assert(false);
80 }
81 } // no default case, so the compiler can warn about missing cases
82 assert(!desc_prefix.empty());
83
84 // Mainnet derives at 0', testnet and regtest derive at 1'
85 if (Params().IsTestChain()) {
86 desc_prefix += "/1h";
87 } else {
88 desc_prefix += "/0h";
89 }
90
91 std::string internal_path = internal ? "/1" : "/0";
92 std::string desc_str = desc_prefix + "/0h" + internal_path + desc_suffix;
93
94 // Make the descriptor
96 std::string error;
97 std::vector<std::unique_ptr<Descriptor>> desc = Parse(desc_str, keys, error, false);
98 WalletDescriptor w_desc(std::move(desc.at(0)), creation_time, 0, 0, 0);
99 return w_desc;
100}
101
102} // 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
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Definition: fs.h:33
Descriptor with some wallet metadata.
Definition: walletutil.h:85
static UniValue Parse(std::string_view raw)
Parse string to UniValue or throw runtime_error if string contains invalid JSON.
Definition: client.cpp:327
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
WalletFeature
(client) version numbers for particular wallet features
Definition: walletutil.h:16
@ FEATURE_COMPRPUBKEY
Definition: walletutil.h:20
@ FEATURE_HD_SPLIT
Definition: walletutil.h:24
@ FEATURE_HD
Definition: walletutil.h:22
@ FEATURE_WALLETCRYPT
Definition: walletutil.h:19
@ FEATURE_LATEST
Definition: walletutil.h:30
@ FEATURE_PRE_SPLIT_KEYPOOL
Definition: walletutil.h:28
@ FEATURE_NO_DEFAULT_KEY
Definition: walletutil.h:26
@ FEATURE_BASE
Definition: walletutil.h:17
bool IsFeatureSupported(int wallet_version, int feature_version)
Definition: walletutil.cpp:35
WalletFeature GetClosestWalletFeature(int version)
Definition: walletutil.cpp:40
WalletDescriptor GenerateWalletDescriptor(const CExtPubKey &master_key, const OutputType &addr_type, bool internal)
Definition: walletutil.cpp:49
OutputType
Definition: outputtype.h:17
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
Definition: time.cpp:47
assert(!tx.IsCoinBase())