diff --git a/src/script/descriptor.cpp b/src/script/descriptor.cpp index b8ade1684a..787bf43127 100644 --- a/src/script/descriptor.cpp +++ b/src/script/descriptor.cpp @@ -1541,14 +1541,14 @@ std::unique_ptr ParseScript(uint32_t& key_exp_index, SpanIsSane()) { + if (!node->IsSane() || node->IsNotSatisfiable()) { // Try to find the first insane sub for better error reporting. auto insane_node = node.get(); if (const auto sub = node->FindInsaneSub()) insane_node = sub; if (const auto str = insane_node->ToString(parser)) error = *str; if (!insane_node->IsValid()) { error += " is invalid"; - } else { + } else if (!node->IsSane()) { error += " is not sane"; if (!insane_node->IsNonMalleable()) { error += ": malleable witnesses exist"; @@ -1561,6 +1561,8 @@ std::unique_ptr ParseScript(uint32_t& key_exp_index, SpanValidSatisfactions()) { error += ": needs witnesses that may exceed resource limits"; } + } else { + error += " is not satisfiable"; } return nullptr; } diff --git a/src/script/miniscript.h b/src/script/miniscript.h index 919e2b9f64..b58740a125 100644 --- a/src/script/miniscript.h +++ b/src/script/miniscript.h @@ -1161,6 +1161,9 @@ public: return true; } + //! Whether no satisfaction exists for this node. + bool IsNotSatisfiable() const { return !GetStackSize(); } + //! Return the expression type. Type GetType() const { return typ; }