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 checksum256 project_hash;
58 name voter;
59 name recipient;
60 asset amount;
61 time_point_sec voted_at;
62
63 uint64_t primary_key() const { return id; }
64
65 checksum256 by_project() const { return project_hash; }
66
67 // Индекс по проекту и голосующему - для проверки что пользователь не голосовал дважды
68 uint128_t by_project_voter() const {
69 return combine_checksum_ids(project_hash, voter);
70 }
71
72 // Индекс по проекту и получателю - для подсчета сумм полученных голосов
73 uint128_t by_project_recipient() const {
74 return combine_checksum_ids(project_hash, recipient);
75 }
76 };
77
78typedef eosio::multi_index<"votes"_n, vote,
79 indexed_by<"byproject"_n, const_mem_fun<vote, checksum256, &vote::by_project>>,
80 indexed_by<"byprojvoter"_n, const_mem_fun<vote, uint128_t, &vote::by_project_voter>>,
81 indexed_by<"byprojrecip"_n, const_mem_fun<vote, uint128_t, &vote::by_project_recipient>>
83
84namespace Votes {
85
89 inline bool has_user_voted(name coopname, checksum256 project_hash, name voter) {
90 votes_index votes(_capital, coopname.value);
91 auto idx = votes.get_index<"byprojvoter"_n>();
92 auto key = combine_checksum_ids(project_hash, voter);
93
94 return idx.find(key) != idx.end();
95 }
96
100 inline std::vector<vote> get_votes_for_recipient(name coopname, checksum256 project_hash, name recipient) {
101 votes_index votes(_capital, coopname.value);
102 auto idx = votes.get_index<"byprojrecip"_n>();
103 auto key = combine_checksum_ids(project_hash, recipient);
104
105 std::vector<vote> result;
106 auto itr = idx.find(key);
107 while (itr != idx.end() && itr->by_project_recipient() == key) {
108 result.push_back(*itr);
109 ++itr;
110 }
111 return result;
112 }
113
117 inline void add_vote(name coopname, checksum256 project_hash,
118 name voter, name recipient, asset amount) {
119 votes_index votes(_capital, coopname.value);
120 auto vote_id = get_global_id_in_scope(_capital, coopname, "vote"_n);
121
122 votes.emplace(coopname, [&](auto &v) {
123 v.id = vote_id;
124 v.project_hash = project_hash;
125 v.voter = voter;
126 v.recipient = recipient;
127 v.amount = amount;
128 v.voted_at = current_time_point();
129 });
130 }
131
132} // namespace Votes
133
134} // namespace Capital
static constexpr eosio::name _capital
Definition: consts.hpp:150
static constexpr eosio::symbol _root_govern_symbol
Definition: consts.hpp:210
contract
Definition: eosio.msig_tests.cpp:977
share_type amount
Definition: eosio.token_tests.cpp:174
uint64_t get_global_id_in_scope(eosio::name _me, eosio::name scope, eosio::name key)
Definition: counts.hpp:61
std::vector< vote > get_votes_for_recipient(name coopname, checksum256 project_hash, name recipient)
Получает все голоса получателя в проекте
Definition: votes.hpp:100
bool has_user_voted(name coopname, checksum256 project_hash, name voter)
Проверяет голосовал ли пользователь в данном проекте
Definition: votes.hpp:89
void add_vote(name coopname, checksum256 project_hash, name voter, name recipient, asset amount)
Добавляет голос в проект
Definition: votes.hpp:117
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:82
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
uint128_t by_project_recipient() const
Definition: votes.hpp:73
name voter
Кто голосует
Definition: votes.hpp:58
time_point_sec voted_at
Время голосования
Definition: votes.hpp:61
uint128_t by_project_voter() const
Definition: votes.hpp:68
checksum256 project_hash
Хэш проекта
Definition: votes.hpp:57
checksum256 by_project() const
Индекс по хэшу проекта (2)
Definition: votes.hpp:65
uint64_t primary_key() const
Первичный ключ (1)
Definition: votes.hpp:63
uint64_t id
ID голоса (внутренний ключ)
Definition: votes.hpp:56
asset amount
Сумма голоса
Definition: votes.hpp:60
name recipient
За кого голосует
Definition: votes.hpp:59
Рассчитывает суммы для распределения по пулам
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
static uint128_t combine_checksum_ids(const checksum256 &hash, eosio::name username)
Definition: utils.hpp:9