Merge pull request #67 from peerplays-network/GRPH-50-network_broadcast_api-fix-v2
network broadcast api fix, version 2
This commit is contained in:
commit
857a30d69c
62 changed files with 796 additions and 449 deletions
|
|
@ -160,7 +160,10 @@ namespace graphene { namespace app {
|
|||
{
|
||||
auto block_num = b.block_num();
|
||||
auto& callback = _callbacks.find(id)->second;
|
||||
fc::async( [capture_this,this,id,block_num,trx_num,trx,callback](){ callback( fc::variant(transaction_confirmation{ id, block_num, trx_num, trx}) ); } );
|
||||
fc::async( [capture_this,this,id,block_num,trx_num,trx,callback]() {
|
||||
callback( fc::variant( transaction_confirmation{ id, block_num, trx_num, trx },
|
||||
GRAPHENE_MAX_NESTED_OBJECTS ) );
|
||||
} );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -171,7 +174,8 @@ namespace graphene { namespace app {
|
|||
trx.validate();
|
||||
_app.chain_database()->check_tansaction_for_duplicated_operations(trx);
|
||||
_app.chain_database()->push_transaction(trx);
|
||||
_app.p2p_node()->broadcast_transaction(trx);
|
||||
if( _app.p2p_node() != nullptr )
|
||||
_app.p2p_node()->broadcast_transaction(trx);
|
||||
}
|
||||
|
||||
fc::variant network_broadcast_api::broadcast_transaction_synchronous(const signed_transaction& trx)
|
||||
|
|
@ -189,7 +193,8 @@ namespace graphene { namespace app {
|
|||
void network_broadcast_api::broadcast_block( const signed_block& b )
|
||||
{
|
||||
_app.chain_database()->push_block(b);
|
||||
_app.p2p_node()->broadcast( net::block_message( b ));
|
||||
if( _app.p2p_node() != nullptr )
|
||||
_app.p2p_node()->broadcast( net::block_message( b ));
|
||||
}
|
||||
|
||||
void network_broadcast_api::broadcast_transaction_with_callback(confirmation_callback cb, const signed_transaction& trx)
|
||||
|
|
@ -197,7 +202,8 @@ namespace graphene { namespace app {
|
|||
trx.validate();
|
||||
_callbacks[trx.id()] = cb;
|
||||
_app.chain_database()->push_transaction(trx);
|
||||
_app.p2p_node()->broadcast_transaction(trx);
|
||||
if( _app.p2p_node() != nullptr )
|
||||
_app.p2p_node()->broadcast_transaction(trx);
|
||||
}
|
||||
|
||||
network_node_api::network_node_api( application& a ) : _app( a )
|
||||
|
|
@ -212,7 +218,7 @@ namespace graphene { namespace app {
|
|||
|
||||
if (_on_pending_transaction)
|
||||
{
|
||||
_on_pending_transaction(fc::variant(transaction));
|
||||
_on_pending_transaction(fc::variant(transaction, GRAPHENE_MAX_NESTED_OBJECTS));
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ namespace detail {
|
|||
if( _options->count("seed-nodes") )
|
||||
{
|
||||
auto seeds_str = _options->at("seed-nodes").as<string>();
|
||||
auto seeds = fc::json::from_string(seeds_str).as<vector<string>>();
|
||||
auto seeds = fc::json::from_string(seeds_str).as<vector<string>>(2);
|
||||
for( const string& endpoint_string : seeds )
|
||||
{
|
||||
try {
|
||||
|
|
@ -226,7 +226,7 @@ namespace detail {
|
|||
|
||||
void new_connection( const fc::http::websocket_connection_ptr& c )
|
||||
{
|
||||
auto wsc = std::make_shared<fc::rpc::websocket_api_connection>(c);
|
||||
auto wsc = std::make_shared<fc::rpc::websocket_api_connection>(c, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
auto login = std::make_shared<graphene::app::login_api>( std::ref(*_self) );
|
||||
login->enable_api("database_api");
|
||||
|
||||
|
|
@ -292,7 +292,7 @@ namespace detail {
|
|||
_websocket_tls_server->start_accept();
|
||||
} FC_CAPTURE_AND_RETHROW() }
|
||||
|
||||
application_impl(application* self)
|
||||
explicit application_impl(application* self)
|
||||
: _self(self),
|
||||
_chain_db(std::make_shared<chain::database>())
|
||||
{
|
||||
|
|
@ -308,20 +308,19 @@ namespace detail {
|
|||
public_key_type init_pubkey( init_key );
|
||||
for( uint64_t i=0; i<genesis.initial_active_witnesses; i++ )
|
||||
genesis.initial_witness_candidates[i].block_signing_key = init_pubkey;
|
||||
return;
|
||||
}
|
||||
|
||||
void startup()
|
||||
{ try {
|
||||
fc::create_directories(_data_dir / "blockchain");
|
||||
|
||||
auto initial_state = [&] {
|
||||
auto initial_state = [this] {
|
||||
ilog("Initializing database...");
|
||||
if( _options->count("genesis-json") )
|
||||
{
|
||||
std::string genesis_str;
|
||||
fc::read_file_contents( _options->at("genesis-json").as<boost::filesystem::path>(), genesis_str );
|
||||
genesis_state_type genesis = fc::json::from_string( genesis_str ).as<genesis_state_type>();
|
||||
genesis_state_type genesis = fc::json::from_string( genesis_str ).as<genesis_state_type>( 20 );
|
||||
bool modified_genesis = false;
|
||||
if( _options->count("genesis-timestamp") )
|
||||
{
|
||||
|
|
@ -354,7 +353,7 @@ namespace detail {
|
|||
graphene::egenesis::compute_egenesis_json( egenesis_json );
|
||||
FC_ASSERT( egenesis_json != "" );
|
||||
FC_ASSERT( graphene::egenesis::get_egenesis_json_hash() == fc::sha256::hash( egenesis_json ) );
|
||||
auto genesis = fc::json::from_string( egenesis_json ).as<genesis_state_type>();
|
||||
auto genesis = fc::json::from_string( egenesis_json ).as<genesis_state_type>( 20 );
|
||||
genesis.initial_chain_id = fc::sha256::hash( egenesis_json );
|
||||
return genesis;
|
||||
}
|
||||
|
|
@ -370,7 +369,7 @@ namespace detail {
|
|||
loaded_checkpoints.reserve( cps.size() );
|
||||
for( auto cp : cps )
|
||||
{
|
||||
auto item = fc::json::from_string(cp).as<std::pair<uint32_t,block_id_type> >();
|
||||
auto item = fc::json::from_string(cp).as<std::pair<uint32_t,block_id_type> >( 2 );
|
||||
loaded_checkpoints[item.first] = item.second;
|
||||
}
|
||||
}
|
||||
|
|
@ -398,9 +397,21 @@ namespace detail {
|
|||
_force_validate = true;
|
||||
}
|
||||
|
||||
if( _options->count("api-access") )
|
||||
_apiaccess = fc::json::from_file( _options->at("api-access").as<boost::filesystem::path>() )
|
||||
.as<api_access>();
|
||||
if( _options->count("api-access") ) {
|
||||
|
||||
if(fc::exists(_options->at("api-access").as<boost::filesystem::path>()))
|
||||
{
|
||||
_apiaccess = fc::json::from_file( _options->at("api-access").as<boost::filesystem::path>() ).as<api_access>( 20 );
|
||||
ilog( "Using api access file from ${path}",
|
||||
("path", _options->at("api-access").as<boost::filesystem::path>().string()) );
|
||||
}
|
||||
else
|
||||
{
|
||||
elog("Failed to load file from ${path}",
|
||||
("path", _options->at("api-access").as<boost::filesystem::path>().string()));
|
||||
std::exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: Remove this generous default access policy
|
||||
|
|
@ -942,7 +953,7 @@ void application::initialize(const fc::path& data_dir, const boost::program_opti
|
|||
if( fc::exists(genesis_out) )
|
||||
{
|
||||
try {
|
||||
genesis_state = fc::json::from_file(genesis_out).as<genesis_state_type>();
|
||||
genesis_state = fc::json::from_file(genesis_out).as<genesis_state_type>( 20 );
|
||||
} catch(const fc::exception& e) {
|
||||
std::cerr << "Unable to parse existing genesis file:\n" << e.to_string()
|
||||
<< "\nWould you like to replace it? [y/N] ";
|
||||
|
|
|
|||
|
|
@ -47,9 +47,6 @@ typedef std::map< std::pair<graphene::chain::asset_id_type, graphene::chain::ass
|
|||
|
||||
namespace graphene { namespace app {
|
||||
|
||||
class database_api_impl;
|
||||
|
||||
|
||||
class database_api_impl : public std::enable_shared_from_this<database_api_impl>
|
||||
{
|
||||
public:
|
||||
|
|
@ -217,7 +214,7 @@ class database_api_impl : public std::enable_shared_from_this<database_api_impl>
|
|||
|
||||
auto sub = _market_subscriptions.find( market );
|
||||
if( sub != _market_subscriptions.end() ) {
|
||||
queue[market].emplace_back( full_object ? obj->to_variant() : fc::variant(obj->id) );
|
||||
queue[market].emplace_back( full_object ? obj->to_variant() : fc::variant(obj->id, 1) );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -273,7 +270,7 @@ database_api_impl::database_api_impl( graphene::chain::database& db ):_db(db)
|
|||
_applied_block_connection = _db.applied_block.connect([this](const signed_block&){ on_applied_block(); });
|
||||
|
||||
_pending_trx_connection = _db.on_pending_transaction.connect([this](const signed_transaction& trx ){
|
||||
if( _pending_trx_callback ) _pending_trx_callback( fc::variant(trx) );
|
||||
if( _pending_trx_callback ) _pending_trx_callback( fc::variant(trx, GRAPHENE_MAX_NESTED_OBJECTS) );
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -651,7 +648,7 @@ std::map<std::string, full_account> database_api_impl::get_full_accounts( const
|
|||
{
|
||||
const account_object* account = nullptr;
|
||||
if (std::isdigit(account_name_or_id[0]))
|
||||
account = _db.find(fc::variant(account_name_or_id).as<account_id_type>());
|
||||
account = _db.find(fc::variant(account_name_or_id, 1).as<account_id_type>(1));
|
||||
else
|
||||
{
|
||||
const auto& idx = _db.get_index_type<account_index>().indices().get<by_name>();
|
||||
|
|
@ -669,7 +666,6 @@ std::map<std::string, full_account> database_api_impl::get_full_accounts( const
|
|||
subscribe_to_item( account->id );
|
||||
}
|
||||
|
||||
// fc::mutable_variant_object full_account;
|
||||
full_account acnt;
|
||||
acnt.account = *account;
|
||||
acnt.statistics = account->statistics(_db);
|
||||
|
|
@ -678,12 +674,6 @@ std::map<std::string, full_account> database_api_impl::get_full_accounts( const
|
|||
acnt.lifetime_referrer_name = account->lifetime_referrer(_db).name;
|
||||
acnt.votes = lookup_vote_ids( vector<vote_id_type>(account->options.votes.begin(),account->options.votes.end()) );
|
||||
|
||||
// Add the account itself, its statistics object, cashback balance, and referral account names
|
||||
/*
|
||||
full_account("account", *account)("statistics", account->statistics(_db))
|
||||
("registrar_name", account->registrar(_db).name)("referrer_name", account->referrer(_db).name)
|
||||
("lifetime_referrer_name", account->lifetime_referrer(_db).name);
|
||||
*/
|
||||
if (account->cashback_vb)
|
||||
{
|
||||
acnt.cashback_balance = account->cashback_balance(_db);
|
||||
|
|
@ -1013,7 +1003,7 @@ vector<optional<asset_object>> database_api_impl::lookup_asset_symbols(const vec
|
|||
[this, &assets_by_symbol](const string& symbol_or_id) -> optional<asset_object> {
|
||||
if( !symbol_or_id.empty() && std::isdigit(symbol_or_id[0]) )
|
||||
{
|
||||
auto ptr = _db.find(variant(symbol_or_id).as<asset_id_type>());
|
||||
auto ptr = _db.find(variant(symbol_or_id, 1).as<asset_id_type>(1));
|
||||
return ptr == nullptr? optional<asset_object>() : *ptr;
|
||||
}
|
||||
auto itr = assets_by_symbol.find(symbol_or_id);
|
||||
|
|
@ -1712,7 +1702,7 @@ vector<variant> database_api_impl::lookup_vote_ids( const vector<vote_id_type>&
|
|||
{
|
||||
auto itr = committee_idx.find( id );
|
||||
if( itr != committee_idx.end() )
|
||||
result.emplace_back( variant( *itr ) );
|
||||
result.emplace_back( variant( *itr, 1 ) );
|
||||
else
|
||||
result.emplace_back( variant() );
|
||||
break;
|
||||
|
|
@ -1721,7 +1711,7 @@ vector<variant> database_api_impl::lookup_vote_ids( const vector<vote_id_type>&
|
|||
{
|
||||
auto itr = witness_idx.find( id );
|
||||
if( itr != witness_idx.end() )
|
||||
result.emplace_back( variant( *itr ) );
|
||||
result.emplace_back( variant( *itr, 1 ) );
|
||||
else
|
||||
result.emplace_back( variant() );
|
||||
break;
|
||||
|
|
@ -1730,12 +1720,12 @@ vector<variant> database_api_impl::lookup_vote_ids( const vector<vote_id_type>&
|
|||
{
|
||||
auto itr = for_worker_idx.find( id );
|
||||
if( itr != for_worker_idx.end() ) {
|
||||
result.emplace_back( variant( *itr ) );
|
||||
result.emplace_back( variant( *itr, 1 ) );
|
||||
}
|
||||
else {
|
||||
auto itr = against_worker_idx.find( id );
|
||||
if( itr != against_worker_idx.end() ) {
|
||||
result.emplace_back( variant( *itr ) );
|
||||
result.emplace_back( variant( *itr, 1 ) );
|
||||
}
|
||||
else {
|
||||
result.emplace_back( variant() );
|
||||
|
|
@ -1744,6 +1734,8 @@ vector<variant> database_api_impl::lookup_vote_ids( const vector<vote_id_type>&
|
|||
break;
|
||||
}
|
||||
case vote_id_type::VOTE_TYPE_COUNT: break; // supress unused enum value warnings
|
||||
default:
|
||||
FC_CAPTURE_AND_THROW( fc::out_of_range_exception, (id) );
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
|
@ -1852,8 +1844,8 @@ bool database_api::verify_authority( const signed_transaction& trx )const
|
|||
bool database_api_impl::verify_authority( const signed_transaction& trx )const
|
||||
{
|
||||
trx.verify_authority( _db.get_chain_id(),
|
||||
[&]( account_id_type id ){ return &id(_db).active; },
|
||||
[&]( account_id_type id ){ return &id(_db).owner; },
|
||||
[this]( account_id_type id ){ return &id(_db).active; },
|
||||
[this]( account_id_type id ){ return &id(_db).owner; },
|
||||
_db.get_global_properties().parameters.max_authority_depth );
|
||||
return true;
|
||||
}
|
||||
|
|
@ -1868,7 +1860,7 @@ bool database_api_impl::verify_account_authority( const string& name_or_id, cons
|
|||
FC_ASSERT( name_or_id.size() > 0);
|
||||
const account_object* account = nullptr;
|
||||
if (std::isdigit(name_or_id[0]))
|
||||
account = _db.find(fc::variant(name_or_id).as<account_id_type>());
|
||||
account = _db.find(fc::variant(name_or_id, 1).as<account_id_type>(1));
|
||||
else
|
||||
{
|
||||
const auto& idx = _db.get_index_type<account_index>().indices().get<by_name>();
|
||||
|
|
@ -1929,7 +1921,7 @@ struct get_required_fees_helper
|
|||
{
|
||||
asset fee = current_fee_schedule.set_fee( op, core_exchange_rate );
|
||||
fc::variant result;
|
||||
fc::to_variant( fee, result );
|
||||
fc::to_variant( fee, result, GRAPHENE_NET_MAX_NESTED_OBJECTS );
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
@ -1949,7 +1941,7 @@ struct get_required_fees_helper
|
|||
// two mutually recursive functions instead of a visitor
|
||||
result.first = current_fee_schedule.set_fee( proposal_create_op, core_exchange_rate );
|
||||
fc::variant vresult;
|
||||
fc::to_variant( result, vresult );
|
||||
fc::to_variant( result, vresult, GRAPHENE_NET_MAX_NESTED_OBJECTS );
|
||||
return vresult;
|
||||
}
|
||||
|
||||
|
|
@ -2211,7 +2203,7 @@ void database_api_impl::handle_object_changed(bool force_notify, bool full_objec
|
|||
}
|
||||
else
|
||||
{
|
||||
updates.emplace_back( id );
|
||||
updates.emplace_back( fc::variant( id, 1 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2255,7 +2247,7 @@ void database_api_impl::on_applied_block()
|
|||
auto capture_this = shared_from_this();
|
||||
block_id_type block_id = _db.head_block_id();
|
||||
fc::async([this,capture_this,block_id](){
|
||||
_block_applied_callback(fc::variant(block_id));
|
||||
_block_applied_callback(fc::variant(block_id, 1));
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -2296,7 +2288,7 @@ void database_api_impl::on_applied_block()
|
|||
{
|
||||
auto itr = _market_subscriptions.find(item.first);
|
||||
if(itr != _market_subscriptions.end())
|
||||
itr->second(fc::variant(item.second));
|
||||
itr->second(fc::variant(item.second, GRAPHENE_NET_MAX_NESTED_OBJECTS));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -121,16 +121,24 @@ class plugin : public abstract_plugin
|
|||
/// @group Some useful tools for boost::program_options arguments using vectors of JSON strings
|
||||
/// @{
|
||||
template<typename T>
|
||||
T dejsonify(const string& s)
|
||||
T dejsonify(const string& s, uint32_t max_depth)
|
||||
{
|
||||
return fc::json::from_string(s).as<T>();
|
||||
return fc::json::from_string(s).as<T>(max_depth);
|
||||
}
|
||||
|
||||
namespace impl {
|
||||
template<typename T>
|
||||
T dejsonify( const string& s )
|
||||
{
|
||||
return graphene::app::dejsonify<T>( s, GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
}
|
||||
}
|
||||
|
||||
#define DEFAULT_VALUE_VECTOR(value) default_value({fc::json::to_string(value)}, fc::json::to_string(value))
|
||||
#define LOAD_VALUE_SET(options, name, container, type) \
|
||||
if( options.count(name) ) { \
|
||||
const std::vector<std::string>& ops = options[name].as<std::vector<std::string>>(); \
|
||||
std::transform(ops.begin(), ops.end(), std::inserter(container, container.end()), &graphene::app::dejsonify<type>); \
|
||||
std::transform(ops.begin(), ops.end(), std::inserter(container, container.end()), &graphene::app::impl::dejsonify<type>); \
|
||||
}
|
||||
/// @}
|
||||
|
||||
|
|
|
|||
|
|
@ -543,35 +543,35 @@ void betting_market_group_object::dispatch_new_status(database& db, betting_mark
|
|||
|
||||
namespace fc {
|
||||
// Manually reflect betting_market_group_object to variant to properly reflect "state"
|
||||
void to_variant(const graphene::chain::betting_market_group_object& betting_market_group_obj, fc::variant& v)
|
||||
void to_variant(const graphene::chain::betting_market_group_object& betting_market_group_obj, fc::variant& v, uint32_t max_depth)
|
||||
{
|
||||
fc::mutable_variant_object o;
|
||||
o("id", betting_market_group_obj.id)
|
||||
("description", betting_market_group_obj.description)
|
||||
("event_id", betting_market_group_obj.event_id)
|
||||
("rules_id", betting_market_group_obj.rules_id)
|
||||
("asset_id", betting_market_group_obj.asset_id)
|
||||
("total_matched_bets_amount", betting_market_group_obj.total_matched_bets_amount)
|
||||
("never_in_play", betting_market_group_obj.never_in_play)
|
||||
("delay_before_settling", betting_market_group_obj.delay_before_settling)
|
||||
("settling_time", betting_market_group_obj.settling_time)
|
||||
("status", betting_market_group_obj.get_status());
|
||||
o("id", fc::variant(betting_market_group_obj.id, max_depth))
|
||||
("description", fc::variant(betting_market_group_obj.description, max_depth))
|
||||
("event_id", fc::variant(betting_market_group_obj.event_id, max_depth))
|
||||
("rules_id", fc::variant(betting_market_group_obj.rules_id, max_depth))
|
||||
("asset_id", fc::variant(betting_market_group_obj.asset_id, max_depth))
|
||||
("total_matched_bets_amount", fc::variant(betting_market_group_obj.total_matched_bets_amount, max_depth))
|
||||
("never_in_play", fc::variant(betting_market_group_obj.never_in_play, max_depth))
|
||||
("delay_before_settling", fc::variant(betting_market_group_obj.delay_before_settling, max_depth))
|
||||
("settling_time", fc::variant(betting_market_group_obj.settling_time, max_depth))
|
||||
("status", fc::variant(betting_market_group_obj.get_status(), max_depth));
|
||||
|
||||
v = o;
|
||||
}
|
||||
|
||||
// Manually reflect betting_market_group_object to variant to properly reflect "state"
|
||||
void from_variant(const fc::variant& v, graphene::chain::betting_market_group_object& betting_market_group_obj)
|
||||
void from_variant(const fc::variant& v, graphene::chain::betting_market_group_object& betting_market_group_obj, uint32_t max_depth)
|
||||
{
|
||||
betting_market_group_obj.id = v["id"].as<graphene::chain::betting_market_group_id_type>();
|
||||
betting_market_group_obj.description = v["description"].as<graphene::chain::internationalized_string_type>();
|
||||
betting_market_group_obj.event_id = v["event_id"].as<graphene::chain::event_id_type>();
|
||||
betting_market_group_obj.asset_id = v["asset_id"].as<graphene::chain::asset_id_type>();
|
||||
betting_market_group_obj.total_matched_bets_amount = v["total_matched_bets_amount"].as<graphene::chain::share_type>();
|
||||
betting_market_group_obj.never_in_play = v["never_in_play"].as<bool>();
|
||||
betting_market_group_obj.delay_before_settling = v["delay_before_settling"].as<uint32_t>();
|
||||
betting_market_group_obj.settling_time = v["settling_time"].as<fc::optional<fc::time_point_sec>>();
|
||||
graphene::chain::betting_market_group_status status = v["status"].as<graphene::chain::betting_market_group_status>();
|
||||
betting_market_group_obj.id = v["id"].as<graphene::chain::betting_market_group_id_type>( max_depth );
|
||||
betting_market_group_obj.description = v["description"].as<graphene::chain::internationalized_string_type>( max_depth );
|
||||
betting_market_group_obj.event_id = v["event_id"].as<graphene::chain::event_id_type>( max_depth );
|
||||
betting_market_group_obj.asset_id = v["asset_id"].as<graphene::chain::asset_id_type>( max_depth );
|
||||
betting_market_group_obj.total_matched_bets_amount = v["total_matched_bets_amount"].as<graphene::chain::share_type>( max_depth );
|
||||
betting_market_group_obj.never_in_play = v["never_in_play"].as<bool>( max_depth );
|
||||
betting_market_group_obj.delay_before_settling = v["delay_before_settling"].as<uint32_t>( max_depth );
|
||||
betting_market_group_obj.settling_time = v["settling_time"].as<fc::optional<fc::time_point_sec>>( max_depth );
|
||||
graphene::chain::betting_market_group_status status = v["status"].as<graphene::chain::betting_market_group_status>( max_depth );
|
||||
const_cast<int*>(betting_market_group_obj.my->state_machine.current_state())[0] = (int)status;
|
||||
}
|
||||
} //end namespace fc
|
||||
|
|
|
|||
|
|
@ -468,28 +468,28 @@ void betting_market_object::on_canceled_event(database& db)
|
|||
|
||||
namespace fc {
|
||||
// Manually reflect betting_market_object to variant to properly reflect "state"
|
||||
void to_variant(const graphene::chain::betting_market_object& event_obj, fc::variant& v)
|
||||
void to_variant(const graphene::chain::betting_market_object& event_obj, fc::variant& v, uint32_t max_depth)
|
||||
{
|
||||
fc::mutable_variant_object o;
|
||||
o("id", event_obj.id)
|
||||
("group_id", event_obj.group_id)
|
||||
("description", event_obj.description)
|
||||
("payout_condition", event_obj.payout_condition)
|
||||
("resolution", event_obj.resolution)
|
||||
("status", event_obj.get_status());
|
||||
o("id", fc::variant(event_obj.id, max_depth) )
|
||||
("group_id", fc::variant(event_obj.group_id, max_depth))
|
||||
("description", fc::variant(event_obj.description, max_depth))
|
||||
("payout_condition", fc::variant(event_obj.payout_condition, max_depth))
|
||||
("resolution", fc::variant(event_obj.resolution, max_depth))
|
||||
("status", fc::variant(event_obj.get_status(), max_depth));
|
||||
|
||||
v = o;
|
||||
}
|
||||
|
||||
// Manually reflect betting_market_object to variant to properly reflect "state"
|
||||
void from_variant(const fc::variant& v, graphene::chain::betting_market_object& event_obj)
|
||||
void from_variant(const fc::variant& v, graphene::chain::betting_market_object& event_obj, uint32_t max_depth)
|
||||
{
|
||||
event_obj.id = v["id"].as<graphene::chain::betting_market_id_type>();
|
||||
event_obj.group_id = v["name"].as<graphene::chain::betting_market_group_id_type>();
|
||||
event_obj.description = v["description"].as<graphene::chain::internationalized_string_type>();
|
||||
event_obj.payout_condition = v["payout_condition"].as<graphene::chain::internationalized_string_type>();
|
||||
event_obj.resolution = v["resolution"].as<fc::optional<graphene::chain::betting_market_resolution_type>>();
|
||||
graphene::chain::betting_market_status status = v["status"].as<graphene::chain::betting_market_status>();
|
||||
event_obj.id = v["id"].as<graphene::chain::betting_market_id_type>( max_depth );
|
||||
event_obj.group_id = v["name"].as<graphene::chain::betting_market_group_id_type>( max_depth );
|
||||
event_obj.description = v["description"].as<graphene::chain::internationalized_string_type>( max_depth );
|
||||
event_obj.payout_condition = v["payout_condition"].as<graphene::chain::internationalized_string_type>( max_depth );
|
||||
event_obj.resolution = v["resolution"].as<fc::optional<graphene::chain::betting_market_resolution_type>>( max_depth );
|
||||
graphene::chain::betting_market_status status = v["status"].as<graphene::chain::betting_market_status>( max_depth );
|
||||
const_cast<int*>(event_obj.my->state_machine.current_state())[0] = (int)status;
|
||||
}
|
||||
} //end namespace fc
|
||||
|
|
|
|||
|
|
@ -118,10 +118,10 @@ void debug_apply_update( database& db, const fc::variant_object& vo )
|
|||
auto it_id = vo.find("id");
|
||||
FC_ASSERT( it_id != vo.end() );
|
||||
|
||||
from_variant( it_id->value(), oid );
|
||||
from_variant( it_id->value(), oid, GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
action = ( vo.size() == 1 ) ? db_action_delete : db_action_write;
|
||||
|
||||
from_variant( vo["id"], oid );
|
||||
from_variant( vo["id"], oid, GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
if( vo.size() == 1 )
|
||||
action = db_action_delete;
|
||||
auto it_action = vo.find("_action" );
|
||||
|
|
@ -143,25 +143,19 @@ void debug_apply_update( database& db, const fc::variant_object& vo )
|
|||
switch( action )
|
||||
{
|
||||
case db_action_create:
|
||||
/*
|
||||
idx.create( [&]( object& obj )
|
||||
{
|
||||
idx.object_from_variant( vo, obj );
|
||||
} );
|
||||
*/
|
||||
FC_ASSERT( false );
|
||||
break;
|
||||
case db_action_write:
|
||||
db.modify( db.get_object( oid ), [&]( object& obj )
|
||||
{
|
||||
idx.object_default( obj );
|
||||
idx.object_from_variant( vo, obj );
|
||||
idx.object_from_variant( vo, obj, GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
} );
|
||||
break;
|
||||
case db_action_update:
|
||||
db.modify( db.get_object( oid ), [&]( object& obj )
|
||||
{
|
||||
idx.object_from_variant( vo, obj );
|
||||
idx.object_from_variant( vo, obj, GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
} );
|
||||
break;
|
||||
case db_action_delete:
|
||||
|
|
|
|||
|
|
@ -742,7 +742,7 @@ void database::init_genesis(const genesis_state_type& genesis_state)
|
|||
vbo.owner = get_account_id(account.name);
|
||||
vbo.balance = asset(vesting_balance.amount, get_asset_id(vesting_balance.asset_symbol));
|
||||
if (vesting_balance.policy_type == "linear") {
|
||||
auto initial_linear_vesting_policy = vesting_balance.policy.as<genesis_state_type::initial_bts_account_type::initial_linear_vesting_policy>();
|
||||
auto initial_linear_vesting_policy = vesting_balance.policy.as<genesis_state_type::initial_bts_account_type::initial_linear_vesting_policy>( 20 );
|
||||
linear_vesting_policy new_vesting_policy;
|
||||
new_vesting_policy.begin_timestamp = initial_linear_vesting_policy.begin_timestamp;
|
||||
new_vesting_policy.vesting_cliff_seconds = initial_linear_vesting_policy.vesting_cliff_seconds;
|
||||
|
|
@ -750,7 +750,7 @@ void database::init_genesis(const genesis_state_type& genesis_state)
|
|||
new_vesting_policy.begin_balance = initial_linear_vesting_policy.begin_balance;
|
||||
vbo.policy = new_vesting_policy;
|
||||
} else if (vesting_balance.policy_type == "cdd") {
|
||||
auto initial_cdd_vesting_policy = vesting_balance.policy.as<genesis_state_type::initial_bts_account_type::initial_cdd_vesting_policy>();
|
||||
auto initial_cdd_vesting_policy = vesting_balance.policy.as<genesis_state_type::initial_bts_account_type::initial_cdd_vesting_policy>( 20 );
|
||||
cdd_vesting_policy new_vesting_policy;
|
||||
new_vesting_policy.vesting_seconds = initial_cdd_vesting_policy.vesting_seconds;
|
||||
new_vesting_policy.coin_seconds_earned = initial_cdd_vesting_policy.coin_seconds_earned;
|
||||
|
|
|
|||
|
|
@ -553,30 +553,30 @@ namespace graphene { namespace chain {
|
|||
|
||||
namespace fc {
|
||||
// Manually reflect event_object to variant to properly reflect "state"
|
||||
void to_variant(const graphene::chain::event_object& event_obj, fc::variant& v)
|
||||
void to_variant(const graphene::chain::event_object& event_obj, fc::variant& v, uint32_t max_depth)
|
||||
{
|
||||
fc::mutable_variant_object o;
|
||||
o("id", event_obj.id)
|
||||
("name", event_obj.name)
|
||||
("season", event_obj.season)
|
||||
("start_time", event_obj.start_time)
|
||||
("event_group_id", event_obj.event_group_id)
|
||||
("scores", event_obj.scores)
|
||||
("status", event_obj.get_status());
|
||||
o("id", fc::variant(event_obj.id, max_depth))
|
||||
("name", fc::variant(event_obj.name, max_depth))
|
||||
("season", fc::variant(event_obj.season, max_depth))
|
||||
("start_time", fc::variant(event_obj.start_time, max_depth))
|
||||
("event_group_id", fc::variant(event_obj.event_group_id, max_depth))
|
||||
("scores", fc::variant(event_obj.scores, max_depth))
|
||||
("status", fc::variant(event_obj.get_status(), max_depth));
|
||||
|
||||
v = o;
|
||||
}
|
||||
|
||||
// Manually reflect event_object to variant to properly reflect "state"
|
||||
void from_variant(const fc::variant& v, graphene::chain::event_object& event_obj)
|
||||
void from_variant(const fc::variant& v, graphene::chain::event_object& event_obj, uint32_t max_depth)
|
||||
{
|
||||
event_obj.id = v["id"].as<graphene::chain::event_id_type>();
|
||||
event_obj.name = v["name"].as<graphene::chain::internationalized_string_type>();
|
||||
event_obj.season = v["season"].as<graphene::chain::internationalized_string_type>();
|
||||
event_obj.start_time = v["start_time"].as<optional<time_point_sec> >();
|
||||
event_obj.event_group_id = v["event_group_id"].as<graphene::chain::event_group_id_type>();
|
||||
event_obj.scores = v["scores"].as<std::vector<std::string>>();
|
||||
graphene::chain::event_status status = v["status"].as<graphene::chain::event_status>();
|
||||
event_obj.id = v["id"].as<graphene::chain::event_id_type>( max_depth );
|
||||
event_obj.name = v["name"].as<graphene::chain::internationalized_string_type>( max_depth );
|
||||
event_obj.season = v["season"].as<graphene::chain::internationalized_string_type>( max_depth );
|
||||
event_obj.start_time = v["start_time"].as<optional<time_point_sec> >( max_depth );
|
||||
event_obj.event_group_id = v["event_group_id"].as<graphene::chain::event_group_id_type>( max_depth );
|
||||
event_obj.scores = v["scores"].as<std::vector<std::string>>( max_depth );
|
||||
graphene::chain::event_status status = v["status"].as<graphene::chain::event_status>( max_depth );
|
||||
const_cast<int*>(event_obj.my->state_machine.current_state())[0] = (int)status;
|
||||
}
|
||||
} //end namespace fc
|
||||
|
|
|
|||
|
|
@ -549,33 +549,33 @@ namespace graphene { namespace chain {
|
|||
|
||||
namespace fc {
|
||||
// Manually reflect game_object to variant to properly reflect "state"
|
||||
void to_variant(const graphene::chain::game_object& game_obj, fc::variant& v)
|
||||
void to_variant(const graphene::chain::game_object& game_obj, fc::variant& v, uint32_t max_depth)
|
||||
{
|
||||
fc_elog(fc::logger::get("tournament"), "In game_obj to_variant");
|
||||
elog("In game_obj to_variant");
|
||||
fc::mutable_variant_object o;
|
||||
o("id", game_obj.id)
|
||||
("match_id", game_obj.match_id)
|
||||
("players", game_obj.players)
|
||||
("winners", game_obj.winners)
|
||||
("game_details", game_obj.game_details)
|
||||
("next_timeout", game_obj.next_timeout)
|
||||
("state", game_obj.get_state());
|
||||
o("id", fc::variant(game_obj.id, max_depth ))
|
||||
("match_id", fc::variant(game_obj.match_id, max_depth ))
|
||||
("players", fc::variant(game_obj.players, max_depth ))
|
||||
("winners", fc::variant(game_obj.winners, max_depth ))
|
||||
("game_details", fc::variant(game_obj.game_details, max_depth ))
|
||||
("next_timeout", fc::variant(game_obj.next_timeout, max_depth ))
|
||||
("state", fc::variant(game_obj.get_state(), max_depth ));
|
||||
|
||||
v = o;
|
||||
}
|
||||
|
||||
// Manually reflect game_object to variant to properly reflect "state"
|
||||
void from_variant(const fc::variant& v, graphene::chain::game_object& game_obj)
|
||||
void from_variant(const fc::variant& v, graphene::chain::game_object& game_obj, uint32_t max_depth)
|
||||
{
|
||||
fc_elog(fc::logger::get("tournament"), "In game_obj from_variant");
|
||||
game_obj.id = v["id"].as<graphene::chain::game_id_type>();
|
||||
game_obj.match_id = v["match_id"].as<graphene::chain::match_id_type>();
|
||||
game_obj.players = v["players"].as<std::vector<graphene::chain::account_id_type> >();
|
||||
game_obj.winners = v["winners"].as<flat_set<graphene::chain::account_id_type> >();
|
||||
game_obj.game_details = v["game_details"].as<graphene::chain::game_specific_details>();
|
||||
game_obj.next_timeout = v["next_timeout"].as<fc::optional<time_point_sec> >();
|
||||
graphene::chain::game_state state = v["state"].as<graphene::chain::game_state>();
|
||||
game_obj.id = v["id"].as<graphene::chain::game_id_type>( max_depth );
|
||||
game_obj.match_id = v["match_id"].as<graphene::chain::match_id_type>( max_depth );
|
||||
game_obj.players = v["players"].as<std::vector<graphene::chain::account_id_type> >( max_depth );
|
||||
game_obj.winners = v["winners"].as<flat_set<graphene::chain::account_id_type> >( max_depth );
|
||||
game_obj.game_details = v["game_details"].as<graphene::chain::game_specific_details>( max_depth );
|
||||
game_obj.next_timeout = v["next_timeout"].as<fc::optional<time_point_sec> >( max_depth );
|
||||
graphene::chain::game_state state = v["state"].as<graphene::chain::game_state>( max_depth );
|
||||
const_cast<int*>(game_obj.my->state_machine.current_state())[0] = (int)state;
|
||||
}
|
||||
} //end namespace fc
|
||||
|
|
|
|||
|
|
@ -103,11 +103,11 @@ fc::variant_object get_config()
|
|||
result[ "GRAPHENE_DEFAULT_WITNESS_PAY_VESTING_SECONDS" ] = GRAPHENE_DEFAULT_WITNESS_PAY_VESTING_SECONDS;
|
||||
result[ "GRAPHENE_DEFAULT_WORKER_BUDGET_PER_DAY" ] = GRAPHENE_DEFAULT_WORKER_BUDGET_PER_DAY;
|
||||
result[ "GRAPHENE_MAX_INTEREST_APR" ] = GRAPHENE_MAX_INTEREST_APR;
|
||||
result[ "GRAPHENE_COMMITTEE_ACCOUNT" ] = GRAPHENE_COMMITTEE_ACCOUNT;
|
||||
result[ "GRAPHENE_WITNESS_ACCOUNT" ] = GRAPHENE_WITNESS_ACCOUNT;
|
||||
result[ "GRAPHENE_RELAXED_COMMITTEE_ACCOUNT" ] = GRAPHENE_RELAXED_COMMITTEE_ACCOUNT;
|
||||
result[ "GRAPHENE_NULL_ACCOUNT" ] = GRAPHENE_NULL_ACCOUNT;
|
||||
result[ "GRAPHENE_TEMP_ACCOUNT" ] = GRAPHENE_TEMP_ACCOUNT;
|
||||
result[ "GRAPHENE_COMMITTEE_ACCOUNT" ] = fc::variant(GRAPHENE_COMMITTEE_ACCOUNT, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
result[ "GRAPHENE_WITNESS_ACCOUNT" ] = fc::variant(GRAPHENE_WITNESS_ACCOUNT, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
result[ "GRAPHENE_RELAXED_COMMITTEE_ACCOUNT" ] = fc::variant(GRAPHENE_RELAXED_COMMITTEE_ACCOUNT, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
result[ "GRAPHENE_NULL_ACCOUNT" ] = fc::variant(GRAPHENE_NULL_ACCOUNT, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
result[ "GRAPHENE_TEMP_ACCOUNT" ] = fc::variant(GRAPHENE_TEMP_ACCOUNT, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,10 +37,10 @@ namespace graphene { namespace chain {
|
|||
} }
|
||||
|
||||
namespace fc {
|
||||
void to_variant(const graphene::chain::betting_market_object& betting_market_obj, fc::variant& v);
|
||||
void from_variant(const fc::variant& v, graphene::chain::betting_market_object& betting_market_obj);
|
||||
void to_variant(const graphene::chain::betting_market_group_object& betting_market_group_obj, fc::variant& v);
|
||||
void from_variant(const fc::variant& v, graphene::chain::betting_market_group_object& betting_market_group_obj);
|
||||
void to_variant(const graphene::chain::betting_market_object& betting_market_obj, fc::variant& v, uint32_t max_depth = 1);
|
||||
void from_variant(const fc::variant& v, graphene::chain::betting_market_object& betting_market_obj, uint32_t max_depth = 1);
|
||||
void to_variant(const graphene::chain::betting_market_group_object& betting_market_group_obj, fc::variant& v, uint32_t max_depth = 1);
|
||||
void from_variant(const fc::variant& v, graphene::chain::betting_market_group_object& betting_market_group_obj, uint32_t max_depth = 1);
|
||||
} //end namespace fc
|
||||
|
||||
namespace graphene { namespace chain {
|
||||
|
|
@ -110,8 +110,8 @@ class betting_market_group_object : public graphene::db::abstract_object< bettin
|
|||
template<typename Stream>
|
||||
friend Stream& operator>>( Stream& s, betting_market_group_object& betting_market_group_obj );
|
||||
|
||||
friend void ::fc::to_variant(const graphene::chain::betting_market_group_object& betting_market_group_obj, fc::variant& v);
|
||||
friend void ::fc::from_variant(const fc::variant& v, graphene::chain::betting_market_group_object& betting_market_group_obj);
|
||||
friend void ::fc::to_variant(const graphene::chain::betting_market_group_object& betting_market_group_obj, fc::variant& v, uint32_t max_depth);
|
||||
friend void ::fc::from_variant(const fc::variant& v, graphene::chain::betting_market_group_object& betting_market_group_obj, uint32_t max_depth);
|
||||
|
||||
void pack_impl(std::ostream& stream) const;
|
||||
void unpack_impl(std::istream& stream);
|
||||
|
|
@ -166,8 +166,8 @@ class betting_market_object : public graphene::db::abstract_object< betting_mark
|
|||
template<typename Stream>
|
||||
friend Stream& operator>>( Stream& s, betting_market_object& betting_market_obj );
|
||||
|
||||
friend void ::fc::to_variant(const graphene::chain::betting_market_object& betting_market_obj, fc::variant& v);
|
||||
friend void ::fc::from_variant(const fc::variant& v, graphene::chain::betting_market_object& betting_market_obj);
|
||||
friend void ::fc::to_variant(const graphene::chain::betting_market_object& betting_market_obj, fc::variant& v, uint32_t max_depth);
|
||||
friend void ::fc::from_variant(const fc::variant& v, graphene::chain::betting_market_object& betting_market_obj, uint32_t max_depth);
|
||||
|
||||
void pack_impl(std::ostream& stream) const;
|
||||
void unpack_impl(std::istream& stream);
|
||||
|
|
|
|||
|
|
@ -211,6 +211,7 @@
|
|||
{ 10000000, 100000} } /* <= 1000: 10.00 */
|
||||
#define GRAPHENE_DEFAULT_BETTING_PERCENT_FEE (2 * GRAPHENE_1_PERCENT)
|
||||
#define GRAPHENE_DEFAULT_LIVE_BETTING_DELAY_TIME 5 // seconds
|
||||
#define GRAPHENE_MAX_NESTED_OBJECTS (200)
|
||||
#define TOURNAMENT_MIN_ROUND_DELAY 0
|
||||
#define TOURNAMENT_MAX_ROUND_DELAY 600
|
||||
#define TOURNAMENT_MIN_TIME_PER_COMMIT_MOVE 0
|
||||
|
|
|
|||
|
|
@ -36,8 +36,8 @@ namespace graphene { namespace chain {
|
|||
} }
|
||||
|
||||
namespace fc {
|
||||
void to_variant(const graphene::chain::event_object& event_obj, fc::variant& v);
|
||||
void from_variant(const fc::variant& v, graphene::chain::event_object& event_obj);
|
||||
void to_variant(const graphene::chain::event_object& event_obj, fc::variant& v, uint32_t max_depth = 1);
|
||||
void from_variant(const fc::variant& v, graphene::chain::event_object& event_obj, uint32_t max_depth = 1);
|
||||
} //end namespace fc
|
||||
|
||||
namespace graphene { namespace chain {
|
||||
|
|
@ -77,8 +77,8 @@ class event_object : public graphene::db::abstract_object< event_object >
|
|||
template<typename Stream>
|
||||
friend Stream& operator>>( Stream& s, event_object& event_obj );
|
||||
|
||||
friend void ::fc::to_variant(const graphene::chain::event_object& event_obj, fc::variant& v);
|
||||
friend void ::fc::from_variant(const fc::variant& v, graphene::chain::event_object& event_obj);
|
||||
friend void ::fc::to_variant(const graphene::chain::event_object& event_obj, fc::variant& v, uint32_t max_depth);
|
||||
friend void ::fc::from_variant(const fc::variant& v, graphene::chain::event_object& event_obj, uint32_t max_depth);
|
||||
|
||||
void pack_impl(std::ostream& stream) const;
|
||||
void unpack_impl(std::istream& stream);
|
||||
|
|
|
|||
|
|
@ -36,8 +36,8 @@ namespace graphene { namespace chain {
|
|||
} }
|
||||
|
||||
namespace fc {
|
||||
void to_variant(const graphene::chain::game_object& game_obj, fc::variant& v);
|
||||
void from_variant(const fc::variant& v, graphene::chain::game_object& game_obj);
|
||||
void to_variant(const graphene::chain::game_object& game_obj, fc::variant& v, uint32_t max_depth = 1);
|
||||
void from_variant(const fc::variant& v, graphene::chain::game_object& game_obj, uint32_t max_depth = 1);
|
||||
} //end namespace fc
|
||||
|
||||
namespace graphene { namespace chain {
|
||||
|
|
@ -92,8 +92,8 @@ namespace graphene { namespace chain {
|
|||
template<typename Stream>
|
||||
friend Stream& operator>>( Stream& s, game_object& game_obj );
|
||||
|
||||
friend void ::fc::to_variant(const graphene::chain::game_object& game_obj, fc::variant& v);
|
||||
friend void ::fc::from_variant(const fc::variant& v, graphene::chain::game_object& game_obj);
|
||||
friend void ::fc::to_variant(const graphene::chain::game_object& game_obj, fc::variant& v, uint32_t max_depth);
|
||||
friend void ::fc::from_variant(const fc::variant& v, graphene::chain::game_object& game_obj, uint32_t max_depth);
|
||||
|
||||
void pack_impl(std::ostream& stream) const;
|
||||
void unpack_impl(std::istream& stream);
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@ namespace graphene { namespace chain {
|
|||
} }
|
||||
|
||||
namespace fc {
|
||||
void to_variant(const graphene::chain::match_object& match_obj, fc::variant& v);
|
||||
void from_variant(const fc::variant& v, graphene::chain::match_object& match_obj);
|
||||
void to_variant(const graphene::chain::match_object& match_obj, fc::variant& v, uint32_t max_depth = 1);
|
||||
void from_variant(const fc::variant& v, graphene::chain::match_object& match_obj, uint32_t max_depth = 1);
|
||||
} //end namespace fc
|
||||
|
||||
namespace graphene { namespace chain {
|
||||
|
|
@ -84,8 +84,8 @@ namespace graphene { namespace chain {
|
|||
template<typename Stream>
|
||||
friend Stream& operator>>( Stream& s, match_object& match_obj );
|
||||
|
||||
friend void ::fc::to_variant(const graphene::chain::match_object& match_obj, fc::variant& v);
|
||||
friend void ::fc::from_variant(const fc::variant& v, graphene::chain::match_object& match_obj);
|
||||
friend void ::fc::to_variant(const graphene::chain::match_object& match_obj, fc::variant& v, uint32_t max_depth);
|
||||
friend void ::fc::from_variant(const fc::variant& v, graphene::chain::match_object& match_obj, uint32_t max_depth);
|
||||
|
||||
void pack_impl(std::ostream& stream) const;
|
||||
void unpack_impl(std::istream& stream);
|
||||
|
|
|
|||
|
|
@ -78,8 +78,8 @@ namespace graphene { namespace chain {
|
|||
|
||||
namespace fc
|
||||
{
|
||||
void to_variant( const graphene::chain::address& var, fc::variant& vo );
|
||||
void from_variant( const fc::variant& var, graphene::chain::address& vo );
|
||||
void to_variant( const graphene::chain::address& var, fc::variant& vo, uint32_t max_depth = 1 );
|
||||
void from_variant( const fc::variant& var, graphene::chain::address& vo, uint32_t max_depth = 1 );
|
||||
}
|
||||
|
||||
namespace std
|
||||
|
|
|
|||
|
|
@ -145,9 +145,10 @@ namespace fc {
|
|||
template< typename T >
|
||||
struct graphene_extension_from_variant_visitor
|
||||
{
|
||||
graphene_extension_from_variant_visitor( const variant_object& v, T& val )
|
||||
: vo( v ), value( val )
|
||||
graphene_extension_from_variant_visitor( const variant_object& v, T& val, uint32_t max_depth )
|
||||
: vo( v ), value( val ), _max_depth(max_depth - 1)
|
||||
{
|
||||
FC_ASSERT( max_depth > 0, "Recursion depth exceeded!" );
|
||||
count_left = vo.size();
|
||||
}
|
||||
|
||||
|
|
@ -157,7 +158,7 @@ struct graphene_extension_from_variant_visitor
|
|||
auto it = vo.find(name);
|
||||
if( it != vo.end() )
|
||||
{
|
||||
from_variant( it->value(), (value.*member) );
|
||||
from_variant( it->value(), (value.*member), _max_depth );
|
||||
assert( count_left > 0 ); // x.find(k) returns true for n distinct values of k only if x.size() >= n
|
||||
--count_left;
|
||||
}
|
||||
|
|
@ -165,11 +166,12 @@ struct graphene_extension_from_variant_visitor
|
|||
|
||||
const variant_object& vo;
|
||||
T& value;
|
||||
const uint32_t _max_depth;
|
||||
mutable uint32_t count_left = 0;
|
||||
};
|
||||
|
||||
template< typename T >
|
||||
void from_variant( const fc::variant& var, graphene::chain::extension<T>& value )
|
||||
void from_variant( const fc::variant& var, graphene::chain::extension<T>& value, uint32_t max_depth )
|
||||
{
|
||||
value = graphene::chain::extension<T>();
|
||||
if( var.is_null() )
|
||||
|
|
@ -180,7 +182,7 @@ void from_variant( const fc::variant& var, graphene::chain::extension<T>& value
|
|||
return;
|
||||
}
|
||||
|
||||
graphene_extension_from_variant_visitor<T> vtor( var.get_object(), value.value );
|
||||
graphene_extension_from_variant_visitor<T> vtor( var.get_object(), value.value, max_depth );
|
||||
fc::reflector<T>::visit( vtor );
|
||||
FC_ASSERT( vtor.count_left == 0 ); // unrecognized extension throws here
|
||||
}
|
||||
|
|
@ -188,23 +190,23 @@ void from_variant( const fc::variant& var, graphene::chain::extension<T>& value
|
|||
template< typename T >
|
||||
struct graphene_extension_to_variant_visitor
|
||||
{
|
||||
graphene_extension_to_variant_visitor( const T& v ) : value(v) {}
|
||||
graphene_extension_to_variant_visitor( const T& v, uint32_t max_depth ) : value(v), mvo(max_depth) {}
|
||||
|
||||
template<typename Member, class Class, Member (Class::*member)>
|
||||
void operator()( const char* name )const
|
||||
{
|
||||
if( (value.*member).valid() )
|
||||
mvo[ name ] = (value.*member);
|
||||
mvo( name, value.*member );
|
||||
}
|
||||
|
||||
const T& value;
|
||||
mutable mutable_variant_object mvo;
|
||||
mutable limited_mutable_variant_object mvo;
|
||||
};
|
||||
|
||||
template< typename T >
|
||||
void to_variant( const graphene::chain::extension<T>& value, fc::variant& var )
|
||||
void to_variant( const graphene::chain::extension<T>& value, fc::variant& var, uint32_t max_depth )
|
||||
{
|
||||
graphene_extension_to_variant_visitor<T> vtor( value.value );
|
||||
graphene_extension_to_variant_visitor<T> vtor( value.value, max_depth );
|
||||
fc::reflector<T>::visit( vtor );
|
||||
var = vtor.mvo;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -367,12 +367,12 @@ namespace graphene { namespace chain {
|
|||
|
||||
namespace fc
|
||||
{
|
||||
void to_variant( const graphene::chain::public_key_type& var, fc::variant& vo );
|
||||
void from_variant( const fc::variant& var, graphene::chain::public_key_type& vo );
|
||||
void to_variant( const graphene::chain::extended_public_key_type& var, fc::variant& vo );
|
||||
void from_variant( const fc::variant& var, graphene::chain::extended_public_key_type& vo );
|
||||
void to_variant( const graphene::chain::extended_private_key_type& var, fc::variant& vo );
|
||||
void from_variant( const fc::variant& var, graphene::chain::extended_private_key_type& vo );
|
||||
void to_variant( const graphene::chain::public_key_type& var, fc::variant& vo, uint32_t max_depth = 2 );
|
||||
void from_variant( const fc::variant& var, graphene::chain::public_key_type& vo, uint32_t max_depth = 2 );
|
||||
void to_variant( const graphene::chain::extended_public_key_type& var, fc::variant& vo, uint32_t max_depth = 2 );
|
||||
void from_variant( const fc::variant& var, graphene::chain::extended_public_key_type& vo, uint32_t max_depth = 2 );
|
||||
void to_variant( const graphene::chain::extended_private_key_type& var, fc::variant& vo, uint32_t max_depth = 2 );
|
||||
void from_variant( const fc::variant& var, graphene::chain::extended_private_key_type& vo, uint32_t max_depth = 2 );
|
||||
}
|
||||
|
||||
FC_REFLECT( graphene::chain::public_key_type, (key_data) )
|
||||
|
|
|
|||
|
|
@ -141,8 +141,8 @@ namespace fc
|
|||
|
||||
class variant;
|
||||
|
||||
void to_variant( const graphene::chain::vote_id_type& var, fc::variant& vo );
|
||||
void from_variant( const fc::variant& var, graphene::chain::vote_id_type& vo );
|
||||
void to_variant( const graphene::chain::vote_id_type& var, fc::variant& vo, uint32_t max_depth = 1 );
|
||||
void from_variant( const fc::variant& var, graphene::chain::vote_id_type& vo, uint32_t max_depth = 1 );
|
||||
|
||||
} // fc
|
||||
|
||||
|
|
|
|||
|
|
@ -73,6 +73,6 @@ FC_REFLECT( graphene::chain::pts_address, (addr) )
|
|||
|
||||
namespace fc
|
||||
{
|
||||
void to_variant( const graphene::chain::pts_address& var, fc::variant& vo );
|
||||
void from_variant( const fc::variant& var, graphene::chain::pts_address& vo );
|
||||
void to_variant( const graphene::chain::pts_address& var, fc::variant& vo, uint32_t max_depth = 1 );
|
||||
void from_variant( const fc::variant& var, graphene::chain::pts_address& vo, uint32_t max_depth = 1 );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@ namespace graphene { namespace chain {
|
|||
} }
|
||||
|
||||
namespace fc {
|
||||
void to_variant(const graphene::chain::tournament_object& tournament_obj, fc::variant& v);
|
||||
void from_variant(const fc::variant& v, graphene::chain::tournament_object& tournament_obj);
|
||||
void to_variant(const graphene::chain::tournament_object& tournament_obj, fc::variant& v, uint32_t max_depth = 1);
|
||||
void from_variant(const fc::variant& v, graphene::chain::tournament_object& tournament_obj, uint32_t max_depth = 1);
|
||||
} //end namespace fc
|
||||
|
||||
namespace graphene { namespace chain {
|
||||
|
|
@ -108,8 +108,8 @@ namespace graphene { namespace chain {
|
|||
template<typename Stream>
|
||||
friend Stream& operator>>( Stream& s, tournament_object& tournament_obj );
|
||||
|
||||
friend void ::fc::to_variant(const graphene::chain::tournament_object& tournament_obj, fc::variant& v);
|
||||
friend void ::fc::from_variant(const fc::variant& v, graphene::chain::tournament_object& tournament_obj);
|
||||
friend void ::fc::to_variant(const graphene::chain::tournament_object& tournament_obj, fc::variant& v, uint32_t max_depth);
|
||||
friend void ::fc::from_variant(const fc::variant& v, graphene::chain::tournament_object& tournament_obj, uint32_t max_depth);
|
||||
|
||||
void pack_impl(std::ostream& stream) const;
|
||||
void unpack_impl(std::istream& stream);
|
||||
|
|
|
|||
|
|
@ -364,41 +364,41 @@ namespace graphene { namespace chain {
|
|||
|
||||
namespace fc {
|
||||
// Manually reflect match_object to variant to properly reflect "state"
|
||||
void to_variant(const graphene::chain::match_object& match_obj, fc::variant& v)
|
||||
void to_variant(const graphene::chain::match_object& match_obj, fc::variant& v, uint32_t max_depth)
|
||||
{ try {
|
||||
fc_elog(fc::logger::get("tournament"), "In match_obj to_variant");
|
||||
elog("In match_obj to_variant");
|
||||
fc::mutable_variant_object o;
|
||||
o("id", match_obj.id)
|
||||
("tournament_id", match_obj.tournament_id)
|
||||
("players", match_obj.players)
|
||||
("games", match_obj.games)
|
||||
("game_winners", match_obj.game_winners)
|
||||
("number_of_wins", match_obj.number_of_wins)
|
||||
("number_of_ties", match_obj.number_of_ties)
|
||||
("match_winners", match_obj.match_winners)
|
||||
("start_time", match_obj.start_time)
|
||||
("end_time", match_obj.end_time)
|
||||
("state", match_obj.get_state());
|
||||
o("id", fc::variant(match_obj.id, max_depth))
|
||||
("tournament_id", fc::variant(match_obj.tournament_id, max_depth))
|
||||
("players", fc::variant(match_obj.players, max_depth))
|
||||
("games", fc::variant(match_obj.games, max_depth))
|
||||
("game_winners", fc::variant(match_obj.game_winners, max_depth))
|
||||
("number_of_wins", fc::variant(match_obj.number_of_wins, max_depth))
|
||||
("number_of_ties", fc::variant(match_obj.number_of_ties, max_depth))
|
||||
("match_winners", fc::variant(match_obj.match_winners, max_depth))
|
||||
("start_time", fc::variant(match_obj.start_time, max_depth))
|
||||
("end_time", fc::variant(match_obj.end_time, max_depth))
|
||||
("state", fc::variant(match_obj.get_state(), max_depth));
|
||||
|
||||
v = o;
|
||||
} FC_RETHROW_EXCEPTIONS(warn, "") }
|
||||
|
||||
// Manually reflect match_object to variant to properly reflect "state"
|
||||
void from_variant(const fc::variant& v, graphene::chain::match_object& match_obj)
|
||||
void from_variant(const fc::variant& v, graphene::chain::match_object& match_obj, uint32_t max_depth)
|
||||
{ try {
|
||||
fc_elog(fc::logger::get("tournament"), "In match_obj from_variant");
|
||||
match_obj.id = v["id"].as<graphene::chain::match_id_type>();
|
||||
match_obj.tournament_id = v["tournament_id"].as<graphene::chain::tournament_id_type>();
|
||||
match_obj.players = v["players"].as<std::vector<graphene::chain::account_id_type> >();
|
||||
match_obj.games = v["games"].as<std::vector<graphene::chain::game_id_type> >();
|
||||
match_obj.game_winners = v["game_winners"].as<std::vector<flat_set<graphene::chain::account_id_type> > >();
|
||||
match_obj.number_of_wins = v["number_of_wins"].as<std::vector<uint32_t> >();
|
||||
match_obj.number_of_ties = v["number_of_ties"].as<uint32_t>();
|
||||
match_obj.match_winners = v["match_winners"].as<flat_set<graphene::chain::account_id_type> >();
|
||||
match_obj.start_time = v["start_time"].as<time_point_sec>();
|
||||
match_obj.end_time = v["end_time"].as<optional<time_point_sec> >();
|
||||
graphene::chain::match_state state = v["state"].as<graphene::chain::match_state>();
|
||||
match_obj.id = v["id"].as<graphene::chain::match_id_type>( max_depth );
|
||||
match_obj.tournament_id = v["tournament_id"].as<graphene::chain::tournament_id_type>( max_depth );
|
||||
match_obj.players = v["players"].as<std::vector<graphene::chain::account_id_type> >( max_depth );
|
||||
match_obj.games = v["games"].as<std::vector<graphene::chain::game_id_type> >( max_depth );
|
||||
match_obj.game_winners = v["game_winners"].as<std::vector<flat_set<graphene::chain::account_id_type> > >( max_depth );
|
||||
match_obj.number_of_wins = v["number_of_wins"].as<std::vector<uint32_t> >( max_depth );
|
||||
match_obj.number_of_ties = v["number_of_ties"].as<uint32_t>( max_depth );
|
||||
match_obj.match_winners = v["match_winners"].as<flat_set<graphene::chain::account_id_type> >( max_depth );
|
||||
match_obj.start_time = v["start_time"].as<time_point_sec>( max_depth );
|
||||
match_obj.end_time = v["end_time"].as<optional<time_point_sec> >( max_depth );
|
||||
graphene::chain::match_state state = v["state"].as<graphene::chain::match_state>( max_depth );
|
||||
const_cast<int*>(match_obj.my->state_machine.current_state())[0] = (int)state;
|
||||
} FC_RETHROW_EXCEPTIONS(warn, "") }
|
||||
} //end namespace fc
|
||||
|
|
|
|||
|
|
@ -101,11 +101,11 @@ namespace graphene {
|
|||
|
||||
namespace fc
|
||||
{
|
||||
void to_variant( const graphene::chain::address& var, variant& vo )
|
||||
void to_variant( const graphene::chain::address& var, variant& vo, uint32_t max_depth )
|
||||
{
|
||||
vo = std::string(var);
|
||||
}
|
||||
void from_variant( const variant& var, graphene::chain::address& vo )
|
||||
void from_variant( const variant& var, graphene::chain::address& vo, uint32_t max_depth )
|
||||
{
|
||||
vo = graphene::chain::address( var.as_string() );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -248,32 +248,32 @@ namespace graphene { namespace chain {
|
|||
namespace fc
|
||||
{
|
||||
using namespace std;
|
||||
void to_variant( const graphene::chain::public_key_type& var, fc::variant& vo )
|
||||
void to_variant( const graphene::chain::public_key_type& var, fc::variant& vo, uint32_t max_depth )
|
||||
{
|
||||
vo = std::string( var );
|
||||
}
|
||||
|
||||
void from_variant( const fc::variant& var, graphene::chain::public_key_type& vo )
|
||||
void from_variant( const fc::variant& var, graphene::chain::public_key_type& vo, uint32_t max_depth )
|
||||
{
|
||||
vo = graphene::chain::public_key_type( var.as_string() );
|
||||
}
|
||||
|
||||
void to_variant( const graphene::chain::extended_public_key_type& var, fc::variant& vo )
|
||||
void to_variant( const graphene::chain::extended_public_key_type& var, fc::variant& vo, uint32_t max_depth )
|
||||
{
|
||||
vo = std::string( var );
|
||||
}
|
||||
|
||||
void from_variant( const fc::variant& var, graphene::chain::extended_public_key_type& vo )
|
||||
void from_variant( const fc::variant& var, graphene::chain::extended_public_key_type& vo, uint32_t max_depth )
|
||||
{
|
||||
vo = graphene::chain::extended_public_key_type( var.as_string() );
|
||||
}
|
||||
|
||||
void to_variant( const graphene::chain::extended_private_key_type& var, fc::variant& vo )
|
||||
void to_variant( const graphene::chain::extended_private_key_type& var, fc::variant& vo, uint32_t max_depth )
|
||||
{
|
||||
vo = std::string( var );
|
||||
}
|
||||
|
||||
void from_variant( const fc::variant& var, graphene::chain::extended_private_key_type& vo )
|
||||
void from_variant( const fc::variant& var, graphene::chain::extended_private_key_type& vo, uint32_t max_depth )
|
||||
{
|
||||
vo = graphene::chain::extended_private_key_type( var.as_string() );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,12 +38,12 @@ vote_id_type get_next_vote_id( global_property_object& gpo, vote_id_type::vote_t
|
|||
namespace fc
|
||||
{
|
||||
|
||||
void to_variant(const graphene::chain::vote_id_type& var, variant& vo)
|
||||
void to_variant( const graphene::chain::vote_id_type& var, variant& vo, uint32_t max_depth )
|
||||
{
|
||||
vo = string(var);
|
||||
}
|
||||
|
||||
void from_variant(const variant& var, graphene::chain::vote_id_type& vo)
|
||||
void from_variant( const variant& var, graphene::chain::vote_id_type& vo, uint32_t max_depth )
|
||||
{
|
||||
vo = graphene::chain::vote_id_type(var.as_string());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,11 +89,11 @@ namespace graphene { namespace chain {
|
|||
|
||||
namespace fc
|
||||
{
|
||||
void to_variant( const graphene::chain::pts_address& var, variant& vo )
|
||||
void to_variant( const graphene::chain::pts_address& var, variant& vo, uint32_t max_depth )
|
||||
{
|
||||
vo = std::string(var);
|
||||
}
|
||||
void from_variant( const variant& var, graphene::chain::pts_address& vo )
|
||||
void from_variant( const variant& var, graphene::chain::pts_address& vo, uint32_t max_depth )
|
||||
{
|
||||
vo = graphene::chain::pts_address( var.as_string() );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -722,37 +722,37 @@ namespace graphene { namespace chain {
|
|||
|
||||
namespace fc {
|
||||
// Manually reflect tournament_object to variant to properly reflect "state"
|
||||
void to_variant(const graphene::chain::tournament_object& tournament_obj, fc::variant& v)
|
||||
void to_variant(const graphene::chain::tournament_object& tournament_obj, fc::variant& v, uint32_t max_depth)
|
||||
{
|
||||
fc_elog(fc::logger::get("tournament"), "In tournament_obj to_variant");
|
||||
elog("In tournament_obj to_variant");
|
||||
fc::mutable_variant_object o;
|
||||
o("id", tournament_obj.id)
|
||||
("creator", tournament_obj.creator)
|
||||
("options", tournament_obj.options)
|
||||
("start_time", tournament_obj.start_time)
|
||||
("end_time", tournament_obj.end_time)
|
||||
("prize_pool", tournament_obj.prize_pool)
|
||||
("registered_players", tournament_obj.registered_players)
|
||||
("tournament_details_id", tournament_obj.tournament_details_id)
|
||||
("state", tournament_obj.get_state());
|
||||
o("id", fc::variant(tournament_obj.id, max_depth))
|
||||
("creator", fc::variant(tournament_obj.creator, max_depth))
|
||||
("options", fc::variant(tournament_obj.options, max_depth))
|
||||
("start_time", fc::variant(tournament_obj.start_time, max_depth))
|
||||
("end_time", fc::variant(tournament_obj.end_time, max_depth))
|
||||
("prize_pool", fc::variant(tournament_obj.prize_pool, max_depth))
|
||||
("registered_players", fc::variant(tournament_obj.registered_players, max_depth))
|
||||
("tournament_details_id", fc::variant(tournament_obj.tournament_details_id, max_depth))
|
||||
("state", fc::variant(tournament_obj.get_state(), max_depth));
|
||||
|
||||
v = o;
|
||||
}
|
||||
|
||||
// Manually reflect tournament_object to variant to properly reflect "state"
|
||||
void from_variant(const fc::variant& v, graphene::chain::tournament_object& tournament_obj)
|
||||
void from_variant(const fc::variant& v, graphene::chain::tournament_object& tournament_obj, uint32_t max_depth)
|
||||
{
|
||||
fc_elog(fc::logger::get("tournament"), "In tournament_obj from_variant");
|
||||
tournament_obj.id = v["id"].as<graphene::chain::tournament_id_type>();
|
||||
tournament_obj.creator = v["creator"].as<graphene::chain::account_id_type>();
|
||||
tournament_obj.options = v["options"].as<graphene::chain::tournament_options>();
|
||||
tournament_obj.start_time = v["start_time"].as<optional<time_point_sec> >();
|
||||
tournament_obj.end_time = v["end_time"].as<optional<time_point_sec> >();
|
||||
tournament_obj.prize_pool = v["prize_pool"].as<graphene::chain::share_type>();
|
||||
tournament_obj.registered_players = v["registered_players"].as<uint32_t>();
|
||||
tournament_obj.tournament_details_id = v["tournament_details_id"].as<graphene::chain::tournament_details_id_type>();
|
||||
graphene::chain::tournament_state state = v["state"].as<graphene::chain::tournament_state>();
|
||||
tournament_obj.id = v["id"].as<graphene::chain::tournament_id_type>( max_depth );
|
||||
tournament_obj.creator = v["creator"].as<graphene::chain::account_id_type>( max_depth );
|
||||
tournament_obj.options = v["options"].as<graphene::chain::tournament_options>( max_depth );
|
||||
tournament_obj.start_time = v["start_time"].as<optional<time_point_sec> >( max_depth );
|
||||
tournament_obj.end_time = v["end_time"].as<optional<time_point_sec> >( max_depth );
|
||||
tournament_obj.prize_pool = v["prize_pool"].as<graphene::chain::share_type>( max_depth );
|
||||
tournament_obj.registered_players = v["registered_players"].as<uint32_t>( max_depth );
|
||||
tournament_obj.tournament_details_id = v["tournament_details_id"].as<graphene::chain::tournament_details_id_type>( max_depth );
|
||||
graphene::chain::tournament_state state = v["state"].as<graphene::chain::tournament_state>( max_depth );
|
||||
const_cast<int*>(tournament_obj.my->state_machine.current_state())[0] = (int)state;
|
||||
}
|
||||
} //end namespace fc
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ namespace graphene { namespace db {
|
|||
virtual fc::uint128 hash()const = 0;
|
||||
virtual void add_observer( const shared_ptr<index_observer>& ) = 0;
|
||||
|
||||
virtual void object_from_variant( const fc::variant& var, object& obj )const = 0;
|
||||
virtual void object_from_variant( const fc::variant& var, object& obj, uint32_t max_depth )const = 0;
|
||||
virtual void object_default( object& obj )const = 0;
|
||||
};
|
||||
|
||||
|
|
@ -418,12 +418,12 @@ namespace graphene { namespace db {
|
|||
_observers.emplace_back( o );
|
||||
}
|
||||
|
||||
virtual void object_from_variant( const fc::variant& var, object& obj )const override
|
||||
virtual void object_from_variant( const fc::variant& var, object& obj, uint32_t max_depth )const override
|
||||
{
|
||||
object_id_type id = obj.id;
|
||||
object_type* result = dynamic_cast<object_type*>( &obj );
|
||||
FC_ASSERT( result != nullptr );
|
||||
fc::from_variant( var, *result );
|
||||
fc::from_variant( var, *result, max_depth );
|
||||
obj.id = id;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@
|
|||
#include <fc/crypto/city.hpp>
|
||||
#include <fc/uint128.hpp>
|
||||
|
||||
#define MAX_NESTING (200)
|
||||
|
||||
namespace graphene { namespace db {
|
||||
|
||||
/**
|
||||
|
|
@ -98,7 +100,7 @@ namespace graphene { namespace db {
|
|||
{
|
||||
static_cast<DerivedClass&>(*this) = std::move( static_cast<DerivedClass&>(obj) );
|
||||
}
|
||||
virtual variant to_variant()const { return variant( static_cast<const DerivedClass&>(*this) ); }
|
||||
virtual variant to_variant()const { return variant( static_cast<const DerivedClass&>(*this), MAX_NESTING ); }
|
||||
virtual vector<char> pack()const { return fc::raw::pack( static_cast<const DerivedClass&>(*this) ); }
|
||||
virtual fc::uint128 hash()const {
|
||||
auto tmp = this->pack();
|
||||
|
|
|
|||
|
|
@ -169,12 +169,12 @@ struct reflector<graphene::db::object_id<SpaceID,TypeID,T> >
|
|||
};
|
||||
|
||||
|
||||
inline void to_variant( const graphene::db::object_id_type& var, fc::variant& vo )
|
||||
inline void to_variant( const graphene::db::object_id_type& var, fc::variant& vo, uint32_t max_depth = 1 )
|
||||
{
|
||||
vo = std::string( var );
|
||||
}
|
||||
|
||||
inline void from_variant( const fc::variant& var, graphene::db::object_id_type& vo )
|
||||
inline void from_variant( const fc::variant& var, graphene::db::object_id_type& vo, uint32_t max_depth = 1 )
|
||||
{ try {
|
||||
vo.number = 0;
|
||||
const auto& s = var.get_string();
|
||||
|
|
@ -191,12 +191,12 @@ struct reflector<graphene::db::object_id<SpaceID,TypeID,T> >
|
|||
vo.number |= (space_id << 56) | (type_id << 48);
|
||||
} FC_CAPTURE_AND_RETHROW( (var) ) }
|
||||
template<uint8_t SpaceID, uint8_t TypeID, typename T>
|
||||
void to_variant( const graphene::db::object_id<SpaceID,TypeID,T>& var, fc::variant& vo )
|
||||
void to_variant( const graphene::db::object_id<SpaceID,TypeID,T>& var, fc::variant& vo, uint32_t max_depth = 1 )
|
||||
{
|
||||
vo = fc::to_string(SpaceID) + "." + fc::to_string(TypeID) + "." + fc::to_string(var.instance.value);
|
||||
}
|
||||
template<uint8_t SpaceID, uint8_t TypeID, typename T>
|
||||
void from_variant( const fc::variant& var, graphene::db::object_id<SpaceID,TypeID,T>& vo )
|
||||
void from_variant( const fc::variant& var, graphene::db::object_id<SpaceID,TypeID,T>& vo, uint32_t max_depth = 1 )
|
||||
{ try {
|
||||
const auto& s = var.get_string();
|
||||
auto first_dot = s.find('.');
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ using namespace graphene::chain;
|
|||
|
||||
chain_id_type get_egenesis_chain_id()
|
||||
{
|
||||
return chain_id_type( "${chain_id}$" );
|
||||
return chain_id_type( "${chain_id}" );
|
||||
}
|
||||
|
||||
void compute_egenesis_json( std::string& result )
|
||||
|
|
|
|||
|
|
@ -24,26 +24,25 @@ namespace graphene { namespace egenesis {
|
|||
|
||||
using namespace graphene::chain;
|
||||
|
||||
static const char genesis_json_array[${genesis_json_array_height}$][${genesis_json_array_width}$+1] =
|
||||
static const char genesis_json_array[${genesis_json_array_height}][${genesis_json_array_width}+1] =
|
||||
{
|
||||
${genesis_json_array}$
|
||||
${genesis_json_array}
|
||||
};
|
||||
|
||||
chain_id_type get_egenesis_chain_id()
|
||||
{
|
||||
return chain_id_type( "${chain_id}$" );
|
||||
return chain_id_type( "${chain_id}" );
|
||||
}
|
||||
|
||||
void compute_egenesis_json( std::string& result )
|
||||
{
|
||||
result.reserve( ${genesis_json_length}$ );
|
||||
result.reserve( ${genesis_json_length} );
|
||||
result.resize(0);
|
||||
for( size_t i=0; i<${genesis_json_array_height}$-1; i++ )
|
||||
for( size_t i=0; i<${genesis_json_array_height}-1; i++ )
|
||||
{
|
||||
result.append( genesis_json_array[i], ${genesis_json_array_width}$ );
|
||||
result.append( genesis_json_array[i], ${genesis_json_array_width} );
|
||||
}
|
||||
result.append( std::string( genesis_json_array[ ${genesis_json_array_height}$-1 ] ) );
|
||||
return;
|
||||
result.append( std::string( genesis_json_array[ ${genesis_json_array_height}-1 ] ) );
|
||||
}
|
||||
|
||||
fc::sha256 get_egenesis_json_hash()
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ struct egenesis_info
|
|||
// If genesis not exist, generate from genesis_json
|
||||
try
|
||||
{
|
||||
genesis = fc::json::from_string( *genesis_json ).as< genesis_state_type >();
|
||||
genesis = fc::json::from_string( *genesis_json ).as< genesis_state_type >( 20 );
|
||||
}
|
||||
catch (const fc::exception& e)
|
||||
{
|
||||
|
|
@ -223,7 +223,6 @@ void load_genesis(
|
|||
std::cerr << "embed_genesis: Genesis ID from argument is " << chain_id_str << "\n";
|
||||
info.chain_id = chain_id_str;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
int main( int argc, char** argv )
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 443f858d9b4733bb6d894da9315ce00ac3246065
|
||||
Subproject commit 243690c67d536ec4df5b347459928a29b45854c6
|
||||
|
|
@ -106,3 +106,7 @@
|
|||
#define GRAPHENE_NET_MIN_BLOCK_IDS_TO_PREFETCH 10000
|
||||
|
||||
#define GRAPHENE_NET_MAX_TRX_PER_SECOND 1000
|
||||
|
||||
#define GRAPHENE_NET_MAX_NESTED_OBJECTS (250)
|
||||
|
||||
#define MAXIMUM_PEERDB_SIZE 1000
|
||||
|
|
|
|||
|
|
@ -1858,10 +1858,10 @@ namespace graphene { namespace net { namespace detail {
|
|||
#endif
|
||||
user_data["bitness"] = sizeof(void*) * 8;
|
||||
|
||||
user_data["node_id"] = _node_id;
|
||||
user_data["node_id"] = fc::variant( _node_id, 1 );
|
||||
|
||||
item_hash_t head_block_id = _delegate->get_head_block_id();
|
||||
user_data["last_known_block_hash"] = head_block_id;
|
||||
user_data["last_known_block_hash"] = fc::variant( head_block_id, 1 );
|
||||
user_data["last_known_block_number"] = _delegate->get_block_number(head_block_id);
|
||||
user_data["last_known_block_time"] = _delegate->get_block_time(head_block_id);
|
||||
|
||||
|
|
@ -1877,19 +1877,19 @@ namespace graphene { namespace net { namespace detail {
|
|||
if (user_data.contains("graphene_git_revision_sha"))
|
||||
originating_peer->graphene_git_revision_sha = user_data["graphene_git_revision_sha"].as_string();
|
||||
if (user_data.contains("graphene_git_revision_unix_timestamp"))
|
||||
originating_peer->graphene_git_revision_unix_timestamp = fc::time_point_sec(user_data["graphene_git_revision_unix_timestamp"].as<uint32_t>());
|
||||
originating_peer->graphene_git_revision_unix_timestamp = fc::time_point_sec(user_data["graphene_git_revision_unix_timestamp"].as<uint32_t>(1));
|
||||
if (user_data.contains("fc_git_revision_sha"))
|
||||
originating_peer->fc_git_revision_sha = user_data["fc_git_revision_sha"].as_string();
|
||||
if (user_data.contains("fc_git_revision_unix_timestamp"))
|
||||
originating_peer->fc_git_revision_unix_timestamp = fc::time_point_sec(user_data["fc_git_revision_unix_timestamp"].as<uint32_t>());
|
||||
originating_peer->fc_git_revision_unix_timestamp = fc::time_point_sec(user_data["fc_git_revision_unix_timestamp"].as<uint32_t>(1));
|
||||
if (user_data.contains("platform"))
|
||||
originating_peer->platform = user_data["platform"].as_string();
|
||||
if (user_data.contains("bitness"))
|
||||
originating_peer->bitness = user_data["bitness"].as<uint32_t>();
|
||||
originating_peer->bitness = user_data["bitness"].as<uint32_t>(1);
|
||||
if (user_data.contains("node_id"))
|
||||
originating_peer->node_id = user_data["node_id"].as<node_id_t>();
|
||||
originating_peer->node_id = user_data["node_id"].as<node_id_t>(1);
|
||||
if (user_data.contains("last_known_fork_block_number"))
|
||||
originating_peer->last_known_fork_block_number = user_data["last_known_fork_block_number"].as<uint32_t>();
|
||||
originating_peer->last_known_fork_block_number = user_data["last_known_fork_block_number"].as<uint32_t>(1);
|
||||
}
|
||||
|
||||
void node_impl::on_hello_message( peer_connection* originating_peer, const hello_message& hello_message_received )
|
||||
|
|
@ -1899,7 +1899,7 @@ namespace graphene { namespace net { namespace detail {
|
|||
node_id_t peer_node_id = hello_message_received.node_public_key;
|
||||
try
|
||||
{
|
||||
peer_node_id = hello_message_received.user_data["node_id"].as<node_id_t>();
|
||||
peer_node_id = hello_message_received.user_data["node_id"].as<node_id_t>(1);
|
||||
}
|
||||
catch (const fc::exception&)
|
||||
{
|
||||
|
|
@ -2940,7 +2940,7 @@ namespace graphene { namespace net { namespace detail {
|
|||
( "msg", closing_connection_message_received.reason_for_closing )
|
||||
( "error", closing_connection_message_received.error ) );
|
||||
std::ostringstream message;
|
||||
message << "Peer " << fc::variant( originating_peer->get_remote_endpoint() ).as_string() <<
|
||||
message << "Peer " << fc::variant( originating_peer->get_remote_endpoint(), GRAPHENE_NET_MAX_NESTED_OBJECTS ).as_string() <<
|
||||
" disconnected us: " << closing_connection_message_received.reason_for_closing;
|
||||
fc::exception detailed_error(FC_LOG_MESSAGE(warn, "Peer ${peer} is disconnecting us because of an error: ${msg}, exception: ${error}",
|
||||
( "peer", originating_peer->get_remote_endpoint() )
|
||||
|
|
@ -3846,7 +3846,7 @@ namespace graphene { namespace net { namespace detail {
|
|||
user_data["bitness"] = *peer->bitness;
|
||||
user_data["user_agent"] = peer->user_agent;
|
||||
|
||||
user_data["last_known_block_hash"] = peer->last_block_delegate_has_seen;
|
||||
user_data["last_known_block_hash"] = fc::variant( peer->last_block_delegate_has_seen, 1 );
|
||||
user_data["last_known_block_number"] = _delegate->get_block_number(peer->last_block_delegate_has_seen);
|
||||
user_data["last_known_block_time"] = peer->last_block_time_delegate_has_seen;
|
||||
|
||||
|
|
@ -4457,7 +4457,7 @@ namespace graphene { namespace net { namespace detail {
|
|||
{
|
||||
try
|
||||
{
|
||||
_node_configuration = fc::json::from_file( configuration_file_name ).as<detail::node_configuration>();
|
||||
_node_configuration = fc::json::from_file( configuration_file_name ).as<detail::node_configuration>(GRAPHENE_NET_MAX_NESTED_OBJECTS);
|
||||
ilog( "Loaded configuration from file ${filename}", ("filename", configuration_file_name ) );
|
||||
|
||||
if( _node_configuration.private_key == fc::ecc::private_key() )
|
||||
|
|
@ -4821,20 +4821,19 @@ namespace graphene { namespace net { namespace detail {
|
|||
peer_to_disconnect->send_message( closing_message );
|
||||
}
|
||||
|
||||
// notify the user. This will be useful in testing, but we might want to remove it later;
|
||||
// it makes good sense to notify the user if other nodes think she is behaving badly, but
|
||||
// notify the user. This will be useful in testing, but we might want to remove it later.
|
||||
// It makes good sense to notify the user if other nodes think she is behaving badly, but
|
||||
// if we're just detecting and dissconnecting other badly-behaving nodes, they don't really care.
|
||||
if (caused_by_error)
|
||||
{
|
||||
std::ostringstream error_message;
|
||||
error_message << "I am disconnecting peer " << fc::variant( peer_to_disconnect->get_remote_endpoint() ).as_string() <<
|
||||
error_message << "I am disconnecting peer " << fc::variant( peer_to_disconnect->get_remote_endpoint(), GRAPHENE_NET_MAX_NESTED_OBJECTS ).as_string() <<
|
||||
" for reason: " << reason_for_disconnect;
|
||||
_delegate->error_encountered(error_message.str(), fc::oexception());
|
||||
dlog(error_message.str());
|
||||
}
|
||||
else
|
||||
dlog("Disconnecting from ${peer} for ${reason}", ("peer",peer_to_disconnect->get_remote_endpoint()) ("reason",reason_for_disconnect));
|
||||
// peer_to_disconnect->close_connection();
|
||||
}
|
||||
|
||||
void node_impl::listen_on_endpoint( const fc::ip::endpoint& ep, bool wait_if_not_available )
|
||||
|
|
@ -4893,7 +4892,7 @@ namespace graphene { namespace net { namespace detail {
|
|||
peer_details["version"] = "";
|
||||
peer_details["subver"] = peer->user_agent;
|
||||
peer_details["inbound"] = peer->direction == peer_connection_direction::inbound;
|
||||
peer_details["firewall_status"] = peer->is_firewalled;
|
||||
peer_details["firewall_status"] = fc::variant( peer->is_firewalled, 1 );
|
||||
peer_details["startingheight"] = "";
|
||||
peer_details["banscore"] = "";
|
||||
peer_details["syncnode"] = "";
|
||||
|
|
@ -4927,7 +4926,7 @@ namespace graphene { namespace net { namespace detail {
|
|||
// provide these for debugging
|
||||
// warning: these are just approximations, if the peer is "downstream" of us, they may
|
||||
// have received blocks from other peers that we are unaware of
|
||||
peer_details["current_head_block"] = peer->last_block_delegate_has_seen;
|
||||
peer_details["current_head_block"] = fc::variant( peer->last_block_delegate_has_seen, 1 );
|
||||
peer_details["current_head_block_number"] = _delegate->get_block_number(peer->last_block_delegate_has_seen);
|
||||
peer_details["current_head_block_time"] = peer->last_block_time_delegate_has_seen;
|
||||
|
||||
|
|
@ -5003,17 +5002,17 @@ namespace graphene { namespace net { namespace detail {
|
|||
{
|
||||
VERIFY_CORRECT_THREAD();
|
||||
if (params.contains("peer_connection_retry_timeout"))
|
||||
_peer_connection_retry_timeout = params["peer_connection_retry_timeout"].as<uint32_t>();
|
||||
_peer_connection_retry_timeout = params["peer_connection_retry_timeout"].as<uint32_t>(1);
|
||||
if (params.contains("desired_number_of_connections"))
|
||||
_desired_number_of_connections = params["desired_number_of_connections"].as<uint32_t>();
|
||||
_desired_number_of_connections = params["desired_number_of_connections"].as<uint32_t>(1);
|
||||
if (params.contains("maximum_number_of_connections"))
|
||||
_maximum_number_of_connections = params["maximum_number_of_connections"].as<uint32_t>();
|
||||
_maximum_number_of_connections = params["maximum_number_of_connections"].as<uint32_t>(1);
|
||||
if (params.contains("maximum_number_of_blocks_to_handle_at_one_time"))
|
||||
_maximum_number_of_blocks_to_handle_at_one_time = params["maximum_number_of_blocks_to_handle_at_one_time"].as<uint32_t>();
|
||||
_maximum_number_of_blocks_to_handle_at_one_time = params["maximum_number_of_blocks_to_handle_at_one_time"].as<uint32_t>(1);
|
||||
if (params.contains("maximum_number_of_sync_blocks_to_prefetch"))
|
||||
_maximum_number_of_sync_blocks_to_prefetch = params["maximum_number_of_sync_blocks_to_prefetch"].as<uint32_t>();
|
||||
_maximum_number_of_sync_blocks_to_prefetch = params["maximum_number_of_sync_blocks_to_prefetch"].as<uint32_t>(1);
|
||||
if (params.contains("maximum_blocks_per_peer_during_syncing"))
|
||||
_maximum_blocks_per_peer_during_syncing = params["maximum_blocks_per_peer_during_syncing"].as<uint32_t>();
|
||||
_maximum_blocks_per_peer_during_syncing = params["maximum_blocks_per_peer_during_syncing"].as<uint32_t>(1);
|
||||
|
||||
_desired_number_of_connections = std::min(_desired_number_of_connections, _maximum_number_of_connections);
|
||||
|
||||
|
|
@ -5098,9 +5097,9 @@ namespace graphene { namespace net { namespace detail {
|
|||
VERIFY_CORRECT_THREAD();
|
||||
fc::mutable_variant_object info;
|
||||
info["listening_on"] = _actual_listening_endpoint;
|
||||
info["node_public_key"] = _node_public_key;
|
||||
info["node_id"] = _node_id;
|
||||
info["firewalled"] = _is_firewalled;
|
||||
info["node_public_key"] = fc::variant( _node_public_key, 1 );
|
||||
info["node_id"] = fc::variant( _node_id, 1 );
|
||||
info["firewalled"] = fc::variant( _is_firewalled, 1 );
|
||||
return info;
|
||||
}
|
||||
fc::variant_object node_impl::network_get_usage_stats() const
|
||||
|
|
@ -5128,9 +5127,9 @@ namespace graphene { namespace net { namespace detail {
|
|||
std::plus<uint32_t>());
|
||||
|
||||
fc::mutable_variant_object result;
|
||||
result["usage_by_second"] = network_usage_by_second;
|
||||
result["usage_by_minute"] = network_usage_by_minute;
|
||||
result["usage_by_hour"] = network_usage_by_hour;
|
||||
result["usage_by_second"] = fc::variant( network_usage_by_second, 2 );
|
||||
result["usage_by_minute"] = fc::variant( network_usage_by_minute, 2 );
|
||||
result["usage_by_hour"] = fc::variant( network_usage_by_hour, 2 );
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,8 +34,7 @@
|
|||
#include <fc/io/json.hpp>
|
||||
|
||||
#include <graphene/net/peer_database.hpp>
|
||||
|
||||
|
||||
#include <graphene/net/config.hpp>
|
||||
|
||||
namespace graphene { namespace net {
|
||||
namespace detail
|
||||
|
|
@ -81,7 +80,7 @@ namespace graphene { namespace net {
|
|||
public:
|
||||
typedef peer_database_impl::potential_peer_set::index<peer_database_impl::last_seen_time_index>::type::iterator last_seen_time_index_iterator;
|
||||
last_seen_time_index_iterator _iterator;
|
||||
peer_database_iterator_impl(const last_seen_time_index_iterator& iterator) :
|
||||
explicit peer_database_iterator_impl(const last_seen_time_index_iterator& iterator) :
|
||||
_iterator(iterator)
|
||||
{}
|
||||
};
|
||||
|
|
@ -95,9 +94,8 @@ namespace graphene { namespace net {
|
|||
{
|
||||
try
|
||||
{
|
||||
std::vector<potential_peer_record> peer_records = fc::json::from_file(_peer_database_filename).as<std::vector<potential_peer_record> >();
|
||||
std::vector<potential_peer_record> peer_records = fc::json::from_file(_peer_database_filename).as<std::vector<potential_peer_record> >( GRAPHENE_NET_MAX_NESTED_OBJECTS );
|
||||
std::copy(peer_records.begin(), peer_records.end(), std::inserter(_potential_peer_set, _potential_peer_set.end()));
|
||||
#define MAXIMUM_PEERDB_SIZE 1000
|
||||
if (_potential_peer_set.size() > MAXIMUM_PEERDB_SIZE)
|
||||
{
|
||||
// prune database to a reasonable size
|
||||
|
|
@ -125,7 +123,7 @@ namespace graphene { namespace net {
|
|||
fc::path peer_database_filename_dir = _peer_database_filename.parent_path();
|
||||
if (!fc::exists(peer_database_filename_dir))
|
||||
fc::create_directories(peer_database_filename_dir);
|
||||
fc::json::save_to_file(peer_records, _peer_database_filename);
|
||||
fc::json::save_to_file( peer_records, _peer_database_filename, GRAPHENE_NET_MAX_NESTED_OBJECTS );
|
||||
}
|
||||
catch (const fc::exception& e)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -22,12 +22,11 @@ namespace detail {
|
|||
class debug_api_impl
|
||||
{
|
||||
public:
|
||||
debug_api_impl( graphene::app::application& _app );
|
||||
explicit debug_api_impl( graphene::app::application& _app );
|
||||
|
||||
void debug_push_blocks( const std::string& src_filename, uint32_t count );
|
||||
void debug_generate_blocks( const std::string& debug_key, uint32_t count );
|
||||
void debug_update_object( const fc::variant_object& update );
|
||||
//void debug_save_db( std::string db_path );
|
||||
void debug_stream_json_objects( const std::string& filename );
|
||||
void debug_stream_json_objects_flush();
|
||||
std::shared_ptr< graphene::debug_witness_plugin::debug_witness_plugin > get_plugin();
|
||||
|
|
@ -71,7 +70,6 @@ void debug_api_impl::debug_push_blocks( const std::string& src_filename, uint32_
|
|||
}
|
||||
}
|
||||
ilog( "Completed loading block_database successfully" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -93,7 +91,7 @@ void debug_api_impl::debug_generate_blocks( const std::string& debug_key, uint32
|
|||
if( scheduled_key != debug_public_key )
|
||||
{
|
||||
ilog( "Modified key for witness ${w}", ("w", scheduled_witness) );
|
||||
fc::mutable_variant_object update;
|
||||
fc::limited_mutable_variant_object update( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
update("_action", "update")("id", scheduled_witness)("signing_key", debug_public_key);
|
||||
db->debug_update( update );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ void debug_witness_plugin::plugin_initialize(const boost::program_options::varia
|
|||
const std::vector<std::string> key_id_to_wif_pair_strings = options["private-key"].as<std::vector<std::string>>();
|
||||
for (const std::string& key_id_to_wif_pair_string : key_id_to_wif_pair_strings)
|
||||
{
|
||||
auto key_id_to_wif_pair = graphene::app::dejsonify<std::pair<chain::public_key_type, std::string> >(key_id_to_wif_pair_string);
|
||||
auto key_id_to_wif_pair = graphene::app::dejsonify<std::pair<chain::public_key_type, std::string> >(key_id_to_wif_pair_string, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
idump((key_id_to_wif_pair));
|
||||
fc::optional<fc::ecc::private_key> private_key = graphene::utilities::wif_to_key(key_id_to_wif_pair.second);
|
||||
if (!private_key)
|
||||
|
|
@ -77,7 +77,7 @@ void debug_witness_plugin::plugin_initialize(const boost::program_options::varia
|
|||
// just here to ease the transition, can be removed soon
|
||||
try
|
||||
{
|
||||
private_key = fc::variant(key_id_to_wif_pair.second).as<fc::ecc::private_key>();
|
||||
private_key = fc::variant( key_id_to_wif_pair.second, GRAPHENE_MAX_NESTED_OBJECTS ).as<fc::ecc::private_key>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
}
|
||||
catch (const fc::exception&)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ void delayed_node_plugin::plugin_set_program_options(bpo::options_description& c
|
|||
|
||||
void delayed_node_plugin::connect()
|
||||
{
|
||||
my->client_connection = std::make_shared<fc::rpc::websocket_api_connection>(my->client.connect(my->remote_endpoint));
|
||||
my->client_connection = std::make_shared<fc::rpc::websocket_api_connection>(my->client.connect(my->remote_endpoint), GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
my->database_api = my->client_connection->get_remote_api<graphene::app::database_api>(0);
|
||||
my->client_connection_closed = my->client_connection->closed.connect([this] {
|
||||
connection_failed();
|
||||
|
|
@ -142,7 +142,7 @@ void delayed_node_plugin::plugin_startup()
|
|||
connect();
|
||||
my->database_api->set_block_applied_callback([this]( const fc::variant& block_id )
|
||||
{
|
||||
fc::from_variant( block_id, my->last_received_remote_head );
|
||||
fc::from_variant( block_id, my->last_received_remote_head, GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
} );
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
303
libraries/plugins/grouped_orders/grouped_orders_plugin.cpp
Normal file
303
libraries/plugins/grouped_orders/grouped_orders_plugin.cpp
Normal file
|
|
@ -0,0 +1,303 @@
|
|||
/*
|
||||
* Copyright (c) 2018 Abit More, and contributors.
|
||||
*
|
||||
* The MIT License
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <graphene/grouped_orders/grouped_orders_plugin.hpp>
|
||||
|
||||
#include <graphene/chain/market_object.hpp>
|
||||
|
||||
namespace graphene { namespace grouped_orders {
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
||||
class grouped_orders_plugin_impl
|
||||
{
|
||||
public:
|
||||
grouped_orders_plugin_impl(grouped_orders_plugin& _plugin)
|
||||
:_self( _plugin ) {}
|
||||
virtual ~grouped_orders_plugin_impl();
|
||||
|
||||
graphene::chain::database& database()
|
||||
{
|
||||
return _self.database();
|
||||
}
|
||||
|
||||
grouped_orders_plugin& _self;
|
||||
flat_set<uint16_t> _tracked_groups;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief This secondary index is used to track changes on limit order objects.
|
||||
*/
|
||||
class limit_order_group_index : public secondary_index
|
||||
{
|
||||
public:
|
||||
limit_order_group_index( const flat_set<uint16_t>& groups ) : _tracked_groups( groups ) {};
|
||||
|
||||
virtual void object_inserted( const object& obj ) override;
|
||||
virtual void object_removed( const object& obj ) override;
|
||||
virtual void about_to_modify( const object& before ) override;
|
||||
virtual void object_modified( const object& after ) override;
|
||||
|
||||
const flat_set<uint16_t>& get_tracked_groups() const
|
||||
{ return _tracked_groups; }
|
||||
|
||||
const map< limit_order_group_key, limit_order_group_data >& get_order_groups() const
|
||||
{ return _og_data; }
|
||||
|
||||
private:
|
||||
void remove_order( const limit_order_object& obj, bool remove_empty = true );
|
||||
|
||||
/** tracked groups */
|
||||
flat_set<uint16_t> _tracked_groups;
|
||||
|
||||
/** maps the group key to group data */
|
||||
map< limit_order_group_key, limit_order_group_data > _og_data;
|
||||
};
|
||||
|
||||
void limit_order_group_index::object_inserted( const object& objct )
|
||||
{ try {
|
||||
const limit_order_object& o = static_cast<const limit_order_object&>( objct );
|
||||
|
||||
auto& idx = _og_data;
|
||||
|
||||
for( uint16_t group : get_tracked_groups() )
|
||||
{
|
||||
auto create_ogo = [&]() {
|
||||
idx[ limit_order_group_key( group, o.sell_price ) ] = limit_order_group_data( o.sell_price, o.for_sale );
|
||||
};
|
||||
// if idx is empty, insert this order
|
||||
// Note: not capped
|
||||
if( idx.empty() )
|
||||
{
|
||||
create_ogo();
|
||||
continue;
|
||||
}
|
||||
|
||||
// cap the price
|
||||
price capped_price = o.sell_price;
|
||||
price max = o.sell_price.max();
|
||||
price min = o.sell_price.min();
|
||||
bool capped_max = false;
|
||||
bool capped_min = false;
|
||||
if( o.sell_price > max )
|
||||
{
|
||||
capped_price = max;
|
||||
capped_max = true;
|
||||
}
|
||||
else if( o.sell_price < min )
|
||||
{
|
||||
capped_price = min;
|
||||
capped_min = true;
|
||||
}
|
||||
// if idx is not empty, find the group that is next to this order
|
||||
auto itr = idx.lower_bound( limit_order_group_key( group, capped_price ) );
|
||||
bool check_previous = false;
|
||||
if( itr == idx.end() || itr->first.group != group
|
||||
|| itr->first.min_price.base.asset_id != o.sell_price.base.asset_id
|
||||
|| itr->first.min_price.quote.asset_id != o.sell_price.quote.asset_id )
|
||||
// not same market or group type
|
||||
check_previous = true;
|
||||
else // same market and group type
|
||||
{
|
||||
bool update_max = false;
|
||||
if( capped_price > itr->second.max_price ) // implies itr->min_price <= itr->max_price < max
|
||||
{
|
||||
update_max = true;
|
||||
price max_price = itr->first.min_price * ratio_type( GRAPHENE_100_PERCENT + group, GRAPHENE_100_PERCENT );
|
||||
// max_price should have been capped here
|
||||
if( capped_price > max_price ) // new order is out of range
|
||||
check_previous = true;
|
||||
}
|
||||
if( !check_previous ) // new order is within the range
|
||||
{
|
||||
if( capped_min && o.sell_price < itr->first.min_price )
|
||||
{ // need to update itr->min_price here, if itr is below min, and new order is even lower
|
||||
// TODO improve performance
|
||||
limit_order_group_data data( itr->second.max_price, o.for_sale + itr->second.total_for_sale );
|
||||
idx.erase( itr );
|
||||
idx[ limit_order_group_key( group, o.sell_price ) ] = data;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( update_max || ( capped_max && o.sell_price > itr->second.max_price ) )
|
||||
itr->second.max_price = o.sell_price; // store real price here, not capped
|
||||
itr->second.total_for_sale += o.for_sale;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( check_previous )
|
||||
{
|
||||
if( itr == idx.begin() ) // no previous
|
||||
create_ogo();
|
||||
else
|
||||
{
|
||||
--itr; // should be valid
|
||||
if( itr->first.group != group || itr->first.min_price.base.asset_id != o.sell_price.base.asset_id
|
||||
|| itr->first.min_price.quote.asset_id != o.sell_price.quote.asset_id )
|
||||
// not same market or group type
|
||||
create_ogo();
|
||||
else // same market and group type
|
||||
{
|
||||
// due to lower_bound, always true: capped_price < itr->first.min_price, so no need to check again,
|
||||
// if new order is in range of itr group, always need to update itr->first.min_price, unless
|
||||
// o.sell_price is higher than max
|
||||
price min_price = itr->second.max_price / ratio_type( GRAPHENE_100_PERCENT + group, GRAPHENE_100_PERCENT );
|
||||
// min_price should have been capped here
|
||||
if( capped_price < min_price ) // new order is out of range
|
||||
create_ogo();
|
||||
else if( capped_max && o.sell_price >= itr->first.min_price )
|
||||
{ // itr is above max, and price of new order is even higher
|
||||
if( o.sell_price > itr->second.max_price )
|
||||
itr->second.max_price = o.sell_price;
|
||||
itr->second.total_for_sale += o.for_sale;
|
||||
}
|
||||
else
|
||||
{ // new order is within the range
|
||||
// TODO improve performance
|
||||
limit_order_group_data data( itr->second.max_price, o.for_sale + itr->second.total_for_sale );
|
||||
idx.erase( itr );
|
||||
idx[ limit_order_group_key( group, o.sell_price ) ] = data;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} FC_CAPTURE_AND_RETHROW( (objct) ); }
|
||||
|
||||
void limit_order_group_index::object_removed( const object& objct )
|
||||
{ try {
|
||||
const limit_order_object& o = static_cast<const limit_order_object&>( objct );
|
||||
remove_order( o );
|
||||
} FC_CAPTURE_AND_RETHROW( (objct) ); }
|
||||
|
||||
void limit_order_group_index::about_to_modify( const object& objct )
|
||||
{ try {
|
||||
const limit_order_object& o = static_cast<const limit_order_object&>( objct );
|
||||
remove_order( o, false );
|
||||
} FC_CAPTURE_AND_RETHROW( (objct) ); }
|
||||
|
||||
void limit_order_group_index::object_modified( const object& objct )
|
||||
{ try {
|
||||
object_inserted( objct );
|
||||
} FC_CAPTURE_AND_RETHROW( (objct) ); }
|
||||
|
||||
void limit_order_group_index::remove_order( const limit_order_object& o, bool remove_empty )
|
||||
{
|
||||
auto& idx = _og_data;
|
||||
|
||||
for( uint16_t group : get_tracked_groups() )
|
||||
{
|
||||
// find the group that should contain this order
|
||||
auto itr = idx.lower_bound( limit_order_group_key( group, o.sell_price ) );
|
||||
if( itr == idx.end() || itr->first.group != group
|
||||
|| itr->first.min_price.base.asset_id != o.sell_price.base.asset_id
|
||||
|| itr->first.min_price.quote.asset_id != o.sell_price.quote.asset_id
|
||||
|| itr->second.max_price < o.sell_price )
|
||||
{
|
||||
// can not find corresponding group, should not happen
|
||||
wlog( "can not find the order group containing order for removing (price dismatch): ${o}", ("o",o) );
|
||||
continue;
|
||||
}
|
||||
else // found
|
||||
{
|
||||
if( itr->second.total_for_sale < o.for_sale )
|
||||
// should not happen
|
||||
wlog( "can not find the order group containing order for removing (amount dismatch): ${o}", ("o",o) );
|
||||
else if( !remove_empty || itr->second.total_for_sale > o.for_sale )
|
||||
itr->second.total_for_sale -= o.for_sale;
|
||||
else
|
||||
// it's the only order in the group and need to be removed
|
||||
idx.erase( itr );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
grouped_orders_plugin_impl::~grouped_orders_plugin_impl()
|
||||
{}
|
||||
|
||||
} // end namespace detail
|
||||
|
||||
|
||||
grouped_orders_plugin::grouped_orders_plugin() :
|
||||
my( new detail::grouped_orders_plugin_impl(*this) )
|
||||
{
|
||||
}
|
||||
|
||||
grouped_orders_plugin::~grouped_orders_plugin()
|
||||
{
|
||||
}
|
||||
|
||||
std::string grouped_orders_plugin::plugin_name()const
|
||||
{
|
||||
return "grouped_orders";
|
||||
}
|
||||
|
||||
void grouped_orders_plugin::plugin_set_program_options(
|
||||
boost::program_options::options_description& cli,
|
||||
boost::program_options::options_description& cfg
|
||||
)
|
||||
{
|
||||
cli.add_options()
|
||||
("tracked-groups", boost::program_options::value<string>()->default_value("[10,100]"), // 0.1% and 1%
|
||||
"Group orders by percentage increase on price. Specify a JSON array of numbers here, each number is a group, number 1 means 0.01%. ")
|
||||
;
|
||||
cfg.add(cli);
|
||||
}
|
||||
|
||||
void grouped_orders_plugin::plugin_initialize(const boost::program_options::variables_map& options)
|
||||
{ try {
|
||||
|
||||
if( options.count( "tracked-groups" ) )
|
||||
{
|
||||
const std::string& groups = options["tracked-groups"].as<string>();
|
||||
my->_tracked_groups = fc::json::from_string(groups).as<flat_set<uint16_t>>( 2 );
|
||||
my->_tracked_groups.erase( 0 );
|
||||
}
|
||||
else
|
||||
my->_tracked_groups = fc::json::from_string("[10,100]").as<flat_set<uint16_t>>(2);
|
||||
|
||||
database().add_secondary_index< primary_index<limit_order_index>, detail::limit_order_group_index >( my->_tracked_groups );
|
||||
|
||||
} FC_CAPTURE_AND_RETHROW() }
|
||||
|
||||
void grouped_orders_plugin::plugin_startup()
|
||||
{
|
||||
}
|
||||
|
||||
const flat_set<uint16_t>& grouped_orders_plugin::tracked_groups() const
|
||||
{
|
||||
return my->_tracked_groups;
|
||||
}
|
||||
|
||||
const map< limit_order_group_key, limit_order_group_data >& grouped_orders_plugin::limit_order_groups()
|
||||
{
|
||||
const auto& idx = database().get_index_type< limit_order_index >();
|
||||
const auto& pidx = dynamic_cast<const primary_index< limit_order_index >&>(idx);
|
||||
const auto& logidx = pidx.get_secondary_index< detail::limit_order_group_index >();
|
||||
return logidx.get_order_groups();
|
||||
}
|
||||
|
||||
} }
|
||||
|
|
@ -265,14 +265,15 @@ void market_history_plugin::plugin_set_program_options(
|
|||
|
||||
void market_history_plugin::plugin_initialize(const boost::program_options::variables_map& options)
|
||||
{ try {
|
||||
database().applied_block.connect( [&]( const signed_block& b){ my->update_market_histories(b); } );
|
||||
database().applied_block.connect( [this]( const signed_block& b){ my->update_market_histories(b); } );
|
||||
database().add_index< primary_index< bucket_index > >();
|
||||
database().add_index< primary_index< history_index > >();
|
||||
|
||||
if( options.count( "bucket-size" ) )
|
||||
{
|
||||
const std::string& buckets = options["bucket-size"].as<string>();
|
||||
my->_tracked_buckets = fc::json::from_string(buckets).as<flat_set<uint32_t>>();
|
||||
const std::string& buckets = options["bucket-size"].as<string>();
|
||||
my->_tracked_buckets = fc::json::from_string(buckets).as<flat_set<uint32_t>>(2);
|
||||
my->_tracked_buckets.erase( 0 );
|
||||
}
|
||||
if( options.count( "history-per-size" ) )
|
||||
my->_maximum_history_per_bucket_size = options["history-per-size"].as<uint32_t>();
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ public:
|
|||
private:
|
||||
void schedule_production_loop();
|
||||
block_production_condition::block_production_condition_enum block_production_loop();
|
||||
block_production_condition::block_production_condition_enum maybe_produce_block( fc::mutable_variant_object& capture );
|
||||
block_production_condition::block_production_condition_enum maybe_produce_block( fc::limited_mutable_variant_object& capture );
|
||||
|
||||
boost::program_options::variables_map _options;
|
||||
bool _production_enabled = false;
|
||||
|
|
|
|||
|
|
@ -59,7 +59,6 @@ void new_chain_banner( const graphene::chain::database& db )
|
|||
"\n"
|
||||
;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void witness_plugin::plugin_set_program_options(
|
||||
|
|
@ -94,15 +93,14 @@ void witness_plugin::plugin_initialize(const boost::program_options::variables_m
|
|||
_options = &options;
|
||||
LOAD_VALUE_SET(options, "witness-id", _witnesses, chain::witness_id_type)
|
||||
if (options.count("witness-ids"))
|
||||
boost::insert(_witnesses, fc::json::from_string(options.at("witness-ids").as<string>()).as<vector<chain::witness_id_type>>());
|
||||
boost::insert(_witnesses, fc::json::from_string(options.at("witness-ids").as<string>()).as<vector<chain::witness_id_type>>( 5 ));
|
||||
|
||||
if( options.count("private-key") )
|
||||
{
|
||||
const std::vector<std::string> key_id_to_wif_pair_strings = options["private-key"].as<std::vector<std::string>>();
|
||||
for (const std::string& key_id_to_wif_pair_string : key_id_to_wif_pair_strings)
|
||||
{
|
||||
auto key_id_to_wif_pair = graphene::app::dejsonify<std::pair<chain::public_key_type, std::string> >(key_id_to_wif_pair_string);
|
||||
//idump((key_id_to_wif_pair));
|
||||
auto key_id_to_wif_pair = graphene::app::dejsonify<std::pair<chain::public_key_type, std::string> >(key_id_to_wif_pair_string, 5);
|
||||
ilog("Public Key: ${public}", ("public", key_id_to_wif_pair.first));
|
||||
fc::optional<fc::ecc::private_key> private_key = graphene::utilities::wif_to_key(key_id_to_wif_pair.second);
|
||||
if (!private_key)
|
||||
|
|
@ -111,7 +109,7 @@ void witness_plugin::plugin_initialize(const boost::program_options::variables_m
|
|||
// just here to ease the transition, can be removed soon
|
||||
try
|
||||
{
|
||||
private_key = fc::variant(key_id_to_wif_pair.second).as<fc::ecc::private_key>();
|
||||
private_key = fc::variant(key_id_to_wif_pair.second, 2).as<fc::ecc::private_key>(1);
|
||||
}
|
||||
catch (const fc::exception&)
|
||||
{
|
||||
|
|
@ -147,7 +145,7 @@ void witness_plugin::plugin_startup()
|
|||
|
||||
void witness_plugin::plugin_shutdown()
|
||||
{
|
||||
return;
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
void witness_plugin::schedule_production_loop()
|
||||
|
|
@ -161,7 +159,6 @@ void witness_plugin::schedule_production_loop()
|
|||
|
||||
fc::time_point next_wakeup( now + fc::microseconds( time_to_next_second ) );
|
||||
|
||||
//wdump( (now.time_since_epoch().count())(next_wakeup.time_since_epoch().count()) );
|
||||
_block_production_task = fc::schedule([this]{block_production_loop();},
|
||||
next_wakeup, "Witness Block Production");
|
||||
}
|
||||
|
|
@ -169,7 +166,7 @@ void witness_plugin::schedule_production_loop()
|
|||
block_production_condition::block_production_condition_enum witness_plugin::block_production_loop()
|
||||
{
|
||||
block_production_condition::block_production_condition_enum result;
|
||||
fc::mutable_variant_object capture;
|
||||
fc::limited_mutable_variant_object capture( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
try
|
||||
{
|
||||
result = maybe_produce_block(capture);
|
||||
|
|
@ -197,10 +194,8 @@ block_production_condition::block_production_condition_enum witness_plugin::bloc
|
|||
ilog("Not producing block because production is disabled until we receive a recent block (see: --enable-stale-production)");
|
||||
break;
|
||||
case block_production_condition::not_my_turn:
|
||||
//ilog("Not producing block because it isn't my turn");
|
||||
break;
|
||||
case block_production_condition::not_time_yet:
|
||||
//dlog("Not producing block because slot has not yet arrived");
|
||||
break;
|
||||
case block_production_condition::no_private_key:
|
||||
ilog("Not producing block because I don't have the private key for ${scheduled_key}",
|
||||
|
|
@ -217,7 +212,7 @@ block_production_condition::block_production_condition_enum witness_plugin::bloc
|
|||
elog("Not producing block because the last block was generated by the same witness.\nThis node is probably disconnected from the network so block production has been disabled.\nDisable this check with --allow-consecutive option.");
|
||||
break;
|
||||
case block_production_condition::exception_producing_block:
|
||||
elog( "exception prodcing block" );
|
||||
elog( "exception producing block" );
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -225,7 +220,7 @@ block_production_condition::block_production_condition_enum witness_plugin::bloc
|
|||
return result;
|
||||
}
|
||||
|
||||
block_production_condition::block_production_condition_enum witness_plugin::maybe_produce_block( fc::mutable_variant_object& capture )
|
||||
block_production_condition::block_production_condition_enum witness_plugin::maybe_produce_block( fc::limited_mutable_variant_object& capture )
|
||||
{
|
||||
chain::database& db = database();
|
||||
fc::time_point now_fine = fc::time_point::now();
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ fc::optional<fc::ecc::private_key> wif_to_key( const std::string& wif_key )
|
|||
if (wif_bytes.size() < 5)
|
||||
return fc::optional<fc::ecc::private_key>();
|
||||
std::vector<char> key_bytes(wif_bytes.begin() + 1, wif_bytes.end() - 4);
|
||||
fc::ecc::private_key key = fc::variant(key_bytes).as<fc::ecc::private_key>();
|
||||
fc::ecc::private_key key = fc::variant( key_bytes, 1 ).as<fc::ecc::private_key>( 1 );
|
||||
fc::sha256 check = fc::sha256::hash(wif_bytes.data(), wif_bytes.size() - 4);
|
||||
fc::sha256 check2 = fc::sha256::hash(check);
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@ namespace impl {
|
|||
|
||||
std::string clean_name( const std::string& name )
|
||||
{
|
||||
std::string result;
|
||||
const static std::string prefix = "graphene::chain::";
|
||||
const static std::string suffix = "_operation";
|
||||
// graphene::chain::.*_operation
|
||||
|
|
@ -81,24 +80,25 @@ struct from_which_visitor
|
|||
result_type operator()( const Member& dummy )
|
||||
{
|
||||
Member result;
|
||||
from_variant( v, result );
|
||||
from_variant( v, result, _max_depth );
|
||||
return result; // converted from StaticVariant to Result automatically due to return type
|
||||
}
|
||||
|
||||
const variant& v;
|
||||
const uint32_t _max_depth;
|
||||
|
||||
from_which_visitor( const variant& _v ) : v(_v) {}
|
||||
from_which_visitor( const variant& _v, uint32_t max_depth ) : v(_v), _max_depth(max_depth) {}
|
||||
};
|
||||
|
||||
} // namespace impl
|
||||
|
||||
template< typename T >
|
||||
T from_which_variant( int which, const variant& v )
|
||||
T from_which_variant( int which, const variant& v, uint32_t max_depth )
|
||||
{
|
||||
// Parse a variant for a known which()
|
||||
T dummy;
|
||||
dummy.set_which( which );
|
||||
impl::from_which_visitor< T > vtor(v);
|
||||
impl::from_which_visitor< T > vtor(v, max_depth);
|
||||
return dummy.visit( vtor );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,8 +34,8 @@ using namespace std;
|
|||
|
||||
namespace fc
|
||||
{
|
||||
void to_variant(const account_multi_index_type& accts, variant& vo);
|
||||
void from_variant(const variant &var, account_multi_index_type &vo);
|
||||
void to_variant( const account_multi_index_type& accts, variant& vo, uint32_t max_depth );
|
||||
void from_variant( const variant &var, account_multi_index_type &vo, uint32_t max_depth );
|
||||
}
|
||||
|
||||
namespace graphene { namespace wallet {
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ namespace detail {
|
|||
struct operation_result_printer
|
||||
{
|
||||
public:
|
||||
operation_result_printer( const wallet_api_impl& w )
|
||||
explicit operation_result_printer( const wallet_api_impl& w )
|
||||
: _wallet(w) {}
|
||||
const wallet_api_impl& _wallet;
|
||||
typedef std::string result_type;
|
||||
|
|
@ -151,10 +151,10 @@ optional<T> maybe_id( const string& name_or_id )
|
|||
{
|
||||
try
|
||||
{
|
||||
return fc::variant(name_or_id).as<T>();
|
||||
return fc::variant(name_or_id, 1).as<T>(1);
|
||||
}
|
||||
catch (const fc::exception&)
|
||||
{
|
||||
{ // not an ID
|
||||
}
|
||||
}
|
||||
return optional<T>();
|
||||
|
|
@ -378,8 +378,8 @@ private:
|
|||
{
|
||||
try
|
||||
{
|
||||
object_id_type id = changed_object_variant["id"].as<tournament_id_type>();
|
||||
tournament_object current_tournament_obj = changed_object_variant.as<tournament_object>();
|
||||
object_id_type id = changed_object_variant["id"].as<tournament_id_type>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
tournament_object current_tournament_obj = changed_object_variant.as<tournament_object>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
auto tournament_cache_iter = tournament_cache.find(id);
|
||||
if (tournament_cache_iter != tournament_cache.end())
|
||||
{
|
||||
|
|
@ -411,8 +411,8 @@ private:
|
|||
}
|
||||
try
|
||||
{
|
||||
object_id_type id = changed_object_variant["id"].as<match_id_type>();
|
||||
match_object current_match_obj = changed_object_variant.as<match_object>();
|
||||
object_id_type id = changed_object_variant["id"].as<match_id_type>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
match_object current_match_obj = changed_object_variant.as<match_object>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
auto match_cache_iter = match_cache.find(id);
|
||||
if (match_cache_iter != match_cache.end())
|
||||
{
|
||||
|
|
@ -436,8 +436,8 @@ private:
|
|||
}
|
||||
try
|
||||
{
|
||||
object_id_type id = changed_object_variant["id"].as<game_id_type>();
|
||||
game_object current_game_obj = changed_object_variant.as<game_object>();
|
||||
object_id_type id = changed_object_variant["id"].as<game_id_type>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
game_object current_game_obj = changed_object_variant.as<game_object>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
auto game_cache_iter = game_cache.find(id);
|
||||
if (game_cache_iter != game_cache.end())
|
||||
{
|
||||
|
|
@ -460,10 +460,10 @@ private:
|
|||
}
|
||||
try
|
||||
{
|
||||
object_id_type id = changed_object_variant["id"].as<account_id_type>();
|
||||
object_id_type id = changed_object_variant["id"].as<account_id_type>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
if (_wallet.my_accounts.find(id) != _wallet.my_accounts.end())
|
||||
{
|
||||
account_object account = changed_object_variant.as<account_object>();
|
||||
account_object account = changed_object_variant.as<account_object>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
_wallet.update_account(account);
|
||||
}
|
||||
continue;
|
||||
|
|
@ -641,7 +641,7 @@ public:
|
|||
T get_object(object_id<T::space_id, T::type_id, T> id)const
|
||||
{
|
||||
auto ob = _remote_db->get_objects({id}).front();
|
||||
return ob.template as<T>();
|
||||
return ob.template as<T>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
}
|
||||
|
||||
void set_operation_fees( signed_transaction& tx, const fee_schedule& s )
|
||||
|
|
@ -657,16 +657,16 @@ public:
|
|||
auto dynamic_props = get_dynamic_global_properties();
|
||||
fc::mutable_variant_object result;
|
||||
result["head_block_num"] = dynamic_props.head_block_number;
|
||||
result["head_block_id"] = dynamic_props.head_block_id;
|
||||
result["head_block_id"] = fc::variant(dynamic_props.head_block_id, 1);
|
||||
result["head_block_age"] = fc::get_approximate_relative_time_string(dynamic_props.time,
|
||||
time_point_sec(time_point::now()),
|
||||
" old");
|
||||
result["next_maintenance_time"] = fc::get_approximate_relative_time_string(dynamic_props.next_maintenance_time);
|
||||
result["chain_id"] = chain_props.chain_id;
|
||||
result["participation"] = (100*dynamic_props.recent_slots_filled.popcount()) / 128.0;
|
||||
result["active_witnesses"] = global_props.active_witnesses;
|
||||
result["active_committee_members"] = global_props.active_committee_members;
|
||||
result["entropy"] = dynamic_props.random;
|
||||
result["active_witnesses"] = fc::variant(global_props.active_witnesses, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
result["active_committee_members"] = fc::variant(global_props.active_committee_members, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
result["entropy"] = fc::variant(dynamic_props.random, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
@ -786,7 +786,7 @@ public:
|
|||
FC_ASSERT( asset_symbol_or_id.size() > 0 );
|
||||
vector<optional<asset_object>> opt_asset;
|
||||
if( std::isdigit( asset_symbol_or_id.front() ) )
|
||||
return fc::variant(asset_symbol_or_id).as<asset_id_type>();
|
||||
return fc::variant(asset_symbol_or_id, 1).as<asset_id_type>( 1 );
|
||||
opt_asset = _remote_db->lookup_asset_symbols( {asset_symbol_or_id} );
|
||||
FC_ASSERT( (opt_asset.size() > 0) && (opt_asset[0].valid()) );
|
||||
return opt_asset[0]->id;
|
||||
|
|
@ -998,7 +998,7 @@ public:
|
|||
if( ! fc::exists( wallet_filename ) )
|
||||
return false;
|
||||
|
||||
_wallet = fc::json::from_file( wallet_filename ).as< wallet_data >();
|
||||
_wallet = fc::json::from_file( wallet_filename ).as< wallet_data >( 2 * GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
if( _wallet.chain_id != _chain_id )
|
||||
FC_THROW( "Wallet chain ID does not match",
|
||||
("wallet.chain_id", _wallet.chain_id)
|
||||
|
|
@ -1828,7 +1828,6 @@ public:
|
|||
{ try {
|
||||
witness_object witness = get_witness(witness_name);
|
||||
account_object witness_account = get_account( witness.witness_account );
|
||||
fc::ecc::private_key active_private_key = get_private_key_for_account(witness_account);
|
||||
|
||||
witness_update_operation witness_update_op;
|
||||
witness_update_op.witness = witness.id;
|
||||
|
|
@ -1852,7 +1851,7 @@ public:
|
|||
static WorkerInit _create_worker_initializer( const variant& worker_settings )
|
||||
{
|
||||
WorkerInit result;
|
||||
from_variant( worker_settings, result );
|
||||
from_variant( worker_settings, result, GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
@ -1906,7 +1905,6 @@ public:
|
|||
)
|
||||
{
|
||||
account_object acct = get_account( account );
|
||||
account_update_operation op;
|
||||
|
||||
// you could probably use a faster algorithm for this, but flat_set is fast enough :)
|
||||
flat_set< worker_id_type > merged;
|
||||
|
|
@ -1940,7 +1938,7 @@ public:
|
|||
for( const variant& obj : objects )
|
||||
{
|
||||
worker_object wo;
|
||||
from_variant( obj, wo );
|
||||
from_variant( obj, wo, GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
new_votes.erase( wo.vote_for );
|
||||
new_votes.erase( wo.vote_against );
|
||||
if( delta.vote_for.find( wo.id ) != delta.vote_for.end() )
|
||||
|
|
@ -2396,7 +2394,7 @@ public:
|
|||
|
||||
m["get_account_history"] = [this](variant result, const fc::variants& a)
|
||||
{
|
||||
auto r = result.as<vector<operation_detail>>();
|
||||
auto r = result.as<vector<operation_detail>>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
std::stringstream ss;
|
||||
|
||||
for( operation_detail& d : r )
|
||||
|
|
@ -2413,7 +2411,7 @@ public:
|
|||
};
|
||||
m["get_relative_account_history"] = [this](variant result, const fc::variants& a)
|
||||
{
|
||||
auto r = result.as<vector<operation_detail>>();
|
||||
auto r = result.as<vector<operation_detail>>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
std::stringstream ss;
|
||||
|
||||
for( operation_detail& d : r )
|
||||
|
|
@ -2431,7 +2429,7 @@ public:
|
|||
|
||||
m["list_account_balances"] = [this](variant result, const fc::variants& a)
|
||||
{
|
||||
auto r = result.as<vector<asset>>();
|
||||
auto r = result.as<vector<asset>>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
vector<asset_object> asset_recs;
|
||||
std::transform(r.begin(), r.end(), std::back_inserter(asset_recs), [this](const asset& a) {
|
||||
return get_asset(a.asset_id);
|
||||
|
|
@ -2448,7 +2446,7 @@ public:
|
|||
{
|
||||
std::stringstream ss;
|
||||
|
||||
auto balances = result.as<vector<account_balance_object>>();
|
||||
auto balances = result.as<vector<account_balance_object>>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
for (const account_balance_object& balance: balances)
|
||||
{
|
||||
const account_object& account = get_account(balance.owner);
|
||||
|
|
@ -2461,7 +2459,7 @@ public:
|
|||
|
||||
m["get_blind_balances"] = [this](variant result, const fc::variants& a)
|
||||
{
|
||||
auto r = result.as<vector<asset>>();
|
||||
auto r = result.as<vector<asset>>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
vector<asset_object> asset_recs;
|
||||
std::transform(r.begin(), r.end(), std::back_inserter(asset_recs), [this](const asset& a) {
|
||||
return get_asset(a.asset_id);
|
||||
|
|
@ -2475,7 +2473,7 @@ public:
|
|||
};
|
||||
m["transfer_to_blind"] = [this](variant result, const fc::variants& a)
|
||||
{
|
||||
auto r = result.as<blind_confirmation>();
|
||||
auto r = result.as<blind_confirmation>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
std::stringstream ss;
|
||||
r.trx.operations[0].visit( operation_printer( ss, *this, operation_result() ) );
|
||||
ss << "\n";
|
||||
|
|
@ -2488,7 +2486,7 @@ public:
|
|||
};
|
||||
m["blind_transfer"] = [this](variant result, const fc::variants& a)
|
||||
{
|
||||
auto r = result.as<blind_confirmation>();
|
||||
auto r = result.as<blind_confirmation>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
std::stringstream ss;
|
||||
r.trx.operations[0].visit( operation_printer( ss, *this, operation_result() ) );
|
||||
ss << "\n";
|
||||
|
|
@ -2501,7 +2499,7 @@ public:
|
|||
};
|
||||
m["receive_blind_transfer"] = [this](variant result, const fc::variants& a)
|
||||
{
|
||||
auto r = result.as<blind_receipt>();
|
||||
auto r = result.as<blind_receipt>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
std::stringstream ss;
|
||||
asset_object as = get_asset( r.amount.asset_id );
|
||||
ss << as.amount_to_pretty_string( r.amount ) << " " << r.from_label << " => " << r.to_label << " " << r.memo <<"\n";
|
||||
|
|
@ -2509,7 +2507,7 @@ public:
|
|||
};
|
||||
m["blind_history"] = [this](variant result, const fc::variants& a)
|
||||
{
|
||||
auto records = result.as<vector<blind_receipt>>();
|
||||
auto records = result.as<vector<blind_receipt>>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
std::stringstream ss;
|
||||
ss << "WHEN "
|
||||
<< " " << "AMOUNT" << " " << "FROM" << " => " << "TO" << " " << "MEMO" <<"\n";
|
||||
|
|
@ -2524,14 +2522,14 @@ public:
|
|||
};
|
||||
m["get_upcoming_tournaments"] = m["get_tournaments"] = m["get_tournaments_by_state"] = [this](variant result, const fc::variants& a)
|
||||
{
|
||||
const vector<tournament_object> tournaments = result.as<vector<tournament_object> >();
|
||||
const vector<tournament_object> tournaments = result.as<vector<tournament_object> >( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
std::stringstream ss;
|
||||
ss << "ID GAME BUY IN PLAYERS\n";
|
||||
ss << "====================================================================================\n";
|
||||
for( const tournament_object& tournament_obj : tournaments )
|
||||
{
|
||||
asset_object buy_in_asset = get_asset(tournament_obj.options.buy_in.asset_id);
|
||||
ss << fc::variant(tournament_obj.id).as<std::string>() << " "
|
||||
ss << fc::variant(tournament_obj.id, 1).as<std::string>( 1 ) << " "
|
||||
<< buy_in_asset.amount_to_pretty_string(tournament_obj.options.buy_in.amount) << " "
|
||||
<< tournament_obj.options.number_of_players << " players\n";
|
||||
switch (tournament_obj.get_state())
|
||||
|
|
@ -2574,8 +2572,8 @@ public:
|
|||
{
|
||||
std::stringstream ss;
|
||||
|
||||
tournament_object tournament = result.as<tournament_object>();
|
||||
tournament_details_object tournament_details = _remote_db->get_objects({result["tournament_details_id"].as<object_id_type>()})[0].as<tournament_details_object>();
|
||||
tournament_object tournament = result.as<tournament_object>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
tournament_details_object tournament_details = _remote_db->get_objects({result["tournament_details_id"].as<object_id_type>( 5 )})[0].as<tournament_details_object>( 5 );
|
||||
tournament_state state = tournament.get_state();
|
||||
if (state == tournament_state::accepting_registrations)
|
||||
{
|
||||
|
|
@ -2673,7 +2671,7 @@ public:
|
|||
};
|
||||
m["get_order_book"] = [this](variant result, const fc::variants& a)
|
||||
{
|
||||
auto orders = result.as<order_book>();
|
||||
auto orders = result.as<order_book>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
auto bids = orders.bids;
|
||||
auto asks = orders.asks;
|
||||
std::stringstream ss;
|
||||
|
|
@ -2683,12 +2681,10 @@ public:
|
|||
double ask_sum = 0;
|
||||
const int spacing = 20;
|
||||
|
||||
auto prettify_num = [&]( double n )
|
||||
auto prettify_num = [&ss]( double n )
|
||||
{
|
||||
//ss << n;
|
||||
if (abs( round( n ) - n ) < 0.00000000001 )
|
||||
{
|
||||
//ss << setiosflags( !ios::fixed ) << (int) n; // doesn't compile on Linux with gcc
|
||||
ss << (int) n;
|
||||
}
|
||||
else if (n - floor(n) < 0.000001)
|
||||
|
|
@ -2770,7 +2766,7 @@ public:
|
|||
const chain_parameters& current_params = get_global_properties().parameters;
|
||||
chain_parameters new_params = current_params;
|
||||
fc::reflector<chain_parameters>::visit(
|
||||
fc::from_variant_visitor<chain_parameters>( changed_values, new_params )
|
||||
fc::from_variant_visitor<chain_parameters>( changed_values, new_params, GRAPHENE_MAX_NESTED_OBJECTS )
|
||||
);
|
||||
|
||||
committee_member_update_global_parameters_operation update_op;
|
||||
|
|
@ -2820,7 +2816,7 @@ public:
|
|||
continue;
|
||||
}
|
||||
// is key a number?
|
||||
auto is_numeric = [&]() -> bool
|
||||
auto is_numeric = [&key]() -> bool
|
||||
{
|
||||
size_t n = key.size();
|
||||
for( size_t i=0; i<n; i++ )
|
||||
|
|
@ -2842,7 +2838,7 @@ public:
|
|||
which = it->second;
|
||||
}
|
||||
|
||||
fee_parameters fp = from_which_variant< fee_parameters >( which, item.value() );
|
||||
fee_parameters fp = from_which_variant< fee_parameters >( which, item.value(), GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
fee_map[ which ] = fp;
|
||||
}
|
||||
|
||||
|
|
@ -2886,7 +2882,7 @@ public:
|
|||
const chain_parameters& current_params = get_global_properties().parameters;
|
||||
asset_update_dividend_operation changed_op;
|
||||
fc::reflector<asset_update_dividend_operation>::visit(
|
||||
fc::from_variant_visitor<asset_update_dividend_operation>( changed_values, changed_op )
|
||||
fc::from_variant_visitor<asset_update_dividend_operation>( changed_values, changed_op, GRAPHENE_MAX_NESTED_OBJECTS )
|
||||
);
|
||||
|
||||
optional<asset_object> asset_to_update = find_asset(changed_op.asset_to_update);
|
||||
|
|
@ -2924,7 +2920,7 @@ public:
|
|||
proposal_update_operation update_op;
|
||||
|
||||
update_op.fee_paying_account = get_account(fee_paying_account).id;
|
||||
update_op.proposal = fc::variant(proposal_id).as<proposal_id_type>();
|
||||
update_op.proposal = fc::variant(proposal_id, 1).as<proposal_id_type>( 1 );
|
||||
// make sure the proposal exists
|
||||
get_object( update_op.proposal );
|
||||
|
||||
|
|
@ -3051,7 +3047,7 @@ public:
|
|||
for( const auto& peer : peers )
|
||||
{
|
||||
variant v;
|
||||
fc::to_variant( peer, v );
|
||||
fc::to_variant( peer, v, GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
result.push_back( v );
|
||||
}
|
||||
return result;
|
||||
|
|
@ -3064,7 +3060,6 @@ public:
|
|||
const account_object& master = *_wallet.my_accounts.get<by_name>().lower_bound("import");
|
||||
int number_of_accounts = number_of_transactions / 3;
|
||||
number_of_transactions -= number_of_accounts;
|
||||
//auto key = derive_private_key("floodshill", 0);
|
||||
try {
|
||||
dbg_make_uia(master.name, "SHILL");
|
||||
} catch(...) {/* Ignore; the asset probably already exists.*/}
|
||||
|
|
@ -4556,7 +4551,7 @@ string wallet_api::get_private_key( public_key_type pubkey )const
|
|||
|
||||
public_key_type wallet_api::get_public_key( string label )const
|
||||
{
|
||||
try { return fc::variant(label).as<public_key_type>(); } catch ( ... ){}
|
||||
try { return fc::variant(label, 1).as<public_key_type>( 1 ); } catch ( ... ){}
|
||||
|
||||
auto key_itr = my->_wallet.labeled_keys.get<by_label>().find(label);
|
||||
if( key_itr != my->_wallet.labeled_keys.get<by_label>().end() )
|
||||
|
|
@ -5734,7 +5729,7 @@ vector<tournament_object> wallet_api::get_tournaments_by_state(tournament_id_typ
|
|||
|
||||
tournament_object wallet_api::get_tournament(tournament_id_type id)
|
||||
{
|
||||
return my->_remote_db->get_objects({id})[0].as<tournament_object>();
|
||||
return my->_remote_db->get_objects({id})[0].as<tournament_object>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
}
|
||||
|
||||
signed_transaction wallet_api::rps_throw(game_id_type game_id,
|
||||
|
|
@ -5846,13 +5841,15 @@ vesting_balance_object_with_info::vesting_balance_object_with_info( const vestin
|
|||
|
||||
} } // graphene::wallet
|
||||
|
||||
void fc::to_variant(const account_multi_index_type& accts, fc::variant& vo)
|
||||
{
|
||||
vo = vector<account_object>(accts.begin(), accts.end());
|
||||
}
|
||||
namespace fc {
|
||||
void to_variant( const account_multi_index_type& accts, variant& vo, uint32_t max_depth )
|
||||
{
|
||||
to_variant( std::vector<account_object>(accts.begin(), accts.end()), vo, max_depth );
|
||||
}
|
||||
|
||||
void fc::from_variant(const fc::variant& var, account_multi_index_type& vo)
|
||||
{
|
||||
const vector<account_object>& v = var.as<vector<account_object>>();
|
||||
vo = account_multi_index_type(v.begin(), v.end());
|
||||
void from_variant( const variant& var, account_multi_index_type& vo, uint32_t max_depth )
|
||||
{
|
||||
const std::vector<account_object>& v = var.as<std::vector<account_object>>( max_depth );
|
||||
vo = account_multi_index_type(v.begin(), v.end());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ namespace graphene { namespace member_enumerator {
|
|||
|
||||
struct class_processor
|
||||
{
|
||||
class_processor( std::map< std::string, std::vector< std::string > >& r ) : result(r) {}
|
||||
explicit class_processor( std::map< std::string, std::vector< std::string > >& r ) : result(r) {}
|
||||
|
||||
template< typename T >
|
||||
void process_class( const T* dummy );
|
||||
|
|
@ -84,7 +84,7 @@ struct member_visitor
|
|||
|
||||
struct static_variant_visitor
|
||||
{
|
||||
static_variant_visitor( class_processor* p ) : proc(p) {}
|
||||
explicit static_variant_visitor( class_processor* p ) : proc(p) {}
|
||||
|
||||
typedef void result_type;
|
||||
|
||||
|
|
@ -215,13 +215,12 @@ int main( int argc, char** argv )
|
|||
{
|
||||
std::map< std::string, std::vector< std::string > > result;
|
||||
graphene::member_enumerator::class_processor::process_class<signed_block>(result);
|
||||
//graphene::member_enumerator::process_class<transfer_operation>(result);
|
||||
|
||||
fc::mutable_variant_object mvo;
|
||||
for( const std::pair< std::string, std::vector< std::string > >& e : result )
|
||||
{
|
||||
variant v;
|
||||
to_variant( e.second, v );
|
||||
to_variant( e.second, v , 1);
|
||||
mvo.set( e.first, v );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include <fc/smart_ref_impl.hpp>
|
||||
|
||||
#include <graphene/app/api.hpp>
|
||||
#include <graphene/chain/config.hpp>
|
||||
#include <graphene/chain/protocol/protocol.hpp>
|
||||
#include <graphene/egenesis/egenesis.hpp>
|
||||
#include <graphene/utilities/key_conversion.hpp>
|
||||
|
|
@ -108,8 +109,8 @@ int main( int argc, char** argv )
|
|||
|
||||
std::cout << "Logging RPC to file: " << (data_dir / ac.filename).preferred_string() << "\n";
|
||||
|
||||
cfg.appenders.push_back(fc::appender_config( "default", "console", fc::variant(fc::console_appender::config())));
|
||||
cfg.appenders.push_back(fc::appender_config( "rpc", "file", fc::variant(ac)));
|
||||
cfg.appenders.push_back(fc::appender_config( "default", "console", fc::variant(fc::console_appender::config(), 20)));
|
||||
cfg.appenders.push_back(fc::appender_config( "rpc", "file", fc::variant(ac, 5)));
|
||||
|
||||
cfg.loggers = { fc::logger_config("default"), fc::logger_config( "rpc") };
|
||||
cfg.loggers.front().level = fc::log_level::info;
|
||||
|
|
@ -117,8 +118,6 @@ int main( int argc, char** argv )
|
|||
cfg.loggers.back().level = fc::log_level::debug;
|
||||
cfg.loggers.back().appenders = {"rpc"};
|
||||
|
||||
//fc::configure_logging( cfg );
|
||||
|
||||
fc::ecc::private_key committee_private_key = fc::ecc::private_key::regenerate(fc::sha256::hash(string("null_key")));
|
||||
|
||||
idump( (key_to_wif( committee_private_key ) ) );
|
||||
|
|
@ -139,7 +138,7 @@ int main( int argc, char** argv )
|
|||
fc::path wallet_file( options.count("wallet-file") ? options.at("wallet-file").as<string>() : "wallet.json");
|
||||
if( fc::exists( wallet_file ) )
|
||||
{
|
||||
wdata = fc::json::from_file( wallet_file ).as<wallet_data>();
|
||||
wdata = fc::json::from_file( wallet_file ).as<wallet_data>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
if( options.count("chain-id") )
|
||||
{
|
||||
// the --chain-id on the CLI must match the chain ID embedded in the wallet file
|
||||
|
|
@ -175,12 +174,11 @@ int main( int argc, char** argv )
|
|||
fc::http::websocket_client client;
|
||||
idump((wdata.ws_server));
|
||||
auto con = client.connect( wdata.ws_server );
|
||||
auto apic = std::make_shared<fc::rpc::websocket_api_connection>(con);
|
||||
auto apic = std::make_shared<fc::rpc::websocket_api_connection>(con, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
|
||||
auto remote_api = apic->get_remote_api< login_api >(1);
|
||||
edump((wdata.ws_user)(wdata.ws_password) );
|
||||
// TODO: Error message here
|
||||
FC_ASSERT( remote_api->login( wdata.ws_user, wdata.ws_password ) );
|
||||
FC_ASSERT( remote_api->login( wdata.ws_user, wdata.ws_password ), "Failed to log in to API server" );
|
||||
|
||||
auto wapiptr = std::make_shared<wallet_api>( wdata, remote_api );
|
||||
wapiptr->set_wallet_filename( wallet_file.generic_string() );
|
||||
|
|
@ -188,11 +186,11 @@ int main( int argc, char** argv )
|
|||
|
||||
fc::api<wallet_api> wapi(wapiptr);
|
||||
|
||||
auto wallet_cli = std::make_shared<fc::rpc::cli>();
|
||||
auto wallet_cli = std::make_shared<fc::rpc::cli>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
for( auto& name_formatter : wapiptr->get_result_formatters() )
|
||||
wallet_cli->format_result( name_formatter.first, name_formatter.second );
|
||||
|
||||
boost::signals2::scoped_connection closed_connection(con->closed.connect([=]{
|
||||
boost::signals2::scoped_connection closed_connection(con->closed.connect([wallet_cli]{
|
||||
cerr << "Server has disconnected us.\n";
|
||||
wallet_cli->stop();
|
||||
}));
|
||||
|
|
@ -212,10 +210,10 @@ int main( int argc, char** argv )
|
|||
auto _websocket_server = std::make_shared<fc::http::websocket_server>();
|
||||
if( options.count("rpc-endpoint") )
|
||||
{
|
||||
_websocket_server->on_connection([&]( const fc::http::websocket_connection_ptr& c ){
|
||||
_websocket_server->on_connection([&wapi]( const fc::http::websocket_connection_ptr& c ){
|
||||
std::cout << "here... \n";
|
||||
wlog("." );
|
||||
auto wsc = std::make_shared<fc::rpc::websocket_api_connection>(c);
|
||||
auto wsc = std::make_shared<fc::rpc::websocket_api_connection>(c, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
wsc->register_api(wapi);
|
||||
c->set_session_data( wsc );
|
||||
});
|
||||
|
|
@ -232,7 +230,7 @@ int main( int argc, char** argv )
|
|||
if( options.count("rpc-tls-endpoint") )
|
||||
{
|
||||
_websocket_tls_server->on_connection([&]( const fc::http::websocket_connection_ptr& c ){
|
||||
auto wsc = std::make_shared<fc::rpc::websocket_api_connection>(c);
|
||||
auto wsc = std::make_shared<fc::rpc::websocket_api_connection>(c, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
wsc->register_api(wapi);
|
||||
c->set_session_data( wsc );
|
||||
});
|
||||
|
|
@ -250,10 +248,10 @@ int main( int argc, char** argv )
|
|||
// due to implementation, on_request() must come AFTER listen()
|
||||
//
|
||||
_http_server->on_request(
|
||||
[&]( const fc::http::request& req, const fc::http::server::response& resp )
|
||||
[&wapi]( const fc::http::request& req, const fc::http::server::response& resp )
|
||||
{
|
||||
std::shared_ptr< fc::rpc::http_api_connection > conn =
|
||||
std::make_shared< fc::rpc::http_api_connection>();
|
||||
std::make_shared< fc::rpc::http_api_connection >( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
conn->register_api( wapi );
|
||||
conn->on_request( req, resp );
|
||||
} );
|
||||
|
|
|
|||
|
|
@ -261,8 +261,8 @@ fc::optional<fc::logging_config> load_logging_config_from_ini_file(const fc::pat
|
|||
console_appender_config.level_colors.emplace_back(
|
||||
fc::console_appender::level_color(fc::log_level::error,
|
||||
fc::console_appender::color::cyan));
|
||||
console_appender_config.stream = fc::variant(stream_name).as<fc::console_appender::stream::type>();
|
||||
logging_config.appenders.push_back(fc::appender_config(console_appender_name, "console", fc::variant(console_appender_config)));
|
||||
console_appender_config.stream = fc::variant(stream_name, 1).as<fc::console_appender::stream::type>(1);
|
||||
logging_config.appenders.push_back(fc::appender_config(console_appender_name, "console", fc::variant(console_appender_config, 20)));
|
||||
found_logging_config = true;
|
||||
}
|
||||
else if (boost::starts_with(section_name, file_appender_section_prefix))
|
||||
|
|
@ -281,7 +281,7 @@ fc::optional<fc::logging_config> load_logging_config_from_ini_file(const fc::pat
|
|||
file_appender_config.rotate = true;
|
||||
file_appender_config.rotation_interval = fc::hours(1);
|
||||
file_appender_config.rotation_limit = fc::days(1);
|
||||
logging_config.appenders.push_back(fc::appender_config(file_appender_name, "file", fc::variant(file_appender_config)));
|
||||
logging_config.appenders.push_back(fc::appender_config(file_appender_name, "file", fc::variant(file_appender_config, 20)));
|
||||
found_logging_config = true;
|
||||
}
|
||||
else if (boost::starts_with(section_name, logger_section_prefix))
|
||||
|
|
@ -290,7 +290,7 @@ fc::optional<fc::logging_config> load_logging_config_from_ini_file(const fc::pat
|
|||
std::string level_string = section_tree.get<std::string>("level");
|
||||
std::string appenders_string = section_tree.get<std::string>("appenders");
|
||||
fc::logger_config logger_config(logger_name);
|
||||
logger_config.level = fc::variant(level_string).as<fc::log_level>();
|
||||
logger_config.level = fc::variant(level_string, 1).as<fc::log_level>(1);
|
||||
boost::split(logger_config.appenders, appenders_string,
|
||||
boost::is_any_of(" ,"),
|
||||
boost::token_compress_on);
|
||||
|
|
|
|||
|
|
@ -246,8 +246,8 @@ fc::optional<fc::logging_config> load_logging_config_from_ini_file(const fc::pat
|
|||
console_appender_config.level_colors.emplace_back(
|
||||
fc::console_appender::level_color(fc::log_level::error,
|
||||
fc::console_appender::color::cyan));
|
||||
console_appender_config.stream = fc::variant(stream_name).as<fc::console_appender::stream::type>();
|
||||
logging_config.appenders.push_back(fc::appender_config(console_appender_name, "console", fc::variant(console_appender_config)));
|
||||
console_appender_config.stream = fc::variant(stream_name, 1).as<fc::console_appender::stream::type>(1);
|
||||
logging_config.appenders.push_back(fc::appender_config(console_appender_name, "console", fc::variant(console_appender_config, GRAPHENE_MAX_NESTED_OBJECTS)));
|
||||
found_logging_config = true;
|
||||
}
|
||||
else if (boost::starts_with(section_name, file_appender_section_prefix))
|
||||
|
|
@ -266,7 +266,7 @@ fc::optional<fc::logging_config> load_logging_config_from_ini_file(const fc::pat
|
|||
file_appender_config.rotate = true;
|
||||
file_appender_config.rotation_interval = fc::hours(1);
|
||||
file_appender_config.rotation_limit = fc::days(1);
|
||||
logging_config.appenders.push_back(fc::appender_config(file_appender_name, "file", fc::variant(file_appender_config)));
|
||||
logging_config.appenders.push_back(fc::appender_config(file_appender_name, "file", fc::variant(file_appender_config, GRAPHENE_MAX_NESTED_OBJECTS)));
|
||||
found_logging_config = true;
|
||||
}
|
||||
else if (boost::starts_with(section_name, logger_section_prefix))
|
||||
|
|
@ -275,7 +275,7 @@ fc::optional<fc::logging_config> load_logging_config_from_ini_file(const fc::pat
|
|||
std::string level_string = section_tree.get<std::string>("level");
|
||||
std::string appenders_string = section_tree.get<std::string>("appenders");
|
||||
fc::logger_config logger_config(logger_name);
|
||||
logger_config.level = fc::variant(level_string).as<fc::log_level>();
|
||||
logger_config.level = fc::variant(level_string, 1).as<fc::log_level>(1);
|
||||
boost::split(logger_config.appenders, appenders_string,
|
||||
boost::is_any_of(" ,"),
|
||||
boost::token_compress_on);
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ int main( int argc, char** argv )
|
|||
std::cerr << "update_genesis: Reading genesis from file " << genesis_json_filename.preferred_string() << "\n";
|
||||
std::string genesis_json;
|
||||
read_file_contents( genesis_json_filename, genesis_json );
|
||||
genesis = fc::json::from_string( genesis_json ).as< genesis_state_type >();
|
||||
genesis = fc::json::from_string( genesis_json ).as< genesis_state_type >(20);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -120,8 +120,8 @@ int main( int argc, char** argv )
|
|||
|
||||
if (!options.count("nop"))
|
||||
{
|
||||
std::string dev_key_prefix = options["dev-key-prefix"].as<std::string>();
|
||||
auto get_dev_key = [&]( std::string prefix, uint32_t i ) -> public_key_type
|
||||
const std::string dev_key_prefix = options["dev-key-prefix"].as<std::string>();
|
||||
auto get_dev_key = [&dev_key_prefix]( std::string prefix, uint32_t i ) -> public_key_type
|
||||
{
|
||||
return fc::ecc::private_key::regenerate( fc::sha256::hash( dev_key_prefix + prefix + std::to_string(i) ) ).get_public_key();
|
||||
};
|
||||
|
|
|
|||
|
|
@ -70,9 +70,9 @@ int main( int argc, char** argv )
|
|||
|
||||
bool comma = false;
|
||||
|
||||
auto show_key = [&]( const fc::ecc::private_key& priv_key )
|
||||
auto show_key = [&comma]( const fc::ecc::private_key& priv_key )
|
||||
{
|
||||
fc::mutable_variant_object mvo;
|
||||
fc::limited_mutable_variant_object mvo(5);
|
||||
graphene::chain::public_key_type pub_key = priv_key.get_public_key();
|
||||
mvo( "private_key", graphene::utilities::key_to_wif( priv_key ) )
|
||||
( "public_key", std::string( pub_key ) )
|
||||
|
|
@ -80,7 +80,7 @@ int main( int argc, char** argv )
|
|||
;
|
||||
if( comma )
|
||||
std::cout << ",\n";
|
||||
std::cout << fc::json::to_string( mvo );
|
||||
std::cout << fc::json::to_string( fc::mutable_variant_object(mvo) );
|
||||
comma = true;
|
||||
};
|
||||
|
||||
|
|
@ -90,7 +90,7 @@ int main( int argc, char** argv )
|
|||
{
|
||||
std::string arg = argv[i];
|
||||
std::string prefix;
|
||||
int lep = -1, rep;
|
||||
int lep = -1, rep = -1;
|
||||
auto dash_pos = arg.rfind('-');
|
||||
if( dash_pos != string::npos )
|
||||
{
|
||||
|
|
@ -104,7 +104,6 @@ int main( int argc, char** argv )
|
|||
rep = std::stoi( rhs.substr( colon_pos+1 ) );
|
||||
}
|
||||
}
|
||||
vector< fc::ecc::private_key > keys;
|
||||
if( lep >= 0 )
|
||||
{
|
||||
for( int k=lep; k<rep; k++ )
|
||||
|
|
|
|||
|
|
@ -292,8 +292,8 @@ fc::optional<fc::logging_config> load_logging_config_from_ini_file(const fc::pat
|
|||
console_appender_config.level_colors.emplace_back(
|
||||
fc::console_appender::level_color(fc::log_level::error,
|
||||
fc::console_appender::color::cyan));
|
||||
console_appender_config.stream = fc::variant(stream_name).as<fc::console_appender::stream::type>();
|
||||
logging_config.appenders.push_back(fc::appender_config(console_appender_name, "console", fc::variant(console_appender_config)));
|
||||
console_appender_config.stream = fc::variant(stream_name).as<fc::console_appender::stream::type>(GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
logging_config.appenders.push_back(fc::appender_config(console_appender_name, "console", fc::variant(console_appender_config, GRAPHENE_MAX_NESTED_OBJECTS)));
|
||||
found_logging_config = true;
|
||||
}
|
||||
else if (boost::starts_with(section_name, file_appender_section_prefix))
|
||||
|
|
@ -312,7 +312,7 @@ fc::optional<fc::logging_config> load_logging_config_from_ini_file(const fc::pat
|
|||
file_appender_config.rotate = true;
|
||||
file_appender_config.rotation_interval = fc::hours(1);
|
||||
file_appender_config.rotation_limit = fc::days(1);
|
||||
logging_config.appenders.push_back(fc::appender_config(file_appender_name, "file", fc::variant(file_appender_config)));
|
||||
logging_config.appenders.push_back(fc::appender_config(file_appender_name, "file", fc::variant(file_appender_config, GRAPHENE_MAX_NESTED_OBJECTS)));
|
||||
found_logging_config = true;
|
||||
}
|
||||
else if (boost::starts_with(section_name, logger_section_prefix))
|
||||
|
|
@ -321,7 +321,7 @@ fc::optional<fc::logging_config> load_logging_config_from_ini_file(const fc::pat
|
|||
std::string level_string = section_tree.get<std::string>("level");
|
||||
std::string appenders_string = section_tree.get<std::string>("appenders");
|
||||
fc::logger_config logger_config(logger_name);
|
||||
logger_config.level = fc::variant(level_string).as<fc::log_level>();
|
||||
logger_config.level = fc::variant(level_string).as<fc::log_level>(5);
|
||||
boost::split(logger_config.appenders, appenders_string,
|
||||
boost::is_any_of(" ,"),
|
||||
boost::token_compress_on);
|
||||
|
|
|
|||
|
|
@ -962,7 +962,7 @@ BOOST_AUTO_TEST_CASE(persistent_objects_test)
|
|||
fc::variants objects_from_bookie = bookie_api.get_objects({automatically_canceled_bet_id});
|
||||
idump((objects_from_bookie));
|
||||
BOOST_REQUIRE_EQUAL(objects_from_bookie.size(), 1u);
|
||||
BOOST_CHECK_MESSAGE(objects_from_bookie[0]["id"].as<bet_id_type>() == automatically_canceled_bet_id, "Bookie Plugin didn't return a deleted bet it");
|
||||
BOOST_CHECK_MESSAGE(objects_from_bookie[0]["id"].as<bet_id_type>(1) == automatically_canceled_bet_id, "Bookie Plugin didn't return a deleted bet it");
|
||||
|
||||
// lay 47 at 1.94 odds (50:47) -- this bet should go on the order books normally
|
||||
bet_id_type first_bet_on_books = place_bet(alice_id, capitals_win_market.id, bet_type::lay, asset(47, asset_id_type()), 194 * GRAPHENE_BETTING_ODDS_PRECISION / 100);
|
||||
|
|
@ -971,7 +971,7 @@ BOOST_AUTO_TEST_CASE(persistent_objects_test)
|
|||
objects_from_bookie = bookie_api.get_objects({first_bet_on_books});
|
||||
idump((objects_from_bookie));
|
||||
BOOST_REQUIRE_EQUAL(objects_from_bookie.size(), 1u);
|
||||
BOOST_CHECK_MESSAGE(objects_from_bookie[0]["id"].as<bet_id_type>() == first_bet_on_books, "Bookie Plugin didn't return a bet that is currently on the books");
|
||||
BOOST_CHECK_MESSAGE(objects_from_bookie[0]["id"].as<bet_id_type>(1) == first_bet_on_books, "Bookie Plugin didn't return a bet that is currently on the books");
|
||||
|
||||
// place a bet that exactly matches 'first_bet_on_books', should result in empty books (thus, no bet_objects from the blockchain)
|
||||
bet_id_type matching_bet = place_bet(bob_id, capitals_win_market.id, bet_type::back, asset(50, asset_id_type()), 194 * GRAPHENE_BETTING_ODDS_PRECISION / 100);
|
||||
|
|
@ -982,8 +982,8 @@ BOOST_AUTO_TEST_CASE(persistent_objects_test)
|
|||
objects_from_bookie = bookie_api.get_objects({first_bet_on_books, matching_bet});
|
||||
idump((objects_from_bookie));
|
||||
BOOST_REQUIRE_EQUAL(objects_from_bookie.size(), 2u);
|
||||
BOOST_CHECK_MESSAGE(objects_from_bookie[0]["id"].as<bet_id_type>() == first_bet_on_books, "Bookie Plugin didn't return a bet that has been filled");
|
||||
BOOST_CHECK_MESSAGE(objects_from_bookie[1]["id"].as<bet_id_type>() == matching_bet, "Bookie Plugin didn't return a bet that has been filled");
|
||||
BOOST_CHECK_MESSAGE(objects_from_bookie[0]["id"].as<bet_id_type>(1) == first_bet_on_books, "Bookie Plugin didn't return a bet that has been filled");
|
||||
BOOST_CHECK_MESSAGE(objects_from_bookie[1]["id"].as<bet_id_type>(1) == matching_bet, "Bookie Plugin didn't return a bet that has been filled");
|
||||
|
||||
update_betting_market_group(moneyline_betting_markets.id, _status = betting_market_group_status::closed);
|
||||
|
||||
|
|
@ -1249,7 +1249,7 @@ BOOST_AUTO_TEST_CASE( chained_market_create_test )
|
|||
|
||||
for (const witness_id_type& witness_id : active_witnesses)
|
||||
{
|
||||
BOOST_TEST_MESSAGE("Approving sport+competitors creation from witness " << fc::variant(witness_id).as<std::string>());
|
||||
BOOST_TEST_MESSAGE("Approving sport+competitors creation from witness " << fc::variant(witness_id, 1).as<std::string>(1));
|
||||
const witness_object& witness = witness_id(db);
|
||||
const account_object& witness_account = witness.witness_account(db);
|
||||
|
||||
|
|
@ -2077,7 +2077,7 @@ BOOST_AUTO_TEST_CASE(event_driven_standard_progression_1)
|
|||
// removed.
|
||||
fc::variants objects_from_bookie = bookie_api.get_objects({capitals_vs_blackhawks_id});
|
||||
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(1), "settled");
|
||||
} FC_LOG_AND_RETHROW()
|
||||
}
|
||||
|
||||
|
|
@ -2138,12 +2138,12 @@ BOOST_AUTO_TEST_CASE(event_driven_standard_progression_1_with_delay)
|
|||
blackhawks_win_market_id});
|
||||
|
||||
idump((objects_from_bookie));
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[1]["status"].as<std::string>(), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[2]["status"].as<std::string>(), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[2]["resolution"].as<std::string>(), "win");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[3]["status"].as<std::string>(), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[3]["resolution"].as<std::string>(), "not_win");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(1), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[1]["status"].as<std::string>(1), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[2]["status"].as<std::string>(1), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[2]["resolution"].as<std::string>(1), "win");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[3]["status"].as<std::string>(1), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[3]["resolution"].as<std::string>(1), "not_win");
|
||||
} FC_LOG_AND_RETHROW()
|
||||
}
|
||||
|
||||
|
|
@ -2230,7 +2230,7 @@ BOOST_AUTO_TEST_CASE(event_driven_standard_progression_2)
|
|||
// removed.
|
||||
fc::variants objects_from_bookie = bookie_api.get_objects({capitals_vs_blackhawks_id});
|
||||
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(1), "settled");
|
||||
} FC_LOG_AND_RETHROW()
|
||||
}
|
||||
|
||||
|
|
@ -2318,7 +2318,7 @@ BOOST_AUTO_TEST_CASE(event_driven_standard_progression_2_never_in_play)
|
|||
// removed.
|
||||
fc::variants objects_from_bookie = bookie_api.get_objects({capitals_vs_blackhawks_id});
|
||||
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(1), "settled");
|
||||
} FC_LOG_AND_RETHROW()
|
||||
}
|
||||
|
||||
|
|
@ -2393,7 +2393,7 @@ BOOST_AUTO_TEST_CASE(event_driven_standard_progression_3)
|
|||
// and group will cease to exist. The event should transition to "canceled", then be removed
|
||||
fc::variants objects_from_bookie = bookie_api.get_objects({capitals_vs_blackhawks_id});
|
||||
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(), "canceled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(1), "canceled");
|
||||
|
||||
} FC_LOG_AND_RETHROW()
|
||||
}
|
||||
|
|
@ -2488,7 +2488,7 @@ BOOST_AUTO_TEST_CASE(event_driven_progression_errors_1)
|
|||
generate_blocks(1);
|
||||
|
||||
fc::variants objects_from_bookie = bookie_api.get_objects({capitals_vs_blackhawks_id});
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(), "canceled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(1), "canceled");
|
||||
|
||||
// we can't go back to upcoming, in_progress, frozen, or finished once we're canceled.
|
||||
// (this won't work because the event has been deleted)
|
||||
|
|
@ -2540,7 +2540,7 @@ BOOST_AUTO_TEST_CASE(event_driven_progression_errors_2)
|
|||
// as soon as a block is generated, the betting market group will settle, and the market
|
||||
// and group will cease to exist. The event should transition to "settled", then removed
|
||||
fc::variants objects_from_bookie = bookie_api.get_objects({capitals_vs_blackhawks_id});
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(1), "settled");
|
||||
|
||||
// we can't go back to upcoming, in_progress, frozen, or finished once we're canceled.
|
||||
// (this won't work because the event has been deleted)
|
||||
|
|
@ -2612,7 +2612,7 @@ BOOST_AUTO_TEST_CASE(betting_market_group_driven_standard_progression)
|
|||
// as soon as a block is generated, the betting market group will settle, and the market
|
||||
// and group will cease to exist. The event should transition to "settled"
|
||||
fc::variants objects_from_bookie = bookie_api.get_objects({capitals_vs_blackhawks_id});
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(1), "settled");
|
||||
} FC_LOG_AND_RETHROW()
|
||||
}
|
||||
|
||||
|
|
@ -2723,7 +2723,7 @@ BOOST_AUTO_TEST_CASE(multi_betting_market_group_driven_standard_progression)
|
|||
// as soon as a block is generated, the two betting market groups will settle, and the market
|
||||
// and group will cease to exist. The event should transition to "settled"
|
||||
fc::variants objects_from_bookie = bookie_api.get_objects({capitals_vs_blackhawks_id});
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(), "settled");
|
||||
BOOST_CHECK_EQUAL(objects_from_bookie[0]["status"].as<std::string>(1), "settled");
|
||||
} FC_LOG_AND_RETHROW()
|
||||
}
|
||||
|
||||
|
|
@ -2834,13 +2834,13 @@ BOOST_AUTO_TEST_CASE( wimbledon_2017_gentelmen_singles_sf_test )
|
|||
transfer(account_id_type(), alice_id, asset(10000000));
|
||||
transfer(account_id_type(), bob_id, asset(10000000));
|
||||
|
||||
BOOST_TEST_MESSAGE("moneyline_berdych_vs_federer " << fc::variant(moneyline_berdych_vs_federer.id).as<std::string>());
|
||||
BOOST_TEST_MESSAGE("moneyline_cilic_vs_querrey " << fc::variant(moneyline_cilic_vs_querrey.id).as<std::string>());
|
||||
BOOST_TEST_MESSAGE("moneyline_berdych_vs_federer " << fc::variant(moneyline_berdych_vs_federer.id, 1).as<std::string>(1));
|
||||
BOOST_TEST_MESSAGE("moneyline_cilic_vs_querrey " << fc::variant(moneyline_cilic_vs_querrey.id, 1).as<std::string>(1));
|
||||
|
||||
BOOST_TEST_MESSAGE("berdych_wins_market " << fc::variant(berdych_wins_market.id).as<std::string>());
|
||||
BOOST_TEST_MESSAGE("federer_wins_market " << fc::variant(federer_wins_market.id).as<std::string>());
|
||||
BOOST_TEST_MESSAGE("cilic_wins_market " << fc::variant(cilic_wins_market.id).as<std::string>());
|
||||
BOOST_TEST_MESSAGE("querrey_wins_market " << fc::variant(querrey_wins_market.id).as<std::string>());
|
||||
BOOST_TEST_MESSAGE("berdych_wins_market " << fc::variant(berdych_wins_market.id, 1).as<std::string>(1));
|
||||
BOOST_TEST_MESSAGE("federer_wins_market " << fc::variant(federer_wins_market.id, 1).as<std::string>(1));
|
||||
BOOST_TEST_MESSAGE("cilic_wins_market " << fc::variant(cilic_wins_market.id, 1).as<std::string>(1));
|
||||
BOOST_TEST_MESSAGE("querrey_wins_market " << fc::variant(querrey_wins_market.id, 1).as<std::string>(1));
|
||||
|
||||
place_bet(alice_id, berdych_wins_market.id, bet_type::back, asset(1000000, asset_id_type()), 2 * GRAPHENE_BETTING_ODDS_PRECISION);
|
||||
place_bet(bob_id, berdych_wins_market.id, bet_type::lay, asset(1000000, asset_id_type()), 2 * GRAPHENE_BETTING_ODDS_PRECISION);
|
||||
|
|
@ -2895,10 +2895,10 @@ BOOST_AUTO_TEST_CASE( wimbledon_2017_gentelmen_singles_final_test )
|
|||
transfer(account_id_type(), alice_id, asset(10000000));
|
||||
transfer(account_id_type(), bob_id, asset(10000000));
|
||||
|
||||
BOOST_TEST_MESSAGE("moneyline_cilic_vs_federer " << fc::variant(moneyline_cilic_vs_federer.id).as<std::string>());
|
||||
BOOST_TEST_MESSAGE("moneyline_cilic_vs_federer " << fc::variant(moneyline_cilic_vs_federer.id, 1).as<std::string>(1));
|
||||
|
||||
BOOST_TEST_MESSAGE("federer_wins_final_market " << fc::variant(federer_wins_final_market.id).as<std::string>());
|
||||
BOOST_TEST_MESSAGE("cilic_wins_final_market " << fc::variant(cilic_wins_final_market.id).as<std::string>());
|
||||
BOOST_TEST_MESSAGE("federer_wins_final_market " << fc::variant(federer_wins_final_market.id, 1).as<std::string>(1));
|
||||
BOOST_TEST_MESSAGE("cilic_wins_final_market " << fc::variant(cilic_wins_final_market.id, 1).as<std::string>(1));
|
||||
|
||||
betting_market_group_id_type moneyline_cilic_vs_federer_id = moneyline_cilic_vs_federer.id;
|
||||
update_betting_market_group(moneyline_cilic_vs_federer_id, _status = betting_market_group_status::in_play);
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include <graphene/account_history/account_history_plugin.hpp>
|
||||
#include <graphene/egenesis/egenesis.hpp>
|
||||
#include <graphene/wallet/wallet.hpp>
|
||||
#include <graphene/chain/config.hpp>
|
||||
|
||||
#include <fc/thread/thread.hpp>
|
||||
#include <fc/network/http/websocket.hpp>
|
||||
|
|
@ -213,7 +214,7 @@ public:
|
|||
wallet_data.ws_password = "";
|
||||
websocket_connection = websocket_client.connect( wallet_data.ws_server );
|
||||
|
||||
api_connection = std::make_shared<fc::rpc::websocket_api_connection>(websocket_connection);
|
||||
api_connection = std::make_shared<fc::rpc::websocket_api_connection>(websocket_connection, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
|
||||
remote_login_api = api_connection->get_remote_api< graphene::app::login_api >(1);
|
||||
BOOST_CHECK(remote_login_api->login( wallet_data.ws_user, wallet_data.ws_password ) );
|
||||
|
|
@ -224,7 +225,7 @@ public:
|
|||
|
||||
wallet_api = fc::api<graphene::wallet::wallet_api>(wallet_api_ptr);
|
||||
|
||||
wallet_cli = std::make_shared<fc::rpc::cli>();
|
||||
wallet_cli = std::make_shared<fc::rpc::cli>(GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
for( auto& name_formatter : wallet_api_ptr->get_result_formatters() )
|
||||
wallet_cli->format_result( name_formatter.first, name_formatter.second );
|
||||
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ int main( int argc, char** argv )
|
|||
std::cerr << "embed_genesis: Reading genesis from file " << genesis_json_filename.preferred_string() << "\n";
|
||||
std::string genesis_json;
|
||||
read_file_contents( genesis_json_filename, genesis_json );
|
||||
genesis = fc::json::from_string( genesis_json ).as< genesis_state_type >();
|
||||
genesis = fc::json::from_string( genesis_json ).as< genesis_state_type >(20);
|
||||
}
|
||||
else
|
||||
genesis = graphene::app::detail::create_example_genesis();
|
||||
|
|
@ -119,7 +119,6 @@ int main( int argc, char** argv )
|
|||
uint32_t num_blocks = options["num-blocks"].as<uint32_t>();
|
||||
uint32_t miss_rate = options["miss-rate"].as<uint32_t>();
|
||||
|
||||
fc::ecc::private_key init_account_priv_key = fc::ecc::private_key::regenerate(fc::sha256::hash(string("null_key")) );
|
||||
fc::ecc::private_key nathan_priv_key = fc::ecc::private_key::regenerate(fc::sha256::hash(string("nathan")));
|
||||
|
||||
database db;
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
#include <graphene/chain/proposal_object.hpp>
|
||||
#include <graphene/chain/witness_object.hpp>
|
||||
#include <graphene/chain/protocol/committee_member.hpp>
|
||||
#include <graphene/app/api.hpp>
|
||||
#include <fc/crypto/digest.hpp>
|
||||
|
||||
#include "../common/database_fixture.hpp"
|
||||
|
|
@ -419,3 +420,44 @@ BOOST_AUTO_TEST_CASE( check_passes_for_duplicated_betting_market_or_group )
|
|||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
BOOST_FIXTURE_TEST_SUITE(network_broadcast_api_tests, database_fixture)
|
||||
|
||||
BOOST_AUTO_TEST_CASE( broadcast_transaction_with_callback_test ) {
|
||||
try {
|
||||
|
||||
uint32_t called = 0;
|
||||
auto callback = [&]( const variant& v )
|
||||
{
|
||||
++called;
|
||||
};
|
||||
|
||||
fc::ecc::private_key cid_key = fc::ecc::private_key::regenerate( fc::digest("key") );
|
||||
const account_id_type cid_id = create_account( "cid", cid_key.get_public_key() ).id;
|
||||
fund( cid_id(db) );
|
||||
|
||||
auto nb_api = std::make_shared< graphene::app::network_broadcast_api >( app );
|
||||
|
||||
set_expiration( db, trx );
|
||||
transfer_operation trans;
|
||||
trans.from = cid_id;
|
||||
trans.to = account_id_type();
|
||||
trans.amount = asset(1);
|
||||
trx.operations.push_back( trans );
|
||||
sign( trx, cid_key );
|
||||
|
||||
nb_api->broadcast_transaction_with_callback( callback, trx );
|
||||
|
||||
trx.operations.clear();
|
||||
trx.signatures.clear();
|
||||
|
||||
generate_block();
|
||||
|
||||
fc::usleep(fc::milliseconds(200)); // sleep a while to execute callback in another thread
|
||||
|
||||
BOOST_CHECK_EQUAL( called, 1 );
|
||||
|
||||
} FC_LOG_AND_RETHROW()
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
|
|
|||
|
|
@ -171,7 +171,7 @@ BOOST_AUTO_TEST_CASE(subscribe_to_pending_transactions) {
|
|||
|
||||
signed_transaction transaction_in_notification;
|
||||
network_node_api.subscribe_to_pending_transactions([&]( const variant& signed_transaction_object ){
|
||||
transaction_in_notification = signed_transaction_object.as<signed_transaction>();
|
||||
transaction_in_notification = signed_transaction_object.as<signed_transaction>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
});
|
||||
|
||||
auto sam_transaction = push_transaction_for_account_creation("sam");
|
||||
|
|
|
|||
|
|
@ -64,8 +64,8 @@ BOOST_AUTO_TEST_CASE( serialization_json_test )
|
|||
op.to = account_id_type(2);
|
||||
op.amount = asset(100);
|
||||
trx.operations.push_back( op );
|
||||
fc::variant packed(trx);
|
||||
signed_transaction unpacked = packed.as<signed_transaction>();
|
||||
fc::variant packed(trx, GRAPHENE_MAX_NESTED_OBJECTS);
|
||||
signed_transaction unpacked = packed.as<signed_transaction>( GRAPHENE_MAX_NESTED_OBJECTS );
|
||||
unpacked.validate();
|
||||
BOOST_CHECK( digest(trx) == digest(unpacked) );
|
||||
} catch (fc::exception& e) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue