// Copyright 2019-2022 The Hush developers // Released under the GPLv3 #ifndef RPCCLIENT_H #define RPCCLIENT_H #include "precompiled.h" #include "balancestablemodel.h" #include "txtablemodel.h" #include "peerstablemodel.h" #include "bannedpeerstablemodel.h" #include "ui_mainwindow.h" #include "mainwindow.h" #include "connection.h" struct TransactionItem { QString type; qint64 datetime; QString address; QString txid; double amount; unsigned long confirmations; QString fromAddr; QString memo; }; struct BannedPeerItem { QString address; QString subnet; qint64 banned_until; qint64 asn; }; struct PeerItem { qint64 peerid; QString type; qint64 conntime; QString address; qint64 asn; QString tls_cipher; bool tls_verified; qint64 banscore; qint64 protocolversion; QString subver; qint64 bytes_received; qint64 bytes_sent; double pingtime; }; struct WatchedTx { QString opid; Tx tx; std::function completed; std::function error; }; class RPC { public: RPC(MainWindow* main); ~RPC(); void setConnection(Connection* c); void setEHushd(std::shared_ptr p); const QProcess* getEHushD() { return ehushd.get(); } void refresh(bool force = false); void pauseTimer(); void restartTimer(); void refreshAddresses(); void refreshRescan(); void refreshPeers(); void setban(QString ip, QString command, const std::function& cb); void clearBanned(const std::function& cb); void checkForUpdate(bool silent = true); void refreshPrice(); void executeTransaction(Tx tx, const std::function submitted, const std::function computed, const std::function error); void fillTxJsonParams(QJsonArray& params, Tx tx); void sendZTransaction(QJsonValue params, const std::function& cb, const std::function& err); void shieldCoinbase(QJsonArray& params, const std::function& cb, const std::function& err); void mergeToAddress(QJsonArray& params, const std::function& cb, const std::function& err); void watchTxStatus(); const QMap getWatchingTxns() { return watchingOps; } void addNewTxToWatch(const QString& newOpid, WatchedTx wtx); const TxTableModel* getTransactionsModel() { return transactionsTableModel; } const PeersTableModel* getPeersModel() { return peersTableModel; } const QList* getAllZAddresses() { return zaddresses; } const QList* getAllTAddresses() { return taddresses; } const QList* getUTXOs() { return utxos; } const QMap* getAllBalances() { return allBalances; } const QMap* getUsedAddresses() { return usedAddresses; } void newZaddr(const std::function& cb); void newTaddr(const std::function& cb); void z_viewtransaction(QString txid, const std::function& cb); void getrawtransaction(QString txid, const std::function& cb); void setGenerate(int proclimit, const std::function& cb); void stopGenerate(int proclimit, const std::function& cb); void getZPrivKey(QString addr, const std::function& cb); void getZViewKey(QString addr, const std::function& cb); void getTPrivKey(QString addr, const std::function& cb); void importZPrivKey(QString addr, bool rescan, const std::function& cb); void importTPrivKey(QString addr, bool rescan, const std::function& cb); void validateAddress(QString address, const std::function& cb); void getBlock(QString height, const std::function& cb); void shutdownHushd(); void noConnection(); bool isEmbedded() { return ehushd != nullptr; } QString getDefaultSaplingAddress(); QString getDefaultTAddress(); void getAllPrivKeys(const std::function>)>); Connection* getConnection() { return conn; } void rescan(qint64 height, const std::function& cb); void getRescanInfo(const std::function& cb); void help(const std::function& cb); void getnetworksolps(const std::function& cb); void getlocalsolps(const std::function& cb); private: void refreshBalances(); void refreshTransactions(); void refreshSentZTrans(); void refreshReceivedZTrans(QList zaddresses); bool processUnspent (const QJsonValue& reply, QMap* newBalances, QList* newUtxos); void updateUI (bool anyUnconfirmed); void getInfoThenRefresh(bool force); void getBalance(const std::function& cb); QJsonValue makePayload(QString method, QString param, QString param2); QJsonValue makePayload(QString method, QString param); QJsonValue makePayload(QString method, int param); QJsonValue makePayload(QString method); void getTransparentUnspent (const std::function& cb); void getZUnspent (const std::function& cb); void getTransactions (const std::function& cb); void listBanned (const std::function& cb); void getPeerInfo (const std::function& cb); void getZAddresses (const std::function& cb); void getTAddresses (const std::function& cb); void z_sweepstatus (const std::function& cb); void z_consolidationstatus (const std::function& cb); Connection* conn = nullptr; std::shared_ptr ehushd = nullptr; QList* utxos = nullptr; QMap* allBalances = nullptr; QMap* usedAddresses = nullptr; QList* zaddresses = nullptr; QList* taddresses = nullptr; QMap watchingOps; TxTableModel* transactionsTableModel = nullptr; PeersTableModel* peersTableModel = nullptr; BannedPeersTableModel* bannedPeersTableModel = nullptr; BalancesTableModel* balancesTableModel = nullptr; QTimer* timer; QTimer* txTimer; QTimer* priceTimer; QTimer* rescanTimer; Ui::MainWindow* ui; MainWindow* main; // Current balance in the UI. If this number updates, then refresh the UI QString currentBalance; }; #endif // RPCCLIENT_H