From 476147faa65db4238673ed63329fcc248887eb3c Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 26 Apr 2019 20:48:16 +0700 Subject: [PATCH 1/3] stake: issuer pays for stat #141 --- .../include/cyber.stake/cyber.stake.hpp | 12 +++- cyber.stake/src/cyber.stake.cpp | 71 ++++++------------- 2 files changed, 32 insertions(+), 51 deletions(-) diff --git a/cyber.stake/include/cyber.stake/cyber.stake.hpp b/cyber.stake/include/cyber.stake/cyber.stake.hpp index 767ca60e9..c14796609 100644 --- a/cyber.stake/include/cyber.stake/cyber.stake.hpp +++ b/cyber.stake/include/cyber.stake/cyber.stake.hpp @@ -141,7 +141,6 @@ struct structures { int16_t pct, int64_t share, int16_t break_fee = -1, int64_t break_min_own_staked = -1); void change_balance(name account, asset quantity); - void update_stats(const structures::stat& stat_arg, name payer = name()); static inline void staking_exists(symbol_code token_code) { params params_table(table_owner, table_owner.value); @@ -156,6 +155,15 @@ struct structures { auto agent = get_agent_itr(token_code, agents_idx, account); agents_idx.modify(agent, name(), f); } + + template + void modify_stat(symbol_code token_code, Lambda f) { + stats stats_table(table_owner, table_owner.value); + auto stat = stats_table.find(token_code.raw()); + eosio_assert(stat != stats_table.end(), "stat doesn't exist"); + stats_table.modify(stat, name(), f); + } + static void check_grant_terms(const structures::agent& agent, int16_t break_fee, int64_t break_min_own_staked); public: @@ -209,7 +217,7 @@ struct structures { [[eosio::action]] void setgrntterms(name grantor_name, name agent_name, symbol_code token_code, int16_t pct, int16_t break_fee, int64_t break_min_own_staked); - [[eosio::action]] void recall (name grantor_name, name agent_name, symbol_code token_code, int16_t pct); + [[eosio::action]] void recall(name grantor_name, name agent_name, symbol_code token_code, int16_t pct); [[eosio::action]] void withdraw(name account, asset quantity); [[eosio::action]] void claim(name account, symbol_code token_code); diff --git a/cyber.stake/src/cyber.stake.cpp b/cyber.stake/src/cyber.stake.cpp index 0d88e25a7..30517c56e 100644 --- a/cyber.stake/src/cyber.stake.cpp +++ b/cyber.stake/src/cyber.stake.cpp @@ -200,11 +200,7 @@ void stake::on_transfer(name from, name to, asset quantity, std::string memo) { auto share = delegate_traversal(token_code, agents_idx, grants_idx, account, quantity.amount, true); agents_idx.modify(agent, name(), [&](auto& a) { a.own_share += share; }); - update_stats(structures::stat { - .id = 0, - .token_code = token_code, - .total_staked = quantity.amount - }, from); + modify_stat(token_code, [&](auto& s) { s.total_staked += quantity.amount; }); } void stake::claim(name account, symbol_code token_code) { @@ -301,31 +297,7 @@ void stake::update_payout(name account, asset quantity, bool claim_mode) { a.shares_sum += shares_diff; a.own_share += shares_diff; }); - - update_stats(structures::stat { - .id = 0, - .token_code = token_code, - .total_staked = balance_diff - }); -} - -void stake::update_stats(const structures::stat& stat_arg, name payer) { - stats stats_table(table_owner, table_owner.value); - auto stat = stats_table.find(stat_arg.token_code.raw()); - - if (stat == stats_table.end() && payer != name()) { - eosio_assert(stat_arg.total_staked >= 0, "SYSTEM: incorrect total_staked"); - stats_table.emplace(payer, [&](auto& s) { s = stat_arg; s.id = stat_arg.token_code.raw(); }); - } - else if (stat != stats_table.end()) { - stats_table.modify(stat, name(), [&](auto& s) { - s.total_staked += stat_arg.total_staked; - s.enabled = s.enabled || stat_arg.enabled; - }); - } - else { - eosio_assert(false, "stats doesn't exist"); - } + modify_stat(token_code, [&](auto& s) { s.total_staked += balance_diff; }); } void stake::send_scheduled_payout(payouts& payouts_table, name account, int64_t payout_step_length, symbol sym, bool claim_mode) { @@ -427,7 +399,8 @@ void stake::create(symbol token_symbol, std::vector max_proxies, int64_t frame_length, int64_t payout_step_length, uint16_t payout_steps_num, int64_t min_own_staked_for_election) { - eosio::print("create stake for ", token_symbol.code(), "\n"); + auto token_code = token_symbol.code(); + eosio::print("create stake for ", token_code, "\n"); eosio_assert(max_proxies.size(), "no proxy levels are specified"); eosio_assert(max_proxies.size() < std::numeric_limits::max(), "too many proxy levels"); if (max_proxies.size() > 1) @@ -437,34 +410,38 @@ void stake::create(symbol token_symbol, std::vector max_proxies, eosio_assert(frame_length > 0, "incorrect frame_length"); eosio_assert(payout_step_length > 0, "incorrect payout_step_length"); eosio_assert(min_own_staked_for_election >= 0, "incorrect min_own_staked_for_election"); - auto issuer = eosio::token::get_issuer(config::token_name, token_symbol.code()); + auto issuer = eosio::token::get_issuer(config::token_name, token_code); require_auth(issuer); params params_table(table_owner, table_owner.value); - eosio_assert(params_table.find(token_symbol.code().raw()) == params_table.end(), "already exists"); + eosio_assert(params_table.find(token_code.raw()) == params_table.end(), "already exists"); params_table.emplace(issuer, [&](auto& p) { p = { - .id = token_symbol.code().raw(), + .id = token_code.raw(), .token_symbol = token_symbol, .max_proxies = max_proxies, .frame_length = frame_length, .payout_step_length = payout_step_length, .payout_steps_num = payout_steps_num, .min_own_staked_for_election = min_own_staked_for_election - };}); + };}); + + stats stats_table(table_owner, table_owner.value); + eosio_assert(stats_table.find(token_code.raw()) == stats_table.end(), "SYSTEM: already exists"); + stats_table.emplace(issuer, [&](auto& s) { s = { + .id = token_code.raw(), + .token_code = token_code, + .total_staked = 0 + };}); } void stake::enable(symbol token_symbol) { auto token_code = token_symbol.code(); auto issuer = eosio::token::get_issuer(config::token_name, token_code); require_auth(issuer); - params params_table(table_owner, table_owner.value); - params_table.get(token_code.raw(), "no staking for token"); - update_stats(structures::stat { - .id = 0, - .token_code = token_code, - .total_staked = 0, - .enabled = true - }, issuer); + modify_stat(token_code, [&](auto& s) { + eosio_assert(!s.enabled, "already enabled"); + s.enabled = true; + }); } stake::agents_idx_t::const_iterator stake::get_agent_itr(symbol_code token_code, stake::agents_idx_t& agents_idx, name agent_name, int16_t proxy_level_for_emplaced, agents* agents_table, bool* emplaced) { @@ -538,15 +515,11 @@ void stake::reward(name account, asset quantity) { a.own_share = quantity.amount; }); } - update_stats(structures::stat { - .id = 0, - .token_code = token_code, - .total_staked = quantity.amount - }, issuer); + modify_stat(token_code, [&](auto& s) { s.total_staked += quantity.amount; }); INLINE_ACTION_SENDER(eosio::token, issue)(config::token_name, {issuer, config::reward_name}, {issuer, quantity, ""}); INLINE_ACTION_SENDER(eosio::token, transfer)(config::token_name, {issuer, config::reward_name}, - {issuer, _self, quantity, config::reward_memo}); + {issuer, _self, quantity, config::reward_memo}); } } /// namespace cyber From fd9b76b2e5109c392bef7e33bea34b7026cdfc02 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 26 Apr 2019 23:16:12 +0700 Subject: [PATCH 2/3] creating an agent explicitly #75 --- cyber.stake/abi/cyber.stake.abi | 12 +++ .../include/cyber.stake/cyber.stake.hpp | 5 +- cyber.stake/src/cyber.stake.cpp | 75 ++++++++++--------- tests/cyber.govern_tests.cpp | 3 +- tests/cyber.stake_test_api.hpp | 14 +++- tests/cyber.stake_tests.cpp | 34 ++++++++- 6 files changed, 101 insertions(+), 42 deletions(-) diff --git a/cyber.stake/abi/cyber.stake.abi b/cyber.stake/abi/cyber.stake.abi index e5575b7e9..db159dd01 100644 --- a/cyber.stake/abi/cyber.stake.abi +++ b/cyber.stake/abi/cyber.stake.abi @@ -23,6 +23,14 @@ { "type": "uint16", "name": "payout_steps_num" }, { "type": "int64", "name": "min_own_staked_for_election" } ] + },{ + "name": "open_args", + "base": "", + "fields": [ + { "type": "name", "name": "owner" }, + { "type": "symbol_code", "name": "token_code" }, + { "type": "name?", "name": "ram_payer" } + ] },{ "name": "enable_args", "base": "", @@ -108,6 +116,10 @@ "name": "create", "type": "create_args", "ricardian_contract": "" + },{ + "name": "open", + "type": "open_args", + "ricardian_contract": "" },{ "name": "enable", "type": "enable_args", diff --git a/cyber.stake/include/cyber.stake/cyber.stake.hpp b/cyber.stake/include/cyber.stake/cyber.stake.hpp index c14796609..d9ee36718 100644 --- a/cyber.stake/include/cyber.stake/cyber.stake.hpp +++ b/cyber.stake/include/cyber.stake/cyber.stake.hpp @@ -136,7 +136,8 @@ struct structures { //return: share int64_t delegate_traversal(symbol_code token_code, agents_idx_t& agents_idx, grants_idx_t& grants_idx, name agent_name, int64_t amount, bool refill = false); - agents_idx_t::const_iterator get_agent_itr(symbol_code token_code, agents_idx_t& agents_idx, name agent_name, int16_t proxy_level_for_emplaced = -1, agents* agents_table = nullptr, bool* emplaced = nullptr); + agents_idx_t::const_iterator get_agent_itr(symbol_code token_code, agents_idx_t& agents_idx, name agent_name); + void emplace_agent(name account, agents& agents_table, const structures::param& param, name ram_payer); void add_proxy(symbol_code token_code, grants& grants_table, const structures::agent& grantor_as_agent, const structures::agent& agent, int16_t pct, int64_t share, int16_t break_fee = -1, int64_t break_min_own_staked = -1); @@ -212,6 +213,8 @@ struct structures { int64_t min_own_staked_for_election); [[eosio::action]] void enable(symbol token_symbol); + + [[eosio::action]] void open(name owner, symbol_code token_code, std::optional ram_payer); [[eosio::action]] void delegate(name grantor_name, name agent_name, asset quantity); diff --git a/cyber.stake/src/cyber.stake.cpp b/cyber.stake/src/cyber.stake.cpp index 30517c56e..c1bbc39e9 100644 --- a/cyber.stake/src/cyber.stake.cpp +++ b/cyber.stake/src/cyber.stake.cpp @@ -168,7 +168,7 @@ void stake::setgrntterms(name grantor_name, name agent_name, symbol_code token_c eosio_assert(pct_sum <= config::_100percent, "too high pct value\n"); } if (!agent_found && pct) { - auto grantor_as_agent = get_agent_itr(token_code, agents_idx, grantor_name, param.max_proxies.size(), &agents_table); + auto grantor_as_agent = get_agent_itr(token_code, agents_idx, grantor_name); eosio_assert(proxies_num < param.max_proxies[grantor_as_agent->proxy_level - 1], "proxy cannot be added"); update_stake_proxied(token_code, agent_name); auto agent = get_agent_itr(token_code, agents_idx, agent_name); @@ -191,8 +191,11 @@ void stake::on_transfer(name from, name to, asset quantity, std::string memo) { agents agents_table(table_owner, table_owner.value); auto agents_idx = agents_table.get_index<"bykey"_n>(); - auto agent = get_agent_itr(token_code, agents_idx, account, param.max_proxies.size(), &agents_table); - + auto agent = agents_idx.find(std::make_tuple(token_code, account)); + if (agent == agents_idx.end()) { + emplace_agent(account, agents_table, param, from); + agent = agents_idx.find(std::make_tuple(token_code, account)); + } update_stake_proxied(token_code, account); grants grants_table(table_owner, table_owner.value); @@ -371,11 +374,10 @@ void stake::setproxylvl(name account, symbol_code token_code, uint8_t level) { eosio_assert(level <= param.max_proxies.size(), "level too high"); agents agents_table(table_owner, table_owner.value); auto agents_idx = agents_table.get_index<"bykey"_n>(); - bool emplaced = false; - auto agent = get_agent_itr(token_code, agents_idx, account, level, &agents_table, &emplaced); + auto agent = get_agent_itr(token_code, agents_idx, account); eosio_assert(level || agent->min_own_staked >= param.min_own_staked_for_election, "min_own_staked can't be less than min_own_staked_for_election for users with an ultimate level"); - eosio_assert(emplaced || (level != agent->proxy_level), "proxy level has not been changed"); + eosio_assert(level != agent->proxy_level, "proxy level has not been changed"); grants grants_table(table_owner, table_owner.value); auto grants_idx = grants_table.get_index<"bykey"_n>(); uint8_t proxies_num = 0; @@ -387,12 +389,10 @@ void stake::setproxylvl(name account, symbol_code token_code, uint8_t level) { eosio_assert(level || !proxies_num, "can't set an ultimate level because the user has a proxy"); eosio_assert(!level || proxies_num <= param.max_proxies[level - 1], "can't set proxy level, user has too many proxies"); - if(!emplaced) { - agents_idx.modify(agent, name(), [&](auto& a) { - a.proxy_level = level; - a.votes = level ? -1 : a.balance; - }); - } + agents_idx.modify(agent, name(), [&](auto& a) { + a.proxy_level = level; + a.votes = level ? -1 : a.balance; + }); } void stake::create(symbol token_symbol, std::vector max_proxies, @@ -444,33 +444,34 @@ void stake::enable(symbol token_symbol) { }); } -stake::agents_idx_t::const_iterator stake::get_agent_itr(symbol_code token_code, stake::agents_idx_t& agents_idx, name agent_name, int16_t proxy_level_for_emplaced, agents* agents_table, bool* emplaced) { - auto key = std::make_tuple(token_code, agent_name); - auto agent = agents_idx.find(key); +void stake::open(name owner, symbol_code token_code, std::optional ram_payer = std::nullopt) { + + auto actual_ram_payer = ram_payer.value_or(owner); + require_auth(actual_ram_payer); - if (emplaced) - *emplaced = false; + params params_table(table_owner, table_owner.value); + const auto& param = params_table.get(token_code.raw(), "no staking for token"); + agents agents_table(table_owner, table_owner.value); + auto agents_idx = agents_table.get_index<"bykey"_n>(); + eosio_assert(agents_idx.find(std::make_tuple(token_code, owner)) == agents_idx.end(), "agent already exists"); + emplace_agent(owner, agents_table, param, actual_ram_payer); +} - if(proxy_level_for_emplaced < 0) { - eosio_assert(agent != agents_idx.end(), ("agent " + agent_name.to_string() + " doesn't exist").c_str()); - } - else if(agent == agents_idx.end()) { +stake::agents_idx_t::const_iterator stake::get_agent_itr(symbol_code token_code, stake::agents_idx_t& agents_idx, name agent_name) { + auto ret = agents_idx.find(std::make_tuple(token_code, agent_name)); + eosio_assert(ret != agents_idx.end(), ("agent " + agent_name.to_string() + " doesn't exist").c_str()); + return ret; +} - eosio_assert(static_cast(agents_table), "SYSTEM: agents_table can't be null"); - (*agents_table).emplace(agent_name, [&](auto& a) { a = { - .id = agents_table->available_primary_key(), - .token_code = token_code, - .account = agent_name, - .proxy_level = static_cast(proxy_level_for_emplaced), - .votes = proxy_level_for_emplaced ? -1 : 0, - .last_proxied_update = time_point_sec(::now()) - };}); - - agent = agents_idx.find(key); - if (emplaced) - *emplaced = true; - } - return agent; +void stake::emplace_agent(name account, agents& agents_table, const structures::param& param, name ram_payer) { + agents_table.emplace(ram_payer, [&](auto& a) { a = { + .id = agents_table.available_primary_key(), + .token_code = param.token_symbol.code(), + .account = account, + .proxy_level = static_cast(param.max_proxies.size()), + .votes = -1, + .last_proxied_update = time_point_sec(::now()) + };}); } void stake::updatefunds(name account, symbol_code token_code) { @@ -525,7 +526,7 @@ void stake::reward(name account, asset quantity) { } /// namespace cyber DISPATCH_WITH_TRANSFER(cyber::stake, cyber::config::token_name, on_transfer, - (create)(enable)(delegate)(setgrntterms)(recall)(withdraw)(claim)(cancelwd) + (create)(enable)(open)(delegate)(setgrntterms)(recall)(withdraw)(claim)(cancelwd) (setproxylvl)(setproxyfee)(setminstaked)(setkey) (updatefunds)(reward) ) diff --git a/tests/cyber.govern_tests.cpp b/tests/cyber.govern_tests.cpp index 74f23e1d6..c69b8d8b1 100644 --- a/tests/cyber.govern_tests.cpp +++ b/tests/cyber.govern_tests.cpp @@ -273,9 +273,9 @@ BOOST_FIXTURE_TEST_CASE(set_producers_test, cyber_govern_tester) try { BOOST_CHECK_EQUAL(govern.get_active_elected_producers(), govern.make_producers_group(crowd_and_bob)); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _carol, asset(3, token._symbol), "")); + BOOST_CHECK_EQUAL(success(), token.transfer(_carol, stake_account_name, asset(1, token._symbol))); BOOST_CHECK_EQUAL(success(), stake.setproxylvl(_carol, token._symbol.to_symbol_code(), 1)); - BOOST_CHECK_EQUAL(success(), token.transfer(_carol, stake_account_name, asset(1, token._symbol))); BOOST_CHECK_EQUAL(success(), stake.delegate(_carol, _bob, asset(1, token._symbol))); govern.wait_schedule_activation(); @@ -317,6 +317,7 @@ BOOST_FIXTURE_TEST_CASE(set_producers_test, cyber_govern_tester) try { BOOST_FIXTURE_TEST_CASE(no_key_test, cyber_govern_tester) try { BOOST_TEST_MESSAGE("no_key_test"); deploy_sys_contracts(); + BOOST_CHECK_EQUAL(success(), stake.open(_alice, token._symbol.to_symbol_code())); BOOST_CHECK_EQUAL(success(), stake.setproxylvl(_alice, token._symbol.to_symbol_code(), 0)); stake.register_candidate(_bob, token._symbol.to_symbol_code()); govern.wait_schedule_activation(); diff --git a/tests/cyber.stake_test_api.hpp b/tests/cyber.stake_test_api.hpp index 941ec9bae..859b9db10 100644 --- a/tests/cyber.stake_test_api.hpp +++ b/tests/cyber.stake_test_api.hpp @@ -30,6 +30,12 @@ struct cyber_stake_api: base_contract_api { ); } + action_result open(account_name owner, symbol_code token_code, account_name ram_payer = account_name(0)) { + return ram_payer ? + push(N(open), ram_payer, args()("owner", owner)("token_code", token_code)("ram_payer", ram_payer)) : + push(N(open), owner, args()("owner", owner)("token_code", token_code)); + } + action_result enable(account_name issuer, symbol token_symbol) { return push(N(enable), issuer, args() ("token_symbol", token_symbol) @@ -132,8 +138,12 @@ struct cyber_stake_api: base_contract_api { ); } - action_result register_candidate(account_name account, symbol_code token_code) { - + action_result register_candidate(account_name account, symbol_code token_code, bool need_to_open = true) { + if (need_to_open) { + auto ret = open(account, token_code); + if(ret != base_tester::success()) + return ret; + } auto ret = setproxylvl(account, token_code, 0); if(ret != base_tester::success()) return ret; diff --git a/tests/cyber.stake_tests.cpp b/tests/cyber.stake_tests.cpp index 0801c3c99..59428524b 100644 --- a/tests/cyber.stake_tests.cpp +++ b/tests/cyber.stake_tests.cpp @@ -66,6 +66,9 @@ class cyber_stake_tester : public golos_tester { BOOST_CHECK_EQUAL(success(), token.issue(_issuer, acc, token.from_amount(stake_amount), "")); BOOST_CHECK_EQUAL(success(), token.transfer(acc, _code, token.from_amount(stake_amount))); } + else { + BOOST_CHECK_EQUAL(success(), stake.open(acc, token._symbol.to_symbol_code())); + } if (level != max_proxy_level || !stake_amount) { BOOST_CHECK_EQUAL(success(), stake.setproxylvl(acc, token._symbol.to_symbol_code(), level)); } @@ -112,6 +115,9 @@ class cyber_stake_tester : public golos_tester { static string no_agent() { return "agent doesn't exist"; } + const string agent_exists() { + return amsg(std::string("agent already exists")); + } const string no_funds() { return amsg(std::string("insufficient funds")); } @@ -187,6 +193,9 @@ BOOST_FIXTURE_TEST_CASE(basic_tests, cyber_stake_tester) try { BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _carol, stake_c, "")); BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, max_proxies, frame_length, 7 * 24 * 60 * 60, 52)); + BOOST_CHECK_EQUAL(success(), stake.open(_alice, token._symbol.to_symbol_code())); + BOOST_CHECK_EQUAL(success(), stake.open(_bob, token._symbol.to_symbol_code())); + BOOST_CHECK_EQUAL(success(), stake.open(_carol, token._symbol.to_symbol_code())); BOOST_TEST_MESSAGE("--- alice stakes " << stake_a); BOOST_CHECK_EQUAL(success(), token.transfer(_alice, _code, stake_a)); @@ -275,6 +284,9 @@ BOOST_FIXTURE_TEST_CASE(increase_proxy_level_test, cyber_stake_tester) try { asset staked(10000000, token._symbol); BOOST_CHECK_EQUAL(success(), token.create(_issuer, asset(1000000000, token._symbol))); BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, max_proxies, frame_length, 7 * 24 * 60 * 60, 52)); + BOOST_CHECK_EQUAL(success(), stake.open(_alice, token._symbol.to_symbol_code())); + BOOST_CHECK_EQUAL(success(), stake.open(_bob, token._symbol.to_symbol_code())); + BOOST_CHECK_EQUAL(success(), stake.open(_carol, token._symbol.to_symbol_code())); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _carol, staked, "")); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _alice, staked, "")); @@ -325,6 +337,23 @@ BOOST_FIXTURE_TEST_CASE(increase_proxy_level_test, cyber_stake_tester) try { } FC_LOG_AND_RETHROW() +BOOST_FIXTURE_TEST_CASE(open_test, cyber_stake_tester) try { + asset stake_u(100, token._symbol); + BOOST_CHECK_EQUAL(success(), token.create(_issuer, asset(10000000000, token._symbol))); + BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _alice, stake_u , "")); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {1}, 1, 7 * 24 * 60 * 60, 52)); + BOOST_CHECK_EQUAL(success(), token.transfer(_alice, _code, stake_u)); + BOOST_CHECK_EQUAL(err.agent_exists(), stake.open(_alice, token._symbol.to_symbol_code())); + BOOST_CHECK_EQUAL(success(), stake.open(_bob, token._symbol.to_symbol_code())); + BOOST_CHECK_EQUAL(success(), stake.enable(_issuer, token._symbol)); + BOOST_CHECK(err.is_costs_too_much_mssg(stake.open(_carol, token._symbol.to_symbol_code()))); + BOOST_CHECK_EQUAL(err.no_agent(), stake.delegate(_alice, _carol, stake_u)); + BOOST_CHECK_EQUAL(success(), stake.open(_carol, token._symbol.to_symbol_code(), _alice)); + produce_block(); + BOOST_CHECK_EQUAL(err.agent_exists(), stake.open(_carol, token._symbol.to_symbol_code(), _alice)); + produce_block(); +} FC_LOG_AND_RETHROW() + BOOST_FIXTURE_TEST_CASE(bw_tests, cyber_stake_tester) try { BOOST_TEST_MESSAGE("Basic bw tests"); @@ -967,7 +996,10 @@ BOOST_FIXTURE_TEST_CASE(recursive_update_test, cyber_stake_tester) try { cur_level_accs.emplace_back(user); create_accounts({user}); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, user, staked, "")); - BOOST_CHECK_EQUAL(success(), stake.setproxylvl(user, token._symbol.to_symbol_code(), level)); + BOOST_CHECK_EQUAL(success(), stake.open(user, token._symbol.to_symbol_code())); + if (level != max_proxies.size()) { + BOOST_CHECK_EQUAL(success(), stake.setproxylvl(user, token._symbol.to_symbol_code(), level)); + } for (auto proxy : prev_level_accs) { int16_t pct = (1.0 / prev_level_accs.size()) * cfg::_100percent; BOOST_TEST_MESSAGE("--- setgrntterms pct: " << pct << " " << user << " -> " << proxy); From ddb61bb96f03b0bf15e47eb665dbadcae0f545de Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 27 Apr 2019 20:01:38 +0700 Subject: [PATCH 3/3] frame_length removed, last_reward added #75 --- cyber.stake/abi/cyber.stake.abi | 1 - .../include/cyber.stake/cyber.stake.hpp | 6 ++-- cyber.stake/src/cyber.stake.cpp | 9 +++--- tests/cyber.govern_tests.cpp | 2 +- tests/cyber.stake_test_api.hpp | 6 ++-- tests/cyber.stake_tests.cpp | 31 +++++++++---------- 6 files changed, 27 insertions(+), 28 deletions(-) diff --git a/cyber.stake/abi/cyber.stake.abi b/cyber.stake/abi/cyber.stake.abi index db159dd01..c568a3857 100644 --- a/cyber.stake/abi/cyber.stake.abi +++ b/cyber.stake/abi/cyber.stake.abi @@ -18,7 +18,6 @@ "fields": [ { "type": "symbol", "name": "token_symbol" }, { "type": "uint8[]", "name": "max_proxies" }, - { "type": "int64", "name": "frame_length" }, { "type": "int64", "name": "payout_step_length" }, { "type": "uint16", "name": "payout_steps_num" }, { "type": "int64", "name": "min_own_staked_for_election" } diff --git a/cyber.stake/include/cyber.stake/cyber.stake.hpp b/cyber.stake/include/cyber.stake/cyber.stake.hpp index d9ee36718..d00b4cd81 100644 --- a/cyber.stake/include/cyber.stake/cyber.stake.hpp +++ b/cyber.stake/include/cyber.stake/cyber.stake.hpp @@ -76,7 +76,6 @@ struct structures { uint64_t id; symbol token_symbol; std::vector max_proxies; - int64_t frame_length; int64_t payout_step_length; uint16_t payout_steps_num; int64_t min_own_staked_for_election = 0; @@ -100,6 +99,7 @@ struct structures { uint64_t id; symbol_code token_code; int64_t total_staked; + time_point_sec last_reward; bool enabled = false; uint64_t primary_key()const { return id; } }; @@ -127,7 +127,7 @@ struct structures { using payouts = eosio::multi_index<"payout"_n, structures::payout, payout_id_index, payout_acc_index>; void update_stake_proxied(symbol_code token_code, name agent_name) { - ::update_stake_proxied(token_code.raw(), agent_name.value, int64_t(1), static_cast(true)); + ::update_stake_proxied(token_code.raw(), agent_name.value, static_cast(true)); } void send_scheduled_payout(payouts& payouts_table, name account, int64_t payout_step_length, symbol sym, bool claim_mode = false); @@ -209,7 +209,7 @@ struct structures { using contract::contract; [[eosio::action]] void create(symbol token_symbol, std::vector max_proxies, - int64_t frame_length, int64_t payout_step_length, uint16_t payout_steps_num, + int64_t payout_step_length, uint16_t payout_steps_num, int64_t min_own_staked_for_election); [[eosio::action]] void enable(symbol token_symbol); diff --git a/cyber.stake/src/cyber.stake.cpp b/cyber.stake/src/cyber.stake.cpp index c1bbc39e9..9186bb5bd 100644 --- a/cyber.stake/src/cyber.stake.cpp +++ b/cyber.stake/src/cyber.stake.cpp @@ -396,7 +396,7 @@ void stake::setproxylvl(name account, symbol_code token_code, uint8_t level) { } void stake::create(symbol token_symbol, std::vector max_proxies, - int64_t frame_length, int64_t payout_step_length, uint16_t payout_steps_num, + int64_t payout_step_length, uint16_t payout_steps_num, int64_t min_own_staked_for_election) { auto token_code = token_symbol.code(); @@ -407,7 +407,6 @@ void stake::create(symbol token_symbol, std::vector max_proxies, for (size_t i = 1; i < max_proxies.size(); i++) { eosio_assert(max_proxies[i - 1] >= max_proxies[i], "incorrect proxy levels"); } - eosio_assert(frame_length > 0, "incorrect frame_length"); eosio_assert(payout_step_length > 0, "incorrect payout_step_length"); eosio_assert(min_own_staked_for_election >= 0, "incorrect min_own_staked_for_election"); auto issuer = eosio::token::get_issuer(config::token_name, token_code); @@ -419,7 +418,6 @@ void stake::create(symbol token_symbol, std::vector max_proxies, .id = token_code.raw(), .token_symbol = token_symbol, .max_proxies = max_proxies, - .frame_length = frame_length, .payout_step_length = payout_step_length, .payout_steps_num = payout_steps_num, .min_own_staked_for_election = min_own_staked_for_election @@ -516,7 +514,10 @@ void stake::reward(name account, asset quantity) { a.own_share = quantity.amount; }); } - modify_stat(token_code, [&](auto& s) { s.total_staked += quantity.amount; }); + modify_stat(token_code, [&](auto& s) { + s.total_staked += quantity.amount; + s.last_reward = time_point_sec(::now()); + }); INLINE_ACTION_SENDER(eosio::token, issue)(config::token_name, {issuer, config::reward_name}, {issuer, quantity, ""}); INLINE_ACTION_SENDER(eosio::token, transfer)(config::token_name, {issuer, config::reward_name}, diff --git a/tests/cyber.govern_tests.cpp b/tests/cyber.govern_tests.cpp index c69b8d8b1..976d287af 100644 --- a/tests/cyber.govern_tests.cpp +++ b/tests/cyber.govern_tests.cpp @@ -54,7 +54,7 @@ class cyber_govern_tester : public golos_tester { BOOST_TEST_MESSAGE("--- creating token and stake"); BOOST_CHECK_EQUAL(success(), token.create(_issuer, asset(max_supply_amount, token._symbol))); BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, - std::vector{30, 10, 3, 1}, cfg::balances_update_window, 7 * 24 * 60 * 60, 52)); + std::vector{30, 10, 3, 1}, 7 * 24 * 60 * 60, 52)); BOOST_TEST_MESSAGE("--- installing governance contract"); install_contract(govern_account_name, contracts::govern_wasm(), contracts::govern_abi()); diff --git a/tests/cyber.stake_test_api.hpp b/tests/cyber.stake_test_api.hpp index 859b9db10..456130a72 100644 --- a/tests/cyber.stake_test_api.hpp +++ b/tests/cyber.stake_test_api.hpp @@ -14,7 +14,7 @@ struct cyber_stake_api: base_contract_api { ////actions action_result create(account_name issuer, symbol token_symbol, - std::vector max_proxies, int64_t frame_length, int64_t payout_step_length, uint16_t payout_steps_num, + std::vector max_proxies, int64_t payout_step_length, uint16_t payout_steps_num, int64_t min_own_staked_for_election = 0) { _tester->delegate_authority(issuer, {_code}, cyber::config::token_name, N(issue), cyber::config::reward_name); @@ -23,7 +23,6 @@ struct cyber_stake_api: base_contract_api { return push(N(create), issuer, args() ("token_symbol", token_symbol) ("max_proxies", max_proxies) - ("frame_length", frame_length) ("payout_step_length", payout_step_length) ("payout_steps_num", payout_steps_num) ("min_own_staked_for_election", min_own_staked_for_election) @@ -210,10 +209,11 @@ struct cyber_stake_api: base_contract_api { return variant(); } - variant make_stats(symbol token_symbol, int64_t total_staked, bool enabled = false) { + variant make_stats(symbol token_symbol, int64_t total_staked, bool enabled = false, time_point_sec last_reward = time_point_sec()) { return mvo() ("token_code", token_symbol.to_symbol_code()) ("total_staked", total_staked) + ("last_reward", last_reward) ("enabled", enabled); } }; diff --git a/tests/cyber.stake_tests.cpp b/tests/cyber.stake_tests.cpp index 59428524b..2069bdef8 100644 --- a/tests/cyber.stake_tests.cpp +++ b/tests/cyber.stake_tests.cpp @@ -49,7 +49,7 @@ class cyber_stake_tester : public golos_tester { BOOST_TEST_MESSAGE("--- creating token and stake"); BOOST_CHECK_EQUAL(success(), token.create(_issuer, asset(10000000000, token._symbol))); BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, - std::vector{30, 10, 3, 1}, cfg::balances_update_window, 7 * 24 * 60 * 60, 52)); + std::vector{30, 10, 3, 1}, 7 * 24 * 60 * 60, 52)); BOOST_TEST_MESSAGE("--- installing governance contract"); install_contract(govern_account_name, contracts::govern_wasm(), contracts::govern_abi()); @@ -192,7 +192,7 @@ BOOST_FIXTURE_TEST_CASE(basic_tests, cyber_stake_tester) try { BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _bob, stake_b, "")); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _carol, stake_c, "")); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, max_proxies, frame_length, 7 * 24 * 60 * 60, 52)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, max_proxies, 7 * 24 * 60 * 60, 52)); BOOST_CHECK_EQUAL(success(), stake.open(_alice, token._symbol.to_symbol_code())); BOOST_CHECK_EQUAL(success(), stake.open(_bob, token._symbol.to_symbol_code())); BOOST_CHECK_EQUAL(success(), stake.open(_carol, token._symbol.to_symbol_code())); @@ -283,7 +283,7 @@ BOOST_FIXTURE_TEST_CASE(increase_proxy_level_test, cyber_stake_tester) try { double pct_c = 0.2; asset staked(10000000, token._symbol); BOOST_CHECK_EQUAL(success(), token.create(_issuer, asset(1000000000, token._symbol))); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, max_proxies, frame_length, 7 * 24 * 60 * 60, 52)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, max_proxies, 7 * 24 * 60 * 60, 52)); BOOST_CHECK_EQUAL(success(), stake.open(_alice, token._symbol.to_symbol_code())); BOOST_CHECK_EQUAL(success(), stake.open(_bob, token._symbol.to_symbol_code())); BOOST_CHECK_EQUAL(success(), stake.open(_carol, token._symbol.to_symbol_code())); @@ -341,7 +341,7 @@ BOOST_FIXTURE_TEST_CASE(open_test, cyber_stake_tester) try { asset stake_u(100, token._symbol); BOOST_CHECK_EQUAL(success(), token.create(_issuer, asset(10000000000, token._symbol))); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _alice, stake_u , "")); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {1}, 1, 7 * 24 * 60 * 60, 52)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {1}, 7 * 24 * 60 * 60, 52)); BOOST_CHECK_EQUAL(success(), token.transfer(_alice, _code, stake_u)); BOOST_CHECK_EQUAL(err.agent_exists(), stake.open(_alice, token._symbol.to_symbol_code())); BOOST_CHECK_EQUAL(success(), stake.open(_bob, token._symbol.to_symbol_code())); @@ -368,7 +368,7 @@ BOOST_FIXTURE_TEST_CASE(bw_tests, cyber_stake_tester) try { BOOST_CHECK_EQUAL(success(), token.open(_carol, token._symbol, _carol)); // resource usage BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _issuer, stake_w, "")); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, max_proxies, frame_length, 7 * 24 * 60 * 60, 52)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, max_proxies, 7 * 24 * 60 * 60, 52)); BOOST_CHECK_EQUAL(success(), token.transfer(_alice, _code, stake_u)); BOOST_CHECK_EQUAL(success(), token.transfer(_bob, _code, stake_u)); BOOST_CHECK_EQUAL(success(), stake.enable(_issuer, token._symbol)); @@ -410,7 +410,7 @@ BOOST_FIXTURE_TEST_CASE(general_test, cyber_stake_tester) try { int64_t step_amount = stake_amount / payout_steps_num; BOOST_CHECK_EQUAL(success(), token.create(_issuer, token.from_amount(100500))); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _alice, token.from_amount(stake_amount), "")); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 10, 3, 1}, 600, payout_step_length, payout_steps_num)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 10, 3, 1}, payout_step_length, payout_steps_num)); BOOST_CHECK_EQUAL(err.no_agent(), stake.withdraw(_alice, token.from_amount(stake_amount))); BOOST_CHECK_EQUAL(success(), token.transfer(_alice, _code, token.from_amount(stake_amount))); BOOST_CHECK_EQUAL(err.no_funds(), stake.withdraw(_alice, token.from_amount(stake_amount + 1))); @@ -475,7 +475,7 @@ BOOST_FIXTURE_TEST_CASE(proxy_test, cyber_stake_tester) try { BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _alice, token.from_amount(stake_amount), "")); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _bob, token.from_amount(stake_amount), "")); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _carol, token.from_amount(stake_amount), "")); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 10, 3, 1}, 600, 100500, 1)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 10, 3, 1}, 100500, 1)); BOOST_CHECK_EQUAL(success(), token.transfer(_alice, _code, token.from_amount(stake_amount))); BOOST_CHECK_EQUAL(success(), token.transfer(_bob, _code, token.from_amount(stake_amount))); BOOST_CHECK_EQUAL(success(), token.transfer(_carol, _code, token.from_amount(stake_amount))); @@ -522,8 +522,7 @@ BOOST_FIXTURE_TEST_CASE(proxy_level_test, cyber_stake_tester) try { BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _alice, token.from_amount(stake_amount), "")); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _bob, token.from_amount(stake_amount), "")); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _carol, token.from_amount(stake_amount), "")); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 3, 2, 1}, - 2 * cfg::block_interval_ms / 1000, 100500, 1)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 3, 2, 1}, 100500, 1)); BOOST_CHECK_EQUAL(success(), token.transfer(_alice, _code, token.from_amount(stake_amount))); BOOST_CHECK_EQUAL(success(), token.transfer(_bob, _code, token.from_amount(stake_amount))); BOOST_CHECK_EQUAL(success(), token.transfer(_carol, _code, token.from_amount(stake_amount))); @@ -631,7 +630,7 @@ BOOST_FIXTURE_TEST_CASE(fee_parallel_test, cyber_stake_tester) try { BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _carol, token.from_amount(stake_amount), "")); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _whale, token.from_amount(stake_amount), "")); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 3, 2, 1}, 1, 100500, 1)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 3, 2, 1}, 100500, 1)); BOOST_CHECK_EQUAL(success(), token.transfer(_alice, _code, token.from_amount(stake_amount))); BOOST_CHECK_EQUAL(success(), token.transfer(_bob, _code, token.from_amount(stake_amount))); BOOST_CHECK_EQUAL(success(), token.transfer(_carol, _code, token.from_amount(stake_amount))); @@ -681,7 +680,7 @@ BOOST_FIXTURE_TEST_CASE(fee_series_test, cyber_stake_tester) try { BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _bob, token.from_amount(stake_amount), "")); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _carol, token.from_amount(stake_amount), "")); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 3, 2, 1}, 1, 100500, 1)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 3, 2, 1}, 100500, 1)); BOOST_CHECK_EQUAL(success(), token.transfer(_alice, _code, token.from_amount(stake_amount))); BOOST_CHECK_EQUAL(success(), token.transfer(_bob, _code, token.from_amount(stake_amount))); BOOST_CHECK_EQUAL(success(), token.transfer(_carol, _code, token.from_amount(stake_amount))); @@ -738,7 +737,7 @@ BOOST_FIXTURE_TEST_CASE(no_fee_test, cyber_stake_tester) try { BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _alice, token.from_amount(stake_amount), "")); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _bob, token.from_amount(stake_amount), "")); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 3, 2, 1}, 1, 100500, 1)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 3, 2, 1}, 100500, 1)); BOOST_CHECK_EQUAL(success(), token.transfer(_alice, _code, token.from_amount(stake_amount))); BOOST_CHECK_EQUAL(success(), token.transfer(_bob, _code, token.from_amount(stake_amount))); @@ -767,7 +766,7 @@ BOOST_FIXTURE_TEST_CASE(min_staked_test, cyber_stake_tester) try { BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _alice, token.from_amount(stake_amount), "")); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _bob, token.from_amount(stake_amount), "")); BOOST_CHECK_EQUAL(success(), token.issue(_issuer, _carol, token.from_amount(stake_amount), "")); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 10, 3, 1}, 1, 100500, 1, min_for_election)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {30, 10, 3, 1}, 100500, 1, min_for_election)); int64_t alice_stake = min_for_election - 1; BOOST_CHECK_EQUAL(success(), token.transfer(_alice, _code, token.from_amount(alice_stake))); BOOST_CHECK_EQUAL(success(), stake.setproxylvl(_alice, token._symbol.to_symbol_code(), 2)); @@ -822,7 +821,7 @@ BOOST_FIXTURE_TEST_CASE(_3x3_test, cyber_stake_tester) try { stake_amounts.back() = stake_amount; BOOST_CHECK_EQUAL(success(), token.create(_issuer, token.from_amount(1000 * stake_amount * (max_proxy_level + 1) * agents_on_level))); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {agents_on_level, agents_on_level}, 1, 1, 1)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {agents_on_level, agents_on_level}, 1, 1)); auto agents = create_agents(max_proxy_level, agents_on_level, stake_amounts); int64_t fee = 6500; @@ -868,7 +867,7 @@ BOOST_FIXTURE_TEST_CASE(fuzz_test, cyber_stake_tester) try { auto total_staked = 0; BOOST_CHECK_EQUAL(success(), token.create(_issuer, token.from_amount(1000 * stake_amount * (max_proxy_level + 1) * agents_on_level))); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {agents_on_level, agents_on_level, agents_on_level, agents_on_level}, 1, 1, 1)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, {agents_on_level, agents_on_level, agents_on_level, agents_on_level}, 1, 1)); auto agents = create_agents(max_proxy_level, agents_on_level, stake_amount); std::srand(0); total_staked += stake_amount * (max_proxy_level + 1) * agents_on_level; @@ -982,7 +981,7 @@ BOOST_FIXTURE_TEST_CASE(recursive_update_test, cyber_stake_tester) try { double reward_factor = 0.1; BOOST_CHECK_EQUAL(success(), token.create(_issuer, asset(1000000000, token._symbol))); - BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, max_proxies, frame_length, 7 * 24 * 60 * 60, 52)); + BOOST_CHECK_EQUAL(success(), stake.create(_issuer, token._symbol, max_proxies, 7 * 24 * 60 * 60, 52)); uint8_t level = 0; size_t u = 0;