Withdrawal payment detection
This commit is contained in:
parent
dfcc66a7d0
commit
7536f1a2d7
13 changed files with 114 additions and 89 deletions
|
|
@ -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
|
||||
|
|
|
|||
15
libraries/plugins/peerplays_sidechain/common/utils.cpp
Normal file
15
libraries/plugins/peerplays_sidechain/common/utils.cpp
Normal 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;
|
||||
}
|
||||
|
|
@ -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) {
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
@ -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:
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue