/root/bitcoin/src/wallet/walletutil.cpp
Line | Count | Source |
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 { |
13 | | fs::path GetWalletDir() |
14 | 0 | { |
15 | 0 | fs::path path; |
16 | |
|
17 | 0 | if (gArgs.IsArgSet("-walletdir")) { |
18 | 0 | path = gArgs.GetPathArg("-walletdir"); |
19 | 0 | if (!fs::is_directory(path)) { |
20 | | // If the path specified doesn't exist, we return the deliberately |
21 | | // invalid empty string. |
22 | 0 | path = ""; |
23 | 0 | } |
24 | 0 | } else { |
25 | 0 | path = gArgs.GetDataDirNet(); |
26 | | // If a wallets directory exists, use that, otherwise default to GetDataDir |
27 | 0 | if (fs::is_directory(path / "wallets")) { |
28 | 0 | path /= "wallets"; |
29 | 0 | } |
30 | 0 | } |
31 | |
|
32 | 0 | return path; |
33 | 0 | } |
34 | | |
35 | | WalletDescriptor GenerateWalletDescriptor(const CExtPubKey& master_key, const OutputType& addr_type, bool internal) |
36 | 0 | { |
37 | 0 | int64_t creation_time = GetTime(); |
38 | |
|
39 | 0 | std::string xpub = EncodeExtPubKey(master_key); |
40 | | |
41 | | // Build descriptor string |
42 | 0 | std::string desc_prefix; |
43 | 0 | std::string desc_suffix = "/*)"; |
44 | 0 | switch (addr_type) { |
45 | 0 | case OutputType::LEGACY: { |
46 | 0 | desc_prefix = "pkh(" + xpub + "/44h"; |
47 | 0 | break; |
48 | 0 | } |
49 | 0 | case OutputType::P2SH_SEGWIT: { |
50 | 0 | desc_prefix = "sh(wpkh(" + xpub + "/49h"; |
51 | 0 | desc_suffix += ")"; |
52 | 0 | break; |
53 | 0 | } |
54 | 0 | case OutputType::BECH32: { |
55 | 0 | desc_prefix = "wpkh(" + xpub + "/84h"; |
56 | 0 | break; |
57 | 0 | } |
58 | 0 | case OutputType::BECH32M: { |
59 | 0 | desc_prefix = "tr(" + xpub + "/86h"; |
60 | 0 | break; |
61 | 0 | } |
62 | 0 | 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 | 0 | assert(false); |
66 | 0 | } |
67 | 0 | } // no default case, so the compiler can warn about missing cases |
68 | 0 | assert(!desc_prefix.empty()); |
69 | | |
70 | | // Mainnet derives at 0', testnet and regtest derive at 1' |
71 | 0 | if (Params().IsTestChain()) { |
72 | 0 | desc_prefix += "/1h"; |
73 | 0 | } else { |
74 | 0 | desc_prefix += "/0h"; |
75 | 0 | } |
76 | |
|
77 | 0 | std::string internal_path = internal ? "/1" : "/0"; |
78 | 0 | std::string desc_str = desc_prefix + "/0h" + internal_path + desc_suffix; |
79 | | |
80 | | // Make the descriptor |
81 | 0 | FlatSigningProvider keys; |
82 | 0 | std::string error; |
83 | 0 | std::vector<std::unique_ptr<Descriptor>> desc = Parse(desc_str, keys, error, false); |
84 | 0 | WalletDescriptor w_desc(std::move(desc.at(0)), creation_time, 0, 0, 0); |
85 | 0 | return w_desc; |
86 | 0 | } |
87 | | |
88 | | } // namespace wallet |