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