diff --git a/libraries/chain/bitcoin_transaction_evaluator.cpp b/libraries/chain/bitcoin_transaction_evaluator.cpp index 0de58848..c3c0ccf5 100644 --- a/libraries/chain/bitcoin_transaction_evaluator.cpp +++ b/libraries/chain/bitcoin_transaction_evaluator.cpp @@ -247,6 +247,8 @@ void_result bitcoin_transaction_revert_evaluator::do_apply( const bitcoin_transa for( auto trx_info: op.transactions_info ) { const auto& btc_trx_obj = *btc_trx_idx.find( trx_info.transaction_id ); + d.pw_vout_manager.delete_vouts_after( btc_trx_obj.pw_vin ); + d.pw_vout_manager.mark_as_unused_vout( btc_trx_obj.pw_vin ); for( const auto& vout_id : btc_trx_obj.vouts ) { const auto& vout_obj = *vouts_info_idx.find( vout_id ); diff --git a/libraries/chain/db_sidechain.cpp b/libraries/chain/db_sidechain.cpp index 0e1a4f66..d4e1016b 100644 --- a/libraries/chain/db_sidechain.cpp +++ b/libraries/chain/db_sidechain.cpp @@ -349,12 +349,12 @@ fc::optional database::create_bitcoin_issue_proposals( const witness_ fc::optional database::create_bitcoin_revert_proposals( const witness_object& current_witness ) { - using iter_by_missing = btc_tx_confirmations_index::index::type::iterator; + using iter_by_missing = btc_tx_confirmations_index::index::type::iterator; std::vector trx_info; - bitcoin_confirmations.safe_for([&]( iter_by_missing itr_b, iter_by_missing itr_e ){ + bitcoin_confirmations.safe_for([&]( iter_by_missing itr_b, iter_by_missing itr_e ){ for(auto iter = itr_b; iter != itr_e; iter++) { - if( !iter->missing ) return; + if( !iter->is_missing_and_not_used() ) return; const auto& btc_trx_idx = get_index_type().indices().get(); const auto& btc_tx = btc_trx_idx.find( iter->transaction_id ); diff --git a/libraries/sidechain/include/sidechain/bitcoin_transaction_confirmations.hpp b/libraries/sidechain/include/sidechain/bitcoin_transaction_confirmations.hpp index bd06f91f..5b32aad2 100644 --- a/libraries/sidechain/include/sidechain/bitcoin_transaction_confirmations.hpp +++ b/libraries/sidechain/include/sidechain/bitcoin_transaction_confirmations.hpp @@ -35,6 +35,7 @@ struct bitcoin_transaction_confirmations uint64_t id; bool is_confirmed_and_not_used() const { return !used && confirmed; } + bool is_missing_and_not_used() const { return !used && missing; } fc::sha256 transaction_id; std::set valid_vins; @@ -47,13 +48,13 @@ struct bitcoin_transaction_confirmations struct by_hash; struct by_confirmed_and_not_used; -struct by_missing_first; +struct by_missing_and_not_used; using btc_tx_confirmations_index = boost::multi_index_container, member>, ordered_non_unique, identity< bitcoin_transaction_confirmations >, bitcoin_transaction_confirmations::comparer >, - ordered_non_unique, member, std::greater> + ordered_non_unique, identity< bitcoin_transaction_confirmations >, bitcoin_transaction_confirmations::comparer > > >; diff --git a/libraries/sidechain/include/sidechain/primary_wallet_vout_manager.hpp b/libraries/sidechain/include/sidechain/primary_wallet_vout_manager.hpp index 1a21a3dd..874c4c88 100644 --- a/libraries/sidechain/include/sidechain/primary_wallet_vout_manager.hpp +++ b/libraries/sidechain/include/sidechain/primary_wallet_vout_manager.hpp @@ -25,7 +25,7 @@ public: void create_new_vout( const sidechain::prev_out& out ); - void delete_vout_with_newer( fc::sha256 hash_id ); + void delete_vouts_after( fc::sha256 hash_id ); void confirm_vout( fc::sha256 hash_id ); diff --git a/libraries/sidechain/primary_wallet_vout_manager.cpp b/libraries/sidechain/primary_wallet_vout_manager.cpp index 97bd31ba..c7c9ccaa 100644 --- a/libraries/sidechain/primary_wallet_vout_manager.cpp +++ b/libraries/sidechain/primary_wallet_vout_manager.cpp @@ -44,7 +44,7 @@ void primary_wallet_vout_manager::create_new_vout( const sidechain::prev_out& ou }); } -void primary_wallet_vout_manager::delete_vout_with_newer( fc::sha256 hash_id ) +void primary_wallet_vout_manager::delete_vouts_after( fc::sha256 hash_id ) { const auto& PW_vout_by_id = db.get_index_type().indices().get< graphene::chain::by_id >(); auto vout_id = get_vout_id( hash_id ); @@ -52,6 +52,7 @@ void primary_wallet_vout_manager::delete_vout_with_newer( fc::sha256 hash_id ) return; auto itr = PW_vout_by_id.find( *vout_id ); + itr++; while( itr != PW_vout_by_id.end() ) { diff --git a/tests/sidechain_tests/primary_wallet_vout_manager_tests.cpp b/tests/sidechain_tests/primary_wallet_vout_manager_tests.cpp index 7d2122a8..19f7f4ae 100644 --- a/tests/sidechain_tests/primary_wallet_vout_manager_tests.cpp +++ b/tests/sidechain_tests/primary_wallet_vout_manager_tests.cpp @@ -78,28 +78,28 @@ BOOST_AUTO_TEST_CASE( delete_pw_vout_objects ) BOOST_CHECK_EQUAL( idx.size(), 25 ); auto pw_vout = *pw_vout_manager.get_latest_unused_vout(); - pw_vout_manager.delete_vout_with_newer( create_hash_id( pw_vout.vout.hash_tx, pw_vout.vout.n_vout, pw_vout.id.instance() ) ); - BOOST_CHECK_EQUAL( idx.size(), 24 ); + pw_vout_manager.delete_vouts_after( create_hash_id( pw_vout.vout.hash_tx, pw_vout.vout.n_vout, pw_vout.id.instance() ) ); + BOOST_CHECK_EQUAL( idx.size(), 25 ); - pw_vout_manager.delete_vout_with_newer( create_hash_id( "13", 13, 13 ) ); + pw_vout_manager.delete_vouts_after( create_hash_id( "13", 13, 13 ) ); - BOOST_CHECK_EQUAL( idx.size(), 13 ); + BOOST_CHECK_EQUAL( idx.size(), 14 ); for( auto itr: idx ) { BOOST_CHECK( itr.hash_id == create_hash_id( itr.vout.hash_tx, itr.vout.n_vout, itr.id.instance() ) ); } create_primary_wallet_vouts( pw_vout_manager, db, 8 ); - pw_vout_manager.delete_vout_with_newer( create_hash_id( "20", 20, 20 ) ); - BOOST_CHECK_EQUAL( idx.size(), 21 ); + pw_vout_manager.delete_vouts_after( create_hash_id( "20", 20, 20 ) ); + BOOST_CHECK_EQUAL( idx.size(), 22 ); for( auto itr: idx ) { BOOST_CHECK( itr.hash_id == create_hash_id( itr.vout.hash_tx, itr.vout.n_vout, itr.id.instance() ) ); } auto itr_primary_wallet = idx.begin(); - pw_vout_manager.delete_vout_with_newer( create_hash_id( itr_primary_wallet->vout.hash_tx, itr_primary_wallet->vout.n_vout, itr_primary_wallet->id.instance() ) ); - BOOST_CHECK_EQUAL( idx.size(), 0 ); + pw_vout_manager.delete_vouts_after( create_hash_id( itr_primary_wallet->vout.hash_tx, itr_primary_wallet->vout.n_vout, itr_primary_wallet->id.instance() ) ); + BOOST_CHECK_EQUAL( idx.size(), 1 ); } BOOST_AUTO_TEST_CASE( confirm_pw_vout_objects ) diff --git a/tests/sidechain_tests/sidechain_proposal_checker_tests.cpp b/tests/sidechain_tests/sidechain_proposal_checker_tests.cpp index 2c573291..efd3ce62 100644 --- a/tests/sidechain_tests/sidechain_proposal_checker_tests.cpp +++ b/tests/sidechain_tests/sidechain_proposal_checker_tests.cpp @@ -313,14 +313,14 @@ void create_missing_bto( graphene::chain::database& db, uint32_t amount ) std::vector< revert_trx_info > get_transactions_info( graphene::chain::database& db, uint32_t amount ) { - using iter_by_missing = btc_tx_confirmations_index::index::type::iterator; + using iter_by_missing = btc_tx_confirmations_index::index::type::iterator; std::vector< revert_trx_info > transactions_info; const auto& btc_trx_idx = db.get_index_type().indices().get(); BOOST_CHECK_EQUAL( btc_trx_idx.size() , amount ); - db.bitcoin_confirmations.safe_for([&]( iter_by_missing itr_b, iter_by_missing itr_e ){ + db.bitcoin_confirmations.safe_for([&]( iter_by_missing itr_b, iter_by_missing itr_e ){ for(auto iter = itr_b; iter != itr_e; iter++) { - if( !iter->missing ) return; + if( !iter->is_missing_and_not_used() ) return; const auto& btc_tx = btc_trx_idx.find( iter->transaction_id ); if( btc_tx == btc_trx_idx.end() ) continue; transactions_info.push_back( revert_trx_info( iter->transaction_id, iter->valid_vins ) );