Withdrawal payment detection

This commit is contained in:
serkixenos 2021-04-22 11:35:29 +02:00
parent dfcc66a7d0
commit 7536f1a2d7
13 changed files with 114 additions and 89 deletions

View file

@ -15,6 +15,7 @@ add_library( peerplays_sidechain
bitcoin/utils.cpp
bitcoin/sign_bitcoin_transaction.cpp
common/rpc_client.cpp
common/utils.cpp
hive/operations.cpp
hive/transaction.cpp
hive/types.cpp

View file

@ -0,0 +1,15 @@
#include <graphene/peerplays_sidechain/common/utils.hpp>
std::string account_id_to_string(graphene::chain::account_id_type account_id) {
std::string account_id_str = fc::to_string(account_id.space_id) + "." +
fc::to_string(account_id.type_id) + "." +
fc::to_string((uint64_t)account_id.instance);
return account_id_str;
}
std::string asset_id_to_string(graphene::chain::asset_id_type asset_id) {
std::string asset_id_str = fc::to_string(asset_id.space_id) + "." +
fc::to_string(asset_id.type_id) + "." +
fc::to_string((uint64_t)asset_id.instance);
return asset_id_str;
}

View file

@ -15,8 +15,8 @@ static std::string trim_typename_namespace(const std::string &name) {
}
struct from_static_variant_for_hive {
variant &var;
from_static_variant_for_hive(variant &dv) :
fc::variant &var;
from_static_variant_for_hive(fc::variant &dv) :
var(dv) {
}
@ -24,15 +24,15 @@ struct from_static_variant_for_hive {
template <typename T>
void operator()(const T &v) const {
auto name = trim_typename_namespace(fc::get_typename<T>::name());
variant value;
fc::variant value;
to_variant(v, value, 5);
var = mutable_variant_object("type", name).set("value", value);
}
};
struct to_static_variant_for_hive {
const variant &var;
to_static_variant_for_hive(const variant &dv) :
const fc::variant &var;
to_static_variant_for_hive(const fc::variant &dv) :
var(dv) {
}

View file

@ -0,0 +1,6 @@
#pragma once
#include <graphene/chain/protocol/asset.hpp>
std::string account_id_to_string(graphene::chain::account_id_type account_id);
std::string asset_id_to_string(graphene::chain::asset_id_type asset_id);

View file

@ -55,6 +55,10 @@ protected:
std::map<std::string, std::string> private_keys;
std::vector<asset_id_type> tracked_assets;
bool is_tracked_asset(asset_id_type asset_id);
void on_applied_block(const signed_block &b);
private:
};

View file

@ -78,8 +78,6 @@ private:
void schedule_hive_listener();
void hive_listener_loop();
void handle_event(const std::string &event_data);
void on_applied_block(const signed_block &b);
};
}} // namespace graphene::peerplays_sidechain

View file

@ -23,7 +23,6 @@ public:
int64_t settle_sidechain_transaction(const sidechain_transaction_object &sto);
private:
void on_applied_block(const signed_block &b);
};
}} // namespace graphene::peerplays_sidechain

View file

@ -29,6 +29,8 @@ private:
peerplays_sidechain_plugin &plugin;
graphene::chain::database &database;
std::vector<std::unique_ptr<sidechain_net_handler>> net_handlers;
void on_applied_block(const signed_block &b);
};
}} // namespace graphene::peerplays_sidechain

View file

