git / moonbite-core / src/util/bip32.cpp · raw

// Copyright (c) 2019-2020 The Bitcoin Core developers// Distributed under the MIT software license, see the accompanying// file COPYING or http://www.opensource.org/licenses/mit-license.php.#include <sstream>#include <stdio.h>#include <tinyformat.h>#include <util/bip32.h>#include <util/strencodings.h>bool ParseHDKeypath(const std::string& keypath_str, std::vector<uint32_t>& keypath){    std::stringstream ss(keypath_str);    std::string item;    bool first = true;    while (std::getline(ss, item, '/')) {        if (item.compare("m") == 0) {            if (first) {                first = false;                continue;            }            return false;        }        // Finds whether it is hardened        uint32_t path = 0;        size_t pos = item.find("'");        if (pos != std::string::npos) {            // The hardened tick can only be in the last index of the string            if (pos != item.size() - 1) {                return false;            }            path |= 0x80000000;            item = item.substr(0, item.size() - 1); // Drop the last character which is the hardened tick        }        // Ensure this is only numbers        if (item.find_first_not_of( "0123456789" ) != std::string::npos) {            return false;        }        uint32_t number;        if (!ParseUInt32(item, &number)) {            return false;        }        path |= number;        keypath.push_back(path);        first = false;    }    return true;}std::string FormatHDKeypath(const std::vector<uint32_t>& path){    std::string ret;    for (auto i : path) {        ret += strprintf("/%i", (i << 1) >> 1);        if (i >> 31) ret += '\'';    }    return ret;}std::string WriteHDKeypath(const std::vector<uint32_t>& keypath){    return "m" + FormatHDKeypath(keypath);}