COOPENOMICS  v1
Кооперативная Экономика
segments.hpp
См. документацию.
1#pragma once
2
3#include <eosio/eosio.hpp>
4#include <eosio/asset.hpp>
5
6using namespace eosio;
7
15 namespace Status {
16 const eosio::name GENERATION = "generation"_n;
17 const eosio::name CONTRIBUTED = "contributed"_n;
18 const eosio::name ACCEPTED = "accepted"_n;
19 const eosio::name COMPLETED = "completed"_n;
20 }
21
30 struct [[eosio::table, eosio::contract(CAPITAL)]] segment {
31 uint64_t id;
32 checksum256 project_hash;
33 eosio::name coopname;
34 eosio::name username;
35
36 // Статус результата сегмента
37 eosio::name status = Status::GENERATION;
38
39 // Роли участника в проекте
40 bool is_author = false;
41 bool is_creator = false;
42 bool is_coordinator = false;
43 bool is_investor = false;
44 bool is_propertor = false;
45 bool is_contributor = false;
46 bool has_vote = false;
47
49 // Основная информация о вкладе инвестора
50 eosio::asset investor_amount = asset(0, _root_govern_symbol);
51 eosio::asset investor_base = asset(0, _root_govern_symbol);
52
53 // Основная информация о вкладе создателя
54 eosio::asset creator_base = asset(0, _root_govern_symbol);
55 eosio::asset creator_bonus = asset(0, _root_govern_symbol);
56
57 // Основная информация о вкладе автора
58 eosio::asset author_base = asset(0, _root_govern_symbol);
59 eosio::asset author_bonus = asset(0, _root_govern_symbol);
60
61 // Основная информация о вкладе координатора
62 eosio::asset coordinator_investments = asset(0, _root_govern_symbol);
63 eosio::asset coordinator_base = asset(0, _root_govern_symbol);
64
65 // Основная информация о вкладе вкладчика
66 eosio::asset contributor_bonus = asset(0, _root_govern_symbol);
67
68 // Имущественные взносы
69 eosio::asset property_base = asset(0, _root_govern_symbol);
70
71 // CRPS поля для масштабируемого распределения наград
72 double last_author_base_reward_per_share = 0.0;
73 double last_author_bonus_reward_per_share = 0.0;
74 double last_contributor_reward_per_share = 0.0;
75
76 // Доли в программе и проекте
77 eosio::asset capital_contributor_shares = asset(0, _root_govern_symbol);
78
79 // Последняя известная сумма инвестиций в проекте для расчета provisional_amount
80 eosio::asset last_known_invest_pool = asset(0, _root_govern_symbol);
81
82 // Последняя известная сумма базового пула создателей для расчета использования инвестиций
83 eosio::asset last_known_creators_base_pool = asset(0, _root_govern_symbol);
84
85 // Последняя известная сумма инвестиций координаторов для отслеживания изменений
86 eosio::asset last_known_coordinators_investment_pool = asset(0, _root_govern_symbol);
87
88 // Финансовые данные для ссуд
89 eosio::asset provisional_amount = asset(0, _root_govern_symbol);
90 eosio::asset debt_amount = asset(0, _root_govern_symbol);
91 eosio::asset debt_settled = asset(0, _root_govern_symbol);
92
93 // Пулы равных премий авторов и прямых премий создателей
94 eosio::asset equal_author_bonus = asset(0, _root_govern_symbol);
95 eosio::asset direct_creator_bonus = asset(0, _root_govern_symbol);
96
97 // Результаты голосования по методу Водянова
98 eosio::asset voting_bonus = asset(0, _root_govern_symbol);
99
100 // Общая стоимость сегмента (рассчитывается автоматически)
101 eosio::asset total_segment_base_cost = asset(0, _root_govern_symbol);
102 eosio::asset total_segment_bonus_cost = asset(0, _root_govern_symbol);
103 eosio::asset total_segment_cost = asset(0, _root_govern_symbol);
104
105 uint64_t primary_key() const { return id; }
106
107 checksum256 by_project_hash() const { return project_hash; }
108
109 // Индекс по (project_hash + username) - уникальный для каждого участника проекта
110 uint128_t by_project_user() const {
111 return combine_checksum_ids(project_hash, username);
112 }
113
114 };
115
116 typedef eosio::multi_index<
117 "segments"_n, segment,
118 indexed_by<"byproject"_n, const_mem_fun<segment, checksum256, &segment::by_project_hash>>,
119 indexed_by<"byprojuser"_n, const_mem_fun<segment, uint128_t, &segment::by_project_user>>
121
122
123 inline std::optional<segment> get_segment(eosio::name coopname, const checksum256 &project_hash, eosio::name username) {
124 segments_index segments(_capital, coopname.value);
125 auto idx = segments.get_index<"byprojuser"_n>();
126 auto rkey = combine_checksum_ids(project_hash, username);
127
128 auto it = idx.find(rkey);
129 if (it == idx.end()) {
130 return std::nullopt;
131 }
132 return *it;
133 }
134
135 inline segment get_segment_or_fail(eosio::name coopname, const checksum256 &project_hash, eosio::name username, const char* msg) {
136 auto maybe_segment = get_segment(coopname, project_hash, username);
137 eosio::check(maybe_segment.has_value(), msg);
138 return *maybe_segment;
139 }
140
147inline std::vector<segment> get_project_authors(eosio::name coopname, const checksum256 &project_hash) {
148 segments_index segments(_capital, coopname.value);
149 auto project_idx = segments.get_index<"byproject"_n>();
150
151 std::vector<segment> authors;
152 auto itr = project_idx.find(project_hash);
153 while (itr != project_idx.end() && itr->project_hash == project_hash) {
154 if (itr->is_author) {
155 authors.push_back(*itr);
156 }
157 ++itr;
158 }
159 return authors;
160}
161
168inline std::vector<segment> get_project_creators(eosio::name coopname, const checksum256 &project_hash) {
169 segments_index segments(_capital, coopname.value);
170 auto project_idx = segments.get_index<"byproject"_n>();
171
172 std::vector<segment> creators;
173 auto itr = project_idx.find(project_hash);
174 while (itr != project_idx.end() && itr->project_hash == project_hash) {
175 if (itr->is_creator) {
176 creators.push_back(*itr);
177 }
178 ++itr;
179 }
180 return creators;
181}
182
189inline std::vector<segment> get_project_coordinators(eosio::name coopname, const checksum256 &project_hash) {
190 segments_index segments(_capital, coopname.value);
191 auto project_idx = segments.get_index<"byproject"_n>();
192
193 std::vector<segment> coordinators;
194 auto itr = project_idx.find(project_hash);
195 while (itr != project_idx.end() && itr->project_hash == project_hash) {
196 if (itr->is_coordinator) {
197 coordinators.push_back(*itr);
198 }
199 ++itr;
200 }
201 return coordinators;
202}
203
210inline std::vector<segment> get_project_investors(eosio::name coopname, const checksum256 &project_hash) {
211 segments_index segments(_capital, coopname.value);
212 auto project_idx = segments.get_index<"byproject"_n>();
213
214 std::vector<segment> investors;
215 auto itr = project_idx.find(project_hash);
216 while (itr != project_idx.end() && itr->project_hash == project_hash) {
217 if (itr->is_investor) {
218 investors.push_back(*itr);
219 }
220 ++itr;
221 }
222 return investors;
223}
224
231inline uint64_t count_project_authors(eosio::name coopname, const checksum256 &project_hash) {
232 segments_index segments(_capital, coopname.value);
233 auto project_idx = segments.get_index<"byproject"_n>();
234
235 uint64_t count = 0;
236 auto itr = project_idx.find(project_hash);
237 while (itr != project_idx.end() && itr->project_hash == project_hash) {
238 if (itr->is_author) {
239 count++;
240 }
241 ++itr;
242 }
243 return count;
244}
245
246
247
255inline bool is_voting_participant(eosio::name coopname, const checksum256 &project_hash, eosio::name username) {
256 auto segment = get_segment(coopname, project_hash, username);
257 return segment.has_value() && segment->has_vote;
258}
259
267inline bool is_segment_updated(eosio::name coopname, const checksum256 &project_hash, eosio::name username) {
268 auto segment = get_segment_or_fail(coopname, project_hash, username, "Сегмент пайщика не найден");
269
270 auto project = Capital::Projects::get_project_or_fail(coopname, project_hash);
271
272 // Проверяем актуальность CRPS для каждой роли
273 bool author_updated = (!segment.is_author) ||
276
277 // Координаторы используют пропорциональное распределение на основе coordinators_investment_pool
278 bool coordinator_updated = (!segment.is_coordinator) ||
280
281 bool contributor_updated = (!segment.is_contributor) ||
283
284 // Проверяем актуальность инвестиционного пула для расчета provisional_amount (нужно всем ролям)
285 bool invest_pool_updated = (segment.last_known_invest_pool == project.fact.invest_pool);
286
287 // Проверяем актуальность базового пула создателей для корректного расчета использования инвестиций (нужно только инвесторам)
288 bool creators_base_pool_updated = (!segment.is_investor) ||
290
291 return author_updated && coordinator_updated && contributor_updated && invest_pool_updated && creators_base_pool_updated;
292}
293
297inline void check_segment_is_updated(eosio::name coopname, const checksum256 &project_hash, eosio::name username,
298 const char* msg = "Сегмент не обновлен. Необходимо выполнить rfrshsegment") {
299 eosio::check(is_segment_updated(coopname, project_hash, username), msg);
300}
301
307inline eosio::asset calculate_segment_base_cost(const segment& seg) {
308 eosio::asset total = asset(0, _root_govern_symbol);
309
310 // Базовые вклады (всегда учитываются)
311 total += seg.investor_base; // фактически используемая сумма инвестора
312 total += seg.creator_base;
313 total += seg.author_base;
314 total += seg.coordinator_base;
315 total += seg.property_base; // стоимость внесенного имущества
316
317 return total;
318}
319
326inline eosio::asset calculate_segment_bonus_cost(const segment& seg, const Capital::project& project) {
327 eosio::asset total = asset(0, _root_govern_symbol);
328
329 // Премии зависят от статуса проекта
331 // После голосования используем результаты голосования
332 total += seg.equal_author_bonus;
333 total += seg.direct_creator_bonus;
334 total += seg.voting_bonus;
335 } else {
336 // До голосования используем полные суммы премий
337 total += seg.creator_bonus;
338 total += seg.author_bonus;
339 }
340
341 // Премии вкладчиков
342 total += seg.contributor_bonus;
343
344 return total;
345}
346
353inline eosio::asset calculate_total_segment_cost(const segment& seg, const Capital::project& project) {
355}
356
360inline void update_segment_total_cost(eosio::name coopname, const checksum256 &project_hash, eosio::name username) {
361 segments_index segments(_capital, coopname.value);
362 auto idx = segments.get_index<"byprojuser"_n>();
363 auto key = combine_checksum_ids(project_hash, username);
364 auto segment_itr = idx.find(key);
365
366 eosio::check(segment_itr != idx.end(), "Сегмент участника не найден");
367
368 auto project = Capital::Projects::get_project_or_fail(coopname, project_hash);
369
370 idx.modify(segment_itr, _capital, [&](auto &s) {
371 s.total_segment_base_cost = calculate_segment_base_cost(s);
372 s.total_segment_bonus_cost = calculate_segment_bonus_cost(s, project);
373 s.total_segment_cost = s.total_segment_base_cost + s.total_segment_bonus_cost;
374 });
375}
376
380 inline void update_segment_status(eosio::name coopname, const checksum256 &project_hash,
381 eosio::name username, eosio::name new_status) {
382 segments_index segments(_capital, coopname.value);
383 auto idx = segments.get_index<"byprojuser"_n>();
384 auto key = combine_checksum_ids(project_hash, username);
385 auto segment_itr = idx.find(key);
386
387 eosio::check(segment_itr != idx.end(), "Сегмент участника не найден");
388
389 idx.modify(segment_itr, _capital, [&](auto &s) {
390 s.status = new_status;
391 });
392}
393
398inline void update_segment_after_result_contribution(eosio::name coopname, const checksum256 &project_hash,
399 eosio::name username,
400 eosio::asset debt_settled_amount = asset(0, _root_govern_symbol)) {
401 segments_index segments(_capital, coopname.value);
402 auto idx = segments.get_index<"byprojuser"_n>();
403 auto key = combine_checksum_ids(project_hash, username);
404 auto segment_itr = idx.find(key);
405
406 eosio::check(segment_itr != idx.end(), "Сегмент участника не найден");
407
408 idx.modify(segment_itr, coopname, [&](auto &s) {
409 // Обновляем после принятия результата
411
412 // Если есть погашение долга, отмечаем его
413 if (debt_settled_amount.amount > 0) {
414 s.debt_settled += debt_settled_amount;
415 }
416 });
417}
418
422inline void update_segment_voting_results(eosio::name coopname, const checksum256 &project_hash,
423 eosio::name username,
424 eosio::asset voting_amount,
425 eosio::asset equal_author_amount,
426 eosio::asset direct_creator_amount) {
427 segments_index segments(_capital, coopname.value);
428 auto idx = segments.get_index<"byprojuser"_n>();
429 auto key = combine_checksum_ids(project_hash, username);
430 auto segment_itr = idx.find(key);
431
432 eosio::check(segment_itr != idx.end(), "Сегмент участника не найден");
433
434 idx.modify(segment_itr, coopname, [&](auto &s) {
435 s.voting_bonus = voting_amount;
436 s.equal_author_bonus = equal_author_amount;
437 s.direct_creator_bonus = direct_creator_amount;
438 });
439
440 // Обновляем общую стоимость сегмента после изменения премий
441 update_segment_total_cost(coopname, project_hash, username);
442}
443
444inline void set_investor_base_amount_on_return_unused(eosio::name coopname, uint64_t segment_id, eosio::asset used_amount) {
445 Capital::Segments::segments_index segments(_capital, coopname.value);
446 auto segment_itr = segments.find(segment_id);
447
448 segments.modify(segment_itr, coopname, [&](auto &s) {
449 // Обновляем общую сумму инвестора до фактически использованной
450 s.investor_amount = used_amount;
451 });
452
453}
454
455inline void increase_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount) {
456 Capital::Segments::segments_index segments(_capital, coopname.value);
457 auto segment = segments.find(segment_id);
458
459 segments.modify(segment, coopname, [&](auto &s) {
460 s.debt_amount += amount;
461 });
462}
463
464inline void decrease_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount) {
465 Capital::Segments::segments_index segments(_capital, coopname.value);
466 auto segment = segments.find(segment_id);
467
468 eosio::check(segment->debt_amount >= amount, "Пайщик не может погасить долг больше, чем должен");
469
470 segments.modify(segment, coopname, [&](auto &s) {
471 s.debt_amount -= amount;
472 });
473}
474
481inline void remove_segment(eosio::name coopname, const checksum256 &project_hash, eosio::name username) {
482 segments_index segments(_capital, coopname.value);
483 auto idx = segments.get_index<"byprojuser"_n>();
484 auto key = combine_checksum_ids(project_hash, username);
485 auto segment_itr = idx.find(key);
486
487 eosio::check(segment_itr != idx.end(), "Сегмент участника не найден");
488
489 idx.erase(segment_itr);
490
491}
492
499inline bool has_project_segments(eosio::name coopname, const checksum256 &project_hash) {
500 segments_index segments(_capital, coopname.value);
501 auto idx = segments.get_index<"byproject"_n>();
502 auto it = idx.lower_bound(project_hash);
503
504 return it != idx.end() && it->project_hash == project_hash;
505}
506
507} // namespace Capital::Segments
508
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
const eosio::name COMPLETED
Проект завершен
Definition: projects.hpp:26
project get_project_or_fail(eosio::name coopname, const checksum256 &project_hash)
Получает проект по хэшу, если проект не найден, выбрасывает исключение
Definition: projects.hpp:116
const eosio::name ACCEPTED
Результат принят советом
Definition: segments.hpp:18
const eosio::name GENERATION
На генерации результата
Definition: segments.hpp:16
const eosio::name COMPLETED
Сконвертирован
Definition: segments.hpp:19
const eosio::name CONTRIBUTED
Результат внесён, долг погашен, готов к конвертации
Definition: segments.hpp:17
Definition: segments.hpp:8
segment get_segment_or_fail(eosio::name coopname, const checksum256 &project_hash, eosio::name username, const char *msg)
Definition: segments.hpp:135
eosio::asset calculate_segment_bonus_cost(const segment &seg, const Capital::project &project)
Рассчитывает бонусную стоимость сегмента
Definition: segments.hpp:326
std::vector< segment > get_project_creators(eosio::name coopname, const checksum256 &project_hash)
Получает всех создателей проекта.
Definition: segments.hpp:168
std::optional< segment > get_segment(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Definition: segments.hpp:123
uint64_t count_project_authors(eosio::name coopname, const checksum256 &project_hash)
Подсчитывает количество авторов в проекте.
Definition: segments.hpp:231
bool is_voting_participant(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Проверяет является ли пользователь участником голосования
Definition: segments.hpp:255
std::vector< segment > get_project_investors(eosio::name coopname, const checksum256 &project_hash)
Получает всех инвесторов проекта.
Definition: segments.hpp:210
void decrease_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount)
Definition: segments.hpp:464
eosio::asset calculate_total_segment_cost(const segment &seg, const Capital::project &project)
Рассчитывает общую стоимость сегмента
Definition: segments.hpp:353
std::vector< segment > get_project_coordinators(eosio::name coopname, const checksum256 &project_hash)
Получает всех координаторов проекта.
Definition: segments.hpp:189
void update_segment_after_result_contribution(eosio::name coopname, const checksum256 &project_hash, eosio::name username, eosio::asset debt_settled_amount=asset(0, _root_govern_symbol))
Объединенная функция: обновляет сегмент после принятия результата и пересчитывает доли участника Опти...
Definition: segments.hpp:398
bool has_project_segments(eosio::name coopname, const checksum256 &project_hash)
Проверяет наличие сегментов в проекте
Definition: segments.hpp:499
void increase_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount)
Definition: segments.hpp:455
std::vector< segment > get_project_authors(eosio::name coopname, const checksum256 &project_hash)
Получает всех авторов проекта.
Definition: segments.hpp:147
void check_segment_is_updated(eosio::name coopname, const checksum256 &project_hash, eosio::name username, const char *msg="Сегмент не обновлен. Необходимо выполнить rfrshsegment")
Проверяет является ли сегмент обновленным или падает с ошибкой
Definition: segments.hpp:297
void update_segment_status(eosio::name coopname, const checksum256 &project_hash, eosio::name username, eosio::name new_status)
Обновляет статус результата в сегменте
Definition: segments.hpp:380
void update_segment_voting_results(eosio::name coopname, const checksum256 &project_hash, eosio::name username, eosio::asset voting_amount, eosio::asset equal_author_amount, eosio::asset direct_creator_amount)
Обновляет сегмент участника результатами голосования и премиями
Definition: segments.hpp:422
void set_investor_base_amount_on_return_unused(eosio::name coopname, uint64_t segment_id, eosio::asset used_amount)
Definition: segments.hpp:444
void update_segment_total_cost(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Обновляет все стоимости сегмента (базовые, бонусные и общую)
Definition: segments.hpp:360
eosio::multi_index< "segments"_n, segment, indexed_by<"byproject"_n, const_mem_fun< segment, checksum256, &segment::by_project_hash > >, indexed_by<"byprojuser"_n, const_mem_fun< segment, uint128_t, &segment::by_project_user > > > segments_index
Definition: segments.hpp:120
bool is_segment_updated(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Проверяет является ли сегмент обновленным (CRPS актуален и инвестиции синхронизированы)
Definition: segments.hpp:267
void remove_segment(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Удаляет сегмент участника
Definition: segments.hpp:481
eosio::asset calculate_segment_base_cost(const segment &seg)
Рассчитывает базовую стоимость сегмента
Definition: segments.hpp:307
Definition: eosio.msig.hpp:34
Таблица сегментов хранит данные о вкладах участника в проект.
Definition: segments.hpp:30
double last_author_base_reward_per_share
Последняя зафиксированная базовая награда на долю для авторов
Definition: segments.hpp:72
bool is_investor
Является ли участник инвестором
Definition: segments.hpp:43
eosio::asset creator_bonus
Сумма бонусов, которую создатель получил за выполнение проекта
Definition: segments.hpp:55
eosio::asset debt_amount
Сумма, которая уже выдана в ссуду
Definition: segments.hpp:90
double last_author_bonus_reward_per_share
Последняя зафиксированная бонусная награда на долю для авторов
Definition: segments.hpp:73
uint128_t by_project_user() const
Definition: segments.hpp:110
bool is_coordinator
Является ли участник координатором
Definition: segments.hpp:42
checksum256 project_hash
Хэш проекта
Definition: segments.hpp:32
eosio::asset author_bonus
Сумма бонусов, которую автор получил за выполнение проекта
Definition: segments.hpp:59
eosio::name username
Имя участника
Definition: segments.hpp:34
eosio::asset coordinator_base
Сумма себестоимости, которую координатор фактически потратил на выполнение проекта
Definition: segments.hpp:63
uint64_t primary_key() const
Первичный ключ (1)
Definition: segments.hpp:105
checksum256 by_project_hash() const
Индекс по хэшу проекта (2)
Definition: segments.hpp:107
eosio::asset creator_base
Сумма себестоимости, которую создатель фактически потратил на выполнение проекта
Definition: segments.hpp:54
eosio::asset author_base
Сумма себестоимости, которую автор фактически потратил на выполнение проекта
Definition: segments.hpp:58
eosio::asset last_known_coordinators_investment_pool
Последняя известная сумма инвестиций координаторов
Definition: segments.hpp:86
eosio::asset property_base
Стоимость внесенного имущества участника
Definition: segments.hpp:69
uint64_t id
ID сегмента (внутренний ключ)
Definition: segments.hpp:31
eosio::asset last_known_creators_base_pool
Последняя известная сумма базового пула создателей
Definition: segments.hpp:83
eosio::asset last_known_invest_pool
Последняя известная сумма инвестиций в проекте
Definition: segments.hpp:80
eosio::asset voting_bonus
Сумма от голосования авторского пула
Definition: segments.hpp:98
eosio::asset contributor_bonus
Сумма бонусов, которую вкладчик получил от проекта
Definition: segments.hpp:66
bool is_author
Является ли участник автором
Definition: segments.hpp:40
bool is_contributor
Является ли участник вкладчиком
Definition: segments.hpp:45
eosio::asset direct_creator_bonus
Сумма прямых премий создателю
Definition: segments.hpp:95
bool has_vote
Имеет ли участник право голоса
Definition: segments.hpp:46
eosio::asset investor_base
Фактически используемая сумма инвестора при коэффициенте возврата > 1.
Definition: segments.hpp:51
eosio::name coopname
Имя кооператива
Definition: segments.hpp:33
eosio::asset equal_author_bonus
Сумма равных премий авторам
Definition: segments.hpp:94
double last_contributor_reward_per_share
Последняя зафиксированная награда на долю для вкладчиков
Definition: segments.hpp:74
double author_base_cumulative_reward_per_share
Накопительная базовая награда на авторскую долю
Definition: crps.hpp:23
double contributor_cumulative_reward_per_share
Накопительная награда на вкладчическую долю
Definition: crps.hpp:25
double author_bonus_cumulative_reward_per_share
Накопительная бонусная награда на авторскую долю
Definition: crps.hpp:24
eosio::asset invest_pool
Фактические инвестиции от инвесторов (после вычета расходов)
Definition: fact_pool.hpp:39
eosio::asset coordinators_investment_pool
Фактические инвестиции, привлеченные координаторами
Definition: fact_pool.hpp:40
eosio::asset creators_base_pool
Фактическая себестоимость создателей
Definition: fact_pool.hpp:23
Таблица проектов хранит информацию о проектах кооператива, которые станут результатами.
Definition: projects.hpp:40
fact_pool fact
Фактические показатели
Definition: projects.hpp:63
eosio::name status
Статус проекта
Definition: projects.hpp:47
crps_data crps
Данные CRPS для распределения наград
Definition: projects.hpp:64
static uint128_t combine_checksum_ids(const checksum256 &hash, eosio::name username)
Definition: utils.hpp:9