From 506bf42632d8c2dace3c06bdb90c2cc9c20afa2e Mon Sep 17 00:00:00 2001 From: cryptozoidberg Date: Wed, 25 Aug 2021 22:43:08 +0200 Subject: [PATCH] added send wrapped transaction to desktop UI --- src/simplewallet/simplewallet.cpp | 9 +++++++++ src/wallet/wallet_rpc_server.cpp | 11 ++++++++++- src/wallet/wallets_manager.cpp | 33 +++++++++++++++++++++++++------ 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp index c72242d3..72d08b14 100644 --- a/src/simplewallet/simplewallet.cpp +++ b/src/simplewallet/simplewallet.cpp @@ -1226,6 +1226,11 @@ bool simple_wallet::transfer(const std::vector &args_) //check if address looks like wrapped address if (is_address_like_wrapped(local_args[i])) { + if (wrapped_transaction) + { + fail_msg_writer() << "Second wrap entry not allowed in one tx"; + return true; + } success_msg_writer(true) << "Address " << local_args[i] << " recognized as wrapped address, creating wrapping transaction..."; //put into service attachment specially encrypted entry which will contain wrap address and network tx_service_attachment sa = AUTO_VAL_INIT(sa); @@ -1273,6 +1278,10 @@ bool simple_wallet::transfer(const std::vector &args_) dsts.push_back(de); } + if (wrapped_transaction) + { + currency::create_and_add_tx_payer_to_container_from_address(extra, m_wallet->get_account().get_keys().account_address, m_wallet->get_top_block_height(), m_wallet->get_core_runtime_config()); + } std::vector attachments; if (!payment_id.empty() && !set_payment_id_to_tx(attachments, payment_id)) diff --git a/src/wallet/wallet_rpc_server.cpp b/src/wallet/wallet_rpc_server.cpp index dd11b4ba..24c43f66 100644 --- a/src/wallet/wallet_rpc_server.cpp +++ b/src/wallet/wallet_rpc_server.cpp @@ -298,6 +298,7 @@ namespace tools //put it to attachments ctp.attachments.insert(ctp.extra.end(), req.service_entries.begin(), req.service_entries.end()); } + bool wrap = false; std::vector& dsts = ctp.dsts; for (auto it = req.destinations.begin(); it != req.destinations.end(); it++) { @@ -307,6 +308,13 @@ namespace tools //check if address looks like wrapped address if (currency::is_address_like_wrapped(it->address)) { + if (wrap) { + LOG_ERROR("More then one entries in transactions"); + er.code = WALLET_RPC_ERROR_CODE_WRONG_ARGUMENT; + er.message = "Second wrap entry not supported in transactions"; + return false; + + } LOG_PRINT_L0("Address " << it->address << " recognized as wrapped address, creating wrapping transaction..."); //put into service attachment specially encrypted entry which will contain wrap address and network currency::tx_service_attachment sa = AUTO_VAL_INIT(sa); @@ -319,6 +327,7 @@ namespace tools currency::account_public_address acc = AUTO_VAL_INIT(acc); currency::get_account_address_from_str(acc, BC_WRAP_SERVICE_CUSTODY_WALLET); de.addr.front() = acc; + wrap = true; //encrypt body with a special way } else if(!m_wallet.get_transfer_address(it->address, de.addr.back(), embedded_payment_id)) @@ -358,7 +367,7 @@ namespace tools attachments.push_back(comment); } - if (req.push_payer) + if (req.push_payer | wrap) { currency::create_and_add_tx_payer_to_container_from_address(extra, m_wallet.get_account().get_keys().account_address, m_wallet.get_top_block_height(), m_wallet.get_core_runtime_config()); } diff --git a/src/wallet/wallets_manager.cpp b/src/wallet/wallets_manager.cpp index 6d8d6456..86856d90 100644 --- a/src/wallet/wallets_manager.cpp +++ b/src/wallet/wallets_manager.cpp @@ -17,6 +17,7 @@ #include "core_default_rpc_proxy.h" #include "common/db_backend_selector.h" #include "common/pre_download.h" +#include "wallet/wrap_service.h" #define GET_WALLET_OPT_BY_ID(wallet_id, name) \ SHARED_CRITICAL_REGION_LOCAL(m_wallets_lock); \ @@ -1323,6 +1324,10 @@ std::string wallets_manager::transfer(size_t wallet_id, const view::transfer_par return API_RETURN_CODE_BAD_ARG_EMPTY_DESTINATIONS; uint64_t fee = tp.fee; + //payment_id + std::vector attachments; + std::vector extra; + bool wrap = false; // if (!currency::parse_amount(fee, tp.fee)) // return API_RETURN_CODE_BAD_ARG_WRONG_FEE; @@ -1331,12 +1336,30 @@ std::string wallets_manager::transfer(size_t wallet_id, const view::transfer_par { dsts.push_back(currency::tx_destination_entry()); dsts.back().addr.resize(1); + currency::tx_destination_entry& de = dsts.back(); std::string embedded_payment_id; - if (!tools::get_transfer_address(d.address, dsts.back().addr.back(), embedded_payment_id, m_rpc_proxy.get())) + if (currency::is_address_like_wrapped(d.address)) + { + CHECK_AND_ASSERT_MES(!wrap, API_RETURN_CODE_BAD_ARG, "Second wrap entry in one tx not allowed"); + LOG_PRINT_L0("Address " << d.address << " recognized as wrapped address, creating wrapping transaction..."); + //put into service attachment specially encrypted entry which will contain wrap address and network + currency::tx_service_attachment sa = AUTO_VAL_INIT(sa); + sa.service_id = BC_WRAP_SERVICE_ID; + sa.instruction = BC_WRAP_SERVICE_INSTRUCTION_ERC20; + sa.flags = TX_SERVICE_ATTACHMENT_ENCRYPT_BODY | TX_SERVICE_ATTACHMENT_ENCRYPT_BODY_ISOLATE_AUDITABLE; + sa.body = d.address; + extra.push_back(sa); + + currency::account_public_address acc = AUTO_VAL_INIT(acc); + currency::get_account_address_from_str(acc, BC_WRAP_SERVICE_CUSTODY_WALLET); + de.addr.front() = acc; + wrap = true; + } + else if (!tools::get_transfer_address(d.address, dsts.back().addr.back(), embedded_payment_id, m_rpc_proxy.get())) { return API_RETURN_CODE_BAD_ARG_INVALID_ADDRESS; } - if(!currency::parse_amount(dsts.back().amount, d.amount)) + else if(!currency::parse_amount(dsts.back().amount, d.amount)) { return API_RETURN_CODE_BAD_ARG_WRONG_AMOUNT; } @@ -1347,9 +1370,7 @@ std::string wallets_manager::transfer(size_t wallet_id, const view::transfer_par payment_id = embedded_payment_id; } } - //payment_id - std::vector attachments; - std::vector extra; + if (payment_id.size()) { if (!currency::is_payment_id_size_ok(payment_id)) @@ -1381,7 +1402,7 @@ std::string wallets_manager::transfer(size_t wallet_id, const view::transfer_par tc.comment = tp.comment; extra.push_back(tc); } - if (tp.push_payer) + if (tp.push_payer || wrap) { currency::create_and_add_tx_payer_to_container_from_address(extra, w->get()->get_account().get_keys().account_address, w->get()->get_top_block_height(), w->get()->get_core_runtime_config()); }