@@ -939,7 +939,7 @@ std::unique_ptr<PubkeyProvider> ParsePubkey(uint32_t key_exp_index, const Span<c
939
939
}
940
940
941
941
/* * Parse a script in a particular context. */
942
- std::unique_ptr<DescriptorImpl> ParseScript (uint32_t key_exp_index, Span<const char >& sp, ParseScriptContext ctx, FlatSigningProvider& out, std::string& error)
942
+ std::unique_ptr<DescriptorImpl> ParseScript (uint32_t & key_exp_index, Span<const char >& sp, ParseScriptContext ctx, FlatSigningProvider& out, std::string& error)
943
943
{
944
944
using namespace spanparsing ;
945
945
@@ -948,16 +948,19 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t key_exp_index, Span<const c
948
948
if (Func (" pk" , expr)) {
949
949
auto pubkey = ParsePubkey (key_exp_index, expr, ctx != ParseScriptContext::P2WSH, out, error);
950
950
if (!pubkey) return nullptr ;
951
+ ++key_exp_index;
951
952
return std::make_unique<PKDescriptor>(std::move (pubkey));
952
953
}
953
954
if (Func (" pkh" , expr)) {
954
955
auto pubkey = ParsePubkey (key_exp_index, expr, ctx != ParseScriptContext::P2WSH, out, error);
955
956
if (!pubkey) return nullptr ;
957
+ ++key_exp_index;
956
958
return std::make_unique<PKHDescriptor>(std::move (pubkey));
957
959
}
958
960
if (ctx == ParseScriptContext::TOP && Func (" combo" , expr)) {
959
961
auto pubkey = ParsePubkey (key_exp_index, expr, true , out, error);
960
962
if (!pubkey) return nullptr ;
963
+ ++key_exp_index;
961
964
return std::make_unique<ComboDescriptor>(std::move (pubkey));
962
965
} else if (ctx != ParseScriptContext::TOP && Func (" combo" , expr)) {
963
966
error = " Cannot have combo in non-top level" ;
@@ -1011,6 +1014,7 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t key_exp_index, Span<const c
1011
1014
if (ctx != ParseScriptContext::P2WSH && Func (" wpkh" , expr)) {
1012
1015
auto pubkey = ParsePubkey (key_exp_index, expr, false , out, error);
1013
1016
if (!pubkey) return nullptr ;
1017
+ key_exp_index++;
1014
1018
return std::make_unique<WPKHDescriptor>(std::move (pubkey));
1015
1019
} else if (ctx == ParseScriptContext::P2WSH && Func (" wpkh" , expr)) {
1016
1020
error = " Cannot have wpkh within wsh" ;
@@ -1177,7 +1181,8 @@ std::unique_ptr<Descriptor> Parse(const std::string& descriptor, FlatSigningProv
1177
1181
{
1178
1182
Span<const char > sp{descriptor};
1179
1183
if (!CheckChecksum (sp, require_checksum, error)) return nullptr ;
1180
- auto ret = ParseScript (0 , sp, ParseScriptContext::TOP, out, error);
1184
+ uint32_t key_exp_index = 0 ;
1185
+ auto ret = ParseScript (key_exp_index, sp, ParseScriptContext::TOP, out, error);
1181
1186
if (sp.size () == 0 && ret) return std::unique_ptr<Descriptor>(std::move (ret));
1182
1187
return nullptr ;
1183
1188
}
0 commit comments