19 class 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;
93 if (data.size() == hash.
size() + pubkey_prefix.size() && std::equal(pubkey_prefix.begin(), pubkey_prefix.end(), data.begin())) {
94 std::copy(data.begin() + pubkey_prefix.size(), data.end(), hash.
begin());
100 if (data.size() == hash.
size() + script_prefix.size() && std::equal(script_prefix.begin(), script_prefix.end(), data.begin())) {
101 std::copy(data.begin() + script_prefix.size(), data.end(), hash.
begin());
106 if ((data.size() >= script_prefix.size() &&
107 std::equal(script_prefix.begin(), script_prefix.end(), data.begin())) ||
108 (data.size() >= pubkey_prefix.size() &&
109 std::equal(pubkey_prefix.begin(), pubkey_prefix.end(), data.begin()))) {
110 error_str =
"Invalid length for Base58 address";
112 error_str =
"Invalid prefix for Base58-encoded address";
115 }
else if (!is_bech32) {
118 error_str =
"Not a valid Bech32 or Base58 encoding";
120 error_str =
"Invalid checksum or length of Base58 address";
130 error_str =
"Invalid prefix for Bech32 address";
133 int version = dec.data[0];
135 error_str =
"Version 0 witness address must use Bech32 checksum";
139 error_str =
"Version 1+ witness address must use Bech32m checksum";
143 data.reserve(((dec.data.size() - 1) * 5) / 8);
144 if (ConvertBits<5, 8, false>([&](
unsigned char c) { data.push_back(c); }, dec.data.begin() + 1, dec.data.end())) {
148 if (data.size() == keyid.
size()) {
149 std::copy(data.begin(), data.end(), keyid.
begin());
155 if (data.size() == scriptid.
size()) {
156 std::copy(data.begin(), data.end(), scriptid.
begin());
161 error_str =
"Invalid Bech32 v0 address data size";
168 std::copy(data.begin(), data.end(), tap.
begin());
173 error_str =
"Invalid Bech32 address witness version";
178 error_str =
"Invalid Bech32 address data size";
184 std::copy(data.begin(), data.end(), unk.
program);
192 error_str = res.first;
193 if (error_locations) *error_locations = std::move(res.second);
201 std::vector<unsigned char> data;
204 if ((data.size() == 32 + privkey_prefix.size() || (data.size() == 33 + privkey_prefix.size() && data.back() == 1)) &&
205 std::equal(privkey_prefix.begin(), privkey_prefix.end(), data.begin())) {
206 bool compressed = data.size() == 33 + privkey_prefix.size();
207 key.
Set(data.begin() + privkey_prefix.size(), data.begin() + privkey_prefix.size() + 32, compressed);
220 data.insert(data.end(), key.
begin(), key.
end());
232 std::vector<unsigned char> data;
245 size_t size = data.size();
247 key.
Encode(data.data() + size);
255 std::vector<unsigned char> data;
268 size_t size = data.size();
270 key.
Encode(data.data() + size);
278 return std::visit(DestinationEncoder(
Params()), dest);
288 std::string error_msg;
294 std::string error_msg;