mirror of
https://github.com/dashpay/dash.git
synced 2024-12-29 05:49:11 +01:00
9707ca5cea
* Merge #7506: Use CCoinControl selection in CWallet::FundTransactiond6cc6a1
Use CCoinControl selection in CWallet::FundTransaction (João Barbosa) * Merge #7732: [Qt] Debug window: replace "Build date" with "Datadir"fc737d1
[Qt] remove unused formatBuildDate method (Jonas Schnelli)4856f1d
[Qt] Debug window: replace "Build date" with "Datadir" (Jonas Schnelli) * Merge #7707: [RPC][QT] UI support for abandoned transactions8efed3b
[Qt] Support for abandoned/abandoning transactions (Jonas Schnelli) * Merge #7688: List solvability in listunspent output and improve helpc3932b3
List solvability in listunspent output and improve help (Pieter Wuille) * Merge #8006: Qt: Add option to disable the system tray icon8b0e497
Qt: Add option to hide the system tray icon (Tyler Hardin) * Merge #8073: qt: askpassphrasedialog: Clear pass fields on accept02ce2a3
qt: askpassphrasedialog: Clear pass fields on accept (Pavel Vasin) * Merge #8231: [Qt] fix a bug where the SplashScreen will not be hidden during startupb3e1348
[Qt] fix a bug where the SplashScreen will not be hidden during startup (Jonas Schnelli) * Merge #8257: Do not ask a UI question from bitcoind1acf1db
Do not ask a UI question from bitcoind (Pieter Wuille) * Merge #8463: [qt] Remove Priority from coincontrol dialogfa8dd78
[qt] Remove Priority from coincontrol dialog (MarcoFalke) * Merge #8678: [Qt][CoinControl] fix UI bug that could result in paying unexpected fee0480293
[Qt][CoinControl] fix UI bug that could result in paying unexpected fee (Jonas Schnelli) * Merge #8672: Qt: Show transaction size in transaction details windowc015634
qt: Adding transaction size to transaction details window (Hampus Sjöberg) \-- merge fix for s/size/total size/fdf82fb
Adding method GetTotalSize() to CTransaction (Hampus Sjöberg) * Merge #8371: [Qt] Add out-of-sync modal info layer08827df
[Qt] modalinfolayer: removed unused comments, renamed signal, code style overhaul (Jonas Schnelli)d8b062e
[Qt] only update "amount of blocks left" when the header chain is in-sync (Jonas Schnelli)e3245b4
[Qt] add out-of-sync modal info layer (Jonas Schnelli)e47052f
[Qt] ClientModel add method to get the height of the header chain (Jonas Schnelli)a001f18
[Qt] Always pass the numBlocksChanged signal for headers tip changed (Jonas Schnelli)bd44a04
[Qt] make Out-Of-Sync warning icon clickable (Jonas Schnelli)0904c3c
[Refactor] refactor function that forms human readable text out of a timeoffset (Jonas Schnelli) * Merge #8805: Trivial: Grammar and capitalizationc9ce17b
Trivial: Grammar and capitalization (Derek Miller) * Merge #8885: gui: fix ban from qt consolecb78c60
gui: fix ban from qt console (Cory Fields) * Merge #8821: [qt] sync-overlay: Don't block during reindexfa85e86
[qt] sync-overlay: Don't show estimated number of headers left (MarcoFalke)faa4de2
[qt] sync-overlay: Don't block during reindex (MarcoFalke) * Support themes for new transaction_abandoned icon * Fix constructor call to COutput * Merge #7842: RPC: do not print minping time in getpeerinfo when no ping received yet62a6486
RPC: do not print ping info in getpeerinfo when no ping received yet, fix help (Pavel Janík) * Merge #8918: Qt: Add "Copy URI" to payment request context menu21f5a63
Qt: Add "Copy URI" to payment request context menu (Luke Dashjr) * Merge #8925: qt: Display minimum ping in debug window.1724a40
Display minimum ping in debug window. (R E Broadley) * Merge #8972: [Qt] make warnings label selectable (jonasschnelli)ef0c9ee
[Qt] make warnings label selectable (Jonas Schnelli) * Make background of warning icon transparent in modaloverlay * Merge #9088: Reduce ambiguity of warning message77cbbd9
Make warning message about wallet balance possibly being incorrect less ambiguous. (R E Broadley) * Replace Bitcoin with Dash in modal overlay * Remove clicked signals from labelWalletStatus and labelTransactionsStatus As both are really just labels, clicking on those is not possible. This is different in Bitcoin, where these labels are actually buttons. * Pull out modaloverlay show/hide into it's own if/else block and switch to time based check Also don't use masternodeSync.IsBlockchainSynced() for now as it won't report the blockchain being synced before the first block (or other MN data?) arrives. This would otherwise give the impression that sync is being stuck.
286 lines
10 KiB
C++
286 lines
10 KiB
C++
// Copyright (c) 2011-2015 The Bitcoin Core developers
|
|
// Distributed under the MIT 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 "wallet/wallet.h"
|
|
#include "support/allocators/secure.h"
|
|
|
|
#include <map>
|
|
#include <vector>
|
|
|
|
#include <QObject>
|
|
|
|
class AddressTableModel;
|
|
class OptionsModel;
|
|
class PlatformStyle;
|
|
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), fSubtractFeeFromAmount(false), 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), 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!
|
|
QString address;
|
|
QString label;
|
|
AvailableCoinsType inputType;
|
|
bool fUseInstantSend;
|
|
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;
|
|
|
|
bool fSubtractFeeFromAmount; // memory only
|
|
|
|
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(const PlatformStyle *platformStyle, 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,
|
|
AbsurdFee,
|
|
PaymentRequestExpired
|
|
};
|
|
|
|
enum EncryptionStatus
|
|
{
|
|
Unencrypted, // !wallet->IsCrypted()
|
|
Locked, // wallet->IsCrypted() && wallet->IsLocked(true)
|
|
UnlockedForMixingOnly, // wallet->IsCrypted() && !wallet->IsLocked(true) && wallet->IsLocked()
|
|
Unlocked, // wallet->IsCrypted() && !wallet->IsLocked()
|
|
};
|
|
|
|
OptionsModel *getOptionsModel();
|
|
AddressTableModel *getAddressTableModel();
|
|
TransactionTableModel *getTransactionTableModel();
|
|
RecentRequestsTableModel *getRecentRequestsTableModel();
|
|
|
|
CAmount getBalance(const CCoinControl *coinControl = NULL) const;
|
|
CAmount getUnconfirmedBalance() const;
|
|
CAmount getImmatureBalance() const;
|
|
CAmount getAnonymizedBalance() const;
|
|
bool haveWatchOnly() const;
|
|
CAmount getWatchBalance() const;
|
|
CAmount getWatchUnconfirmedBalance() const;
|
|
CAmount getWatchImmatureBalance() const;
|
|
EncryptionStatus getEncryptionStatus() const;
|
|
|
|
// 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 fMixing=false);
|
|
bool changePassphrase(const SecureString &oldPass, const SecureString &newPass);
|
|
|
|
// Wallet backup
|
|
bool backupWallet(const QString &filename);
|
|
|
|
// RAI object for unlocking wallet, returned by requestUnlock()
|
|
class UnlockContext
|
|
{
|
|
public:
|
|
UnlockContext(WalletModel *wallet, bool valid, bool was_locked, bool was_mixing);
|
|
~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:
|
|
WalletModel *wallet;
|
|
bool valid;
|
|
mutable bool was_locked; // mutable, as it can be set to false by copying
|
|
mutable bool was_mixing; // mutable, as it can be set to false by copying
|
|
|
|
void CopyFrom(const UnlockContext& rhs);
|
|
};
|
|
|
|
UnlockContext requestUnlock(bool fForMixingOnly=false);
|
|
|
|
bool getPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const;
|
|
bool havePrivKey(const CKeyID &address) const;
|
|
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 loadReceiveRequests(std::vector<std::string>& vReceiveRequests);
|
|
bool saveReceiveRequest(const std::string &sAddress, const int64_t nId, const std::string &sRequest);
|
|
|
|
bool transactionCanBeAbandoned(uint256 hash) const;
|
|
bool abandonTransaction(uint256 hash) const;
|
|
|
|
bool hdEnabled() const;
|
|
|
|
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;
|
|
RecentRequestsTableModel *recentRequestsTableModel;
|
|
|
|
// Cache some values to be able to detect changes
|
|
CAmount cachedBalance;
|
|
CAmount cachedUnconfirmedBalance;
|
|
CAmount cachedImmatureBalance;
|
|
CAmount cachedAnonymizedBalance;
|
|
CAmount cachedWatchOnlyBalance;
|
|
CAmount cachedWatchUnconfBalance;
|
|
CAmount cachedWatchImmatureBalance;
|
|
EncryptionStatus cachedEncryptionStatus;
|
|
int cachedNumBlocks;
|
|
int cachedTxLocks;
|
|
int cachedPrivateSendRounds;
|
|
|
|
QTimer *pollTimer;
|
|
|
|
void subscribeToCoreSignals();
|
|
void unsubscribeFromCoreSignals();
|
|
void checkBalanceChanged();
|
|
|
|
Q_SIGNALS:
|
|
// Signal that balance in wallet changed
|
|
void balanceChanged(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& anonymizedBalance,
|
|
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(bool fForMixingOnly=false);
|
|
|
|
// 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);
|
|
|
|
public Q_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);
|
|
/* Watch-only added */
|
|
void updateWatchOnlyFlag(bool fHaveWatchonly);
|
|
/* Current, immature or unconfirmed balance might have changed - emit 'balanceChanged' if so */
|
|
void pollBalanceChanged();
|
|
};
|
|
|
|
#endif // BITCOIN_QT_WALLETMODEL_H
|