Merge commit '0ad83697f08a11431eece565f0386a849bed25c9' into betting

This commit is contained in:
Eric Frias 2017-06-20 18:36:19 -04:00
commit 627dba3a46
20 changed files with 186 additions and 49 deletions

View file

@ -1 +1 @@
2.0.160314 2.0.160829

View file

@ -28,3 +28,4 @@ INSTALL( TARGETS
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
) )
INSTALL( FILES ${HEADERS} DESTINATION "include/graphene/app" )

View file

@ -125,12 +125,17 @@ namespace detail {
auto seeds = _options->at("seed-node").as<vector<string>>(); auto seeds = _options->at("seed-node").as<vector<string>>();
for( const string& endpoint_string : seeds ) for( const string& endpoint_string : seeds )
{ {
std::vector<fc::ip::endpoint> endpoints = resolve_string_to_ip_endpoints(endpoint_string); try {
for (const fc::ip::endpoint& endpoint : endpoints) std::vector<fc::ip::endpoint> endpoints = resolve_string_to_ip_endpoints(endpoint_string);
{ for (const fc::ip::endpoint& endpoint : endpoints)
ilog("Adding seed node ${endpoint}", ("endpoint", endpoint)); {
_p2p_network->add_node(endpoint); ilog("Adding seed node ${endpoint}", ("endpoint", endpoint));
_p2p_network->connect_to_endpoint(endpoint); _p2p_network->add_node(endpoint);
_p2p_network->connect_to_endpoint(endpoint);
}
} catch( const fc::exception& e ) {
wlog( "caught exception ${e} while adding seed node ${endpoint}",
("e", e.to_detail_string())("endpoint", endpoint_string) );
} }
} }
} }
@ -141,11 +146,16 @@ namespace detail {
auto seeds = fc::json::from_string(seeds_str).as<vector<string>>(); auto seeds = fc::json::from_string(seeds_str).as<vector<string>>();
for( const string& endpoint_string : seeds ) for( const string& endpoint_string : seeds )
{ {
std::vector<fc::ip::endpoint> endpoints = resolve_string_to_ip_endpoints(endpoint_string); try {
for (const fc::ip::endpoint& endpoint : endpoints) std::vector<fc::ip::endpoint> endpoints = resolve_string_to_ip_endpoints(endpoint_string);
{ for (const fc::ip::endpoint& endpoint : endpoints)
ilog("Adding seed node ${endpoint}", ("endpoint", endpoint)); {
_p2p_network->add_node(endpoint); ilog("Adding seed node ${endpoint}", ("endpoint", endpoint));
_p2p_network->add_node(endpoint);
}
} catch( const fc::exception& e ) {
wlog( "caught exception ${e} while adding seed node ${endpoint}",
("e", e.to_detail_string())("endpoint", endpoint_string) );
} }
} }
} }
@ -154,8 +164,9 @@ namespace detail {
vector<string> seeds = { vector<string> seeds = {
"faucet.bitshares.org:1776", "faucet.bitshares.org:1776",
"bitshares.openledger.info:1776", "bitshares.openledger.info:1776",
"114.92.236.175:62015", // abit "bts-seed1.abit-more.com:62015", // abit
"seed.blocktrades.us:1776", "seed.blocktrades.us:1776",
"seed.bitsharesnodes.com:1776", // wackou
"seed04.bitsharesnodes.com:1776", // thom "seed04.bitsharesnodes.com:1776", // thom
"seed05.bitsharesnodes.com:1776", // thom "seed05.bitsharesnodes.com:1776", // thom
"seed06.bitsharesnodes.com:1776", // thom "seed06.bitsharesnodes.com:1776", // thom
@ -165,17 +176,22 @@ namespace detail {
"104.236.144.84:1777", // puppies "104.236.144.84:1777", // puppies
"40.127.190.171:1777", // betax "40.127.190.171:1777", // betax
"185.25.22.21:1776", // liondani (greece) "185.25.22.21:1776", // liondani (greece)
"23.95.43.126:50696", // iHashFury "212.47.249.84:50696", // iHashFury (France)
"109.73.172.144:50696", // iHashFury "104.168.154.160:50696", // iHashFury (USA)
"128.199.143.47:2015" // Harvey "128.199.143.47:2015" // Harvey
}; };
for( const string& endpoint_string : seeds ) for( const string& endpoint_string : seeds )
{ {
std::vector<fc::ip::endpoint> endpoints = resolve_string_to_ip_endpoints(endpoint_string); try {
for (const fc::ip::endpoint& endpoint : endpoints) std::vector<fc::ip::endpoint> endpoints = resolve_string_to_ip_endpoints(endpoint_string);
{ for (const fc::ip::endpoint& endpoint : endpoints)
ilog("Adding seed node ${endpoint}", ("endpoint", endpoint)); {
_p2p_network->add_node(endpoint); ilog("Adding seed node ${endpoint}", ("endpoint", endpoint));
_p2p_network->add_node(endpoint);
}
} catch( const fc::exception& e ) {
wlog( "caught exception ${e} while adding seed node ${endpoint}",
("e", e.to_detail_string())("endpoint", endpoint_string) );
} }
} }
} }
@ -508,6 +524,7 @@ namespace detail {
{ try { { try {
auto latency = graphene::time::now() - blk_msg.block.timestamp; auto latency = graphene::time::now() - blk_msg.block.timestamp;
FC_ASSERT( (latency.count()/1000) > -5000, "Rejecting block with timestamp in the future" );
if (!sync_mode || blk_msg.block.block_num() % 10000 == 0) if (!sync_mode || blk_msg.block.block_num() % 10000 == 0)
{ {
const auto& witness = blk_msg.block.witness(*_chain_db); const auto& witness = blk_msg.block.witness(*_chain_db);

View file

@ -1094,39 +1094,42 @@ market_ticker database_api_impl::get_ticker( const string& base, const string& q
uint32_t day = 86400; uint32_t day = 86400;
auto now = fc::time_point_sec( fc::time_point::now() ); auto now = fc::time_point_sec( fc::time_point::now() );
auto orders = get_order_book( base, quote, 1 );
auto trades = get_trade_history( base, quote, now, fc::time_point_sec( now.sec_since_epoch() - day ), 100 ); auto trades = get_trade_history( base, quote, now, fc::time_point_sec( now.sec_since_epoch() - day ), 100 );
result.latest = trades[0].price; if ( trades.size() )
for ( market_trade t: trades )
{ {
result.base_volume += t.value; result.latest = trades[0].price;
result.quote_volume += t.amount;
}
while (trades.size() == 100)
{
trades = get_trade_history( base, quote, trades[99].date, fc::time_point_sec( now.sec_since_epoch() - day ), 100 );
for ( market_trade t: trades ) for ( market_trade t: trades )
{ {
result.base_volume += t.value; result.base_volume += t.value;
result.quote_volume += t.amount; result.quote_volume += t.amount;
} }
while (trades.size() == 100)
{
trades = get_trade_history( base, quote, trades[99].date, fc::time_point_sec( now.sec_since_epoch() - day ), 100 );
for ( market_trade t: trades )
{
result.base_volume += t.value;
result.quote_volume += t.amount;
}
}
trades = get_trade_history( base, quote, trades.back().date, fc::time_point_sec(), 1 );
result.percent_change = trades.size() > 0 ? ( ( result.latest / trades.back().price ) - 1 ) * 100 : 0;
} }
trades = get_trade_history( base, quote, trades.back().date, fc::time_point_sec(), 1 ); auto orders = get_order_book( base, quote, 1 );
result.percent_change = trades.size() > 0 ? ( ( result.latest / trades.back().price ) - 1 ) * 100 : 0; if( orders.asks.size() )
//if (assets[0]->id == base_id)
{
result.lowest_ask = orders.asks[0].price; result.lowest_ask = orders.asks[0].price;
if( orders.bids.size() )
result.highest_bid = orders.bids[0].price; result.highest_bid = orders.bids[0].price;
}
return result;
} FC_CAPTURE_AND_RETHROW( (base)(quote) ) } FC_CAPTURE_AND_RETHROW( (base)(quote) )
return result;
} }
market_volume database_api::get_24_volume( const string& base, const string& quote )const market_volume database_api::get_24_volume( const string& base, const string& quote )const

View file

@ -6,6 +6,7 @@ set_source_files_properties( "${CMAKE_CURRENT_BINARY_DIR}/include/graphene/chain
add_dependencies( build_hardfork_hpp cat-parts ) add_dependencies( build_hardfork_hpp cat-parts )
file(GLOB HEADERS "include/graphene/chain/*.hpp") file(GLOB HEADERS "include/graphene/chain/*.hpp")
file(GLOB PROTOCOL_HEADERS "include/graphene/chain/protocol/*.hpp")
if( GRAPHENE_DISABLE_UNITY_BUILD ) if( GRAPHENE_DISABLE_UNITY_BUILD )
set( GRAPHENE_DB_FILES set( GRAPHENE_DB_FILES
@ -104,6 +105,7 @@ add_library( graphene_chain
db_bet.cpp db_bet.cpp
${HEADERS} ${HEADERS}
${PROTOCOL_HEADERS}
"${CMAKE_CURRENT_BINARY_DIR}/include/graphene/chain/hardfork.hpp" "${CMAKE_CURRENT_BINARY_DIR}/include/graphene/chain/hardfork.hpp"
) )
@ -123,3 +125,5 @@ INSTALL( TARGETS
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
) )
INSTALL( FILES ${HEADERS} DESTINATION "include/graphene/chain" )
INSTALL( FILES ${PROTOCOL_HEADERS} DESTINATION "include/graphene/chain/protocol" )

View file

@ -1,4 +1,4 @@
// #599 Unpacking of extension is incorrect // #599 Unpacking of extension is incorrect
#ifndef HARDFORK_599_TIME #ifndef HARDFORK_599_TIME
#define HARDFORK_599_TIME (fc::time_point_sec( 1458752400 )) #define HARDFORK_599_TIME (fc::time_point_sec( 1459789200 ))
#endif #endif

View file

@ -82,6 +82,8 @@ void operator<<( Stream& stream, const graphene::chain::extension<T>& value )
fc::reflector<T>::visit( read_vtor ); fc::reflector<T>::visit( read_vtor );
} }
template< typename Stream, typename T > template< typename Stream, typename T >
struct graphene_extension_unpack_visitor struct graphene_extension_unpack_visitor
{ {
@ -108,7 +110,7 @@ struct graphene_extension_unpack_visitor
{ {
if( (count_left > 0) && (which == next_which) ) if( (count_left > 0) && (which == next_which) )
{ {
Member temp; typename Member::value_type temp;
fc::raw::unpack( stream, temp ); fc::raw::unpack( stream, temp );
(value.*member) = temp; (value.*member) = temp;
--count_left; --count_left;

View file

@ -193,7 +193,7 @@ struct sign_state
if( approved_by.find(a.first) == approved_by.end() ) if( approved_by.find(a.first) == approved_by.end() )
{ {
if( depth == max_recursion ) if( depth == max_recursion )
return false; continue;
if( check_authority( get_active( a.first ), depth+1 ) ) if( check_authority( get_active( a.first ), depth+1 ) )
{ {
approved_by.insert( a.first ); approved_by.insert( a.first );

View file

@ -64,7 +64,7 @@ asset linear_vesting_policy::get_allowed_withdraw( const vesting_policy_context&
} }
} }
return asset( allowed_withdraw, ctx.amount.asset_id ); return asset( allowed_withdraw, ctx.balance.asset_id );
} }
void linear_vesting_policy::on_deposit(const vesting_policy_context& ctx) void linear_vesting_policy::on_deposit(const vesting_policy_context& ctx)

View file

@ -10,3 +10,4 @@ install( TARGETS
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
) )
install( FILES ${HEADERS} DESTINATION "include/graphene/db" )

View file

@ -25,3 +25,4 @@ install( TARGETS
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
) )
install( FILES ${headers} DESTINATION "include/graphene/deterministic_openssl_rand" )

@ -1 +1 @@
Subproject commit 2c8cdf84b75fe07f75e49dd43ae9ad5c3d5a129c Subproject commit 7a44b21acfea6728367a0cf56b1f3f7f8104aa63

View file

@ -32,3 +32,4 @@ install( TARGETS
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
) )
install( FILES ${HEADERS} DESTINATION "include/graphene/net" )

View file

@ -30,3 +30,4 @@ install( TARGETS
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
) )
install( FILES ${HEADERS} DESTINATION "include/graphene/p2p" )

View file

@ -15,3 +15,4 @@ install( TARGETS
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
) )
install( FILES ${HEADERS} DESTINATION "include/graphene/time" )

View file

@ -37,3 +37,4 @@ install( TARGETS
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
) )
install( FILES ${HEADERS} DESTINATION "include/graphene/utilities" )

View file

@ -8,7 +8,7 @@ if( PERL_FOUND AND DOXYGEN_FOUND AND NOT "${CMAKE_GENERATOR}" STREQUAL "Ninja" )
add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/doxygen/perlmod/DoxyDocs.pm add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/doxygen/perlmod/DoxyDocs.pm
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND ${DOXYGEN_EXECUTABLE} COMMAND ${DOXYGEN_EXECUTABLE}
DEPENDS Doxyfile include/graphene/wallet/wallet.hpp ) DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile include/graphene/wallet/wallet.hpp )
add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/api_documentation.cpp add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/api_documentation.cpp
COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generate_api_documentation.pl ${CMAKE_CURRENT_BINARY_DIR}/api_documentation.cpp.new COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generate_api_documentation.pl ${CMAKE_CURRENT_BINARY_DIR}/api_documentation.cpp.new
@ -37,3 +37,4 @@ install( TARGETS
LIBRARY DESTINATION lib LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib ARCHIVE DESTINATION lib
) )
install( FILES ${HEADERS} DESTINATION "include/graphene/wallet" )

