COOPENOMICS  v1
Кооперативная Экономика
wallets.hpp
См. документацию.
1#pragma once
2
3#include <array>
4#include <cstdint>
5#include <string_view>
6
7#include <eosio/eosio.hpp>
8
47 // wallet — паевой фонд + возвраты + ЦК
48 static constexpr eosio::name SHARE_FUND_PAY = "w.wal.share"_n;
49 static constexpr eosio::name CK_MEMBER = "w.wal.member"_n;
50 static constexpr eosio::name WITHDRAWALS_SINK = "w.wal.wthdrw"_n;
51 static constexpr eosio::name WITHDRAW_PENDING = "w.wal.wpend"_n;
52
53 // registrator — минимальный паевой + вступительные + суспенс
54 static constexpr eosio::name MIN_SHARE_FUND = "w.reg.minshr"_n;
55 static constexpr eosio::name ENTRANCE_FEES = "w.reg.entry"_n;
56 static constexpr eosio::name REGISTRATION_PENDING = "w.reg.pend"_n;
57
58 // soviet — членские (инфраструктура) + делегатские + хоз.расходы + использованные паевые
59 static constexpr eosio::name INFRA_FEES = "w.sov.infra"_n;
60 static constexpr eosio::name DELEGATE_FEES = "w.sov.delgte"_n;
61 static constexpr eosio::name SOV_EXPENSES = "w.sov.expns"_n;
62 static constexpr eosio::name MIN_SHARE_USED = "w.sov.mnused"_n;
63 static constexpr eosio::name NDFL_WITHHELD = "w.sov.ndfl"_n;
64
65 // capital — единые программные кошельки + займы + пред-импорт
66 static constexpr eosio::name LOAN_ISSUED = "w.cap.loan"_n;
67 static constexpr eosio::name BLAGOROST_FUND = "w.cap.blago"_n;
68 static constexpr eosio::name GENERATOR_FUND = "w.cap.gen"_n;
69 static constexpr eosio::name PREIMP_FUND = "w.cap.preimp"_n;
70 static constexpr eosio::name PROGRAM_EXPENSE_POOL = "w.cap.pgexp"_n;
71
72 // marketplace — резерв под Order + членский «Стола заказов» + выплаты
73 static constexpr eosio::name MARKETPLACE_ORDER_LOCK = "w.mkt.order"_n;
74 static constexpr eosio::name MARKETPLACE_MEMBER_FUND = "w.mkt.member"_n;
75 static constexpr eosio::name SUPPLIER_PAYMENTS = "w.mkt.payout"_n;
76 static constexpr eosio::name MARKETPLACE_FEE_POOL = "w.mkt.fee"_n;
77
78 // branch — экономика кооперативного участка (requirement b6 «Экономика КУ», раунд 5: приоритет общего кошелька)
79 static constexpr eosio::name BRANCH_PERSONAL = "w.brn.person"_n;
80 static constexpr eosio::name BRANCH_COMMON = "w.brn.common"_n;
81 static constexpr eosio::name BRANCH_DISTRIBUTION_POOL = "w.brn.pool"_n;
82 static constexpr eosio::name BRANCH_EXPENSE_POOL = "w.brn.expns"_n;
83
84
85 // expense — шасси расходов (подотчёт пайщика, USER_SHARED)
86 // Зеркало паттерна w.wal.wpend: кошелёк-резерв на пайщике-получателе ADVANCE-механики.
87 // На момент выдачи аванса фиксирует ответственность пайщика; на отчёте — BURN без новой бухпроводки
88 // (canal Дт 08 / Кт 51 уже сделан на o.exp.blgadv).
89 static constexpr eosio::name ADVANCE_HOLD = "w.exp.adv"_n;
90};
91
102enum class WalletKind : uint8_t {
103 USER_SHARED = 0,
104 COOPERATIVE = 1,
105};
106
113 eosio::name name;
114 std::string_view human_name;
116};
117
118inline constexpr std::array<Ledger2WalletMeta, 26> LEDGER2_WALLET_REGISTRY = {{
119 // USER_SHARED (11) — L3-разрез по пайщику (у w.brn.common — по braname КУ)
120 { ledger2_wallets::MIN_SHARE_FUND, "Минимальный паевой взнос", WalletKind::USER_SHARED },
121 { ledger2_wallets::SHARE_FUND_PAY, "Паевой взнос пайщика", WalletKind::USER_SHARED },
122 { ledger2_wallets::CK_MEMBER, "ЦК — членская часть пайщика", WalletKind::USER_SHARED },
123 { ledger2_wallets::BLAGOROST_FUND, "ЦПП «Благорост» — единый кошелёк программы у пайщика", WalletKind::USER_SHARED },
124 { ledger2_wallets::PREIMP_FUND, "Первичный учёт РИД-взносов до перехода на электронный учёт", WalletKind::USER_SHARED },
125 { ledger2_wallets::MARKETPLACE_ORDER_LOCK,"ЦПП «Стол Заказов» — резерв под заказ у пайщика", WalletKind::USER_SHARED },
126 { ledger2_wallets::MARKETPLACE_MEMBER_FUND,"ЦПП «Стол Заказов» — членский кошелёк пайщика программы", WalletKind::USER_SHARED },
127 { ledger2_wallets::BRANCH_PERSONAL, "Персональный кошелёк доверенного кооперативного участка", WalletKind::USER_SHARED },
128 { ledger2_wallets::BRANCH_COMMON, "Общий кошелёк членских взносов кооперативного участка", WalletKind::USER_SHARED },
129 { ledger2_wallets::ADVANCE_HOLD, "Подотчётные средства пайщика", WalletKind::USER_SHARED },
130 { ledger2_wallets::REGISTRATION_PENDING, "Регистрационный взнос в ожидании решения совета", WalletKind::USER_SHARED },
131
132 // COOPERATIVE (14) — единый кооперативный баланс, без L3
133 // GENERATOR_FUND переведён сюда из USER_SHARED (см. wallets.hpp:64) —
134 // CRPS-распределение между сегментами проекта не поддерживает per-user
135 // компенсирующие TRANSFER на approvecmmt, поэтому L3-проверка walletop
136 // ломала convertsegm у пайщиков, чья доля выросла через CRPS.
137 { ledger2_wallets::GENERATOR_FUND, "ЦПП «Генератор» — единый кошелёк программы", WalletKind::COOPERATIVE },
138 { ledger2_wallets::ENTRANCE_FEES, "Вступительные взносы", WalletKind::COOPERATIVE },
139 { ledger2_wallets::WITHDRAWALS_SINK, "Возвраты паевых взносов пайщикам (deprecated, не используется в новых операциях)", WalletKind::COOPERATIVE },
140 { ledger2_wallets::WITHDRAW_PENDING, "Резерв паевого под заявку на возврат", WalletKind::COOPERATIVE },
141 { ledger2_wallets::INFRA_FEES, "Членские взносы за инфраструктуру кооп. платформы", WalletKind::COOPERATIVE },
142 { ledger2_wallets::DELEGATE_FEES, "Делегатские членские взносы", WalletKind::COOPERATIVE },
143 { ledger2_wallets::SOV_EXPENSES, "Хозяйственные расходы из числа целевого финансирования", WalletKind::COOPERATIVE },
144 { ledger2_wallets::MIN_SHARE_USED, "Использованные минимальные паевые взносы", WalletKind::COOPERATIVE },
145 { ledger2_wallets::LOAN_ISSUED, "Выданные пайщикам беспроцентные займы", WalletKind::COOPERATIVE },
146 { ledger2_wallets::SUPPLIER_PAYMENTS, "Выплаты поставщикам", WalletKind::COOPERATIVE },
147 { ledger2_wallets::MARKETPLACE_FEE_POOL, "Резерв членских взносов «Стола заказов» под заказы", WalletKind::COOPERATIVE },
148 { ledger2_wallets::BRANCH_DISTRIBUTION_POOL, "Транзитный пул ручного распределения кооперативного участка", WalletKind::COOPERATIVE },
149 { ledger2_wallets::BRANCH_EXPENSE_POOL, "Пул расходов кооперативного участка", WalletKind::COOPERATIVE },
150 { ledger2_wallets::PROGRAM_EXPENSE_POOL, "Пул программных расходов ЦПП «Благорост»", WalletKind::COOPERATIVE },
151 { ledger2_wallets::NDFL_WITHHELD, "Удержанный НДФЛ к перечислению", WalletKind::COOPERATIVE },
152}};
153
155
156// =====================================================================
157// Compile-time валидация реестра.
158// =====================================================================
159//
160// Правила (ADR-002):
161// 1. Имена уникальны.
162// 2. Имена непустые (sentinel `eosio::name{}` запрещён).
163// 3. USER_SHARED-имена соответствуют конвенции `w.<3-char-contract>.<verb>`
164// (символ 0 = 'w', символы 1 и 5 = '.').
165//
166// Полнота поля `kind` обеспечена структурно: в `Ledger2WalletMeta` поле без
167// значения по умолчанию — попытка добавить элемент реестра без явного
168// `WalletKind` ломает сборку.
170 // base32 кодирование eosio::name (`.12345abcdefghijklmnopqrstuvwxyz`):
171 // '.' = 0
172 // '1'..'5' = 1..5
173 // 'a'..'z' = 6..31
174 // 64-битное value делится на 12 5-битных позиций (старшие биты — первый символ);
175 // 13-й символ (4 младших бита) для финального реестра не используется (имена ≤ 13 символов).
176 static constexpr uint8_t CHAR_DOT = 0; // '.'
177 static constexpr uint8_t CHAR_W = 28; // 'w' = 6 + ('w' - 'a') = 6 + 22
178
179 constexpr uint8_t decode_char_at(uint64_t value, size_t pos /* 0..11 */) {
180 // pos = 0 — старшие 5 бит (биты 59..63)
181 return static_cast<uint8_t>((value >> (59 - 5 * pos)) & 0x1F);
182 }
183
184 constexpr bool wallet_names_unique() {
185 for (size_t i = 0; i < LEDGER2_WALLET_REGISTRY_SIZE; ++i) {
186 for (size_t j = i + 1; j < LEDGER2_WALLET_REGISTRY_SIZE; ++j) {
187 if (LEDGER2_WALLET_REGISTRY[i].name == LEDGER2_WALLET_REGISTRY[j].name) return false;
188 }
189 }
190 return true;
191 }
192
193 constexpr bool wallet_names_nonempty() {
194 for (size_t i = 0; i < LEDGER2_WALLET_REGISTRY_SIZE; ++i) {
195 if (LEDGER2_WALLET_REGISTRY[i].name.value == 0) return false;
196 }
197 return true;
198 }
199
200 // ADR-002: USER_SHARED-имена обязаны соответствовать конвенции `w.<contract>.<verb>`.
201 // Конкретно: символ 0 = 'w', символ 1 = '.', символ 5 = '.' (после 3-символьного contract).
203 for (size_t i = 0; i < LEDGER2_WALLET_REGISTRY_SIZE; ++i) {
204 const auto& e = LEDGER2_WALLET_REGISTRY[i];
205 if (e.kind != WalletKind::USER_SHARED) continue;
206 const uint64_t v = e.name.value;
207 if (decode_char_at(v, 0) != CHAR_W) return false; // 'w'
208 if (decode_char_at(v, 1) != CHAR_DOT) return false; // '.'
209 if (decode_char_at(v, 5) != CHAR_DOT) return false; // '.' после 3-char contract
210 }
211 return true;
212 }
213}
214
216 "LEDGER2_WALLET_REGISTRY: duplicate wallet name detected");
218 "LEDGER2_WALLET_REGISTRY: empty eosio::name (sentinel) не должно быть в реестре");
220 "LEDGER2_WALLET_REGISTRY: USER_SHARED-имя не соответствует конвенции `w.<3-char-contract>.<verb>`");
221
228inline constexpr std::string_view ledger2_get_wallet_human_name(eosio::name wallet_name) {
229 for (size_t i = 0; i < LEDGER2_WALLET_REGISTRY_SIZE; ++i) {
230 if (LEDGER2_WALLET_REGISTRY[i].name == wallet_name) return LEDGER2_WALLET_REGISTRY[i].human_name;
231 }
232 return std::string_view{};
233}
234
238inline constexpr bool ledger2_is_known_wallet(eosio::name wallet_name) {
239 for (size_t i = 0; i < LEDGER2_WALLET_REGISTRY_SIZE; ++i) {
240 if (LEDGER2_WALLET_REGISTRY[i].name == wallet_name) return true;
241 }
242 return false;
243}
244
260 eosio::name wallet_name;
261 uint64_t required_program_id; // 0 = исключение (без проверки)
262};
263
264inline constexpr std::array<Ledger2WalletProgramMapping, 12> LEDGER2_USER_SHARED_PROGRAM_MAPPING = {{
265 { ledger2_wallets::MIN_SHARE_FUND, 0 /* w.reg.minshr — без проверки */ },
266 { ledger2_wallets::SHARE_FUND_PAY, 1 /* ЦК */ },
267 { ledger2_wallets::CK_MEMBER, 1 /* ЦК */ },
268 { ledger2_wallets::BLAGOROST_FUND, 4 /* Благорост */ },
269 { ledger2_wallets::GENERATOR_FUND, 3 /* Генератор */ },
270 { ledger2_wallets::PREIMP_FUND, 0 /* w.cap.preimp — РИД-учёт до перехода на электронный учёт, без проверки */ },
271 { ledger2_wallets::MARKETPLACE_ORDER_LOCK, 2 /* Marketplace */ },
272 { ledger2_wallets::MARKETPLACE_MEMBER_FUND,2 /* Marketplace */ },
273 { ledger2_wallets::BRANCH_PERSONAL, 0 /* w.brn.person — распределение назначает председатель КУ, программное соглашение не требуется */ },
274 { ledger2_wallets::BRANCH_COMMON, 0 /* w.brn.common — L3-разрез по braname КУ (не по пайщику), без проверки */ },
275 { ledger2_wallets::ADVANCE_HOLD, 0 /* w.exp.adv — подотчёт пайщика по СЗ; программа-источник проверена контрактом expense, повторная gate не нужна */ },
276 { ledger2_wallets::REGISTRATION_PENDING, 0 /* w.reg.pend — кандидат ещё не член, соглашения нет, без проверки */ },
277}};
278
304inline constexpr std::array<eosio::name, 3> LEDGER2_EXIT_REFUND_WALLETS = {{
308}};
309
321inline uint64_t ledger2_required_program_id(eosio::name wallet_name) {
322 for (const auto& m : LEDGER2_USER_SHARED_PROGRAM_MAPPING) {
323 if (m.wallet_name == wallet_name) return m.required_program_id;
324 }
325 // Кошелёк не в маппинге.
326 for (size_t i = 0; i < LEDGER2_WALLET_REGISTRY_SIZE; ++i) {
327 if (LEDGER2_WALLET_REGISTRY[i].name == wallet_name &&
329 eosio::check(false,
330 std::string{"ledger2_required_program_id: USER_SHARED-кошелёк "} +
331 wallet_name.to_string() +
332 " не имеет записи в LEDGER2_USER_SHARED_PROGRAM_MAPPING");
333 }
334 }
335 return 0; // не USER_SHARED → без проверки
336}
337
345inline WalletKind ledger2_get_wallet_kind(eosio::name wallet_name) {
346 for (size_t i = 0; i < LEDGER2_WALLET_REGISTRY_SIZE; ++i) {
347 if (LEDGER2_WALLET_REGISTRY[i].name == wallet_name) return LEDGER2_WALLET_REGISTRY[i].kind;
348 }
349 eosio::check(false, "ledger2_get_wallet_kind: wallet_name отсутствует в LEDGER2_WALLET_REGISTRY");
350 return WalletKind::COOPERATIVE; // unreachable
351}
constexpr std::array< Ledger2WalletProgramMapping, 12 > LEDGER2_USER_SHARED_PROGRAM_MAPPING
Definition: wallets.hpp:264
uint64_t ledger2_required_program_id(eosio::name wallet_name)
Возвращает required program_id для USER_SHARED-кошелька.
Definition: wallets.hpp:321
constexpr bool ledger2_is_known_wallet(eosio::name wallet_name)
Проверяет, что wallet_name присутствует в LEDGER2_WALLET_REGISTRY.
Definition: wallets.hpp:238
static constexpr size_t LEDGER2_WALLET_REGISTRY_SIZE
Definition: wallets.hpp:154
constexpr std::string_view ledger2_get_wallet_human_name(eosio::name wallet_name)
Возвращает human-readable имя кошелька по его eosio::name.
Definition: wallets.hpp:228
WalletKind
Тип кошелька второго уровня (ADR-002).
Definition: wallets.hpp:102
WalletKind ledger2_get_wallet_kind(eosio::name wallet_name)
Возвращает WalletKind кошелька по его eosio::name (ADR-002, ADR-010).
Definition: wallets.hpp:345
constexpr std::array< eosio::name, 3 > LEDGER2_EXIT_REFUND_WALLETS
Сет «боевых» (паевых) кошельков пайщика, возвращаемых при выходе из кооператива (заявление registry 2...
Definition: wallets.hpp:304
constexpr std::array< Ledger2WalletMeta, 26 > LEDGER2_WALLET_REGISTRY
Definition: wallets.hpp:118
Definition: wallets.hpp:169
constexpr bool wallet_names_unique()
Definition: wallets.hpp:184
constexpr bool user_shared_naming_convention()
Definition: wallets.hpp:202
static constexpr uint8_t CHAR_DOT
Definition: wallets.hpp:176
static constexpr uint8_t CHAR_W
Definition: wallets.hpp:177
constexpr bool wallet_names_nonempty()
Definition: wallets.hpp:193
constexpr uint8_t decode_char_at(uint64_t value, size_t pos)
Definition: wallets.hpp:179
Справочник кошелька: machine name → human-readable name + kind.
Definition: wallets.hpp:112
WalletKind kind
Definition: wallets.hpp:115
eosio::name name
Definition: wallets.hpp:113
std::string_view human_name
Definition: wallets.hpp:114
Маппинг USER_SHARED-кошелька → требуемый program_id для cross-contract проверки wallet::users....
Definition: wallets.hpp:259
eosio::name wallet_name
Definition: wallets.hpp:260
uint64_t required_program_id
Definition: wallets.hpp:261
Стандарт кошельков ledger2 (пересмотр 2026-05-05 — финальный реестр + WalletKind).
Definition: wallets.hpp:46
static constexpr eosio::name CK_MEMBER
ЦК — членская часть пайщика (USER_SHARED)
Definition: wallets.hpp:49
static constexpr eosio::name PROGRAM_EXPENSE_POOL
Пул программных расходов ЦПП «Благорост» (COOPERATIVE) — кооперативный кошелёк, из которого шасси exp...
Definition: wallets.hpp:70
static constexpr eosio::name ADVANCE_HOLD
Подотчётные средства пайщика (USER_SHARED; резерв при ADVANCE-механике шасси расходов)
Definition: wallets.hpp:89
static constexpr eosio::name INFRA_FEES
Членские взносы за инфраструктуру кооп. платформы (COOPERATIVE)
Definition: wallets.hpp:59
static constexpr eosio::name SOV_EXPENSES
Хозяйственные расходы из числа целевого финансирования (COOPERATIVE)
Definition: wallets.hpp:61
static constexpr eosio::name BRANCH_DISTRIBUTION_POOL
Транзитный пул ручного распределения КУ (COOPERATIVE; баланс нулевой вне транзакции)....
Definition: wallets.hpp:81
static constexpr eosio::name DELEGATE_FEES
Делегатские членские взносы (цель CONVERT_TO_AXN, COOPERATIVE)
Definition: wallets.hpp:60
static constexpr eosio::name BRANCH_COMMON
Общий кошелёк членских взносов кооперативного участка (USER_SHARED с разрезом по braname КУ,...
Definition: wallets.hpp:80
static constexpr eosio::name MIN_SHARE_FUND
Минимальный паевой взнос пайщика (USER_SHARED, без сверки соглашений)
Definition: wallets.hpp:54
static constexpr eosio::name BRANCH_PERSONAL
Персональный кошелёк доверенного/председателя КУ (USER_SHARED по доверенному, счёт 86)....
Definition: wallets.hpp:79
static constexpr eosio::name MARKETPLACE_MEMBER_FUND
ЦПП «Стол Заказов» — членский кошелёк пайщика программы (USER_SHARED, счёт 86). Сюда возвращается ост...
Definition: wallets.hpp:74
static constexpr eosio::name MARKETPLACE_ORDER_LOCK
ЦПП «Стол Заказов» — резерв средств пайщика под конкретный Order (USER_SHARED). TRANSFER w....
Definition: wallets.hpp:73
static constexpr eosio::name WITHDRAW_PENDING
Резерв паевого под заявку на возврат (COOPERATIVE-пул). o.wal.wthreq переводит сюда с w....
Definition: wallets.hpp:51
static constexpr eosio::name SUPPLIER_PAYMENTS
Выплаты поставщикам (sink PAYOUT, COOPERATIVE)
Definition: wallets.hpp:75
static constexpr eosio::name PREIMP_FUND
Первичный учёт РИД-взносов до перехода на электронный учёт (USER_SHARED; o.cap.preimp / o....
Definition: wallets.hpp:69
static constexpr eosio::name GENERATOR_FUND
Генератор — единый агрегированный кошелёк программы (COOPERATIVE — кооперативный пул,...
Definition: wallets.hpp:68
static constexpr eosio::name BLAGOROST_FUND
Благорост — единый агрегированный кошелёк программы (USER_SHARED; ADR-009)
Definition: wallets.hpp:67
static constexpr eosio::name WITHDRAWALS_SINK
DEPRECATED 2026-05-21: исторический sink возвратов. Оставлен в реестре для исторических L2-балансов (...
Definition: wallets.hpp:50
static constexpr eosio::name BRANCH_EXPENSE_POOL
Пул расходов кооперативного участка (COOPERATIVE) — источник средств шасси расходов для КУ....
Definition: wallets.hpp:82
static constexpr eosio::name SHARE_FUND_PAY
Паевой взнос пайщика (USER_SHARED)
Definition: wallets.hpp:48
static constexpr eosio::name MIN_SHARE_USED
Использованные минимальные паевые взносы (Cr 80 source, перешедшие в 08; COOPERATIVE)
Definition: wallets.hpp:62
static constexpr eosio::name ENTRANCE_FEES
Вступительные взносы (Cr 86, COOPERATIVE)
Definition: wallets.hpp:55
static constexpr eosio::name NDFL_WITHHELD
Удержанный НДФЛ к перечислению в бюджет (COOPERATIVE, счёт 68). Кошелёк общекооперативный: в него сте...
Definition: wallets.hpp:63
static constexpr eosio::name MARKETPLACE_FEE_POOL
Резерв членских взносов «Стола заказов» под заказы (COOPERATIVE-пул, по образцу w....
Definition: wallets.hpp:76
static constexpr eosio::name REGISTRATION_PENDING
Регистрационный взнос в ожидании решения совета (суспенс счёта 76, USER_SHARED, без сверки соглашений...
Definition: wallets.hpp:56
static constexpr eosio::name LOAN_ISSUED
Выданные пайщикам беспроцентные займы (COOPERATIVE; Dr 58 / Cr 51)
Definition: wallets.hpp:66