From c3b2a598b46c2668b9d2eecdb874768796e20cba Mon Sep 17 00:00:00 2001 From: Davor Hirunda Date: Sun, 30 Oct 2022 01:35:43 +0000 Subject: [PATCH] Fix for undo crash --- .../chain/sidechain_address_evaluator.cpp | 14 +++-- tests/tests/sidechain_addresses_test.cpp | 60 +++++++++++++++++-- 2 files changed, 62 insertions(+), 12 deletions(-) diff --git a/libraries/chain/sidechain_address_evaluator.cpp b/libraries/chain/sidechain_address_evaluator.cpp index bd97fef5..0efd54cf 100644 --- a/libraries/chain/sidechain_address_evaluator.cpp +++ b/libraries/chain/sidechain_address_evaluator.cpp @@ -24,9 +24,10 @@ object_id_type add_sidechain_address_evaluator::do_apply(const sidechain_address if (addr_itr != sidechain_addresses_idx.end()) { - db().modify(*addr_itr, [&](sidechain_address_object &sao) { - sao.expires = db().head_block_time(); - }); + //db().modify(*addr_itr, [&](sidechain_address_object &sao) { + // sao.expires = db().head_block_time(); + //}); + db().remove(*addr_itr); } const auto& new_sidechain_address_object = db().create( [&]( sidechain_address_object& obj ){ @@ -106,9 +107,10 @@ void_result delete_sidechain_address_evaluator::do_apply(const sidechain_address const auto& idx = db().get_index_type().indices().get(); auto sidechain_address = idx.find(op.sidechain_address_id); if(sidechain_address != idx.end()) { - db().modify(*sidechain_address, [&](sidechain_address_object &sao) { - sao.expires = db().head_block_time(); - }); + //db().modify(*sidechain_address, [&](sidechain_address_object &sao) { + // sao.expires = db().head_block_time(); + //}); + db().remove(*sidechain_address); } return void_result(); } FC_CAPTURE_AND_RETHROW( (op) ) } diff --git a/tests/tests/sidechain_addresses_test.cpp b/tests/tests/sidechain_addresses_test.cpp index 818c1743..5f4885e6 100644 --- a/tests/tests/sidechain_addresses_test.cpp +++ b/tests/tests/sidechain_addresses_test.cpp @@ -266,18 +266,66 @@ BOOST_AUTO_TEST_CASE( sidechain_address_delete_test ) { sign(trx, alice_private_key); PUSH_TX(db, trx, ~0); } - time_point_sec now = db.head_block_time(); + //time_point_sec now = db.head_block_time(); generate_block(); { BOOST_TEST_MESSAGE("Check sidechain_address_delete_operation results"); const auto& idx = db.get_index_type().indices().get(); - BOOST_REQUIRE( idx.size() == 1 ); - auto obj = idx.find( boost::make_tuple( alice_id, sidechain_type::bitcoin, time_point_sec::maximum() ) ); - BOOST_REQUIRE( obj == idx.end() ); - auto expired_obj = idx.find( boost::make_tuple( alice_id, sidechain_type::bitcoin, now ) ); - BOOST_REQUIRE( expired_obj != idx.end() ); + //BOOST_REQUIRE( idx.size() == 1 ); + //auto obj = idx.find( boost::make_tuple( alice_id, sidechain_type::bitcoin, time_point_sec::maximum() ) ); + //BOOST_REQUIRE( obj == idx.end() ); + //auto expired_obj = idx.find( boost::make_tuple( alice_id, sidechain_type::bitcoin, now ) ); + //BOOST_REQUIRE( expired_obj != idx.end() ); + BOOST_REQUIRE( idx.size() == 0 ); + } +} + +BOOST_AUTO_TEST_CASE(sidechain_address_delete_create_test) { + + BOOST_TEST_MESSAGE("sidechain_address_delete_create_test"); + + INVOKE(sidechain_address_add_test); + + GET_ACTOR(alice); + + const auto &idx = db.get_index_type().indices().get(); + BOOST_REQUIRE(idx.size() == 1); + auto obj = idx.find(boost::make_tuple(alice_id, sidechain_type::bitcoin, time_point_sec::maximum())); + BOOST_REQUIRE(obj != idx.end()); + + { + BOOST_TEST_MESSAGE("Delete and create sidechain address"); + sidechain_address_delete_operation op_del; + op_del.payer = alice_id; + op_del.sidechain_address_id = sidechain_address_id_type(0); + op_del.sidechain_address_account = alice_id; + op_del.sidechain = obj->sidechain; + + sidechain_address_add_operation op_create; + op_create.payer = alice_id; + op_create.sidechain_address_account = alice_id; + op_create.sidechain = sidechain_type::bitcoin; + op_create.deposit_public_key = "deposit_public_key"; + op_create.withdraw_public_key = "withdraw_public_key"; + op_create.withdraw_address = "withdraw_address"; + + trx.operations.push_back(op_del); + trx.operations.push_back(op_create); + sign(trx, alice_private_key); + PUSH_TX(db, trx, ~0); + } + + // both transactions should goes in one block (delete + create) + generate_block(); + + { + BOOST_TEST_MESSAGE("Check sidechain_address_delete_add_operation results"); + const auto &idx = db.get_index_type().indices().get(); + BOOST_REQUIRE(idx.size() == 1); + auto obj = idx.find(boost::make_tuple(alice_id, sidechain_type::bitcoin, time_point_sec::maximum())); + BOOST_REQUIRE(obj != idx.end()); } }