diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index 16321a5a..4d35bc40 100644 --- a/src/wallet/api/wallet.cpp +++ b/src/wallet/api/wallet.cpp @@ -438,6 +438,23 @@ uint64_t WalletImpl::daemonBlockChainHeight() const return result; } +uint64_t WalletImpl::daemonBlockChainTargetHeight() const +{ + std::string err; + uint64_t result = m_wallet->get_daemon_blockchain_target_height(err); + if (!err.empty()) { + LOG_ERROR(__FUNCTION__ << ": " << err); + result = 0; + m_errorString = err; + m_status = Status_Error; + + } else { + m_status = Status_Ok; + m_errorString = ""; + } + return result; +} + bool WalletImpl::refresh() { clearStatus(); diff --git a/src/wallet/api/wallet.h b/src/wallet/api/wallet.h index 5706b2bf..c399e3ab 100644 --- a/src/wallet/api/wallet.h +++ b/src/wallet/api/wallet.h @@ -77,6 +77,7 @@ public: uint64_t unlockedBalance() const; uint64_t blockChainHeight() const; uint64_t daemonBlockChainHeight() const; + uint64_t daemonBlockChainTargetHeight() const; bool refresh(); void refreshAsync(); void setAutoRefreshInterval(int millis); diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index be55427f..e3736bc3 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -4266,6 +4266,38 @@ uint64_t wallet2::get_daemon_blockchain_height(string &err) return res.height; } +uint64_t wallet2::get_daemon_blockchain_target_height(string &err) +{ + epee::json_rpc::request req_t = AUTO_VAL_INIT(req_t); + epee::json_rpc::response resp_t = AUTO_VAL_INIT(resp_t); + m_daemon_rpc_mutex.lock(); + req_t.jsonrpc = "2.0"; + req_t.id = epee::serialization::storage_entry(0); + req_t.method = "get_info"; + bool ok = net_utils::invoke_http_json_remote_command2(m_daemon_address + "/json_rpc", req_t, resp_t, m_http_client); + m_daemon_rpc_mutex.unlock(); + if (ok) + { + if (resp_t.result.status == CORE_RPC_STATUS_BUSY) + { + err = "daemon is busy. Please try again later."; + } + else if (resp_t.result.status != CORE_RPC_STATUS_OK) + { + err = resp_t.result.status; + } + else // success, cleaning up error message + { + err = ""; + } + } + else + { + err = "possibly lost connection to daemon"; + } + return resp_t.result.target_height; +} + void wallet2::set_tx_note(const crypto::hash &txid, const std::string ¬e) { m_tx_notes[txid] = note; diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index db5962bd..2754f4b0 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -456,6 +456,7 @@ namespace tools std::string get_keys_file() const; std::string get_daemon_address() const; uint64_t get_daemon_blockchain_height(std::string& err); + uint64_t get_daemon_blockchain_target_height(std::string& err); std::vector select_available_outputs_from_histogram(uint64_t count, bool atleast, bool unlocked, bool trusted_daemon); std::vector select_available_outputs(const std::function &f); diff --git a/src/wallet/wallet2_api.h b/src/wallet/wallet2_api.h index 08e2ae16..8d522300 100644 --- a/src/wallet/wallet2_api.h +++ b/src/wallet/wallet2_api.h @@ -248,6 +248,12 @@ struct Wallet */ virtual uint64_t daemonBlockChainHeight() const = 0; + /** + * @brief daemonBlockChainTargetHeight - returns daemon blockchain target height + * @return 0 - in case error communicating with the daemon. + * status() will return Status_Error and errorString() will return verbose error description + */ + virtual uint64_t daemonBlockChainTargetHeight() const = 0; static std::string displayAmount(uint64_t amount); static uint64_t amountFromString(const std::string &amount);