From 9d503e7802cc8d0c09f27ce41c00eb7ec72cf191 Mon Sep 17 00:00:00 2001 From: sierra19XX <15652887+sierra19XX@users.noreply.github.com> Date: Sat, 3 Oct 2020 02:52:59 +1000 Subject: [PATCH] nft_lottery4 - add config based ticket deletion, progressive jackpot, db, cli changes --- libraries/chain/db_init.cpp | 5 ++- libraries/chain/db_notify.cpp | 2 + .../include/graphene/chain/nft_object.hpp | 44 +++++++++++++++---- .../graphene/chain/protocol/nft_ops.hpp | 4 +- .../include/graphene/chain/protocol/types.hpp | 7 ++- libraries/chain/nft_evaluator.cpp | 27 +++++++++++- libraries/chain/nft_lottery_evaluator.cpp | 16 ++++--- libraries/chain/nft_lottery_object.cpp | 22 +++++----- .../wallet/include/graphene/wallet/wallet.hpp | 4 ++ libraries/wallet/wallet.cpp | 19 ++++++++ tests/common/database_fixture.cpp | 2 +- tests/tests/nft_lottery_tests.cpp | 32 +++++++------- 12 files changed, 136 insertions(+), 48 deletions(-) diff --git a/libraries/chain/db_init.cpp b/libraries/chain/db_init.cpp index 5fc7f341..0d5f4bb8 100644 --- a/libraries/chain/db_init.cpp +++ b/libraries/chain/db_init.cpp @@ -192,6 +192,9 @@ const uint8_t offer_history_object::type_id; const uint8_t account_role_object::space_id; const uint8_t account_role_object::type_id; +const uint8_t nft_lottery_balance_object::space_id; +const uint8_t nft_lottery_balance_object::type_id; + void database::initialize_evaluators() { _operation_evaluators.resize(255); @@ -366,7 +369,7 @@ void database::initialize_indexes() add_index< primary_index >(); add_index< primary_index >(); add_index< primary_index >(); - + add_index< primary_index >(); } void database::init_genesis(const genesis_state_type& genesis_state) diff --git a/libraries/chain/db_notify.cpp b/libraries/chain/db_notify.cpp index 20700dc8..9174140b 100644 --- a/libraries/chain/db_notify.cpp +++ b/libraries/chain/db_notify.cpp @@ -508,6 +508,8 @@ void get_relevant_accounts( const object* obj, flat_set& accoun break; case impl_fba_accumulator_object_type: break; + case impl_nft_lottery_balance_object_type: + break; } } } // end get_relevant_accounts( const object* obj, flat_set& accounts ) diff --git a/libraries/chain/include/graphene/chain/nft_object.hpp b/libraries/chain/include/graphene/chain/nft_object.hpp index dc7f2b77..fe026da5 100644 --- a/libraries/chain/include/graphene/chain/nft_object.hpp +++ b/libraries/chain/include/graphene/chain/nft_object.hpp @@ -6,14 +6,27 @@ namespace graphene { namespace chain { using namespace graphene::db; + class nft_lottery_balance_object : public abstract_object + { + public: + static const uint8_t space_id = implementation_ids; + static const uint8_t type_id = impl_nft_lottery_balance_object_type; + + // Total Progressive jackpot carried over from previous lotteries + asset total_progressive_jackpot; + // Current total jackpot in this lottery inclusive of the progressive jackpot + asset jackpot; + // Total tickets sold + share_type sweeps_tickets_sold; + }; + struct nft_lottery_data { nft_lottery_data() {} - nft_lottery_data(const nft_lottery_options &options) - : lottery_options(options), jackpot(asset(0, options.ticket_price.asset_id)) {} + nft_lottery_data(const nft_lottery_options &options, nft_lottery_balance_id_type lottery_id) + : lottery_options(options), lottery_balance_id(lottery_id) {} nft_lottery_options lottery_options; - asset jackpot; - share_type sweeps_tickets_sold; + nft_lottery_balance_id_type lottery_balance_id; }; class nft_metadata_object : public abstract_object @@ -38,10 +51,10 @@ namespace graphene { namespace chain { bool is_lottery() const { return lottery_data.valid(); } uint32_t get_owner_num() const { return owner.instance.value; } time_point_sec get_lottery_expiration() const; - asset get_lottery_jackpot() const; - share_type get_token_current_supply(database &db) const; - vector get_holders(database &db) const; - vector get_ticket_ids(database &db) const; + asset get_lottery_jackpot(const database &db) const; + share_type get_token_current_supply(const database &db) const; + vector get_holders(const database &db) const; + vector get_ticket_ids(const database &db) const; void distribute_benefactors_part(database &db); map> distribute_winners_part(database &db); void distribute_sweeps_holders_part(database &db); @@ -154,9 +167,22 @@ namespace graphene { namespace chain { >; using nft_index = generic_index; + using nft_lottery_balance_index_type = multi_index_container< + nft_lottery_balance_object, + indexed_by< + ordered_unique< tag, member< object, object_id_type, &object::id > > + > + >; + using nft_lottery_balance_index = generic_index; + } } // graphene::chain -FC_REFLECT( graphene::chain::nft_lottery_data, (lottery_options)(jackpot)(sweeps_tickets_sold) ) +FC_REFLECT_DERIVED( graphene::chain::nft_lottery_balance_object, (graphene::db::object), + (total_progressive_jackpot) + (jackpot) + (sweeps_tickets_sold) ) + +FC_REFLECT( graphene::chain::nft_lottery_data, (lottery_options)(lottery_balance_id) ) FC_REFLECT_DERIVED( graphene::chain::nft_metadata_object, (graphene::db::object), (owner) diff --git a/libraries/chain/include/graphene/chain/protocol/nft_ops.hpp b/libraries/chain/include/graphene/chain/protocol/nft_ops.hpp index 3809b9e3..4028a986 100644 --- a/libraries/chain/include/graphene/chain/protocol/nft_ops.hpp +++ b/libraries/chain/include/graphene/chain/protocol/nft_ops.hpp @@ -21,6 +21,8 @@ namespace graphene { namespace chain { time_point_sec end_date; bool ending_on_soldout; bool is_active; + bool delete_tickets_after_draw = false; + std::vector progressive_jackpots; void validate() const; }; @@ -159,7 +161,7 @@ namespace graphene { namespace chain { } } // graphene::chain FC_REFLECT( graphene::chain::nft_lottery_benefactor, (id)(share) ) -FC_REFLECT( graphene::chain::nft_lottery_options, (benefactors)(winning_tickets)(ticket_price)(end_date)(ending_on_soldout)(is_active) ) +FC_REFLECT( graphene::chain::nft_lottery_options, (benefactors)(winning_tickets)(ticket_price)(end_date)(ending_on_soldout)(is_active)(delete_tickets_after_draw)(progressive_jackpots) ) FC_REFLECT( graphene::chain::nft_metadata_create_operation::fee_parameters_type, (fee) (price_per_kbyte) ) FC_REFLECT( graphene::chain::nft_metadata_update_operation::fee_parameters_type, (fee) ) diff --git a/libraries/chain/include/graphene/chain/protocol/types.hpp b/libraries/chain/include/graphene/chain/protocol/types.hpp index c9794e8e..db67a639 100644 --- a/libraries/chain/include/graphene/chain/protocol/types.hpp +++ b/libraries/chain/include/graphene/chain/protocol/types.hpp @@ -206,7 +206,8 @@ namespace graphene { namespace chain { impl_global_betting_statistics_object_type, impl_lottery_balance_object_type, impl_sweeps_vesting_balance_object_type, - impl_offer_history_object_type + impl_offer_history_object_type, + impl_nft_lottery_balance_object_type }; //typedef fc::unsigned_int object_id_type; @@ -299,6 +300,7 @@ namespace graphene { namespace chain { class lottery_balance_object; class sweeps_vesting_balance_object; class offer_history_object; + class nft_lottery_balance_object; typedef object_id< implementation_ids, impl_global_property_object_type, global_property_object> global_property_id_type; typedef object_id< implementation_ids, impl_dynamic_global_property_object_type, dynamic_global_property_object> dynamic_global_property_id_type; @@ -328,6 +330,7 @@ namespace graphene { namespace chain { typedef object_id< implementation_ids, impl_lottery_balance_object_type, lottery_balance_object > lottery_balance_id_type; typedef object_id< implementation_ids, impl_sweeps_vesting_balance_object_type, sweeps_vesting_balance_object> sweeps_vesting_balance_id_type; typedef object_id< implementation_ids, impl_offer_history_object_type, offer_history_object> offer_history_id_type; + typedef object_id< implementation_ids, impl_nft_lottery_balance_object_type, nft_lottery_balance_object> nft_lottery_balance_id_type; typedef fc::array symbol_type; typedef fc::ripemd160 block_id_type; @@ -491,6 +494,7 @@ FC_REFLECT_ENUM( graphene::chain::impl_object_type, (impl_lottery_balance_object_type) (impl_sweeps_vesting_balance_object_type) (impl_offer_history_object_type) + (impl_nft_lottery_balance_object_type) ) FC_REFLECT_TYPENAME( graphene::chain::share_type ) @@ -540,6 +544,7 @@ FC_REFLECT_TYPENAME( graphene::chain::offer_history_id_type ) FC_REFLECT_TYPENAME( graphene::chain::nft_metadata_id_type ) FC_REFLECT_TYPENAME( graphene::chain::nft_id_type ) FC_REFLECT_TYPENAME( graphene::chain::account_role_id_type ) +FC_REFLECT_TYPENAME( graphene::chain::nft_lottery_balance_id_type ) FC_REFLECT( graphene::chain::void_t, ) diff --git a/libraries/chain/nft_evaluator.cpp b/libraries/chain/nft_evaluator.cpp index 68209126..eedbd5cc 100644 --- a/libraries/chain/nft_evaluator.cpp +++ b/libraries/chain/nft_evaluator.cpp @@ -33,6 +33,17 @@ void_result nft_metadata_create_evaluator::do_evaluate( const nft_metadata_creat if (op.max_supply) { FC_ASSERT(*op.max_supply >= 5); } + + for(auto lottery_id: (*op.lottery_options).progressive_jackpots) { + const auto& lottery_obj = lottery_id(db()); + FC_ASSERT(lottery_obj.owner == op.owner, "Only the Owner can attach progressive jackpots"); + FC_ASSERT(lottery_obj.is_lottery(), "Only lottery objects can be attached as progressive jackpots"); + FC_ASSERT(lottery_obj.lottery_data->lottery_options.is_active == false, "Lottery should not be active"); + FC_ASSERT(lottery_obj.lottery_data->lottery_options.ticket_price.asset_id == (*op.lottery_options).ticket_price.asset_id, "Lottery asset type should be same"); + const auto& lottery_balance_obj = lottery_obj.lottery_data->lottery_balance_id(db()); + FC_ASSERT(lottery_balance_obj.jackpot.amount > 0, "Non zero progressive jackpot not allowed"); + } + return void_result(); } FC_CAPTURE_AND_RETHROW( (op) ) } @@ -52,7 +63,21 @@ object_id_type nft_metadata_create_evaluator::do_apply( const nft_metadata_creat obj.max_supply = *op.max_supply; } if (op.lottery_options) { - obj.lottery_data = nft_lottery_data(*op.lottery_options); + asset jackpot_sum(0,(*op.lottery_options).ticket_price.asset_id); + for(auto lottery_id: (*op.lottery_options).progressive_jackpots) { + const auto& lottery_obj = lottery_id(db()); + const auto& lottery_balance_obj = lottery_obj.lottery_data->lottery_balance_id(db()); + FC_ASSERT(lottery_balance_obj.jackpot.amount > 0, "Non zero progressive jackpot not allowed"); + db().modify(lottery_balance_obj, [&] ( nft_lottery_balance_object& nlbo ) { + jackpot_sum += nlbo.jackpot; + nlbo.jackpot -= nlbo.jackpot; + }); + } + const auto& new_lottery_balance_obj = db().create([&](nft_lottery_balance_object& nlbo) { + nlbo.total_progressive_jackpot = jackpot_sum; + nlbo.jackpot = jackpot_sum; + }); + obj.lottery_data = nft_lottery_data(*op.lottery_options, new_lottery_balance_obj.id); } }); return new_nft_metadata_object.id; diff --git a/libraries/chain/nft_lottery_evaluator.cpp b/libraries/chain/nft_lottery_evaluator.cpp index c208c731..e1ae8f7e 100644 --- a/libraries/chain/nft_lottery_evaluator.cpp +++ b/libraries/chain/nft_lottery_evaluator.cpp @@ -53,8 +53,8 @@ namespace graphene nft_id = db().apply_operation(nft_mint_context, mint_op).get(); } db().adjust_balance(op.buyer, -op.amount); - db().modify(lottery_md_obj, [&](nft_metadata_object &obj) { - obj.lottery_data->jackpot += op.amount; + db().modify(lottery_md_obj.lottery_data->lottery_balance_id(db()), [&](nft_lottery_balance_object &obj) { + obj.jackpot += op.amount; }); return nft_id; } @@ -75,7 +75,7 @@ namespace graphene const auto &lottery_options = lottery_md_obj.lottery_data->lottery_options; FC_ASSERT(lottery_options.is_active); - FC_ASSERT(lottery_md_obj.get_lottery_jackpot() >= op.amount); + FC_ASSERT(lottery_md_obj.get_lottery_jackpot(d) >= op.amount); return void_result(); } FC_CAPTURE_AND_RETHROW((op)) @@ -87,8 +87,8 @@ namespace graphene { const auto &lottery_md_obj = op.lottery_id(db()); db().adjust_balance(op.winner, op.amount); - db().modify(lottery_md_obj, [&](nft_metadata_object &obj) { - obj.lottery_data->jackpot -= op.amount; + db().modify(lottery_md_obj.lottery_data->lottery_balance_id(db()), [&](nft_lottery_balance_object &obj) { + obj.jackpot -= op.amount; }); return void_result(); } @@ -107,7 +107,7 @@ namespace graphene const auto &lottery_options = lottery_md_obj.lottery_data->lottery_options; FC_ASSERT(lottery_options.is_active); - FC_ASSERT(lottery_md_obj.get_lottery_jackpot().amount == 0); + FC_ASSERT(lottery_md_obj.get_lottery_jackpot(d).amount == 0); return void_result(); } FC_CAPTURE_AND_RETHROW((op)) @@ -119,9 +119,11 @@ namespace graphene { const auto &lottery_md_obj = op.lottery_id(db()); db().modify(lottery_md_obj, [&](nft_metadata_object &obj) { - obj.lottery_data->sweeps_tickets_sold = obj.get_token_current_supply(db()); obj.lottery_data->lottery_options.is_active = false; }); + db().modify(lottery_md_obj.lottery_data->lottery_balance_id(db()), [&](nft_lottery_balance_object &obj) { + obj.sweeps_tickets_sold = lottery_md_obj.get_token_current_supply(db()); + }); return void_result(); } FC_CAPTURE_AND_RETHROW((op)) diff --git a/libraries/chain/nft_lottery_object.cpp b/libraries/chain/nft_lottery_object.cpp index 997ad23f..facb6dea 100644 --- a/libraries/chain/nft_lottery_object.cpp +++ b/libraries/chain/nft_lottery_object.cpp @@ -12,14 +12,14 @@ namespace graphene return time_point_sec(); } - asset nft_metadata_object::get_lottery_jackpot() const + asset nft_metadata_object::get_lottery_jackpot(const database &db) const { if (lottery_data) - return lottery_data->jackpot; + return lottery_data->lottery_balance_id(db).jackpot; return asset(); } - share_type nft_metadata_object::get_token_current_supply(database &db) const + share_type nft_metadata_object::get_token_current_supply(const database &db) const { share_type current_supply; const auto &idx_lottery_by_md = db.get_index_type().indices().get(); @@ -28,7 +28,7 @@ namespace graphene return current_supply; } - vector nft_metadata_object::get_holders(database &db) const + vector nft_metadata_object::get_holders(const database &db) const { const auto &idx_lottery_by_md = db.get_index_type().indices().get(); auto lottery_range = idx_lottery_by_md.equal_range(id); @@ -41,7 +41,7 @@ namespace graphene return holders; } - vector nft_metadata_object::get_ticket_ids(database &db) const + vector nft_metadata_object::get_ticket_ids(const database &db) const { const auto &idx_lottery_by_md = db.get_index_type().indices().get(); auto lottery_range = idx_lottery_by_md.equal_range(id); @@ -58,7 +58,7 @@ namespace graphene { transaction_evaluation_state eval(&db); const auto &lottery_options = lottery_data->lottery_options; - share_type jackpot = lottery_options.ticket_price.amount * get_token_current_supply(db).value; + share_type jackpot = lottery_options.ticket_price.amount * get_token_current_supply(db) + lottery_data->lottery_balance_id(db).total_progressive_jackpot.amount; for (auto benefactor : lottery_options.benefactors) { @@ -81,14 +81,14 @@ namespace graphene auto holders = get_holders(db); vector ticket_ids = get_ticket_ids(db); FC_ASSERT(current_supply.value == (int64_t)holders.size()); - FC_ASSERT(lottery_data->jackpot.amount.value == current_supply.value * lottery_options.ticket_price.amount.value); + FC_ASSERT(get_lottery_jackpot(db).amount.value == current_supply.value * lottery_options.ticket_price.amount.value); map> structurized_participants; for (account_id_type holder : holders) { if (!structurized_participants.count(holder)) structurized_participants.emplace(holder, vector()); } - uint64_t jackpot = lottery_data->jackpot.amount.value; + uint64_t jackpot = get_lottery_jackpot(db).amount.value; auto winner_numbers = db.get_winner_numbers(id, holders.size(), lottery_options.winning_tickets.size()); auto &tickets(lottery_options.winning_tickets); @@ -132,7 +132,7 @@ namespace graphene auto sweeps_params = db.get_global_properties().parameters; uint64_t distribution_asset_supply = sweeps_params.sweeps_distribution_asset()(db).dynamic_data(db).current_supply.value; const auto range = asset_bal_idx.equal_range(boost::make_tuple(sweeps_params.sweeps_distribution_asset())); - asset remaining_jackpot = get_id()(db).lottery_data->jackpot; + asset remaining_jackpot = get_lottery_jackpot(db); uint64_t holders_sum = 0; for (const account_balance_object &holder_balance : boost::make_iterator_range(range.first, range.second)) { @@ -142,8 +142,8 @@ namespace graphene } uint64_t balance_rest = remaining_jackpot.amount.value * SWEEPS_VESTING_BALANCE_MULTIPLIER - holders_sum; db.adjust_sweeps_vesting_balance(sweeps_params.sweeps_vesting_accumulator_account(), balance_rest); - db.modify(get_id()(db), [&](nft_metadata_object &obj) { - obj.lottery_data->jackpot -= remaining_jackpot; + db.modify(lottery_data->lottery_balance_id(db), [&](nft_lottery_balance_object &obj) { + obj.jackpot -= remaining_jackpot; }); } diff --git a/libraries/wallet/include/graphene/wallet/wallet.hpp b/libraries/wallet/include/graphene/wallet/wallet.hpp index d37394b6..2c5becd6 100644 --- a/libraries/wallet/include/graphene/wallet/wallet.hpp +++ b/libraries/wallet/include/graphene/wallet/wallet.hpp @@ -1951,6 +1951,8 @@ class wallet_api bool is_transferable, bool is_sellable, optional role_id, + optional max_supply, + optional lottery_options, bool broadcast); /** @@ -2088,6 +2090,7 @@ class wallet_api * @return Returns vector of NFT objects, empty vector if none */ vector nft_get_all_tokens() const; + signed_transaction nft_lottery_buy_ticket( nft_metadata_id_type lottery, account_id_type buyer, uint64_t tickets_to_buy, bool broadcast ); signed_transaction create_offer(set item_ids, string issuer_accound_id_or_name, @@ -2399,6 +2402,7 @@ FC_API( graphene::wallet::wallet_api, (nft_get_approved) (nft_is_approved_for_all) (nft_get_all_tokens) + (nft_lottery_buy_ticket) (create_offer) (create_bid) (cancel_offer) diff --git a/libraries/wallet/wallet.cpp b/libraries/wallet/wallet.cpp index b253f191..bd581de7 100644 --- a/libraries/wallet/wallet.cpp +++ b/libraries/wallet/wallet.cpp @@ -6376,6 +6376,8 @@ signed_transaction wallet_api::nft_metadata_create(string owner_account_id_or_na bool is_transferable, bool is_sellable, optional role_id, + optional max_supply, + optional lottery_options, bool broadcast) { account_object owner_account = my->get_account(owner_account_id_or_name); @@ -6399,6 +6401,8 @@ signed_transaction wallet_api::nft_metadata_create(string owner_account_id_or_na op.is_transferable = is_transferable; op.is_sellable = is_sellable; op.account_role = role_id; + op.max_supply = max_supply; + op.lottery_options = lottery_options; signed_transaction trx; trx.operations.push_back(op); @@ -6582,6 +6586,21 @@ vector wallet_api::nft_get_all_tokens() const return my->_remote_db->nft_get_all_tokens(); } +signed_transaction wallet_api::nft_lottery_buy_ticket( nft_metadata_id_type lottery, account_id_type buyer, uint64_t tickets_to_buy, bool broadcast ) +{ + nft_lottery_token_purchase_operation op; + op.lottery_id = lottery; + op.buyer = buyer; + op.tickets_to_buy = tickets_to_buy; + + signed_transaction trx; + trx.operations.push_back(op); + my->set_operation_fees( trx, my->_remote_db->get_global_properties().parameters.current_fees ); + trx.validate(); + + return my->sign_transaction( trx, broadcast ); +} + signed_transaction wallet_api::create_offer(set item_ids, string issuer_accound_id_or_name, asset minimum_price, diff --git a/tests/common/database_fixture.cpp b/tests/common/database_fixture.cpp index 8a3609dd..d687dec8 100644 --- a/tests/common/database_fixture.cpp +++ b/tests/common/database_fixture.cpp @@ -328,7 +328,7 @@ void database_fixture::verify_asset_supplies( const database& db ) { if (o.lottery_data) { - total_balances[o.lottery_data->jackpot.asset_id] += o.lottery_data->jackpot.amount; + total_balances[o.get_lottery_jackpot(db).asset_id] += o.get_lottery_jackpot(db).amount; } } diff --git a/tests/tests/nft_lottery_tests.cpp b/tests/tests/nft_lottery_tests.cpp index d03e5dc5..5b2fba84 100644 --- a/tests/tests/nft_lottery_tests.cpp +++ b/tests/tests/nft_lottery_tests.cpp @@ -85,8 +85,8 @@ BOOST_AUTO_TEST_CASE(create_lottery_nft_md_test) BOOST_CHECK(obj.max_supply == share_type(200)); BOOST_CHECK(obj.is_lottery()); BOOST_CHECK(obj.get_token_current_supply(db) == share_type(0)); - BOOST_CHECK(obj.get_lottery_jackpot() == asset()); - BOOST_CHECK(obj.lottery_data->sweeps_tickets_sold == share_type(0)); + BOOST_CHECK(obj.get_lottery_jackpot(db) == asset()); + BOOST_CHECK(obj.lottery_data->lottery_balance_id(db).sweeps_tickets_sold == share_type(0)); } catch (fc::exception &e) { @@ -221,7 +221,7 @@ BOOST_AUTO_TEST_CASE(lottery_end_by_stage_test) test_nft_md_obj = test_nft_md_id(db); uint64_t benefactor_balance_before_end = db.get_balance(account_id_type(), asset_id_type()).amount.value; - uint64_t jackpot = test_nft_md_obj.get_lottery_jackpot().amount.value; + uint64_t jackpot = test_nft_md_obj.get_lottery_jackpot(db).amount.value; uint16_t winners_part = 0; for (uint16_t win : test_nft_md_obj.lottery_data->lottery_options.winning_tickets) winners_part += win; @@ -238,13 +238,13 @@ BOOST_AUTO_TEST_CASE(lottery_end_by_stage_test) test_nft_md_obj = test_nft_md_id(db); BOOST_CHECK(participants_percents_sum == winners_part); - BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot().amount.value == (jackpot * (GRAPHENE_100_PERCENT - winners_part) / (double)GRAPHENE_100_PERCENT) + jackpot * winners_part * SWEEPS_DEFAULT_DISTRIBUTION_PERCENTAGE / (double)GRAPHENE_100_PERCENT / (double)GRAPHENE_100_PERCENT); + BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot(db).amount.value == (jackpot * (GRAPHENE_100_PERCENT - winners_part) / (double)GRAPHENE_100_PERCENT) + jackpot * winners_part * SWEEPS_DEFAULT_DISTRIBUTION_PERCENTAGE / (double)GRAPHENE_100_PERCENT / (double)GRAPHENE_100_PERCENT); test_nft_md_obj.distribute_benefactors_part(db); test_nft_md_obj = test_nft_md_id(db); - BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot().amount.value == jackpot * SWEEPS_DEFAULT_DISTRIBUTION_PERCENTAGE / (double)GRAPHENE_100_PERCENT * winners_part / (double)GRAPHENE_100_PERCENT); + BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot(db).amount.value == jackpot * SWEEPS_DEFAULT_DISTRIBUTION_PERCENTAGE / (double)GRAPHENE_100_PERCENT * winners_part / (double)GRAPHENE_100_PERCENT); test_nft_md_obj.distribute_sweeps_holders_part(db); test_nft_md_obj = test_nft_md_id(db); - BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot().amount.value == 0); + BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot(db).amount.value == 0); uint64_t benefactor_recieved = db.get_balance(account_id_type(), asset_id_type()).amount.value - benefactor_balance_before_end; BOOST_CHECK(jackpot * test_nft_md_obj.lottery_data->lottery_options.benefactors[0].share / GRAPHENE_100_PERCENT == benefactor_recieved); @@ -288,7 +288,7 @@ BOOST_AUTO_TEST_CASE(lottery_end_by_stage_with_fractional_test) } test_nft_md_obj = test_nft_md_id(db); uint64_t benefactor_balance_before_end = db.get_balance(account_id_type(), asset_id_type()).amount.value; - uint64_t jackpot = test_nft_md_obj.get_lottery_jackpot().amount.value; + uint64_t jackpot = test_nft_md_obj.get_lottery_jackpot(db).amount.value; uint16_t winners_part = 0; for (uint16_t win : test_nft_md_obj.lottery_data->lottery_options.winning_tickets) winners_part += win; @@ -302,14 +302,14 @@ BOOST_AUTO_TEST_CASE(lottery_end_by_stage_with_fractional_test) BOOST_CHECK(participants_percents_sum == winners_part); // balance should be bigger than expected because of rouning during distribution test_nft_md_obj = test_nft_md_id(db); - BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot().amount.value > (jackpot * (GRAPHENE_100_PERCENT - winners_part) / (double)GRAPHENE_100_PERCENT) + jackpot * winners_part * SWEEPS_DEFAULT_DISTRIBUTION_PERCENTAGE / (double)GRAPHENE_100_PERCENT / (double)GRAPHENE_100_PERCENT); + BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot(db).amount.value > (jackpot * (GRAPHENE_100_PERCENT - winners_part) / (double)GRAPHENE_100_PERCENT) + jackpot * winners_part * SWEEPS_DEFAULT_DISTRIBUTION_PERCENTAGE / (double)GRAPHENE_100_PERCENT / (double)GRAPHENE_100_PERCENT); test_nft_md_obj.distribute_benefactors_part(db); test_nft_md_obj = test_nft_md_id(db); - BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot().amount.value > jackpot * SWEEPS_DEFAULT_DISTRIBUTION_PERCENTAGE / (double)GRAPHENE_100_PERCENT * winners_part / (double)GRAPHENE_100_PERCENT); + BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot(db).amount.value > jackpot * SWEEPS_DEFAULT_DISTRIBUTION_PERCENTAGE / (double)GRAPHENE_100_PERCENT * winners_part / (double)GRAPHENE_100_PERCENT); test_nft_md_obj.distribute_sweeps_holders_part(db); test_nft_md_obj = test_nft_md_id(db); // but at the end is always equals 0 - BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot().amount.value == 0); + BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot(db).amount.value == 0); uint64_t benefactor_recieved = db.get_balance(account_id_type(), asset_id_type()).amount.value - benefactor_balance_before_end; test_nft_md_obj = test_nft_md_id(db); @@ -349,7 +349,7 @@ BOOST_AUTO_TEST_CASE(lottery_end_test) generate_block(); test_nft_md_obj = test_nft_md_id(db); uint64_t creator_balance_before_end = db.get_balance(account_id_type(), asset_id_type()).amount.value; - uint64_t jackpot = test_nft_md_obj.get_lottery_jackpot().amount.value; + uint64_t jackpot = test_nft_md_obj.get_lottery_jackpot(db).amount.value; uint16_t winners_part = 0; for (uint8_t win : test_nft_md_obj.lottery_data->lottery_options.winning_tickets) winners_part += win; @@ -357,7 +357,7 @@ BOOST_AUTO_TEST_CASE(lottery_end_test) while (db.head_block_time() < (test_nft_md_obj.lottery_data->lottery_options.end_date + fc::seconds(30))) generate_block(); test_nft_md_obj = test_nft_md_id(db); - BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot().amount.value == 0); + BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot(db).amount.value == 0); uint64_t creator_recieved = db.get_balance(account_id_type(), asset_id_type()).amount.value - creator_balance_before_end; BOOST_CHECK(jackpot * test_nft_md_obj.lottery_data->lottery_options.benefactors[0].share / GRAPHENE_100_PERCENT == creator_recieved); } @@ -480,11 +480,11 @@ BOOST_AUTO_TEST_CASE(ending_by_date_test) generate_block(); test_nft_md_obj = test_nft_md_id(db); auto holders = test_nft_md_obj.get_holders(db); - idump((test_nft_md_obj.get_lottery_jackpot())); + idump((test_nft_md_obj.get_lottery_jackpot(db))); while (db.head_block_time() < (test_nft_md_obj.lottery_data->lottery_options.end_date + fc::seconds(30))) generate_block(); test_nft_md_obj = test_nft_md_id(db); - idump((test_nft_md_obj.get_lottery_jackpot())); + idump((test_nft_md_obj.get_lottery_jackpot(db))); vector participants = {account_id_type(1), account_id_type(2), account_id_type(3)}; for (auto p : participants) { @@ -604,7 +604,7 @@ BOOST_AUTO_TEST_CASE(lottery_winner_ticket_id_test) generate_block(); test_nft_md_obj = test_nft_md_id(db); uint64_t creator_balance_before_end = db.get_balance(account_id_type(), asset_id_type()).amount.value; - uint64_t jackpot = test_nft_md_obj.get_lottery_jackpot().amount.value; + uint64_t jackpot = test_nft_md_obj.get_lottery_jackpot(db).amount.value; uint16_t winners_part = 0; for (uint8_t win : test_nft_md_obj.lottery_data->lottery_options.winning_tickets) winners_part += win; @@ -617,7 +617,7 @@ BOOST_AUTO_TEST_CASE(lottery_winner_ticket_id_test) idump((h)); } test_nft_md_obj = test_nft_md_id(db); - BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot().amount.value == 0); + BOOST_CHECK(test_nft_md_obj.get_lottery_jackpot(db).amount.value == 0); uint64_t creator_recieved = db.get_balance(account_id_type(), asset_id_type()).amount.value - creator_balance_before_end; BOOST_CHECK(jackpot * test_nft_md_obj.lottery_data->lottery_options.benefactors[0].share / GRAPHENE_100_PERCENT == creator_recieved); }