@ -3,12 +3,17 @@
#include <fc/log/logger.hpp>
#include <graphene/chain/chain_property_object.hpp>
#include <graphene/chain/proposal_object.hpp>
#include <graphene/peerplays_sidechain/common/utils.hpp>
namespace graphene { namespace peerplays_sidechain {
sidechain_net_handler::sidechain_net_handler(peerplays_sidechain_plugin &_plugin, const boost::program_options::variables_map &options) :
plugin(_plugin),
database(_plugin.database()) {
database.applied_block.connect([&](const signed_block &b) {
on_applied_block(b);
});
}
sidechain_net_handler::~sidechain_net_handler() {
@ -570,4 +575,55 @@ void sidechain_net_handler::settle_sidechain_transactions() {
});
}
bool sidechain_net_handler::is_tracked_asset(asset_id_type asset_id) {
bool is_tracked_asset = false;
for (const auto &tracked_asset_id : tracked_assets) {
if (asset_id == tracked_asset_id) {
is_tracked_asset = true;
break;
}
}
return is_tracked_asset;
}
void sidechain_net_handler::on_applied_block(const signed_block &b) {
for (const auto &trx : b.transactions) {
size_t operation_index = -1;
for (auto op : trx.operations) {
operation_index = operation_index + 1;
if (op.which() == operation::tag<transfer_operation>::value) {
transfer_operation transfer_op = op.get<transfer_operation>();
if (transfer_op.to != plugin.database().get_global_properties().parameters.son_account()) {
continue;
}
if (!is_tracked_asset(transfer_op.amount.asset_id)) {
continue;
}
std::stringstream ss;
ss << "peerplays"
<< "-" << trx.id().str() << "-" << operation_index;
std::string sidechain_uid = ss.str();
sidechain_event_data sed;
sed.timestamp = database.head_block_time();
sed.block_num = database.head_block_num();
sed.sidechain = sidechain_type::peerplays;
sed.sidechain_uid = sidechain_uid;
sed.sidechain_transaction_id = trx.id().str();
sed.sidechain_from = account_id_to_string(transfer_op.from);
sed.sidechain_to = account_id_to_string(transfer_op.to);
sed.sidechain_currency = asset_id_to_string(transfer_op.amount.asset_id);
sed.sidechain_amount = transfer_op.amount.amount;
sed.peerplays_from = transfer_op.from;
sed.peerplays_to = transfer_op.to;
price asset_price = database.get<asset_object>(transfer_op.amount.asset_id).options.core_exchange_rate;
sed.peerplays_asset = asset(transfer_op.amount.amount * asset_price.base.amount / asset_price.quote.amount);
sidechain_event_data_received(sed);
}
}
}
}
}} // namespace graphene::peerplays_sidechain

View file

