From 54e6850332c0be14991fcc85214a8dfdb4175a7b Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 24 Jun 2019 17:59:49 +0200 Subject: [PATCH 1/3] Fixes #1692 --- libraries/chain/hardfork.d/CORE_1692.hf | 4 ++++ libraries/chain/market_evaluator.cpp | 22 +++++++++++++++------- tests/tests/swan_tests.cpp | 22 ++++++++++++++++++++++ 3 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 libraries/chain/hardfork.d/CORE_1692.hf diff --git a/libraries/chain/hardfork.d/CORE_1692.hf b/libraries/chain/hardfork.d/CORE_1692.hf new file mode 100644 index 0000000000..cbbe42c4ae --- /dev/null +++ b/libraries/chain/hardfork.d/CORE_1692.hf @@ -0,0 +1,4 @@ +// bitshares-core issue #1692 validation check of bid_collateral +#ifndef HARDFORK_CORE_1692_TIME +#define HARDFORK_CORE_1692_TIME (fc::time_point_sec( 1600000000 ) ) // Sep 2020 +#endif diff --git a/libraries/chain/market_evaluator.cpp b/libraries/chain/market_evaluator.cpp index 17d1164362..fa6b590632 100644 --- a/libraries/chain/market_evaluator.cpp +++ b/libraries/chain/market_evaluator.cpp @@ -391,13 +391,6 @@ void_result bid_collateral_evaluator::do_evaluate(const bid_collateral_operation FC_ASSERT( !_bitasset_data->is_prediction_market, "Cannot bid on a prediction market!" ); - if( o.additional_collateral.amount > 0 ) - { - FC_ASSERT( d.get_balance(*_paying_account, _bitasset_data->options.short_backing_asset(d)) >= o.additional_collateral, - "Cannot bid ${c} collateral when payer only has ${b}", ("c", o.additional_collateral.amount) - ("b", d.get_balance(*_paying_account, o.additional_collateral.asset_id(d)).amount) ); - } - const collateral_bid_index& bids = d.get_index_type(); const auto& index = bids.indices().get(); const auto& bid = index.find( boost::make_tuple( o.debt_covered.asset_id, o.bidder ) ); @@ -406,6 +399,21 @@ void_result bid_collateral_evaluator::do_evaluate(const bid_collateral_operation else FC_ASSERT( o.debt_covered.amount > 0, "Can't find bid to cancel?!"); + if( o.additional_collateral.amount > 0 ) + { + if( _bid && d.head_block_time() >= HARDFORK_CORE_1692_TIME ) + { + asset delta = o.additional_collateral - _bid->get_additional_collateral(); + FC_ASSERT( d.get_balance(*_paying_account, _bitasset_data->options.short_backing_asset(d)) >= delta, + "Cannot increase bid from ${oc} to ${nc} collateral when payer only has ${b}", + ("oc", _bid->get_additional_collateral().amount)("nc", o.additional_collateral.amount) + ("b", d.get_balance(*_paying_account, o.additional_collateral.asset_id(d)).amount) ); + } else + FC_ASSERT( d.get_balance(*_paying_account, _bitasset_data->options.short_backing_asset(d)) >= o.additional_collateral, + "Cannot bid ${c} collateral when payer only has ${b}", ("c", o.additional_collateral.amount) + ("b", d.get_balance(*_paying_account, o.additional_collateral.asset_id(d)).amount) ); + } + return void_result(); } FC_CAPTURE_AND_RETHROW( (o) ) } diff --git a/tests/tests/swan_tests.cpp b/tests/tests/swan_tests.cpp index 54f233c66a..c58c93238e 100644 --- a/tests/tests/swan_tests.cpp +++ b/tests/tests/swan_tests.cpp @@ -406,6 +406,28 @@ BOOST_AUTO_TEST_CASE( recollateralize ) } } +/** Creates a black swan, bid, adjust bid before/after hf_1692 + */ +BOOST_AUTO_TEST_CASE( bid_issue_1692 ) +{ try { + init_standard_swan( 700 ); + + generate_blocks( HARDFORK_CORE_1692_TIME - 30 ); + + int64_t b2_balance = get_balance( borrower2(), back() ); + bid_collateral( borrower2(), back().amount(1000), swan().amount(100) ); + BOOST_CHECK_EQUAL( get_balance( borrower2(), back() ), b2_balance - 1000 ); + GRAPHENE_REQUIRE_THROW( bid_collateral( borrower2(), back().amount(b2_balance), swan().amount(200) ), fc::assert_exception ); + GRAPHENE_REQUIRE_THROW( bid_collateral( borrower2(), back().amount(b2_balance-999), swan().amount(200) ), fc::assert_exception ); + + generate_blocks( HARDFORK_CORE_1692_TIME + 30 ); + + bid_collateral( borrower2(), back().amount(b2_balance-999), swan().amount(200) ); + BOOST_CHECK_EQUAL( get_balance( borrower2(), back() ), 999 ); + bid_collateral( borrower2(), back().amount(b2_balance), swan().amount(200) ); + BOOST_CHECK_EQUAL( get_balance( borrower2(), back() ), 0 ); +} FC_LOG_AND_RETHROW() } + /** Creates a black swan, settles all debts, recovers price feed - asset should be revived */ BOOST_AUTO_TEST_CASE( revive_empty_recovered ) From 8d3f7faced4701491ac9c36f2fa583381d7ea6e7 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 5 Aug 2019 15:54:22 +0200 Subject: [PATCH 2/3] Wrapped long lines --- libraries/chain/market_evaluator.cpp | 3 ++- tests/tests/swan_tests.cpp | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/libraries/chain/market_evaluator.cpp b/libraries/chain/market_evaluator.cpp index fa6b590632..bfe9718067 100644 --- a/libraries/chain/market_evaluator.cpp +++ b/libraries/chain/market_evaluator.cpp @@ -409,7 +409,8 @@ void_result bid_collateral_evaluator::do_evaluate(const bid_collateral_operation ("oc", _bid->get_additional_collateral().amount)("nc", o.additional_collateral.amount) ("b", d.get_balance(*_paying_account, o.additional_collateral.asset_id(d)).amount) ); } else - FC_ASSERT( d.get_balance(*_paying_account, _bitasset_data->options.short_backing_asset(d)) >= o.additional_collateral, + FC_ASSERT( d.get_balance( *_paying_account, + _bitasset_data->options.short_backing_asset(d) ) >= o.additional_collateral, "Cannot bid ${c} collateral when payer only has ${b}", ("c", o.additional_collateral.amount) ("b", d.get_balance(*_paying_account, o.additional_collateral.asset_id(d)).amount) ); } diff --git a/tests/tests/swan_tests.cpp b/tests/tests/swan_tests.cpp index c58c93238e..67cfb200cf 100644 --- a/tests/tests/swan_tests.cpp +++ b/tests/tests/swan_tests.cpp @@ -417,8 +417,10 @@ BOOST_AUTO_TEST_CASE( bid_issue_1692 ) int64_t b2_balance = get_balance( borrower2(), back() ); bid_collateral( borrower2(), back().amount(1000), swan().amount(100) ); BOOST_CHECK_EQUAL( get_balance( borrower2(), back() ), b2_balance - 1000 ); - GRAPHENE_REQUIRE_THROW( bid_collateral( borrower2(), back().amount(b2_balance), swan().amount(200) ), fc::assert_exception ); - GRAPHENE_REQUIRE_THROW( bid_collateral( borrower2(), back().amount(b2_balance-999), swan().amount(200) ), fc::assert_exception ); + GRAPHENE_REQUIRE_THROW( bid_collateral( borrower2(), back().amount(b2_balance), swan().amount(200) ), + fc::assert_exception ); + GRAPHENE_REQUIRE_THROW( bid_collateral( borrower2(), back().amount(b2_balance-999), swan().amount(200) ), + fc::assert_exception ); generate_blocks( HARDFORK_CORE_1692_TIME + 30 ); From fc3e6b871d0ad101310d223594740afe8bc86275 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Mon, 5 Aug 2019 18:33:59 +0200 Subject: [PATCH 3/3] Added TODO about HF check --- libraries/chain/market_evaluator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/chain/market_evaluator.cpp b/libraries/chain/market_evaluator.cpp index bfe9718067..3d38a203aa 100644 --- a/libraries/chain/market_evaluator.cpp +++ b/libraries/chain/market_evaluator.cpp @@ -401,7 +401,7 @@ void_result bid_collateral_evaluator::do_evaluate(const bid_collateral_operation if( o.additional_collateral.amount > 0 ) { - if( _bid && d.head_block_time() >= HARDFORK_CORE_1692_TIME ) + if( _bid && d.head_block_time() >= HARDFORK_CORE_1692_TIME ) // TODO: see if HF check can be removed after HF { asset delta = o.additional_collateral - _bid->get_additional_collateral(); FC_ASSERT( d.get_balance(*_paying_account, _bitasset_data->options.short_backing_asset(d)) >= delta,