Deposit detection and deposit object created

This commit is contained in:
serkixenos 2021-04-08 12:08:28 +02:00
parent df125c9a0b
commit daa4fa089a
2 changed files with 96 additions and 94 deletions

View file

@ -16,7 +16,9 @@ class hive_node_rpc_client : public rpc_client {
public: public:
hive_node_rpc_client(std::string _ip, uint32_t _port, std::string _user, std::string _password); hive_node_rpc_client(std::string _ip, uint32_t _port, std::string _user, std::string _password);
std::string account_history_api_get_transaction(std::string transaction_id);
std::string block_api_get_block(uint32_t block_number); std::string block_api_get_block(uint32_t block_number);
std::string condenser_api_get_transaction(std::string transaction_id);
std::string database_api_get_dynamic_global_properties(); std::string database_api_get_dynamic_global_properties();
std::string database_api_get_version(); std::string database_api_get_version();
std::string network_broadcast_api_broadcast_transaction(std::string htrx); std::string network_broadcast_api_broadcast_transaction(std::string htrx);

View file

@ -31,11 +31,21 @@ hive_node_rpc_client::hive_node_rpc_client(std::string _ip, uint32_t _port, std:
rpc_client(_ip, _port, _user, _password) { rpc_client(_ip, _port, _user, _password) {
} }
std::string hive_node_rpc_client::account_history_api_get_transaction(std::string transaction_id) {
std::string params = "{ \"id\": \"" + transaction_id + "\" }";
return send_post_request("account_history_api.get_transaction", params, false);
}
std::string hive_node_rpc_client::block_api_get_block(uint32_t block_number) { std::string hive_node_rpc_client::block_api_get_block(uint32_t block_number) {
std::string params = "{ \"block_num\": " + std::to_string(block_number) + " }"; std::string params = "{ \"block_num\": " + std::to_string(block_number) + " }";
return send_post_request("block_api.get_block", params, false); return send_post_request("block_api.get_block", params, false);
} }
std::string hive_node_rpc_client::condenser_api_get_transaction(std::string transaction_id) {
std::string params = "[\"" + transaction_id + "\"]";
return send_post_request("condenser_api.get_transaction", params, false);
}
std::string hive_node_rpc_client::database_api_get_dynamic_global_properties() { std::string hive_node_rpc_client::database_api_get_dynamic_global_properties() {
return send_post_request("database_api.get_dynamic_global_properties", "", false); return send_post_request("database_api.get_dynamic_global_properties", "", false);
} }
@ -349,41 +359,40 @@ void sidechain_net_handler_hive::process_primary_wallet() {
} }
void sidechain_net_handler_hive::process_sidechain_addresses() { void sidechain_net_handler_hive::process_sidechain_addresses() {
// const auto &sidechain_addresses_idx = database.get_index_type<sidechain_address_index>(); const auto &sidechain_addresses_idx = database.get_index_type<sidechain_address_index>();
// const auto &sidechain_addresses_by_sidechain_idx = sidechain_addresses_idx.indices().get<by_sidechain>(); const auto &sidechain_addresses_by_sidechain_idx = sidechain_addresses_idx.indices().get<by_sidechain>();
// const auto &sidechain_addresses_by_sidechain_range = sidechain_addresses_by_sidechain_idx.equal_range(sidechain); const auto &sidechain_addresses_by_sidechain_range = sidechain_addresses_by_sidechain_idx.equal_range(sidechain);
// std::for_each(sidechain_addresses_by_sidechain_range.first, sidechain_addresses_by_sidechain_range.second, std::for_each(sidechain_addresses_by_sidechain_range.first, sidechain_addresses_by_sidechain_range.second,
// [&](const sidechain_address_object &sao) { [&](const sidechain_address_object &sao) {
// bool retval = true; bool retval = true;
// if (sao.expires == time_point_sec::maximum()) { if (sao.expires == time_point_sec::maximum()) {
// if (sao.deposit_address == "") { if (sao.deposit_address == "") {
// sidechain_address_update_operation op; sidechain_address_update_operation op;
// op.payer = plugin.get_current_son_object().son_account; op.payer = plugin.get_current_son_object().son_account;
// op.sidechain_address_id = sao.id; op.sidechain_address_id = sao.id;
// op.sidechain_address_account = sao.sidechain_address_account; op.sidechain_address_account = sao.sidechain_address_account;
// op.sidechain = sao.sidechain; op.sidechain = sao.sidechain;
// op.deposit_public_key = sao.deposit_public_key; op.deposit_public_key = sao.deposit_public_key;
// op.deposit_address = sao.withdraw_address; op.deposit_address = sao.withdraw_address;
// op.deposit_address_data = sao.withdraw_address; op.deposit_address_data = sao.withdraw_address;
// op.withdraw_public_key = sao.withdraw_public_key; op.withdraw_public_key = sao.withdraw_public_key;
// op.withdraw_address = sao.withdraw_address; op.withdraw_address = sao.withdraw_address;
//
// signed_transaction trx = database.create_signed_transaction(plugin.get_private_key(plugin.get_current_son_id()), op); signed_transaction trx = database.create_signed_transaction(plugin.get_private_key(plugin.get_current_son_id()), op);
// try { try {
// trx.validate(); trx.validate();
// database.push_transaction(trx, database::validation_steps::skip_block_size_check); database.push_transaction(trx, database::validation_steps::skip_block_size_check);
// if (plugin.app().p2p_node()) if (plugin.app().p2p_node())
// plugin.app().p2p_node()->broadcast(net::trx_message(trx)); plugin.app().p2p_node()->broadcast(net::trx_message(trx));
// retval = true; retval = true;
// } catch (fc::exception &e) { } catch (fc::exception &e) {
// elog("Sending transaction for update deposit address operation failed with exception ${e}", ("e", e.what())); elog("Sending transaction for update deposit address operation failed with exception ${e}", ("e", e.what()));
// retval = false; retval = false;
// } }
// } }
// } }
// return retval; return retval;
// }); });
return;
} }
bool sidechain_net_handler_hive::process_deposit(const son_wallet_deposit_object &swdo) { bool sidechain_net_handler_hive::process_deposit(const son_wallet_deposit_object &swdo) {
@ -485,17 +494,6 @@ std::string sidechain_net_handler_hive::send_sidechain_transaction(const sidecha
ilog("HTRX: ${htrx}", ("htrx", params)); ilog("HTRX: ${htrx}", ("htrx", params));
node_rpc_client->network_broadcast_api_broadcast_transaction(params); node_rpc_client->network_broadcast_api_broadcast_transaction(params);
// try {
// trx.validate();
// database.push_transaction(trx, database::validation_steps::skip_block_size_check);
// if (plugin.app().p2p_node())
// plugin.app().p2p_node()->broadcast(net::trx_message(trx));
// return trx.id().str();
// } catch (fc::exception &e) {
// elog("Sidechain transaction failed with exception ${e}", ("e", e.what()));
// return "";
// }
return htrx.id().str(); return htrx.id().str();
} }
@ -543,14 +541,22 @@ void sidechain_net_handler_hive::handle_event(const std::string &event_data) {
boost::property_tree::ptree block_json; boost::property_tree::ptree block_json;
boost::property_tree::read_json(ss, block_json); boost::property_tree::read_json(ss, block_json);
for (const auto &tx_child : block_json.get_child("result.block.transactions")) { for (const auto &tx_ids_child : block_json.get_child("result.block.transaction_ids")) {
const auto &tx = tx_child.second; const auto &transaction_id = tx_ids_child.second.get_value<std::string>();
for (const auto &ops : tx.get_child("operations")) { std::string tx_str = node_rpc_client->account_history_api_get_transaction(transaction_id);
if (tx_str != "") {
std::stringstream ss_tx(tx_str);
boost::property_tree::ptree tx;
boost::property_tree::read_json(ss_tx, tx);
size_t operation_index = -1;
for (const auto &ops : tx.get_child("result.operations")) {
const auto &op = ops.second; const auto &op = ops.second;
operation_index = operation_index + 1;
std::string operation_type = op.get<std::string>("type"); std::string operation_type = op.get<std::string>("type");
ilog("Transactions: ${operation_type}", ("operation_type", operation_type));
if (operation_type == "transfer_operation") { if (operation_type == "transfer_operation") {
const auto &op_value = op.get_child("value"); const auto &op_value = op.get_child("value");
@ -564,25 +570,15 @@ void sidechain_net_handler_hive::handle_event(const std::string &event_data) {
uint64_t precision = amount_child.get<uint64_t>("precision"); uint64_t precision = amount_child.get<uint64_t>("precision");
std::string nai = amount_child.get<std::string>("nai"); std::string nai = amount_child.get<std::string>("nai");
ilog("Transfer from ${from} to ${to}, amount ${amount}, precision ${precision}, nai ${nai}", if (to == "son-account") {
("from", from)("to", to)("amount", amount)("precision", precision)("nai", nai)); const auto &sidechain_addresses_idx = database.get_index_type<sidechain_address_index>().indices().get<by_sidechain_and_deposit_address_and_expires>();
} const auto &addr_itr = sidechain_addresses_idx.find(std::make_tuple(sidechain, from, time_point_sec::maximum()));
}
}
//const auto &vins = extract_info_from_block(block);
//const auto &sidechain_addresses_idx = database.get_index_type<sidechain_address_index>().indices().get<by_sidechain_and_deposit_address_and_expires>();
/*for (const auto &v : vins) {
// !!! EXTRACT DEPOSIT ADDRESS FROM SIDECHAIN ADDRESS OBJECT
const auto &addr_itr = sidechain_addresses_idx.find(std::make_tuple(sidechain, v.address, time_point_sec::maximum()));
if (addr_itr == sidechain_addresses_idx.end()) if (addr_itr == sidechain_addresses_idx.end())
continue; continue;
std::stringstream ss; std::stringstream ss;
ss << "bitcoin" ss << "hive"
<< "-" << v.out.hash_tx << "-" << v.out.n_vout; << "-" << transaction_id << "-" << operation_index;
std::string sidechain_uid = ss.str(); std::string sidechain_uid = ss.str();
sidechain_event_data sed; sidechain_event_data sed;
@ -590,17 +586,21 @@ void sidechain_net_handler_hive::handle_event(const std::string &event_data) {
sed.block_num = database.head_block_num(); sed.block_num = database.head_block_num();
sed.sidechain = addr_itr->sidechain; sed.sidechain = addr_itr->sidechain;
sed.sidechain_uid = sidechain_uid; sed.sidechain_uid = sidechain_uid;
sed.sidechain_transaction_id = v.out.hash_tx; sed.sidechain_transaction_id = transaction_id;
sed.sidechain_from = ""; sed.sidechain_from = from;
sed.sidechain_to = v.address; sed.sidechain_to = to;
sed.sidechain_currency = "BTC"; sed.sidechain_currency = "HIVE";
sed.sidechain_amount = v.out.amount; sed.sidechain_amount = amount;
sed.peerplays_from = addr_itr->sidechain_address_account; sed.peerplays_from = addr_itr->sidechain_address_account;
sed.peerplays_to = database.get_global_properties().parameters.son_account(); sed.peerplays_to = database.get_global_properties().parameters.son_account();
price btc_price = database.get<asset_object>(database.get_global_properties().parameters.btc_asset()).options.core_exchange_rate; price hive_price = database.get<asset_object>(database.get_global_properties().parameters.hive_asset()).options.core_exchange_rate;
sed.peerplays_asset = asset(sed.sidechain_amount * btc_price.base.amount / btc_price.quote.amount); sed.peerplays_asset = asset(sed.sidechain_amount * hive_price.base.amount / hive_price.quote.amount);
sidechain_event_data_received(sed); sidechain_event_data_received(sed);
}*/ }
}
}
}
}
} }
} }