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 READY = "ready"_n;
18 const eosio::name STATEMENT = "statement"_n;
19 const eosio::name APPROVED = "approved"_n;
20 const eosio::name AUTHORIZED = "authorized"_n;
21 const eosio::name ACT1 = "act1"_n;
22 const eosio::name CONTRIBUTED = "contributed"_n;
23 const eosio::name SKIPPED = "skipped"_n;
24 }
25
34 struct [[eosio::table, eosio::contract(CAPITAL)]] segment {
35 uint64_t id;
36 checksum256 project_hash;
37 eosio::name coopname;
38 eosio::name username;
39
40 // Статус результата сегмента
41 eosio::name status = Status::GENERATION;
42
43 // Роли участника в проекте
44 bool is_author = false;
45 bool is_creator = false;
46 bool is_coordinator = false;
47 bool is_investor = false;
48 bool is_propertor = false;
49 bool is_contributor = false;
50 bool has_vote = false;
51
53 // Основная информация о вкладе инвестора
54 eosio::asset investor_amount = asset(0, _root_govern_symbol);
55 eosio::asset investor_base = asset(0, _root_govern_symbol);
56
57 // Основная информация о вкладе создателя
58 eosio::asset creator_base = asset(0, _root_govern_symbol);
59 eosio::asset creator_bonus = asset(0, _root_govern_symbol);
60
61 // Основная информация о вкладе автора
62 eosio::asset author_base = asset(0, _root_govern_symbol);
63 eosio::asset author_bonus = asset(0, _root_govern_symbol);
64
65 // Основная информация о вкладе координатора
66 eosio::asset coordinator_investments = asset(0, _root_govern_symbol);
67 eosio::asset coordinator_base = asset(0, _root_govern_symbol);
68
69 // Основная информация о вкладе участника
70 eosio::asset contributor_bonus = asset(0, _root_govern_symbol);
71
72 // Имущественные взносы
73 eosio::asset property_base = asset(0, _root_govern_symbol);
74
75 // CRPS поля для масштабируемого распределения наград
76 double last_author_base_reward_per_share = 0.0;
77 double last_author_bonus_reward_per_share = 0.0;
78 double last_contributor_reward_per_share = 0.0;
79
80 // Доли в программе и проекте
81 eosio::asset capital_contributor_shares = asset(0, _root_govern_symbol);
82
83 // Последняя известная сумма инвестиций в проекте для расчета provisional_amount
84 eosio::asset last_known_invest_pool = asset(0, _root_govern_symbol);
85
86 // Последняя известная сумма базового пула создателей для расчета использования инвестиций
87 eosio::asset last_known_creators_base_pool = asset(0, _root_govern_symbol);
88
89 // Последняя известная сумма инвестиций координаторов для отслеживания изменений
90 eosio::asset last_known_coordinators_investment_pool = asset(0, _root_govern_symbol);
91
92 // Финансовые данные для ссуд
93 eosio::asset provisional_amount = asset(0, _root_govern_symbol);
94 eosio::asset debt_amount = asset(0, _root_govern_symbol);
95 eosio::asset debt_settled = asset(0, _root_govern_symbol);
96
97 // Пулы равных премий авторов и прямых премий создателей
98 eosio::asset equal_author_bonus = asset(0, _root_govern_symbol);
99 eosio::asset direct_creator_bonus = asset(0, _root_govern_symbol);
100
101 // Результаты голосования по методу Водянова
102 bool is_votes_calculated = false;
103 eosio::asset voting_bonus = asset(0, _root_govern_symbol);
104
105 // Общая стоимость сегмента (рассчитывается автоматически)
106 eosio::asset total_segment_base_cost = asset(0, _root_govern_symbol);
107 eosio::asset total_segment_bonus_cost = asset(0, _root_govern_symbol);
108 eosio::asset total_segment_cost = asset(0, _root_govern_symbol);
109
110 // Интеллектуальная стоимость сегмента и доля в результате
111 eosio::asset intellectual_cost = asset(0, _root_govern_symbol);
112 eosio::asset available_for_program = asset(0, _root_govern_symbol);
113 eosio::asset available_for_wallet = asset(0, _root_govern_symbol);
114 double share_percent = 0.0;
115
116 uint64_t primary_key() const { return id; }
117
118 checksum256 by_project_hash() const { return project_hash; }
119
120 // Индекс по (project_hash + username) - уникальный для каждого участника проекта
121 uint128_t by_project_user() const {
122 return combine_checksum_ids(project_hash, username);
123 }
124
125 };
126
127 typedef eosio::multi_index<
128 "segments"_n, segment,
129 indexed_by<"byproject"_n, const_mem_fun<segment, checksum256, &segment::by_project_hash>>,
130 indexed_by<"byprojuser"_n, const_mem_fun<segment, uint128_t, &segment::by_project_user>>
132
133
134 inline std::optional<segment> get_segment(eosio::name coopname, const checksum256 &project_hash, eosio::name username) {
135 segments_index segments(_capital, coopname.value);
136 auto idx = segments.get_index<"byprojuser"_n>();
137 auto rkey = combine_checksum_ids(project_hash, username);
138
139 auto it = idx.find(rkey);
140 if (it == idx.end()) {
141 return std::nullopt;
142 }
143 return segment(*it);
144 }
145
146 inline segment get_segment_or_fail(eosio::name coopname, const checksum256 &project_hash, eosio::name username, const char* msg) {
147 auto maybe_segment = get_segment(coopname, project_hash, username);
148 eosio::check(maybe_segment.has_value(), msg);
149 return maybe_segment.value();
150 }
151
152 inline segment get_segment_by_id_or_fail(eosio::name coopname, uint64_t segment_id, const char* msg = "Сегмент не найден") {
153 segments_index segments(_capital, coopname.value);
154 auto segment_itr = segments.find(segment_id);
155 eosio::check(segment_itr != segments.end(), msg);
156 return segment(*segment_itr);
157 }
158
159
166inline uint64_t count_project_authors(eosio::name coopname, const checksum256 &project_hash) {
167 segments_index segments(_capital, coopname.value);
168 auto project_idx = segments.get_index<"byproject"_n>();
169
170 // Собираем ID сначала, потом считаем
171 std::vector<uint64_t> author_ids;
172 {
173 auto itr = project_idx.find(project_hash);
174 while (itr != project_idx.end() && itr->project_hash == project_hash) {
175 if (itr->is_author) {
176 author_ids.push_back(itr->id); // Сохраняем ID, а не итератор
177 }
178 ++itr;
179 }
180 } // Итератор уничтожен
181
182 return author_ids.size();
183}
184
185
186
194inline bool is_voting_participant(eosio::name coopname, const checksum256 &project_hash, eosio::name username) {
195 auto segment = get_segment(coopname, project_hash, username);
196 return segment.has_value() && segment->has_vote;
197}
198
204inline bool is_pure_investor(const segment& seg) {
205 return seg.is_investor &&
206 !seg.is_author &&
207 !seg.is_creator &&
208 !seg.is_coordinator &&
209 !seg.is_propertor;
210}
211
218 return seg.is_author ||
219 seg.is_creator ||
220 seg.is_coordinator ||
221 seg.is_propertor ||
222 seg.is_contributor;
223}
224
230inline eosio::asset calculate_non_investor_contribution(const segment& seg) {
231 // Базовые вклады (без investor_base, так как он уже внесен при инвестировании)
232 eosio::asset base_contribution = seg.creator_base + seg.author_base + seg.coordinator_base + seg.property_base;
233
234 // Бонусы (премии) только для интеллектуальных ролей
235 eosio::asset bonus_contribution = seg.creator_bonus + seg.author_bonus +
238
239 return base_contribution + bonus_contribution;
240}
241
247inline eosio::asset calculate_segment_base_cost(const segment& seg) {
248 eosio::asset total = asset(0, _root_govern_symbol);
249
250 // Базовые вклады (всегда учитываются)
251 total += seg.investor_base; // фактически используемая сумма инвестора
252 total += seg.creator_base;
253 total += seg.author_base;
254 total += seg.coordinator_base;
255 total += seg.property_base; // стоимость внесенного имущества
256
257 return total;
258}
259
266inline eosio::asset calculate_segment_bonus_cost(const segment& seg, const Capital::project& project) {
267 eosio::asset total = asset(0, _root_govern_symbol);
268
269 // Премии зависят от статуса проекта
271 // После голосования используем результаты голосования
272 total += seg.equal_author_bonus;
273 total += seg.direct_creator_bonus;
274 total += seg.voting_bonus;
275 } else {
276 // До голосования используем полные суммы премий
277 total += seg.creator_bonus;
278 total += seg.author_bonus;
279 }
280
281 // Премии участников
282 total += seg.contributor_bonus;
283
284 return total;
285}
286
290inline void update_segment_total_cost(eosio::name coopname, uint64_t segment_id, const Capital::project &project) {
291 segments_index segments(_capital, coopname.value);
292 auto segment = segments.find(segment_id);
293
294 eosio::check(segment != segments.end(), "Сегмент участника не найден");
295
296 segments.modify(segment, coopname, [&](auto &s) {
298 s.total_segment_bonus_cost = calculate_segment_bonus_cost(s, project);
299 s.total_segment_cost = s.total_segment_base_cost + s.total_segment_bonus_cost;
300
301 eosio::check(s.total_segment_cost >= s.investor_base, "Сумма всех вкладов сегмента должна быть больше или равна сумме инвестиций инвестора");
302
303 // Интеллектуальная стоимость = полная стоимость минус обеспечительный взнос инвестора
304 s.intellectual_cost = s.total_segment_cost - s.investor_base;
305
306 eosio::check(s.intellectual_cost >= s.debt_amount, "Интеллектуальная стоимость должна быть больше или равна сумме выданных ссуд");
307 // Доступная сумма для конвертации в программу
308 s.available_for_program = s.intellectual_cost - s.debt_amount;
309
310 eosio::check(s.provisional_amount >= s.debt_amount, "Доступная сумма для конвертации в кошелек должна быть больше или равна сумме выданных ссуд");
311 // Доступная сумма для конвертации в кошелек
312 s.available_for_wallet = s.provisional_amount - s.debt_amount;
313
314 // Доля участника в результате интеллектуальной деятельности
315 if (project.fact.total.amount > 0) {
316 s.share_percent = (static_cast<double>(s.intellectual_cost.amount) /
317 static_cast<double>(project.fact.total.amount)) * 100.0;
318 } else {
319 s.share_percent = 0.0;
320 }
321 });
322}
323
327 inline void update_segment_status(eosio::name coopname, const checksum256 &project_hash,
328 eosio::name username, eosio::name new_status) {
329 segments_index segments(_capital, coopname.value);
330 auto idx = segments.get_index<"byprojuser"_n>();
331 auto key = combine_checksum_ids(project_hash, username);
332 auto segment_itr = idx.find(key);
333
334 eosio::check(segment_itr != idx.end(), "Сегмент участника не найден");
335
336 idx.modify(segment_itr, _capital, [&](auto &s) {
337 s.status = new_status;
338 });
339}
340
345inline void update_segment_after_result_contribution(eosio::name coopname, const checksum256 &project_hash,
346 eosio::name username,
347 eosio::asset debt_settled_amount = asset(0, _root_govern_symbol)) {
348 segments_index segments(_capital, coopname.value);
349 auto idx = segments.get_index<"byprojuser"_n>();
350 auto key = combine_checksum_ids(project_hash, username);
351 auto segment_itr = idx.find(key);
352
353 eosio::check(segment_itr != idx.end(), "Сегмент участника не найден");
354
355 idx.modify(segment_itr, coopname, [&](auto &s) {
356 // Обновляем после принятия результата
358
359 // Если есть погашение долга, отмечаем его
360 if (debt_settled_amount.amount > 0) {
361 s.debt_settled += debt_settled_amount;
362 }
363 });
364}
365
366
367inline uint64_t get_segment_id(eosio::name coopname) {
368 return get_global_id_in_scope(_capital, coopname, "segments"_n);
369}
370
374inline void update_segment_voting_results(eosio::name coopname, const Capital::project &project,
375 const segment &segment,
376 eosio::name username,
377 eosio::asset voting_amount,
378 eosio::asset equal_author_amount,
379 eosio::asset direct_creator_amount) {
380 segments_index segments(_capital, coopname.value);
381 auto segment_itr = segments.find(segment.id);
382
383 eosio::check(segment_itr != segments.end(), "Сегмент участника не найден");
384
385 segments.modify(segment_itr, coopname, [&](auto &s) {
386 s.voting_bonus = voting_amount;
387 s.equal_author_bonus = equal_author_amount;
388 s.direct_creator_bonus = direct_creator_amount;
389 s.is_votes_calculated = true;
390 });
391
392 // Обновляем общую стоимость сегмента после изменения премий
393 update_segment_total_cost(coopname, segment_itr->id, project);
394}
395
396inline void set_investor_base_amount_on_return_unused(eosio::name coopname, uint64_t segment_id, eosio::asset used_amount) {
397 Capital::Segments::segments_index segments(_capital, coopname.value);
398 auto segment_itr = segments.find(segment_id);
399
400 segments.modify(segment_itr, coopname, [&](auto &s) {
401 // Обновляем общую сумму инвестора до фактически использованной
402 s.investor_amount = used_amount;
403 // Также обновляем фактически используемую сумму инвестора для корректного расчета total_segment_cost
404 s.investor_base = used_amount;
405 });
406
407}
408
409inline void increase_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount) {
410 Capital::Segments::segments_index segments(_capital, coopname.value);
411 auto segment = segments.find(segment_id);
412
413 segments.modify(segment, coopname, [&](auto &s) {
414 s.debt_amount += amount;
415 });
416}
417
418inline void decrease_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount) {
419 Capital::Segments::segments_index segments(_capital, coopname.value);
420 auto segment = segments.find(segment_id);
421
422 eosio::check(segment->debt_amount >= amount, "Пайщик не может погасить долг больше, чем должен");
423
424 segments.modify(segment, coopname, [&](auto &s) {
425 s.debt_amount -= amount;
426 });
427}
428
434inline void remove_segment(eosio::name coopname, uint64_t segment_id) {
435 segments_index segments(_capital, coopname.value);
436 auto segment = segments.find(segment_id);
437
438 eosio::check(segment != segments.end(), "Сегмент участника не найден");
439
440 segments.erase(segment);
441
442}
443
449inline void remove_all_project_segments(eosio::name coopname, const checksum256 &project_hash) {
450 segments_index segments(_capital, coopname.value);
451 auto project_idx = segments.get_index<"byproject"_n>();
452 std::vector<uint64_t> ids;
453 {
454 auto itr = project_idx.find(project_hash);
455 while (itr != project_idx.end() && itr->project_hash == project_hash) {
456 ids.push_back(itr->id);
457 ++itr;
458 }
459 }
460 for (uint64_t id : ids) {
461 remove_segment(coopname, id);
462 }
463}
464
471inline void create_author_segment(eosio::name coopname, eosio::name username, const Capital::project &project) {
472 segments_index segments(_capital, coopname.value);
473
474 segments.emplace(_capital, [&](auto &g){
475 g.id = get_global_id_in_scope(_capital, coopname, "segments"_n);
476 g.coopname = coopname;
477 g.project_hash = project.project_hash;
478 g.username = username;
479 g.is_author = true;
480 g.has_vote = true;
481 // Инициализируем CRPS поля
482 g.last_author_base_reward_per_share = project.crps.author_base_cumulative_reward_per_share;
483 g.last_author_bonus_reward_per_share = project.crps.author_bonus_cumulative_reward_per_share;
484 });
485}
486
493inline void update_segment_author_status(eosio::name coopname, uint64_t segment_id, const Capital::project &project) {
494 segments_index segments(_capital, coopname.value);
495 auto segment = segments.find(segment_id);
496
497 eosio::check(segment != segments.end(), "Сегмент участника не найден");
498
499 segments.modify(segment, coopname, [&](auto &g) {
500 if (!g.is_author) {
501 g.is_author = true;
502 // Инициализируем CRPS поля для нового автора
503 g.last_author_base_reward_per_share = project.crps.author_base_cumulative_reward_per_share;
504 g.last_author_bonus_reward_per_share = project.crps.author_bonus_cumulative_reward_per_share;
505 }
506 });
507}
508
515inline bool has_project_segments(eosio::name coopname, const checksum256 &project_hash) {
516 segments_index segments(_capital, coopname.value);
517 auto idx = segments.get_index<"byproject"_n>();
518 auto it = idx.lower_bound(project_hash);
519
520 return it != idx.end() && it->project_hash == project_hash;
521}
522
523} // namespace Capital::Segments
524
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
const eosio::name RESULT
Проект завершен
Definition: projects.hpp:25
const eosio::name STATEMENT
Сегмент на стадии взноса результата (заявление подано)
Definition: segments.hpp:18
const eosio::name READY
Проект завершен, ожидает внесения результата
Definition: segments.hpp:17
const eosio::name GENERATION
На генерации результата
Definition: segments.hpp:16
const eosio::name APPROVED
Результат одобрен председателем
Definition: segments.hpp:19
const eosio::name AUTHORIZED
Результат авторизован советом
Definition: segments.hpp:20
const eosio::name SKIPPED
Внесение результата пропущено за отсутствием интеллектуальной части
Definition: segments.hpp:23
const eosio::name CONTRIBUTED
Результат внесён и принят (второй акт подписан)
Definition: segments.hpp:22
const eosio::name ACT1
Первый акт подписан участником
Definition: segments.hpp:21
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:146
eosio::asset calculate_segment_bonus_cost(const segment &seg, const Capital::project &project)
Рассчитывает бонусную стоимость сегмента
Definition: segments.hpp:266
void remove_segment(eosio::name coopname, uint64_t segment_id)
Удаляет сегмент участника
Definition: segments.hpp:434
std::optional< segment > get_segment(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Definition: segments.hpp:134
uint64_t count_project_authors(eosio::name coopname, const checksum256 &project_hash)
Подсчитывает количество авторов в проекте.
Definition: segments.hpp:166
bool is_voting_participant(eosio::name coopname, const checksum256 &project_hash, eosio::name username)
Проверяет является ли пользователь участником голосования
Definition: segments.hpp:194
uint64_t get_segment_id(eosio::name coopname)
Definition: segments.hpp:367
void decrease_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount)
Definition: segments.hpp:418
void remove_all_project_segments(eosio::name coopname, const checksum256 &project_hash)
Удаляет все сегменты участников проекта (по secondary index byproject)
Definition: segments.hpp:449
void update_segment_author_status(eosio::name coopname, uint64_t segment_id, const Capital::project &project)
Обновляет сегмент, устанавливая статус автора
Definition: segments.hpp:493
eosio::asset calculate_non_investor_contribution(const segment &seg)
Рассчитывает сумму неинвестиционных вкладов сегмента (для внесения результата)
Definition: segments.hpp:230
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:345
bool has_project_segments(eosio::name coopname, const checksum256 &project_hash)
Проверяет наличие сегментов в проекте
Definition: segments.hpp:515
void increase_debt_amount(eosio::name coopname, uint64_t segment_id, eosio::asset amount)
Definition: segments.hpp:409
void create_author_segment(eosio::name coopname, eosio::name username, const Capital::project &project)
Создает сегмент автора для проекта
Definition: segments.hpp:471
void update_segment_status(eosio::name coopname, const checksum256 &project_hash, eosio::name username, eosio::name new_status)
Обновляет статус результата в сегменте
Definition: segments.hpp:327
void update_segment_total_cost(eosio::name coopname, uint64_t segment_id, const Capital::project &project)
Обновляет все стоимости сегмента (базовые, бонусные и общую)
Definition: segments.hpp:290
bool has_intellectual_contribution_roles(const segment &seg)
Проверяет имеет ли участник роли, требующие внесения интеллектуального результата
Definition: segments.hpp:217
void set_investor_base_amount_on_return_unused(eosio::name coopname, uint64_t segment_id, eosio::asset used_amount)
Definition: segments.hpp:396
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:131
void update_segment_voting_results(eosio::name coopname, const Capital::project &project, const segment &segment, eosio::name username, eosio::asset voting_amount, eosio::asset equal_author_amount, eosio::asset direct_creator_amount)
Обновляет сегмент участника результатами голосования и премиями
Definition: segments.hpp:374
eosio::asset calculate_segment_base_cost(const segment &seg)
Рассчитывает базовую стоимость сегмента
Definition: segments.hpp:247
segment get_segment_by_id_or_fail(eosio::name coopname, uint64_t segment_id, const char *msg="Сегмент не найден")
Definition: segments.hpp:152
bool is_pure_investor(const segment &seg)
Проверяет является ли участник чистым инвестором (только инвестор, без других интеллектуальных ролей)
Definition: segments.hpp:204
Definition: eosio.msig.hpp:34
Таблица сегментов хранит данные о вкладах участника в проект.
Definition: segments.hpp:34
bool is_investor
Является ли участник инвестором
Definition: segments.hpp:47
eosio::asset creator_bonus
Сумма бонусов, которую исполнитель получил за выполнение проекта
Definition: segments.hpp:59
eosio::asset total_segment_base_cost
Общая стоимость базовых вкладов сегмента
Definition: segments.hpp:106
eosio::asset debt_amount
Сумма, которая уже выдана в ссуду
Definition: segments.hpp:94
uint128_t by_project_user() const
Definition: segments.hpp:121
bool is_coordinator
Является ли участник координатором
Definition: segments.hpp:46
checksum256 project_hash
Хэш проекта
Definition: segments.hpp:36
eosio::asset author_bonus
Сумма бонусов, которую автор получил за выполнение проекта
Definition: segments.hpp:63
eosio::name username
Имя участника
Definition: segments.hpp:38
eosio::asset coordinator_base
Сумма себестоимости, которую координатор фактически потратил на выполнение проекта
Definition: segments.hpp:67
uint64_t primary_key() const
Первичный ключ (1)
Definition: segments.hpp:116
checksum256 by_project_hash() const
Индекс по хэшу проекта (2)
Definition: segments.hpp:118
eosio::asset creator_base
Сумма себестоимости, которую исполнитель фактически потратил на выполнение проекта
Definition: segments.hpp:58
eosio::asset author_base
Сумма себестоимости, которую автор фактически потратил на выполнение проекта
Definition: segments.hpp:62
eosio::asset property_base
Стоимость внесенного имущества участника
Definition: segments.hpp:73
uint64_t id
ID сегмента (внутренний ключ)
Definition: segments.hpp:35
eosio::asset voting_bonus
Сумма от голосования авторского пула
Definition: segments.hpp:103
eosio::asset contributor_bonus
Сумма бонусов, которую участник получил от проекта
Definition: segments.hpp:70
bool is_creator
Является ли участник создателем
Definition: segments.hpp:45
bool is_author
Является ли участник автором
Definition: segments.hpp:44
bool is_propertor
Является ли участник пропертором
Definition: segments.hpp:48
bool is_contributor
Является ли участник участником
Definition: segments.hpp:49
eosio::asset direct_creator_bonus
Сумма прямых премий создателю
Definition: segments.hpp:99
bool has_vote
Имеет ли участник право голоса
Definition: segments.hpp:50
eosio::asset investor_base
Фактически используемая сумма инвестора при коэффициенте возврата > 1.
Definition: segments.hpp:55
eosio::name coopname
Имя кооператива
Definition: segments.hpp:37
eosio::asset equal_author_bonus
Сумма равных премий авторам
Definition: segments.hpp:98
double author_base_cumulative_reward_per_share
Накопительная базовая награда на авторскую долю
Definition: crps.hpp:23
double author_bonus_cumulative_reward_per_share
Накопительная бонусная награда на авторскую долю
Definition: crps.hpp:24
eosio::asset total
Стоимость результата интеллектуальной деятельности (равна total_contribution)
Definition: fact_pool.hpp:53
Таблица проектов хранит информацию о проектах кооператива, которые станут результатами.
Definition: projects.hpp:40
checksum256 project_hash
Хэш проекта (внешний ключ)
Definition: projects.hpp:44
fact_pool fact
Фактические показатели
Definition: projects.hpp:67
eosio::name status
Статус проекта
Definition: projects.hpp:47
crps_data crps
Данные CRPS для распределения наград
Definition: projects.hpp:68
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