Bitcoin Core  31.0.0
P2P Digital Currency
bip32.cpp
Go to the documentation of this file.
1 // Copyright (c) 2019-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 <tinyformat.h>
6 #include <util/bip32.h>
7 #include <util/strencodings.h>
8 
9 #include <cstdint>
10 #include <cstdio>
11 #include <sstream>
12 
13 bool ParseHDKeypath(const std::string& keypath_str, std::vector<uint32_t>& keypath)
14 {
15  std::stringstream ss(keypath_str);
16  std::string item;
17  bool first = true;
18  while (std::getline(ss, item, '/')) {
19  if (item.compare("m") == 0) {
20  if (first) {
21  first = false;
22  continue;
23  }
24  return false;
25  }
26  // Finds whether it is hardened
27  uint32_t path = 0;
28  size_t pos = item.find('\'');
29  if (pos != std::string::npos) {
30  // The hardened tick can only be in the last index of the string
31  if (pos != item.size() - 1) {
32  return false;
33  }
34  path |= 0x80000000;
35  item = item.substr(0, item.size() - 1); // Drop the last character which is the hardened tick
36  }
37 
38  // Ensure this is only numbers
39  const auto number{ToIntegral<uint32_t>(item)};
40  if (!number) {
41  return false;
42  }
43  path |= *number;
44 
45  keypath.push_back(path);
46  first = false;
47  }
48  return true;
49 }
50 
51 std::string FormatHDKeypath(const std::vector<uint32_t>& path, bool apostrophe)
52 {
53  std::string ret;
54  for (auto i : path) {
55  ret += strprintf("/%i", (i << 1) >> 1);
56  if (i >> 31) ret += apostrophe ? '\'' : 'h';
57  }
58  return ret;
59 }
60 
61 std::string WriteHDKeypath(const std::vector<uint32_t>& keypath, bool apostrophe)
62 {
63  return "m" + FormatHDKeypath(keypath, apostrophe);
64 }
int ret
std::string WriteHDKeypath(const std::vector< uint32_t > &keypath, bool apostrophe)
Write HD keypaths as strings.
Definition: bip32.cpp:61
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition: tinyformat.h:1172
std::string FormatHDKeypath(const std::vector< uint32_t > &path, bool apostrophe)
Definition: bip32.cpp:51
bool ParseHDKeypath(const std::string &keypath_str, std::vector< uint32_t > &keypath)
Parse an HD keypaths like "m/7/0&#39;/2000".
Definition: bip32.cpp:13