2015-06-08 15:50:35 +00:00
|
|
|
/*
|
2015-10-12 17:48:40 +00:00
|
|
|
* Copyright (c) 2015 Cryptonomex, Inc., and contributors.
|
|
|
|
|
*
|
2016-01-06 09:51:18 +00:00
|
|
|
* The MIT License
|
2015-10-12 17:48:40 +00:00
|
|
|
*
|
2016-01-06 09:51:18 +00:00
|
|
|
* 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:
|
2015-10-12 17:48:40 +00:00
|
|
|
*
|
2016-01-06 09:51:18 +00:00
|
|
|
* The above copyright notice and this permission notice shall be included in
|
|
|
|
|
* all copies or substantial portions of the Software.
|
2015-10-12 17:02:59 +00:00
|
|
|
*
|
2016-01-06 09:51:18 +00:00
|
|
|
* 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.
|
2015-06-08 15:50:35 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <graphene/chain/database.hpp>
|
|
|
|
|
|
|
|
|
|
#include <graphene/chain/account_object.hpp>
|
|
|
|
|
#include <graphene/chain/asset_object.hpp>
|
2015-11-05 22:12:57 +00:00
|
|
|
#include <graphene/chain/hardfork.hpp>
|
2016-01-08 15:37:22 +00:00
|
|
|
#include <graphene/chain/market_object.hpp>
|
2015-06-08 15:50:35 +00:00
|
|
|
|
|
|
|
|
#include <fc/uint128.hpp>
|
|
|
|
|
|
|
|
|
|
namespace graphene { namespace chain {
|
|
|
|
|
|
|
|
|
|
/**
|
2015-06-19 13:57:23 +00:00
|
|
|
* All margin positions are force closed at the swan price
|
|
|
|
|
* Collateral received goes into a force-settlement fund
|
|
|
|
|
* No new margin positions can be created for this asset
|
|
|
|
|
* No more price feed updates
|
|
|
|
|
* Force settlement happens without delay at the swan price, deducting from force-settlement fund
|
|
|
|
|
* No more asset updates may be issued.
|
2015-06-08 15:50:35 +00:00
|
|
|
*/
|
|
|
|
|
void database::globally_settle_asset( const asset_object& mia, const price& settlement_price )
|
|
|
|
|
{ try {
|
2015-06-19 18:47:42 +00:00
|
|
|
/*
|
2015-06-08 15:50:35 +00:00
|
|
|
elog( "BLACK SWAN!" );
|
|
|
|
|
debug_dump();
|
|
|
|
|
edump( (mia.symbol)(settlement_price) );
|
2015-06-19 18:47:42 +00:00
|
|
|
*/
|
2015-06-08 15:50:35 +00:00
|
|
|
|
|
|
|
|
const asset_bitasset_data_object& bitasset = mia.bitasset_data(*this);
|
2015-06-19 13:57:23 +00:00
|
|
|
FC_ASSERT( !bitasset.has_settlement(), "black swan already occurred, it should not happen again" );
|
|
|
|
|
|
2015-06-08 15:50:35 +00:00
|
|
|
const asset_object& backing_asset = bitasset.options.short_backing_asset(*this);
|
|
|
|
|
asset collateral_gathered = backing_asset.amount(0);
|
|
|
|
|
|
|
|
|
|
const asset_dynamic_data_object& mia_dyn = mia.dynamic_asset_data_id(*this);
|
|
|
|
|
auto original_mia_supply = mia_dyn.current_supply;
|
|
|
|
|
|
|
|
|
|
const call_order_index& call_index = get_index_type<call_order_index>();
|
|
|
|
|
const auto& call_price_index = call_index.indices().get<by_price>();
|
|
|
|
|
|
2015-06-19 13:57:23 +00:00
|
|
|
// cancel all call orders and accumulate it into collateral_gathered
|
|
|
|
|
auto call_itr = call_price_index.lower_bound( price::min( bitasset.options.short_backing_asset, mia.id ) );
|
|
|
|
|
auto call_end = call_price_index.upper_bound( price::max( bitasset.options.short_backing_asset, mia.id ) );
|
|
|
|
|
while( call_itr != call_end )
|
2015-06-08 15:50:35 +00:00
|
|
|
{
|
2015-06-19 13:57:23 +00:00
|
|
|
auto pays = call_itr->get_debt() * settlement_price;
|
2015-07-03 21:07:24 +00:00
|
|
|
|
|
|
|
|
if( pays > call_itr->get_collateral() )
|
|
|
|
|
pays = call_itr->get_collateral();
|
|
|
|
|
|
2015-06-19 13:57:23 +00:00
|
|
|
collateral_gathered += pays;
|
|
|
|
|
const auto& order = *call_itr;
|
|
|
|
|
++call_itr;
|
|
|
|
|
FC_ASSERT( fill_order( order, pays, order.get_debt() ) );
|
2015-06-08 15:50:35 +00:00
|
|
|
}
|
|
|
|
|
|
2015-06-19 13:57:23 +00:00
|
|
|
modify( bitasset, [&]( asset_bitasset_data_object& obj ){
|
2015-07-03 21:07:24 +00:00
|
|
|
assert( collateral_gathered.asset_id == settlement_price.quote.asset_id );
|
|
|
|
|
obj.settlement_price = mia.amount(original_mia_supply) / collateral_gathered; //settlement_price;
|
2015-06-19 13:57:23 +00:00
|
|
|
obj.settlement_fund = collateral_gathered.amount;
|
|
|
|
|
});
|
|
|
|
|
|
2015-06-19 18:47:42 +00:00
|
|
|
/// After all margin positions are closed, the current supply will be reported as 0, but
|
2015-06-19 13:57:23 +00:00
|
|
|
/// that is a lie, the supply didn't change. We need to capture the current supply before
|
|
|
|
|
/// filling all call orders and then restore it afterward. Then in the force settlement
|
|
|
|
|
/// evaluator reduce the supply
|
2015-06-19 18:47:42 +00:00
|
|
|
modify( mia_dyn, [&]( asset_dynamic_data_object& obj ){
|
|
|
|
|
obj.current_supply = original_mia_supply;
|
|
|
|
|
});
|
2015-06-19 13:57:23 +00:00
|
|
|
|
|
|
|
|
} FC_CAPTURE_AND_RETHROW( (mia)(settlement_price) ) }
|
2015-06-08 15:50:35 +00:00
|
|
|
|
|
|
|
|
void database::cancel_order(const force_settlement_object& order, bool create_virtual_op)
|
|
|
|
|
{
|
|
|
|
|
adjust_balance(order.owner, order.balance);
|
|
|
|
|
|
|
|
|
|
if( create_virtual_op )
|
|
|
|
|
{
|
2015-09-17 19:12:08 +00:00
|
|
|
asset_settle_cancel_operation vop;
|
|
|
|
|
vop.settlement = order.id;
|
|
|
|
|
vop.account = order.owner;
|
|
|
|
|
vop.amount = order.balance;
|
|
|
|
|
push_applied_operation( vop );
|
2015-06-08 15:50:35 +00:00
|
|
|
}
|
2015-10-09 15:42:56 +00:00
|
|
|
remove(order);
|
2015-06-08 15:50:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void database::cancel_order( const limit_order_object& order, bool create_virtual_op )
|
|
|
|
|
{
|
|
|
|
|
auto refunded = order.amount_for_sale();
|
|
|
|
|
|
|
|
|
|
modify( order.seller(*this).statistics(*this),[&]( account_statistics_object& obj ){
|
|
|
|
|
if( refunded.asset_id == asset_id_type() )
|
2015-09-30 22:30:44 +00:00
|
|
|
{
|
2015-06-08 15:50:35 +00:00
|
|
|
obj.total_core_in_orders -= refunded.amount;
|
2015-09-30 22:30:44 +00:00
|
|
|
}
|
2015-06-08 15:50:35 +00:00
|
|
|
});
|
|
|
|
|
adjust_balance(order.seller, refunded);
|
2015-12-03 20:48:52 +00:00
|
|
|
adjust_balance(order.seller, order.deferred_fee);
|
2015-06-08 15:50:35 +00:00
|
|
|
|
|
|
|
|
if( create_virtual_op )
|
|
|
|
|
{
|
2015-09-17 19:12:08 +00:00
|
|
|
limit_order_cancel_operation vop;
|
|
|
|
|
vop.order = order.id;
|
|
|
|
|
vop.fee_paying_account = order.seller;
|
|
|
|
|
push_applied_operation( vop );
|
2015-06-08 15:50:35 +00:00
|
|
|
}
|
|
|
|
|
|
2015-06-26 19:11:41 +00:00
|
|
|
remove(order);
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-05 22:29:13 +00:00
|
|
|
bool maybe_cull_small_order( database& db, const limit_order_object& order )
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* There are times when the AMOUNT_FOR_SALE * SALE_PRICE == 0 which means that we
|
|
|
|
|
* have hit the limit where the seller is asking for nothing in return. When this
|
|
|
|
|
* happens we must refund any balance back to the seller, it is too small to be
|
|
|
|
|
* sold at the sale price.
|
|
|
|
|
*
|
|
|
|
|
* If the order is a taker order (as opposed to a maker order), so the price is
|
|
|
|
|
* set by the counterparty, this check is deferred until the order becomes unmatched
|
|
|
|
|
* (see #555) -- however, detecting this condition is the responsibility of the caller.
|
|
|
|
|
*/
|
|
|
|
|
if( order.amount_to_receive().amount == 0 )
|
|
|
|
|
{
|
2016-11-16 22:24:12 +00:00
|
|
|
//ilog( "applied epsilon logic" );
|
2016-02-05 22:29:13 +00:00
|
|
|
db.cancel_order(order);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-26 19:11:41 +00:00
|
|
|
bool database::apply_order(const limit_order_object& new_order_object, bool allow_black_swan)
|
|
|
|
|
{
|
|
|
|
|
auto order_id = new_order_object.id;
|
|
|
|
|
const asset_object& sell_asset = get(new_order_object.amount_for_sale().asset_id);
|
|
|
|
|
const asset_object& receive_asset = get(new_order_object.amount_to_receive().asset_id);
|
|
|
|
|
|
|
|
|
|
// Possible optimization: We only need to check calls if both are true:
|
|
|
|
|
// - The new order is at the front of the book
|
|
|
|
|
// - The new order is below the call limit price
|
|
|
|
|
bool called_some = check_call_orders(sell_asset, allow_black_swan);
|
|
|
|
|
called_some |= check_call_orders(receive_asset, allow_black_swan);
|
|
|
|
|
if( called_some && !find_object(order_id) ) // then we were filled by call order
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
const auto& limit_price_idx = get_index_type<limit_order_index>().indices().get<by_price>();
|
|
|
|
|
|
|
|
|
|
// TODO: it should be possible to simply check the NEXT/PREV iterator after new_order_object to
|
|
|
|
|
// determine whether or not this order has "changed the book" in a way that requires us to
|
|
|
|
|
// check orders. For now I just lookup the lower bound and check for equality... this is log(n) vs
|
|
|
|
|
// constant time check. Potential optimization.
|
|
|
|
|
|
|
|
|
|
auto max_price = ~new_order_object.sell_price;
|
|
|
|
|
auto limit_itr = limit_price_idx.lower_bound(max_price.max());
|
|
|
|
|
auto limit_end = limit_price_idx.upper_bound(max_price);
|
|
|
|
|
|
|
|
|
|
bool finished = false;
|
|
|
|
|
while( !finished && limit_itr != limit_end )
|
|
|
|
|
{
|
|
|
|
|
auto old_limit_itr = limit_itr;
|
|
|
|
|
++limit_itr;
|
|
|
|
|
// match returns 2 when only the old order was fully filled. In this case, we keep matching; otherwise, we stop.
|
|
|
|
|
finished = (match(new_order_object, *old_limit_itr, old_limit_itr->sell_price) != 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Possible optimization: only check calls if the new order completely filled some old order
|
|
|
|
|
//Do I need to check both assets?
|
|
|
|
|
check_call_orders(sell_asset, allow_black_swan);
|
|
|
|
|
check_call_orders(receive_asset, allow_black_swan);
|
|
|
|
|
|
2016-02-05 22:29:13 +00:00
|
|
|
const limit_order_object* updated_order_object = find< limit_order_object >( order_id );
|
|
|
|
|
if( updated_order_object == nullptr )
|
|
|
|
|
return true;
|
|
|
|
|
if( head_block_time() <= HARDFORK_555_TIME )
|
|
|
|
|
return false;
|
|
|
|
|
// before #555 we would have done maybe_cull_small_order() logic as a result of fill_order() being called by match() above
|
|
|
|
|
// however after #555 we need to get rid of small orders -- #555 hardfork defers logic that was done too eagerly before, and
|
|
|
|
|
// this is the point it's deferred to.
|
|
|
|
|
return maybe_cull_small_order( *this, *updated_order_object );
|
2015-06-08 15:50:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Matches the two orders,
|
|
|
|
|
*
|
|
|
|
|
* @return a bit field indicating which orders were filled (and thus removed)
|
|
|
|
|
*
|
|
|
|
|
* 0 - no orders were matched
|
|
|
|
|
* 1 - bid was filled
|
|
|
|
|
* 2 - ask was filled
|
|
|
|
|
* 3 - both were filled
|
|
|
|
|
*/
|
|
|
|
|
template<typename OrderType>
|
|
|
|
|
int database::match( const limit_order_object& usd, const OrderType& core, const price& match_price )
|
|
|
|
|
{
|
|
|
|
|
assert( usd.sell_price.quote.asset_id == core.sell_price.base.asset_id );
|
|
|
|
|
assert( usd.sell_price.base.asset_id == core.sell_price.quote.asset_id );
|
|
|
|
|
assert( usd.for_sale > 0 && core.for_sale > 0 );
|
|
|
|
|
|
|
|
|
|
auto usd_for_sale = usd.amount_for_sale();
|
|
|
|
|
auto core_for_sale = core.amount_for_sale();
|
|
|
|
|
|
|
|
|
|
asset usd_pays, usd_receives, core_pays, core_receives;
|
|
|
|
|
|
|
|
|
|
if( usd_for_sale <= core_for_sale * match_price )
|
|
|
|
|
{
|
|
|
|
|
core_receives = usd_for_sale;
|
|
|
|
|
usd_receives = usd_for_sale * match_price;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
//This line once read: assert( core_for_sale < usd_for_sale * match_price );
|
|
|
|
|
//This assert is not always true -- see trade_amount_equals_zero in operation_tests.cpp
|
|
|
|
|
//Although usd_for_sale is greater than core_for_sale * match_price, core_for_sale == usd_for_sale * match_price
|
|
|
|
|
//Removing the assert seems to be safe -- apparently no asset is created or destroyed.
|
|
|
|
|
usd_receives = core_for_sale;
|
|
|
|
|
core_receives = core_for_sale * match_price;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
core_pays = usd_receives;
|
|
|
|
|
usd_pays = core_receives;
|
|
|
|
|
|
|
|
|
|
assert( usd_pays == usd.amount_for_sale() ||
|
|
|
|
|
core_pays == core.amount_for_sale() );
|
|
|
|
|
|
|
|
|
|
int result = 0;
|
2016-02-05 22:29:13 +00:00
|
|
|
result |= fill_order( usd, usd_pays, usd_receives, false );
|
|
|
|
|
result |= fill_order( core, core_pays, core_receives, true ) << 1;
|
2015-06-08 15:50:35 +00:00
|
|
|
assert( result != 0 );
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int database::match( const limit_order_object& bid, const limit_order_object& ask, const price& match_price )
|
|
|
|
|
{
|
|
|
|
|
return match<limit_order_object>( bid, ask, match_price );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2015-09-30 22:30:44 +00:00
|
|
|
asset database::match( const call_order_object& call,
|
|
|
|
|
const force_settlement_object& settle,
|
|
|
|
|
const price& match_price,
|
|
|
|
|
asset max_settlement )
|
|
|
|
|
{ try {
|
|
|
|
|
FC_ASSERT(call.get_debt().asset_id == settle.balance.asset_id );
|
|
|
|
|
FC_ASSERT(call.debt > 0 && call.collateral > 0 && settle.balance.amount > 0);
|
2015-06-08 15:50:35 +00:00
|
|
|
|
|
|
|
|
auto settle_for_sale = std::min(settle.balance, max_settlement);
|
|
|
|
|
auto call_debt = call.get_debt();
|
|
|
|
|
|
2015-09-30 22:30:44 +00:00
|
|
|
asset call_receives = std::min(settle_for_sale, call_debt);
|
|
|
|
|
asset call_pays = call_receives * match_price;
|
|
|
|
|
asset settle_pays = call_receives;
|
|
|
|
|
asset settle_receives = call_pays;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* If the least collateralized call position lacks sufficient
|
|
|
|
|
* collateral to cover at the match price then this indicates a black
|
|
|
|
|
* swan event according to the price feed, but only the market
|
|
|
|
|
* can trigger a black swan. So now we must cancel the forced settlement
|
|
|
|
|
* object.
|
|
|
|
|
*/
|
|
|
|
|
GRAPHENE_ASSERT( call_pays < call.get_collateral(), black_swan_exception, "" );
|
2015-06-08 15:50:35 +00:00
|
|
|
|
|
|
|
|
assert( settle_pays == settle_for_sale || call_receives == call.get_debt() );
|
|
|
|
|
|
|
|
|
|
fill_order(call, call_pays, call_receives);
|
|
|
|
|
fill_order(settle, settle_pays, settle_receives);
|
|
|
|
|
|
|
|
|
|
return call_receives;
|
2015-09-30 22:30:44 +00:00
|
|
|
} FC_CAPTURE_AND_RETHROW( (call)(settle)(match_price)(max_settlement) ) }
|
2015-06-08 15:50:35 +00:00
|
|
|
|
2016-02-05 22:29:13 +00:00
|
|
|
bool database::fill_order( const limit_order_object& order, const asset& pays, const asset& receives, bool cull_if_small )
|
2015-09-30 22:30:44 +00:00
|
|
|
{ try {
|
2016-02-05 22:29:13 +00:00
|
|
|
cull_if_small |= (head_block_time() < HARDFORK_555_TIME);
|
|
|
|
|
|
2015-09-30 22:30:44 +00:00
|
|
|
FC_ASSERT( order.amount_for_sale().asset_id == pays.asset_id );
|
|
|
|
|
FC_ASSERT( pays.asset_id != receives.asset_id );
|
2015-06-08 15:50:35 +00:00
|
|
|
|
|
|
|
|
const account_object& seller = order.seller(*this);
|
|
|
|
|
const asset_object& recv_asset = receives.asset_id(*this);
|
|
|
|
|
|
|
|
|
|
auto issuer_fees = pay_market_fees( recv_asset, receives );
|
|
|
|
|
pay_order( seller, receives - issuer_fees, pays );
|
|
|
|
|
|
2015-06-30 22:48:40 +00:00
|
|
|
assert( pays.asset_id != receives.asset_id );
|
2015-07-08 20:39:23 +00:00
|
|
|
push_applied_operation( fill_order_operation( order.id, order.seller, pays, receives, issuer_fees ) );
|
2015-06-08 15:50:35 +00:00
|
|
|
|
2015-12-03 20:48:52 +00:00
|
|
|
// conditional because cheap integer comparison may allow us to avoid two expensive modify() and object lookups
|
|
|
|
|
if( order.deferred_fee > 0 )
|
|
|
|
|
{
|
|
|
|
|
modify( seller.statistics(*this), [&]( account_statistics_object& statistics )
|
|
|
|
|
{
|
|
|
|
|
statistics.pay_fee( order.deferred_fee, get_global_properties().parameters.cashback_vesting_threshold );
|
|
|
|
|
} );
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-08 15:50:35 +00:00
|
|
|
if( pays == order.amount_for_sale() )
|
|
|
|
|
{
|
|
|
|
|
remove( order );
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
modify( order, [&]( limit_order_object& b ) {
|
|
|
|
|
b.for_sale -= pays.amount;
|
2015-12-03 20:48:52 +00:00
|
|
|
b.deferred_fee = 0;
|
2015-06-08 15:50:35 +00:00
|
|
|
});
|
2016-02-05 22:29:13 +00:00
|
|
|
if( cull_if_small )
|
|
|
|
|
return maybe_cull_small_order( *this, order );
|
2015-06-08 15:50:35 +00:00
|
|
|
return false;
|
|
|
|
|
}
|
2015-09-30 22:30:44 +00:00
|
|
|
} FC_CAPTURE_AND_RETHROW( (order)(pays)(receives) ) }
|
2015-06-08 15:50:35 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
bool database::fill_order( const call_order_object& order, const asset& pays, const asset& receives )
|
|
|
|
|
{ try {
|
2015-06-19 13:07:23 +00:00
|
|
|
//idump((pays)(receives)(order));
|
2015-09-30 22:30:44 +00:00
|
|
|
FC_ASSERT( order.get_debt().asset_id == receives.asset_id );
|
|
|
|
|
FC_ASSERT( order.get_collateral().asset_id == pays.asset_id );
|
|
|
|
|
FC_ASSERT( order.get_collateral() >= pays );
|
2015-06-08 15:50:35 +00:00
|
|
|
|
|
|
|
|
optional<asset> collateral_freed;
|
|
|
|
|
modify( order, [&]( call_order_object& o ){
|
|
|
|
|
o.debt -= receives.amount;
|
|
|
|
|
o.collateral -= pays.amount;
|
|
|
|
|
if( o.debt == 0 )
|
|
|
|
|
{
|
|
|
|
|
collateral_freed = o.get_collateral();
|
|
|
|
|
o.collateral = 0;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
const asset_object& mia = receives.asset_id(*this);
|
|
|
|
|
assert( mia.is_market_issued() );
|
|
|
|
|
|
|
|
|
|
const asset_dynamic_data_object& mia_ddo = mia.dynamic_asset_data_id(*this);
|
|
|
|
|
|
|
|
|
|
modify( mia_ddo, [&]( asset_dynamic_data_object& ao ){
|
2015-06-19 13:07:23 +00:00
|
|
|
//idump((receives));
|
2015-06-08 15:50:35 +00:00
|
|
|
ao.current_supply -= receives.amount;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const account_object& borrower = order.borrower(*this);
|
|
|
|
|
if( collateral_freed || pays.asset_id == asset_id_type() )
|
|
|
|
|
{
|
|
|
|
|
const account_statistics_object& borrower_statistics = borrower.statistics(*this);
|
|
|
|
|
if( collateral_freed )
|
|
|
|
|
adjust_balance(borrower.get_id(), *collateral_freed);
|
2015-09-30 22:30:44 +00:00
|
|
|
|
2015-06-08 15:50:35 +00:00
|
|
|
modify( borrower_statistics, [&]( account_statistics_object& b ){
|
|
|
|
|
if( collateral_freed && collateral_freed->amount > 0 )
|
|
|
|
|
b.total_core_in_orders -= collateral_freed->amount;
|
|
|
|
|
if( pays.asset_id == asset_id_type() )
|
|
|
|
|
b.total_core_in_orders -= pays.amount;
|
2015-09-30 22:30:44 +00:00
|
|
|
|
2015-06-08 15:50:35 +00:00
|
|
|
assert( b.total_core_in_orders >= 0 );
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-30 22:48:40 +00:00
|
|
|
assert( pays.asset_id != receives.asset_id );
|
2015-06-08 15:50:35 +00:00
|
|
|
push_applied_operation( fill_order_operation{ order.id, order.borrower, pays, receives, asset(0, pays.asset_id) } );
|
|
|
|
|
|
2015-10-08 18:55:01 +00:00
|
|
|
if( collateral_freed )
|
|
|
|
|
remove( order );
|
|
|
|
|
|
2015-06-08 15:50:35 +00:00
|
|
|
return collateral_freed.valid();
|
|
|
|
|
} FC_CAPTURE_AND_RETHROW( (order)(pays)(receives) ) }
|
|
|
|
|
|
|
|
|
|
bool database::fill_order(const force_settlement_object& settle, const asset& pays, const asset& receives)
|
|
|
|
|
{ try {
|
|
|
|
|
bool filled = false;
|
|
|
|
|
|
|
|
|
|
auto issuer_fees = pay_market_fees(get(receives.asset_id), receives);
|
|
|
|
|
|
|
|
|
|
if( pays < settle.balance )
|
|
|
|
|
{
|
|
|
|
|
modify(settle, [&pays](force_settlement_object& s) {
|
|
|
|
|
s.balance -= pays;
|
|
|
|
|
});
|
|
|
|
|
filled = false;
|
|
|
|
|
} else {
|
|
|
|
|
filled = true;
|
|
|
|
|
}
|
|
|
|
|
adjust_balance(settle.owner, receives - issuer_fees);
|
|
|
|
|
|
2015-06-30 22:48:40 +00:00
|
|
|
assert( pays.asset_id != receives.asset_id );
|
2015-06-08 15:50:35 +00:00
|
|
|
push_applied_operation( fill_order_operation{ settle.id, settle.owner, pays, receives, issuer_fees } );
|
|
|
|
|
|
2015-10-09 15:42:56 +00:00
|
|
|
if (filled)
|
|
|
|
|
remove(settle);
|
|
|
|
|
|
2015-06-08 15:50:35 +00:00
|
|
|
return filled;
|
|
|
|
|
} FC_CAPTURE_AND_RETHROW( (settle)(pays)(receives) ) }
|
|
|
|
|
|
|
|
|
|
/**
|
2015-06-18 19:17:48 +00:00
|
|
|
* Starting with the least collateralized orders, fill them if their
|
2015-06-26 19:11:41 +00:00
|
|
|
* call price is above the max(lowest bid,call_limit).
|
2015-06-08 15:50:35 +00:00
|
|
|
*
|
2015-06-18 19:17:48 +00:00
|
|
|
* This method will return true if it filled a short or limit
|
2015-06-08 15:50:35 +00:00
|
|
|
*
|
2015-06-18 19:17:48 +00:00
|
|
|
* @param mia - the market issued asset that should be called.
|
|
|
|
|
* @param enable_black_swan - when adjusting collateral, triggering a black swan is invalid and will throw
|
|
|
|
|
* if enable_black_swan is not set to true.
|
|
|
|
|
*
|
|
|
|
|
* @return true if a margin call was executed.
|
2015-06-08 15:50:35 +00:00
|
|
|
*/
|
Merge beatrice(GPOS changes) with master (#270)
* Created unit test for #325
* remove needless find()
* issue - 154: Don't allow to vote when vesting balance is 0
* Increase block creation timeout to 2500ms
* increase delay for node connection
* remove cache from cli get_account
* add cli tests framework
* Adjust newly merged code to new API
* Merged changes from Bitshares PR 1036
* GRPH-76 - Short-cut long sequences of missed blocks
Fixes database::update_global_dynamic_data to speed up counting missed blocks.
(This also fixes a minor issue with counting - the previous algorithm would skip missed blocks for the witness who signed the first block after the gap.)
* Improved resilience of block database against corruption
* Moved reindex logic into database / chain_database, make use of additional blocks in block_database
Fixed tests wrt db.open
* Enable undo + fork database for final blocks in a replay
Dont remove blocks from block db when popping blocks, handle edge case in replay wrt fork_db, adapted unit tests
* Log starting block number of replay
* Prevent unsigned integer underflow
* Fixed lock detection
* Dont leave _data_dir empty if db is locked
* Writing the object_database is now almost atomic
* Improved consistency check for block_log
* Cut back block_log index file if inconsistent
* Fixed undo_database
* Added test case for broken merge on empty undo_db
* exclude second undo_db.enable() call in some cases
* Add missing change
* change bitshares to core in message
* Merge pull request #938 from bitshares/fix-block-storing
Store correct block ID when switching forks
* Fixed integer overflow issue
* Fix for for history ID mismatch ( Bitshares PR #875 )
* Update the FC submodule with the changes for GRPH-4
* Merged Bitshares PR #1462 and compilation fixes
* Support/gitlab (#123)
* Updated gitlab process
* Fix undefined references in cli test
* Updated GitLab CI
* Fix #436 object_database created outside of witness data directory
* supplement more comments on database::_opened variable
* prevent segfault when destructing application obj
* Fixed test failures and compilation issue
* minor performance improvement
* Added comment
* Fix compilation in debug mode
* Fixed duplicate ops returned from get_account_history
* Fixed account_history_pagination test
* Removed unrelated comment
* Update to fixed version of fc
* Skip auth check when pushing self-generated blocks
* Extract public keys before pushing a transaction
* Dereference chain_database shared_ptr
* Updated transaction::signees to mutable
and
* updated get_signature_keys() to return a const reference,
* get_signature_keys() will update signees on first call,
* modified test cases and wallet.cpp accordingly,
* no longer construct a new signed_transaction object before pushing
* Added get_asset_count API
* No longer extract public keys before pushing a trx
and removed unused new added constructor and _get_signature_keys() function from signed_transaction struct
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* Remove leftover comment from merge
* fix for get_vesting_balance API call
* braces update
* Allow sufficient space for new undo_session
* Throw for deep nesting
* node.cpp: Check the attacker/buggy client before updating items ids
The peer is an attacker or buggy, which means the item_hashes_received is
not correct.
Move the check before updating items ids to save some time in this case.
* Create .gitlab-ci.yml
* Added cli_test to CI
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* use random port numbers in app_test (#154)
* Changes to compiple with GCC 7(Ubuntu 18.04)
* proposal fail_reason bug fixed (#157)
* Added Sonarcloud code_quality to CI (#159)
* Added sonarcloud analysis (#158)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Support/gitlab develop (#168)
* Added code_quality to CI
* Update .gitlab-ci.yml
* Point to PBSA/peerplays-fc commit f13d063 (#167)
* [GRPH-3] Additional cli tests (#155)
* Additional cli tests
* Compatible with latest fc changes
* Fixed Spacing issues
* [GRPH-106] Added voting tests (#136)
* Added more voting tests
* Added additional option
* Adjust p2p log level (#180)
* merge gpos to develop (#186)
* issue - 154: Don't allow to vote when vesting balance is 0
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* fix for get_vesting_balance API call
* braces update
* Create .gitlab-ci.yml
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* Changes to compiple with GCC 7(Ubuntu 18.04)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Revert "Revert "GPOS protocol""
This reverts commit 67616417b7f0b5d087b9862de0e48b2d8ccc1bca.
* add new line needed to gpos hardfork file
* comment temporally cli_vote_for_2_witnesses until refactor or delete
* fix gpos tests
* fix gitlab-ci conflict
* Fixed few error messages
* error message corrections at other places
* Updated FC repository to peerplays-network/peerplays-fc (#189)
Point to fc commit hash 6096e94 [latest-fc branch]
* Project name update in Doxyfile (#146)
* changes to allow user to vote in each sub-period
* Fixed GPOS vesting factor issue when proxy is set
* Added unit test for proxy voting
* Review changes
* changes to update last voting time
* resolve merge conflict
* unit test changes and also separated GPOS test suite
* delete unused variables
* removed witness check
* eliminate time gap between two consecutive vesting periods
* deleted GPOS specific test suite and updated gpos tests
* updated GPOS hf
* Fixed dividend distribution issue and added test case
* fix flag
* clean newlines gpos_tests
* adapt gpos_tests to changed flag
* Fix to roll in GPOS rules, carry votes from 6th sub-period
* check was already modified
* comments updated
* updated comments to the benefit of reviewer
* Added token symbol name in error messages
* Added token symbol name in error messages (#204)
* case 1: Fixed last voting time issue
* get_account bug fixed
* Fixed flag issue
* Fixed spelling issue
* remove non needed gcc5 changes to dockerfile
* GRPH134- High CPU Issue, websocket changes (#213)
* update submodule branch to refer to the latest commit on latest-fc branch (#214)
* Improve account maintenance performance (#130)
* Improve account maintenance performance
* merge fixes
* Fixed merge issue
* Fixed indentations and extra ';'
* Update CI for syncing gitmodules (#216)
* Added logging for the old update_expired_feeds bug
The old bug is https://github.com/cryptonomex/graphene/issues/615 .
Due to the bug, `update_median_feeds()` and `check_call_orders()`
will be called when a feed is not actually expired, normally this
should not affect consensus since calling them should not change
any data in the state.
However, the logging indicates that `check_call_orders()` did
change some data under certain circumstances, specifically, when
multiple limit order matching issue (#453) occurred at same block.
* https://github.com/bitshares/bitshares-core/issues/453
* Minor performance improvement for price::is_null()
* Use static refs in db_getter for immutable objects
* Minor performance improvement for db_maint
* Minor code updates for asset_evaluator.cpp
* changed an `assert()` to `FC_ASSERT()`
* replaced one `db.get(asset_id_type())` with `db.get_core_asset()`
* capture only required variables for lambda
* Improve update_expired_feeds performance #1093
* Change static refs to member pointers of db class
* Added getter for witness schedule object
* Added getter for core dynamic data object
* Use getters
* Removed unused variable
* Add comments for update_expired_feeds in db_block
* Minor refactory asset_create_evaluator::do_apply()
* Added FC_ASSERT for dynamic data id of core asset
* Added header inclusions in db_management.cpp
* fix global objects usage during replay
* Logging config parsing issue
* added new files
* compilation fix
* Simplified code in database::pay_workers()
* issue with withdrawl
* Added unit test for empty account history
* set extensions default values
* Update GPOS hardfork date and don't allow GPOS features before hardfork time
* refer to latest commit of latest-fc branch (#224)
* account name or id support in all database api
* asset id or name support in all asset APIs
* Fixed compilation issues
* Fixed alignment issues
* Externalized some API templates
* Externalize serialization of blocks, tx, ops
* Externalized db objects
* Externalized genesis serialization
* Externalized serialization in protocol library
* Undo superfluous change
* remove default value for extension parameter
* fix compilation issues
* GRPH-46-Quit_command_cliwallet
* removed multiple function definition
* Fixed chainparameter update proposal issue
* Move GPOS withdraw logic to have single transaction(also single fee) and update API
* Added log for authorization failure of proposal operations
* Votes consideration on GPOS activation
* bump fc version
* fix gpos tests
* Bump fc version
* Updated gpos/voting_tests
* Fixed withdraw vesting bug
* Added unit test
* Update hardfork date for TESTNET, sync fc module and update logs
* avoid wlog as it filling up space
* Beatrice hot fix(sync issue fix)
* gpos tests fix
* Set hardfork date to Jan5th on TESTNET
Co-authored-by: Peter Conrad <github.com@quisquis.de>
Co-authored-by: John M. Jones <jmjatlanta@gmail.com>
Co-authored-by: obucinac <obucinac@users.noreply.github.com>
Co-authored-by: Bobinson K B <bobinson@gmail.com>
Co-authored-by: Alfredo Garcia <oxarbitrage@gmail.com>
Co-authored-by: Miha Čančula <miha@noughmad.eu>
Co-authored-by: Abit <abitmore@users.noreply.github.com>
Co-authored-by: Roshan Syed <r.syed@pbsa.info>
Co-authored-by: Sandip Patel <sandip@knackroot.com>
Co-authored-by: RichardWeiYang <richard.weiyang@gmail.com>
Co-authored-by: gladcow <jahr@yandex.ru>
Co-authored-by: satyakoneru <satyakoneru.iiith@gmail.com>
2020-02-07 15:53:08 +00:00
|
|
|
bool database::check_call_orders( const asset_object& mia, bool enable_black_swan, bool for_new_limit_order,
|
|
|
|
|
const asset_bitasset_data_object* bitasset_ptr )
|
2015-06-08 15:50:35 +00:00
|
|
|
{ try {
|
|
|
|
|
if( !mia.is_market_issued() ) return false;
|
2015-09-30 22:30:44 +00:00
|
|
|
|
Merge beatrice(GPOS changes) with master (#270)
* Created unit test for #325
* remove needless find()
* issue - 154: Don't allow to vote when vesting balance is 0
* Increase block creation timeout to 2500ms
* increase delay for node connection
* remove cache from cli get_account
* add cli tests framework
* Adjust newly merged code to new API
* Merged changes from Bitshares PR 1036
* GRPH-76 - Short-cut long sequences of missed blocks
Fixes database::update_global_dynamic_data to speed up counting missed blocks.
(This also fixes a minor issue with counting - the previous algorithm would skip missed blocks for the witness who signed the first block after the gap.)
* Improved resilience of block database against corruption
* Moved reindex logic into database / chain_database, make use of additional blocks in block_database
Fixed tests wrt db.open
* Enable undo + fork database for final blocks in a replay
Dont remove blocks from block db when popping blocks, handle edge case in replay wrt fork_db, adapted unit tests
* Log starting block number of replay
* Prevent unsigned integer underflow
* Fixed lock detection
* Dont leave _data_dir empty if db is locked
* Writing the object_database is now almost atomic
* Improved consistency check for block_log
* Cut back block_log index file if inconsistent
* Fixed undo_database
* Added test case for broken merge on empty undo_db
* exclude second undo_db.enable() call in some cases
* Add missing change
* change bitshares to core in message
* Merge pull request #938 from bitshares/fix-block-storing
Store correct block ID when switching forks
* Fixed integer overflow issue
* Fix for for history ID mismatch ( Bitshares PR #875 )
* Update the FC submodule with the changes for GRPH-4
* Merged Bitshares PR #1462 and compilation fixes
* Support/gitlab (#123)
* Updated gitlab process
* Fix undefined references in cli test
* Updated GitLab CI
* Fix #436 object_database created outside of witness data directory
* supplement more comments on database::_opened variable
* prevent segfault when destructing application obj
* Fixed test failures and compilation issue
* minor performance improvement
* Added comment
* Fix compilation in debug mode
* Fixed duplicate ops returned from get_account_history
* Fixed account_history_pagination test
* Removed unrelated comment
* Update to fixed version of fc
* Skip auth check when pushing self-generated blocks
* Extract public keys before pushing a transaction
* Dereference chain_database shared_ptr
* Updated transaction::signees to mutable
and
* updated get_signature_keys() to return a const reference,
* get_signature_keys() will update signees on first call,
* modified test cases and wallet.cpp accordingly,
* no longer construct a new signed_transaction object before pushing
* Added get_asset_count API
* No longer extract public keys before pushing a trx
and removed unused new added constructor and _get_signature_keys() function from signed_transaction struct
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* Remove leftover comment from merge
* fix for get_vesting_balance API call
* braces update
* Allow sufficient space for new undo_session
* Throw for deep nesting
* node.cpp: Check the attacker/buggy client before updating items ids
The peer is an attacker or buggy, which means the item_hashes_received is
not correct.
Move the check before updating items ids to save some time in this case.
* Create .gitlab-ci.yml
* Added cli_test to CI
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* use random port numbers in app_test (#154)
* Changes to compiple with GCC 7(Ubuntu 18.04)
* proposal fail_reason bug fixed (#157)
* Added Sonarcloud code_quality to CI (#159)
* Added sonarcloud analysis (#158)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Support/gitlab develop (#168)
* Added code_quality to CI
* Update .gitlab-ci.yml
* Point to PBSA/peerplays-fc commit f13d063 (#167)
* [GRPH-3] Additional cli tests (#155)
* Additional cli tests
* Compatible with latest fc changes
* Fixed Spacing issues
* [GRPH-106] Added voting tests (#136)
* Added more voting tests
* Added additional option
* Adjust p2p log level (#180)
* merge gpos to develop (#186)
* issue - 154: Don't allow to vote when vesting balance is 0
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* fix for get_vesting_balance API call
* braces update
* Create .gitlab-ci.yml
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* Changes to compiple with GCC 7(Ubuntu 18.04)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Revert "Revert "GPOS protocol""
This reverts commit 67616417b7f0b5d087b9862de0e48b2d8ccc1bca.
* add new line needed to gpos hardfork file
* comment temporally cli_vote_for_2_witnesses until refactor or delete
* fix gpos tests
* fix gitlab-ci conflict
* Fixed few error messages
* error message corrections at other places
* Updated FC repository to peerplays-network/peerplays-fc (#189)
Point to fc commit hash 6096e94 [latest-fc branch]
* Project name update in Doxyfile (#146)
* changes to allow user to vote in each sub-period
* Fixed GPOS vesting factor issue when proxy is set
* Added unit test for proxy voting
* Review changes
* changes to update last voting time
* resolve merge conflict
* unit test changes and also separated GPOS test suite
* delete unused variables
* removed witness check
* eliminate time gap between two consecutive vesting periods
* deleted GPOS specific test suite and updated gpos tests
* updated GPOS hf
* Fixed dividend distribution issue and added test case
* fix flag
* clean newlines gpos_tests
* adapt gpos_tests to changed flag
* Fix to roll in GPOS rules, carry votes from 6th sub-period
* check was already modified
* comments updated
* updated comments to the benefit of reviewer
* Added token symbol name in error messages
* Added token symbol name in error messages (#204)
* case 1: Fixed last voting time issue
* get_account bug fixed
* Fixed flag issue
* Fixed spelling issue
* remove non needed gcc5 changes to dockerfile
* GRPH134- High CPU Issue, websocket changes (#213)
* update submodule branch to refer to the latest commit on latest-fc branch (#214)
* Improve account maintenance performance (#130)
* Improve account maintenance performance
* merge fixes
* Fixed merge issue
* Fixed indentations and extra ';'
* Update CI for syncing gitmodules (#216)
* Added logging for the old update_expired_feeds bug
The old bug is https://github.com/cryptonomex/graphene/issues/615 .
Due to the bug, `update_median_feeds()` and `check_call_orders()`
will be called when a feed is not actually expired, normally this
should not affect consensus since calling them should not change
any data in the state.
However, the logging indicates that `check_call_orders()` did
change some data under certain circumstances, specifically, when
multiple limit order matching issue (#453) occurred at same block.
* https://github.com/bitshares/bitshares-core/issues/453
* Minor performance improvement for price::is_null()
* Use static refs in db_getter for immutable objects
* Minor performance improvement for db_maint
* Minor code updates for asset_evaluator.cpp
* changed an `assert()` to `FC_ASSERT()`
* replaced one `db.get(asset_id_type())` with `db.get_core_asset()`
* capture only required variables for lambda
* Improve update_expired_feeds performance #1093
* Change static refs to member pointers of db class
* Added getter for witness schedule object
* Added getter for core dynamic data object
* Use getters
* Removed unused variable
* Add comments for update_expired_feeds in db_block
* Minor refactory asset_create_evaluator::do_apply()
* Added FC_ASSERT for dynamic data id of core asset
* Added header inclusions in db_management.cpp
* fix global objects usage during replay
* Logging config parsing issue
* added new files
* compilation fix
* Simplified code in database::pay_workers()
* issue with withdrawl
* Added unit test for empty account history
* set extensions default values
* Update GPOS hardfork date and don't allow GPOS features before hardfork time
* refer to latest commit of latest-fc branch (#224)
* account name or id support in all database api
* asset id or name support in all asset APIs
* Fixed compilation issues
* Fixed alignment issues
* Externalized some API templates
* Externalize serialization of blocks, tx, ops
* Externalized db objects
* Externalized genesis serialization
* Externalized serialization in protocol library
* Undo superfluous change
* remove default value for extension parameter
* fix compilation issues
* GRPH-46-Quit_command_cliwallet
* removed multiple function definition
* Fixed chainparameter update proposal issue
* Move GPOS withdraw logic to have single transaction(also single fee) and update API
* Added log for authorization failure of proposal operations
* Votes consideration on GPOS activation
* bump fc version
* fix gpos tests
* Bump fc version
* Updated gpos/voting_tests
* Fixed withdraw vesting bug
* Added unit test
* Update hardfork date for TESTNET, sync fc module and update logs
* avoid wlog as it filling up space
* Beatrice hot fix(sync issue fix)
* gpos tests fix
* Set hardfork date to Jan5th on TESTNET
Co-authored-by: Peter Conrad <github.com@quisquis.de>
Co-authored-by: John M. Jones <jmjatlanta@gmail.com>
Co-authored-by: obucinac <obucinac@users.noreply.github.com>
Co-authored-by: Bobinson K B <bobinson@gmail.com>
Co-authored-by: Alfredo Garcia <oxarbitrage@gmail.com>
Co-authored-by: Miha Čančula <miha@noughmad.eu>
Co-authored-by: Abit <abitmore@users.noreply.github.com>
Co-authored-by: Roshan Syed <r.syed@pbsa.info>
Co-authored-by: Sandip Patel <sandip@knackroot.com>
Co-authored-by: RichardWeiYang <richard.weiyang@gmail.com>
Co-authored-by: gladcow <jahr@yandex.ru>
Co-authored-by: satyakoneru <satyakoneru.iiith@gmail.com>
2020-02-07 15:53:08 +00:00
|
|
|
const asset_bitasset_data_object& bitasset = ( bitasset_ptr ? *bitasset_ptr : mia.bitasset_data(*this) );
|
|
|
|
|
|
|
|
|
|
if( check_for_blackswan( mia, enable_black_swan, &bitasset ) )
|
2015-09-30 22:30:44 +00:00
|
|
|
return false;
|
|
|
|
|
|
2015-06-08 15:50:35 +00:00
|
|
|
if( bitasset.is_prediction_market ) return false;
|
2015-06-19 19:57:08 +00:00
|
|
|
if( bitasset.current_feed.settlement_price.is_null() ) return false;
|
2015-06-08 15:50:35 +00:00
|
|
|
|
|
|
|
|
const call_order_index& call_index = get_index_type<call_order_index>();
|
|
|
|
|
const auto& call_price_index = call_index.indices().get<by_price>();
|
|
|
|
|
|
|
|
|
|
const limit_order_index& limit_index = get_index_type<limit_order_index>();
|
|
|
|
|
const auto& limit_price_index = limit_index.indices().get<by_price>();
|
|
|
|
|
|
2015-06-18 22:42:44 +00:00
|
|
|
// looking for limit orders selling the most USD for the least CORE
|
2015-06-18 19:17:48 +00:00
|
|
|
auto max_price = price::max( mia.id, bitasset.options.short_backing_asset );
|
2015-06-18 22:42:44 +00:00
|
|
|
// stop when limit orders are selling too little USD for too much CORE
|
2015-06-19 13:07:23 +00:00
|
|
|
auto min_price = bitasset.current_feed.max_short_squeeze_price();
|
2015-06-18 19:17:48 +00:00
|
|
|
|
2015-06-18 22:42:44 +00:00
|
|
|
assert( max_price.base.asset_id == min_price.base.asset_id );
|
2015-06-18 19:17:48 +00:00
|
|
|
// NOTE limit_price_index is sorted from greatest to least
|
|
|
|
|
auto limit_itr = limit_price_index.lower_bound( max_price );
|
2015-06-26 19:11:41 +00:00
|
|
|
auto limit_end = limit_price_index.upper_bound( min_price );
|
2015-06-18 19:17:48 +00:00
|
|
|
|
2015-11-05 22:12:57 +00:00
|
|
|
if( limit_itr == limit_end )
|
2015-06-18 19:17:48 +00:00
|
|
|
return false;
|
2015-06-08 15:50:35 +00:00
|
|
|
|
2015-09-30 22:30:44 +00:00
|
|
|
auto call_min = price::min( bitasset.options.short_backing_asset, mia.id );
|
|
|
|
|
auto call_max = price::max( bitasset.options.short_backing_asset, mia.id );
|
|
|
|
|
auto call_itr = call_price_index.lower_bound( call_min );
|
|
|
|
|
auto call_end = call_price_index.upper_bound( call_max );
|
2015-06-08 15:50:35 +00:00
|
|
|
|
2015-06-19 13:07:23 +00:00
|
|
|
bool filled_limit = false;
|
2015-10-08 19:41:10 +00:00
|
|
|
bool margin_called = false;
|
|
|
|
|
|
Merge beatrice(GPOS changes) with master (#270)
* Created unit test for #325
* remove needless find()
* issue - 154: Don't allow to vote when vesting balance is 0
* Increase block creation timeout to 2500ms
* increase delay for node connection
* remove cache from cli get_account
* add cli tests framework
* Adjust newly merged code to new API
* Merged changes from Bitshares PR 1036
* GRPH-76 - Short-cut long sequences of missed blocks
Fixes database::update_global_dynamic_data to speed up counting missed blocks.
(This also fixes a minor issue with counting - the previous algorithm would skip missed blocks for the witness who signed the first block after the gap.)
* Improved resilience of block database against corruption
* Moved reindex logic into database / chain_database, make use of additional blocks in block_database
Fixed tests wrt db.open
* Enable undo + fork database for final blocks in a replay
Dont remove blocks from block db when popping blocks, handle edge case in replay wrt fork_db, adapted unit tests
* Log starting block number of replay
* Prevent unsigned integer underflow
* Fixed lock detection
* Dont leave _data_dir empty if db is locked
* Writing the object_database is now almost atomic
* Improved consistency check for block_log
* Cut back block_log index file if inconsistent
* Fixed undo_database
* Added test case for broken merge on empty undo_db
* exclude second undo_db.enable() call in some cases
* Add missing change
* change bitshares to core in message
* Merge pull request #938 from bitshares/fix-block-storing
Store correct block ID when switching forks
* Fixed integer overflow issue
* Fix for for history ID mismatch ( Bitshares PR #875 )
* Update the FC submodule with the changes for GRPH-4
* Merged Bitshares PR #1462 and compilation fixes
* Support/gitlab (#123)
* Updated gitlab process
* Fix undefined references in cli test
* Updated GitLab CI
* Fix #436 object_database created outside of witness data directory
* supplement more comments on database::_opened variable
* prevent segfault when destructing application obj
* Fixed test failures and compilation issue
* minor performance improvement
* Added comment
* Fix compilation in debug mode
* Fixed duplicate ops returned from get_account_history
* Fixed account_history_pagination test
* Removed unrelated comment
* Update to fixed version of fc
* Skip auth check when pushing self-generated blocks
* Extract public keys before pushing a transaction
* Dereference chain_database shared_ptr
* Updated transaction::signees to mutable
and
* updated get_signature_keys() to return a const reference,
* get_signature_keys() will update signees on first call,
* modified test cases and wallet.cpp accordingly,
* no longer construct a new signed_transaction object before pushing
* Added get_asset_count API
* No longer extract public keys before pushing a trx
and removed unused new added constructor and _get_signature_keys() function from signed_transaction struct
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* Remove leftover comment from merge
* fix for get_vesting_balance API call
* braces update
* Allow sufficient space for new undo_session
* Throw for deep nesting
* node.cpp: Check the attacker/buggy client before updating items ids
The peer is an attacker or buggy, which means the item_hashes_received is
not correct.
Move the check before updating items ids to save some time in this case.
* Create .gitlab-ci.yml
* Added cli_test to CI
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* use random port numbers in app_test (#154)
* Changes to compiple with GCC 7(Ubuntu 18.04)
* proposal fail_reason bug fixed (#157)
* Added Sonarcloud code_quality to CI (#159)
* Added sonarcloud analysis (#158)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Support/gitlab develop (#168)
* Added code_quality to CI
* Update .gitlab-ci.yml
* Point to PBSA/peerplays-fc commit f13d063 (#167)
* [GRPH-3] Additional cli tests (#155)
* Additional cli tests
* Compatible with latest fc changes
* Fixed Spacing issues
* [GRPH-106] Added voting tests (#136)
* Added more voting tests
* Added additional option
* Adjust p2p log level (#180)
* merge gpos to develop (#186)
* issue - 154: Don't allow to vote when vesting balance is 0
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* fix for get_vesting_balance API call
* braces update
* Create .gitlab-ci.yml
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* Changes to compiple with GCC 7(Ubuntu 18.04)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Revert "Revert "GPOS protocol""
This reverts commit 67616417b7f0b5d087b9862de0e48b2d8ccc1bca.
* add new line needed to gpos hardfork file
* comment temporally cli_vote_for_2_witnesses until refactor or delete
* fix gpos tests
* fix gitlab-ci conflict
* Fixed few error messages
* error message corrections at other places
* Updated FC repository to peerplays-network/peerplays-fc (#189)
Point to fc commit hash 6096e94 [latest-fc branch]
* Project name update in Doxyfile (#146)
* changes to allow user to vote in each sub-period
* Fixed GPOS vesting factor issue when proxy is set
* Added unit test for proxy voting
* Review changes
* changes to update last voting time
* resolve merge conflict
* unit test changes and also separated GPOS test suite
* delete unused variables
* removed witness check
* eliminate time gap between two consecutive vesting periods
* deleted GPOS specific test suite and updated gpos tests
* updated GPOS hf
* Fixed dividend distribution issue and added test case
* fix flag
* clean newlines gpos_tests
* adapt gpos_tests to changed flag
* Fix to roll in GPOS rules, carry votes from 6th sub-period
* check was already modified
* comments updated
* updated comments to the benefit of reviewer
* Added token symbol name in error messages
* Added token symbol name in error messages (#204)
* case 1: Fixed last voting time issue
* get_account bug fixed
* Fixed flag issue
* Fixed spelling issue
* remove non needed gcc5 changes to dockerfile
* GRPH134- High CPU Issue, websocket changes (#213)
* update submodule branch to refer to the latest commit on latest-fc branch (#214)
* Improve account maintenance performance (#130)
* Improve account maintenance performance
* merge fixes
* Fixed merge issue
* Fixed indentations and extra ';'
* Update CI for syncing gitmodules (#216)
* Added logging for the old update_expired_feeds bug
The old bug is https://github.com/cryptonomex/graphene/issues/615 .
Due to the bug, `update_median_feeds()` and `check_call_orders()`
will be called when a feed is not actually expired, normally this
should not affect consensus since calling them should not change
any data in the state.
However, the logging indicates that `check_call_orders()` did
change some data under certain circumstances, specifically, when
multiple limit order matching issue (#453) occurred at same block.
* https://github.com/bitshares/bitshares-core/issues/453
* Minor performance improvement for price::is_null()
* Use static refs in db_getter for immutable objects
* Minor performance improvement for db_maint
* Minor code updates for asset_evaluator.cpp
* changed an `assert()` to `FC_ASSERT()`
* replaced one `db.get(asset_id_type())` with `db.get_core_asset()`
* capture only required variables for lambda
* Improve update_expired_feeds performance #1093
* Change static refs to member pointers of db class
* Added getter for witness schedule object
* Added getter for core dynamic data object
* Use getters
* Removed unused variable
* Add comments for update_expired_feeds in db_block
* Minor refactory asset_create_evaluator::do_apply()
* Added FC_ASSERT for dynamic data id of core asset
* Added header inclusions in db_management.cpp
* fix global objects usage during replay
* Logging config parsing issue
* added new files
* compilation fix
* Simplified code in database::pay_workers()
* issue with withdrawl
* Added unit test for empty account history
* set extensions default values
* Update GPOS hardfork date and don't allow GPOS features before hardfork time
* refer to latest commit of latest-fc branch (#224)
* account name or id support in all database api
* asset id or name support in all asset APIs
* Fixed compilation issues
* Fixed alignment issues
* Externalized some API templates
* Externalize serialization of blocks, tx, ops
* Externalized db objects
* Externalized genesis serialization
* Externalized serialization in protocol library
* Undo superfluous change
* remove default value for extension parameter
* fix compilation issues
* GRPH-46-Quit_command_cliwallet
* removed multiple function definition
* Fixed chainparameter update proposal issue
* Move GPOS withdraw logic to have single transaction(also single fee) and update API
* Added log for authorization failure of proposal operations
* Votes consideration on GPOS activation
* bump fc version
* fix gpos tests
* Bump fc version
* Updated gpos/voting_tests
* Fixed withdraw vesting bug
* Added unit test
* Update hardfork date for TESTNET, sync fc module and update logs
* avoid wlog as it filling up space
* Beatrice hot fix(sync issue fix)
* gpos tests fix
* Set hardfork date to Jan5th on TESTNET
Co-authored-by: Peter Conrad <github.com@quisquis.de>
Co-authored-by: John M. Jones <jmjatlanta@gmail.com>
Co-authored-by: obucinac <obucinac@users.noreply.github.com>
Co-authored-by: Bobinson K B <bobinson@gmail.com>
Co-authored-by: Alfredo Garcia <oxarbitrage@gmail.com>
Co-authored-by: Miha Čančula <miha@noughmad.eu>
Co-authored-by: Abit <abitmore@users.noreply.github.com>
Co-authored-by: Roshan Syed <r.syed@pbsa.info>
Co-authored-by: Sandip Patel <sandip@knackroot.com>
Co-authored-by: RichardWeiYang <richard.weiyang@gmail.com>
Co-authored-by: gladcow <jahr@yandex.ru>
Co-authored-by: satyakoneru <satyakoneru.iiith@gmail.com>
2020-02-07 15:53:08 +00:00
|
|
|
auto head_time = head_block_time();
|
|
|
|
|
auto head_num = head_block_num();
|
|
|
|
|
|
|
|
|
|
bool after_hardfork_436 = ( head_time > HARDFORK_436_TIME );
|
|
|
|
|
|
|
|
|
|
while( !check_for_blackswan( mia, enable_black_swan, &bitasset ) && call_itr != call_end )
|
2015-06-08 15:50:35 +00:00
|
|
|
{
|
|
|
|
|
bool filled_call = false;
|
|
|
|
|
price match_price;
|
|
|
|
|
asset usd_for_sale;
|
|
|
|
|
if( limit_itr != limit_end )
|
|
|
|
|
{
|
|
|
|
|
assert( limit_itr != limit_price_index.end() );
|
2015-06-16 14:14:10 +00:00
|
|
|
match_price = limit_itr->sell_price;
|
|
|
|
|
usd_for_sale = limit_itr->amount_for_sale();
|
2015-06-08 15:50:35 +00:00
|
|
|
}
|
2015-10-08 19:58:13 +00:00
|
|
|
else return margin_called;
|
2015-06-08 15:50:35 +00:00
|
|
|
|
|
|
|
|
match_price.validate();
|
|
|
|
|
|
2015-11-05 22:12:57 +00:00
|
|
|
// would be margin called, but there is no matching order #436
|
|
|
|
|
bool feed_protected = ( bitasset.current_feed.settlement_price > ~call_itr->call_price );
|
Merge beatrice(GPOS changes) with master (#270)
* Created unit test for #325
* remove needless find()
* issue - 154: Don't allow to vote when vesting balance is 0
* Increase block creation timeout to 2500ms
* increase delay for node connection
* remove cache from cli get_account
* add cli tests framework
* Adjust newly merged code to new API
* Merged changes from Bitshares PR 1036
* GRPH-76 - Short-cut long sequences of missed blocks
Fixes database::update_global_dynamic_data to speed up counting missed blocks.
(This also fixes a minor issue with counting - the previous algorithm would skip missed blocks for the witness who signed the first block after the gap.)
* Improved resilience of block database against corruption
* Moved reindex logic into database / chain_database, make use of additional blocks in block_database
Fixed tests wrt db.open
* Enable undo + fork database for final blocks in a replay
Dont remove blocks from block db when popping blocks, handle edge case in replay wrt fork_db, adapted unit tests
* Log starting block number of replay
* Prevent unsigned integer underflow
* Fixed lock detection
* Dont leave _data_dir empty if db is locked
* Writing the object_database is now almost atomic
* Improved consistency check for block_log
* Cut back block_log index file if inconsistent
* Fixed undo_database
* Added test case for broken merge on empty undo_db
* exclude second undo_db.enable() call in some cases
* Add missing change
* change bitshares to core in message
* Merge pull request #938 from bitshares/fix-block-storing
Store correct block ID when switching forks
* Fixed integer overflow issue
* Fix for for history ID mismatch ( Bitshares PR #875 )
* Update the FC submodule with the changes for GRPH-4
* Merged Bitshares PR #1462 and compilation fixes
* Support/gitlab (#123)
* Updated gitlab process
* Fix undefined references in cli test
* Updated GitLab CI
* Fix #436 object_database created outside of witness data directory
* supplement more comments on database::_opened variable
* prevent segfault when destructing application obj
* Fixed test failures and compilation issue
* minor performance improvement
* Added comment
* Fix compilation in debug mode
* Fixed duplicate ops returned from get_account_history
* Fixed account_history_pagination test
* Removed unrelated comment
* Update to fixed version of fc
* Skip auth check when pushing self-generated blocks
* Extract public keys before pushing a transaction
* Dereference chain_database shared_ptr
* Updated transaction::signees to mutable
and
* updated get_signature_keys() to return a const reference,
* get_signature_keys() will update signees on first call,
* modified test cases and wallet.cpp accordingly,
* no longer construct a new signed_transaction object before pushing
* Added get_asset_count API
* No longer extract public keys before pushing a trx
and removed unused new added constructor and _get_signature_keys() function from signed_transaction struct
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* Remove leftover comment from merge
* fix for get_vesting_balance API call
* braces update
* Allow sufficient space for new undo_session
* Throw for deep nesting
* node.cpp: Check the attacker/buggy client before updating items ids
The peer is an attacker or buggy, which means the item_hashes_received is
not correct.
Move the check before updating items ids to save some time in this case.
* Create .gitlab-ci.yml
* Added cli_test to CI
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* use random port numbers in app_test (#154)
* Changes to compiple with GCC 7(Ubuntu 18.04)
* proposal fail_reason bug fixed (#157)
* Added Sonarcloud code_quality to CI (#159)
* Added sonarcloud analysis (#158)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Support/gitlab develop (#168)
* Added code_quality to CI
* Update .gitlab-ci.yml
* Point to PBSA/peerplays-fc commit f13d063 (#167)
* [GRPH-3] Additional cli tests (#155)
* Additional cli tests
* Compatible with latest fc changes
* Fixed Spacing issues
* [GRPH-106] Added voting tests (#136)
* Added more voting tests
* Added additional option
* Adjust p2p log level (#180)
* merge gpos to develop (#186)
* issue - 154: Don't allow to vote when vesting balance is 0
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* fix for get_vesting_balance API call
* braces update
* Create .gitlab-ci.yml
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* Changes to compiple with GCC 7(Ubuntu 18.04)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Revert "Revert "GPOS protocol""
This reverts commit 67616417b7f0b5d087b9862de0e48b2d8ccc1bca.
* add new line needed to gpos hardfork file
* comment temporally cli_vote_for_2_witnesses until refactor or delete
* fix gpos tests
* fix gitlab-ci conflict
* Fixed few error messages
* error message corrections at other places
* Updated FC repository to peerplays-network/peerplays-fc (#189)
Point to fc commit hash 6096e94 [latest-fc branch]
* Project name update in Doxyfile (#146)
* changes to allow user to vote in each sub-period
* Fixed GPOS vesting factor issue when proxy is set
* Added unit test for proxy voting
* Review changes
* changes to update last voting time
* resolve merge conflict
* unit test changes and also separated GPOS test suite
* delete unused variables
* removed witness check
* eliminate time gap between two consecutive vesting periods
* deleted GPOS specific test suite and updated gpos tests
* updated GPOS hf
* Fixed dividend distribution issue and added test case
* fix flag
* clean newlines gpos_tests
* adapt gpos_tests to changed flag
* Fix to roll in GPOS rules, carry votes from 6th sub-period
* check was already modified
* comments updated
* updated comments to the benefit of reviewer
* Added token symbol name in error messages
* Added token symbol name in error messages (#204)
* case 1: Fixed last voting time issue
* get_account bug fixed
* Fixed flag issue
* Fixed spelling issue
* remove non needed gcc5 changes to dockerfile
* GRPH134- High CPU Issue, websocket changes (#213)
* update submodule branch to refer to the latest commit on latest-fc branch (#214)
* Improve account maintenance performance (#130)
* Improve account maintenance performance
* merge fixes
* Fixed merge issue
* Fixed indentations and extra ';'
* Update CI for syncing gitmodules (#216)
* Added logging for the old update_expired_feeds bug
The old bug is https://github.com/cryptonomex/graphene/issues/615 .
Due to the bug, `update_median_feeds()` and `check_call_orders()`
will be called when a feed is not actually expired, normally this
should not affect consensus since calling them should not change
any data in the state.
However, the logging indicates that `check_call_orders()` did
change some data under certain circumstances, specifically, when
multiple limit order matching issue (#453) occurred at same block.
* https://github.com/bitshares/bitshares-core/issues/453
* Minor performance improvement for price::is_null()
* Use static refs in db_getter for immutable objects
* Minor performance improvement for db_maint
* Minor code updates for asset_evaluator.cpp
* changed an `assert()` to `FC_ASSERT()`
* replaced one `db.get(asset_id_type())` with `db.get_core_asset()`
* capture only required variables for lambda
* Improve update_expired_feeds performance #1093
* Change static refs to member pointers of db class
* Added getter for witness schedule object
* Added getter for core dynamic data object
* Use getters
* Removed unused variable
* Add comments for update_expired_feeds in db_block
* Minor refactory asset_create_evaluator::do_apply()
* Added FC_ASSERT for dynamic data id of core asset
* Added header inclusions in db_management.cpp
* fix global objects usage during replay
* Logging config parsing issue
* added new files
* compilation fix
* Simplified code in database::pay_workers()
* issue with withdrawl
* Added unit test for empty account history
* set extensions default values
* Update GPOS hardfork date and don't allow GPOS features before hardfork time
* refer to latest commit of latest-fc branch (#224)
* account name or id support in all database api
* asset id or name support in all asset APIs
* Fixed compilation issues
* Fixed alignment issues
* Externalized some API templates
* Externalize serialization of blocks, tx, ops
* Externalized db objects
* Externalized genesis serialization
* Externalized serialization in protocol library
* Undo superfluous change
* remove default value for extension parameter
* fix compilation issues
* GRPH-46-Quit_command_cliwallet
* removed multiple function definition
* Fixed chainparameter update proposal issue
* Move GPOS withdraw logic to have single transaction(also single fee) and update API
* Added log for authorization failure of proposal operations
* Votes consideration on GPOS activation
* bump fc version
* fix gpos tests
* Bump fc version
* Updated gpos/voting_tests
* Fixed withdraw vesting bug
* Added unit test
* Update hardfork date for TESTNET, sync fc module and update logs
* avoid wlog as it filling up space
* Beatrice hot fix(sync issue fix)
* gpos tests fix
* Set hardfork date to Jan5th on TESTNET
Co-authored-by: Peter Conrad <github.com@quisquis.de>
Co-authored-by: John M. Jones <jmjatlanta@gmail.com>
Co-authored-by: obucinac <obucinac@users.noreply.github.com>
Co-authored-by: Bobinson K B <bobinson@gmail.com>
Co-authored-by: Alfredo Garcia <oxarbitrage@gmail.com>
Co-authored-by: Miha Čančula <miha@noughmad.eu>
Co-authored-by: Abit <abitmore@users.noreply.github.com>
Co-authored-by: Roshan Syed <r.syed@pbsa.info>
Co-authored-by: Sandip Patel <sandip@knackroot.com>
Co-authored-by: RichardWeiYang <richard.weiyang@gmail.com>
Co-authored-by: gladcow <jahr@yandex.ru>
Co-authored-by: satyakoneru <satyakoneru.iiith@gmail.com>
2020-02-07 15:53:08 +00:00
|
|
|
if( feed_protected && after_hardfork_436 )
|
2015-11-05 22:12:57 +00:00
|
|
|
return margin_called;
|
|
|
|
|
|
|
|
|
|
// would be margin called, but there is no matching order
|
2015-06-08 15:50:35 +00:00
|
|
|
if( match_price > ~call_itr->call_price )
|
2015-10-08 19:58:13 +00:00
|
|
|
return margin_called;
|
|
|
|
|
|
2015-11-05 22:12:57 +00:00
|
|
|
if( feed_protected )
|
|
|
|
|
{
|
|
|
|
|
ilog( "Feed protected margin call executing (HARDFORK_436_TIME not here yet)" );
|
|
|
|
|
idump( (*call_itr) );
|
|
|
|
|
idump( (*limit_itr) );
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-08 19:58:13 +00:00
|
|
|
// idump((*call_itr));
|
|
|
|
|
// idump((*limit_itr));
|
|
|
|
|
|
|
|
|
|
// ilog( "match_price <= ~call_itr->call_price performing a margin call" );
|
2015-10-08 19:41:10 +00:00
|
|
|
|
|
|
|
|
margin_called = true;
|
2015-06-08 15:50:35 +00:00
|
|
|
|
|
|
|
|
auto usd_to_buy = call_itr->get_debt();
|
|
|
|
|
|
|
|
|
|
if( usd_to_buy * match_price > call_itr->get_collateral() )
|
|
|
|
|
{
|
Merge beatrice(GPOS changes) with master (#270)
* Created unit test for #325
* remove needless find()
* issue - 154: Don't allow to vote when vesting balance is 0
* Increase block creation timeout to 2500ms
* increase delay for node connection
* remove cache from cli get_account
* add cli tests framework
* Adjust newly merged code to new API
* Merged changes from Bitshares PR 1036
* GRPH-76 - Short-cut long sequences of missed blocks
Fixes database::update_global_dynamic_data to speed up counting missed blocks.
(This also fixes a minor issue with counting - the previous algorithm would skip missed blocks for the witness who signed the first block after the gap.)
* Improved resilience of block database against corruption
* Moved reindex logic into database / chain_database, make use of additional blocks in block_database
Fixed tests wrt db.open
* Enable undo + fork database for final blocks in a replay
Dont remove blocks from block db when popping blocks, handle edge case in replay wrt fork_db, adapted unit tests
* Log starting block number of replay
* Prevent unsigned integer underflow
* Fixed lock detection
* Dont leave _data_dir empty if db is locked
* Writing the object_database is now almost atomic
* Improved consistency check for block_log
* Cut back block_log index file if inconsistent
* Fixed undo_database
* Added test case for broken merge on empty undo_db
* exclude second undo_db.enable() call in some cases
* Add missing change
* change bitshares to core in message
* Merge pull request #938 from bitshares/fix-block-storing
Store correct block ID when switching forks
* Fixed integer overflow issue
* Fix for for history ID mismatch ( Bitshares PR #875 )
* Update the FC submodule with the changes for GRPH-4
* Merged Bitshares PR #1462 and compilation fixes
* Support/gitlab (#123)
* Updated gitlab process
* Fix undefined references in cli test
* Updated GitLab CI
* Fix #436 object_database created outside of witness data directory
* supplement more comments on database::_opened variable
* prevent segfault when destructing application obj
* Fixed test failures and compilation issue
* minor performance improvement
* Added comment
* Fix compilation in debug mode
* Fixed duplicate ops returned from get_account_history
* Fixed account_history_pagination test
* Removed unrelated comment
* Update to fixed version of fc
* Skip auth check when pushing self-generated blocks
* Extract public keys before pushing a transaction
* Dereference chain_database shared_ptr
* Updated transaction::signees to mutable
and
* updated get_signature_keys() to return a const reference,
* get_signature_keys() will update signees on first call,
* modified test cases and wallet.cpp accordingly,
* no longer construct a new signed_transaction object before pushing
* Added get_asset_count API
* No longer extract public keys before pushing a trx
and removed unused new added constructor and _get_signature_keys() function from signed_transaction struct
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* Remove leftover comment from merge
* fix for get_vesting_balance API call
* braces update
* Allow sufficient space for new undo_session
* Throw for deep nesting
* node.cpp: Check the attacker/buggy client before updating items ids
The peer is an attacker or buggy, which means the item_hashes_received is
not correct.
Move the check before updating items ids to save some time in this case.
* Create .gitlab-ci.yml
* Added cli_test to CI
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* use random port numbers in app_test (#154)
* Changes to compiple with GCC 7(Ubuntu 18.04)
* proposal fail_reason bug fixed (#157)
* Added Sonarcloud code_quality to CI (#159)
* Added sonarcloud analysis (#158)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Support/gitlab develop (#168)
* Added code_quality to CI
* Update .gitlab-ci.yml
* Point to PBSA/peerplays-fc commit f13d063 (#167)
* [GRPH-3] Additional cli tests (#155)
* Additional cli tests
* Compatible with latest fc changes
* Fixed Spacing issues
* [GRPH-106] Added voting tests (#136)
* Added more voting tests
* Added additional option
* Adjust p2p log level (#180)
* merge gpos to develop (#186)
* issue - 154: Don't allow to vote when vesting balance is 0
* changes to withdraw_vesting feature(for both cdd and GPOS)
* Comments update
* update to GPOS hardfork ref
* fix for get_vesting_balance API call
* braces update
* Create .gitlab-ci.yml
* fixing build errors (#150)
* fixing build errors
vest type correction
* fixing build errors
vest type correction
* fixes
new Dockerfile
* vesting_balance_type correction
vesting_balance_type changed to normal
* gcc5 support to Dockerfile
gcc5 support to Dockerfile
* Changes to compiple with GCC 7(Ubuntu 18.04)
* changes to have separate methods and single withdrawl fee for multiple vest objects
* 163-fix, Return only non-zero vesting balances
* Revert "Revert "GPOS protocol""
This reverts commit 67616417b7f0b5d087b9862de0e48b2d8ccc1bca.
* add new line needed to gpos hardfork file
* comment temporally cli_vote_for_2_witnesses until refactor or delete
* fix gpos tests
* fix gitlab-ci conflict
* Fixed few error messages
* error message corrections at other places
* Updated FC repository to peerplays-network/peerplays-fc (#189)
Point to fc commit hash 6096e94 [latest-fc branch]
* Project name update in Doxyfile (#146)
* changes to allow user to vote in each sub-period
* Fixed GPOS vesting factor issue when proxy is set
* Added unit test for proxy voting
* Review changes
* changes to update last voting time
* resolve merge conflict
* unit test changes and also separated GPOS test suite
* delete unused variables
* removed witness check
* eliminate time gap between two consecutive vesting periods
* deleted GPOS specific test suite and updated gpos tests
* updated GPOS hf
* Fixed dividend distribution issue and added test case
* fix flag
* clean newlines gpos_tests
* adapt gpos_tests to changed flag
* Fix to roll in GPOS rules, carry votes from 6th sub-period
* check was already modified
* comments updated
* updated comments to the benefit of reviewer
* Added token symbol name in error messages
* Added token symbol name in error messages (#204)
* case 1: Fixed last voting time issue
* get_account bug fixed
* Fixed flag issue
* Fixed spelling issue
* remove non needed gcc5 changes to dockerfile
* GRPH134- High CPU Issue, websocket changes (#213)
* update submodule branch to refer to the latest commit on latest-fc branch (#214)
* Improve account maintenance performance (#130)
* Improve account maintenance performance
* merge fixes
* Fixed merge issue
* Fixed indentations and extra ';'
* Update CI for syncing gitmodules (#216)
* Added logging for the old update_expired_feeds bug
The old bug is https://github.com/cryptonomex/graphene/issues/615 .
Due to the bug, `update_median_feeds()` and `check_call_orders()`
will be called when a feed is not actually expired, normally this
should not affect consensus since calling them should not change
any data in the state.
However, the logging indicates that `check_call_orders()` did
change some data under certain circumstances, specifically, when
multiple limit order matching issue (#453) occurred at same block.
* https://github.com/bitshares/bitshares-core/issues/453
* Minor performance improvement for price::is_null()
* Use static refs in db_getter for immutable objects
* Minor performance improvement for db_maint
* Minor code updates for asset_evaluator.cpp
* changed an `assert()` to `FC_ASSERT()`
* replaced one `db.get(asset_id_type())` with `db.get_core_asset()`
* capture only required variables for lambda
* Improve update_expired_feeds performance #1093
* Change static refs to member pointers of db class
* Added getter for witness schedule object
* Added getter for core dynamic data object
* Use getters
* Removed unused variable
* Add comments for update_expired_feeds in db_block
* Minor refactory asset_create_evaluator::do_apply()
* Added FC_ASSERT for dynamic data id of core asset
* Added header inclusions in db_management.cpp
* fix global objects usage during replay
* Logging config parsing issue
* added new files
* compilation fix
* Simplified code in database::pay_workers()
* issue with withdrawl
* Added unit test for empty account history
* set extensions default values
* Update GPOS hardfork date and don't allow GPOS features before hardfork time
* refer to latest commit of latest-fc branch (#224)
* account name or id support in all database api
* asset id or name support in all asset APIs
* Fixed compilation issues
* Fixed alignment issues
* Externalized some API templates
* Externalize serialization of blocks, tx, ops
* Externalized db objects
* Externalized genesis serialization
* Externalized serialization in protocol library
* Undo superfluous change
* remove default value for extension parameter
* fix compilation issues
* GRPH-46-Quit_command_cliwallet
* removed multiple function definition
* Fixed chainparameter update proposal issue
* Move GPOS withdraw logic to have single transaction(also single fee) and update API
* Added log for authorization failure of proposal operations
* Votes consideration on GPOS activation
* bump fc version
* fix gpos tests
* Bump fc version
* Updated gpos/voting_tests
* Fixed withdraw vesting bug
* Added unit test
* Update hardfork date for TESTNET, sync fc module and update logs
* avoid wlog as it filling up space
* Beatrice hot fix(sync issue fix)
* gpos tests fix
* Set hardfork date to Jan5th on TESTNET
Co-authored-by: Peter Conrad <github.com@quisquis.de>
Co-authored-by: John M. Jones <jmjatlanta@gmail.com>
Co-authored-by: obucinac <obucinac@users.noreply.github.com>
Co-authored-by: Bobinson K B <bobinson@gmail.com>
Co-authored-by: Alfredo Garcia <oxarbitrage@gmail.com>
Co-authored-by: Miha Čančula <miha@noughmad.eu>
Co-authored-by: Abit <abitmore@users.noreply.github.com>
Co-authored-by: Roshan Syed <r.syed@pbsa.info>
Co-authored-by: Sandip Patel <sandip@knackroot.com>
Co-authored-by: RichardWeiYang <richard.weiyang@gmail.com>
Co-authored-by: gladcow <jahr@yandex.ru>
Co-authored-by: satyakoneru <satyakoneru.iiith@gmail.com>
2020-02-07 15:53:08 +00:00
|
|
|
elog( "black swan detected on asset ${symbol} (${id}) at block ${b}",
|
|
|
|
|
("id",mia.id)("symbol",mia.symbol)("b",head_num) );
|
2015-09-30 22:30:44 +00:00
|
|
|
edump((enable_black_swan));
|
2015-06-18 19:17:48 +00:00
|
|
|
FC_ASSERT( enable_black_swan );
|
2015-09-30 22:30:44 +00:00
|
|
|
globally_settle_asset(mia, bitasset.current_feed.settlement_price );
|
2015-06-08 15:50:35 +00:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
asset call_pays, call_receives, order_pays, order_receives;
|
|
|
|
|
if( usd_to_buy >= usd_for_sale )
|
|
|
|
|
{ // fill order
|
|
|
|
|
call_receives = usd_for_sale;
|
|
|
|
|
order_receives = usd_for_sale * match_price;
|
|
|
|
|
call_pays = order_receives;
|
|
|
|
|
order_pays = usd_for_sale;
|
|
|
|
|
|
2015-06-19 13:07:23 +00:00
|
|
|
filled_limit = true;
|
2015-06-08 15:50:35 +00:00
|
|
|
filled_call = (usd_to_buy == usd_for_sale);
|
2015-06-26 19:11:41 +00:00
|
|
|
} else { // fill call
|
2015-06-08 15:50:35 +00:00
|
|
|
call_receives = usd_to_buy;
|
|
|
|
|
order_receives = usd_to_buy * match_price;
|
|
|
|
|
call_pays = order_receives;
|
|
|
|
|
order_pays = usd_to_buy;
|
|
|
|
|
|
|
|
|
|
filled_call = true;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-08 19:41:10 +00:00
|
|
|
FC_ASSERT( filled_call || filled_limit );
|
|
|
|
|
|
2015-06-08 15:50:35 +00:00
|
|
|
auto old_call_itr = call_itr;
|
|
|
|
|
if( filled_call ) ++call_itr;
|
2015-06-26 19:11:41 +00:00
|
|
|
fill_order(*old_call_itr, call_pays, call_receives);
|
2015-06-16 14:14:10 +00:00
|
|
|
|
2015-06-19 13:07:23 +00:00
|
|
|
auto old_limit_itr = filled_limit ? limit_itr++ : limit_itr;
|
2016-02-05 22:29:13 +00:00
|
|
|
fill_order(*old_limit_itr, order_pays, order_receives, true);
|
2015-09-30 22:30:44 +00:00
|
|
|
|
2015-06-08 15:50:35 +00:00
|
|
|
} // whlie call_itr != call_end
|
|
|
|
|
|
2015-10-08 19:41:10 +00:00
|
|
|
return margin_called;
|
2015-06-08 15:50:35 +00:00
|
|
|
} FC_CAPTURE_AND_RETHROW() }
|
|
|
|
|
|
|
|
|
|
void database::pay_order( const account_object& receiver, const asset& receives, const asset& pays )
|
|
|
|
|
{
|
|
|
|
|
const auto& balances = receiver.statistics(*this);
|
|
|
|
|
modify( balances, [&]( account_statistics_object& b ){
|
|
|
|
|
if( pays.asset_id == asset_id_type() )
|
2015-09-30 22:30:44 +00:00
|
|
|
{
|
2015-06-08 15:50:35 +00:00
|
|
|
b.total_core_in_orders -= pays.amount;
|
2015-09-30 22:30:44 +00:00
|
|
|
}
|
2015-06-08 15:50:35 +00:00
|
|
|
});
|
|
|
|
|
adjust_balance(receiver.get_id(), receives);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
asset database::calculate_market_fee( const asset_object& trade_asset, const asset& trade_amount )
|
|
|
|
|
{
|
|
|
|
|
assert( trade_asset.id == trade_amount.asset_id );
|
|
|
|
|
|
|
|
|
|
if( !trade_asset.charges_market_fees() )
|
|
|
|
|
return trade_asset.amount(0);
|
|
|
|
|
if( trade_asset.options.market_fee_percent == 0 )
|
2015-06-22 21:29:40 +00:00
|
|
|
return trade_asset.amount(0);
|
2015-06-08 15:50:35 +00:00
|
|
|
|
|
|
|
|
fc::uint128 a(trade_amount.amount.value);
|
|
|
|
|
a *= trade_asset.options.market_fee_percent;
|
|
|
|
|
a /= GRAPHENE_100_PERCENT;
|
|
|
|
|
asset percent_fee = trade_asset.amount(a.to_uint64());
|
|
|
|
|
|
|
|
|
|
if( percent_fee.amount > trade_asset.options.max_market_fee )
|
|
|
|
|
percent_fee.amount = trade_asset.options.max_market_fee;
|
|
|
|
|
|
|
|
|
|
return percent_fee;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
asset database::pay_market_fees( const asset_object& recv_asset, const asset& receives )
|
|
|
|
|
{
|
|
|
|
|
auto issuer_fees = calculate_market_fee( recv_asset, receives );
|
|
|
|
|
assert(issuer_fees <= receives );
|
|
|
|
|
|
|
|
|
|
//Don't dirty undo state if not actually collecting any fees
|
|
|
|
|
if( issuer_fees.amount > 0 )
|
|
|
|
|
{
|
|
|
|
|
const auto& recv_dyn_data = recv_asset.dynamic_asset_data_id(*this);
|
|
|
|
|
modify( recv_dyn_data, [&]( asset_dynamic_data_object& obj ){
|
2015-06-18 19:17:48 +00:00
|
|
|
//idump((issuer_fees));
|
2015-06-08 15:50:35 +00:00
|
|
|
obj.accumulated_fees += issuer_fees.amount;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return issuer_fees;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} }
|