2019-12-04 17:52:00 +00:00
# include <graphene/peerplays_sidechain/sidechain_net_handler.hpp>
2019-12-18 18:30:38 +00:00
# include <graphene/chain/sidechain_address_object.hpp>
# include <fc/log/logger.hpp>
2019-12-04 17:52:00 +00:00
namespace graphene { namespace peerplays_sidechain {
2020-01-27 12:14:22 +00:00
sidechain_net_handler : : sidechain_net_handler ( peerplays_sidechain_plugin & _plugin , const boost : : program_options : : variables_map & options ) :
plugin ( _plugin ) ,
database ( _plugin . database ( ) )
2019-12-18 18:30:38 +00:00
{
2019-12-04 17:52:00 +00:00
}
sidechain_net_handler : : ~ sidechain_net_handler ( ) {
}
2020-01-21 03:32:19 +00:00
graphene : : peerplays_sidechain : : sidechain_type sidechain_net_handler : : get_sidechain ( ) {
return sidechain ;
}
2019-12-18 18:30:38 +00:00
std : : vector < std : : string > sidechain_net_handler : : get_sidechain_addresses ( ) {
2019-12-04 17:52:00 +00:00
std : : vector < std : : string > result ;
2019-12-18 18:30:38 +00:00
switch ( sidechain ) {
case sidechain_type : : bitcoin :
{
2020-01-27 12:14:22 +00:00
const auto & sidechain_addresses_idx = database . get_index_type < sidechain_address_index > ( ) ;
2019-12-18 18:30:38 +00:00
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 ) ;
std : : for_each ( sidechain_addresses_by_sidechain_range . first , sidechain_addresses_by_sidechain_range . second ,
[ & result ] ( const sidechain_address_object & sao ) {
result . push_back ( sao . address ) ;
} ) ;
break ;
}
2019-12-04 17:52:00 +00:00
default :
assert ( false ) ;
}
return result ;
}
2019-12-18 18:30:38 +00:00
void sidechain_net_handler : : sidechain_event_data_received ( const sidechain_event_data & sed ) {
ilog ( " sidechain_event_data: " ) ;
2020-02-05 19:19:47 +00:00
ilog ( " timestamp: ${timestamp} " , ( " timestamp " , sed . timestamp ) ) ;
ilog ( " sidechain: ${sidechain} " , ( " sidechain " , sed . sidechain ) ) ;
ilog ( " sidechain_uid: ${uid} " , ( " uid " , sed . sidechain_uid ) ) ;
ilog ( " sidechain_transaction_id: ${transaction_id} " , ( " transaction_id " , sed . sidechain_transaction_id ) ) ;
ilog ( " sidechain_from: ${from} " , ( " from " , sed . sidechain_from ) ) ;
ilog ( " sidechain_to: ${to} " , ( " to " , sed . sidechain_to ) ) ;
ilog ( " sidechain_amount: ${amount} " , ( " amount " , sed . sidechain_amount ) ) ;
ilog ( " peerplays_from: ${peerplays_from} " , ( " peerplays_from " , sed . peerplays_from ) ) ;
ilog ( " peerplays_to: ${peerplays_to} " , ( " peerplays_to " , sed . peerplays_to ) ) ;
2020-01-29 16:09:37 +00:00
const chain : : global_property_object & gpo = database . get_global_properties ( ) ;
son_wallet_transfer_create_operation op ;
op . payer = gpo . parameters . get_son_btc_account_id ( ) ;
op . timestamp = sed . timestamp ;
op . sidechain = sed . sidechain ;
2020-02-05 19:19:47 +00:00
op . sidechain_uid = sed . sidechain_uid ;
op . sidechain_transaction_id = sed . sidechain_transaction_id ;
op . sidechain_from = sed . sidechain_from ;
op . sidechain_to = sed . sidechain_to ;
op . sidechain_amount = sed . sidechain_amount ;
op . peerplays_from = sed . peerplays_from ;
op . peerplays_to = sed . peerplays_to ;
2020-02-10 18:17:56 +00:00
op . peerplays_amount = asset ( sed . sidechain_amount / 1000 ) ; // For Bitcoin, the exchange rate is 1:1, for others, get the exchange rate from market
2020-01-29 16:09:37 +00:00
2020-02-06 23:17:19 +00:00
for ( son_id_type son_id : plugin . get_sons ( ) ) {
2020-02-07 20:38:30 +00:00
if ( plugin . is_active_son ( son_id ) ) {
proposal_create_operation proposal_op ;
proposal_op . fee_paying_account = plugin . get_son_object ( son_id ) . son_account ;
2020-02-10 00:53:15 +00:00
proposal_op . proposed_ops . emplace_back ( op_wrapper ( op ) ) ;
2020-02-07 20:38:30 +00:00
uint32_t lifetime = ( gpo . parameters . block_interval * gpo . active_witnesses . size ( ) ) * 3 ;
proposal_op . expiration_time = time_point_sec ( database . head_block_time ( ) . sec_since_epoch ( ) + lifetime ) ;
ilog ( " sidechain_net_handler: sending proposal for son wallet transfer create operation by ${son} " , ( " son " , son_id ) ) ;
signed_transaction trx = plugin . database ( ) . create_signed_transaction ( plugin . get_private_key ( son_id ) , proposal_op ) ;
try {
2020-02-10 00:53:15 +00:00
database . push_transaction ( trx , database : : validation_steps : : skip_block_size_check ) ;
2020-02-10 18:17:56 +00:00
if ( plugin . app ( ) . p2p_node ( ) )
plugin . app ( ) . p2p_node ( ) - > broadcast ( net : : trx_message ( trx ) ) ;
2020-02-07 20:38:30 +00:00
} catch ( fc : : exception e ) {
ilog ( " sidechain_net_handler: sending proposal for son wallet transfer create operation by ${son} failed with exception ${e} " , ( " son " , son_id ) ( " e " , e . what ( ) ) ) ;
}
2020-02-06 23:17:19 +00:00
}
2020-01-29 16:09:37 +00:00
}
2019-12-18 18:30:38 +00:00
}
2019-12-04 17:52:00 +00:00
} } // graphene::peerplays_sidechain