Skip to content

Commit

Permalink
Better rounding: settling against global fund #342
Browse files Browse the repository at this point in the history
  • Loading branch information
abitmore committed Apr 3, 2018
1 parent 5413461 commit 695b1b4
Showing 1 changed file with 21 additions and 8 deletions.
29 changes: 21 additions & 8 deletions libraries/chain/asset_evaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -508,14 +508,13 @@ void_result asset_settle_evaluator::do_evaluate(const asset_settle_evaluator::op
operation_result asset_settle_evaluator::do_apply(const asset_settle_evaluator::operation_type& op)
{ try {
database& d = db();
d.adjust_balance(op.account, -op.amount);

const auto& bitasset = asset_to_settle->bitasset_data(d);
if( bitasset.has_settlement() )
{
const auto& mia_dyn = asset_to_settle->dynamic_asset_data_id(d);

auto settled_amount = op.amount * bitasset.settlement_price;
auto settled_amount = op.amount * bitasset.settlement_price; // round down, in favor of global settlement fund
if( op.amount.amount == mia_dyn.current_supply )
settled_amount.amount = bitasset.settlement_fund; // avoid rounding problems
else
Expand All @@ -529,20 +528,34 @@ operation_result asset_settle_evaluator::do_apply(const asset_settle_evaluator::
wlog( "Something for nothing issue (#184, variant F) occurred at block #${block}", ("block",d.head_block_num()) );
}

d.modify( bitasset, [&]( asset_bitasset_data_object& obj ){
obj.settlement_fund -= settled_amount.amount;
});
asset pays = op.amount;
if( op.amount.amount != mia_dyn.current_supply
&& settled_amount.amount != 0
&& d.get_dynamic_global_properties().next_maintenance_time > HARDFORK_CORE_342_TIME )
{
pays = settled_amount ^ bitasset.settlement_price;
}

d.adjust_balance(op.account, settled_amount);
d.adjust_balance( op.account, -pays );

if( settled_amount.amount > 0 )
{
d.modify( bitasset, [&]( asset_bitasset_data_object& obj ){
obj.settlement_fund -= settled_amount.amount;
});

d.adjust_balance( op.account, settled_amount );
}

d.modify( mia_dyn, [&]( asset_dynamic_data_object& obj ){
obj.current_supply -= op.amount.amount;
});
obj.current_supply -= pays.amount;
});

return settled_amount;
}
else
{
d.adjust_balance( op.account, -op.amount );
return d.create<force_settlement_object>([&](force_settlement_object& s) {
s.owner = op.account;
s.balance = op.amount;
Expand Down

0 comments on commit 695b1b4

Please sign in to comment.