Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement alternative black swan response methods #2499

Merged
merged 99 commits into from
Sep 29, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
97a7752
Add alternative bad debt settlement methods
abitmore Aug 6, 2021
b177cbc
Add disable_bdsm_update bit in issuer permission
abitmore Aug 7, 2021
29925a8
Refactor asset_object::update_median_feeds(...)
abitmore Aug 8, 2021
013cea1
Partially implement BDSM::no_settlement
abitmore Aug 8, 2021
c0b3724
Implement BDSM::no_settlement
abitmore Aug 10, 2021
055f7c5
Implement force-settlement against individual pool
abitmore Aug 14, 2021
e83f842
Update tests to adapt settle_op return type change
abitmore Aug 14, 2021
3227652
Implement BDSM::individual_settlement_to_fund
abitmore Aug 15, 2021
57b837a
Implement BDSM::individual_settlement_to_order
abitmore Aug 16, 2021
6d73d00
Fix scenarios that no debt position exists
abitmore Aug 16, 2021
3834127
Implement BDSM update
abitmore Aug 16, 2021
1a77212
Fix code smells
abitmore Aug 17, 2021
ccf9e3f
Fix more code smells
abitmore Aug 17, 2021
6100550
Refactor asset_settle_evaluator::do_apply
abitmore Aug 17, 2021
7aa02cb
Disallow BDSM on PM
abitmore Aug 17, 2021
e998ddd
Refactor asset_settle_evaluator::do_apply
abitmore Aug 17, 2021
67dd8a1
Add database::find_least_collateralized_short()
abitmore Aug 17, 2021
d1b6bda
Update macos-11.0 to macos-11 for Github Actions
abitmore Aug 17, 2021
0684f3f
Fix a code smell, rename variables for readability
abitmore Aug 18, 2021
d9180f0
Refactor database::clear_expired_force_settlements
abitmore Aug 18, 2021
183b80f
Update coding style, fix code smells
abitmore Aug 18, 2021
f5c0fbf
Remove code that was commented out
abitmore Aug 18, 2021
f58a0cb
Add a comment
abitmore Aug 19, 2021
5dd32b2
Add GS price tests
abitmore Aug 19, 2021
b1db7e6
Undo unneeded changes in bsip48_75_tests wrt bdsm
abitmore Aug 22, 2021
5518907
Disallow non-UIA issuer permission bits on UIA
abitmore Aug 22, 2021
7b7eabe
Update logic about bdsm hf time in bsip48_75_tests
abitmore Aug 22, 2021
23b78d3
Disallow disable_bdsm_update permission bit on PM
abitmore Aug 22, 2021
3700800
Add some tests for BDSM
abitmore Aug 22, 2021
7baa8f5
Fix asset_settle when force settlement is disabled
abitmore Aug 22, 2021
23902a6
Add a comment
abitmore Aug 22, 2021
8bbe408
Fix uncapping of settlement price
abitmore Aug 22, 2021
151ba84
Slightly refactor clear_expired_force_settlements
abitmore Aug 22, 2021
8e9f3e4
Fix individual_settlement_to_fund black swan check
abitmore Aug 26, 2021
d035122
Rename BDSM to BSRM
abitmore Aug 26, 2021
fe65758
Fix apply_order and apply_force_settlement
abitmore Aug 27, 2021
3e42d21
Add tests about BSRM no_settlement
abitmore Aug 27, 2021
2d706d0
Fix match_force_settlements
abitmore Aug 27, 2021
4c5ac83
Call check_call_orders() in apply_order()
abitmore Aug 28, 2021
2244a21
Call check_call_orders in apply_force_settlements
abitmore Aug 28, 2021
565c73f
Fix tests about BSRM no_settlement
abitmore Aug 28, 2021
b8f7881
Fix check_call_orders() wrt no_settlement
abitmore Aug 28, 2021
b50b2f8
Fix no_settlement tests about feed update
abitmore Aug 28, 2021
3a7a6c0
Reduce number of params for db::match(limit,call)
abitmore Aug 29, 2021
d6b3d43
Reduce number of params for db::match(settle,call)
abitmore Aug 29, 2021
e7b1245
Simplify code
abitmore Aug 29, 2021
5415c03
Move check_for_blackswan from db_update to market
abitmore Aug 29, 2021
221cd45
Update order of members in database.hpp
abitmore Aug 29, 2021
caa70b0
Add no-settlement taker tests
abitmore Aug 31, 2021
b614a1a
Split bsrm_tests.cpp into multiple files
abitmore Sep 3, 2021
19c39fc
Fix rounding issue when matching limit with call
abitmore Sep 3, 2021
d8a96e0
Add no-settlement tests about small limit taker
abitmore Sep 3, 2021
64cbfd0
Fix rounding issue when matching settle with call
abitmore Sep 3, 2021
a432884
Add no-settlement tests about small settle taker
abitmore Sep 3, 2021
edd7382
Fix tests about matching call with settle
abitmore Sep 3, 2021
0443f54
Add tests about updating BSRM after GS
abitmore Sep 5, 2021
8f71eb2
Add BSRM update tests for indvd-settlement to fund
abitmore Sep 5, 2021
0e20704
Add BSRM update tests for indvd-settle to order
abitmore Sep 5, 2021
cdcc4d6
Add comments
abitmore Sep 5, 2021
d483ebb
Rename a function
abitmore Sep 5, 2021
fa7e7d7
Add tests about updating BSRM from no_settlement
abitmore Sep 5, 2021
7b82a6c
Simplify code
abitmore Sep 6, 2021
e1f5547
Refactor call_order_update_evaluator
abitmore Sep 6, 2021
fb90153
Allow closing debt position even if no price feed
abitmore Sep 6, 2021
ea5ffb8
Add tests about closing debt position when no feed
abitmore Sep 6, 2021
0a843b5
Remove Ubuntu 16 from Github Actions workflows
abitmore Sep 7, 2021
29e36f0
Update cache keys in Github Actions MinGW workflow
abitmore Sep 7, 2021
30c6441
Fix call_order_update issues about no_settlement
abitmore Sep 7, 2021
9866bb0
Fix no_settlement tests wrt call_order_update
abitmore Sep 7, 2021
245d44f
Fix tests about call_order_update partially fill
abitmore Sep 7, 2021
186a4b6
Fix code smells
abitmore Sep 7, 2021
e1a6ac5
Refactor call_order_update_evaluator::do_apply()
abitmore Sep 7, 2021
c699e53
Add call_order_update tests about no_settlement
abitmore Sep 10, 2021
6abdc1e
Add tests about manual GS for different BSRM types
abitmore Sep 10, 2021
cb00696
Update comments
abitmore Sep 10, 2021
1a8f51d
Update manual GS tests for different BSRM types
abitmore Sep 10, 2021
c0c7c57
Slightly refactor asset_global_settle_evaluator
abitmore Sep 10, 2021
a070eeb
Add tests for individual_settlement_to_order
abitmore Sep 12, 2021
5a5c0bc
Add tests about cancelling settle order on no call
abitmore Sep 15, 2021
7729a51
Add more tests about cancelling settle orders
abitmore Sep 15, 2021
3170106
Fix check_call_orders() : check limit orders again
abitmore Sep 16, 2021
2b38112
Add tests wrt matching call with settle then limit
abitmore Sep 16, 2021
9b2bfff
Remove an unused variable
abitmore Sep 17, 2021
c253f40
Check call orders after paid from individual fund
abitmore Sep 17, 2021
d357023
Add tests for individual settlement to order
abitmore Sep 18, 2021
7f9e15b
Fix code smells
abitmore Sep 18, 2021
21c93b4
Fix individual_settlement_to_fund
abitmore Sep 21, 2021
9cecdb5
Add tests for individual settlement to fund
abitmore Sep 21, 2021
9240fa7
Refactor database::check_call_orders()
abitmore Sep 22, 2021
8ec1e03
Add more tests about individual settlements
abitmore Sep 22, 2021
6390945
Add disable_force_settle tests for indvd settle
abitmore Sep 24, 2021
4dbaa30
Add taking tests for individual settlement to fund
abitmore Sep 24, 2021
f9446a7
Add tests about force-settling when no feed
abitmore Sep 24, 2021
270a506
Fix a comment in a test case
abitmore Sep 24, 2021
01bcfa5
Update a comment
abitmore Sep 27, 2021
d3da53f
Update comments
abitmore Sep 27, 2021
c38ad74
Slightly optimize check_for_blackswan() and etc
abitmore Sep 29, 2021
67d6624
Update comments
abitmore Sep 29, 2021
5ba086c
Add a comment
abitmore Sep 29, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build-and-test.mac.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jobs:
name: Build and test in macOS
strategy:
matrix:
os: [macos-10.15, macos-11.0]
os: [macos-10.15, macos-11]
runs-on: ${{ matrix.os }}
steps:
- name: Install dependencies
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build-and-test.ubuntu-debug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jobs:
name: Build and test in Debug mode
strategy:
matrix:
os: [ ubuntu-16.04, ubuntu-18.04, ubuntu-20.04 ]
os: [ ubuntu-18.04, ubuntu-20.04 ]
runs-on: ${{ matrix.os }}
services:
elasticsearch:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build-and-test.ubuntu-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jobs:
name: Build and test in Release mode
strategy:
matrix:
os: [ ubuntu-16.04, ubuntu-18.04, ubuntu-20.04 ]
os: [ ubuntu-18.04, ubuntu-20.04 ]
runs-on: ${{ matrix.os }}
services:
elasticsearch:
Expand Down
21 changes: 13 additions & 8 deletions .github/workflows/build-and-test.win.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,15 @@ jobs:
name: Build required 3rd-party libraries
runs-on: ubuntu-latest
steps:
# Get OS version to be used in cache key - see https://github.com/actions/cache/issues/543
- run: |
echo "OS_VERSION=`lsb_release -sr`" >> $GITHUB_ENV
- name: Load Cache
id: cache-libs
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: libs
key: mingw64-libs-${{ env.BOOST_VERSION }}_${{ env.CURL_VERSION }}_${{ env.OPENSSL_VERSION }}_${{ env.ZLIB_VERSION }}
key: mingw64-libs-${{ env.OS_VERSION }}-${{ env.BOOST_VERSION }}_${{ env.CURL_VERSION }}_${{ env.OPENSSL_VERSION }}_${{ env.ZLIB_VERSION }}
- name: Install dependencies
if: steps.cache-libs.outputs.cache-hit != 'true'
run: |
Expand Down Expand Up @@ -113,11 +116,13 @@ jobs:
- uses: actions/checkout@v2
with:
submodules: recursive
- run: |
echo "OS_VERSION=`lsb_release -sr`" >> $GITHUB_ENV
- name: Load external libraries
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: libs
key: mingw64-libs-${{ env.BOOST_VERSION }}_${{ env.CURL_VERSION }}_${{ env.OPENSSL_VERSION }}_${{ env.ZLIB_VERSION }}
key: mingw64-libs-${{ env.OS_VERSION }}-${{ env.BOOST_VERSION }}_${{ env.CURL_VERSION }}_${{ env.OPENSSL_VERSION }}_${{ env.ZLIB_VERSION }}
- name: Configure
run: |
LIBS="`pwd`/libs"
Expand All @@ -138,13 +143,13 @@ jobs:
-D GRAPHENE_DISABLE_UNITY_BUILD=ON \
..
- name: Load Cache
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ccache
key: ccache-mingw64-${{ github.ref }}-${{ github.sha }}
key: ccache-mingw64-${{ env.OS_VERSION }}-${{ github.ref }}-${{ github.sha }}
restore-keys: |
ccache-mingw64-${{ github.ref }}-
ccache-mingw64-
ccache-mingw64-${{ env.OS_VERSION }}-${{ github.ref }}-
ccache-mingw64-${{ env.OS_VERSION }}-
- name: Build
run: |
export CCACHE_DIR="$GITHUB_WORKSPACE/ccache"
Expand Down
430 changes: 309 additions & 121 deletions libraries/chain/asset_evaluator.cpp

