BCW_API bool hd_private_key::set_serialized(std::string encoded) { if (!is_base58(encoded)) return false; const data_chunk decoded = decode_base58(encoded); if (decoded.size() != serialized_length) return false; if (!verify_checksum(decoded)) return false; auto ds = make_deserializer(decoded.begin(), decoded.end()); auto prefix = ds.read_big_endian<uint32_t>(); if (prefix != mainnet_private_prefix && prefix != testnet_private_prefix) return false; valid_ = true; lineage_.testnet = prefix == testnet_private_prefix; lineage_.depth = ds.read_byte(); lineage_.parent_fingerprint = ds.read_little_endian<uint32_t>(); lineage_.child_number = ds.read_big_endian<uint32_t>(); c_ = ds.read_bytes<chain_code_size>(); ds.read_byte(); k_ = ds.read_bytes<ec_secret_size>(); K_ = secret_to_public_key(k_); return true; }
bool is_base58(const std::string& text) { const auto test = [](const char ch) { return is_base58(ch); }; return std::all_of(text.begin(), text.end(), test); }
bool payment_address::set_encoded(const std::string& encoded_address) { if (!is_base58(encoded_address)) return false; const data_chunk decoded_address = decode_base58(encoded_address); // version + 20 bytes short hash + 4 bytes checksum if (decoded_address.size() != 25) return false; if (!verify_checksum(decoded_address)) return false; version_ = decoded_address[0]; std::copy_n(decoded_address.begin() + 1, hash_.size(), hash_.begin()); return true; }
bool is_base58(const std::string& text) { return std::all_of(text.begin(), text.end(), [](const char c){ return is_base58(c); }); }