/ src / wallet / walletutil.cpp
walletutil.cpp
 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 {
13  fs::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  
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      }
49      case OutputType::P2SH_SEGWIT: {
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
81      FlatSigningProvider keys;
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