diff --git a/src/wallet/wallet_public_structs_defs.h b/src/wallet/wallet_public_structs_defs.h index d2b3862a..764ee1b4 100644 --- a/src/wallet/wallet_public_structs_defs.h +++ b/src/wallet/wallet_public_structs_defs.h @@ -5,6 +5,7 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #pragma once +#include #include "currency_protocol/currency_protocol_defs.h" #include "currency_core/currency_basic.h" #include "crypto/hash.h" @@ -236,6 +237,66 @@ namespace wallet_public }; }; + + struct wallet_provision_info + { + uint64_t transfers_count; + uint64_t transfer_entries_count; + uint64_t balance; + uint64_t unlocked_balance; + + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(transfers_count) + KV_SERIALIZE(transfer_entries_count) + KV_SERIALIZE(balance) + KV_SERIALIZE(unlocked_balance) + END_KV_SERIALIZE_MAP() + }; + + struct COMMAND_RPC_GET_RECENT_TXS_AND_INFO + { + struct request + { + + /* + if offset is 0, then GET_RECENT_TXS_AND_INFO return + unconfirmed transactions as the first first items of "transfers", + this unconfirmed transactions is not counted regarding "count" parameter + */ + uint64_t offset; + uint64_t count; + + /* + need_to_get_info - should backend re-calculate balance(could be relatively heavy, + and not needed when getting long tx history with multiple calls + of GET_RECENT_TXS_AND_INFO with offsets) + */ + bool update_provision_info; + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(offset) + KV_SERIALIZE(count) + KV_SERIALIZE(update_provision_info) + END_KV_SERIALIZE_MAP() + }; + + struct response + { + wallet_provision_info pi; + std::vector transfers; + uint64_t total_transfers; + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(pi) + KV_SERIALIZE(transfers) + KV_SERIALIZE(total_transfers) + END_KV_SERIALIZE_MAP() + }; + }; + + + struct trnsfer_destination { diff --git a/src/wallet/wallet_rpc_server.cpp b/src/wallet/wallet_rpc_server.cpp index a90de9dd..1cf0dbc2 100644 --- a/src/wallet/wallet_rpc_server.cpp +++ b/src/wallet/wallet_rpc_server.cpp @@ -209,6 +209,31 @@ namespace tools return false; } } + bool wallet_rpc_server::on_get_recent_txs_and_info(const wallet_public::COMMAND_RPC_GET_RECENT_TXS_AND_INFO::request& req, wallet_public::COMMAND_RPC_GET_RECENT_TXS_AND_INFO::response& res, epee::json_rpc::error& er, connection_context& cntx) + { + try + { + if (req.update_provision_info) + { + res.pi.balance = m_wallet.balance(res.pi.unlocked_balance); + res.pi.transfer_entries_count = m_wallet.get_transfer_entries_count(); + res.pi.transfers_count = m_wallet.get_recent_transfers_total_count(); + } + + if (req.offset == 0) + m_wallet.get_unconfirmed_transfers(res.transfers); + + m_wallet.get_recent_transfers_history(res.transfers, req.offset, req.count, res.total_transfers); + + return true; + } + catch (std::exception& e) + { + er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR; + er.message = e.what(); + return false; + } + } //------------------------------------------------------------------------------------------------------------------------------ bool wallet_rpc_server::on_transfer(const wallet_public::COMMAND_RPC_TRANSFER::request& req, wallet_public::COMMAND_RPC_TRANSFER::response& res, epee::json_rpc::error& er, connection_context& cntx) { diff --git a/src/wallet/wallet_rpc_server.h b/src/wallet/wallet_rpc_server.h index a3f1e19a..d0a1ef12 100644 --- a/src/wallet/wallet_rpc_server.h +++ b/src/wallet/wallet_rpc_server.h @@ -40,6 +40,7 @@ namespace tools MAP_JON_RPC_WE("getbalance", on_getbalance, wallet_public::COMMAND_RPC_GET_BALANCE) MAP_JON_RPC_WE("getaddress", on_getaddress, wallet_public::COMMAND_RPC_GET_ADDRESS) MAP_JON_RPC_WE("get_wallet_info", on_getwallet_info, wallet_public::COMMAND_RPC_GET_WALLET_INFO) + MAP_JON_RPC_WE("get_recent_txs_and_info", on_get_recent_txs_and_info, wallet_public::COMMAND_RPC_GET_RECENT_TXS_AND_INFO) MAP_JON_RPC_WE("transfer", on_transfer, wallet_public::COMMAND_RPC_TRANSFER) MAP_JON_RPC_WE("store", on_store, wallet_public::COMMAND_RPC_STORE) MAP_JON_RPC_WE("get_payments", on_get_payments, wallet_public::COMMAND_RPC_GET_PAYMENTS) @@ -68,6 +69,7 @@ namespace tools bool on_getbalance(const wallet_public::COMMAND_RPC_GET_BALANCE::request& req, wallet_public::COMMAND_RPC_GET_BALANCE::response& res, epee::json_rpc::error& er, connection_context& cntx); bool on_getaddress(const wallet_public::COMMAND_RPC_GET_ADDRESS::request& req, wallet_public::COMMAND_RPC_GET_ADDRESS::response& res, epee::json_rpc::error& er, connection_context& cntx); bool on_getwallet_info(const wallet_public::COMMAND_RPC_GET_WALLET_INFO::request& req, wallet_public::COMMAND_RPC_GET_WALLET_INFO::response& res, epee::json_rpc::error& er, connection_context& cntx); + bool on_get_recent_txs_and_info(const wallet_public::COMMAND_RPC_GET_RECENT_TXS_AND_INFO::request& req, wallet_public::COMMAND_RPC_GET_RECENT_TXS_AND_INFO::response& res, epee::json_rpc::error& er, connection_context& cntx); bool on_transfer(const wallet_public::COMMAND_RPC_TRANSFER::request& req, wallet_public::COMMAND_RPC_TRANSFER::response& res, epee::json_rpc::error& er, connection_context& cntx); bool on_store(const wallet_public::COMMAND_RPC_STORE::request& req, wallet_public::COMMAND_RPC_STORE::response& res, epee::json_rpc::error& er, connection_context& cntx); bool on_get_payments(const wallet_public::COMMAND_RPC_GET_PAYMENTS::request& req, wallet_public::COMMAND_RPC_GET_PAYMENTS::response& res, epee::json_rpc::error& er, connection_context& cntx);