Bitcoin Core 22.99.0
P2P Digital Currency
walletmodel.h
Go to the documentation of this file.
1// Copyright (c) 2011-2020 The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#ifndef BITCOIN_QT_WALLETMODEL_H
6#define BITCOIN_QT_WALLETMODEL_H
7
8#if defined(HAVE_CONFIG_H)
10#endif
11
12#include <key.h>
13#include <script/standard.h>
14
16
17#include <interfaces/wallet.h>
19
20#include <vector>
21
22#include <QObject>
23
24enum class OutputType;
25
27class ClientModel;
28class OptionsModel;
29class PlatformStyle;
34
35class CCoinControl;
36class CKeyID;
37class COutPoint;
38class COutput;
39class CPubKey;
40class uint256;
41
42namespace interfaces {
43class Node;
44} // namespace interfaces
45
46QT_BEGIN_NAMESPACE
47class QTimer;
48QT_END_NAMESPACE
49
51class WalletModel : public QObject
52{
53 Q_OBJECT
54
55public:
56 explicit WalletModel(std::unique_ptr<interfaces::Wallet> wallet, ClientModel& client_model, const PlatformStyle *platformStyle, QObject *parent = nullptr);
58
59 enum StatusCode // Returned by sendCoins
60 {
67 TransactionCreationFailed, // Error returned when wallet is still locked
70 };
71
73 {
74 Unencrypted, // !wallet->IsCrypted()
75 Locked, // wallet->IsCrypted() && wallet->IsLocked()
76 Unlocked // wallet->IsCrypted() && !wallet->IsLocked()
77 };
78
83
85
86 // Check address for validity
87 bool validateAddress(const QString &address);
88
89 // Return status record for SendCoins, contains error id + information
91 {
92 SendCoinsReturn(StatusCode _status = OK, QString _reasonCommitFailed = "")
93 : status(_status),
94 reasonCommitFailed(_reasonCommitFailed)
95 {
96 }
99 };
100
101 // prepare transaction for getting txfee before sending coins
103
104 // Send coins to a list of recipients
106
107 // Wallet encryption
108 bool setWalletEncrypted(const SecureString& passphrase);
109 // Passphrase only needed when unlocking
110 bool setWalletLocked(bool locked, const SecureString &passPhrase=SecureString());
111 bool changePassphrase(const SecureString &oldPass, const SecureString &newPass);
112
113 // RAI object for unlocking wallet, returned by requestUnlock()
115 {
116 public:
119
120 bool isValid() const { return valid; }
121
122 // Copy constructor is disabled.
123 UnlockContext(const UnlockContext&) = delete;
124 // Move operator and constructor transfer the context
125 UnlockContext(UnlockContext&& obj) { CopyFrom(std::move(obj)); }
126 UnlockContext& operator=(UnlockContext&& rhs) { CopyFrom(std::move(rhs)); return *this; }
127 private:
129 bool valid;
130 mutable bool relock; // mutable, as it can be set to false by copying
131
133 void CopyFrom(UnlockContext&& rhs);
134 };
135
137
138 bool bumpFee(uint256 hash, uint256& new_hash);
139 bool displayAddress(std::string sAddress);
140
141 static bool isWalletEnabled();
142
143 interfaces::Node& node() const { return m_node; }
144 interfaces::Wallet& wallet() const { return *m_wallet; }
146 void setClientModel(ClientModel* client_model);
147
148 QString getWalletName() const;
149 QString getDisplayName() const;
150
151 bool isMultiwallet();
152
154
155 void refresh(bool pk_hash_only = false);
156
158
159private:
160 std::unique_ptr<interfaces::Wallet> m_wallet;
161 std::unique_ptr<interfaces::Handler> m_handler_unload;
162 std::unique_ptr<interfaces::Handler> m_handler_status_changed;
163 std::unique_ptr<interfaces::Handler> m_handler_address_book_changed;
164 std::unique_ptr<interfaces::Handler> m_handler_transaction_changed;
165 std::unique_ptr<interfaces::Handler> m_handler_show_progress;
166 std::unique_ptr<interfaces::Handler> m_handler_watch_only_changed;
167 std::unique_ptr<interfaces::Handler> m_handler_can_get_addrs_changed;
170
173
174 // Wallet has an options model for wallet-specific options
175 // (transaction fee, for example)
177
181
182 // Cache some values to be able to detect changes
185 QTimer* timer;
186
187 // Block hash denoting when the last balance update was done.
189
192 void checkBalanceChanged(const interfaces::WalletBalances& new_balances);
193
194Q_SIGNALS:
195 // Signal that balance in wallet changed
196 void balanceChanged(const interfaces::WalletBalances& balances);
197
198 // Encryption status of wallet changed
200
201 // Signal emitted when wallet needs to be unlocked
202 // It is valid behaviour for listeners to keep the wallet locked after this signal;
203 // this means that the unlocking failed or was cancelled.
204 void requireUnlock();
205
206 // Fired when a message should be reported to the user
207 void message(const QString &title, const QString &message, unsigned int style);
208
209 // Coins sent: from wallet, to recipient, in (serialized) transaction:
210 void coinsSent(WalletModel* wallet, SendCoinsRecipient recipient, QByteArray transaction);
211
212 // Show progress dialog e.g. for rescan
213 void showProgress(const QString &title, int nProgress);
214
215 // Watch-only address added
216 void notifyWatchonlyChanged(bool fHaveWatchonly);
217
218 // Signal that wallet is about to be removed
219 void unload();
220
221 // Notify that there are now keys in the keypool
223
224 void timerTimeout();
225
226public Q_SLOTS:
227 /* Starts a timer to periodically update the balance */
228 void startPollBalance();
229
230 /* Wallet status might have changed */
231 void updateStatus();
232 /* New transaction, or transaction changed status */
233 void updateTransaction();
234 /* New, updated or removed address book entry */
235 void updateAddressBook(const QString &address, const QString &label, bool isMine, const QString &purpose, int status);
236 /* Watch-only added */
237 void updateWatchOnlyFlag(bool fHaveWatchonly);
238 /* Current, immature or unconfirmed balance might have changed - emit 'balanceChanged' if so */
239 void pollBalanceChanged();
240};
241
242#endif // BITCOIN_QT_WALLETMODEL_H
Qt model of the address book in the core.
Coin Control Features.
Definition: coincontrol.h:29
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:23
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:27
Definition: spend.h:17
An encapsulated public key.
Definition: pubkey.h:33
Model for Bitcoin network client.
Definition: clientmodel.h:48
Interface from Qt to configuration data structure for Bitcoin client.
Definition: optionsmodel.h:39
Model for list of recently generated payment requests / bitcoin: URIs.
UI model for the transaction table of a wallet.
UnlockContext(WalletModel *wallet, bool valid, bool relock)
UnlockContext(const UnlockContext &)=delete
UnlockContext(UnlockContext &&obj)
Definition: walletmodel.h:125
void CopyFrom(UnlockContext &&rhs)
UnlockContext & operator=(UnlockContext &&rhs)
Definition: walletmodel.h:126
UnlockContext & operator=(const UnlockContext &)=default
Interface to Bitcoin wallet from Qt view code.
Definition: walletmodel.h:52
OptionsModel * optionsModel
Definition: walletmodel.h:176
bool validateAddress(const QString &address)
AddressTableModel * addressTableModel
Definition: walletmodel.h:178
EncryptionStatus cachedEncryptionStatus
Definition: walletmodel.h:184
void refresh(bool pk_hash_only=false)
uint256 m_cached_last_update_tip
Definition: walletmodel.h:188
ClientModel * m_client_model
Definition: walletmodel.h:168
std::unique_ptr< interfaces::Handler > m_handler_watch_only_changed
Definition: walletmodel.h:166
interfaces::Node & m_node
Definition: walletmodel.h:169
ClientModel & clientModel() const
Definition: walletmodel.h:145
interfaces::Node & node() const
Definition: walletmodel.h:143
std::unique_ptr< interfaces::Handler > m_handler_transaction_changed
Definition: walletmodel.h:164
void startPollBalance()
Definition: walletmodel.cpp:65
void pollBalanceChanged()
Definition: walletmodel.cpp:90
SendCoinsReturn sendCoins(WalletModelTransaction &transaction)
AddressTableModel * getAddressTableModel() const
Definition: walletmodel.h:153
RecentRequestsTableModel * recentRequestsTableModel
Definition: walletmodel.h:180
TransactionTableModel * transactionTableModel
Definition: walletmodel.h:179
bool setWalletEncrypted(const SecureString &passphrase)
void notifyWatchonlyChanged(bool fHaveWatchonly)
bool changePassphrase(const SecureString &oldPass, const SecureString &newPass)
void showProgress(const QString &title, int nProgress)
bool setWalletLocked(bool locked, const SecureString &passPhrase=SecureString())
void message(const QString &title, const QString &message, unsigned int style)
bool displayAddress(std::string sAddress)
void setClientModel(ClientModel *client_model)
Definition: walletmodel.cpp:75
void updateStatus()
Definition: walletmodel.cpp:81
AddressTableModel * getAddressTableModel()
OptionsModel * getOptionsModel()
std::unique_ptr< interfaces::Handler > m_handler_can_get_addrs_changed
Definition: walletmodel.h:167
std::unique_ptr< interfaces::Handler > m_handler_unload
Definition: walletmodel.h:161
SendCoinsReturn prepareTransaction(WalletModelTransaction &transaction, const CCoinControl &coinControl)
EncryptionStatus getEncryptionStatus() const
interfaces::Wallet & wallet() const
Definition: walletmodel.h:144
RecentRequestsTableModel * getRecentRequestsTableModel()
std::unique_ptr< interfaces::Handler > m_handler_status_changed
Definition: walletmodel.h:162
interfaces::WalletBalances m_cached_balances
Definition: walletmodel.h:183
bool fForceCheckBalanceChanged
Definition: walletmodel.h:172
void coinsSent(WalletModel *wallet, SendCoinsRecipient recipient, QByteArray transaction)
QString getDisplayName() const
bool bumpFee(uint256 hash, uint256 &new_hash)
void checkBalanceChanged(const interfaces::WalletBalances &new_balances)
bool isMultiwallet()
void unsubscribeFromCoreSignals()
void updateTransaction()
void updateAddressBook(const QString &address, const QString &label, bool isMine, const QString &purpose, int status)
uint256 getLastBlockProcessed() const
void canGetAddressesChanged()
QTimer * timer
Definition: walletmodel.h:185
bool fHaveWatchOnly
Definition: walletmodel.h:171
WalletModel(std::unique_ptr< interfaces::Wallet > wallet, ClientModel &client_model, const PlatformStyle *platformStyle, QObject *parent=nullptr)
Definition: walletmodel.cpp:40
void updateWatchOnlyFlag(bool fHaveWatchonly)
std::unique_ptr< interfaces::Handler > m_handler_address_book_changed
Definition: walletmodel.h:163
void encryptionStatusChanged()
std::unique_ptr< interfaces::Wallet > m_wallet
Definition: walletmodel.h:160
UnlockContext requestUnlock()
void balanceChanged(const interfaces::WalletBalances &balances)
static bool isWalletEnabled()
QString getWalletName() const
std::unique_ptr< interfaces::Handler > m_handler_show_progress
Definition: walletmodel.h:165
@ AmountWithFeeExceedsBalance
Definition: walletmodel.h:65
@ TransactionCreationFailed
Definition: walletmodel.h:67
@ AmountExceedsBalance
Definition: walletmodel.h:64
@ DuplicateAddress
Definition: walletmodel.h:66
@ PaymentRequestExpired
Definition: walletmodel.h:69
void subscribeToCoreSignals()
TransactionTableModel * getTransactionTableModel()
Data model for a walletmodel transaction.
Top-level interface for a bitcoin node (bitcoind process).
Definition: node.h:55
Interface for accessing a wallet.
Definition: wallet.h:53
256-bit opaque blob.
Definition: uint256.h:124
OutputType
Definition: outputtype.h:18
std::basic_string< char, std::char_traits< char >, secure_allocator< char > > SecureString
Definition: secure.h:59
SendCoinsReturn(StatusCode _status=OK, QString _reasonCommitFailed="")
Definition: walletmodel.h:92
Collection of wallet balances.
Definition: wallet.h:356