Bitcoin Core  27.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 
12 namespace 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 
35 bool 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 
49 WalletDescriptor 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  }
72  case OutputType::BECH32M: {
73  desc_prefix = "tr(" + xpub + "/86h";
74  break;
75  }
76  case OutputType::UNKNOWN: {
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::unique_ptr<Descriptor> desc = Parse(desc_str, keys, error, false);
98  WalletDescriptor w_desc(std::move(desc), creation_time, 0, 0, 0);
99  return w_desc;
100 }
101 
102 } // namespace wallet
ArgsManager gArgs
Definition: args.cpp:41
const CChainParams & Params()
Return the currently selected parameters.
fs::path GetDataDirNet() const
Get data directory path with appended network identifier.
Definition: args.h:232
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
Definition: args.cpp:369
fs::path GetPathArg(std::string arg, const fs::path &default_value={}) const
Return path argument or default value.
Definition: args.cpp:270
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:318
std::string EncodeExtPubKey(const CExtPubKey &key)
Definition: key_io.cpp:253
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()
Definition: time.cpp:48
assert(!tx.IsCoinBase())