Skip to content

Commit 9b52672

Browse files
committed
For descriptor pubkey parse errors, include context information
Note 'Multi:' is used rather than 'multi():' as it also encompasses 'sortedmulti():'
1 parent 30308cc commit 9b52672

File tree

2 files changed

+38
-20
lines changed

2 files changed

+38
-20
lines changed

src/script/descriptor.cpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,13 +1043,19 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
10431043
bool sorted_multi = false;
10441044
if (Func("pk", expr)) {
10451045
auto pubkey = ParsePubkey(key_exp_index, expr, ctx, out, error);
1046-
if (!pubkey) return nullptr;
1046+
if (!pubkey) {
1047+
error = strprintf("pk(): %s", error);
1048+
return nullptr;
1049+
}
10471050
++key_exp_index;
10481051
return std::make_unique<PKDescriptor>(std::move(pubkey), ctx == ParseScriptContext::P2TR);
10491052
}
10501053
if ((ctx == ParseScriptContext::TOP || ctx == ParseScriptContext::P2SH || ctx == ParseScriptContext::P2WSH) && Func("pkh", expr)) {
10511054
auto pubkey = ParsePubkey(key_exp_index, expr, ctx, out, error);
1052-
if (!pubkey) return nullptr;
1055+
if (!pubkey) {
1056+
error = strprintf("pkh(): %s", error);
1057+
return nullptr;
1058+
}
10531059
++key_exp_index;
10541060
return std::make_unique<PKHDescriptor>(std::move(pubkey));
10551061
} else if (Func("pkh", expr)) {
@@ -1058,7 +1064,10 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
10581064
}
10591065
if (ctx == ParseScriptContext::TOP && Func("combo", expr)) {
10601066
auto pubkey = ParsePubkey(key_exp_index, expr, ctx, out, error);
1061-
if (!pubkey) return nullptr;
1067+
if (!pubkey) {
1068+
error = strprintf("combo(): %s", error);
1069+
return nullptr;
1070+
}
10621071
++key_exp_index;
10631072
return std::make_unique<ComboDescriptor>(std::move(pubkey));
10641073
} else if (Func("combo", expr)) {
@@ -1081,7 +1090,10 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
10811090
}
10821091
auto arg = Expr(expr);
10831092
auto pk = ParsePubkey(key_exp_index, arg, ctx, out, error);
1084-
if (!pk) return nullptr;
1093+
if (!pk) {
1094+
error = strprintf("Multi: %s", error);
1095+
return nullptr;
1096+
}
10851097
script_size += pk->GetSize() + 1;
10861098
providers.emplace_back(std::move(pk));
10871099
key_exp_index++;
@@ -1116,7 +1128,10 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
11161128
}
11171129
if ((ctx == ParseScriptContext::TOP || ctx == ParseScriptContext::P2SH) && Func("wpkh", expr)) {
11181130
auto pubkey = ParsePubkey(key_exp_index, expr, ParseScriptContext::P2WPKH, out, error);
1119-
if (!pubkey) return nullptr;
1131+
if (!pubkey) {
1132+
error = strprintf("wpkh(): %s", error);
1133+
return nullptr;
1134+
}
11201135
key_exp_index++;
11211136
return std::make_unique<WPKHDescriptor>(std::move(pubkey));
11221137
} else if (Func("wpkh", expr)) {
@@ -1153,7 +1168,10 @@ std::unique_ptr<DescriptorImpl> ParseScript(uint32_t& key_exp_index, Span<const
11531168
if (ctx == ParseScriptContext::TOP && Func("tr", expr)) {
11541169
auto arg = Expr(expr);
11551170
auto internal_key = ParsePubkey(key_exp_index, arg, ParseScriptContext::P2TR, out, error);
1156-
if (!internal_key) return nullptr;
1171+
if (!internal_key) {
1172+
error = strprintf("tr(): %s", error);
1173+
return nullptr;
1174+
}
11571175
++key_exp_index;
11581176
std::vector<std::unique_ptr<DescriptorImpl>> subscripts; //!< list of script subexpressions
11591177
std::vector<int> depths; //!< depth in the tree of each subexpression (same length subscripts)

0 commit comments

Comments
 (0)