Files
thehub/hub-qt/walletmodel.h
T

285 lines
10 KiB
C++
Raw Permalink Normal View History

2017-11-09 19:34:51 +01:00
/*
* This file is part of the Flowee project
* Copyright (C) 2011-2015 The Bitcoin Core developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
2013-11-04 16:20:43 +01:00
2018-01-16 10:47:52 +00:00
#ifndef FLOWEE_QT_WALLETMODEL_H
#define FLOWEE_QT_WALLETMODEL_H
2013-04-13 00:13:08 -05:00
#include "paymentrequestplus.h"
#include "walletmodeltransaction.h"
2015-01-22 15:02:44 -05:00
#include "support/allocators/secure.h"
2013-08-12 17:03:03 +02:00
#include <map>
#include <vector>
#include <QObject>
2013-04-13 00:13:08 -05:00
class AddressTableModel;
2013-04-13 00:13:08 -05:00
class OptionsModel;
2015-07-28 15:20:14 +02:00
class PlatformStyle;
2013-11-05 18:03:05 +01:00
class RecentRequestsTableModel;
class TransactionTableModel;
class WalletModelTransaction;
class CCoinControl;
class CKeyID;
class COutPoint;
class COutput;
class CPubKey;
2013-04-13 00:13:08 -05:00
class CWallet;
class uint256;
2013-04-13 00:13:08 -05:00
QT_BEGIN_NAMESPACE
class QTimer;
QT_END_NAMESPACE
2012-03-18 23:14:03 +01:00
class SendCoinsRecipient
2011-07-16 19:01:05 +02:00
{
2012-03-18 23:14:03 +01:00
public:
2014-07-23 14:34:36 +02:00
explicit SendCoinsRecipient() : amount(0), fSubtractFeeFromAmount(false), nVersion(SendCoinsRecipient::CURRENT_VERSION) { }
2021-01-20 19:21:53 +01:00
explicit SendCoinsRecipient(const QString &addr, const QString &label, const int64_t& amount, const QString &message):
2014-07-23 14:34:36 +02:00
address(addr), label(label), amount(amount), message(message), fSubtractFeeFromAmount(false), nVersion(SendCoinsRecipient::CURRENT_VERSION) {}
// If from an unauthenticated 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!
2011-07-16 19:01:05 +02:00
QString address;
QString label;
2021-01-20 19:21:53 +01:00
int64_t amount;
// If from a payment request, this is used for storing the memo
2013-10-18 13:44:27 +02:00
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;
2014-07-23 14:34:36 +02:00
bool fSubtractFeeFromAmount; // memory only
2014-01-22 09:46:15 +01:00
static const int CURRENT_VERSION = 1;
int nVersion;
2017-01-19 21:40:34 +01:00
ADD_SERIALIZE_METHODS
2014-08-20 08:42:31 +02:00
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);
}
2014-08-20 08:42:31 +02:00
}
2011-07-16 19:01:05 +02:00
};
2011-11-13 13:19:52 +01:00
/** Interface to Bitcoin wallet from Qt view code. */
class WalletModel : public QObject
{
Q_OBJECT
2013-01-23 21:51:02 +01:00
public:
2015-07-28 15:20:14 +02:00
explicit WalletModel(const PlatformStyle *platformStyle, CWallet *wallet, OptionsModel *optionsModel, QObject *parent = 0);
2012-05-06 19:40:58 +02:00
~WalletModel();
2011-08-31 16:08:31 +02:00
enum StatusCode // Returned by sendCoins
{
OK,
InvalidAmount,
InvalidAddress,
AmountExceedsBalance,
AmountWithFeeExceedsBalance,
2011-07-16 19:01:05 +02:00
DuplicateAddress,
2011-08-31 16:08:31 +02:00
TransactionCreationFailed, // Error returned when wallet is still locked
2014-11-02 00:14:47 +01:00
TransactionCommitFailed,
AbsurdFee,
PaymentRequestExpired
};
enum EncryptionStatus
{
Unencrypted, // !wallet->IsCrypted()
Locked, // wallet->IsCrypted() && wallet->IsLocked()
Unlocked // wallet->IsCrypted() && !wallet->IsLocked()
};
OptionsModel *getOptionsModel();
AddressTableModel *getAddressTableModel();
TransactionTableModel *getTransactionTableModel();
2013-11-05 18:03:05 +01:00
RecentRequestsTableModel *getRecentRequestsTableModel();
2021-01-20 19:21:53 +01:00
int64_t getBalance(const CCoinControl *coinControl = NULL) const;
int64_t getUnconfirmedBalance() const;
int64_t getImmatureBalance() const;
bool haveWatchOnly() const;
2021-01-20 19:21:53 +01:00
int64_t getWatchBalance() const;
int64_t getWatchUnconfirmedBalance() const;
int64_t getWatchImmatureBalance() const;
EncryptionStatus getEncryptionStatus() const;
2011-07-16 19:01:05 +02:00
// Check address for validity
bool validateAddress(const QString &address);
2011-08-08 17:38:17 +02:00
// Return status record for SendCoins, contains error id + information
2011-07-16 19:01:05 +02:00
struct SendCoinsReturn
{
SendCoinsReturn(StatusCode status = OK):
status(status) {}
2011-07-16 19:01:05 +02:00
StatusCode status;
};
// prepare transaction for getting txfee before sending coins
SendCoinsReturn prepareTransaction(WalletModelTransaction &transaction, const CCoinControl *coinControl = NULL);
2011-08-08 17:38:17 +02:00
// 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 changePassphrase(const SecureString &oldPass, const SecureString &newPass);
2012-02-14 23:14:43 +11:00
// Wallet backup
bool backupWallet(const QString &filename);
// RAI object for unlocking wallet, returned by requestUnlock()
class UnlockContext
{
public:
UnlockContext(WalletModel *wallet, bool valid, bool relock);
~UnlockContext();
bool isValid() const { return valid; }
2011-08-31 16:08:31 +02:00
// Copy operator and constructor transfer the context
UnlockContext(const UnlockContext& obj) { CopyFrom(obj); }
UnlockContext& operator=(const UnlockContext& rhs) { CopyFrom(rhs); return *this; }
private:
WalletModel *wallet;
bool valid;
mutable bool relock; // mutable, as it can be set to false by copying
void CopyFrom(const UnlockContext& rhs);
};
UnlockContext requestUnlock();
2013-08-12 17:03:03 +02:00
bool getPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const;
bool havePrivKey(const CKeyID &address) const;
2013-08-12 17:03:03 +02:00
void getOutputs(const std::vector<COutPoint>& vOutpoints, std::vector<COutput>& vOutputs);
2014-02-15 16:38:28 -05:00
bool isSpent(const COutPoint& outpoint) const;
2013-08-12 17:03:03 +02:00
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 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 fForceCheckBalanceChanged;
// Wallet has an options model for wallet-specific options
// (transaction fee, for example)
OptionsModel *optionsModel;
AddressTableModel *addressTableModel;
TransactionTableModel *transactionTableModel;
2013-11-05 18:03:05 +01:00
RecentRequestsTableModel *recentRequestsTableModel;
2011-08-31 16:08:31 +02:00
// Cache some values to be able to detect changes
2021-01-20 19:21:53 +01:00
int64_t cachedBalance;
int64_t cachedUnconfirmedBalance;
int64_t cachedImmatureBalance;
int64_t cachedWatchOnlyBalance;
int64_t cachedWatchUnconfBalance;
int64_t cachedWatchImmatureBalance;
EncryptionStatus cachedEncryptionStatus;
int cachedNumBlocks;
QTimer *pollTimer;
2012-05-06 19:40:58 +02:00
void subscribeToCoreSignals();
void unsubscribeFromCoreSignals();
void checkBalanceChanged();
2015-07-14 13:59:05 +02:00
Q_SIGNALS:
2011-08-31 16:08:31 +02:00
// Signal that balance in wallet changed
2021-01-20 19:21:53 +01:00
void balanceChanged(const int64_t& balance, const int64_t& unconfirmedBalance, const int64_t& immatureBalance,
const int64_t& watchOnlyBalance, const int64_t& watchUnconfBalance, const int64_t& watchImmatureBalance);
2011-08-31 16:08:31 +02:00
// Encryption status of wallet changed
void encryptionStatusChanged(int status);
2011-08-31 16:08:31 +02:00
// 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);
2014-03-19 00:26:14 +01:00
// Show progress dialog e.g. for rescan
void showProgress(const QString &title, int nProgress);
// Watch-only address added
void notifyWatchonlyChanged(bool fHaveWatchonly);
2015-07-14 13:59:05 +02:00
public Q_SLOTS:
2012-05-05 16:07:14 +02:00
/* Wallet status might have changed */
void updateStatus();
/* New transaction, or transaction changed status */
void updateTransaction();
2012-05-05 16:07:14 +02:00
/* New, updated or removed address book entry */
void updateAddressBook(const QString &address, const QString &label, bool isMine, const QString &purpose, int status);
2014-08-28 23:20:46 +02:00
/* Watch-only added */
void updateWatchOnlyFlag(bool fHaveWatchonly);
/* Current, immature or unconfirmed balance might have changed - emit 'balanceChanged' if so */
void pollBalanceChanged();
};
2018-01-16 10:47:52 +00:00
#endif