X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fwallet.h;h=cb07d3959324bd4cf4ed844f82081c531dfb4f94;hb=b0368da0e15b5506548da3462e14b038ca21ae69;hp=a78dcee5285d9333a0092bc7895548c57056c61d;hpb=cf882ecd08d63682370e8e928a63ed51b9aa6734;p=novacoin.git diff --git a/src/wallet.h b/src/wallet.h index a78dcee..cb07d39 100644 --- a/src/wallet.h +++ b/src/wallet.h @@ -149,6 +149,11 @@ public: bool AddCScript(const CScript& redeemScript); 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); + // Adds a watch-only address to the store, without saving it to disk (used by LoadWallet) + bool LoadWatchOnly(const CTxDestination &dest); + bool Unlock(const SecureString& strWalletPassphrase); bool ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase); bool EncryptWallet(const SecureString& strWalletPassphrase); @@ -180,6 +185,7 @@ public: void ReacceptWalletTransactions(); void ResendWalletTransactions(); int64 GetBalance() const; + void GetBalance(int64 &nTotal, int64 &nWatchOnly) const; int64 GetUnconfirmedBalance() const; int64 GetImmatureBalance() const; int64 GetStake() const; @@ -189,6 +195,7 @@ public: bool CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey); 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); std::string SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, bool fAskFee=false); @@ -207,17 +214,20 @@ public: std::set< std::set > GetAddressGroupings(); std::map GetAddressBalances(); - bool IsMine(const CTxIn& txin) const; + isminetype IsMine(const CTxIn& txin) const; int64 GetDebit(const CTxIn& txin) const; - bool IsMine(const CTxOut& txout) const + isminetype IsMine(const CTxOut& txout) const { return ::IsMine(*this, txout.scriptPubKey); } - int64 GetCredit(const CTxOut& txout) const + int64 GetCredit(const CTxOut& txout, bool fWatchOnly=false) const { if (!MoneyRange(txout.nValue)) throw std::runtime_error("CWallet::GetCredit() : value out of range"); - return (IsMine(txout) ? txout.nValue : 0); + isminetype ismine = IsMine(txout); + if (fWatchOnly && ismine != MINE_WATCH_ONLY) + return 0; + return (ismine != MINE_NO ? txout.nValue : 0); } bool IsChange(const CTxOut& txout) const; int64 GetChange(const CTxOut& txout) const @@ -248,12 +258,14 @@ public: } return nDebit; } - int64 GetCredit(const CTransaction& tx) const + int64 GetCredit(const CTransaction& tx, bool fWatchOnly=true) const { int64 nCredit = 0; BOOST_FOREACH(const CTxOut& txout, tx.vout) { - nCredit += GetCredit(txout); + if (!fWatchOnly || (fWatchOnly && IsMine(txout) == MINE_WATCH_ONLY)) + nCredit += GetCredit(txout); + if (!MoneyRange(nCredit)) throw std::runtime_error("CWallet::GetCredit() : value out of range"); } @@ -395,11 +407,15 @@ public: // memory only mutable bool fDebitCached; mutable bool fCreditCached; + mutable bool fWatchOnlyCreditCached; mutable bool fAvailableCreditCached; + mutable bool fAvailableWatchOnlyCreditCached; mutable bool fChangeCached; mutable int64 nDebitCached; mutable int64 nCreditCached; + mutable int64 nWatchOnlyCreditCached; mutable int64 nAvailableCreditCached; + mutable int64 nAvailableWatchOnlyCreditCached; mutable int64 nChangeCached; CWalletTx() @@ -436,11 +452,15 @@ public: vfSpent.clear(); fDebitCached = false; fCreditCached = false; + fWatchOnlyCreditCached = false; fAvailableCreditCached = false; + fAvailableWatchOnlyCreditCached = false; fChangeCached = false; nDebitCached = 0; nCreditCached = 0; + nWatchOnlyCreditCached = 0; nAvailableCreditCached = 0; + nAvailableWatchOnlyCreditCached = 0; nChangeCached = 0; nOrderPos = -1; } @@ -516,7 +536,7 @@ public: { vfSpent[i] = true; fReturn = true; - fAvailableCreditCached = false; + fAvailableCreditCached = fAvailableWatchOnlyCreditCached = false; } } return fReturn; @@ -526,7 +546,7 @@ public: void MarkDirty() { fCreditCached = false; - fAvailableCreditCached = false; + fAvailableCreditCached = fAvailableWatchOnlyCreditCached = false; fDebitCached = false; fChangeCached = false; } @@ -545,7 +565,7 @@ public: if (!vfSpent[nOut]) { vfSpent[nOut] = true; - fAvailableCreditCached = false; + fAvailableCreditCached = fAvailableWatchOnlyCreditCached = false; } } @@ -557,7 +577,7 @@ public: if (vfSpent[nOut]) { vfSpent[nOut] = false; - fAvailableCreditCached = false; + fAvailableCreditCached = fAvailableWatchOnlyCreditCached = false; } } @@ -581,28 +601,46 @@ public: return nDebitCached; } - int64 GetCredit(bool fUseCache=true) const + int64 GetCredit(bool fWatchOnly, 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; // GetBalance can assume transactions in mapWallet won't change - if (fUseCache && fCreditCached) - return nCreditCached; + if (fUseCache) { + if (fWatchOnly && fCreditCached) + return nWatchOnlyCreditCached; + if (fCreditCached) + return nCreditCached; + } + + if (fWatchOnly) { + nWatchOnlyCreditCached = pwallet->GetCredit(*this, true); + fWatchOnlyCreditCached = true; + + return nWatchOnlyCreditCached; + } + nCreditCached = pwallet->GetCredit(*this); fCreditCached = true; + return nCreditCached; } - int64 GetAvailableCredit(bool fUseCache=true) const + int64 GetAvailableCredit(bool fWatchOnly, 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 && fAvailableCreditCached) - return nAvailableCreditCached; + if (fUseCache) { + if (fWatchOnly && fAvailableWatchOnlyCreditCached) + return nAvailableWatchOnlyCreditCached; + + if (fAvailableCreditCached) + return nAvailableCreditCached; + } int64 nCredit = 0; for (unsigned int i = 0; i < vout.size(); i++) @@ -610,14 +648,19 @@ public: if (!IsSpent(i)) { const CTxOut &txout = vout[i]; - nCredit += pwallet->GetCredit(txout); + nCredit += pwallet->GetCredit(txout, fWatchOnly); if (!MoneyRange(nCredit)) throw std::runtime_error("CWalletTx::GetAvailableCredit() : value out of range"); } } - nAvailableCreditCached = nCredit; - fAvailableCreditCached = true; + if (fWatchOnly) { + nAvailableWatchOnlyCreditCached = nCredit; + fAvailableWatchOnlyCreditCached = true; + } else { + nAvailableCreditCached = nCredit; + fAvailableCreditCached = true; + } return nCredit; } @@ -709,15 +752,16 @@ public: const CWalletTx *tx; int i; int nDepth; + bool fSpendable; - COutput(const CWalletTx *txIn, int iIn, int nDepthIn) + COutput(const CWalletTx *txIn, int iIn, int nDepthIn, bool fSpendableIn) { - tx = txIn; i = iIn; nDepth = nDepthIn; + tx = txIn; i = iIn; nDepth = nDepthIn; fSpendable = fSpendableIn; } std::string ToString() const { - return strprintf("COutput(%s, %d, %d) [%s]", tx->GetHash().ToString().substr(0,10).c_str(), i, nDepth, FormatMoney(tx->vout[i].nValue).c_str()); + return strprintf("COutput(%s, %d, %d, %d) [%s]", tx->GetHash().ToString().substr(0,10).c_str(), i, fSpendable, nDepth, FormatMoney(tx->vout[i].nValue).c_str()); } void print() const