From 610490ef81074323897b1cffdbf9cec2750af1ca Mon Sep 17 00:00:00 2001 From: obucinac Date: Mon, 21 Oct 2019 15:44:09 +0200 Subject: [PATCH] Active SONs, list up to 15, order by votes, add test (#185) * Add test for selecting 15 SONs with highest votes * Display up to 15 active SONs, SON ordering by total_votes --- libraries/chain/db_maint.cpp | 5 +- .../graphene/chain/global_property_object.hpp | 4 +- tests/cli/main.cpp | 747 ++++++++++++++++++ 3 files changed, 750 insertions(+), 6 deletions(-) diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index 6646d2e1..cae17eda 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -393,10 +393,9 @@ void database::update_active_sons() } } - const chain_property_object& cpo = get_chain_properties(); - auto sons = sort_votable_objects(std::max(son_count*2+1, (size_t)cpo.immutable_parameters.min_son_count)); - const global_property_object& gpo = get_global_properties(); + const chain_parameters& cp = gpo.parameters; + auto sons = sort_votable_objects(cp.maximum_son_count); const auto& all_sons = get_index_type().indices(); diff --git a/libraries/chain/include/graphene/chain/global_property_object.hpp b/libraries/chain/include/graphene/chain/global_property_object.hpp index cb93fcf1..130648e9 100644 --- a/libraries/chain/include/graphene/chain/global_property_object.hpp +++ b/libraries/chain/include/graphene/chain/global_property_object.hpp @@ -51,9 +51,7 @@ namespace graphene { namespace chain { uint32_t next_available_vote_id = 0; vector active_committee_members; // updated once per maintenance interval flat_set active_witnesses; // updated once per maintenance interval - // n.b. witness scheduling is done by witness_schedule object - - flat_set active_sons; // updated once per maintenance interval + vector active_sons; // updated once per maintenance interval }; /** diff --git a/tests/cli/main.cpp b/tests/cli/main.cpp index c4739c09..2f64f481 100644 --- a/tests/cli/main.cpp +++ b/tests/cli/main.cpp @@ -624,6 +624,753 @@ BOOST_FIXTURE_TEST_CASE( create_son, cli_fixture ) BOOST_TEST_MESSAGE("SON cli wallet tests end"); } +BOOST_FIXTURE_TEST_CASE( select_top_fifteen_sons, cli_fixture ) +{ + BOOST_TEST_MESSAGE("SON cli wallet tests begin"); + try + { + INVOKE(upgrade_nathan_account); + + graphene::wallet::brain_key_info bki; + signed_transaction create_tx; + signed_transaction transfer_tx; + signed_transaction upgrade_tx; + signed_transaction vote_tx; + account_object acc_before_upgrade, acc_after_upgrade; + son_object son_obj; + global_property_object gpo; + + // create sonaccount01 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount01", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount01", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount01 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount01"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount01", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount01"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount01 + BOOST_TEST_MESSAGE("Upgrading sonaccount01 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount01", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount01"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount02 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount02", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount02", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount02 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount02"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount02", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount02"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount02 + BOOST_TEST_MESSAGE("Upgrading sonaccount02 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount02", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount02"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount03 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount03", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount03", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount03 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount03"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount03", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount03"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount03 + BOOST_TEST_MESSAGE("Upgrading sonaccount03 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount03", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount03"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount04 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount04", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount04", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount04 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount04"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount04", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount04"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount04 + BOOST_TEST_MESSAGE("Upgrading sonaccount04 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount04", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount04"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount05 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount05", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount05", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount05 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount05"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount05", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount05"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount05 + BOOST_TEST_MESSAGE("Upgrading sonaccount05 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount05", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount05"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount06 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount06", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount06", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount06 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount06"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount06", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount06"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount06 + BOOST_TEST_MESSAGE("Upgrading sonaccount06 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount06", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount06"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount07 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount07", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount07", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount07 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount07"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount07", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount07"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount07 + BOOST_TEST_MESSAGE("Upgrading sonaccount07 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount07", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount07"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount08 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount08", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount08", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount08 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount08"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount08", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount08"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount08 + BOOST_TEST_MESSAGE("Upgrading sonaccount08 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount08", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount08"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount09 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount09", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount09", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount09 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount09"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount09", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount09"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount09 + BOOST_TEST_MESSAGE("Upgrading sonaccount09 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount09", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount09"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount10 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount10", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount10", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount10 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount10"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount10", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount10"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount10 + BOOST_TEST_MESSAGE("Upgrading sonaccount10 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount10", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount10"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount11 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount11", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount11", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount11 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount11"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount11", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount11"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount11 + BOOST_TEST_MESSAGE("Upgrading sonaccount11 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount11", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount11"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount12 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount12", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount12", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount12 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount12"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount12", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount12"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount12 + BOOST_TEST_MESSAGE("Upgrading sonaccount12 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount12", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount12"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount13 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount13", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount13", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount13 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount13"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount13", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount13"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount13 + BOOST_TEST_MESSAGE("Upgrading sonaccount13 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount13", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount13"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount14 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount14", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount14", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount14 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount14"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount14", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount14"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount14 + BOOST_TEST_MESSAGE("Upgrading sonaccount14 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount14", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount14"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount15 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount15", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount15", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount15 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount15"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount15", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount15"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount15 + BOOST_TEST_MESSAGE("Upgrading sonaccount15 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount15", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount15"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create sonaccount16 + bki = con.wallet_api_ptr->suggest_brain_key(); + BOOST_CHECK(!bki.brain_priv_key.empty()); + create_tx = con.wallet_api_ptr->create_account_with_brain_key( + bki.brain_priv_key, "sonaccount16", "nathan", "nathan", true + ); + // save the private key for this new account in the wallet file + BOOST_CHECK(con.wallet_api_ptr->import_key("sonaccount16", bki.wif_priv_key)); + con.wallet_api_ptr->save_wallet_file(con.wallet_filename); + + // attempt to give sonaccount16 some CORE tokens + BOOST_TEST_MESSAGE("Transferring CORE tokens from Nathan to sonaccount16"); + transfer_tx = con.wallet_api_ptr->transfer( + "nathan", "sonaccount16", "15000", "1.3.0", "Here are some CORE token for your new account", true + ); + + acc_before_upgrade = con.wallet_api_ptr->get_account("sonaccount16"); + BOOST_CHECK(generate_block(app1)); + + // upgrade sonaccount16 + BOOST_TEST_MESSAGE("Upgrading sonaccount16 to LTM"); + upgrade_tx = con.wallet_api_ptr->upgrade_account("sonaccount16", true); + acc_after_upgrade = con.wallet_api_ptr->get_account("sonaccount16"); + + // verify that the upgrade was successful + BOOST_CHECK_PREDICATE( + std::not_equal_to(), + (acc_before_upgrade.membership_expiration_date.sec_since_epoch()) + (acc_after_upgrade.membership_expiration_date.sec_since_epoch()) + ); + BOOST_CHECK(acc_after_upgrade.is_lifetime_member()); + + BOOST_CHECK(generate_block(app1)); + + + + // create 16 SONs + BOOST_TEST_MESSAGE("Creating 16 SONs"); + create_tx = con.wallet_api_ptr->create_son("sonaccount01", "http://son01", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount02", "http://son02", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount03", "http://son03", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount04", "http://son04", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount05", "http://son05", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount06", "http://son06", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount07", "http://son07", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount08", "http://son08", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount09", "http://son09", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount10", "http://son10", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount11", "http://son11", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount12", "http://son12", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount13", "http://son13", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount14", "http://son14", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount15", "http://son15", "true"); + create_tx = con.wallet_api_ptr->create_son("sonaccount16", "http://son16", "true"); + BOOST_CHECK(generate_maintenance_block(app1)); + + son_obj = con.wallet_api_ptr->get_son("sonaccount01"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount01")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son01"); + son_obj = con.wallet_api_ptr->get_son("sonaccount02"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount02")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son02"); + son_obj = con.wallet_api_ptr->get_son("sonaccount03"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount03")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son03"); + son_obj = con.wallet_api_ptr->get_son("sonaccount04"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount04")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son04"); + son_obj = con.wallet_api_ptr->get_son("sonaccount05"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount05")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son05"); + son_obj = con.wallet_api_ptr->get_son("sonaccount06"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount06")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son06"); + son_obj = con.wallet_api_ptr->get_son("sonaccount07"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount07")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son07"); + son_obj = con.wallet_api_ptr->get_son("sonaccount08"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount08")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son08"); + son_obj = con.wallet_api_ptr->get_son("sonaccount09"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount09")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son09"); + son_obj = con.wallet_api_ptr->get_son("sonaccount10"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount10")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son10"); + son_obj = con.wallet_api_ptr->get_son("sonaccount11"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount11")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son11"); + son_obj = con.wallet_api_ptr->get_son("sonaccount12"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount12")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son12"); + son_obj = con.wallet_api_ptr->get_son("sonaccount13"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount13")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son13"); + son_obj = con.wallet_api_ptr->get_son("sonaccount14"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount14")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son14"); + son_obj = con.wallet_api_ptr->get_son("sonaccount15"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount15")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son15"); + son_obj = con.wallet_api_ptr->get_son("sonaccount16"); + BOOST_CHECK(son_obj.son_account == con.wallet_api_ptr->get_account_id("sonaccount16")); + BOOST_CHECK_EQUAL(son_obj.url, "http://son16"); + + + + BOOST_TEST_MESSAGE("Voting for SONs"); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount01", "sonaccount01", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount02", "sonaccount02", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount03", "sonaccount03", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount04", "sonaccount04", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount05", "sonaccount05", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount06", "sonaccount06", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount07", "sonaccount07", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount08", "sonaccount08", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount09", "sonaccount09", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount10", "sonaccount10", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount11", "sonaccount11", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount12", "sonaccount12", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount13", "sonaccount13", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount14", "sonaccount14", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount15", "sonaccount15", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount16", "sonaccount16", true, true); + BOOST_CHECK(generate_maintenance_block(app1)); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount01", "sonaccount02", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount02", "sonaccount03", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount03", "sonaccount04", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount04", "sonaccount05", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount05", "sonaccount06", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount06", "sonaccount07", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount07", "sonaccount08", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount08", "sonaccount09", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount09", "sonaccount10", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount10", "sonaccount11", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount11", "sonaccount12", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount12", "sonaccount13", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount13", "sonaccount14", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount14", "sonaccount15", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount15", "sonaccount16", true, true); + gpo = con.wallet_api_ptr->get_global_properties(); + BOOST_TEST_MESSAGE("gpo: " << gpo.active_sons.size()); + BOOST_CHECK(generate_maintenance_block(app1)); + gpo = con.wallet_api_ptr->get_global_properties(); + BOOST_TEST_MESSAGE("gpo: " << gpo.active_sons.size()); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount03", "sonaccount01", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount04", "sonaccount02", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount05", "sonaccount03", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount06", "sonaccount04", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount07", "sonaccount05", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount08", "sonaccount06", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount09", "sonaccount07", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount10", "sonaccount08", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount11", "sonaccount09", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount12", "sonaccount10", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount13", "sonaccount11", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount14", "sonaccount12", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount15", "sonaccount13", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount16", "sonaccount14", true, true); + gpo = con.wallet_api_ptr->get_global_properties(); + BOOST_TEST_MESSAGE("gpo: " << gpo.active_sons.size()); + BOOST_CHECK(generate_maintenance_block(app1)); + gpo = con.wallet_api_ptr->get_global_properties(); + BOOST_TEST_MESSAGE("gpo: " << gpo.active_sons.size()); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount04", "sonaccount01", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount05", "sonaccount02", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount06", "sonaccount03", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount07", "sonaccount04", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount08", "sonaccount05", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount09", "sonaccount06", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount10", "sonaccount07", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount11", "sonaccount08", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount12", "sonaccount09", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount13", "sonaccount10", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount14", "sonaccount11", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount15", "sonaccount12", true, true); + vote_tx = con.wallet_api_ptr->vote_for_son("sonaccount16", "sonaccount13", true, true); + gpo = con.wallet_api_ptr->get_global_properties(); + BOOST_TEST_MESSAGE("gpo: " << gpo.active_sons.size()); + BOOST_CHECK(generate_maintenance_block(app1)); + + BOOST_CHECK(gpo.active_sons.size() == 15); + + } catch( fc::exception& e ) { + BOOST_TEST_MESSAGE("SON cli wallet tests exception"); + edump((e.to_detail_string())); + throw; + } + BOOST_TEST_MESSAGE("SON cli wallet tests end"); +} + /////////////////////// // Check account history pagination ///////////////////////