void database::pay_workers( share_type& budget ) { // ilog("Processing payroll! Available budget is ${b}", ("b", budget)); vector<std::reference_wrapper<const worker_object>> active_workers; get_index_type<worker_index>().inspect_all_objects([this, &active_workers](const object& o) { const worker_object& w = static_cast<const worker_object&>(o); auto now = _pending_block.timestamp; if( w.is_active(now) && w.approving_stake(_vote_tally_buffer) > 0 ) active_workers.emplace_back(w); }); // worker with more votes is preferred // if two workers exactly tie for votes, worker with lower ID is preferred std::sort(active_workers.begin(), active_workers.end(), [this](const worker_object& wa, const worker_object& wb) { share_type wa_vote = wa.approving_stake(_vote_tally_buffer); share_type wb_vote = wb.approving_stake(_vote_tally_buffer); if( wa_vote != wb_vote ) return wa_vote > wb_vote; return wa.id < wb.id; }); for( int i = 0; i < active_workers.size() && budget > 0; ++i ) { const worker_object& active_worker = active_workers[i]; share_type requested_pay = active_worker.daily_pay; if( _pending_block.timestamp - get_dynamic_global_properties().last_budget_time != fc::days(1) ) { fc::uint128 pay(requested_pay.value); pay *= (_pending_block.timestamp - get_dynamic_global_properties().last_budget_time).count(); pay /= fc::days(1).count(); requested_pay = pay.to_uint64(); } share_type actual_pay = std::min(budget, requested_pay); //ilog(" ==> Paying ${a} to worker ${w}", ("w", active_worker.id)("a", actual_pay)); modify(active_worker, [&](worker_object& w) { w.worker.visit(worker_pay_visitor(actual_pay, *this)); }); budget -= actual_pay; } }
void database::update_maintenance_flag( bool new_maintenance_flag ) { modify( get_dynamic_global_properties(), [&]( dynamic_global_property_object& dpo ) { auto maintenance_flag = dynamic_global_property_object::maintenance_flag; dpo.dynamic_flags = (dpo.dynamic_flags & ~maintenance_flag) | (new_maintenance_flag ? maintenance_flag : 0); } ); return; }
void database::update_signing_witness(const witness_object& signing_witness, const signed_block& new_block) { const global_property_object& gpo = get_global_properties(); const dynamic_global_property_object& dpo = get_dynamic_global_properties(); uint64_t new_block_aslot = dpo.current_aslot + get_slot_at_time( new_block.timestamp ); share_type witness_pay = std::min( gpo.parameters.witness_pay_per_block, dpo.witness_budget ); modify( dpo, [&]( dynamic_global_property_object& _dpo ) { _dpo.witness_budget -= witness_pay; } ); deposit_witness_pay( signing_witness, witness_pay ); modify( signing_witness, [&]( witness_object& _wit ) { _wit.last_aslot = new_block_aslot; } ); }
block_id_type database::head_block_id()const { return get_dynamic_global_properties().head_block_id; }
uint32_t database::head_block_num()const { return get_dynamic_global_properties().head_block_number; }
time_point_sec database::head_block_time()const { return get_dynamic_global_properties().time; }