/src/qt/walletmodel.h
C Header | 298 lines | 204 code | 52 blank | 42 comment | 4 complexity | 6a430ba7a8404c4657dd2ab62a0cf3c5 MD5 | raw file
Possible License(s): MIT, 0BSD, GPL-3.0, BSD-3-Clause
- // Copyright (c) 2011-2014 The Bitcoin developers
- // Distributed under the MIT/X11 software license, see the accompanying
- // file COPYING or http://www.opensource.org/licenses/mit-license.php.
- #ifndef BITCOIN_QT_WALLETMODEL_H
- #define BITCOIN_QT_WALLETMODEL_H
- #include "paymentrequestplus.h"
- #include "walletmodeltransaction.h"
- #include "allocators.h" /* for SecureString */
- #include "swiftnode.h"
- #include "wallet.h"
- #include <map>
- #include <vector>
- #include <QObject>
- class AddressTableModel;
- class OptionsModel;
- class RecentRequestsTableModel;
- class TransactionTableModel;
- class WalletModelTransaction;
- class CCoinControl;
- class CKeyID;
- class COutPoint;
- class COutput;
- class CPubKey;
- class CWallet;
- class uint256;
- QT_BEGIN_NAMESPACE
- class QTimer;
- QT_END_NAMESPACE
- class SendCoinsRecipient
- {
- public:
- explicit SendCoinsRecipient() : amount(0), nVersion(SendCoinsRecipient::CURRENT_VERSION) {}
- explicit SendCoinsRecipient(const QString& addr, const QString& label, const CAmount& amount, const QString& message) : address(addr), label(label), amount(amount), message(message), nVersion(SendCoinsRecipient::CURRENT_VERSION) {}
- // If from an insecure payment request, this is used for storing
- // the addresses, e.g. address-A<br />address-B<br />address-C.
- // Info: As we don't need to process addresses in here when using
- // payment requests, we can abuse it for displaying an address list.
- // Todo: This is a hack, should be replaced with a cleaner solution!
- QString address;
- QString label;
- AvailableCoinsType inputType;
- bool useSwiftNode;
- CAmount amount;
- // If from a payment request, this is used for storing the memo
- QString message;
- // If from a payment request, paymentRequest.IsInitialized() will be true
- PaymentRequestPlus paymentRequest;
- // Empty if no authentication or invalid signature/cert/etc.
- QString authenticatedMerchant;
- static const int CURRENT_VERSION = 1;
- int nVersion;
- ADD_SERIALIZE_METHODS;
- template <typename Stream, typename Operation>
- inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion)
- {
- std::string sAddress = address.toStdString();
- std::string sLabel = label.toStdString();
- std::string sMessage = message.toStdString();
- std::string sPaymentRequest;
- if (!ser_action.ForRead() && paymentRequest.IsInitialized())
- paymentRequest.SerializeToString(&sPaymentRequest);
- std::string sAuthenticatedMerchant = authenticatedMerchant.toStdString();
- READWRITE(this->nVersion);
- nVersion = this->nVersion;
- READWRITE(sAddress);
- READWRITE(sLabel);
- READWRITE(amount);
- READWRITE(sMessage);
- READWRITE(sPaymentRequest);
- READWRITE(sAuthenticatedMerchant);
- if (ser_action.ForRead()) {
- address = QString::fromStdString(sAddress);
- label = QString::fromStdString(sLabel);
- message = QString::fromStdString(sMessage);
- if (!sPaymentRequest.empty())
- paymentRequest.parse(QByteArray::fromRawData(sPaymentRequest.data(), sPaymentRequest.size()));
- authenticatedMerchant = QString::fromStdString(sAuthenticatedMerchant);
- }
- }
- };
- /** Interface to Bitcoin wallet from Qt view code. */
- class WalletModel : public QObject
- {
- Q_OBJECT
- public:
- explicit WalletModel(CWallet* wallet, OptionsModel* optionsModel, QObject* parent = 0);
- ~WalletModel();
- enum StatusCode // Returned by sendCoins
- {
- OK,
- InvalidAmount,
- InvalidAddress,
- AmountExceedsBalance,
- AmountWithFeeExceedsBalance,
- DuplicateAddress,
- TransactionCreationFailed, // Error returned when wallet is still locked
- TransactionCommitFailed,
- AnonymizeOnlyUnlocked,
- InsaneFee
- };
- enum EncryptionStatus {
- Unencrypted, // !wallet->IsCrypted()
- Locked, // wallet->IsCrypted() && wallet->IsLocked()
- Unlocked, // wallet->IsCrypted() && !wallet->IsLocked()
- UnlockedForAnonymizationOnly // wallet->IsCrypted() && !wallet->IsLocked() && wallet->fWalletUnlockAnonymizeOnly
- };
- OptionsModel* getOptionsModel();
- AddressTableModel* getAddressTableModel();
- TransactionTableModel* getTransactionTableModel();
- RecentRequestsTableModel* getRecentRequestsTableModel();
- CAmount getBalance(const CCoinControl* coinControl = NULL) const;
- CAmount getUnconfirmedBalance() const;
- CAmount getImmatureBalance() const;
- CAmount getLockedBalance() const;
- CAmount getZerocoinBalance() const;
- CAmount getUnconfirmedZerocoinBalance() const;
- CAmount getImmatureZerocoinBalance() const;
- bool haveWatchOnly() const;
- CAmount getWatchBalance() const;
- CAmount getWatchUnconfirmedBalance() const;
- CAmount getWatchImmatureBalance() const;
- EncryptionStatus getEncryptionStatus() const;
- CKey generateNewKey() const; //for temporary paper wallet key generation
- bool setAddressBook(const CTxDestination& address, const string& strName, const string& strPurpose);
- void encryptKey(const CKey key, const std::string& pwd, const std::string& slt, std::vector<unsigned char>& crypted);
- void decryptKey(const std::vector<unsigned char>& crypted, const std::string& slt, const std::string& pwd, CKey& key);
- void emitBalanceChanged(); // Force update of UI-elements even when no values have changed
- // Check address for validity
- bool validateAddress(const QString& address);
- // Return status record for SendCoins, contains error id + information
- struct SendCoinsReturn {
- SendCoinsReturn(StatusCode status = OK) : status(status) {}
- StatusCode status;
- };
- // prepare transaction for getting txfee before sending coins
- SendCoinsReturn prepareTransaction(WalletModelTransaction& transaction, const CCoinControl* coinControl = NULL);
- // Send coins to a list of recipients
- SendCoinsReturn sendCoins(WalletModelTransaction& transaction);
- // Wallet encryption
- bool setWalletEncrypted(bool encrypted, const SecureString& passphrase);
- // Passphrase only needed when unlocking
- bool setWalletLocked(bool locked, const SecureString& passPhrase = SecureString(), bool anonymizeOnly = false);
- bool changePassphrase(const SecureString& oldPass, const SecureString& newPass);
- // Is wallet unlocked for anonymization only?
- bool isAnonymizeOnlyUnlocked();
- // Wallet backup
- bool backupWallet(const QString& filename);
- // RAI object for unlocking wallet, returned by requestUnlock()
- class UnlockContext
- {
- public:
- UnlockContext(bool valid, bool relock);
- ~UnlockContext();
- bool isValid() const { return valid; }
- // Copy operator and constructor transfer the context
- UnlockContext(const UnlockContext& obj) { CopyFrom(obj); }
- UnlockContext& operator=(const UnlockContext& rhs)
- {
- CopyFrom(rhs);
- return *this;
- }
- private:
- bool valid;
- mutable bool relock; // mutable, as it can be set to false by copying
- void CopyFrom(const UnlockContext& rhs);
- };
- UnlockContext requestUnlock(bool relock = false);
- bool getPubKey(const CKeyID& address, CPubKey& vchPubKeyOut) const;
- bool isMine(CBitcoinAddress address);
- void getOutputs(const std::vector<COutPoint>& vOutpoints, std::vector<COutput>& vOutputs);
- bool isSpent(const COutPoint& outpoint) const;
- void listCoins(std::map<QString, std::vector<COutput> >& mapCoins) const;
- bool isLockedCoin(uint256 hash, unsigned int n) const;
- void lockCoin(COutPoint& output);
- void unlockCoin(COutPoint& output);
- void listLockedCoins(std::vector<COutPoint>& vOutpts);
- void listZerocoinMints(std::list<CZerocoinMint>& listMints, bool fUnusedOnly = false, bool fMaturedOnly = false, bool fUpdateStatus = false);
- void loadReceiveRequests(std::vector<std::string>& vReceiveRequests);
- bool saveReceiveRequest(const std::string& sAddress, const int64_t nId, const std::string& sRequest);
- private:
- CWallet* wallet;
- bool fHaveWatchOnly;
- bool fHaveMultiSig;
- bool fForceCheckBalanceChanged;
- // Wallet has an options model for wallet-specific options
- // (transaction fee, for example)
- OptionsModel* optionsModel;
- AddressTableModel* addressTableModel;
- TransactionTableModel* transactionTableModel;
- RecentRequestsTableModel* recentRequestsTableModel;
- // Cache some values to be able to detect changes
- CAmount cachedBalance;
- CAmount cachedUnconfirmedBalance;
- CAmount cachedImmatureBalance;
- CAmount cachedZerocoinBalance;
- CAmount cachedUnconfirmedZerocoinBalance;
- CAmount cachedImmatureZerocoinBalance;
- CAmount cachedWatchOnlyBalance;
- CAmount cachedWatchUnconfBalance;
- CAmount cachedWatchImmatureBalance;
- EncryptionStatus cachedEncryptionStatus;
- int cachedNumBlocks;
- int cachedTxLocks;
- int cachedZeromintPercentage;
- QTimer* pollTimer;
- void subscribeToCoreSignals();
- void unsubscribeFromCoreSignals();
- void checkBalanceChanged();
- signals:
- // Signal that balance in wallet changed
- void balanceChanged(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance,
- const CAmount& zerocoinBalance, const CAmount& unconfirmedZerocoinBalance, const CAmount& immatureZerocoinBalance,
- const CAmount& watchOnlyBalance, const CAmount& watchUnconfBalance, const CAmount& watchImmatureBalance);
- // Encryption status of wallet changed
- void encryptionStatusChanged(int status);
- // Signal emitted when wallet needs to be unlocked
- // It is valid behaviour for listeners to keep the wallet locked after this signal;
- // this means that the unlocking failed or was cancelled.
- void requireUnlock();
- // Fired when a message should be reported to the user
- void message(const QString& title, const QString& message, unsigned int style);
- // Coins sent: from wallet, to recipient, in (serialized) transaction:
- void coinsSent(CWallet* wallet, SendCoinsRecipient recipient, QByteArray transaction);
- // Show progress dialog e.g. for rescan
- void showProgress(const QString& title, int nProgress);
- // Watch-only address added
- void notifyWatchonlyChanged(bool fHaveWatchonly);
- // MultiSig address added
- void notifyMultiSigChanged(bool fHaveMultiSig);
- public slots:
- /* Wallet status might have changed */
- void updateStatus();
- /* New transaction, or transaction changed status */
- void updateTransaction();
- /* New, updated or removed address book entry */
- void updateAddressBook(const QString& address, const QString& label, bool isMine, const QString& purpose, int status);
- /* Zerocoin update */
- void updateAddressBook(const QString &pubCoin, const QString &isUsed, int status);
- /* Watch-only added */
- void updateWatchOnlyFlag(bool fHaveWatchonly);
- /* MultiSig added */
- void updateMultiSigFlag(bool fHaveMultiSig);
- /* Current, immature or unconfirmed balance might have changed - emit 'balanceChanged' if so */
- void pollBalanceChanged();
- };
- #endif // BITCOIN_QT_WALLETMODEL_H