10 #include <scorum/rewards_math/formulas.hpp>
40 #include <fc/bloom_filter.hpp>
41 #include <fc/smart_ref_impl.hpp>
42 #include <fc/crypto/hex.hpp>
43 #include <fc/container/utils.hpp>
45 #include <boost/range/iterator_range.hpp>
46 #include <boost/algorithm/string.hpp>
56 class database_api_impl;
73 std::vector<std::set<std::string>>
get_key_references(std::vector<public_key_type> key)
const;
76 std::vector<extended_account>
get_accounts(
const std::vector<std::string>& names)
const;
78 std::vector<optional<account_api_obj>>
lookup_account_names(
const std::vector<std::string>& account_names)
const;
79 std::set<std::string>
lookup_accounts(
const std::string& lower_bound_name, uint32_t limit)
const;
83 template <
typename BudgetService>
84 std::vector<budget_api_obj>
get_budgets(BudgetService& budget_service,
const std::set<std::string>& names)
const
87 "names size must be less or equal than ${1}",
90 std::vector<budget_api_obj> results;
92 for (
const auto& name : names)
94 auto budgets = budget_service.get_budgets(name);
100 for (
const auto& budget : budgets)
102 results.emplace_back(budget);
108 template <
typename BudgetService>
109 std::set<std::string>
115 return budget_service.lookup_budget_owners(lower_bound_name, limit);
124 std::vector<optional<witness_api_obj>>
get_witnesses(
const std::vector<witness_id_type>& witness_ids)
const;
126 std::set<account_name_type>
lookup_witness_accounts(
const std::string& lower_bound_name, uint32_t limit)
const;
131 uint32_t limit)
const;
134 uint32_t limit)
const;
141 const flat_set<public_key_type>& available_keys)
const;
168 my->_db.with_read_lock([&]() { my->set_block_applied_callback(cb); });
205 : _db(*ctx.app.chain_database())
207 wlog(
"creating database api ${x}", (
"x", int64_t(
this)));
212 elog(
"freeing database api ${x}", (
"x", int64_t(
this)));
227 return my->_db.with_read_lock([&]() {
return my->get_config(); });
237 return my->_db.with_read_lock([&]() {
return my->get_dynamic_global_properties(); });
249 if (BOOST_LIKELY(r !=
nullptr))
286 return my->_db.with_read_lock([&]() {
return my->get_chain_id(); });
307 return my->_db.with_read_lock([&]() {
return my->get_key_references(key); });
316 "database_api::get_key_references has been deprecated. Please use "
317 "account_by_key_api::get_key_references instead.");
318 std::vector<std::set<std::string>> final_result;
330 return my->_db.with_read_lock([&]() {
return my->get_accounts(names); });
335 const auto& idx =
_db.get_index<account_index>().indices().get<by_name>();
337 std::vector<extended_account> results;
341 for (
auto& name : names)
343 auto itr = idx.find(name);
344 if (itr != idx.end())
347 api_obj.voting_power = rewards_math::calculate_restoring_power(
350 api_obj.head_block_number = dprop.head_block_number;
351 api_obj.last_irreversible_block_num = dprop.last_irreversible_block_num;
352 api_obj.head_block_id = dprop.head_block_id;
355 results.push_back(std::move(
api_obj));
357 auto vitr = vidx.lower_bound(boost::make_tuple(itr->id,
witness_id_type()));
358 while (vitr != vidx.end() && vitr->account == itr->id)
360 results.back().witness_votes.insert(
_db.get(vitr->witness).owner);
371 return my->_db.with_read_lock([&]() {
return my->get_account_references(account_id); });
388 FC_ASSERT(
false,
"database_api::get_account_references --- Needs to be refactored for scorum.");
391 std::vector<optional<account_api_obj>>
394 return my->_db.with_read_lock([&]() {
return my->lookup_account_names(account_names); });
397 std::vector<optional<account_api_obj>>
400 std::vector<optional<account_api_obj>>
result;
401 result.reserve(account_names.size());
402 for (
auto& name : account_names)
404 auto itr =
_db.find<account_object, by_name>(name);
412 result.push_back(optional<account_api_obj>());
421 return my->_db.with_read_lock([&]() {
return my->lookup_accounts(lower_bound_name, limit); });
427 const auto& accounts_by_name =
_db.get_index<account_index>().indices().get<by_name>();
428 std::set<std::string>
result;
430 for (
auto itr = accounts_by_name.lower_bound(lower_bound_name); limit-- && itr != accounts_by_name.end(); ++itr)
440 return my->_db.with_read_lock([&]() {
return my->get_account_count(); });
445 return _db.get_index<account_index>().indices().size();
450 return my->_db.with_read_lock([&]() {
451 std::vector<owner_authority_history_api_obj> results;
453 const auto& hist_idx = my->_db.get_index<owner_authority_history_index>().indices().get<by_account>();
454 auto itr = hist_idx.lower_bound(account);
456 while (itr != hist_idx.end() && itr->account == account)
468 return my->_db.with_read_lock([&]() {
469 optional<account_recovery_request_api_obj>
result;
471 const auto& rec_idx = my->_db.get_index<account_recovery_request_index>().indices().get<by_account>();
472 auto req = rec_idx.find(account);
474 if (req != rec_idx.end())
483 return my->_db.with_read_lock([&]() {
484 optional<escrow_api_obj>
result;
501 return my->_db.with_read_lock([&]() {
502 std::vector<withdraw_route>
result;
504 const auto& acc = my->_db.account_service().get_account(account);
510 auto route = by_route.lower_bound(acc.id);
529 auto route = by_dest.lower_bound(acc.id);
552 optional<account_bandwidth_api_obj>
result;
557 boost::make_tuple(account, type));
571 std::vector<optional<witness_api_obj>>
574 return my->_db.with_read_lock([&]() {
return my->get_witnesses(witness_ids); });
577 std::vector<optional<witness_api_obj>>
580 std::vector<optional<witness_api_obj>>
result;
581 result.reserve(witness_ids.size());
582 std::transform(witness_ids.begin(), witness_ids.end(), std::back_inserter(
result),
584 if (auto o = _db.find(id))
591 fc::optional<witness_api_obj> database_api::get_witness_by_account(
const std::string& account_name)
const
593 return my->_db.with_read_lock([&]() {
return my->get_witness_by_account(account_name); });
596 std::vector<witness_api_obj> database_api::get_witnesses_by_vote(
const std::string& from, uint32_t limit)
const
598 return my->_db.with_read_lock([&]() {
602 std::vector<witness_api_obj>
result;
605 const auto& name_idx = my->_db.get_index<
witness_index>().indices().get<by_name>();
606 const auto& vote_idx = my->_db.get_index<
witness_index>().indices().get<by_vote_name>();
608 auto itr = vote_idx.begin();
611 auto nameitr = name_idx.find(from);
612 FC_ASSERT(nameitr != name_idx.end(),
"invalid witness name ${n}", (
"n", from));
613 itr = vote_idx.iterator_to(*nameitr);
616 while (itr != vote_idx.end() &&
result.size() < limit && itr->votes > 0)
625 fc::optional<witness_api_obj> database_api_impl::get_witness_by_account(
const std::string& account_name)
const
627 const auto& idx = _db.get_index<
witness_index>().indices().get<by_name>();
628 auto itr = idx.find(account_name);
629 if (itr != idx.end())
634 std::set<account_name_type> database_api::lookup_witness_accounts(
const std::string& lower_bound_name,
635 uint32_t limit)
const
637 return my->_db.with_read_lock([&]() {
return my->lookup_witness_accounts(lower_bound_name, limit); });
640 std::set<account_name_type> database_api_impl::lookup_witness_accounts(
const std::string& lower_bound_name,
641 uint32_t limit)
const
644 const auto& witnesses_by_id = _db.get_index<
witness_index>().indices().get<by_id>();
649 std::set<account_name_type> witnesses_by_account_name;
651 if (witness.owner >= lower_bound_name)
652 witnesses_by_account_name.insert(witness.owner);
654 auto end_iter = witnesses_by_account_name.begin();
655 while (end_iter != witnesses_by_account_name.end() && limit--)
657 witnesses_by_account_name.erase(end_iter, witnesses_by_account_name.end());
658 return witnesses_by_account_name;
661 uint64_t database_api::get_witness_count()
const
663 return my->_db.with_read_lock([&]() {
return my->get_witness_count(); });
666 uint64_t database_api_impl::get_witness_count()
const
673 return my->_db.with_read_lock([&]() {
return my->get_advertising_property(); });
681 std::set<account_name_type> database_api::lookup_registration_committee_members(
const std::string& lower_bound_name,
682 uint32_t limit)
const
685 return my->_db.with_read_lock([&]() {
return my->lookup_registration_committee_members(lower_bound_name, limit); });
688 std::set<account_name_type> database_api::lookup_development_committee_members(
const std::string& lower_bound_name,
689 uint32_t limit)
const
691 return my->_db.with_read_lock([&]() {
return my->lookup_development_committee_members(lower_bound_name, limit); });
694 std::set<account_name_type>
695 database_api_impl::lookup_registration_committee_members(
const std::string& lower_bound_name, uint32_t limit)
const
699 return chain::committee::lookup_members<registration_committee_member_index>(_db, lower_bound_name, limit);
702 std::set<account_name_type> database_api_impl::lookup_development_committee_members(
const std::string& lower_bound_name,
703 uint32_t limit)
const
707 return chain::committee::lookup_members<dev_committee_member_index>(_db, lower_bound_name, limit);
710 std::vector<proposal_api_obj> database_api::lookup_proposals()
const
712 return my->_db.with_read_lock([&]() {
return my->lookup_proposals(); });
715 std::vector<proposal_api_obj> database_api_impl::lookup_proposals()
const
719 std::vector<proposal_api_obj> proposals;
722 proposals.push_back(obj);
730 return my->_db.with_read_lock([&]() {
return my->get_registration_committee(); });
742 return my->_db.with_read_lock([&]() {
return my->get_development_committee(); });
761 return my->_db.with_read_lock([&]() {
return my->get_transaction_hex(trx); });
766 return fc::to_hex(fc::raw::pack(trx));
770 const flat_set<public_key_type>& available_keys)
const
772 return my->_db.with_read_lock([&]() {
return my->get_required_signatures(trx, available_keys); });
775 std::set<public_key_type>
777 const flat_set<public_key_type>& available_keys)
const
781 get_chain_id(), available_keys,
782 [&](
const std::string& account_name) {
783 return authority(_db.get<account_authority_object, by_account>(account_name).active);
785 [&](
const std::string& account_name) {
786 return authority(_db.get<account_authority_object, by_account>(account_name).owner);
788 [&](
const std::string& account_name) {
789 return authority(_db.get<account_authority_object, by_account>(account_name).posting);
791 SCORUM_MAX_SIG_CHECK_DEPTH);
796 std::set<public_key_type> database_api::get_potential_signatures(
const signed_transaction& trx)
const
798 return my->_db.with_read_lock([&]() {
return my->get_potential_signatures(trx); });
801 std::set<public_key_type> database_api_impl::get_potential_signatures(
const signed_transaction& trx)
const
804 std::set<public_key_type>
result;
806 get_chain_id(), flat_set<public_key_type>(),
808 const auto& auth = _db.get<account_authority_object, by_account>(account_name).
active;
809 for (
const auto& k : auth.get_keys())
814 const auto& auth = _db.get<account_authority_object, by_account>(account_name).
owner;
815 for (
const auto& k : auth.get_keys())
820 const auto& auth = _db.get<account_authority_object, by_account>(account_name).
posting;
821 for (
const auto& k : auth.get_keys())
825 SCORUM_MAX_SIG_CHECK_DEPTH);
833 return my->_db.with_read_lock([&]() {
return my->verify_authority(trx); });
840 [&](
const std::string& account_name) {
841 return authority(_db.get<account_authority_object, by_account>(account_name).active);
843 [&](
const std::string& account_name) {
844 return authority(_db.get<account_authority_object, by_account>(account_name).owner);
846 [&](
const std::string& account_name) {
847 return authority(_db.get<account_authority_object, by_account>(account_name).posting);
849 SCORUM_MAX_SIG_CHECK_DEPTH);
853 bool database_api::verify_account_authority(
const std::string& name_or_id,
854 const flat_set<public_key_type>& signers)
const
856 return my->_db.with_read_lock([&]() {
return my->verify_account_authority(name_or_id, signers); });
859 bool database_api_impl::verify_account_authority(
const std::string& name,
const flat_set<public_key_type>& keys)
const
861 FC_ASSERT(name.size() > 0);
862 auto account = _db.find<account_object, by_name>(name);
863 FC_ASSERT(account,
"no such account");
868 op.
from = account->name;
874 std::vector<vote_state> database_api::get_active_votes(
const std::string& author,
const std::string& permlink)
const
876 return my->_db.with_read_lock([&]() {
877 std::vector<vote_state>
result;
878 const auto& comment = my->_db.obtain_service<
dbs_comment>().get(author, permlink);
879 const auto& idx = my->_db.get_index<comment_vote_index>().indices().get<by_comment_voter>();
881 auto itr = idx.lower_bound(cid);
882 while (itr != idx.end() && itr->comment == cid)
884 const auto& vo = my->_db.get(itr->voter);
886 vstate.
voter = vo.name;
887 vstate.
weight = itr->weight;
888 vstate.
rshares = itr->rshares.value;
889 vstate.
percent = itr->vote_percent;
890 vstate.
time = itr->last_update;
899 std::vector<account_vote> database_api::get_account_votes(
const std::string& voter)
const
901 return my->_db.with_read_lock([&]() {
902 std::vector<account_vote>
result;
904 const auto& voter_acnt = my->_db.account_service().get_account(voter);
905 const auto& idx = my->_db.get_index<comment_vote_index>().indices().get<by_voter_comment>();
908 auto itr = idx.lower_bound(aid);
909 auto end = idx.upper_bound(aid);
912 const auto& vo = my->_db.get(itr->comment);
914 avote.
authorperm = vo.author +
"/" + fc::to_string(vo.permlink);
915 avote.
weight = itr->weight;
916 avote.
rshares = itr->rshares.value;
917 avote.
percent = itr->vote_percent;
918 avote.
time = itr->last_update;
931 std::vector<budget_api_obj> database_api::get_budgets(
const budget_type type,
const std::set<std::string>& names)
const
933 return my->_db.with_read_lock([&]() {
937 return my->get_budgets(my->_db.post_budget_service(), names);
938 case budget_type::banner:
939 return my->get_budgets(my->_db.banner_budget_service(), names);
941 return std::vector<budget_api_obj>();
946 std::set<std::string>
947 database_api::lookup_budget_owners(
const budget_type type,
const std::string& lower_bound_name, uint32_t limit)
const
949 return my->_db.with_read_lock([&]() {
953 return my->lookup_budget_owners(my->_db.post_budget_service(), lower_bound_name, limit);
954 case budget_type::banner:
955 return my->lookup_budget_owners(my->_db.banner_budget_service(), lower_bound_name, limit);
957 return std::set<std::string>();
967 std::vector<atomicswap_contract_api_obj> database_api::get_atomicswap_contracts(
const std::string&
owner)
const
969 return my->_db.with_read_lock([&]() {
return my->get_atomicswap_contracts(
owner); });
972 std::vector<atomicswap_contract_api_obj> database_api_impl::get_atomicswap_contracts(
const std::string&
owner)
const
974 std::vector<atomicswap_contract_api_obj> results;
976 auto& account_svc = _db.account_service();
977 const chain::account_object& owner_obj = account_svc.get_account(
owner);
981 auto contracts = atomicswap_service.
get_contracts(owner_obj);
982 for (
const chain::atomicswap_contract_object& contract : contracts)
991 const std::string& to,
992 const std::string& secret_hash)
const
994 return my->_db.with_read_lock([&]() {
return my->get_atomicswap_contract(from, to, secret_hash); });
998 const std::string& to,
999 const std::string& secret_hash)
const
1003 auto& account_svc = _db.account_service();
1004 const chain::account_object& from_obj = account_svc.get_account(from);
1005 const chain::account_object& to_obj = account_svc.get_account(to);
1009 const chain::atomicswap_contract_object& contract = atomicswap_service.
get_contract(from_obj, to_obj, secret_hash);
1014 std::vector<account_name_type> database_api::get_active_witnesses()
const
1016 return my->_db.with_read_lock([&]() {
1018 size_t n = wso.current_shuffled_witnesses.size();
1019 std::vector<account_name_type>
result;
1021 for (
size_t i = 0; i < n; i++)
1022 result.push_back(wso.current_shuffled_witnesses[i]);
1027 std::vector<scorumpower_delegation_api_obj>
1028 database_api::get_scorumpower_delegations(
const std::string& account,
const std::string& from, uint32_t limit)
const
1032 return my->_db.with_read_lock([&]() {
1033 std::vector<scorumpower_delegation_api_obj>
result;
1036 const auto& delegation_idx = my->_db.get_index<scorumpower_delegation_index, by_delegation>();
1037 auto itr = delegation_idx.lower_bound(boost::make_tuple(account, from));
1038 while (
result.size() < limit && itr != delegation_idx.end() && itr->delegator == account)
1048 std::vector<scorumpower_delegation_expiration_api_obj> database_api::get_expiring_scorumpower_delegations(
1049 const std::string& account, time_point_sec from, uint32_t limit)
const
1053 return my->_db.with_read_lock([&]() {
1054 std::vector<scorumpower_delegation_expiration_api_obj>
result;
1057 const auto& exp_idx = my->_db.get_index<scorumpower_delegation_expiration_index, by_account_expiration>();
1058 auto itr = exp_idx.lower_bound(boost::make_tuple(account, from));
1059 while (
result.size() < limit && itr != exp_idx.end() && itr->delegator == account)
1071 return my->_db.with_read_lock([&]() {
return my->_db.get_dba<
nft_object>().get_by<by_id>(
id); });
1076 return my->_db.with_read_lock([&]() {
return my->_db.get_dba<
nft_object>().get_by<by_name>(name); });
1081 return my->_db.with_read_lock([&]() {
return my->_db.get_dba<
nft_object>().get_by<by_uuid>(uuid); });
1084 std::vector<nft_api_obj> database_api::lookup_nft(int64_t
id, uint32_t limit)
const
1086 return my->_db.with_read_lock([&]() {
1089 const auto& index = my->_db.get_index<
nft_index>().indices().get<by_id>();
1090 std::vector<nft_api_obj>
result;
1092 for (
auto itr = index.lower_bound(
id); limit-- && itr != index.end(); ++itr)
1094 result.emplace_back(*itr);
1103 return my->_db.with_read_lock([&]() {
return my->_db.get_dba<
game_round_object>().get_by<by_uuid>(uuid); });
1106 std::vector<game_round_api_obj> database_api::lookup_game_round(int64_t
id, uint32_t limit)
const
1108 return my->_db.with_read_lock([&]() {
1111 const auto& index = my->_db.get_index<
game_round_index>().indices().get<by_id>();
1112 std::vector<game_round_api_obj>
result;
1114 for (
auto itr = index.lower_bound(
id); limit-- && itr != index.end(); ++itr)
1116 result.emplace_back(*itr);
std::vector< account_id_type > get_account_references(account_id_type account_id) const
dynamic_global_property_api_obj get_dynamic_global_properties() const
boost::signals2::scoped_connection _block_applied_connection
fc::optional< witness_api_obj > get_witness_by_account(const std::string &account_name) const
std::vector< extended_account > get_accounts(const std::vector< std::string > &names) const
database_api_impl(const scorum::app::api_context &ctx)
advertising_property_api_obj get_advertising_property() const
std::string get_transaction_hex(const signed_transaction &trx) const
std::set< std::string > lookup_budget_owners(BudgetService &budget_service, const std::string &lower_bound_name, uint32_t limit) const
development_committee_api_obj get_development_committee() const
std::set< public_key_type > get_potential_signatures(const signed_transaction &trx) const
std::set< account_name_type > lookup_registration_committee_members(const std::string &lower_bound_name, uint32_t limit) const
atomicswap_contract_info_api_obj get_atomicswap_contract(const std::string &from, const std::string &to, const std::string &secret_hash) const
uint64_t get_account_count() const
std::vector< optional< witness_api_obj > > get_witnesses(const std::vector< witness_id_type > &witness_ids) const
chain_id_type get_chain_id() const
std::set< account_name_type > lookup_witness_accounts(const std::string &lower_bound_name, uint32_t limit) const
std::vector< std::set< std::string > > get_key_references(std::vector< public_key_type > key) const
std::function< void(const fc::variant &)> _block_applied_callback
uint64_t get_witness_count() const
bool verify_authority(const signed_transaction &trx) const
void on_applied_block(const chain::signed_block &b)
bool verify_account_authority(const std::string &name_or_id, const flat_set< public_key_type > &signers) const
registration_committee_api_obj get_registration_committee() const
void set_block_applied_callback(std::function< void(const variant &block_id)> cb)
std::vector< atomicswap_contract_api_obj > get_atomicswap_contracts(const std::string &owner) const
std::set< account_name_type > lookup_development_committee_members(const std::string &lower_bound_name, uint32_t limit) const
std::vector< optional< account_api_obj > > lookup_account_names(const std::vector< std::string > &account_names) const
std::vector< proposal_api_obj > lookup_proposals() const
fc::variant_object get_config() const
std::set< public_key_type > get_required_signatures(const signed_transaction &trx, const flat_set< public_key_type > &available_keys) const
std::set< std::string > lookup_accounts(const std::string &lower_bound_name, uint32_t limit) const
std::vector< budget_api_obj > get_budgets(BudgetService &budget_service, const std::set< std::string > &names) const
scorum::chain::database & _db
database_api(const scorum::app::api_context &ctx)
tracks the blockchain state in an extensible manner
time_point_sec head_block_time() const
chain_id_type get_chain_id() const
fc::signal< void(const signed_block &)> applied_block
virtual const atomicswap_contract_object & get_contract(const account_object &from, const account_object &to, const std::string &secret_hash) const override
virtual atomicswap_contracts_refs_type get_contracts() const override
virtual bool is_exists() const override
ConcreteService & obtain_service() const
#define SCORUM_VOTE_REGENERATION_SECONDS
std::vector< optional< account_api_obj > > lookup_account_names(const std::vector< std::string > &account_names) const
Get a list of accounts by name.
optional< account_bandwidth_api_obj > get_account_bandwidth(const std::string &account, witness::bandwidth_type type) const
optional< account_recovery_request_api_obj > get_recovery_request(const std::string &account) const
std::vector< extended_account > get_accounts(const std::vector< std::string > &names) const
std::set< std::string > lookup_accounts(const std::string &lower_bound_name, uint32_t limit) const
Get names and IDs for registered accounts.
std::vector< std::set< std::string > > get_key_references(std::vector< public_key_type > key) const
std::vector< account_id_type > get_account_references(account_id_type account_id) const
optional< escrow_api_obj > get_escrow(const std::string &from, uint32_t escrow_id) const
uint64_t get_account_count() const
Get the total number of accounts registered with the blockchain.
std::vector< owner_authority_history_api_obj > get_owner_history(const std::string &account) const
std::vector< withdraw_route > get_withdraw_routes(const std::string &account, withdraw_route_type type=outgoing) const
chain_id_type get_chain_id() const
Get the chain ID.
dynamic_global_property_api_obj get_dynamic_global_properties() const
Retrieve the current chain properties.
witness_schedule_api_obj get_witness_schedule() const
Get witness schedule.
fc::variant_object get_config() const
Retrieve compile-time constants.
void set_block_applied_callback(std::function< void(const variant &block_header)> cb)
std::vector< optional< witness_api_obj > > get_witnesses(const std::vector< witness_id_type > &witness_ids) const
Get a list of witnesses by ID.
boost::signals2::scoped_connection connect_signal(boost::signals2::signal< void(Args...)> &sig, C &c, void(C::*f)(Args...))
shared_multi_index_container< proposal_object, indexed_by< ordered_unique< tag< by_id >, member< proposal_object, proposal_id_type, &proposal_object::id > >, ordered_non_unique< tag< by_expiration >, member< proposal_object, fc::time_point_sec, &proposal_object::expiration > >, ordered_non_unique< tag< by_created >, member< proposal_object, fc::time_point_sec, &proposal_object::created > > > > proposal_object_index
bool is_equal_withdrawable_id(const withdrawable_id_type &a, const withdrawable_id_type &b)
shared_multi_index_container< nft_object, indexed_by< ordered_unique< tag< by_id >, member< nft_object, nft_id_type, &nft_object::id > >, hashed_unique< tag< by_uuid >, member< nft_object, uuid_type, &nft_object::uuid > >, hashed_unique< tag< by_name >, member< nft_object, account_name_type, &nft_object::name > > > > nft_index
oid< witness_schedule_object > witness_schedule_id_type
shared_multi_index_container< game_round_object, indexed_by< ordered_unique< tag< by_id >, member< game_round_object, game_round_id_type, &game_round_object::id > >, hashed_unique< tag< by_uuid >, member< game_round_object, uuid_type, &game_round_object::uuid > > > > game_round_index
oid< dev_committee_object > dev_committee_id_type
shared_multi_index_container< withdraw_scorumpower_route_object, indexed_by< ordered_unique< tag< by_id >, member< withdraw_scorumpower_route_object, withdraw_scorumpower_route_id_type, &withdraw_scorumpower_route_object::id > >, ordered_unique< tag< by_withdraw_route >, composite_key< withdraw_scorumpower_route_object, member< withdraw_scorumpower_route_object, withdrawable_id_type, &withdraw_scorumpower_route_object::from_id >, member< withdraw_scorumpower_route_object, withdrawable_id_type, &withdraw_scorumpower_route_object::to_id > >, composite_key_compare< less_for_withdrawable_id, less_for_withdrawable_id > >, ordered_unique< tag< by_destination >, composite_key< withdraw_scorumpower_route_object, member< withdraw_scorumpower_route_object, withdrawable_id_type, &withdraw_scorumpower_route_object::to_id >, member< withdraw_scorumpower_route_object, withdraw_scorumpower_route_id_type, &withdraw_scorumpower_route_object::id > >, composite_key_compare< less_for_withdrawable_id, std::less< withdraw_scorumpower_route_id_type > > > > > withdraw_scorumpower_route_index
shared_multi_index_container< witness_vote_object, indexed_by< ordered_unique< tag< by_id >, member< witness_vote_object, witness_vote_id_type, &witness_vote_object::id > >, ordered_unique< tag< by_account_witness >, composite_key< witness_vote_object, member< witness_vote_object, account_id_type, &witness_vote_object::account >, member< witness_vote_object, witness_id_type, &witness_vote_object::witness > >, composite_key_compare< std::less< account_id_type >, std::less< witness_id_type > > >, ordered_unique< tag< by_witness_account >, composite_key< witness_vote_object, member< witness_vote_object, witness_id_type, &witness_vote_object::witness >, member< witness_vote_object, account_id_type, &witness_vote_object::account > >, composite_key_compare< std::less< witness_id_type >, std::less< account_id_type > > > > > witness_vote_index
shared_multi_index_container< witness_object, indexed_by< ordered_unique< tag< by_id >, member< witness_object, witness_id_type, &witness_object::id > >, ordered_unique< tag< by_name >, member< witness_object, account_name_type, &witness_object::owner > >, ordered_unique< tag< by_vote_name >, composite_key< witness_object, member< witness_object, share_type, &witness_object::votes >, member< witness_object, account_name_type, &witness_object::owner > >, composite_key_compare< std::greater< share_type >, std::less< account_name_type > > >, ordered_unique< tag< by_schedule_time >, composite_key< witness_object, member< witness_object, fc::uint128, &witness_object::virtual_scheduled_time >, member< witness_object, witness_id_type, &witness_object::id > > > > > witness_index
@ post
Rate limiting posting reward eligibility over time.
fc::variant_object get_config()
fc::fixed_string_16 account_name_type
void verify_authority(const std::vector< operation > &ops, const flat_set< public_key_type > &sigs, const authority_getter &get_active, const authority_getter &get_owner, const authority_getter &get_posting, uint32_t max_recursion=SCORUM_MAX_SIG_CHECK_DEPTH, bool allow_committe=false, const flat_set< account_name_type > &active_aprovals=flat_set< account_name_type >(), const flat_set< account_name_type > &owner_aprovals=flat_set< account_name_type >(), const flat_set< account_name_type > &posting_approvals=flat_set< account_name_type >())
shared_multi_index_container< account_bandwidth_object, indexed_by< ordered_unique< tag< by_id >, member< account_bandwidth_object, account_bandwidth_id_type, &account_bandwidth_object::id > >, ordered_unique< tag< by_account_bandwidth_type >, composite_key< account_bandwidth_object, member< account_bandwidth_object, account_name_type, &account_bandwidth_object::account >, member< account_bandwidth_object, bandwidth_type, &account_bandwidth_object::type > > > > > account_bandwidth_index
shared_multi_index_container< reserve_ratio_object, indexed_by< ordered_unique< tag< by_id >, member< reserve_ratio_object, reserve_ratio_id_type, &reserve_ratio_object::id > > > > reserve_ratio_index
boost::uuids::uuid uuid_type
config_api & get_api_config(std::string api_name)
asset content_reward_sp_balance
asset reward_pool_balance
asset content_reward_scr_balance
asset fund_budget_balance
asset registration_pool_balance
void verify_authority(const chain_id_type &chain_id, const authority_getter &get_active, const authority_getter &get_owner, const authority_getter &get_posting, uint32_t max_recursion=SCORUM_MAX_SIG_CHECK_DEPTH) const
std::set< public_key_type > get_required_signatures(const chain_id_type &chain_id, const flat_set< public_key_type > &available_keys, const authority_getter &get_active, const authority_getter &get_owner, const authority_getter &get_posting, uint32_t max_recursion=SCORUM_MAX_SIG_CHECK_DEPTH) const
std::vector< operation > operations
Transfers SCR from one account to another.