13 typedef std::vector<unsigned char>
valtype;
45 return sigversion == IsMineSigVersion::TOP || sigversion == IsMineSigVersion::P2SH;
48 bool HaveKeys(
const std::vector<valtype>& pubkeys,
const CWallet& keystore)
50 for (
const valtype& pubkey : pubkeys) {
52 if (!keystore.
HaveKey(keyID))
return false;
61 std::vector<valtype> vSolutions;
73 if (!PermitsUncompressed(sigversion) && vSolutions[0].size() != 33) {
74 return IsMineResult::INVALID;
77 ret = std::max(ret, IsMineResult::SPENDABLE);
82 if (sigversion == IsMineSigVersion::WITNESS_V0) {
84 return IsMineResult::INVALID;
97 if (!PermitsUncompressed(sigversion)) {
100 return IsMineResult::INVALID;
104 ret = std::max(ret, IsMineResult::SPENDABLE);
109 if (sigversion != IsMineSigVersion::TOP) {
111 return IsMineResult::INVALID;
115 if (keystore.
GetCScript(scriptID, subscript)) {
116 ret = std::max(ret, IsMineInner(keystore, subscript, IsMineSigVersion::P2SH));
122 if (sigversion == IsMineSigVersion::WITNESS_V0) {
124 return IsMineResult::INVALID;
133 if (keystore.
GetCScript(scriptID, subscript)) {
134 ret = std::max(ret, IsMineInner(keystore, subscript, IsMineSigVersion::WITNESS_V0));
142 if (sigversion == IsMineSigVersion::TOP) {
151 std::vector<valtype> keys(vSolutions.begin()+1, vSolutions.begin()+vSolutions.size()-1);
152 if (!PermitsUncompressed(sigversion)) {
153 for (
size_t i = 0; i < keys.size(); i++) {
154 if (keys[i].size() != 33) {
155 return IsMineResult::INVALID;
159 if (HaveKeys(keys, keystore)) {
160 ret = std::max(ret, IsMineResult::SPENDABLE);
166 if (ret == IsMineResult::NO && keystore.
HaveWatchOnly(scriptPubKey)) {
167 ret = std::max(ret, IsMineResult::WATCH_ONLY);
176 switch (IsMineInner(keystore, scriptPubKey, IsMineSigVersion::TOP)) {
177 case IsMineResult::INVALID:
178 case IsMineResult::NO:
180 case IsMineResult::WATCH_ONLY:
182 case IsMineResult::SPENDABLE:
191 return IsMine(keystore, script);
unspendable OP_RETURN script that carries data
virtual bool GetCScript(const CScriptID &hash, CScript &redeemScriptOut) const override
IsMineSigVersion
This is an enum that tracks the execution context of a script, similar to SigVersion in script/interp...
std::vector< unsigned char > valtype
txnouttype Solver(const CScript &scriptPubKey, std::vector< std::vector< unsigned char >> &vSolutionsRet)
Parse a scriptPubKey and identify script type for standard scripts.
IsMineResult
This is an internal representation of isminetype + invalidity.
bool HaveWatchOnly(const CScript &dest) const
Returns whether the watch-only script is in the wallet.
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
Only for Witness versions not already defined above.
An encapsulated public key.
bool HaveKey(const CKeyID &address) const override
isminetype
IsMine() return codes.
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
CRIPEMD160 & Write(const unsigned char *data, size_t len)
isminetype IsMine(const CWallet &keystore, const CScript &scriptPubKey)
Serialized script, used inside transaction inputs and outputs.
A reference to a CKey: the Hash160 of its serialized public key.
A CWallet is an extension of a keystore, which also maintains a set of transactions and balances...
virtual bool HaveCScript(const CScriptID &hash) const override
std::vector< unsigned char > valtype
A reference to a CScript: the Hash160 of its serialization (see script.h)
bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const override
void Finalize(unsigned char hash[OUTPUT_SIZE])
boost::variant< CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessUnknown > CTxDestination
A txout script template with a specific destination.
A hasher class for RIPEMD-160.
bool IsCompressed() const
Check whether this is a compressed public key.