1
0
Fork 0
forked from lthn/blockchain

added send wrapped transaction to desktop UI

This commit is contained in:
cryptozoidberg 2021-08-25 22:43:08 +02:00
parent 69eb2dc38a
commit 506bf42632
No known key found for this signature in database
GPG key ID: 22DEB97A54C6FDEC
3 changed files with 46 additions and 7 deletions

View file

@ -1226,6 +1226,11 @@ bool simple_wallet::transfer(const std::vector<std::string> &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<std::string> &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<currency::attachment_v> attachments;
if (!payment_id.empty() && !set_payment_id_to_tx(attachments, payment_id))

View file

@ -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<currency::tx_destination_entry>& 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());
}

View file

@ -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<currency::attachment_v> attachments;
std::vector<currency::extra_v> 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<currency::attachment_v> attachments;
std::vector<currency::extra_v> 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());
}