Bitcoin Core  31.0.0
P2P Digital Currency
walletutil.cpp
Go to the documentation of this file.
1 // Copyright (c) 2017-present 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 WalletDescriptor 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  }
58  case OutputType::BECH32M: {
59  desc_prefix = "tr(" + xpub + "/86h";
60  break;
61  }
62  case OutputType::UNKNOWN: {
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
static UniValue Parse(std::string_view raw, ParamFormat format=ParamFormat::JSON)
Parse string to UniValue or throw runtime_error if string contains invalid JSON.
Definition: client.cpp:395
fs::path GetPathArg(std::string arg, const fs::path &default_value={}) const
Return path argument or default value.
Definition: args.cpp:276
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
Definition: args.cpp:375
assert(!tx.IsCoinBase())
WalletDescriptor GenerateWalletDescriptor(const CExtPubKey &master_key, const OutputType &addr_type, bool internal)
Definition: walletutil.cpp:35
int64_t GetTime()
DEPRECATED, see GetTime.
Definition: time.cpp:81
fs::path GetWalletDir()
Get the path of the wallet directory.
Definition: walletutil.cpp:13
OutputType
Definition: outputtype.h:18
fs::path GetDataDirNet() const
Get data directory path with appended network identifier.
Definition: args.h:239
Descriptor with some wallet metadata.
Definition: walletutil.h:63
ArgsManager gArgs
Definition: args.cpp:40
std::string EncodeExtPubKey(const CExtPubKey &key)
Definition: key_io.cpp:257
bool IsTestChain() const
If this chain is exclusively used for testing.
Definition: chainparams.h:98
const CChainParams & Params()
Return the currently selected parameters.
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Definition: fs.h:33