X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fwallet.h;h=26c49ea617d31df926ca6205739dc864bbec19e5;hb=9167b228998e353585d2d5e45826d57dfddf534e;hp=cb07d3959324bd4cf4ed844f82081c531dfb4f94;hpb=b0368da0e15b5506548da3462e14b038ca21ae69;p=novacoin.git diff --git a/src/wallet.h b/src/wallet.h index cb07d39..26c49ea 100644 --- a/src/wallet.h +++ b/src/wallet.h @@ -33,7 +33,6 @@ enum WalletFeature FEATURE_WALLETCRYPT = 40000, // wallet encryption FEATURE_COMPRPUBKEY = 60000, // compressed public keys - FEATURE_LATEST = 60000 }; @@ -150,9 +149,9 @@ public: bool LoadCScript(const CScript& redeemScript) { return CCryptoKeyStore::AddCScript(redeemScript); } // Adds a watch-only address to the store, and saves it to disk. - bool AddWatchOnly(const CTxDestination &dest); + bool AddWatchOnly(const CScript &dest); // Adds a watch-only address to the store, without saving it to disk (used by LoadWallet) - bool LoadWatchOnly(const CTxDestination &dest); + bool LoadWatchOnly(const CScript &dest); bool Unlock(const SecureString& strWalletPassphrase); bool ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase); @@ -185,11 +184,15 @@ public: void ReacceptWalletTransactions(); void ResendWalletTransactions(); int64 GetBalance() const; - void GetBalance(int64 &nTotal, int64 &nWatchOnly) const; + int64 GetWatchOnlyBalance() const; int64 GetUnconfirmedBalance() const; + int64 GetUnconfirmedWatchOnlyBalance() const; int64 GetImmatureBalance() const; + int64 GetImmatureWatchOnlyBalance() const; int64 GetStake() const; int64 GetNewMint() const; + int64 GetWatchOnlyStake() const; + int64 GetWatchOnlyNewMint() const; bool CreateTransaction(const std::vector >& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet, const CCoinControl *coinControl=NULL); bool CreateTransaction(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet, const CCoinControl *coinControl=NULL); bool CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey); @@ -197,6 +200,7 @@ public: bool GetStakeWeight(const CKeyStore& keystore, uint64& nMinWeight, uint64& nMaxWeight, uint64& nWeight); void GetStakeWeightFromValue(const int64& nTime, const int64& nValue, uint64& nWeight); bool CreateCoinStake(const CKeyStore& keystore, unsigned int nBits, int64 nSearchInterval, CTransaction& txNew, CKey& key); + bool MergeCoins(const int64& nAmount, const int64& nMaxValue, const int64& nOutputValue, list& listMerged); std::string SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, bool fAskFee=false); std::string SendMoneyToDestination(const CTxDestination &address, int64 nValue, CWalletTx& wtxNew, bool fAskFee=false); @@ -215,19 +219,16 @@ public: std::map GetAddressBalances(); isminetype IsMine(const CTxIn& txin) const; - int64 GetDebit(const CTxIn& txin) const; + int64 GetDebit(const CTxIn& txin, const isminefilter& filter) const; isminetype IsMine(const CTxOut& txout) const { return ::IsMine(*this, txout.scriptPubKey); } - int64 GetCredit(const CTxOut& txout, bool fWatchOnly=false) const + int64 GetCredit(const CTxOut& txout, const isminefilter& filter) const { if (!MoneyRange(txout.nValue)) throw std::runtime_error("CWallet::GetCredit() : value out of range"); - isminetype ismine = IsMine(txout); - if (fWatchOnly && ismine != MINE_WATCH_ONLY) - return 0; - return (ismine != MINE_NO ? txout.nValue : 0); + return (IsMine(txout) & filter ? txout.nValue : 0); } bool IsChange(const CTxOut& txout) const; int64 GetChange(const CTxOut& txout) const @@ -245,27 +246,25 @@ public: } bool IsFromMe(const CTransaction& tx) const { - return (GetDebit(tx) > 0); + return (GetDebit(tx, MINE_ALL) > 0); } - int64 GetDebit(const CTransaction& tx) const + int64 GetDebit(const CTransaction& tx, const isminefilter& filter) const { int64 nDebit = 0; BOOST_FOREACH(const CTxIn& txin, tx.vin) { - nDebit += GetDebit(txin); + nDebit += GetDebit(txin, filter); if (!MoneyRange(nDebit)) throw std::runtime_error("CWallet::GetDebit() : value out of range"); } return nDebit; } - int64 GetCredit(const CTransaction& tx, bool fWatchOnly=true) const + int64 GetCredit(const CTransaction& tx, const isminefilter& filter) const { int64 nCredit = 0; BOOST_FOREACH(const CTxOut& txout, tx.vout) { - if (!fWatchOnly || (fWatchOnly && IsMine(txout) == MINE_WATCH_ONLY)) - nCredit += GetCredit(txout); - + nCredit += GetCredit(txout, filter); if (!MoneyRange(nCredit)) throw std::runtime_error("CWallet::GetCredit() : value out of range"); } @@ -406,16 +405,22 @@ public: // memory only mutable bool fDebitCached; + mutable bool fWatchDebitCached; mutable bool fCreditCached; - mutable bool fWatchOnlyCreditCached; + mutable bool fWatchCreditCached; mutable bool fAvailableCreditCached; - mutable bool fAvailableWatchOnlyCreditCached; + mutable bool fImmatureCreditCached; + mutable bool fImmatureWatchCreditCached; + mutable bool fAvailableWatchCreditCached; mutable bool fChangeCached; mutable int64 nDebitCached; + mutable int64 nWatchDebitCached; mutable int64 nCreditCached; - mutable int64 nWatchOnlyCreditCached; + mutable int64 nWatchCreditCached; mutable int64 nAvailableCreditCached; - mutable int64 nAvailableWatchOnlyCreditCached; + mutable int64 nImmatureCreditCached; + mutable int64 nImmatureWatchCreditCached; + mutable int64 nAvailableWatchCreditCached; mutable int64 nChangeCached; CWalletTx() @@ -451,16 +456,18 @@ public: strFromAccount.clear(); vfSpent.clear(); fDebitCached = false; + fWatchDebitCached = false; fCreditCached = false; - fWatchOnlyCreditCached = false; + fWatchCreditCached = false; fAvailableCreditCached = false; - fAvailableWatchOnlyCreditCached = false; + fAvailableWatchCreditCached = false; fChangeCached = false; nDebitCached = 0; + nWatchDebitCached = 0; nCreditCached = 0; - nWatchOnlyCreditCached = 0; + nWatchCreditCached = 0; nAvailableCreditCached = 0; - nAvailableWatchOnlyCreditCached = 0; + nAvailableWatchCreditCached = 0; nChangeCached = 0; nOrderPos = -1; } @@ -536,7 +543,7 @@ public: { vfSpent[i] = true; fReturn = true; - fAvailableCreditCached = fAvailableWatchOnlyCreditCached = false; + fAvailableCreditCached = fAvailableWatchCreditCached = false; } } return fReturn; @@ -546,8 +553,8 @@ public: void MarkDirty() { fCreditCached = false; - fAvailableCreditCached = fAvailableWatchOnlyCreditCached = false; - fDebitCached = false; + fAvailableCreditCached = fAvailableWatchCreditCached = false; + fDebitCached = fWatchDebitCached = false; fChangeCached = false; } @@ -565,7 +572,7 @@ public: if (!vfSpent[nOut]) { vfSpent[nOut] = true; - fAvailableCreditCached = fAvailableWatchOnlyCreditCached = false; + fAvailableCreditCached = fAvailableWatchCreditCached = false; } } @@ -577,7 +584,7 @@ public: if (vfSpent[nOut]) { vfSpent[nOut] = false; - fAvailableCreditCached = fAvailableWatchOnlyCreditCached = false; + fAvailableCreditCached = fAvailableWatchCreditCached = false; } } @@ -590,18 +597,39 @@ public: return (!!vfSpent[nOut]); } - int64 GetDebit() const + int64 GetDebit(const isminefilter& filter) const { if (vin.empty()) return 0; - if (fDebitCached) - return nDebitCached; - nDebitCached = pwallet->GetDebit(*this); - fDebitCached = true; - return nDebitCached; + + int64 nDebit = 0; + if (filter & MINE_SPENDABLE) + { + if (fDebitCached) + nDebit += nDebitCached; + else + { + nDebitCached = pwallet->GetDebit(*this, MINE_SPENDABLE); + fDebitCached = true; + nDebit += nDebitCached; + } + } + if (filter & MINE_WATCH_ONLY) + { + if (fWatchDebitCached) + nDebit += nWatchDebitCached; + else + { + nWatchDebitCached = pwallet->GetDebit(*this, MINE_WATCH_ONLY); + fWatchDebitCached = true; + nDebit += nWatchDebitCached; + } + } + + return nDebit; } - int64 GetCredit(bool fWatchOnly, bool fUseCache=true) const + int64 GetCredit(bool fUseCache=true) const { // Must wait until coinbase is safely deep enough in the chain before valuing it if ((IsCoinBase() || IsCoinStake()) && GetBlocksToMaturity() > 0) @@ -609,35 +637,52 @@ public: // GetBalance can assume transactions in mapWallet won't change if (fUseCache) { - if (fWatchOnly && fCreditCached) - return nWatchOnlyCreditCached; if (fCreditCached) return nCreditCached; } - if (fWatchOnly) { - nWatchOnlyCreditCached = pwallet->GetCredit(*this, true); - fWatchOnlyCreditCached = true; + nCreditCached = pwallet->GetCredit(*this, MINE_ALL); + fCreditCached = true; + + return nCreditCached; + } - return nWatchOnlyCreditCached; + int64 GetImmatureCredit(bool fUseCache=true) const + { + if (IsCoinBase() && GetBlocksToMaturity() > 0 && IsInMainChain()) + { + if (fUseCache && fImmatureCreditCached) + return nImmatureCreditCached; + nImmatureCreditCached = pwallet->GetCredit(*this, MINE_SPENDABLE); + fImmatureCreditCached = true; + return nImmatureCreditCached; } - nCreditCached = pwallet->GetCredit(*this); - fCreditCached = true; + return 0; + } - return nCreditCached; + int64 GetImmatureWatchOnlyCredit(bool fUseCache=true) const + { + if (IsCoinBase() && GetBlocksToMaturity() > 0 && IsInMainChain()) + { + if (fUseCache && fImmatureWatchCreditCached) + return nImmatureWatchCreditCached; + nImmatureWatchCreditCached = pwallet->GetCredit(*this, MINE_WATCH_ONLY); + fImmatureWatchCreditCached = true; + return nImmatureWatchCreditCached; + } + + return 0; } - int64 GetAvailableCredit(bool fWatchOnly, bool fUseCache=true) const + + int64 GetAvailableCredit(bool fUseCache=true) const { // Must wait until coinbase is safely deep enough in the chain before valuing it if ((IsCoinBase() || IsCoinStake()) && GetBlocksToMaturity() > 0) return 0; if (fUseCache) { - if (fWatchOnly && fAvailableWatchOnlyCreditCached) - return nAvailableWatchOnlyCreditCached; - if (fAvailableCreditCached) return nAvailableCreditCached; } @@ -648,22 +693,46 @@ public: if (!IsSpent(i)) { const CTxOut &txout = vout[i]; - nCredit += pwallet->GetCredit(txout, fWatchOnly); + nCredit += pwallet->GetCredit(txout, MINE_SPENDABLE); if (!MoneyRange(nCredit)) throw std::runtime_error("CWalletTx::GetAvailableCredit() : value out of range"); } } - if (fWatchOnly) { - nAvailableWatchOnlyCreditCached = nCredit; - fAvailableWatchOnlyCreditCached = true; - } else { - nAvailableCreditCached = nCredit; - fAvailableCreditCached = true; - } + nAvailableCreditCached = nCredit; + fAvailableCreditCached = true; + return nCredit; } + int64 GetAvailableWatchCredit(bool fUseCache=true) const + { + // Must wait until coinbase is safely deep enough in the chain before valuing it + if ((IsCoinBase() || IsCoinStake()) && GetBlocksToMaturity() > 0) + return 0; + + if (fUseCache) { + if (fAvailableWatchCreditCached) + return nAvailableWatchCreditCached; + } + + int64 nCredit = 0; + for (unsigned int i = 0; i < vout.size(); i++) + { + if (!IsSpent(i)) + { + const CTxOut &txout = vout[i]; + nCredit += pwallet->GetCredit(txout, MINE_WATCH_ONLY); + if (!MoneyRange(nCredit)) + throw std::runtime_error("CWalletTx::GetAvailableCredit() : value out of range"); + } + } + + nAvailableWatchCreditCached = nCredit; + fAvailableWatchCreditCached = true; + + return nCredit; + } int64 GetChange() const { @@ -675,14 +744,14 @@ public: } void GetAmounts(int64& nGeneratedImmature, int64& nGeneratedMature, std::list >& listReceived, - std::list >& listSent, int64& nFee, std::string& strSentAccount) const; + std::list >& listSent, int64& nFee, std::string& strSentAccount, const isminefilter& filter) const; void GetAccountAmounts(const std::string& strAccount, int64& nGenerated, int64& nReceived, - int64& nSent, int64& nFee) const; + int64& nSent, int64& nFee, const isminefilter& filter) const; - bool IsFromMe() const + bool IsFromMe(const isminefilter& filter) const { - return (GetDebit() > 0); + return (GetDebit(filter) > 0); } bool IsTrusted() const @@ -692,7 +761,7 @@ public: return false; if (GetDepthInMainChain() >= 1) return true; - if (fConfChange || !IsFromMe()) // using wtx's cached debit + if (fConfChange || !IsFromMe(MINE_ALL)) // using wtx's cached debit return false; // If no confirmations but it's from us, we can still