Changeset View
Changeset View
Standalone View
Standalone View
src/script/ismine.cpp
Show All 29 Lines | |||||
* This is an internal representation of isminetype + invalidity. | * This is an internal representation of isminetype + invalidity. | ||||
* Its order is significant, as we return the max of all explored | * Its order is significant, as we return the max of all explored | ||||
* possibilities. | * possibilities. | ||||
*/ | */ | ||||
enum class IsMineResult { | enum class IsMineResult { | ||||
NO = 0, //! Not ours | NO = 0, //! Not ours | ||||
WATCH_ONLY = 1, //! Included in watch-only balance | WATCH_ONLY = 1, //! Included in watch-only balance | ||||
SPENDABLE = 2, //! Included in all balances | SPENDABLE = 2, //! Included in all balances | ||||
INVALID = 3, //! Not spendable by anyone | INVALID = 3, //! Not spendable by anyone (P2SH inside P2SH) | ||||
}; | }; | ||||
bool HaveKeys(const std::vector<valtype> &pubkeys, const CKeyStore &keystore) { | bool HaveKeys(const std::vector<valtype> &pubkeys, const CKeyStore &keystore) { | ||||
for (const valtype &pubkey : pubkeys) { | for (const valtype &pubkey : pubkeys) { | ||||
CKeyID keyID = CPubKey(pubkey).GetID(); | CKeyID keyID = CPubKey(pubkey).GetID(); | ||||
if (!keystore.HaveKey(keyID)) { | if (!keystore.HaveKey(keyID)) { | ||||
return false; | return false; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | IsMineResult IsMineInner(const CKeyStore &keystore, const CScript &scriptPubKey, | ||||
if (ret == IsMineResult::NO && keystore.HaveWatchOnly(scriptPubKey)) { | if (ret == IsMineResult::NO && keystore.HaveWatchOnly(scriptPubKey)) { | ||||
ret = std::max(ret, IsMineResult::WATCH_ONLY); | ret = std::max(ret, IsMineResult::WATCH_ONLY); | ||||
} | } | ||||
return ret; | return ret; | ||||
} | } | ||||
} // namespace | } // namespace | ||||
isminetype IsMine(const CKeyStore &keystore, const CScript &scriptPubKey, | isminetype IsMine(const CKeyStore &keystore, const CScript &scriptPubKey) { | ||||
bool &isInvalid) { | |||||
isInvalid = false; | |||||
switch (IsMineInner(keystore, scriptPubKey, IsMineSigVersion::TOP)) { | switch (IsMineInner(keystore, scriptPubKey, IsMineSigVersion::TOP)) { | ||||
case IsMineResult::INVALID: | case IsMineResult::INVALID: | ||||
isInvalid = true; | |||||
case IsMineResult::NO: | case IsMineResult::NO: | ||||
return ISMINE_NO; | return ISMINE_NO; | ||||
case IsMineResult::WATCH_ONLY: | case IsMineResult::WATCH_ONLY: | ||||
return ISMINE_WATCH_ONLY; | return ISMINE_WATCH_ONLY; | ||||
case IsMineResult::SPENDABLE: | case IsMineResult::SPENDABLE: | ||||
return ISMINE_SPENDABLE; | return ISMINE_SPENDABLE; | ||||
} | } | ||||
assert(false); | assert(false); | ||||
} | } | ||||
isminetype IsMine(const CKeyStore &keystore, const CScript &scriptPubKey) { | |||||
bool isInvalid = false; | |||||
return IsMine(keystore, scriptPubKey, isInvalid); | |||||
} | |||||
isminetype IsMine(const CKeyStore &keystore, const CTxDestination &dest) { | isminetype IsMine(const CKeyStore &keystore, const CTxDestination &dest) { | ||||
CScript script = GetScriptForDestination(dest); | CScript script = GetScriptForDestination(dest); | ||||
return IsMine(keystore, script); | return IsMine(keystore, script); | ||||
} | } |