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