aboutsummaryrefslogtreecommitdiff
path: root/src/key_io.cpp
diff options
context:
space:
mode:
authorPieter Wuille <pieter@wuille.net>2021-05-23 17:38:40 -0700
committerPieter Wuille <pieter@wuille.net>2021-05-24 12:14:16 -0700
commita4bf84039c00b196b87f969acf6369d72c56ab46 (patch)
tree93acdb7aa3dadf25b60e6c165750f3dafbde7006 /src/key_io.cpp
parent41839bdb89b3777ece2318877b9c7921ecca2472 (diff)
downloadbitcoin-a4bf84039c00b196b87f969acf6369d72c56ab46.tar.xz
Separate WitnessV1Taproot variant in CTxDestination
Diffstat (limited to 'src/key_io.cpp')
-rw-r--r--src/key_io.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/key_io.cpp b/src/key_io.cpp
index dbcbfa1f29..615f4c9312 100644
--- a/src/key_io.cpp
+++ b/src/key_io.cpp
@@ -54,6 +54,14 @@ public:
return bech32::Encode(bech32::Encoding::BECH32, m_params.Bech32HRP(), data);
}
+ std::string operator()(const WitnessV1Taproot& tap) const
+ {
+ std::vector<unsigned char> data = {1};
+ data.reserve(53);
+ ConvertBits<8, 5, true>([&](unsigned char c) { data.push_back(c); }, tap.begin(), tap.end());
+ return bech32::Encode(bech32::Encoding::BECH32M, m_params.Bech32HRP(), data);
+ }
+
std::string operator()(const WitnessUnknown& id) const
{
if (id.version < 1 || id.version > 16 || id.length < 2 || id.length > 40) {
@@ -135,6 +143,13 @@ CTxDestination DecodeDestination(const std::string& str, const CChainParams& par
return CNoDestination();
}
+ if (version == 1 && data.size() == WITNESS_V1_TAPROOT_SIZE) {
+ static_assert(WITNESS_V1_TAPROOT_SIZE == WitnessV1Taproot::size());
+ WitnessV1Taproot tap;
+ std::copy(data.begin(), data.end(), tap.begin());
+ return tap;
+ }
+
if (version > 16) {
error_str = "Invalid Bech32 address witness version";
return CNoDestination();