6 #include <boost/range/adaptor/filtered.hpp>
7 #include <boost/lambda/lambda.hpp>
8 #include <boost/multi_index/detail/unbounded.hpp>
13 #include <scorum/utils/math.hpp>
20 FC_ASSERT(start_date < end_date,
"Start time ${1} must be less end time ${2}", (
"1", start_date)(
"2", end_date));
22 auto per_block = balance;
24 uint32_t delta_in_sec = end_date.sec_since_epoch() - start_date.sec_since_epoch();
27 per_block /= delta_in_sec;
30 per_block.amount = std::max(per_block.amount,
share_type(1));
36 time_point_sec deadline,
37 time_point_sec last_block_time,
40 FC_ASSERT(start <= deadline,
"Start time ${1} must be less or equal end time ${2}", (
"1", start)(
"2", deadline));
42 auto aligned_start_sec
45 auto aligned_deadline_sec
49 auto per_block = balance / per_blocks_count;
60 , _dprops_svc(db.dynamic_global_property_service())
68 FC_ASSERT(balance.
symbol() ==
SP_SYMBOL,
"Invalid asset type (symbol).");
69 FC_ASSERT(start < end,
"Invalid dates.");
81 FC_CAPTURE_AND_RETHROW((balance)(start)(end))
95 template <budget_type budget_type_v>
98 , _dgp_svc(db.dynamic_global_property_service())
99 , _account_svc(db.account_service())
103 template <budget_type budget_type_v>
107 const asset& balance,
108 time_point_sec start,
110 const std::string& json_metadata)
115 FC_ASSERT(balance.
amount > 0,
"Invalid balance.");
117 auto head_block_time = _dgp_svc.head_block_time();
120 auto aligned_start_sec
122 auto cashout_sec = aligned_start_sec + SCORUM_ADVERTISING_CASHOUT_PERIOD_SEC -
SCORUM_BLOCK_INTERVAL;
130 budget.
created = head_block_time;
132 budget.
start = start;
138 _account_svc.decrease_balance(_account_svc.get_account(
owner), balance);
144 FC_CAPTURE_AND_RETHROW((
owner)(balance)(start)(end)(json_metadata))
147 template <budget_type budget_type_v>
155 FC_CAPTURE_AND_RETHROW((
id))
158 template <budget_type budget_type_v>
163 return this->
template get_by<by_uuid>(uuid);
165 FC_CAPTURE_AND_RETHROW((uuid))
172 return nullptr != this->
template find_by<by_uuid>(
id);
174 FC_CAPTURE_AND_RETHROW((
id))
177 template <budget_type budget_type_v>
185 FC_CAPTURE_AND_RETHROW((
id))
188 template <budget_type budget_type_v>
195 FC_CAPTURE_AND_RETHROW(())
198 template <budget_type budget_type_v>
202 namespace ba = boost::adaptors;
209 auto& idx = this->db_impl().template get_index<adv_budget_index<budget_type_v>, by_per_block>();
210 auto from = idx.begin();
211 auto to = idx.lower_bound(
false);
213 auto rng = boost::make_iterator_range(from, to)
217 for (
auto it = rng.begin(); limit && it != rng.end(); ++it, --limit)
219 result.push_back(std::cref(*it));
223 FC_CAPTURE_AND_RETHROW((until)(limit))
226 template <budget_type budget_type_v>
232 return this->get_top_budgets(until, -1);
234 FC_CAPTURE_AND_RETHROW((until))
237 template <budget_type budget_type_v>
238 std::set<std::string>
240 uint32_t limit)
const
244 std::set<std::string>
result;
246 const auto& budgets_by_owner_name
247 = this->db_impl().template get_index<adv_budget_index<budget_type_v>, by_owner_name>();
250 for (
auto itr = budgets_by_owner_name.lower_bound(lower_bound_owner_name);
251 limit && itr != budgets_by_owner_name.end(); ++itr)
254 result.insert(itr->owner);
258 FC_CAPTURE_AND_RETHROW((lower_bound_owner_name)(limit))
261 template <budget_type budget_type_v>
267 return this->
template get_range_by<by_owner_name>(
owner <= ::boost::lambda::_1, ::boost::lambda::_1 <=
owner);
269 FC_CAPTURE_AND_RETHROW((
owner))
272 template <budget_type budget_type_v>
278 auto head_time = _dgp_svc.head_block_time();
280 ::boost::lambda::_1 <= head_time);
282 FC_CAPTURE_AND_RETHROW()
285 template <budget_type budget_type_v>
293 finish_budget(budget.
uuid);
298 template <budget_type budget_type_v>
300 const asset& owner_incoming,
301 const asset& budget_outgoing)
314 template <budget_type budget_type_v>
320 budgets_outgo += budget.budget_pending_outgo;
321 _account_svc.increase_balance(_account_svc.get_account(budget.owner), budget.owner_pending_income);
331 b.
cashout_time = _dgp_svc.head_block_time() + SCORUM_ADVERTISING_CASHOUT_PERIOD_SEC;
335 return budgets_outgo;
340 const auto& budget = get(uuid);
344 statistic.
volume -= budget.balance;
354 template <budget_type budget_type_v>
359 auto empty_budgets = this->
template get_range_by<by_balances>(
362 return empty_budgets;
365 template <budget_type budget_type_v>
369 if (budget_type_v == budget_type::banner)
375 _dgp_svc.update([&](dynamic_global_property_object& dgp) { callback(dgp.advertising.post_budgets); });
379 FC_THROW(
"unsuported budget type");
383 template class dbs_advertising_budget<budget_type::post>;
384 template class dbs_advertising_budget<budget_type::banner>;
asset owner_pending_income
fc::time_point_sec cashout_time
fc::shared_string json_metadata
asset budget_pending_outgo
tracks the blockchain state in an extensible manner
const adv_budget_object< budget_type_v > * find(const oid< adv_budget_object< budget_type_v >> &id) const override
budgets_type get_budgets() const override
std::set< std::string > lookup_budget_owners(const std::string &lower_bound_owner_name, uint32_t limit) const override
typename adv_budget_service_i< budget_type_v >::budgets_type budgets_type
void finish_budget(const uuid_type &uuid) override
const adv_budget_object< budget_type_v > & create_budget(const uuid_type &uuid, const account_name_type &owner, const asset &balance, fc::time_point_sec start_date, fc::time_point_sec end_date, const std::string &json_metadata) override
budgets_type get_pending_budgets() const override
budgets_type get_top_budgets(const fc::time_point_sec &until, uint16_t limit) const override
void update_pending_payouts(const adv_budget_object< budget_type_v > &budget, const asset &owner_incoming, const asset &budget_outgoing) override
budgets_type get_empty_budgets() const override
asset allocate_cash(const adv_budget_object< budget_type_v > &budget) override
dbs_advertising_budget(database &db)
asset perform_pending_payouts(const budgets_type &budgets) override
asset allocate_cash(const fund_budget_object &budget) override
dbs_fund_budget(database &db)
const fund_budget_object & create_budget(const asset &balance, fc::time_point_sec start, fc::time_point_sec end) override
virtual const object_type & create(const modifier_type &modifier) override
virtual void update(const modifier_type &modifier) override
virtual const object_type & get() const override
virtual void remove() override
virtual bool is_exists() const override
Maintains global state information.
adv_total_stats advertising
this section display information about advertising totals
#define SCORUM_BLOCK_INTERVAL
const TObject * find_by(db_index &db_idx, const Key &arg)
const TObject & get_by(db_index &db_idx, const Key &arg)
const TObject & create(db_index &db_idx, modifier_type< TObject > modifier)
const unbounded_placeholder unbounded
asset adv_calculate_per_block(time_point_sec start, time_point_sec deadline, time_point_sec block_time_sec, const asset &balance)
asset fund_calculate_per_block(time_point_sec start, time_point_sec deadline, const asset &balance)
void update(fc::flat_map< uuid_type, bet_resolved_operation > &results, const bet_data &bet, asset income, uuid_type game_uuid, bet_resolve_kind kind)
fc::safe< share_value_type > share_type
fc::fixed_string_16 account_name_type
boost::uuids::uuid uuid_type
asset budget_pending_outgo
pending volume which will go to the activity pool
asset owner_pending_income
pending volume which will be returned to budget owners
asset volume
sum of all budgets' balance
budget_type_stat banner_budgets
total's statistic for advertising banner budgets
virtual fc::time_point_sec head_block_time() const =0
asset_symbol_type symbol() const