COOPENOMICS  v1
Кооперативная Экономика
votes.hpp
См. документацию.
1#pragma once
2
3#include <eosio/eosio.hpp>
4#include <eosio/asset.hpp>
5
6using namespace eosio;
7
8namespace Capital {
9
13 struct vote_input {
14 name recipient;
15 asset amount;
16 };
17
22 eosio::asset authors_equal_spread = asset(0, _root_govern_symbol);
26 eosio::asset total_voting_pool = asset(0, _root_govern_symbol);
27 eosio::asset active_voting_amount = asset(0, _root_govern_symbol);
28 eosio::asset equal_voting_amount = asset(0, _root_govern_symbol);
30 };
31
35 struct voting_data {
36 uint32_t total_voters;
37 uint32_t votes_received;
38
41
43
44 time_point_sec voting_deadline;
45 };
46
55 struct [[eosio::table, eosio::contract(CAPITAL)]] vote {
56 uint64_t id;
57 name coopname;
58 checksum256 project_hash;
59 name voter;
60 name recipient;
61 asset amount;
62 time_point_sec voted_at;
63
64 uint64_t primary_key() const { return id; }
65
66 checksum256 by_project() const { return project_hash; }
67
68 // Индекс по проекту и голосующему - для проверки что пользователь не голосовал дважды
69 uint128_t by_project_voter() const {
70 return combine_checksum_ids(project_hash, voter);
71 }
72
73 // Индекс по проекту и получателю - для подсчета сумм полученных голосов
74 uint128_t by_project_recipient() const {
75 return combine_checksum_ids(project_hash, recipient);
76 }
77 };
78
79typedef eosio::multi_index<"votes"_n, vote,
80 indexed_by<"byproject"_n, const_mem_fun<vote, checksum256, &vote::by_project>>,
81 indexed_by<"byprojvoter"_n, const_mem_fun<vote, uint128_t, &vote::by_project_voter>>,
82 indexed_by<"byprojrecip"_n, const_mem_fun<vote, uint128_t, &vote::by_project_recipient>>
84
85namespace Votes {
86
90 inline bool has_user_voted(name coopname, checksum256 project_hash, name voter) {
91 votes_index votes(_capital, coopname.value);
92 auto idx = votes.get_index<"byprojvoter"_n>();
93 auto key = combine_checksum_ids(project_hash, voter);
94
95 return idx.find(key) != idx.end();
96 }
97
101 inline std::vector<vote> get_votes_for_recipient(name coopname, checksum256 project_hash, name recipient) {
102 votes_index votes(_capital, coopname.value);
103 auto idx = votes.get_index<"byprojrecip"_n>();
104 auto key = combine_checksum_ids(project_hash, recipient);
105
106 std::vector<vote> result;
107 auto itr = idx.find(key);
108 while (itr != idx.end() && itr->by_project_recipient() == key) {
109 result.push_back(*itr);
110 ++itr;
111 }
112 return result;
113 }
114
118 inline void add_vote(name coopname, checksum256 project_hash,
119 name voter, name recipient, asset amount) {
120 votes_index votes(_capital, coopname.value);
121 auto vote_id = get_global_id_in_scope(_capital, coopname, "vote"_n);
122
123 votes.emplace(coopname, [&](auto &v) {
124 v.id = vote_id;
125 v.coopname = coopname;
126 v.project_hash = project_hash;
127 v.voter = voter;
128 v.recipient = recipient;
129 v.amount = amount;
130 v.voted_at = current_time_point();
131 });
132 }
133
134} // namespace Votes
135
136} // namespace Capital
static constexpr eosio::name _capital
Definition: consts.hpp:150
static constexpr eosio::symbol _root_govern_symbol
Definition: consts.hpp:209
contract
Definition: eosio.msig_tests.cpp:977
share_type amount
Definition: eosio.token_tests.cpp:174
std::vector< vote > get_votes_for_recipient(name coopname, checksum256 project_hash, name recipient)
Получает все голоса получателя в проекте
Definition: votes.hpp:101
bool has_user_voted(name coopname, checksum256 project_hash, name voter)
Проверяет голосовал ли пользователь в данном проекте
Definition: votes.hpp:90
void add_vote(name coopname, checksum256 project_hash, name voter, name recipient, asset amount)
Добавляет голос в проект
Definition: votes.hpp:118
Definition: balances.cpp:6
eosio::multi_index<"votes"_n, vote, indexed_by<"byproject"_n, const_mem_fun< vote, checksum256, &vote::by_project > >, indexed_by<"byprojvoter"_n, const_mem_fun< vote, uint128_t, &vote::by_project_voter > >, indexed_by<"byprojrecip"_n, const_mem_fun< vote, uint128_t, &vote::by_project_recipient > > > votes_index
Definition: votes.hpp:83
fc::mutable_variant_object voter(account_name acct)
Definition: eosio.system_tester.hpp:1183
Definition: eosio.msig.hpp:34
Таблица результатов хранит данные о результатах участников проектов.
Definition: results.hpp:33
Структура для передачи одного голоса в submitvote.
Definition: votes.hpp:13
asset amount
Сумма голоса
Definition: votes.hpp:15
name recipient
За кого голосует
Definition: votes.hpp:14
Таблица голосов хранит информацию о голосах участников по методу Водянова.
Definition: votes.hpp:55
name coopname
Кооператив
Definition: votes.hpp:57
uint128_t by_project_recipient() const
Definition: votes.hpp:74
name voter
Кто голосует
Definition: votes.hpp:59
time_point_sec voted_at
Время голосования
Definition: votes.hpp:62
uint128_t by_project_voter() const
Definition: votes.hpp:69
checksum256 project_hash
Хэш проекта
Definition: votes.hpp:58
checksum256 by_project() const
Индекс по хэшу проекта (2)
Definition: votes.hpp:66
uint64_t primary_key() const
Первичный ключ (1)
Definition: votes.hpp:64
uint64_t id
ID голоса (внутренний ключ)
Definition: votes.hpp:56
asset amount
Сумма голоса
Definition: votes.hpp:61
name recipient
За кого голосует
Definition: votes.hpp:60
Рассчитывает суммы для распределения по пулам
Definition: votes.hpp:21
eosio::asset authors_equal_spread
62.8% авторских премий поровну
Definition: votes.hpp:22
eosio::asset creators_bonuses_on_voting
38.2% исполнительских премий на голосование
Definition: votes.hpp:25
eosio::asset authors_equal_per_author
Равная сумма на каждого автора (62.8% / количество авторов)
Definition: votes.hpp:29
eosio::asset authors_bonuses_on_voting
38.2% авторских премий на голосование
Definition: votes.hpp:24
eosio::asset equal_voting_amount
Средняя сумма на каждого участника (total_voting_pool / voters)
Definition: votes.hpp:28
eosio::asset creators_direct_spread
62.8% исполнительских премий каждому
Definition: votes.hpp:23
eosio::asset total_voting_pool
Общая сумма для распределения по Водянову (авторы + создатели)
Definition: votes.hpp:26
eosio::asset active_voting_amount
Общая голосующая сумма = total_voting_pool * (voters-1)/voters.
Definition: votes.hpp:27
Структура данных для голосования по методу Водянова
Definition: votes.hpp:35
uint32_t total_voters
Общее количество участников
Definition: votes.hpp:36
voting_amounts amounts
Суммы на голосовании
Definition: votes.hpp:42
uint32_t votes_received
Количество полученных голосов
Definition: votes.hpp:37
double authors_voting_percent
Процент премий авторов для голосования (по умолчанию; уточняется из config при инициализации голосова...
Definition: votes.hpp:39
double creators_voting_percent
Процент премий создателей для голосования (по умолчанию; уточняется из config при инициализации голос...
Definition: votes.hpp:40
time_point_sec voting_deadline
Дедлайн голосования
Definition: votes.hpp:44
uint64_t get_global_id_in_scope(eosio::name _me, eosio::name scope, eosio::name key)
Definition: table_counts.hpp:58
static uint128_t combine_checksum_ids(const checksum256 &hash, eosio::name username)
Definition: utils.hpp:11