diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp index ddf8aecd6c5..24caeff7310 100644 --- a/src/script/descriptor.cpp +++ b/src/script/descriptor.cpp @@ -1712,6 +1712,20 @@ std::optional ParseKeyPathNum(std::span elem, bool& apostr return true; } +static DeriveType ParseDeriveType(std::vector>& split, bool& apostrophe) +{ + DeriveType type = DeriveType::NO; + if (std::ranges::equal(split.back(), std::span{"*"}.first(1))) { + split.pop_back(); + type = DeriveType::UNHARDENED; + } else if (std::ranges::equal(split.back(), std::span{"*'"}.first(2)) || std::ranges::equal(split.back(), std::span{"*h"}.first(2))) { + apostrophe = std::ranges::equal(split.back(), std::span{"*'"}.first(2)); + split.pop_back(); + type = DeriveType::HARDENED; + } + return type; +} + /** Parse a public key that excludes origin information. */ std::vector> ParsePubkeyInner(uint32_t key_exp_index, const std::span& sp, ParseScriptContext ctx, FlatSigningProvider& out, bool& apostrophe, std::string& error) { @@ -1775,15 +1789,7 @@ std::vector> ParsePubkeyInner(uint32_t key_exp_i return {}; } std::vector paths; - DeriveType type = DeriveType::NO; - if (std::ranges::equal(split.back(), std::span{"*"}.first(1))) { - split.pop_back(); - type = DeriveType::UNHARDENED; - } else if (std::ranges::equal(split.back(), std::span{"*'"}.first(2)) || std::ranges::equal(split.back(), std::span{"*h"}.first(2))) { - apostrophe = std::ranges::equal(split.back(), std::span{"*'"}.first(2)); - split.pop_back(); - type = DeriveType::HARDENED; - } + DeriveType type = ParseDeriveType(split, apostrophe); if (!ParseKeyPath(split, paths, apostrophe, error, /*allow_multipath=*/true)) return {}; if (extkey.key.IsValid()) { extpubkey = extkey.Neuter();