19class DestinationEncoder
 
   25    explicit DestinationEncoder(
const CChainParams& params) : m_params(params) {}
 
   27    std::string operator()(
const PKHash& 
id)
 const 
   30        data.insert(data.end(), 
id.begin(), 
id.end());
 
   34    std::string operator()(
const ScriptHash& 
id)
 const 
   37        data.insert(data.end(), 
id.begin(), 
id.end());
 
   43        std::vector<unsigned char> data = {0};
 
   45        ConvertBits<8, 5, true>([&](
unsigned char c) { data.push_back(c); }, 
id.begin(), 
id.end());
 
   51        std::vector<unsigned char> data = {0};
 
   53        ConvertBits<8, 5, true>([&](
unsigned char c) { data.push_back(c); }, 
id.begin(), 
id.end());
 
   59        std::vector<unsigned char> data = {1};
 
   61        ConvertBits<8, 5, true>([&](
unsigned char c) { data.push_back(c); }, tap.
begin(), tap.
end());
 
   67        if (
id.version < 1 || id.version > 16 || 
id.length < 2 || id.length > 40) {
 
   70        std::vector<unsigned char> data = {(
unsigned char)
id.version};
 
   71        data.reserve(1 + (
id.length * 8 + 4) / 5);
 
   72        ConvertBits<8, 5, true>([&](
unsigned char c) { data.push_back(c); }, 
id.program, 
id.program + 
id.length);
 
   76    std::string operator()(
const CNoDestination& no)
 const { 
return {}; }
 
   81    std::vector<unsigned char> data;
 
   89        if (data.size() == hash.
size() + pubkey_prefix.size() && std::equal(pubkey_prefix.begin(), pubkey_prefix.end(), data.begin())) {
 
   90            std::copy(data.begin() + pubkey_prefix.size(), data.end(), hash.
begin());
 
   96        if (data.size() == hash.
size() + script_prefix.size() && std::equal(script_prefix.begin(), script_prefix.end(), data.begin())) {
 
   97            std::copy(data.begin() + script_prefix.size(), data.end(), hash.
begin());
 
  103        error_str = 
"Invalid prefix for Base58-encoded address";
 
  111            error_str = 
"Invalid prefix for Bech32 address";
 
  114        int version = dec.data[0]; 
 
  116            error_str = 
"Version 0 witness address must use Bech32 checksum";
 
  120            error_str = 
"Version 1+ witness address must use Bech32m checksum";
 
  124        data.reserve(((dec.data.size() - 1) * 5) / 8);
 
  125        if (ConvertBits<5, 8, false>([&](
unsigned char c) { data.push_back(c); }, dec.data.begin() + 1, dec.data.end())) {
 
  129                    if (data.size() == keyid.
size()) {
 
  130                        std::copy(data.begin(), data.end(), keyid.
begin());
 
  136                    if (data.size() == scriptid.
size()) {
 
  137                        std::copy(data.begin(), data.end(), scriptid.
begin());
 
  142                error_str = 
"Invalid Bech32 v0 address data size";
 
  149                std::copy(data.begin(), data.end(), tap.
begin());
 
  154                error_str = 
"Invalid Bech32 address witness version";
 
  159                error_str = 
"Invalid Bech32 address data size";
 
  165            std::copy(data.begin(), data.end(), unk.
program);
 
  172    if (error_str.empty()) error_str = 
"Invalid address format";
 
  181    std::vector<unsigned char> data;
 
  184        if ((data.size() == 32 + privkey_prefix.size() || (data.size() == 33 + privkey_prefix.size() && data.back() == 1)) &&
 
  185            std::equal(privkey_prefix.begin(), privkey_prefix.end(), data.begin())) {
 
  186            bool compressed = data.size() == 33 + privkey_prefix.size();
 
  187            key.
Set(data.begin() + privkey_prefix.size(), data.begin() + privkey_prefix.size() + 32, compressed);
 
  200    data.insert(data.end(), key.
begin(), key.
end());
 
  212    std::vector<unsigned char> data;
 
  225    size_t size = data.size();
 
  227    key.
Encode(data.data() + size);
 
  235    std::vector<unsigned char> data;
 
  248    size_t size = data.size();
 
  250    key.
Encode(data.data() + size);
 
  258    return std::visit(DestinationEncoder(
Params()), dest);
 
  268    std::string error_msg;
 
  274    std::string error_msg;
 
std::string EncodeBase58Check(Span< const unsigned char > input)
Encode a byte span into a base58-encoded string, including checksum.
static bool DecodeBase58Check(const char *psz, std::vector< unsigned char > &vchRet, int max_ret_len)
const CChainParams & Params()
Return the currently selected parameters.
CChainParams defines various tweakable parameters of a given instance of the Bitcoin system.
const std::vector< unsigned char > & Base58Prefix(Base58Type type) const
const std::string & Bech32HRP() const
An encapsulated private key.
const unsigned char * begin() const
bool IsValid() const
Check whether this private key is valid.
const unsigned char * end() const
bool IsCompressed() const
Check whether the public key corresponding to this private key is (to be) compressed.
void Set(const T pbegin, const T pend, bool fCompressedIn)
Initialize using begin and end iterators to byte data.
const unsigned char * end() const
const unsigned char * begin() const
static constexpr size_t size()
static constexpr unsigned int size()
void memory_cleanse(void *ptr, size_t len)
Secure overwrite a buffer (possibly containing secret data) with zero-bytes.
static constexpr size_t WITNESS_V1_TAPROOT_SIZE
static constexpr std::size_t BECH32_WITNESS_PROG_MAX_LEN
Maximum witness length for Bech32 addresses.
bool IsValidDestinationString(const std::string &str, const CChainParams ¶ms)
std::string EncodeExtKey(const CExtKey &key)
CExtPubKey DecodeExtPubKey(const std::string &str)
std::string EncodeSecret(const CKey &key)
std::string EncodeDestination(const CTxDestination &dest)
CKey DecodeSecret(const std::string &str)
std::string EncodeExtPubKey(const CExtPubKey &key)
CTxDestination DecodeDestination(const std::string &str, std::string &error_msg)
CExtKey DecodeExtKey(const std::string &str)
@ BECH32
Bech32 encoding as defined in BIP173.
@ BECH32M
Bech32m encoding as defined in BIP350.
std::string Encode(Encoding encoding, const std::string &hrp, const data &values)
Encode a Bech32 or Bech32m string.
DecodeResult Decode(const std::string &str)
Decode a Bech32 or Bech32m string.
const unsigned int BIP32_EXTKEY_SIZE
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination is a CNoDestination.
std::variant< CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script template with a specific destination.
void Decode(const unsigned char code[BIP32_EXTKEY_SIZE])
void Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const
void Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const
void Decode(const unsigned char code[BIP32_EXTKEY_SIZE])
CTxDestination subtype to encode any future Witness version.
unsigned char program[40]