From 2ab206b6c106fc110b7e5dcf0ad76cf9693fafa9 Mon Sep 17 00:00:00 2001 From: cryptozoidberg Date: Mon, 27 Mar 2023 22:03:31 +0200 Subject: [PATCH] Multiwallet RPC API: initial code draft --- src/wallet/view_iface.h | 35 +----------- src/wallet/wallet2.h | 5 ++ src/wallet/wallet_public_structs_defs.h | 73 +++++++++++++++++++++++++ src/wallet/wallet_rpc_server.cpp | 28 +++++++++- src/wallet/wallet_rpc_server.h | 8 +++ 5 files changed, 114 insertions(+), 35 deletions(-) diff --git a/src/wallet/view_iface.h b/src/wallet/view_iface.h index 2773084b..caf4bad7 100644 --- a/src/wallet/view_iface.h +++ b/src/wallet/view_iface.h @@ -209,40 +209,9 @@ public: END_KV_SERIALIZE_MAP() }; - struct wallet_info - { - std::list balances; - uint64_t mined_total; - std::string address; - std::string view_sec_key; - std::string path; - bool is_auditable; - bool is_watch_only; + typedef wallet_public::wallet_info wallet_info; - BEGIN_KV_SERIALIZE_MAP() - KV_SERIALIZE(balances) - KV_SERIALIZE(mined_total) - KV_SERIALIZE(address) - KV_SERIALIZE(view_sec_key) - KV_SERIALIZE(path) - KV_SERIALIZE(is_auditable); - KV_SERIALIZE(is_watch_only); - END_KV_SERIALIZE_MAP() - }; - - - - struct wallet_entry_info - { - wallet_info wi; - uint64_t wallet_id; - - BEGIN_KV_SERIALIZE_MAP() - KV_SERIALIZE(wi) - KV_SERIALIZE(wallet_id) - END_KV_SERIALIZE_MAP() - - }; + typedef wallet_public::wallet_entry_info wallet_entry_info; diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index a53ca4a0..920a35b0 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -126,6 +126,10 @@ namespace tools virtual void on_transfer_canceled(const wallet_public::wallet_transfer_info& wti) {} virtual void on_message(message_severity /*severity*/, const std::string& /*m*/) {} virtual void on_tor_status_change(const std::string& state) {} + + //mw api + virtual void on_mw_get_wallets(std::vector& wallets) {} + virtual void on_mw_select_wallet(uint64_t wallet_id) {} }; struct tx_dust_policy @@ -546,6 +550,7 @@ namespace tools //i_wallet2_callback* callback() const { return m_wcallback; } //void callback(i_wallet2_callback* callback) { m_callback = callback; } void callback(std::shared_ptr callback) { m_wcallback = callback; m_do_rise_transfer = (callback != nullptr); } + i_wallet2_callback* get_callback() { return m_wcallback; } void set_do_rise_transfer(bool do_rise) { m_do_rise_transfer = do_rise; } bool has_related_alias_entry_unconfirmed(const currency::transaction& tx); diff --git a/src/wallet/wallet_public_structs_defs.h b/src/wallet/wallet_public_structs_defs.h index 1fe59a3a..fb3a0d6a 100644 --- a/src/wallet/wallet_public_structs_defs.h +++ b/src/wallet/wallet_public_structs_defs.h @@ -1246,6 +1246,79 @@ namespace wallet_public }; + struct wallet_info + { + std::list balances; + uint64_t mined_total; + std::string address; + std::string view_sec_key; + std::string path; + bool is_auditable; + bool is_watch_only; + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(balances) + KV_SERIALIZE(mined_total) + KV_SERIALIZE(address) + KV_SERIALIZE(view_sec_key) + KV_SERIALIZE(path) + KV_SERIALIZE(is_auditable); + KV_SERIALIZE(is_watch_only); + END_KV_SERIALIZE_MAP() + }; + + + + struct wallet_entry_info + { + wallet_info wi; + uint64_t wallet_id; + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(wi) + KV_SERIALIZE(wallet_id) + END_KV_SERIALIZE_MAP() + + }; + + struct COMMAND_MW_GET_WALLETS + { + struct request + { + BEGIN_KV_SERIALIZE_MAP() + END_KV_SERIALIZE_MAP() + }; + + struct response + { + std::vector wallets; + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(wallets) + END_KV_SERIALIZE_MAP() + }; + }; + + struct COMMAND_MW_SELECT_WALLET + { + struct request + { + uint64_t wallet_id; + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(wallet_id) + END_KV_SERIALIZE_MAP() + }; + + + struct response + { + BEGIN_KV_SERIALIZE_MAP() + END_KV_SERIALIZE_MAP() + }; + }; + + struct assets_whitelist { std::vector assets; diff --git a/src/wallet/wallet_rpc_server.cpp b/src/wallet/wallet_rpc_server.cpp index 7001f4b7..d9822b23 100644 --- a/src/wallet/wallet_rpc_server.cpp +++ b/src/wallet/wallet_rpc_server.cpp @@ -999,6 +999,30 @@ namespace tools return true; } //------------------------------------------------------------------------------------------------------------------------------ - - + bool wallet_rpc_server::on_mw_get_wallets(const wallet_public::COMMAND_MW_GET_WALLETS& req, wallet_public::COMMAND_MW_GET_WALLETS::response& res, epee::json_rpc::error& er, connection_context& cntx) + { + i_wallet2_callback* pcallback = m_wallet.get_callback(); + if (!pcallback) + { + er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR; + er.message = "WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR"; + return false; + } + pcallback->on_mw_get_wallets(res.wallets); + return true; + } + //------------------------------------------------------------------------------------------------------------------------------ + bool wallet_rpc_server::on_mw_select_wallet(const wallet_public::COMMAND_MW_SELECT_WALLET& req, wallet_public::COMMAND_MW_SELECT_WALLET::response& res, epee::json_rpc::error& er, connection_context& cntx) + { + i_wallet2_callback* pcallback = m_wallet.get_callback(); + if (!pcallback) + { + er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR; + er.message = "WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR"; + return false; + } + pcallback->on_mw_select_wallet(req.wallet_id); + return true; + } + //------------------------------------------------------------------------------------------------------------------------------ } // namespace tools diff --git a/src/wallet/wallet_rpc_server.h b/src/wallet/wallet_rpc_server.h index 8db43937..8c9c8a9d 100644 --- a/src/wallet/wallet_rpc_server.h +++ b/src/wallet/wallet_rpc_server.h @@ -77,6 +77,11 @@ namespace tools MAP_JON_RPC_WE("ionic_swap_generate_proposal", on_ionic_swap_generate_proposal, wallet_public::COMMAND_IONIC_SWAP_GENERATE_PROPOSAL) MAP_JON_RPC_WE("ionic_swap_get_proposal_info", on_ionic_swap_get_proposal_info, wallet_public::COMMAND_IONIC_SWAP_GET_PROPOSAL_INFO) MAP_JON_RPC_WE("ionic_swap_accept_proposal", on_ionic_swap_accept_proposal, wallet_public::COMMAND_IONIC_SWAP_ACCEPT_PROPOSAL) + + //MULTIWALLET APIs + MAP_JON_RPC_WE("mw_get_wallets", on_mw_get_wallets, wallet_public::COMMAND_MW_GET_WALLETS) + MAP_JON_RPC_WE("mw_select_wallet", on_mw_select_wallet, wallet_public::COMMAND_MW_SELECT_WALLET) + END_JSON_RPC_MAP() END_URI_MAP2() @@ -122,6 +127,9 @@ namespace tools bool on_ionic_swap_get_proposal_info(const wallet_public::COMMAND_IONIC_SWAP_GET_PROPOSAL_INFO& req, wallet_public::COMMAND_IONIC_SWAP_GET_PROPOSAL_INFO::response& res, epee::json_rpc::error& er, connection_context& cntx); bool on_ionic_swap_accept_proposal(const wallet_public::COMMAND_IONIC_SWAP_ACCEPT_PROPOSAL& req, wallet_public::COMMAND_IONIC_SWAP_ACCEPT_PROPOSAL::response& res, epee::json_rpc::error& er, connection_context& cntx); + bool on_mw_get_wallets(const wallet_public::COMMAND_MW_GET_WALLETS& req, wallet_public::COMMAND_MW_GET_WALLETS::response& res, epee::json_rpc::error& er, connection_context& cntx); + bool on_mw_select_wallet(const wallet_public::COMMAND_MW_SELECT_WALLET& req, wallet_public::COMMAND_MW_SELECT_WALLET::response& res, epee::json_rpc::error& er, connection_context& cntx); + bool handle_command_line(const boost::program_options::variables_map& vm);