View file

@ -195,15 +195,15 @@ void database_fixture::verify_asset_supplies( const database& db )
} }
for( const asset_object& asset_obj : db.get_index_type<asset_index>().indices() ) for( const asset_object& asset_obj : db.get_index_type<asset_index>().indices() )
{ {
total_balances[asset_obj.id] += asset_obj.dynamic_asset_data_id(db).accumulated_fees; const auto& dasset_obj = asset_obj.dynamic_asset_data_id(db);
if( asset_obj.id != asset_id_type() ) total_balances[asset_obj.id] += dasset_obj.accumulated_fees;
BOOST_CHECK_EQUAL(total_balances[asset_obj.id].value, asset_obj.dynamic_asset_data_id(db).current_supply.value); total_balances[asset_id_type()] += dasset_obj.fee_pool;
total_balances[asset_id_type()] += asset_obj.dynamic_asset_data_id(db).fee_pool;
if( asset_obj.is_market_issued() ) if( asset_obj.is_market_issued() )
{ {
const auto& bad = asset_obj.bitasset_data(db); const auto& bad = asset_obj.bitasset_data(db);
total_balances[bad.options.short_backing_asset] += bad.settlement_fund; total_balances[bad.options.short_backing_asset] += bad.settlement_fund;
} }
total_balances[asset_obj.id] += dasset_obj.confidential_supply.value;
} }
for( const vesting_balance_object& vbo : db.get_index_type< vesting_balance_index >().indices() ) for( const vesting_balance_object& vbo : db.get_index_type< vesting_balance_index >().indices() )
total_balances[ vbo.balance.asset_id ] += vbo.balance.amount; total_balances[ vbo.balance.asset_id ] += vbo.balance.amount;
@ -229,8 +229,12 @@ void database_fixture::verify_asset_supplies( const database& db )
BOOST_CHECK_EQUAL(item.first(db).dynamic_asset_data_id(db).current_supply.value, item.second.value); BOOST_CHECK_EQUAL(item.first(db).dynamic_asset_data_id(db).current_supply.value, item.second.value);
} }
for( const asset_object& asset_obj : db.get_index_type<asset_index>().indices() )
{
BOOST_CHECK_EQUAL(total_balances[asset_obj.id].value, asset_obj.dynamic_asset_data_id(db).current_supply.value);
}
BOOST_CHECK_EQUAL( core_in_orders.value , reported_core_in_orders.value ); BOOST_CHECK_EQUAL( core_in_orders.value , reported_core_in_orders.value );
BOOST_CHECK_EQUAL( total_balances[asset_id_type()].value , core_asset_data.current_supply.value - core_asset_data.confidential_supply.value);
// wlog("*** End asset supply verification ***"); // wlog("*** End asset supply verification ***");
} }

