Compute all challenges (pubkeys, hashes, timelocks) that occur in a given Miniscript. */
| 296 | |
| 297 | /** Compute all challenges (pubkeys, hashes, timelocks) that occur in a given Miniscript. */ |
| 298 | std::set<Challenge> FindChallenges(const Node& root) |
| 299 | { |
| 300 | std::set<Challenge> chal; |
| 301 | |
| 302 | for (std::vector stack{&root}; !stack.empty();) { |
| 303 | const auto* ref{stack.back()}; |
| 304 | stack.pop_back(); |
| 305 | |
| 306 | for (const auto& key : ref->Keys()) { |
| 307 | chal.emplace(ChallengeType::PK, ChallengeNumber(key)); |
| 308 | } |
| 309 | switch (ref->Fragment()) { |
| 310 | case Fragment::OLDER: chal.emplace(ChallengeType::OLDER, ref->K()); break; |
| 311 | case Fragment::AFTER: chal.emplace(ChallengeType::AFTER, ref->K()); break; |
| 312 | case Fragment::SHA256: chal.emplace(ChallengeType::SHA256, ChallengeNumber(ref->Data())); break; |
| 313 | case Fragment::RIPEMD160: chal.emplace(ChallengeType::RIPEMD160, ChallengeNumber(ref->Data())); break; |
| 314 | case Fragment::HASH256: chal.emplace(ChallengeType::HASH256, ChallengeNumber(ref->Data())); break; |
| 315 | case Fragment::HASH160: chal.emplace(ChallengeType::HASH160, ChallengeNumber(ref->Data())); break; |
| 316 | default: break; |
| 317 | } |
| 318 | for (const auto& sub : ref->Subs()) { |
| 319 | stack.push_back(&sub); |
| 320 | } |
| 321 | } |
| 322 | return chal; |
| 323 | } |
| 324 | |
| 325 | //! The spk for this script under the given context. If it's a Taproot output also record the spend data. |
| 326 | CScript ScriptPubKey(miniscript::MiniscriptContext ctx, const CScript& script, TaprootBuilder& builder) |
no test coverage detected