diff options
author | Pieter Wuille <pieter@wuille.net> | 2022-01-11 12:02:12 -0500 |
---|---|---|
committer | Pieter Wuille <pieter@wuille.net> | 2022-01-12 11:09:41 -0500 |
commit | 3eed6fca57d1fa7544f372e6e7de0a9ae1b5715a (patch) | |
tree | 034c45a83dffd3d4f40e73f1905a50a65189cfa9 /src/script | |
parent | 79728c4a3d8a74f276daf1e72abbdecdab85a5d8 (diff) |
Add multi_a descriptor inference
Diffstat (limited to 'src/script')
-rw-r--r-- | src/script/descriptor.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp index 4c55488b1f..d7930dea3f 100644 --- a/src/script/descriptor.cpp +++ b/src/script/descriptor.cpp @@ -1287,6 +1287,21 @@ std::unique_ptr<PubkeyProvider> InferXOnlyPubkey(const XOnlyPubKey& xkey, ParseS return key_provider; } +std::unique_ptr<DescriptorImpl> InferMultiA(const CScript& script, ParseScriptContext ctx, const SigningProvider& provider) +{ + auto match = MatchMultiA(script); + if (!match) return {}; + std::vector<std::unique_ptr<PubkeyProvider>> keys; + keys.reserve(match->second.size()); + for (const auto keyspan : match->second) { + if (keyspan.size() != 32) return {}; + auto key = InferXOnlyPubkey(XOnlyPubKey{keyspan}, ctx, provider); + if (!key) return {}; + keys.push_back(std::move(key)); + } + return std::make_unique<MultiADescriptor>(match->first, std::move(keys)); +} + std::unique_ptr<DescriptorImpl> InferScript(const CScript& script, ParseScriptContext ctx, const SigningProvider& provider) { if (ctx == ParseScriptContext::P2TR && script.size() == 34 && script[0] == 32 && script[33] == OP_CHECKSIG) { @@ -1294,6 +1309,11 @@ std::unique_ptr<DescriptorImpl> InferScript(const CScript& script, ParseScriptCo return std::make_unique<PKDescriptor>(InferXOnlyPubkey(key, ctx, provider)); } + if (ctx == ParseScriptContext::P2TR) { + auto ret = InferMultiA(script, ctx, provider); + if (ret) return ret; + } + std::vector<std::vector<unsigned char>> data; TxoutType txntype = Solver(script, data); |