Progress on #144

This commit is contained in:
Daniel Larimer 2015-07-09 11:40:37 -04:00
parent c8f200868c
commit 9699be84e6
11 changed files with 44 additions and 19 deletions

View file

@ -38,6 +38,11 @@ asset database::get_balance(const account_object& owner, const asset_object& ass
return get_balance(owner.get_id(), asset_obj.get_id());
}
string database::to_pretty_string( const asset& a )const
{
return a.asset_id(*this).amount_to_pretty_string(a.amount);
}
void database::adjust_balance(account_id_type account, asset delta )
{ try {
if( delta.amount == 0 )
@ -54,7 +59,8 @@ void database::adjust_balance(account_id_type account, asset delta )
b.balance = delta.amount.value;
});
} else {
FC_ASSERT(delta.amount > 0 || itr->get_balance() >= -delta);
if( delta.amount < 0 )
FC_ASSERT( itr->get_balance() >= -delta, "Insufficient Balance: ${b} is less than required ${r}", ("b",to_pretty_string(itr->get_balance()))("r",to_pretty_string(-delta)));
modify(*itr, [delta](account_balance_object& b) {
b.adjust_balance(delta);
});

View file

@ -172,6 +172,8 @@ namespace graphene { namespace chain {
void set_applied_operation_result( uint32_t op_id, const operation_result& r );
const vector<operation_history_object>& get_applied_operations()const;
string to_pretty_string( const asset& a )const;
/**
* This signal is emitted after all operations and virtual operation for a
* block have been applied but before the get_applied_operations() are cleared.

View file

@ -46,7 +46,7 @@ namespace graphene { namespace chain {
* @note must be sorted by fee_parameters.which() and have no duplicates
*/
flat_set<fee_parameters> parameters;
uint32_t scale; ///< fee * scale / GRAPHENE_100_PERCENT
uint32_t scale = GRAPHENE_100_PERCENT; ///< fee * scale / GRAPHENE_100_PERCENT
};
typedef fee_schedule fee_schedule_type;

View file

@ -125,7 +125,8 @@ share_type account_create_operation::calculate_fee( const fee_parameters_type& k
core_fee_required = k.premium_fee;
// Authorities and vote lists can be arbitrarily large, so charge a data fee for big ones
core_fee_required += calculate_data_fee( fc::raw::pack_size(*this), k.price_per_kbyte );
auto data_fee = calculate_data_fee( fc::raw::pack_size(*this), k.price_per_kbyte );
core_fee_required += data_fee;
return core_fee_required;
}

View file

@ -81,6 +81,7 @@ namespace graphene { namespace chain {
*this = get_default();
for( fee_parameters& i : parameters )
i.visit( zero_fee_visitor() );
this->scale = 0;
}
asset fee_schedule::calculate_fee( const operation& op, const price& core_exchange_rate )const
@ -89,7 +90,6 @@ namespace graphene { namespace chain {
fee_parameters params; params.set_which(op.which());
auto itr = parameters.find(params);
if( itr != parameters.end() ) params = *itr;
//idump( (params) );
auto base_value = op.visit( calc_fee_visitor( params ) );
auto scaled = fc::uint128(base_value) * scale;
scaled /= GRAPHENE_100_PERCENT;

View file

@ -189,7 +189,7 @@ void operation_get_required_authorities( const operation& op,
flat_set<account_id_type>& owner,
vector<authority>& other )
{
op.visit( operation_get_required_auth( active, owner, other ) );
}
} } // namespace graphene::chain

View file

@ -54,7 +54,6 @@ namespace graphene { namespace chain {
bool transaction_evaluation_state::check_authority( const authority& au, authority::classification auth_class, int depth )
{ try {
if( (!_is_proposed_trx) && (_db->get_node_properties().skip_flags & database::skip_authority_check) )
return true;
if( (!_is_proposed_trx) && (_db->get_node_properties().skip_flags & database::skip_transaction_signatures) )

View file

@ -329,7 +329,7 @@ BOOST_AUTO_TEST_CASE( proposed_single_account )
active_set.clear();
other.clear();
operation_get_required_authorities(op,active_set,owner_set,other);
operation_get_required_authorities(op.proposed_ops.front().op,active_set,owner_set,other);
BOOST_CHECK_EQUAL(active_set.size(), 1);
BOOST_CHECK_EQUAL(owner_set.size(), 0);
BOOST_CHECK_EQUAL(other.size(), 0);
@ -351,6 +351,7 @@ BOOST_AUTO_TEST_CASE( proposed_single_account )
proposal_update_operation pup;
pup.proposal = proposal.id;
pup.fee_paying_account = nathan.id;
pup.active_approvals_to_add.insert(nathan.id);
trx.operations = {pup};

View file

@ -26,8 +26,11 @@ using namespace graphene::chain;
BOOST_FIXTURE_TEST_SUITE( fee_tests, database_fixture )
#define CORE uint64_t(GRAPHENE_BLOCKCHAIN_PRECISION)
BOOST_AUTO_TEST_CASE( cashback_test )
{ try {
wlog("");
/* Account Structure used in this test *
* *
* /-----------------\ /-------------------\ *
@ -56,8 +59,8 @@ BOOST_AUTO_TEST_CASE( cashback_test )
PREP_ACTOR(dumy);
PREP_ACTOR(stud);
PREP_ACTOR(pleb);
transfer(account_id_type(), life_id, asset(100000000));
transfer(account_id_type(), reggie_id, asset(100000000));
transfer(account_id_type(), life_id, asset(500000*CORE));
transfer(account_id_type(), reggie_id, asset(500000*CORE));
upgrade_to_lifetime_member(life_id);
upgrade_to_lifetime_member(reggie_id);
enable_fees();
@ -75,6 +78,7 @@ BOOST_AUTO_TEST_CASE( cashback_test )
op.active = authority(1, public_key_type(actor_name ## _private_key.get_public_key()), 1); \
op.owner = op.active; \
op.fee = fees->calculate_fee(op); \
idump((op.fee)); \
trx.operations = {op}; \
trx.sign( registrar_name ## _private_key); \
actor_name ## _id = PUSH_TX( db, trx ).operation_results.front().get<object_id_type>(); \
@ -83,13 +87,13 @@ BOOST_AUTO_TEST_CASE( cashback_test )
CustomRegisterActor(ann, life, life, 75);
transfer(life_id, ann_id, asset(1000000));
transfer(life_id, ann_id, asset(3000*CORE));
upgrade_to_annual_member(ann_id);
CustomRegisterActor(dumy, reggie, life, 75);
CustomRegisterActor(stud, reggie, ann, 80);
transfer(life_id, stud_id, asset(1000000));
transfer(life_id, stud_id, asset(20000*CORE));
upgrade_to_lifetime_member(stud_id);
CustomRegisterActor(pleb, reggie, stud, 95);
@ -103,10 +107,10 @@ BOOST_AUTO_TEST_CASE( cashback_test )
BOOST_CHECK_EQUAL(ann_id(db).cashback_balance(db).balance.amount.value, 40000);
BOOST_CHECK_EQUAL(stud_id(db).cashback_balance(db).balance.amount.value, 8000);
transfer(stud_id, scud_id, asset(500000));
transfer(scud_id, pleb_id, asset(400000));
transfer(pleb_id, dumy_id, asset(300000));
transfer(dumy_id, reggie_id, asset(200000));
transfer(stud_id, scud_id, asset(5*CORE));
transfer(scud_id, pleb_id, asset(4*CORE));
transfer(pleb_id, dumy_id, asset(3*CORE));
transfer(dumy_id, reggie_id, asset(2*CORE));
generate_blocks(db.get_dynamic_global_properties().next_maintenance_time);

View file

@ -1128,10 +1128,10 @@ BOOST_AUTO_TEST_CASE( witness_withdraw_pay_test )
) >> GRAPHENE_CORE_ASSET_CYCLE_RATE_BITS
;
// change this if ref_budget changes
BOOST_CHECK_EQUAL( ref_budget, 624 );
BOOST_CHECK_EQUAL( ref_budget, 594 );
const uint64_t witness_ppb = ref_budget * 10 / 23 + 1;
// change this if ref_budget changes
BOOST_CHECK_EQUAL( witness_ppb, 272 );
BOOST_CHECK_EQUAL( witness_ppb, 259 );
// following two inequalities need to hold for maximal code coverage
BOOST_CHECK_LT( witness_ppb * 2, ref_budget );
BOOST_CHECK_GT( witness_ppb * 3, ref_budget );

View file

@ -179,6 +179,7 @@ BOOST_AUTO_TEST_CASE( transfer_whitelist_uia )
upgrade_to_lifetime_member(dan);
trx.clear();
BOOST_TEST_MESSAGE( "Atempting to transfer asset ADVANCED from nathan to dan when dan is not whitelisted, should fail" );
transfer_operation op;
op.fee = advanced.amount(0);
op.from = nathan.id;
@ -188,39 +189,48 @@ BOOST_AUTO_TEST_CASE( transfer_whitelist_uia )
//Fail because dan is not whitelisted.
GRAPHENE_REQUIRE_THROW(PUSH_TX( db, trx, ~0 ), transfer_to_account_not_whitelisted );
BOOST_TEST_MESSAGE( "Adding dan to whitelist for asset ADVANCED" );
account_whitelist_operation wop;
wop.authorizing_account = account_id_type();
wop.account_to_list = dan.id;
wop.new_listing = account_whitelist_operation::white_listed;
trx.operations.back() = wop;
PUSH_TX( db, trx, ~0 );
BOOST_TEST_MESSAGE( "Attempting to trnsfer from nathan to dan after whitelisting dan, should succeed" );
trx.operations.back() = op;
PUSH_TX( db, trx, ~0 );
BOOST_CHECK_EQUAL(get_balance(nathan, advanced), 900);
BOOST_CHECK_EQUAL(get_balance(dan, advanced), 100);
BOOST_TEST_MESSAGE( "Attempting to blacklist nathan" );
wop.new_listing |= account_whitelist_operation::black_listed;
wop.account_to_list = nathan.id;
trx.operations.back() = wop;
PUSH_TX( db, trx, ~0 );
BOOST_TEST_MESSAGE( "Attempting to transfer from nathan after blacklisting, should fail" );
op.amount = advanced.amount(50);
trx.operations.back() = op;
//Fail because nathan is blacklisted
GRAPHENE_REQUIRE_THROW(PUSH_TX( db, trx, ~0 ), transfer_from_account_not_whitelisted );
BOOST_TEST_MESSAGE( "Attempting to burn from nathan after blacklisting, should fail" );
asset_reserve_operation burn;
burn.payer = nathan.id;
burn.amount_to_reserve = advanced.amount(10);
trx.operations.emplace_back(burn);
trx.operations.back() = burn;
//Fail because nathan is blacklisted
GRAPHENE_REQUIRE_THROW(PUSH_TX( db, trx, ~0 ), fc::exception);
BOOST_TEST_MESSAGE( "Attempting transfer from dan back to nathan, should fail because nathan is blacklisted" );
std::swap(op.from, op.to);
trx.operations.back() = op;
//Fail because nathan is blacklisted
GRAPHENE_REQUIRE_THROW(PUSH_TX( db, trx, ~0 ), fc::exception);
{
BOOST_TEST_MESSAGE( "Changing the blacklist authority to dan" );
asset_update_operation op;
op.asset_to_update = advanced.id;
op.new_options = advanced.options;
@ -231,11 +241,13 @@ BOOST_AUTO_TEST_CASE( transfer_whitelist_uia )
BOOST_CHECK(advanced.options.blacklist_authorities.find(dan.id) != advanced.options.blacklist_authorities.end());
}
BOOST_TEST_MESSAGE( "Attempting to transfer from dan back to nathan" );
trx.operations.back() = op;
PUSH_TX( db, trx, ~0 );
BOOST_CHECK_EQUAL(get_balance(nathan, advanced), 950);
BOOST_CHECK_EQUAL(get_balance(dan, advanced), 50);
BOOST_TEST_MESSAGE( "Blacklisting nathan by dan" );
wop.authorizing_account = dan.id;
wop.account_to_list = nathan.id;
wop.new_listing = account_whitelist_operation::black_listed;
@ -266,7 +278,7 @@ BOOST_AUTO_TEST_CASE( transfer_whitelist_uia )
burn.payer = dan.id;
burn.amount_to_reserve = advanced.amount(10);
trx.operations.emplace_back(burn);
trx.operations.back() = burn;
PUSH_TX(db, trx, ~0);
BOOST_CHECK_EQUAL(get_balance(dan, advanced), 40);
} catch(fc::exception& e) {