]> Git Repo - VerusCoin.git/blob - src/qt/walletmodel.h
Merge pull request #4716
[VerusCoin.git] / src / qt / walletmodel.h
1 // Copyright (c) 2011-2014 The Bitcoin developers
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5 #ifndef WALLETMODEL_H
6 #define WALLETMODEL_H
7
8 #include "paymentrequestplus.h"
9 #include "walletmodeltransaction.h"
10
11 #include "allocators.h" /* for SecureString */
12
13 #include <map>
14 #include <vector>
15
16 #include <QObject>
17
18 class AddressTableModel;
19 class OptionsModel;
20 class RecentRequestsTableModel;
21 class TransactionTableModel;
22 class WalletModelTransaction;
23
24 class CCoinControl;
25 class CKeyID;
26 class COutPoint;
27 class COutput;
28 class CPubKey;
29 class CWallet;
30 class uint256;
31
32 QT_BEGIN_NAMESPACE
33 class QTimer;
34 QT_END_NAMESPACE
35
36 class SendCoinsRecipient
37 {
38 public:
39     explicit SendCoinsRecipient() : amount(0), nVersion(SendCoinsRecipient::CURRENT_VERSION) { }
40     explicit SendCoinsRecipient(const QString &addr, const QString &label, quint64 amount, const QString &message):
41         address(addr), label(label), amount(amount), message(message), nVersion(SendCoinsRecipient::CURRENT_VERSION) {}
42
43     // If from an insecure payment request, this is used for storing
44     // the addresses, e.g. address-A<br />address-B<br />address-C.
45     // Info: As we don't need to process addresses in here when using
46     // payment requests, we can abuse it for displaying an address list.
47     // Todo: This is a hack, should be replaced with a cleaner solution!
48     QString address;
49     QString label;
50     qint64 amount;
51     // If from a payment request, this is used for storing the memo
52     QString message;
53
54     // If from a payment request, paymentRequest.IsInitialized() will be true
55     PaymentRequestPlus paymentRequest;
56     // Empty if no authentication or invalid signature/cert/etc.
57     QString authenticatedMerchant;
58
59     static const int CURRENT_VERSION = 1;
60     int nVersion;
61
62     IMPLEMENT_SERIALIZE
63     (
64         SendCoinsRecipient* pthis = const_cast<SendCoinsRecipient*>(this);
65
66         std::string sAddress = pthis->address.toStdString();
67         std::string sLabel = pthis->label.toStdString();
68         std::string sMessage = pthis->message.toStdString();
69         std::string sPaymentRequest;
70         if (!fRead && pthis->paymentRequest.IsInitialized())
71             pthis->paymentRequest.SerializeToString(&sPaymentRequest);
72         std::string sAuthenticatedMerchant = pthis->authenticatedMerchant.toStdString();
73
74         READWRITE(pthis->nVersion);
75         nVersion = pthis->nVersion;
76         READWRITE(sAddress);
77         READWRITE(sLabel);
78         READWRITE(amount);
79         READWRITE(sMessage);
80         READWRITE(sPaymentRequest);
81         READWRITE(sAuthenticatedMerchant);
82
83         if (fRead)
84         {
85             pthis->address = QString::fromStdString(sAddress);
86             pthis->label = QString::fromStdString(sLabel);
87             pthis->message = QString::fromStdString(sMessage);
88             if (!sPaymentRequest.empty())
89                 pthis->paymentRequest.parse(QByteArray::fromRawData(sPaymentRequest.data(), sPaymentRequest.size()));
90             pthis->authenticatedMerchant = QString::fromStdString(sAuthenticatedMerchant);
91         }
92     )
93 };
94
95 /** Interface to Bitcoin wallet from Qt view code. */
96 class WalletModel : public QObject
97 {
98     Q_OBJECT
99
100 public:
101     explicit WalletModel(CWallet *wallet, OptionsModel *optionsModel, QObject *parent = 0);
102     ~WalletModel();
103
104     enum StatusCode // Returned by sendCoins
105     {
106         OK,
107         InvalidAmount,
108         InvalidAddress,
109         AmountExceedsBalance,
110         AmountWithFeeExceedsBalance,
111         DuplicateAddress,
112         TransactionCreationFailed, // Error returned when wallet is still locked
113         TransactionCommitFailed
114     };
115
116     enum EncryptionStatus
117     {
118         Unencrypted,  // !wallet->IsCrypted()
119         Locked,       // wallet->IsCrypted() && wallet->IsLocked()
120         Unlocked      // wallet->IsCrypted() && !wallet->IsLocked()
121     };
122
123     OptionsModel *getOptionsModel();
124     AddressTableModel *getAddressTableModel();
125     TransactionTableModel *getTransactionTableModel();
126     RecentRequestsTableModel *getRecentRequestsTableModel();
127
128     qint64 getBalance(const CCoinControl *coinControl = NULL) const;
129     qint64 getUnconfirmedBalance() const;
130     qint64 getImmatureBalance() const;
131     qint64 getWatchBalance() const;
132     qint64 getWatchUnconfirmedBalance() const;
133     qint64 getWatchImmatureBalance() const;
134     EncryptionStatus getEncryptionStatus() const;
135     bool processingQueuedTransactions() { return fProcessingQueuedTransactions; }
136
137     // Check address for validity
138     bool validateAddress(const QString &address);
139
140     // Return status record for SendCoins, contains error id + information
141     struct SendCoinsReturn
142     {
143         SendCoinsReturn(StatusCode status = OK):
144             status(status) {}
145         StatusCode status;
146     };
147
148     // prepare transaction for getting txfee before sending coins
149     SendCoinsReturn prepareTransaction(WalletModelTransaction &transaction, const CCoinControl *coinControl = NULL);
150
151     // Send coins to a list of recipients
152     SendCoinsReturn sendCoins(WalletModelTransaction &transaction);
153
154     // Wallet encryption
155     bool setWalletEncrypted(bool encrypted, const SecureString &passphrase);
156     // Passphrase only needed when unlocking
157     bool setWalletLocked(bool locked, const SecureString &passPhrase=SecureString());
158     bool changePassphrase(const SecureString &oldPass, const SecureString &newPass);
159     // Wallet backup
160     bool backupWallet(const QString &filename);
161
162     // RAI object for unlocking wallet, returned by requestUnlock()
163     class UnlockContext
164     {
165     public:
166         UnlockContext(WalletModel *wallet, bool valid, bool relock);
167         ~UnlockContext();
168
169         bool isValid() const { return valid; }
170
171         // Copy operator and constructor transfer the context
172         UnlockContext(const UnlockContext& obj) { CopyFrom(obj); }
173         UnlockContext& operator=(const UnlockContext& rhs) { CopyFrom(rhs); return *this; }
174     private:
175         WalletModel *wallet;
176         bool valid;
177         mutable bool relock; // mutable, as it can be set to false by copying
178
179         void CopyFrom(const UnlockContext& rhs);
180     };
181
182     UnlockContext requestUnlock();
183
184     bool getPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const;
185     void getOutputs(const std::vector<COutPoint>& vOutpoints, std::vector<COutput>& vOutputs);
186     bool isSpent(const COutPoint& outpoint) const;
187     void listCoins(std::map<QString, std::vector<COutput> >& mapCoins) const;
188
189     bool isLockedCoin(uint256 hash, unsigned int n) const;
190     void lockCoin(COutPoint& output);
191     void unlockCoin(COutPoint& output);
192     void listLockedCoins(std::vector<COutPoint>& vOutpts);
193
194     void loadReceiveRequests(std::vector<std::string>& vReceiveRequests);
195     bool saveReceiveRequest(const std::string &sAddress, const int64_t nId, const std::string &sRequest);
196
197 private:
198     CWallet *wallet;
199     bool fProcessingQueuedTransactions;
200
201     // Wallet has an options model for wallet-specific options
202     // (transaction fee, for example)
203     OptionsModel *optionsModel;
204
205     AddressTableModel *addressTableModel;
206     TransactionTableModel *transactionTableModel;
207     RecentRequestsTableModel *recentRequestsTableModel;
208
209     // Cache some values to be able to detect changes
210     qint64 cachedBalance;
211     qint64 cachedUnconfirmedBalance;
212     qint64 cachedImmatureBalance;
213     qint64 cachedWatchOnlyBalance;
214     qint64 cachedWatchUnconfBalance;
215     qint64 cachedWatchImmatureBalance;
216     EncryptionStatus cachedEncryptionStatus;
217     int cachedNumBlocks;
218
219     QTimer *pollTimer;
220
221     void subscribeToCoreSignals();
222     void unsubscribeFromCoreSignals();
223     void checkBalanceChanged();
224
225 signals:
226     // Signal that balance in wallet changed
227     void balanceChanged(qint64 balance, qint64 unconfirmedBalance, qint64 immatureBalance,
228                         qint64 watchOnlyBalance, qint64 watchUnconfBalance, qint64 watchImmatureBalance);
229
230     // Encryption status of wallet changed
231     void encryptionStatusChanged(int status);
232
233     // Signal emitted when wallet needs to be unlocked
234     // It is valid behaviour for listeners to keep the wallet locked after this signal;
235     // this means that the unlocking failed or was cancelled.
236     void requireUnlock();
237
238     // Fired when a message should be reported to the user
239     void message(const QString &title, const QString &message, unsigned int style);
240
241     // Coins sent: from wallet, to recipient, in (serialized) transaction:
242     void coinsSent(CWallet* wallet, SendCoinsRecipient recipient, QByteArray transaction);
243
244     // Show progress dialog e.g. for rescan
245     void showProgress(const QString &title, int nProgress);
246
247 public slots:
248     /* Wallet status might have changed */
249     void updateStatus();
250     /* New transaction, or transaction changed status */
251     void updateTransaction(const QString &hash, int status);
252     /* New, updated or removed address book entry */
253     void updateAddressBook(const QString &address, const QString &label, bool isMine, const QString &purpose, int status);
254     /* Current, immature or unconfirmed balance might have changed - emit 'balanceChanged' if so */
255     void pollBalanceChanged();
256     /* Needed to update fProcessingQueuedTransactions through a QueuedConnection */
257     void setProcessingQueuedTransactions(bool value) { fProcessingQueuedTransactions = value; }
258 };
259
260 #endif // WALLETMODEL_H
This page took 0.040678 seconds and 4 git commands to generate.