walletutil.cpp raw

   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 <util/log.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
  89