From 975783cb79e929260873c1055d4b415cd33bb6b9 Mon Sep 17 00:00:00 2001 From: pythcoiner Date: Fri, 24 Jan 2025 07:31:09 +0100 Subject: [PATCH] descriptor: account for all StringType in MiniscriptDescriptor::ToStringHelper() --- src/script/descriptor.cpp | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp index 2e1a30744ec..99aba6c4641 100644 --- a/src/script/descriptor.cpp +++ b/src/script/descriptor.cpp @@ -1286,20 +1286,33 @@ class StringMaker { const SigningProvider* m_arg; //! Keys contained in the Miniscript (a reference to DescriptorImpl::m_pubkey_args). const std::vector>& m_pubkeys; - //! Whether to serialize keys as private or public. - bool m_private; + //! StringType to serialize keys + const DescriptorImpl::StringType m_type; + const DescriptorCache* m_cache; public: - StringMaker(const SigningProvider* arg LIFETIMEBOUND, const std::vector>& pubkeys LIFETIMEBOUND, bool priv) - : m_arg(arg), m_pubkeys(pubkeys), m_private(priv) {} + StringMaker(const SigningProvider* arg LIFETIMEBOUND, + const std::vector>& pubkeys LIFETIMEBOUND, + DescriptorImpl::StringType type, + const DescriptorCache* cache LIFETIMEBOUND) + : m_arg(arg), m_pubkeys(pubkeys), m_type(type), m_cache(cache) {} std::optional ToString(uint32_t key) const { std::string ret; - if (m_private) { - if (!m_pubkeys[key]->ToPrivateString(*m_arg, ret)) return {}; - } else { + switch (m_type) { + case DescriptorImpl::StringType::PUBLIC: ret = m_pubkeys[key]->ToString(); + break; + case DescriptorImpl::StringType::PRIVATE: + if (!m_pubkeys[key]->ToPrivateString(*m_arg, ret)) return {}; + break; + case DescriptorImpl::StringType::NORMALIZED: + if (!m_pubkeys[key]->ToNormalizedString(*m_arg, ret, m_cache)) return {}; + break; + case DescriptorImpl::StringType::COMPAT: + ret = m_pubkeys[key]->ToString(PubkeyProvider::StringType::COMPAT); + break; } return ret; } @@ -1332,7 +1345,7 @@ public: bool ToStringHelper(const SigningProvider* arg, std::string& out, const StringType type, const DescriptorCache* cache = nullptr) const override { - if (const auto res = m_node->ToString(StringMaker(arg, m_pubkey_args, type == StringType::PRIVATE))) { + if (const auto res = m_node->ToString(StringMaker(arg, m_pubkey_args, type, cache))) { out = *res; return true; }