@ -910,6 +910,7 @@ void zmq_listener::handle_zmq() {
sidechain_net_handler_bitcoin::sidechain_net_handler_bitcoin(peerplays_sidechain_plugin &_plugin, const boost::program_options::variables_map &options) :
sidechain_net_handler(_plugin, options) {
sidechain = sidechain_type::bitcoin;
tracked_assets.push_back(database.get_global_properties().parameters.btc_asset());
ip = options.at("bitcoin-node-ip").as<std::string>();
zmq_port = options.at("bitcoin-node-zmq-port").as<uint32_t>();

View file

@ -25,8 +25,7 @@
#include <graphene/peerplays_sidechain/hive/transaction.hpp>
#include <graphene/utilities/key_conversion.hpp>
namespace graphene {
namespace peerplays_sidechain {
namespace graphene { namespace peerplays_sidechain {
hive_node_rpc_client::hive_node_rpc_client(std::string _ip, uint32_t _port, std::string _user, std::string _password) :
rpc_client(_ip, _port, _user, _password) {
@ -120,6 +119,8 @@ std::string hive_wallet_rpc_client::get_account_memo_key(std::string account) {
sidechain_net_handler_hive::sidechain_net_handler_hive(peerplays_sidechain_plugin &_plugin, const boost::program_options::variables_map &options) :
sidechain_net_handler(_plugin, options) {
sidechain = sidechain_type::hive;
tracked_assets.push_back(database.get_global_properties().parameters.hbd_asset());
tracked_assets.push_back(database.get_global_properties().parameters.hive_asset());
node_ip = options.at("hive-node-ip").as<std::string>();
node_rpc_port = options.at("hive-node-rpc-port").as<uint32_t>();
@ -593,11 +594,14 @@ void sidechain_net_handler_hive::handle_event(const std::string &event_data) {
//uint64_t precision = amount_child.get<uint64_t>("precision");
std::string nai = amount_child.get<std::string>("nai");
std::string sidechain_currency = "";
price sidechain_currency_price = {};
if ((nai == "@@000000013" /*?? HBD*/) || (nai == "@@000000013" /*TBD*/)) {
sidechain_currency = "HBD";
sidechain_currency_price = database.get<asset_object>(database.get_global_properties().parameters.hbd_asset()).options.core_exchange_rate;
}
if ((nai == "@@000000021") /*?? HIVE*/ || (nai == "@@000000021" /*TESTS*/)) {
sidechain_currency = "HIVE";
sidechain_currency_price = database.get<asset_object>(database.get_global_properties().parameters.hive_asset()).options.core_exchange_rate;
}
if (to == "son-account") {
@ -623,8 +627,7 @@ void sidechain_net_handler_hive::handle_event(const std::string &event_data) {
sed.sidechain_amount = amount;
sed.peerplays_from = addr_itr->sidechain_address_account;
sed.peerplays_to = database.get_global_properties().parameters.son_account();
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 * hive_price.base.amount / hive_price.quote.amount);
sed.peerplays_asset = asset(sed.sidechain_amount * sidechain_currency_price.base.amount / sidechain_currency_price.quote.amount);
sidechain_event_data_received(sed);
}
}
@ -634,40 +637,4 @@ void sidechain_net_handler_hive::handle_event(const std::string &event_data) {
}
}
void sidechain_net_handler_hive::on_applied_block(const signed_block &b) {
// for (const auto &trx : b.transactions) {
// size_t operation_index = -1;
// for (auto op : trx.operations) {
// operation_index = operation_index + 1;
// if (op.which() == operation::tag<transfer_operation>::value) {
// transfer_operation transfer_op = op.get<transfer_operation>();
// if (transfer_op.to != plugin.database().get_global_properties().parameters.son_account()) {
// continue;
// }
//
// std::stringstream ss;
// ss << "peerplays"
// << "-" << trx.id().str() << "-" << operation_index;
// std::string sidechain_uid = ss.str();
//
// sidechain_event_data sed;
// sed.timestamp = database.head_block_time();
// sed.block_num = database.head_block_num();
// sed.sidechain = sidechain_type::peerplays;
// sed.sidechain_uid = sidechain_uid;
// sed.sidechain_transaction_id = trx.id().str();
// sed.sidechain_from = fc::to_string(transfer_op.from.space_id) + "." + fc::to_string(transfer_op.from.type_id) + "." + fc::to_string((uint64_t)transfer_op.from.instance);
// sed.sidechain_to = fc::to_string(transfer_op.to.space_id) + "." + fc::to_string(transfer_op.to.type_id) + "." + fc::to_string((uint64_t)transfer_op.to.instance);
// sed.sidechain_currency = fc::to_string(transfer_op.amount.asset_id.space_id) + "." + fc::to_string(transfer_op.amount.asset_id.type_id) + "." + fc::to_string((uint64_t)transfer_op.amount.asset_id.instance);
// sed.sidechain_amount = transfer_op.amount.amount;
// sed.peerplays_from = transfer_op.from;
// sed.peerplays_to = transfer_op.to;
// price asset_price = database.get<asset_object>(transfer_op.amount.asset_id).options.core_exchange_rate;
// sed.peerplays_asset = asset(transfer_op.amount.amount * asset_price.base.amount / asset_price.quote.amount);
// sidechain_event_data_received(sed);
// }
// }
// }
}
}
} // namespace graphene::peerplays_sidechain
}} // namespace graphene::peerplays_sidechain

View file

@ -25,6 +25,15 @@ namespace graphene { namespace peerplays_sidechain {
sidechain_net_handler_peerplays::sidechain_net_handler_peerplays(peerplays_sidechain_plugin &_plugin, const boost::program_options::variables_map &options) :
sidechain_net_handler(_plugin, options) {
sidechain = sidechain_type::peerplays;
const auto &assets_by_symbol = database.get_index_type<asset_index>().indices().get<by_symbol>();
const auto get_asset_id = [&assets_by_symbol](const string &symbol) {
auto asset_itr = assets_by_symbol.find(symbol);
FC_ASSERT(asset_itr != assets_by_symbol.end(), "Unable to find asset '${sym}'", ("sym", symbol));
return asset_itr->get_id();
};
//tracked_assets.push_back(get_asset_id("PBTC"));
//tracked_assets.push_back(get_asset_id("PETH"));
//tracked_assets.push_back(get_asset_id("PEOS"));
if (options.count("peerplays-private-key")) {
const std::vector<std::string> pub_priv_keys = options["peerplays-private-key"].as<std::vector<std::string>>();
@ -37,10 +46,6 @@ sidechain_net_handler_peerplays::sidechain_net_handler_peerplays(peerplays_sidec
private_keys[key_pair.first] = key_pair.second;
}
}
database.applied_block.connect([&](const signed_block &b) {
on_applied_block(b);
});
}
sidechain_net_handler_peerplays::~sidechain_net_handler_peerplays() {
@ -271,40 +276,4 @@ int64_t sidechain_net_handler_peerplays::settle_sidechain_transaction(const side
return settle_amount;
}
void sidechain_net_handler_peerplays::on_applied_block(const signed_block &b) {
for (const auto &trx : b.transactions) {
size_t operation_index = -1;
for (auto op : trx.operations) {
operation_index = operation_index + 1;
if (op.which() == operation::tag<transfer_operation>::value) {
transfer_operation transfer_op = op.get<transfer_operation>();
if (transfer_op.to != plugin.database().get_global_properties().parameters.son_account()) {
continue;
}
std::stringstream ss;
ss << "peerplays"
<< "-" << trx.id().str() << "-" << operation_index;
std::string sidechain_uid = ss.str();
sidechain_event_data sed;
sed.timestamp = database.head_block_time();
sed.block_num = database.head_block_num();
sed.sidechain = sidechain_type::peerplays;
sed.sidechain_uid = sidechain_uid;
sed.sidechain_transaction_id = trx.id().str();
sed.sidechain_from = fc::to_string(transfer_op.from.space_id) + "." + fc::to_string(transfer_op.from.type_id) + "." + fc::to_string((uint64_t)transfer_op.from.instance);
sed.sidechain_to = fc::to_string(transfer_op.to.space_id) + "." + fc::to_string(transfer_op.to.type_id) + "." + fc::to_string((uint64_t)transfer_op.to.instance);
sed.sidechain_currency = fc::to_string(transfer_op.amount.asset_id.space_id) + "." + fc::to_string(transfer_op.amount.asset_id.type_id) + "." + fc::to_string((uint64_t)transfer_op.amount.asset_id.instance);
sed.sidechain_amount = transfer_op.amount.amount;
sed.peerplays_from = transfer_op.from;
sed.peerplays_to = transfer_op.to;
price asset_price = database.get<asset_object>(transfer_op.amount.asset_id).options.core_exchange_rate;
sed.peerplays_asset = asset(transfer_op.amount.amount * asset_price.base.amount / asset_price.quote.amount);
sidechain_event_data_received(sed);
}
}
}
}
}} // namespace graphene::peerplays_sidechain

View file

@ -11,6 +11,10 @@ namespace graphene { namespace peerplays_sidechain {
sidechain_net_manager::sidechain_net_manager(peerplays_sidechain_plugin &_plugin) :
plugin(_plugin),
database(_plugin.database()) {
database.applied_block.connect([&](const signed_block &b) {
on_applied_block(b);
});
}
sidechain_net_manager::~sidechain_net_manager() {
@ -94,4 +98,7 @@ void sidechain_net_manager::settle_sidechain_transactions() {
}
}
void sidechain_net_manager::on_applied_block(const signed_block &b) {
}
}} // namespace graphene::peerplays_sidechain