Changeset View
Changeset View
Standalone View
Standalone View
src/wallet/scriptpubkeyman.cpp
Show First 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
IsMineResult IsMineInner(const LegacyScriptPubKeyMan &keystore, | IsMineResult IsMineInner(const LegacyScriptPubKeyMan &keystore, | ||||
const CScript &scriptPubKey, | const CScript &scriptPubKey, | ||||
IsMineSigVersion sigversion) { | IsMineSigVersion sigversion) { | ||||
IsMineResult ret = IsMineResult::NO; | IsMineResult ret = IsMineResult::NO; | ||||
std::vector<valtype> vSolutions; | std::vector<valtype> vSolutions; | ||||
txnouttype whichType = Solver(scriptPubKey, vSolutions); | TxoutType whichType = Solver(scriptPubKey, vSolutions); | ||||
CKeyID keyID; | CKeyID keyID; | ||||
switch (whichType) { | switch (whichType) { | ||||
case TX_NONSTANDARD: | case TxoutType::NONSTANDARD: | ||||
case TX_NULL_DATA: | case TxoutType::NULL_DATA: | ||||
break; | break; | ||||
case TX_PUBKEY: | case TxoutType::PUBKEY: | ||||
keyID = CPubKey(vSolutions[0]).GetID(); | keyID = CPubKey(vSolutions[0]).GetID(); | ||||
if (keystore.HaveKey(keyID)) { | if (keystore.HaveKey(keyID)) { | ||||
ret = std::max(ret, IsMineResult::SPENDABLE); | ret = std::max(ret, IsMineResult::SPENDABLE); | ||||
} | } | ||||
break; | break; | ||||
case TX_PUBKEYHASH: | case TxoutType::PUBKEYHASH: | ||||
keyID = CKeyID(uint160(vSolutions[0])); | keyID = CKeyID(uint160(vSolutions[0])); | ||||
if (keystore.HaveKey(keyID)) { | if (keystore.HaveKey(keyID)) { | ||||
ret = std::max(ret, IsMineResult::SPENDABLE); | ret = std::max(ret, IsMineResult::SPENDABLE); | ||||
} | } | ||||
break; | break; | ||||
case TX_SCRIPTHASH: { | case TxoutType::SCRIPTHASH: { | ||||
if (sigversion != IsMineSigVersion::TOP) { | if (sigversion != IsMineSigVersion::TOP) { | ||||
// P2SH inside P2SH is invalid. | // P2SH inside P2SH is invalid. | ||||
return IsMineResult::INVALID; | return IsMineResult::INVALID; | ||||
} | } | ||||
CScriptID scriptID = CScriptID(uint160(vSolutions[0])); | CScriptID scriptID = CScriptID(uint160(vSolutions[0])); | ||||
CScript subscript; | CScript subscript; | ||||
if (keystore.GetCScript(scriptID, subscript)) { | if (keystore.GetCScript(scriptID, subscript)) { | ||||
ret = std::max(ret, IsMineInner(keystore, subscript, | ret = std::max(ret, IsMineInner(keystore, subscript, | ||||
IsMineSigVersion::P2SH)); | IsMineSigVersion::P2SH)); | ||||
} | } | ||||
break; | break; | ||||
} | } | ||||
case TX_MULTISIG: { | case TxoutType::MULTISIG: { | ||||
// Never treat bare multisig outputs as ours (they can still be made | // Never treat bare multisig outputs as ours (they can still be made | ||||
// watchonly-though) | // watchonly-though) | ||||
if (sigversion == IsMineSigVersion::TOP) { | if (sigversion == IsMineSigVersion::TOP) { | ||||
break; | break; | ||||
} | } | ||||
// Only consider transactions "mine" if we own ALL the keys | // Only consider transactions "mine" if we own ALL the keys | ||||
// involved. Multi-signature transactions that are partially owned | // involved. Multi-signature transactions that are partially owned | ||||
▲ Show 20 Lines • Show All 599 Lines • ▼ Show 20 Lines | |||||
bool LegacyScriptPubKeyMan::HaveWatchOnly() const { | bool LegacyScriptPubKeyMan::HaveWatchOnly() const { | ||||
LOCK(cs_KeyStore); | LOCK(cs_KeyStore); | ||||
return (!setWatchOnly.empty()); | return (!setWatchOnly.empty()); | ||||
} | } | ||||
static bool ExtractPubKey(const CScript &dest, CPubKey &pubKeyOut) { | static bool ExtractPubKey(const CScript &dest, CPubKey &pubKeyOut) { | ||||
std::vector<std::vector<uint8_t>> solutions; | std::vector<std::vector<uint8_t>> solutions; | ||||
return Solver(dest, solutions) == TX_PUBKEY && | return Solver(dest, solutions) == TxoutType::PUBKEY && | ||||
(pubKeyOut = CPubKey(solutions[0])).IsFullyValid(); | (pubKeyOut = CPubKey(solutions[0])).IsFullyValid(); | ||||
} | } | ||||
bool LegacyScriptPubKeyMan::RemoveWatchOnly(const CScript &dest) { | bool LegacyScriptPubKeyMan::RemoveWatchOnly(const CScript &dest) { | ||||
{ | { | ||||
LOCK(cs_KeyStore); | LOCK(cs_KeyStore); | ||||
setWatchOnly.erase(dest); | setWatchOnly.erase(dest); | ||||
CPubKey pubKey; | CPubKey pubKey; | ||||
▲ Show 20 Lines • Show All 1,522 Lines • Show Last 20 Lines |