| 127 | } |
| 128 | |
| 129 | static bool CreateSig(const BaseSignatureCreator& creator, SignatureData& sigdata, const SigningProvider& provider, std::vector<unsigned char>& sig_out, const CPubKey& pubkey, const CScript& scriptcode, SigVersion sigversion, unsigned int flags) |
| 130 | { |
| 131 | CKeyID keyid = pubkey.GetID(); |
| 132 | const auto it = sigdata.signatures.find(keyid); |
| 133 | if (it != sigdata.signatures.end()) { |
| 134 | sig_out = it->second.second; |
| 135 | return true; |
| 136 | } |
| 137 | KeyOriginInfo info; |
| 138 | if (provider.GetKeyOrigin(keyid, info)) { |
| 139 | sigdata.misc_pubkeys.emplace(keyid, std::make_pair(pubkey, std::move(info))); |
| 140 | } |
| 141 | if (creator.CreateSig(provider, sig_out, keyid, scriptcode, sigversion, flags)) { |
| 142 | auto i = sigdata.signatures.emplace(keyid, SigPair(pubkey, sig_out)); |
| 143 | assert(i.second); |
| 144 | return true; |
| 145 | } |
| 146 | // Could not make signature or signature not found, add keyid to missing |
| 147 | sigdata.missing_sigs.push_back(keyid); |
| 148 | return false; |
| 149 | } |
| 150 | |
| 151 | static bool CreateTaprootScriptSig(const BaseSignatureCreator& creator, SignatureData& sigdata, const SigningProvider& provider, std::vector<unsigned char>& sig_out, const XOnlyPubKey& pubkey, const uint256& leaf_hash, SigVersion sigversion) |
| 152 | { |