8 #include "allocators.h" /* for SecureString */
11 class AddressTableModel;
12 class TransactionTableModel;
25 class SendCoinsRecipient
33 /** Interface to Bitcoin wallet from Qt view code. */
34 class WalletModel : public QObject
39 explicit WalletModel(CWallet *wallet, OptionsModel *optionsModel, QObject *parent = 0);
42 enum StatusCode // Returned by sendCoins
48 AmountWithFeeExceedsBalance,
50 TransactionCreationFailed, // Error returned when wallet is still locked
51 TransactionCommitFailed,
57 Unencrypted, // !wallet->IsCrypted()
58 Locked, // wallet->IsCrypted() && wallet->IsLocked()
59 Unlocked // wallet->IsCrypted() && !wallet->IsLocked()
62 OptionsModel *getOptionsModel();
63 AddressTableModel *getAddressTableModel();
64 TransactionTableModel *getTransactionTableModel();
66 qint64 getBalance() const;
67 qint64 getStake() const;
68 qint64 getUnconfirmedBalance() const;
69 qint64 getImmatureBalance() const;
70 int getNumTransactions() const;
71 EncryptionStatus getEncryptionStatus() const;
73 // Check address for validity
74 bool validateAddress(const QString &address);
76 // Return status record for SendCoins, contains error id + information
77 struct SendCoinsReturn
79 SendCoinsReturn(StatusCode status=Aborted,
81 QString hex=QString()):
82 status(status), fee(fee), hex(hex) {}
84 qint64 fee; // is used in case status is "AmountWithFeeExceedsBalance"
85 QString hex; // is filled with the transaction hash if status is "OK"
88 // Send coins to a list of recipients
89 SendCoinsReturn sendCoins(const QList<SendCoinsRecipient> &recipients, const CCoinControl *coinControl=NULL);
92 bool setWalletEncrypted(bool encrypted, const SecureString &passphrase);
93 // Passphrase only needed when unlocking
94 bool setWalletLocked(bool locked, const SecureString &passPhrase=SecureString());
95 bool changePassphrase(const SecureString &oldPass, const SecureString &newPass);
97 bool backupWallet(const QString &filename);
99 bool dumpWallet(const QString &filename);
100 bool importWallet(const QString &filename);
102 void getStakeWeight(quint64& nMinWeight, quint64& nMaxWeight, quint64& nWeight);
103 void getStakeWeightFromValue(const qint64& nTime, const qint64& nValue, quint64& nWeight);
105 // RAI object for unlocking wallet, returned by requestUnlock()
109 UnlockContext(WalletModel *wallet, bool valid, bool relock);
112 bool isValid() const { return valid; }
114 // Copy operator and constructor transfer the context
115 UnlockContext(const UnlockContext& obj) { CopyFrom(obj); }
116 UnlockContext& operator=(const UnlockContext& rhs) { CopyFrom(rhs); return *this; }
120 mutable bool relock; // mutable, as it can be set to false by copying
122 void CopyFrom(const UnlockContext& rhs);
125 UnlockContext requestUnlock();
127 bool getPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const;
128 void getOutputs(const std::vector<COutPoint>& vOutpoints, std::vector<COutput>& vOutputs);
129 void listCoins(std::map<QString, std::vector<COutput> >& mapCoins) const;
130 bool isLockedCoin(uint256 hash, unsigned int n) const;
131 void lockCoin(COutPoint& output);
132 void unlockCoin(COutPoint& output);
133 void listLockedCoins(std::vector<COutPoint>& vOutpts);
138 // Wallet has an options model for wallet-specific options
139 // (transaction fee, for example)
140 OptionsModel *optionsModel;
142 AddressTableModel *addressTableModel;
143 TransactionTableModel *transactionTableModel;
145 // Cache some values to be able to detect changes
146 qint64 cachedBalance;
148 qint64 cachedUnconfirmedBalance;
149 qint64 cachedImmatureBalance;
150 qint64 cachedNumTransactions;
151 EncryptionStatus cachedEncryptionStatus;
156 void subscribeToCoreSignals();
157 void unsubscribeFromCoreSignals();
158 void checkBalanceChanged();
162 /* Wallet status might have changed */
164 /* New transaction, or transaction changed status */
165 void updateTransaction(const QString &hash, int status);
166 /* New, updated or removed address book entry */
167 void updateAddressBook(const QString &address, const QString &label, bool isMine, int status);
168 /* Current, immature or unconfirmed balance might have changed - emit 'balanceChanged' if so */
169 void pollBalanceChanged();
172 // Signal that balance in wallet changed
173 void balanceChanged(qint64 balance, qint64 stake, qint64 unconfirmedBalance, qint64 immatureBalance);
175 // Number of transactions in wallet changed
176 void numTransactionsChanged(int count);
178 // Encryption status of wallet changed
179 void encryptionStatusChanged(int status);
181 // Signal emitted when wallet needs to be unlocked
182 // It is valid behaviour for listeners to keep the wallet locked after this signal;
183 // this means that the unlocking failed or was cancelled.
184 void requireUnlock();
186 // Asynchronous error notification
187 void error(const QString &title, const QString &message, bool modal);
191 #endif // WALLETMODEL_H