From c0a0fcaff004f8984c4778d56a82b0833e8105fe Mon Sep 17 00:00:00 2001
From: moneromooo-monero <moneromooo-monero@users.noreply.github.com>
Date: Sun, 25 Dec 2016 12:31:50 +0000
Subject: [PATCH] wallet2_api: some new APIs to access daemon state

---
 src/wallet/api/wallet_manager.cpp | 33 ++++++++++++++++++++++++++++++-
 src/wallet/api/wallet_manager.h   |  4 +++-
 src/wallet/wallet2_api.h          |  6 ++++++
 3 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/src/wallet/api/wallet_manager.cpp b/src/wallet/api/wallet_manager.cpp
index 4ee5ab8df..e0ec3d062 100644
--- a/src/wallet/api/wallet_manager.cpp
+++ b/src/wallet/api/wallet_manager.cpp
@@ -137,7 +137,7 @@ void WalletManagerImpl::setDaemonAddress(const std::string &address)
     m_daemonAddress = address;
 }
 
-bool WalletManagerImpl::connected(uint32_t *version = NULL) const
+bool WalletManagerImpl::connected(uint32_t *version) const
 {
     epee::json_rpc::request<cryptonote::COMMAND_RPC_GET_VERSION::request> req_t = AUTO_VAL_INIT(req_t);
     epee::json_rpc::response<cryptonote::COMMAND_RPC_GET_VERSION::response, std::string> resp_t = AUTO_VAL_INIT(resp_t);
@@ -352,6 +352,37 @@ double WalletManagerImpl::miningHashRate() const
     return mres.speed;
 }
 
+void WalletManagerImpl::hardForkInfo(uint8_t &version, uint64_t &earliest_height) const
+{
+    epee::json_rpc::request<cryptonote::COMMAND_RPC_HARD_FORK_INFO::request> req_t = AUTO_VAL_INIT(req_t);
+    epee::json_rpc::response<cryptonote::COMMAND_RPC_HARD_FORK_INFO::response, std::string> resp_t = AUTO_VAL_INIT(resp_t);
+
+    version = 0;
+    earliest_height = 0;
+
+    epee::net_utils::http::http_simple_client http_client;
+    req_t.jsonrpc = "2.0";
+    req_t.id = epee::serialization::storage_entry(0);
+    req_t.method = "hard_fork_info";
+    req_t.params.version = 0;
+    bool r = epee::net_utils::invoke_http_json_remote_command2(m_daemonAddress + "/json_rpc", req_t, resp_t, http_client);
+    if (!r || resp_t.result.status != CORE_RPC_STATUS_OK)
+        return;
+    version = resp_t.result.version;
+    earliest_height = resp_t.result.earliest_height;
+}
+
+uint64_t WalletManagerImpl::blockTarget() const
+{
+    cryptonote::COMMAND_RPC_GET_INFO::request ireq;
+    cryptonote::COMMAND_RPC_GET_INFO::response ires;
+
+    epee::net_utils::http::http_simple_client http_client;
+    if (!epee::net_utils::invoke_http_json_remote_command2(m_daemonAddress + "/getinfo", ireq, ires, http_client))
+        return 0;
+    return ires.target;
+}
+
 std::string WalletManagerImpl::resolveOpenAlias(const std::string &address, bool &dnssec_valid) const
 {
     std::vector<std::string> addresses = tools::wallet2::addresses_from_url(address, dnssec_valid);
diff --git a/src/wallet/api/wallet_manager.h b/src/wallet/api/wallet_manager.h
index 214afc3fa..01752f69b 100644
--- a/src/wallet/api/wallet_manager.h
+++ b/src/wallet/api/wallet_manager.h
@@ -46,12 +46,14 @@ public:
     std::vector<std::string> findWallets(const std::string &path);
     std::string errorString() const;
     void setDaemonAddress(const std::string &address);
-    bool connected(uint32_t *version) const;
+    bool connected(uint32_t *version = NULL) const;
     bool checkPayment(const std::string &address, const std::string &txid, const std::string &txkey, const std::string &daemon_address, uint64_t &received, uint64_t &height, std::string &error) const;
     uint64_t blockchainHeight() const;
     uint64_t blockchainTargetHeight() const;
     uint64_t networkDifficulty() const;
     double miningHashRate() const;
+    void hardForkInfo(uint8_t &version, uint64_t &earliest_height) const;
+    uint64_t blockTarget() const;
     std::string resolveOpenAlias(const std::string &address, bool &dnssec_valid) const;
 
 private:
diff --git a/src/wallet/wallet2_api.h b/src/wallet/wallet2_api.h
index 2e1d95b58..a7162afcb 100644
--- a/src/wallet/wallet2_api.h
+++ b/src/wallet/wallet2_api.h
@@ -562,6 +562,12 @@ struct WalletManager
     //! returns current mining hash rate (0 if not mining)
     virtual double miningHashRate() const = 0;
 
+    //! returns current hard fork info
+    virtual void hardForkInfo(uint8_t &version, uint64_t &earliest_height) const = 0;
+
+    //! returns current block target
+    virtual uint64_t blockTarget() const = 0;
+
     //! resolves an OpenAlias address to a monero address
     virtual std::string resolveOpenAlias(const std::string &address, bool &dnssec_valid) const = 0;
 };