|
|
|
@ -2086,6 +2086,39 @@ void CWallet::ListLockedCoins(std::vector<COutPoint>& vOutpts)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CAffectedKeysVisitor : public boost::static_visitor<void> {
|
|
|
|
|
private:
|
|
|
|
|
const CKeyStore &keystore;
|
|
|
|
|
std::vector<CKeyID> &vKeys;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
CAffectedKeysVisitor(const CKeyStore &keystoreIn, std::vector<CKeyID> &vKeysIn) : keystore(keystoreIn), vKeys(vKeysIn) {}
|
|
|
|
|
|
|
|
|
|
void Process(const CScript &script) {
|
|
|
|
|
txnouttype type;
|
|
|
|
|
std::vector<CTxDestination> vDest;
|
|
|
|
|
int nRequired;
|
|
|
|
|
if (ExtractDestinations(script, type, vDest, nRequired)) {
|
|
|
|
|
BOOST_FOREACH(const CTxDestination &dest, vDest)
|
|
|
|
|
boost::apply_visitor(*this, dest);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void operator()(const CKeyID &keyId) {
|
|
|
|
|
if (keystore.HaveKey(keyId))
|
|
|
|
|
vKeys.push_back(keyId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void operator()(const CScriptID &scriptId) {
|
|
|
|
|
CScript script;
|
|
|
|
|
if (keystore.GetCScript(scriptId, script))
|
|
|
|
|
Process(script);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void operator()(const CNoDestination &none) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void CWallet::GetKeyBirthTimes(std::map<CKeyID, int64_t> &mapKeyBirth) const {
|
|
|
|
|
AssertLockHeld(cs_wallet); // mapKeyMetadata
|
|
|
|
|
mapKeyBirth.clear();
|
|
|
|
@ -2121,7 +2154,7 @@ void CWallet::GetKeyBirthTimes(std::map<CKeyID, int64_t> &mapKeyBirth) const {
|
|
|
|
|
int nHeight = blit->second->nHeight;
|
|
|
|
|
BOOST_FOREACH(const CTxOut &txout, wtx.vout) {
|
|
|
|
|
// iterate over all their outputs
|
|
|
|
|
::ExtractAffectedKeys(*this, txout.scriptPubKey, vAffected);
|
|
|
|
|
CAffectedKeysVisitor(*this, vAffected).Process(txout.scriptPubKey);
|
|
|
|
|
BOOST_FOREACH(const CKeyID &keyid, vAffected) {
|
|
|
|
|
// ... and all their affected keys
|
|
|
|
|
std::map<CKeyID, CBlockIndex*>::iterator rit = mapKeyFirstBlock.find(keyid);
|
|
|
|
|