View file

@ -1337,6 +1337,79 @@ BOOST_AUTO_TEST_CASE(zero_second_vbo)
} FC_LOG_AND_RETHROW() } FC_LOG_AND_RETHROW()
} }
BOOST_AUTO_TEST_CASE( vbo_withdraw_different )
{
try
{
ACTORS((alice)(izzy));
// don't pay witnesses so we have some worker budget to work with
// transfer(account_id_type(), alice_id, asset(1000));
asset_id_type stuff_id = create_user_issued_asset( "STUFF", izzy_id(db), 0 ).id;
issue_uia( alice_id, asset( 1000, stuff_id ) );
// deposit STUFF with linear vesting policy
vesting_balance_id_type vbid;
{
linear_vesting_policy_initializer pinit;
pinit.begin_timestamp = db.head_block_time();
pinit.vesting_cliff_seconds = 30;
pinit.vesting_duration_seconds = 30;
vesting_balance_create_operation create_op;
create_op.creator = alice_id;
create_op.owner = alice_id;
create_op.amount = asset(100, stuff_id);
create_op.policy = pinit;
signed_transaction create_tx;
create_tx.operations.push_back( create_op );
set_expiration( db, create_tx );
sign(create_tx, alice_private_key);
processed_transaction ptx = PUSH_TX( db, create_tx );
vbid = ptx.operation_results[0].get<object_id_type>();
}
// wait for VB to mature
generate_blocks( 30 );
BOOST_CHECK( vbid(db).get_allowed_withdraw( db.head_block_time() ) == asset(100, stuff_id) );
// bad withdrawal op (wrong asset)
{
vesting_balance_withdraw_operation op;
op.vesting_balance = vbid;
op.amount = asset(100);
op.owner = alice_id;
signed_transaction withdraw_tx;
withdraw_tx.operations.push_back(op);
set_expiration( db, withdraw_tx );
sign( withdraw_tx, alice_private_key );
GRAPHENE_CHECK_THROW( PUSH_TX( db, withdraw_tx ), fc::exception );
}
// good withdrawal op
{
vesting_balance_withdraw_operation op;
op.vesting_balance = vbid;
op.amount = asset(100, stuff_id);
op.owner = alice_id;
signed_transaction withdraw_tx;
withdraw_tx.operations.push_back(op);
set_expiration( db, withdraw_tx );
sign( withdraw_tx, alice_private_key );
PUSH_TX( db, withdraw_tx );
}
}
FC_LOG_AND_RETHROW()
}
// TODO: Write linear VBO tests // TODO: Write linear VBO tests
BOOST_AUTO_TEST_CASE( top_n_special ) BOOST_AUTO_TEST_CASE( top_n_special )

View file

@ -122,4 +122,30 @@ BOOST_AUTO_TEST_CASE( extended_public_key_type_test )
} }
} }
BOOST_AUTO_TEST_CASE( extension_serialization_test )
{
try
{
buyback_account_options bbo;
bbo.asset_to_buy = asset_id_type(1000);
bbo.asset_to_buy_issuer = account_id_type(2000);
bbo.markets.emplace( asset_id_type() );
bbo.markets.emplace( asset_id_type(777) );
account_create_operation create_op = make_account( "rex" );
create_op.registrar = account_id_type(1234);
create_op.extensions.value.buyback_options = bbo;
auto packed = fc::raw::pack( create_op );
account_create_operation unpacked = fc::raw::unpack<account_create_operation>(packed);
ilog( "original: ${x}", ("x", create_op) );
ilog( "unpacked: ${x}", ("x", unpacked) );
}
catch ( const fc::exception& e )
{
edump((e.to_detail_string()));
throw;
}
}
BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()