mirror of
https://github.com/dashpay/dash.git
synced 2024-12-28 21:42:47 +01:00
c++11: MOVEONLY: break circular dependency in wallet
c++11 (libc++'s stdlib implementation anyway) doesn't allow for map types to be forward-declared. for example: class foo; std::map<int, foo> bar; // error, foo has not been defined. class foo{}; Since CWallet and CWalletTx are inter-dependent, but only std::map<*,CWalletTx> is used, forward-declare CWallet instead and define CWalletTx first. Despite the mangled git diff, this change only amounts to moving ~320 lines in a single chunk.
This commit is contained in:
parent
bbacd88204
commit
3447cf87e2
648
src/wallet.h
648
src/wallet.h
@ -103,6 +103,329 @@ public:
|
|||||||
StringMap destdata;
|
StringMap destdata;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef std::map<std::string, std::string> mapValue_t;
|
||||||
|
|
||||||
|
|
||||||
|
static void ReadOrderPos(int64_t& nOrderPos, mapValue_t& mapValue)
|
||||||
|
{
|
||||||
|
if (!mapValue.count("n"))
|
||||||
|
{
|
||||||
|
nOrderPos = -1; // TODO: calculate elsewhere
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
nOrderPos = atoi64(mapValue["n"].c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void WriteOrderPos(const int64_t& nOrderPos, mapValue_t& mapValue)
|
||||||
|
{
|
||||||
|
if (nOrderPos == -1)
|
||||||
|
return;
|
||||||
|
mapValue["n"] = i64tostr(nOrderPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct COutputEntry
|
||||||
|
{
|
||||||
|
CTxDestination destination;
|
||||||
|
CAmount amount;
|
||||||
|
int vout;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** A transaction with a merkle branch linking it to the block chain. */
|
||||||
|
class CMerkleTx : public CTransaction
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
int GetDepthInMainChainINTERNAL(const CBlockIndex* &pindexRet) const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
uint256 hashBlock;
|
||||||
|
std::vector<uint256> vMerkleBranch;
|
||||||
|
int nIndex;
|
||||||
|
|
||||||
|
// memory only
|
||||||
|
mutable bool fMerkleVerified;
|
||||||
|
|
||||||
|
|
||||||
|
CMerkleTx()
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Init()
|
||||||
|
{
|
||||||
|
hashBlock = uint256();
|
||||||
|
nIndex = -1;
|
||||||
|
fMerkleVerified = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
|
template <typename Stream, typename Operation>
|
||||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
||||||
|
READWRITE(*(CTransaction*)this);
|
||||||
|
nVersion = this->nVersion;
|
||||||
|
READWRITE(hashBlock);
|
||||||
|
READWRITE(vMerkleBranch);
|
||||||
|
READWRITE(nIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
int SetMerkleBranch(const CBlock& block);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return depth of transaction in blockchain:
|
||||||
|
* -1 : not in blockchain, and not in memory pool (conflicted transaction)
|
||||||
|
* 0 : in memory pool, waiting to be included in a block
|
||||||
|
* >=1 : this many blocks deep in the main chain
|
||||||
|
*/
|
||||||
|
int GetDepthInMainChain(const CBlockIndex* &pindexRet) const;
|
||||||
|
int GetDepthInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
|
||||||
|
bool IsInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChainINTERNAL(pindexRet) > 0; }
|
||||||
|
int GetBlocksToMaturity() const;
|
||||||
|
bool AcceptToMemoryPool(bool fLimitFree=true, bool fRejectAbsurdFee=true);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A transaction with a bunch of additional info that only the owner cares about.
|
||||||
|
* It includes any unrecorded transactions needed to link it back to the block chain.
|
||||||
|
*/
|
||||||
|
class CWalletTx : public CMerkleTx
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
const CWallet* pwallet;
|
||||||
|
|
||||||
|
public:
|
||||||
|
mapValue_t mapValue;
|
||||||
|
std::vector<std::pair<std::string, std::string> > vOrderForm;
|
||||||
|
unsigned int fTimeReceivedIsTxTime;
|
||||||
|
unsigned int nTimeReceived; //! time received by this node
|
||||||
|
unsigned int nTimeSmart;
|
||||||
|
char fFromMe;
|
||||||
|
std::string strFromAccount;
|
||||||
|
int64_t nOrderPos; //! position in ordered transaction list
|
||||||
|
|
||||||
|
// memory only
|
||||||
|
mutable bool fDebitCached;
|
||||||
|
mutable bool fCreditCached;
|
||||||
|
mutable bool fImmatureCreditCached;
|
||||||
|
mutable bool fAvailableCreditCached;
|
||||||
|
mutable bool fWatchDebitCached;
|
||||||
|
mutable bool fWatchCreditCached;
|
||||||
|
mutable bool fImmatureWatchCreditCached;
|
||||||
|
mutable bool fAvailableWatchCreditCached;
|
||||||
|
mutable bool fChangeCached;
|
||||||
|
mutable CAmount nDebitCached;
|
||||||
|
mutable CAmount nCreditCached;
|
||||||
|
mutable CAmount nImmatureCreditCached;
|
||||||
|
mutable CAmount nAvailableCreditCached;
|
||||||
|
mutable CAmount nWatchDebitCached;
|
||||||
|
mutable CAmount nWatchCreditCached;
|
||||||
|
mutable CAmount nImmatureWatchCreditCached;
|
||||||
|
mutable CAmount nAvailableWatchCreditCached;
|
||||||
|
mutable CAmount nChangeCached;
|
||||||
|
|
||||||
|
CWalletTx()
|
||||||
|
{
|
||||||
|
Init(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
CWalletTx(const CWallet* pwalletIn)
|
||||||
|
{
|
||||||
|
Init(pwalletIn);
|
||||||
|
}
|
||||||
|
|
||||||
|
CWalletTx(const CWallet* pwalletIn, const CMerkleTx& txIn) : CMerkleTx(txIn)
|
||||||
|
{
|
||||||
|
Init(pwalletIn);
|
||||||
|
}
|
||||||
|
|
||||||
|
CWalletTx(const CWallet* pwalletIn, const CTransaction& txIn) : CMerkleTx(txIn)
|
||||||
|
{
|
||||||
|
Init(pwalletIn);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Init(const CWallet* pwalletIn)
|
||||||
|
{
|
||||||
|
pwallet = pwalletIn;
|
||||||
|
mapValue.clear();
|
||||||
|
vOrderForm.clear();
|
||||||
|
fTimeReceivedIsTxTime = false;
|
||||||
|
nTimeReceived = 0;
|
||||||
|
nTimeSmart = 0;
|
||||||
|
fFromMe = false;
|
||||||
|
strFromAccount.clear();
|
||||||
|
fDebitCached = false;
|
||||||
|
fCreditCached = false;
|
||||||
|
fImmatureCreditCached = false;
|
||||||
|
fAvailableCreditCached = false;
|
||||||
|
fWatchDebitCached = false;
|
||||||
|
fWatchCreditCached = false;
|
||||||
|
fImmatureWatchCreditCached = false;
|
||||||
|
fAvailableWatchCreditCached = false;
|
||||||
|
fChangeCached = false;
|
||||||
|
nDebitCached = 0;
|
||||||
|
nCreditCached = 0;
|
||||||
|
nImmatureCreditCached = 0;
|
||||||
|
nAvailableCreditCached = 0;
|
||||||
|
nWatchDebitCached = 0;
|
||||||
|
nWatchCreditCached = 0;
|
||||||
|
nAvailableWatchCreditCached = 0;
|
||||||
|
nImmatureWatchCreditCached = 0;
|
||||||
|
nChangeCached = 0;
|
||||||
|
nOrderPos = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
|
template <typename Stream, typename Operation>
|
||||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
||||||
|
if (ser_action.ForRead())
|
||||||
|
Init(NULL);
|
||||||
|
char fSpent = false;
|
||||||
|
|
||||||
|
if (!ser_action.ForRead())
|
||||||
|
{
|
||||||
|
mapValue["fromaccount"] = strFromAccount;
|
||||||
|
|
||||||
|
WriteOrderPos(nOrderPos, mapValue);
|
||||||
|
|
||||||
|
if (nTimeSmart)
|
||||||
|
mapValue["timesmart"] = strprintf("%u", nTimeSmart);
|
||||||
|
}
|
||||||
|
|
||||||
|
READWRITE(*(CMerkleTx*)this);
|
||||||
|
std::vector<CMerkleTx> vUnused; //! Used to be vtxPrev
|
||||||
|
READWRITE(vUnused);
|
||||||
|
READWRITE(mapValue);
|
||||||
|
READWRITE(vOrderForm);
|
||||||
|
READWRITE(fTimeReceivedIsTxTime);
|
||||||
|
READWRITE(nTimeReceived);
|
||||||
|
READWRITE(fFromMe);
|
||||||
|
READWRITE(fSpent);
|
||||||
|
|
||||||
|
if (ser_action.ForRead())
|
||||||
|
{
|
||||||
|
strFromAccount = mapValue["fromaccount"];
|
||||||
|
|
||||||
|
ReadOrderPos(nOrderPos, mapValue);
|
||||||
|
|
||||||
|
nTimeSmart = mapValue.count("timesmart") ? (unsigned int)atoi64(mapValue["timesmart"]) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
mapValue.erase("fromaccount");
|
||||||
|
mapValue.erase("version");
|
||||||
|
mapValue.erase("spent");
|
||||||
|
mapValue.erase("n");
|
||||||
|
mapValue.erase("timesmart");
|
||||||
|
}
|
||||||
|
|
||||||
|
//! make sure balances are recalculated
|
||||||
|
void MarkDirty()
|
||||||
|
{
|
||||||
|
fCreditCached = false;
|
||||||
|
fAvailableCreditCached = false;
|
||||||
|
fWatchDebitCached = false;
|
||||||
|
fWatchCreditCached = false;
|
||||||
|
fAvailableWatchCreditCached = false;
|
||||||
|
fImmatureWatchCreditCached = false;
|
||||||
|
fDebitCached = false;
|
||||||
|
fChangeCached = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BindWallet(CWallet *pwalletIn)
|
||||||
|
{
|
||||||
|
pwallet = pwalletIn;
|
||||||
|
MarkDirty();
|
||||||
|
}
|
||||||
|
|
||||||
|
//! filter decides which addresses will count towards the debit
|
||||||
|
CAmount GetDebit(const isminefilter& filter) const;
|
||||||
|
CAmount GetCredit(const isminefilter& filter) const;
|
||||||
|
CAmount GetImmatureCredit(bool fUseCache=true) const;
|
||||||
|
CAmount GetAvailableCredit(bool fUseCache=true) const;
|
||||||
|
CAmount GetImmatureWatchOnlyCredit(const bool& fUseCache=true) const;
|
||||||
|
CAmount GetAvailableWatchOnlyCredit(const bool& fUseCache=true) const;
|
||||||
|
CAmount GetChange() const;
|
||||||
|
|
||||||
|
void GetAmounts(std::list<COutputEntry>& listReceived,
|
||||||
|
std::list<COutputEntry>& listSent, CAmount& nFee, std::string& strSentAccount, const isminefilter& filter) const;
|
||||||
|
|
||||||
|
void GetAccountAmounts(const std::string& strAccount, CAmount& nReceived,
|
||||||
|
CAmount& nSent, CAmount& nFee, const isminefilter& filter) const;
|
||||||
|
|
||||||
|
bool IsFromMe(const isminefilter& filter) const
|
||||||
|
{
|
||||||
|
return (GetDebit(filter) > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsTrusted() const;
|
||||||
|
|
||||||
|
bool WriteToDisk(CWalletDB *pwalletdb);
|
||||||
|
|
||||||
|
int64_t GetTxTime() const;
|
||||||
|
int GetRequestCount() const;
|
||||||
|
|
||||||
|
void RelayWalletTransaction();
|
||||||
|
|
||||||
|
std::set<uint256> GetConflicts() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class COutput
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
const CWalletTx *tx;
|
||||||
|
int i;
|
||||||
|
int nDepth;
|
||||||
|
bool fSpendable;
|
||||||
|
|
||||||
|
COutput(const CWalletTx *txIn, int iIn, int nDepthIn, bool fSpendableIn)
|
||||||
|
{
|
||||||
|
tx = txIn; i = iIn; nDepth = nDepthIn; fSpendable = fSpendableIn;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ToString() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** Private key that includes an expiration date in case it never gets used. */
|
||||||
|
class CWalletKey
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CPrivKey vchPrivKey;
|
||||||
|
int64_t nTimeCreated;
|
||||||
|
int64_t nTimeExpires;
|
||||||
|
std::string strComment;
|
||||||
|
//! todo: add something to note what created it (user, getnewaddress, change)
|
||||||
|
//! maybe should have a map<string, string> property map
|
||||||
|
|
||||||
|
CWalletKey(int64_t nExpires=0);
|
||||||
|
|
||||||
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
|
template <typename Stream, typename Operation>
|
||||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
||||||
|
if (!(nType & SER_GETHASH))
|
||||||
|
READWRITE(nVersion);
|
||||||
|
READWRITE(vchPrivKey);
|
||||||
|
READWRITE(nTimeCreated);
|
||||||
|
READWRITE(nTimeExpires);
|
||||||
|
READWRITE(LIMITED_STRING(strComment, 65536));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A CWallet is an extension of a keystore, which also maintains a set of transactions and balances,
|
* A CWallet is an extension of a keystore, which also maintains a set of transactions and balances,
|
||||||
* and provides the ability to create new transactions.
|
* and provides the ability to create new transactions.
|
||||||
@ -464,331 +787,6 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef std::map<std::string, std::string> mapValue_t;
|
|
||||||
|
|
||||||
|
|
||||||
static void ReadOrderPos(int64_t& nOrderPos, mapValue_t& mapValue)
|
|
||||||
{
|
|
||||||
if (!mapValue.count("n"))
|
|
||||||
{
|
|
||||||
nOrderPos = -1; // TODO: calculate elsewhere
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
nOrderPos = atoi64(mapValue["n"].c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void WriteOrderPos(const int64_t& nOrderPos, mapValue_t& mapValue)
|
|
||||||
{
|
|
||||||
if (nOrderPos == -1)
|
|
||||||
return;
|
|
||||||
mapValue["n"] = i64tostr(nOrderPos);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct COutputEntry
|
|
||||||
{
|
|
||||||
CTxDestination destination;
|
|
||||||
CAmount amount;
|
|
||||||
int vout;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** A transaction with a merkle branch linking it to the block chain. */
|
|
||||||
class CMerkleTx : public CTransaction
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
int GetDepthInMainChainINTERNAL(const CBlockIndex* &pindexRet) const;
|
|
||||||
|
|
||||||
public:
|
|
||||||
uint256 hashBlock;
|
|
||||||
std::vector<uint256> vMerkleBranch;
|
|
||||||
int nIndex;
|
|
||||||
|
|
||||||
// memory only
|
|
||||||
mutable bool fMerkleVerified;
|
|
||||||
|
|
||||||
|
|
||||||
CMerkleTx()
|
|
||||||
{
|
|
||||||
Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
CMerkleTx(const CTransaction& txIn) : CTransaction(txIn)
|
|
||||||
{
|
|
||||||
Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Init()
|
|
||||||
{
|
|
||||||
hashBlock = uint256();
|
|
||||||
nIndex = -1;
|
|
||||||
fMerkleVerified = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ADD_SERIALIZE_METHODS;
|
|
||||||
|
|
||||||
template <typename Stream, typename Operation>
|
|
||||||
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
|
||||||
READWRITE(*(CTransaction*)this);
|
|
||||||
nVersion = this->nVersion;
|
|
||||||
READWRITE(hashBlock);
|
|
||||||
READWRITE(vMerkleBranch);
|
|
||||||
READWRITE(nIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SetMerkleBranch(const CBlock& block);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return depth of transaction in blockchain:
|
|
||||||
* -1 : not in blockchain, and not in memory pool (conflicted transaction)
|
|
||||||
* 0 : in memory pool, waiting to be included in a block
|
|
||||||
* >=1 : this many blocks deep in the main chain
|
|
||||||
*/
|
|
||||||
int GetDepthInMainChain(const CBlockIndex* &pindexRet) const;
|
|
||||||
int GetDepthInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChain(pindexRet); }
|
|
||||||
bool IsInMainChain() const { const CBlockIndex *pindexRet; return GetDepthInMainChainINTERNAL(pindexRet) > 0; }
|
|
||||||
int GetBlocksToMaturity() const;
|
|
||||||
bool AcceptToMemoryPool(bool fLimitFree=true, bool fRejectAbsurdFee=true);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A transaction with a bunch of additional info that only the owner cares about.
|
|
||||||
* It includes any unrecorded transactions needed to link it back to the block chain.
|
|
||||||
*/
|
|
||||||
class CWalletTx : public CMerkleTx
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
const CWallet* pwallet;
|
|
||||||
|
|
||||||
public:
|
|
||||||
mapValue_t mapValue;
|
|
||||||
std::vector<std::pair<std::string, std::string> > vOrderForm;
|
|
||||||
unsigned int fTimeReceivedIsTxTime;
|
|
||||||
unsigned int nTimeReceived; //! time received by this node
|
|
||||||
unsigned int nTimeSmart;
|
|
||||||
char fFromMe;
|
|
||||||
std::string strFromAccount;
|
|
||||||
int64_t nOrderPos; //! position in ordered transaction list
|
|
||||||
|
|
||||||
// memory only
|
|
||||||
mutable bool fDebitCached;
|
|
||||||
mutable bool fCreditCached;
|
|
||||||
mutable bool fImmatureCreditCached;
|
|
||||||
mutable bool fAvailableCreditCached;
|
|
||||||
mutable bool fWatchDebitCached;
|
|
||||||
mutable bool fWatchCreditCached;
|
|
||||||
mutable bool fImmatureWatchCreditCached;
|
|
||||||
mutable bool fAvailableWatchCreditCached;
|
|
||||||
mutable bool fChangeCached;
|
|
||||||
mutable CAmount nDebitCached;
|
|
||||||
mutable CAmount nCreditCached;
|
|
||||||
mutable CAmount nImmatureCreditCached;
|
|
||||||
mutable CAmount nAvailableCreditCached;
|
|
||||||
mutable CAmount nWatchDebitCached;
|
|
||||||
mutable CAmount nWatchCreditCached;
|
|
||||||
mutable CAmount nImmatureWatchCreditCached;
|
|
||||||
mutable CAmount nAvailableWatchCreditCached;
|
|
||||||
mutable CAmount nChangeCached;
|
|
||||||
|
|
||||||
CWalletTx()
|
|
||||||
{
|
|
||||||
Init(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
CWalletTx(const CWallet* pwalletIn)
|
|
||||||
{
|
|
||||||
Init(pwalletIn);
|
|
||||||
}
|
|
||||||
|
|
||||||
CWalletTx(const CWallet* pwalletIn, const CMerkleTx& txIn) : CMerkleTx(txIn)
|
|
||||||
{
|
|
||||||
Init(pwalletIn);
|
|
||||||
}
|
|
||||||
|
|
||||||
CWalletTx(const CWallet* pwalletIn, const CTransaction& txIn) : CMerkleTx(txIn)
|
|
||||||
{
|
|
||||||
Init(pwalletIn);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Init(const CWallet* pwalletIn)
|
|
||||||
{
|
|
||||||
pwallet = pwalletIn;
|
|
||||||
mapValue.clear();
|
|
||||||
vOrderForm.clear();
|
|
||||||
fTimeReceivedIsTxTime = false;
|
|
||||||
nTimeReceived = 0;
|
|
||||||
nTimeSmart = 0;
|
|
||||||
fFromMe = false;
|
|
||||||
strFromAccount.clear();
|
|
||||||
fDebitCached = false;
|
|
||||||
fCreditCached = false;
|
|
||||||
fImmatureCreditCached = false;
|
|
||||||
fAvailableCreditCached = false;
|
|
||||||
fWatchDebitCached = false;
|
|
||||||
fWatchCreditCached = false;
|
|
||||||
fImmatureWatchCreditCached = false;
|
|
||||||
fAvailableWatchCreditCached = false;
|
|
||||||
fChangeCached = false;
|
|
||||||
nDebitCached = 0;
|
|
||||||
nCreditCached = 0;
|
|
||||||
nImmatureCreditCached = 0;
|
|
||||||
nAvailableCreditCached = 0;
|
|
||||||
nWatchDebitCached = 0;
|
|
||||||
nWatchCreditCached = 0;
|
|
||||||
nAvailableWatchCreditCached = 0;
|
|
||||||
nImmatureWatchCreditCached = 0;
|
|
||||||
nChangeCached = 0;
|
|
||||||
nOrderPos = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ADD_SERIALIZE_METHODS;
|
|
||||||
|
|
||||||
template <typename Stream, typename Operation>
|
|
||||||
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
|
||||||
if (ser_action.ForRead())
|
|
||||||
Init(NULL);
|
|
||||||
char fSpent = false;
|
|
||||||
|
|
||||||
if (!ser_action.ForRead())
|
|
||||||
{
|
|
||||||
mapValue["fromaccount"] = strFromAccount;
|
|
||||||
|
|
||||||
WriteOrderPos(nOrderPos, mapValue);
|
|
||||||
|
|
||||||
if (nTimeSmart)
|
|
||||||
mapValue["timesmart"] = strprintf("%u", nTimeSmart);
|
|
||||||
}
|
|
||||||
|
|
||||||
READWRITE(*(CMerkleTx*)this);
|
|
||||||
std::vector<CMerkleTx> vUnused; //! Used to be vtxPrev
|
|
||||||
READWRITE(vUnused);
|
|
||||||
READWRITE(mapValue);
|
|
||||||
READWRITE(vOrderForm);
|
|
||||||
READWRITE(fTimeReceivedIsTxTime);
|
|
||||||
READWRITE(nTimeReceived);
|
|
||||||
READWRITE(fFromMe);
|
|
||||||
READWRITE(fSpent);
|
|
||||||
|
|
||||||
if (ser_action.ForRead())
|
|
||||||
{
|
|
||||||
strFromAccount = mapValue["fromaccount"];
|
|
||||||
|
|
||||||
ReadOrderPos(nOrderPos, mapValue);
|
|
||||||
|
|
||||||
nTimeSmart = mapValue.count("timesmart") ? (unsigned int)atoi64(mapValue["timesmart"]) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
mapValue.erase("fromaccount");
|
|
||||||
mapValue.erase("version");
|
|
||||||
mapValue.erase("spent");
|
|
||||||
mapValue.erase("n");
|
|
||||||
mapValue.erase("timesmart");
|
|
||||||
}
|
|
||||||
|
|
||||||
//! make sure balances are recalculated
|
|
||||||
void MarkDirty()
|
|
||||||
{
|
|
||||||
fCreditCached = false;
|
|
||||||
fAvailableCreditCached = false;
|
|
||||||
fWatchDebitCached = false;
|
|
||||||
fWatchCreditCached = false;
|
|
||||||
fAvailableWatchCreditCached = false;
|
|
||||||
fImmatureWatchCreditCached = false;
|
|
||||||
fDebitCached = false;
|
|
||||||
fChangeCached = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BindWallet(CWallet *pwalletIn)
|
|
||||||
{
|
|
||||||
pwallet = pwalletIn;
|
|
||||||
MarkDirty();
|
|
||||||
}
|
|
||||||
|
|
||||||
//! filter decides which addresses will count towards the debit
|
|
||||||
CAmount GetDebit(const isminefilter& filter) const;
|
|
||||||
CAmount GetCredit(const isminefilter& filter) const;
|
|
||||||
CAmount GetImmatureCredit(bool fUseCache=true) const;
|
|
||||||
CAmount GetAvailableCredit(bool fUseCache=true) const;
|
|
||||||
CAmount GetImmatureWatchOnlyCredit(const bool& fUseCache=true) const;
|
|
||||||
CAmount GetAvailableWatchOnlyCredit(const bool& fUseCache=true) const;
|
|
||||||
CAmount GetChange() const;
|
|
||||||
|
|
||||||
void GetAmounts(std::list<COutputEntry>& listReceived,
|
|
||||||
std::list<COutputEntry>& listSent, CAmount& nFee, std::string& strSentAccount, const isminefilter& filter) const;
|
|
||||||
|
|
||||||
void GetAccountAmounts(const std::string& strAccount, CAmount& nReceived,
|
|
||||||
CAmount& nSent, CAmount& nFee, const isminefilter& filter) const;
|
|
||||||
|
|
||||||
bool IsFromMe(const isminefilter& filter) const
|
|
||||||
{
|
|
||||||
return (GetDebit(filter) > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsTrusted() const;
|
|
||||||
|
|
||||||
bool WriteToDisk(CWalletDB *pwalletdb);
|
|
||||||
|
|
||||||
int64_t GetTxTime() const;
|
|
||||||
int GetRequestCount() const;
|
|
||||||
|
|
||||||
void RelayWalletTransaction();
|
|
||||||
|
|
||||||
std::set<uint256> GetConflicts() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class COutput
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
const CWalletTx *tx;
|
|
||||||
int i;
|
|
||||||
int nDepth;
|
|
||||||
bool fSpendable;
|
|
||||||
|
|
||||||
COutput(const CWalletTx *txIn, int iIn, int nDepthIn, bool fSpendableIn)
|
|
||||||
{
|
|
||||||
tx = txIn; i = iIn; nDepth = nDepthIn; fSpendable = fSpendableIn;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string ToString() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Private key that includes an expiration date in case it never gets used. */
|
|
||||||
class CWalletKey
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CPrivKey vchPrivKey;
|
|
||||||
int64_t nTimeCreated;
|
|
||||||
int64_t nTimeExpires;
|
|
||||||
std::string strComment;
|
|
||||||
//! todo: add something to note what created it (user, getnewaddress, change)
|
|
||||||
//! maybe should have a map<string, string> property map
|
|
||||||
|
|
||||||
CWalletKey(int64_t nExpires=0);
|
|
||||||
|
|
||||||
ADD_SERIALIZE_METHODS;
|
|
||||||
|
|
||||||
template <typename Stream, typename Operation>
|
|
||||||
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
|
||||||
if (!(nType & SER_GETHASH))
|
|
||||||
READWRITE(nVersion);
|
|
||||||
READWRITE(vchPrivKey);
|
|
||||||
READWRITE(nTimeCreated);
|
|
||||||
READWRITE(nTimeExpires);
|
|
||||||
READWRITE(LIMITED_STRING(strComment, 65536));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Account information.
|
* Account information.
|
||||||
* Stored in wallet with key "acc"+string account name.
|
* Stored in wallet with key "acc"+string account name.
|
||||||
|
Loading…
Reference in New Issue
Block a user