Large diffs are not rendered by default.

50 changes: 27 additions & 23 deletions libraries/chain/asset_object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ using namespace graphene::chain;

share_type asset_bitasset_data_object::max_force_settlement_volume(share_type current_supply) const
{
if( options.maximum_force_settlement_volume == 0 )
if( 0 == options.maximum_force_settlement_volume )
return 0;
if( options.maximum_force_settlement_volume == GRAPHENE_100_PERCENT )
if( GRAPHENE_100_PERCENT == options.maximum_force_settlement_volume )
return current_supply + force_settled_volume;

fc::uint128_t volume = current_supply.value;
Expand All @@ -49,66 +49,67 @@ void graphene::chain::asset_bitasset_data_object::update_median_feeds( time_poin
{
bool after_core_hardfork_1270 = ( next_maintenance_time > HARDFORK_CORE_1270_TIME ); // call price caching issue
current_feed_publication_time = current_time;
vector<std::reference_wrapper<const price_feed_with_icr>> current_feeds;
vector<std::reference_wrapper<const price_feed_with_icr>> effective_feeds;
// find feeds that were alive at current_time
for( const pair<account_id_type, pair<time_point_sec,price_feed_with_icr>>& f : feeds )
{
if( (current_time - f.second.first).to_seconds() < options.feed_lifetime_sec &&
f.second.first != time_point_sec() )
{
current_feeds.emplace_back(f.second.second);
effective_feeds.emplace_back(f.second.second);
current_feed_publication_time = std::min(current_feed_publication_time, f.second.first);
}
}

// If there are no valid feeds, or the number available is less than the minimum to calculate a median...
if( current_feeds.size() < options.minimum_feeds )
if( effective_feeds.size() < options.minimum_feeds )
{
//... don't calculate a median, and set a null feed
feed_cer_updated = false; // new median cer is null, won't update asset_object anyway, set to false for better performance
current_feed_publication_time = current_time;
current_feed = price_feed_with_icr();
median_feed = price_feed_with_icr();
if( after_core_hardfork_1270 )
{
// update data derived from MCR, ICR and etc
refresh_cache();
}
return;
}
if( current_feeds.size() == 1 )

if( 1u == effective_feeds.size() )
{
if( current_feed.core_exchange_rate != current_feeds.front().get().core_exchange_rate )
if( median_feed.core_exchange_rate != effective_feeds.front().get().core_exchange_rate )
feed_cer_updated = true;
current_feed = current_feeds.front();
median_feed = effective_feeds.front();
// Note: perhaps can defer updating current_maintenance_collateralization for better performance
if( after_core_hardfork_1270 )
{
const auto& exts = options.extensions.value;
if( exts.maintenance_collateral_ratio.valid() )
current_feed.maintenance_collateral_ratio = *exts.maintenance_collateral_ratio;
median_feed.maintenance_collateral_ratio = *exts.maintenance_collateral_ratio;
if( exts.maximum_short_squeeze_ratio.valid() )
current_feed.maximum_short_squeeze_ratio = *exts.maximum_short_squeeze_ratio;
median_feed.maximum_short_squeeze_ratio = *exts.maximum_short_squeeze_ratio;
if( exts.initial_collateral_ratio.valid() )
current_feed.initial_collateral_ratio = *exts.initial_collateral_ratio;
median_feed.initial_collateral_ratio = *exts.initial_collateral_ratio;
// update data derived from MCR, ICR and etc
refresh_cache();
}
return;
}

// *** Begin Median Calculations ***
price_feed_with_icr median_feed;
const auto median_itr = current_feeds.begin() + current_feeds.size() / 2;
price_feed_with_icr tmp_median_feed;
const auto median_itr = effective_feeds.begin() + ( effective_feeds.size() / 2 );
#define CALCULATE_MEDIAN_VALUE(r, data, field_name) \
std::nth_element( current_feeds.begin(), median_itr, current_feeds.end(), \
std::nth_element( effective_feeds.begin(), median_itr, effective_feeds.end(), \
[](const price_feed_with_icr& a, const price_feed_with_icr& b) { \
return a.field_name < b.field_name; \
}); \
median_feed.field_name = median_itr->get().field_name;
tmp_median_feed.field_name = median_itr->get().field_name;

#define CHECK_AND_CALCULATE_MEDIAN_VALUE(r, data, field_name) \
if( options.extensions.value.field_name.valid() ) { \
median_feed.field_name = *options.extensions.value.field_name; \
tmp_median_feed.field_name = *options.extensions.value.field_name; \
} else { \
CALCULATE_MEDIAN_VALUE(r, data, field_name); \
}
Expand All @@ -120,9 +121,9 @@ void graphene::chain::asset_bitasset_data_object::update_median_feeds( time_poin
#undef CALCULATE_MEDIAN_VALUE
// *** End Median Calculations ***

if( current_feed.core_exchange_rate != median_feed.core_exchange_rate )
if( median_feed.core_exchange_rate != tmp_median_feed.core_exchange_rate )
feed_cer_updated = true;
current_feed = median_feed;
median_feed = tmp_median_feed;
// Note: perhaps can defer updating current_maintenance_collateralization for better performance
if( after_core_hardfork_1270 )
{
Expand All @@ -133,14 +134,14 @@ void graphene::chain::asset_bitasset_data_object::update_median_feeds( time_poin

void asset_bitasset_data_object::refresh_cache()
{
current_maintenance_collateralization = current_feed.maintenance_collateralization();
if( current_feed.initial_collateral_ratio > current_feed.maintenance_collateral_ratio ) // if ICR is above MCR
current_initial_collateralization = current_feed.calculate_initial_collateralization();
current_maintenance_collateralization = median_feed.maintenance_collateralization();
if( median_feed.initial_collateral_ratio > median_feed.maintenance_collateral_ratio ) // if ICR is above MCR
current_initial_collateralization = median_feed.get_initial_collateralization();
else // if ICR is not above MCR
current_initial_collateralization = current_maintenance_collateralization;
}

price price_feed_with_icr::calculate_initial_collateralization()const
price price_feed_with_icr::get_initial_collateralization()const
{
if( settlement_price.is_null() )
return price();
Expand Down Expand Up @@ -223,6 +224,7 @@ FC_REFLECT_DERIVED_NO_TYPENAME( graphene::chain::asset_dynamic_data_object, (gra
FC_REFLECT_DERIVED_NO_TYPENAME( graphene::chain::asset_bitasset_data_object, (graphene::db::object),
(asset_id)
(feeds)
(median_feed)
(current_feed)
(current_feed_publication_time)
(current_maintenance_collateralization)
Expand All @@ -232,6 +234,8 @@ FC_REFLECT_DERIVED_NO_TYPENAME( graphene::chain::asset_bitasset_data_object, (gr
(is_prediction_market)
(settlement_price)
(settlement_fund)
(individual_settlement_debt)
(individual_settlement_fund)
(asset_cer_updated)
(feed_cer_updated)
)
Expand Down
46 changes: 46 additions & 0 deletions libraries/chain/db_getter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,12 @@

#include <graphene/chain/database.hpp>

#include <graphene/chain/hardfork.hpp>

#include <graphene/chain/asset_object.hpp>
#include <graphene/chain/chain_property_object.hpp>
#include <graphene/chain/global_property_object.hpp>
#include <graphene/chain/market_object.hpp>
#include <graphene/chain/custom_authority_object.hpp>

namespace graphene { namespace chain {
Expand Down Expand Up @@ -146,4 +149,47 @@ const witness_schedule_object& database::get_witness_schedule_object()const
return *_p_witness_schedule_obj;
}

const limit_order_object* database::find_settled_debt_order( const asset_id_type& a )const
{
const auto& limit_index = get_index_type<limit_order_index>().indices().get<by_is_settled_debt>();
auto itr = limit_index.lower_bound( std::make_tuple( true, a ) );
if( itr != limit_index.end() && itr->receive_asset_id() == a )
return &(*itr);
return nullptr;
}

const call_order_object* database::find_least_collateralized_short( const asset_bitasset_data_object& bitasset,
bool force_by_collateral_index )const
{
bool find_by_collateral = true;
if( !force_by_collateral_index )
// core-1270 hard fork : call price caching issue
find_by_collateral = ( get_dynamic_global_properties().next_maintenance_time > HARDFORK_CORE_1270_TIME );

const call_order_object* call_ptr = nullptr; // place holder

auto call_min = price::min( bitasset.options.short_backing_asset, bitasset.asset_id );

if( !find_by_collateral ) // before core-1270 hard fork, check with call_price
{
const auto& call_price_index = get_index_type<call_order_index>().indices().get<by_price>();
auto call_itr = call_price_index.lower_bound( call_min );
if( call_itr != call_price_index.end() ) // found a call order
call_ptr = &(*call_itr);
}
else // after core-1270 hard fork, check with collateralization
{
// Note: it is safe to check here even if there is no call order due to individual settlements
const auto& call_collateral_index = get_index_type<call_order_index>().indices().get<by_collateral>();
auto call_itr = call_collateral_index.lower_bound( call_min );
if( call_itr != call_collateral_index.end() ) // found a call order
call_ptr = &(*call_itr);
}
if( !call_ptr ) // not found
return nullptr;
if( call_ptr->debt_type() != bitasset.asset_id ) // call order is of another asset
return nullptr;
return call_ptr;
}

} }
26 changes: 7 additions & 19 deletions libraries/chain/db_maint.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -991,19 +991,11 @@ void process_hf_2103( database& db )
}
}

void update_median_feeds(database& db)
static void update_bitasset_current_feeds(database& db)
{
time_point_sec head_time = db.head_block_time();
time_point_sec next_maint_time = db.get_dynamic_global_properties().next_maintenance_time;

const auto update_bitasset = [head_time, next_maint_time]( asset_bitasset_data_object &o )
for( const auto& bitasset : db.get_index_type<asset_bitasset_data_index>().indices() )
{
o.update_median_feeds( head_time, next_maint_time );
};

for( const auto& d : db.get_index_type<asset_bitasset_data_index>().indices() )
{
db.modify( d, update_bitasset );
db.update_bitasset_current_feed( bitasset );
}
}

Expand All @@ -1027,8 +1019,6 @@ void update_median_feeds(database& db)
// feeds were found.
void process_hf_868_890( database& db, bool skip_check_call_orders )
{
const auto next_maint_time = db.get_dynamic_global_properties().next_maintenance_time;
const auto head_time = db.head_block_time();
// for each market issued asset
const auto& asset_idx = db.get_index_type<asset_index>().indices().get<by_type>();
for( auto asset_itr = asset_idx.lower_bound(true); asset_itr != asset_idx.end(); ++asset_itr )
Expand Down Expand Up @@ -1074,11 +1064,9 @@ void process_hf_868_890( database& db, bool skip_check_call_orders )
} // end loop of each feed

// always update the median feed due to https://github.com/bitshares/bitshares-core/issues/890
db.modify( bitasset_data, [head_time,next_maint_time]( asset_bitasset_data_object &obj ) {
obj.update_median_feeds( head_time, next_maint_time );
// NOTE: Normally we should call check_call_orders() after called update_median_feeds(), but for
// mainnet actually check_call_orders() would do nothing, so we skipped it for better performance.
});
db.update_bitasset_current_feed( bitasset_data );
// NOTE: Normally we should call check_call_orders() after called update_bitasset_current_feed(), but for
// mainnet actually check_call_orders() would do nothing, so we skipped it for better performance.

} // for each market issued asset
}
Expand Down Expand Up @@ -1497,7 +1485,7 @@ void database::perform_chain_maintenance(const signed_block& next_block, const g
if( to_update_and_match_call_orders_for_hf_1270 )
{
update_call_orders_hf_1270(*this);
update_median_feeds(*this);
update_bitasset_current_feeds(*this);
match_call_orders(*this);
}

Expand Down
Loading