Compare commits

...

800 Commits

Author SHA1 Message Date
Alex Ant 196f3bcba1 level & energy system 2025-10-27 21:36:02 +05:00
Alex Ant bc73c5ca86 contract gamification 2025-10-27 16:19:56 +05:00
Alex Ant f4badc15d1 редактирование участника, шаблон "о себе" 2025-10-27 12:50:51 +05:00
Alex Ant 76f731d0cd poll requests for update content 2025-10-26 18:27:08 +05:00
Alex Ant 5e22858ab4 some bugs and permissions 2025-10-26 15:45:15 +05:00
Alex Ant bc1c54c43e notifications on novu improve (sanity), make a coop settings for chairman and select default workspace / page 2025-10-25 20:19:10 +05:00
Alex Ant 95ac0d36f8 a lot of changes 2025-10-22 19:53:40 +05:00
Alex Ant 2bee3eb179 unique participants count and workflow notification 2025-10-21 17:13:20 +05:00
Alex Ant 52165f2a0b microWallet & workspaceMenu rework 2025-10-20 21:12:53 +05:00
Alex Ant 9f2da226f4 extensionsStore refactoring and make it with multi-desktops 2025-10-20 17:26:24 +05:00
Alex Ant 46b999317d result submission 2025-10-20 15:35:32 +05:00
Alex Ant 80bce3c9c2 refactoring, optimization and improvement 2025-10-17 19:33:07 +05:00
Alex Ant 90b25b4bd8 fab | visual refactoring 2025-10-16 20:34:56 +05:00
Alex Ant f562f1eafd Merge branch 'dev' into capital 2025-10-16 10:27:23 +05:00
Alex Ant ff520622ff chore(release): publish 2025-10-16 10:25:26 +05:00
Alex Ant 1a6c6a4f31 fix parser 2025-10-16 01:32:23 +05:00
Alex Ant 4a9e0388f4 fix parser start block 2025-10-16 01:30:55 +05:00
Alex Ant e47b2a971e chore(release): publish 2025-10-15 23:12:28 +05:00
Alex Ant 96777ec095 delete mongo transactions 2025-10-15 23:00:23 +05:00
Alex Ant 52019deef5 ComponentPage 2025-10-15 22:51:30 +05:00
Alex Ant c26a534ff6 secondary route menu 2025-10-15 20:36:24 +05:00
Alex Ant e5be5c0b05 syncers refactoring and frontend 2025-10-15 13:49:20 +05:00
Alex Ant 5b07f52641 hard update 2025-10-14 22:06:23 +05:00
Alex Ant e0109cb530 pushResult подготовка и отправка документов с ожиданием решения совета 2025-10-12 19:41:53 +05:00
Alex Ant 1496dd1598 approvals with auth start 2025-10-07 19:41:54 +05:00
Alex Ant efcaeb2f00 set plan and other | going to voting 2025-10-07 11:31:56 +05:00
Alex Ant 1252946fe5 permissions and booter 2025-10-05 10:55:53 +05:00
Alex Ant 2913d5f636 some widgets and filters 2025-10-02 17:35:06 +05:00
Alex Ant c50beb3d43 some updates 2025-09-29 13:34:52 +05:00
Alex Ant 46b559001a some refactoring 2025-09-28 16:38:19 +05:00
Alex Ant 55a2e2e060 agreement repo and mutation 2025-09-28 15:48:56 +05:00
Alex Ant 12364a052f desktop agremeent features 2025-09-28 13:18:38 +05:00
Alex Ant 45ac971035 entity log 2025-09-28 11:19:50 +05:00
Alex Ant 26b818c9a6 update 2025-09-27 17:58:04 +05:00
Alex Ant 007836f52e contributor registration #1 2025-09-25 20:16:58 +05:00
Alex Ant ed0982770b mutations for all document generations 2025-09-25 12:47:17 +05:00
Alex Ant dcc72e90b7 factory capital documents basic templates 2025-09-24 21:52:34 +05:00
Alex Ant b428660944 project voting skeleton 2025-09-23 12:56:22 +05:00
Alex Ant 0008dcc0ee time tracker #3 2025-09-22 22:56:45 +05:00
Alex Ant e3fbf3981d time tracker personal time limit 2025-09-22 17:04:09 +05:00
Alex Ant c5e9244a08 selector fix 2025-09-21 23:55:11 +05:00
Alex Ant e1fd823c13 time tracker 2025-09-21 23:53:21 +05:00
Alex Ant 346f0d636c time tracker sdk queries 2025-09-21 20:42:28 +05:00
Alex Ant 315a259e5b lang refactoring 2025-09-21 16:09:19 +05:00
Alex Ant 3157a03c74 time tracking service prototype 2025-09-21 14:50:18 +05:00
Alex Ant 045807a748 edit project and create commit simple button on tasks 2025-09-20 20:52:53 +05:00
Alex Ant ea0e12ac80 update 2025-09-20 17:33:07 +05:00
Alex Ant 692060af6c update 2025-09-19 20:42:16 +05:00
Alex Ant d8b23a4b5c issues create 2025-09-19 10:41:29 +05:00
Alex Ant 074bf55d6c stories complete 2025-09-18 16:28:51 +05:00
Alex Ant 84e505b817 before make pain 2025-09-17 21:23:52 +05:00
Alex Ant a12e6ff603 taskPage 2025-09-17 16:40:18 +05:00
Alex Ant b01d662a1c components 2025-09-16 23:28:34 +05:00
Alex Ant e631dad499 getState, fix some bugs 2025-09-16 17:28:01 +05:00
Alex Ant 7ab0bfdd6b optional right drawer 2025-09-15 22:52:17 +05:00
Alex Ant 35a4db43fb add all entities and make extension store better 2025-09-13 01:02:21 +05:00
Alex Ant 094028006b make new queries and selectors 2025-09-11 22:21:53 +05:00
Alex Ant c12f42fcac some selectors, queries, features and entities 2025-09-11 19:10:37 +05:00
Alex Ant 3e498b098b refactoring #2 2025-09-11 13:03:21 +05:00
Alex Ant bbf1a1a544 refactoring 2025-09-11 12:15:05 +05:00
Alex Ant 42d57f30bf update names 2025-09-10 19:28:13 +05:00
Alex Ant 19967a9ad0 update 2025-09-10 15:23:33 +05:00
Alex Ant 9d1a8f12d8 main domain model 2025-09-10 14:22:14 +05:00
Alex Ant 57bebebe09 domain entities synced with blockchain 2025-09-08 13:47:40 +05:00
Alex Ant d19303cd62 typeorm repositories 2025-09-07 21:06:54 +05:00
Alex Ant 7c96e46a37 domain entities and infrastructure mappers 2025-09-07 20:44:28 +05:00
Alex Ant f75e68f8ce before refactoring 2025-09-06 16:42:29 +05:00
Alex Ant c8d9ee2457 migration fixs 2025-09-05 23:22:49 +05:00
Alex Ant a29f23086a update migrations 2025-09-05 23:07:27 +05:00
Alex Ant 4a76365df4 migrator fix 2025-09-05 22:56:08 +05:00
Alex Ant 972264844a migrator commands and subcommands 2025-09-05 22:46:39 +05:00
Alex Ant e23e6f3c1a some domain modules for capital 2025-09-05 15:03:48 +05:00
Alex Ant 03c10382d1 save deltas and actions and forks to main repositories 2025-09-04 14:21:20 +05:00
Alex Ant 3abe24aa18 refactoring, double bus refactoring, delete notificator module, desktop fix 2025-09-03 22:30:05 +05:00
Alex Ant 2a4eabcda5 update 2025-09-02 11:36:59 +05:00
Alex Ant 280d98c9c4 update docs 2025-09-02 11:35:46 +05:00
Alex Ant 227c5c80c8 chore(release): publish 2025-09-01 20:20:41 +05:00
Alex Ant edd00a6ab5 add capital to whitelist 2025-09-01 19:29:11 +05:00
Alex Ant d57bb17fc7 fix package.json 2025-09-01 19:00:32 +05:00
Alex Ant 098da5c868 small refactoring 2025-09-01 16:41:26 +05:00
Alex Ant dfc17bcc26 complete common tests 2025-09-01 14:18:54 +05:00
Alex Ant 7a5eab104e common capital tests 2025-09-01 11:37:54 +05:00
Alex Ant e0bf815377 cut some in docs 2025-08-27 22:48:37 +05:00
Alex Ant 2cbc6f2890 update 2025-08-27 22:46:38 +05:00
Alex Ant 5859b2c08b some fixs 2025-08-27 22:11:04 +05:00
Alex Ant 44eaa9dc8b economic fix 2025-08-27 22:03:06 +05:00
Alex Ant 49cd7a41dd documentation updates and some capital bug fix 2025-08-27 21:25:27 +05:00
Alex Ant 53de5ece21 test repair 2025-08-27 16:03:00 +05:00
Alex Ant 90dffa5fcc workflow 2025-08-27 00:19:13 +05:00
Alex Ant ac6cd0ca15 update 2025-08-27 00:05:24 +05:00
Alex Ant 0e970128ab update 2025-08-27 00:03:00 +05:00
Alex Ant 9fc373384d update 2025-08-26 23:23:28 +05:00
Alex Ant a76bd2ea55 fix header 2025-08-26 23:15:59 +05:00
Alex Ant 3c610b74d2 update package.json 2025-08-26 20:07:39 +05:00
Alex Ant 0623005ff4 effects, documents and processes 2025-08-26 19:58:20 +05:00
Alex Ant 8b032eba9a some docs 2025-08-25 20:11:42 +05:00
Alex Ant e3229b85fd before update 2025-08-24 11:40:24 +05:00
Alex Ant 1178431b8f update docx 2025-08-22 23:44:35 +05:00
Alex Ant 9d92c4a2b1 update docs 2025-08-22 17:54:10 +05:00
Alex Ant 0bda8707ce before delete anchors 2025-08-22 12:35:16 +05:00
Alex Ant 9cb7d3a0fd docs 2025-08-21 17:01:13 +05:00
Alex Ant f1204f948a update docx 2025-08-20 21:54:54 +05:00
Alex Ant 455b8dafb0 start make doc 2025-08-20 21:53:24 +05:00
Alex Ant fe5a32d95b some tests 2025-08-19 20:19:06 +05:00
Alex Ant b34f6f1690 direct coordinator rewards 2025-08-12 15:18:06 +05:00
Alex Ant a89bc35c6f before coordinators distribution change 2025-08-12 11:51:20 +05:00
Alex Ant e551b6c202 restore losted actions in fund contract 2025-08-08 20:27:09 +05:00
Alex Ant c6ed1afc51 test prepare 2025-08-08 20:24:20 +05:00
Alex Ant 4bedebb74d capital -> cooptypes 2025-08-08 19:38:25 +05:00
Alex Ant 741fc7eb05 готово к отладке 2025-08-08 16:51:46 +05:00
Alex Ant 000da1197c voting by vodyanov system 2025-08-03 16:45:11 +05:00
Alex Ant dd8be29d54 core / startproject 2025-08-01 17:51:15 +05:00
Alex Ant 099c2c7ff4 capital прием инвестиций и расчеты 2025-07-31 21:14:21 +05:00
Alex Ant 874232a152 Merge branch 'dev' into capital 2025-07-30 13:18:14 +05:00
Alex Ant d21f046e1f ignore DS_store 2025-07-30 13:17:58 +05:00
Alex Ant ef0e25878e Merge branch 'dev' into capital 2025-07-30 13:17:35 +05:00
Alex Ant cd37619af1 ledger - переход на debet и credit транзакции 2025-07-30 13:15:58 +05:00
Alex Ant 209ee18943 capital refactoring 2025-07-30 10:15:21 +05:00
Alex Ant aff7733a5b refactoring capital contract 2025-07-29 13:20:42 +05:00
Alex Ant 4bb65921e4 Merge branch 'dev' into capital 2025-07-29 10:02:03 +05:00
Alex Ant 26216a6a8c списание и отмена списания в истории 2025-07-29 10:01:28 +05:00
Alex Ant 60c3f11d7e fix 2025-07-29 00:40:24 +05:00
Alex Ant fcab08bfab история движений средств по счетам 2025-07-29 00:17:33 +05:00
Alex Ant e69ba466e1 chore(release): publish 2025-07-28 21:08:02 +05:00
Alex Ant 675e85ee09 fix precision 2025-07-28 20:26:31 +05:00
Alex Ant 36ec13b2c4 Merge branch 'ledger' into dev 2025-07-28 18:14:06 +05:00
Alex Ant 0b9c36e3ce Merge branch 'dev' into capital 2025-07-28 17:31:25 +05:00
Alex Ant 07cf895447 migration msg change 2025-07-28 17:30:10 +05:00
Alex Ant 028f21f0cf complete ledger contract 2025-07-28 17:14:06 +05:00
Alex Ant 77724e363d замена контракта fund на ledger 2025-07-27 13:13:58 +05:00
Alex Ant 15863d8a5a appendix еще не работает 2025-07-27 10:02:35 +05:00
Alex Ant b836af58f0 Merge branch 'dev' of github.com:coopenomics/mono into capital 2025-07-26 19:02:15 +05:00
Alex Ant ef5d880f14 chore(release): publish 2025-07-23 21:09:51 +05:00
Alex Ant 15fd03b4c0 устранена проверка времени подписи на голосовании 2025-07-23 21:09:07 +05:00
Alex Ant cac06f3e17 chore(release): publish 2025-07-23 15:13:43 +05:00
Alex Ant 6d81c62cdf setWif for cooperative 2025-07-23 15:12:30 +05:00
Alex Ant 60e319589d chore(release): publish 2025-07-20 21:35:08 +05:00
Alex Ant 7723a5785d Merge branch 'testnet' 2025-07-20 21:34:49 +05:00
Alex Ant dd982fe6e2 Merge branch 'dev' into testnet 2025-07-20 21:30:12 +05:00
Alex Ant c02dfeaa97 bug fix на составном префиксе кооператива при голосовании на общем собрании 2025-07-20 21:29:00 +05:00
Alex Ant a3d513afb0 update gitignore 2025-07-20 12:08:36 +05:00
Alex Ant 40fa99a1f9 смарт-контракт адаптирован к ТЗ, рыба контроллера 2025-07-20 12:06:46 +05:00
Alex Ant f26c996095 chore(release): publish 2025-07-15 17:17:20 +05:00
Alex Ant 012c4dfb9f fix 2025-07-15 17:15:14 +05:00
Alex Ant 9337ca2616 chore(release): publish 2025-07-15 16:59:47 +05:00
Alex Ant 5dcec4bcfd Merge branch 'testnet' 2025-07-15 16:57:48 +05:00
Alex Ant ed2e5e4d09 fix build image 2025-07-15 10:37:42 +05:00
Alex Ant 2249f52c32 fix build 2025-07-15 10:19:45 +05:00
Alex Ant f4ef5d2b53 notifications release 2025-07-15 09:59:21 +05:00
Alex Ant a92c5d6ce0 pwa configuration fix and novu subscribers fix 2025-07-14 13:38:34 +05:00
Alex Ant b61ceaead6 widget mode 2025-07-10 19:47:11 +05:00
Alex Ant 0672cfc8f3 delete notificator2 2025-07-10 17:29:43 +05:00
Alex Ant b5859a43cc Merge branch 'dev' into testnet 2025-07-10 16:49:33 +05:00
Alex Ant de1cd7c737 pwa push notifications 2 2025-07-10 16:45:07 +05:00
Alex Ant f588312ad3 pwa push notifications 2025-07-10 16:44:42 +05:00
Alex Ant 643ef1fa45 chore(release): publish 2025-07-08 14:17:04 +05:00
Alex Ant ec38a4ed33 reset and invite emails fix 2025-07-08 14:15:07 +05:00
Alex Ant defbd80ce0 fix contacts 2025-07-08 13:08:42 +05:00
Alex Ant f11b91e7fa auto reload on update 2025-07-08 12:56:05 +05:00
Alex Ant 58bb4d5a7f fix contacts bug 2025-07-08 12:43:01 +05:00
Alex Ant d92af60d9b лист подключенных кооперативов и документация 2025-07-08 10:14:04 +05:00
Alex Ant bca1e043bd chore(release): publish 2025-07-07 10:26:39 +05:00
Alex Ant 7719175e85 update 2025-07-07 10:13:31 +05:00
Alex Ant 046146c4d8 delete sdk docs from repo 2025-07-07 09:45:43 +05:00
Alex Ant 0e2f66b35a add gitignore 2025-07-07 09:45:06 +05:00
Alex Ant 56b9ff1dc9 docs, registration fix and connection button fix 2025-07-07 09:44:06 +05:00
Alex Ant dab8e78cd5 chore(release): publish 2025-07-06 23:15:03 +05:00
Alex Ant 67dd27b9a1 pwa rollback 2025-07-06 23:11:29 +05:00
Alex Ant 4605985a47 fix 2025-07-06 22:45:39 +05:00
Alex Ant 02ac27342a fix exlude error 2025-07-06 22:37:06 +05:00
Alex Ant cbc59a4a1c chore(release): publish 2025-07-06 21:48:06 +05:00
Alex Ant 02758d96c7 PWA service worker update 2025-07-06 21:44:36 +05:00
Alex Ant 12752134fd стол председателя 2025-07-06 17:32:43 +05:00
Alex Ant 504e70441b move exit button 2025-07-06 14:34:58 +05:00
Alex Ant 85cd16e793 navigation guard fix & desktop store left drawer mobile improve 2025-07-06 13:22:15 +05:00
Alex Ant aa2277f05e visual fixs 2025-07-06 11:46:21 +05:00
Alex Ant 27eb96722a chore(release): publish 2025-07-05 18:14:55 +05:00
Alex Ant 0215096c9e изменение принципа отображения кнопок действия 2025-07-05 18:13:31 +05:00
Alex Ant 90d8c51402 фикс гоночного бага при входе, демонстрация входящих оповещений всплывками 2025-07-05 16:45:51 +05:00
Alex Ant ba0bbfefe7 fix boot index 2025-07-05 13:02:25 +05:00
Alex Ant dd65673c1e pwa+ssr configuration 2025-07-05 12:54:30 +05:00
Alex Ant 2f3f8de682 fix 2025-07-05 10:18:32 +05:00
Alex Ant 3ce6fcad3a fix 2025-07-05 09:43:43 +05:00
Alex Ant 4302e7426e update quasar config 2025-07-04 23:09:25 +05:00
Alex Ant 4e246c35c8 try it 2025-07-04 22:44:43 +05:00
Alex Ant 0cbcae9624 update 2025-07-04 21:35:32 +05:00
Alex Ant 313aed606f update 2025-07-04 21:24:47 +05:00
Alex Ant aade735c79 Merge branch 'dev' into testnet 2025-07-04 21:17:50 +05:00
Alex Ant 1e5786a142 looking for bug 2025-07-04 21:14:45 +05:00
Alex Ant 3e5e5eeafa Merge branch 'dev' into testnet 2025-07-04 21:07:56 +05:00
Alex Ant 8a48ee8e14 logging 2025-07-04 21:04:56 +05:00
Alex Ant 6a89981c77 try add env to PWA 2025-07-04 19:59:55 +05:00
Alex Ant 03c014fdda rollback 2025-07-04 19:32:30 +05:00
Alex Ant ae683cd3c9 rollback env 2025-07-04 19:03:26 +05:00
Alex Ant a0dcae0882 pwa env inject 2025-07-04 18:34:43 +05:00
Alex Ant 6e839b210c update 2025-07-04 17:06:08 +05:00
Alex Ant c7f4f62e93 update package.json 2025-07-04 16:50:59 +05:00
Alex Ant 214aba8f01 pwa 2025-07-04 16:07:38 +05:00
Alex Ant 153c9d944f Merge branch 'notifications' into dev 2025-07-04 13:48:05 +05:00
Alex Ant 99a9d15871 pwa implementation 2025-07-04 13:47:42 +05:00
Alex Ant f6fb905ef8 Генерация, синхронизация и выдача данных для центра уведомлений 2025-07-04 13:12:33 +05:00
Alex Ant a5456452f6 http auth 2025-07-03 18:48:50 +05:00
Alex Ant 48cd9af739 Merge commit 'b9ae66e557f82e1265ae8d71c7fd6ec38509b5f1' into notifications 2025-07-03 18:09:23 +05:00
Alex Ant 01fac428d5 chore(release): publish 2025-07-03 18:05:11 +05:00
Alex Ant 3acce100f6 Merge branch 'testnet' 2025-07-03 18:04:50 +05:00
Alex Ant ba2dfe6598 Merge branch 'dev' into testnet 2025-07-03 18:04:27 +05:00
Alex Ant 46600c38a8 fast bug fix 2025-07-03 18:04:17 +05:00
Alex Ant b9ae66e557 чуть не забыл 2025-07-03 18:03:31 +05:00
Alex Ant bed9010918 some steps 2025-07-03 17:58:45 +05:00
Alex Ant d13ccbde71 bug: meet service improve 2025-07-02 13:27:31 +05:00
Alex Ant 2e2aac0413 chore(release): publish 2025-07-02 12:16:36 +05:00
Alex Ant 5f18cff344 fix: meet сервис на отправку уведомления о повторном собрании 2025-07-02 11:58:51 +05:00
Alex Ant 830300ea81 chore(release): publish 2025-07-01 21:03:01 +05:00
Alex Ant 9da2fcfbca migration 2025-07-01 20:31:21 +05:00
Alex Ant ece68df495 добавлены анимации для входа и выхода меню, улучшена логика рендеринга. Обновлены стили и добавлен ключ для перерендера при смене маршрутов. Исправлены мелкие недочеты в других компонентах. 2025-07-01 16:46:33 +05:00
Alex Ant 6a43ddbee9 chore(release): publish 2025-07-01 16:04:01 +05:00
Alex Ant ee58596ed0 Упрощен компонент ShadowHtml: удалена проверка на клиентскую среду, добавлены логи для отладки, обновлено состояние миграции с изменением тестового файла. 2025-07-01 15:45:10 +05:00
Alex Ant 5bce6e77ae Исправлено название типа платежа "Возврат средств" на "Возврат взноса" в PaymentDomainEntity. 2025-07-01 13:36:13 +05:00
Alex Ant 5dec45c0c8 Рефакторинг пользователя в сессии на фронте, правки визуального отображения всех страниц, управление исходящими платежами в шлюзе, возврат паевого взноса в кошельке. 2025-07-01 13:34:46 +05:00
Alex Ant b7ba6500e4 Новая архитектура для входящих и исходящих платежей 2025-06-26 20:20:58 +05:00
Alex Ant 2a263d749b returnByMoneyDecision Document 2025-06-25 20:34:12 +05:00
Alex Ant 3a21af48d1 Добавляем шаблон заявления на возврат паевого взноса с ЦК 2025-06-24 16:18:34 +05:00
Alex Ant cb3bfe99ce chore(release): publish 2025-06-24 09:07:26 +05:00
Alex Ant 328d51622f fix navigation guard bug 2025-06-24 08:50:05 +05:00
Alex Ant 38ead74697 поле ввода для поиска пайщика и извлечения его username 2025-06-23 20:56:07 +05:00
Alex Ant ffd4d72850 search by private account 2025-06-23 13:30:34 +05:00
Alex Ant d23d90a794 Корректное удаление кооперативного участка. Общее собранее уполномоченных. Правки title шаблонов. 2025-06-19 12:09:10 +05:00
Alex Ant c74036ad26 chore(release): publish 2025-06-19 10:00:51 +05:00
Alex Ant a146a9f424 Правка сообщений с ошибками на фронте, расширение шаблонов общих собраний на повторяемость. 2025-06-19 09:41:41 +05:00
Alex Ant ddc0c82cee chore(release): publish 2025-06-14 21:27:59 +05:00
Alex Ant bab09ac0d7 FATALITY BUG FIX 2025-06-14 21:26:41 +05:00
Alex Ant 8a6eb912c5 Revert "откатываем функционал"
This reverts commit e5642cd752.
2025-06-14 20:28:02 +05:00
Alex Ant b5fbd40ea3 update workflow #2 2025-06-14 17:56:14 +05:00
Alex Ant 46b1c085cd workflow fix 2025-06-14 16:09:22 +05:00
Alex Ant e5642cd752 откатываем функционал 2025-06-14 13:40:01 +05:00
Alex Ant be933e9085 fix hash router 2025-06-14 11:07:35 +05:00
Alex Ant 26769675c7 rollback 2025-06-14 09:07:57 +05:00
Alex Ant 672d6d67aa chore(release): publish 2025-06-13 20:45:38 +05:00
Alex Ant b3c6967ed9 update 2025-06-13 20:18:34 +05:00
Alex Ant 9a528b17e8 update 2025-06-13 20:15:39 +05:00
Alex Ant 4532932749 back to hash routing 2025-06-13 19:48:36 +05:00
Alex Ant 639a8e2f35 update 2025-06-13 19:20:02 +05:00
Alex Ant 56c2ab38c6 looking for bug 2025-06-13 17:08:27 +05:00
Alex Ant 9769cc0ed4 enable test mode 2025-06-13 16:15:50 +05:00
Alex Ant 96d66b2205 Обновлено использование индекса cooperatives в shared_registrator.hpp, добавлено новое действие delmeet в meet для удаления собраний. Исправлены проверки на наличие активных пайщиков и добавлено форматирование ссылок в компонентах голосования и повестки. Обновлены формы создания и перезапуска собраний для поддержки новых требований. 2025-06-13 13:26:32 +05:00
Alex Ant fea73109ca Добавлено использование функции parseLinks для форматирования ссылок в контексте и решениях в компонентах повестки и голосования. Упрощен код за счет удаления дублирующей функции parseLinks из компонентов. 2025-06-12 20:26:43 +05:00
Alex Ant e39c15c16f Добавлено форматирование ссылок в повестке собрания. Реализована функция для преобразования текста с ссылками в HTML-формат. Исправлено отображение контекста повестки. 2025-06-12 20:22:33 +05:00
Alex Ant 2a13f60bbd Добавлено новое поле 'level' в интерфейсы и DTO для обработки собраний, обновлены адаптеры для поддержки этого поля. Пофиксена проблема с Float на проценте кворума. 2025-06-12 20:14:55 +05:00
Alex Ant d8e9738d71 fix count 2025-06-12 19:17:45 +05:00
Alex Ant f38b78f821 подсчитываем количество активных пайщиков в кооперативах 2025-06-12 15:47:27 +05:00
Alex Ant 9c21630295 meet fix 2025-06-12 15:45:12 +05:00
Alex Ant ea502727ba добавлено действие migrate в meet и созданы миграции на добавление новых шаблонов 2025-06-12 14:56:42 +05:00
Alex Ant 72f4999162 release 2025-06-12 11:13:51 +05:00
Alex Ant adf1dbe635 Добавлены новые зависимости moment-timezone и @novu/js, обновлены версии существующих пакетов. Внесены изменения в модули и сервисы для поддержки новых функциональностей, включая адаптеры для расширений и обработку уведомлений. Реализована логика работы с временными зонами и обновлены интерфейсы для работы с аккаунтами и собраниями. 2025-06-11 21:39:13 +05:00
Alex Ant af2cdb1ca1 Добавлены новые поля для ответов голосования в схемы и DTO, а также обновлены интерфейсы и типы для поддержки голосования на собраниях. Реализована логика обработки ответов и обновлены компоненты для работы с новыми данными. Добавлена поддержка часового пояса в форматирование дат. 2025-06-10 14:14:44 +05:00
Alex Ant e499c0e990 Обновлены компоненты рабочего стола: добавлены маршруты по умолчанию для рабочих столов "participant" и "soviet", реализована логика выбора рабочего стола на основе прав пользователя и сохраненного выбора. Также добавлены новые методы для навигации и сохранения состояния рабочего стола. Исправлены ошибки в компонентах и улучшена верстка. 2025-06-09 17:54:33 +05:00
Alex Ant 206ab6793f almost works 2025-06-09 15:27:03 +05:00
Alex Ant e207c90fd4 add exampleData 2025-06-03 13:12:35 +05:00
Alex Ant c9864008a3 update 2025-06-03 10:54:14 +05:00
Alex Ant 5c89b27a87 update 2025-06-02 23:15:51 +05:00
Alex Ant 3c482ba017 update cooptypes and factory 2025-06-02 23:00:32 +05:00
Alex Ant 2d684411d4 Добавлена поддержка часового пояса в компоненты создания и перезапуска собраний. Обновлены метки для отображения времени с учетом часового пояса. Добавлены зависимости moment-timezone и обновлены конфигурации окружения. 2025-05-30 22:54:22 +05:00
Alex Ant 408ee36a8b Поправлена верстка. Обновлены компоненты для отображения новых данных о вопросах и результатах голосования. Изменен SDK для корректной мульти-подписи документа. 2025-05-30 21:42:07 +05:00
Alex Ant d9efbad80d Добавлены поля для председателя и секретаря в интерфейсы и DTO собраний, а также обновлены соответствующие селекторы и агрегаты документов. Введены сертификаты для председателя и секретаря, обновлены зависимости и исправлены ссылки на информацию о пользователях в документах. 2025-05-23 17:48:52 +05:00
Alex Ant 92e5c9f71a Добавлены новые типы сертификатов пользователей (EntrepreneurCertificate, IndividualCertificate, OrganizationCertificate, RepresentedByCertificate) и обновлены соответствующие DTO и интерфейсы. Обновлены зависимости в модулях и исправлены ссылки на информацию о подписантах в документах. 2025-05-23 14:14:56 +05:00
Alex Ant baef88be50 expandableDocument for meet 2025-05-23 10:49:03 +05:00
Alex Ant 7eff6ac504 meet aggregation DTO 2025-05-22 17:51:29 +05:00
Alex Ant a3ea4d4e18 chore(release): publish 2025-05-14 16:16:51 +05:00
Alex Ant f12047e36f повторная миграция соглашений 2025-05-14 15:41:34 +05:00
Alex Ant c77f37cc43 chore(release): publish 2025-05-14 12:45:52 +05:00
Alex Ant 8bc463b6d6 Обновлен changelog для версии v2025.5.14. 2025-05-14 12:22:46 +05:00
Alex Ant 953429f0da Добавлена поддержка смены темы (светлая/темная) с сохранением в localStorage, обновлены соответствующие компоненты и стили. Исправлено отображение данных участников в таблицах. 2025-05-14 12:12:00 +05:00
Alex Ant 8598050931 Добавлено поле аккаунта в тип Payment и обновлены соответствующие сущности и DTO, а также интерфейс для отображения ФИО плательщика. 2025-05-13 18:15:21 +05:00
Alex Ant 81566674a8 chore(release): publish 2025-05-13 14:56:31 +05:00
Alex Ant aba9f88352 factory bugs fix 2025-05-13 10:19:44 +05:00
Alex Ant 0093c6ddf7 fix bug on dinamic import 2025-05-13 09:10:04 +05:00
Alex Ant cd5a0c2fbc процесс голосования через подпись номера решения 2025-05-12 10:41:37 +05:00
Alex Ant b1c803d2f1 almost done 2025-05-09 17:31:41 +05:00
Alex Ant 3883b68669 SDK компилируется 2025-05-07 08:23:59 +05:00
Alex Ant 5111bb12cf Merge branch 'dev' into document2 2025-05-05 18:56:04 +05:00
Alex Ant cc2518a346 chore(release): publish 2025-05-05 18:55:34 +05:00
Alex Ant 6e98f4c953 update version 2 2025-05-05 18:55:01 +05:00
Alex Ant 8990b25970 update version 2025-05-05 18:53:25 +05:00
Alex Ant c0cdde8685 Merge branch 'testnet' 2025-05-05 18:50:23 +05:00
Alex Ant 7a7e20e4c2 откатываем новую таблицу кооперативов 2025-05-05 18:49:08 +05:00
Alex Ant 743ccd27b6 контракты скомпилировались 2025-05-05 18:46:44 +05:00
Alex Ant 155d9110c5 before contract migrate 2025-05-05 17:25:56 +05:00
Alex Ant 651e0b3445 chore(release): publish 2025-05-05 12:53:42 +05:00
Alex Ant 82f438cbe4 coop migration 2025-05-05 12:28:54 +05:00
Alex Ant c3c30b4e20 chore(release): publish 2025-05-05 11:17:29 +05:00
Alex Ant 8b4889ce83 Функционал миграций по версиям с интеграцией блокчейна и двух баз данных 2025-05-04 14:17:27 +05:00
Alex Ant 7ccaa0390d chore(release): publish 2025-05-04 12:42:52 +05:00
Alex Ant 5f0ed73d0d fix workflow #2 2025-05-04 12:42:23 +05:00
Alex Ant 54518b63d0 update publish workflow 2025-05-04 12:39:52 +05:00
Alex Ant 1c38f2e5fd update version 2025-05-04 12:37:53 +05:00
Alex Ant 7ba12707e1 chore(release): publish 2025-05-04 12:32:16 +05:00
Alex Ant 01992b26f4 fix workflows 2025-05-04 12:26:07 +05:00
Alex Ant 8670ba08d5 chore(release): publish 2025-05-04 12:08:16 +05:00
Alex Ant 67698757cf publish workflow 2025-05-04 12:07:22 +05:00
Alex Ant 833ef3f5d3 Обновление структуры signature_info: добавлен идентификатор подписи. Исправлено условие фильтрации истекших решений в ChairmanPlugin. 2025-05-04 11:40:00 +05:00
Alex Ant b104f14899 create document2 format 2025-05-04 11:02:25 +05:00
Alex Ant 60c86b1db8 chore(release): publish 2025-05-03 16:19:40 +05:00
Alex Ant b6d2965962 Дефолтные конфиги для расширений, фиксы визуалов, микросервис отмены вопроса с повестки 2025-05-03 15:56:08 +05:00
Alex Ant 1548552af3 chore(release): publish 2025-05-02 10:40:41 +05:00
Alex Ant 002cf8025b update 2025-05-01 22:51:07 +05:00
Alex Ant dfd7e4b62c update 2025-05-01 22:46:58 +05:00
Alex Ant e54380cd81 update 2025-05-01 22:29:40 +05:00
Alex Ant 09b3532793 update 2025-05-01 22:28:01 +05:00
Alex Ant b36e288958 update 2025-05-01 22:23:56 +05:00
Alex Ant bcd3c2739a update 2025-05-01 22:21:00 +05:00
Alex Ant 695e653461 update 2025-05-01 22:17:07 +05:00
Alex Ant b068ff810c update 2025-05-01 22:13:38 +05:00
Alex Ant 1a57f7a047 update lock-file 2025-05-01 21:57:50 +05:00
Alex Ant 90f955e48e update 2025-05-01 21:54:59 +05:00
Alex Ant 14fbce5a6b docs #2 2025-05-01 21:52:49 +05:00
Alex Ant 5cff407379 docs 2025-05-01 21:50:39 +05:00
Alex Ant 79b7ff21f5 Удалены отладочные логи из функций входа и выхода пользователя, а также обновлен способ проверки переменных окружения в функции работы с IndexedDB. 2025-05-01 18:23:56 +05:00
Alex Ant 65996a40e9 update 2025-05-01 16:46:36 +05:00
Alex Ant cf3566255a Добавлены отладочные логи в функции входа и выхода пользователя, а также обновлен способ загрузки переменных окружения в конфигурации Quasar для режима разработки. 2025-05-01 16:00:45 +05:00
Alex Ant 582c6fa36d Удалены отладочные логи из функции получения переменных окружения и обновлен middleware для инъекции переменных окружения в браузер с использованием ssrMiddleware. 2025-05-01 14:33:41 +05:00
Alex Ant aefba8b4df update 2025-05-01 13:42:00 +05:00
Alex Ant e43674fd29 Изменен способ определения переменных окружения в конфигурации Quasar: теперь они устанавливаются только для клиентской стороны, если режим не SSR. 2025-05-01 13:27:05 +05:00
Alex Ant 3856826e4d update 2025-05-01 11:34:33 +05:00
Alex Ant 00ed0b7691 update 2025-05-01 11:22:00 +05:00
Alex Ant aa456f6cff update 2025-05-01 11:12:30 +05:00
Alex Ant 3a9dfa643e update 2025-05-01 11:01:19 +05:00
Alex Ant 28580114da update 2025-05-01 10:31:01 +05:00
Alex Ant 8d47f118dd update 2025-05-01 10:29:53 +05:00
Alex Ant d7b45157ff update 2025-05-01 10:27:41 +05:00
Alex Ant db8a48284f update 2025-05-01 10:24:33 +05:00
Alex Ant b00b8d6ca3 update 2025-05-01 09:59:02 +05:00
Alex Ant 22b3d8f691 update 2025-05-01 09:51:43 +05:00
Alex Ant 432c1cd476 update 2025-05-01 09:41:37 +05:00
Alex Ant ed8e4a059a Обновление Dockerfile: замена команды установки зависимостей на принудительную, улучшение структуры образа. Изменение конфигурации GitHub Actions для отключения кеширования и упрощения сборки образов. 2025-05-01 09:36:57 +05:00
Alex Ant 571c1e31ac Оптимизация Dockerfile: добавление этапа сборки для зависимостей, упрощение копирования файлов и улучшение структуры образа. Обновление конфигурации GitHub Actions для сборки и публикации образов с использованием Docker Buildx. 2025-04-30 21:49:16 +05:00
Alex Ant b294d0eea0 Добавление шагов для отладки в GitHub Actions: вывод последних коммитов, текущей ветки и содержимого компонентов. Обновление комментариев и улучшение сборки образов без кеша. 2025-04-30 21:32:51 +05:00
Alex Ant 0b50fbc55d update 2025-04-30 21:29:50 +05:00
Alex Ant f5d5534290 update 2025-04-30 20:54:13 +05:00
Alex Ant 777eb7e398 Добавление middleware для инъекции переменных окружения в window.__ENV__ и рефакторинг функции получения переменных окружения с учетом различных сред (SSR, SPA). Теперь переменные окружения экспортируются через единую функцию getEnv(). 2025-04-30 20:53:02 +05:00
Alex Ant 9b1be55a9e Обновление конфигурации проекта: замена использования переменных окружения на новый модуль env, упрощение Dockerfile, улучшение сборки контейнеров и исправление мелких ошибок в компонентах. 2025-04-30 20:30:42 +05:00
Alex Ant ef4a7d1fa1 update 2025-04-30 18:37:23 +05:00
Alex Ant e6a7380aa5 update 2025-04-30 18:00:07 +05:00
Alex Ant 2f41591339 update 2025-04-30 17:47:08 +05:00
Alex Ant 8916ef0207 update 2025-04-30 17:45:28 +05:00
Alex Ant c3288f765e update 2025-04-30 17:35:42 +05:00
Alex Ant 11d631bee3 update 2025-04-30 17:33:58 +05:00
Alex Ant e3be78edb0 update 2025-04-30 17:29:37 +05:00
Alex Ant 59f01a8426 update 2025-04-30 17:17:55 +05:00
Alex Ant 76b7c8ef3b update 2025-04-30 17:05:31 +05:00
Alex Ant fbaae9ce76 update 2025-04-30 16:53:55 +05:00
Alex Ant e70b58a3df print env 2025-04-30 16:47:47 +05:00
Alex Ant ec551c9de8 VITE_ prefix 2025-04-30 16:39:33 +05:00
Alex Ant 7a8cb5835a правки SSR проблема рендиринга 2025-04-30 15:55:07 +05:00
Alex Ant 3b8ccf173b modify quasar conf 2025-04-30 12:49:12 +05:00
Alex Ant 172ce29665 update 2025-04-30 11:32:47 +05:00
Alex Ant e7d8a8d2c0 хук на деплой 2025-04-30 10:29:59 +05:00
Alex Ant cc7b43f4ba Добавление сборки и публикации нового Docker-образа для приложения @coopenomics/desktop в workflow. Обновление конфигурации сборки контейнеров. 2025-04-29 23:23:13 +05:00
Alex Ant 71425977f5 Обновление Dockerfile для упрощения сборки с использованием lerna. Добавление новых прокси-файлов для модулей @dicebear/core, @dicebear/collection и email-regex. Обновление зависимостей в package.json и pnpm-lock.yaml. Изменение конфигурации Quasar для оптимизации работы с новыми модулями. 2025-04-29 23:21:10 +05:00
Alex Ant 4549727d0b update workflow 2025-04-29 21:49:48 +05:00
Alex Ant e030d97059 workflow initialization 2025-04-29 21:40:51 +05:00
Alex Ant 13c1ca4f79 Merge branch 'main' into dev 2025-04-29 16:32:03 +05:00
Alex Ant 637d7c0db1 chore(release): publish 2025-04-29 16:27:09 +05:00
Alex Ant 7513a4b6d6 Merge branch 'testnet' 2025-04-29 16:21:40 +05:00
Alex Ant 76100ef07d update script 2025-04-29 16:21:22 +05:00
Alex Ant ab139209db update templates 2025-04-29 16:17:58 +05:00
Alex Ant c6a31baaab Добавление нового поля 'type' в сущность Payment и соответствующие изменения в DTO, схемах и селекторах. Обновление логики обновления статусов платежей с учетом нового поля. Исправление параметров в методах для получения заказов. 2025-04-29 13:36:04 +05:00
Alex Ant 7c9d4629b6 Добавление нового поля 'coop' в интерфейс Model и обновление схемы валидации для SelectBranchStatement. Обновление логики комбинирования данных в классе Factory для включения данных о кооперативе. Комментарии в стилях инпутов переведены в закомментированный вид. 2025-04-29 12:25:08 +05:00
Alex Ant 986858c20d Обновление скриптов публикации и логики миграции. Изменены команды для публикации на продакшн, добавлен новый скрипт publish-prod.sh. Обновлена логика удаления кандидатов в функции миграции и исправлены ссылки на индексы кандидатов в confirmreg.cpp. 2025-04-29 11:05:03 +05:00
Alex Ant a0551095dc lerna update 2025-04-29 10:16:02 +05:00
Alex Ant d0804c886a disable meet for temp 2025-04-29 10:11:14 +05:00
Alex Ant 1befca7e28 Добавление новых скриптов для развертывания и обновление интерфейсов для обработки голосования на общем собрании. Обновлены типы данных в интерфейсах и DTO, добавлены новые методы для генерации документов и улучшения функционала. Удалены устаревшие интерфейсы и компоненты, улучшена структура кода для повышения эффективности. 2025-04-28 23:55:55 +05:00
Alex Ant 3d4482157a Удаление устаревших интерфейсов и таблиц, связанных с кошельками. Обновление логики обработки платежей и интерфейсов для работы с новыми типами данных. Улучшение структуры компонентов и интерфейсов для более эффективного взаимодействия с API. Обновление стилей и компонентов пользовательского интерфейса для улучшения визуального восприятия. 2025-04-26 17:14:22 +05:00
Alex Ant 3cd71f1cd4 Обновление интерфейсов и DTO для работы с документами и собраниями. Добавлены новые поля и типы данных, улучшена обработка документов в сервисах. Удалены устаревшие селекторы и обновлены существующие для соответствия новым требованиям. Исправлены типы данных в селекторах и добавлены новые экспорты. 2025-04-25 23:44:32 +05:00
Alex Ant eebf443c1d Сейчас будем переводить сервис документов на агрегатор. Обновление интерфейсов и DTO для обработки документов. Изменены типы полей в интерфейсах DocumentPackageDomainInterface, DocumentRepository и DocumentDomainService для поддержки значений null. Добавлены проверки на наличие данных в DocumentDomainEntity и улучшена обработка документов в DocumentDomainService. Обновлены методы для работы с документами в API и хранилище. 2025-04-23 19:03:18 +05:00
Alex Ant 7aaf0b9375 Первичная мобильная верстка страниц стола совета 2025-04-23 12:39:23 +05:00
Alex Ant 5ff9675e60 Обновление конфигурации и добавление тестового режима для собраний. Изменен порт для state-history-endpoint, добавлен флаг TEST_MODE в контракте meet, обновлены проверки дат открытия и закрытия собраний. Обновлены интерфейсы и DTO для обработки новых типов данных и улучшения функционала. 2025-04-22 23:23:09 +05:00
Alex Ant 646390edff Добавление функционала для генерации бюллетеней голосования на общем собрании. Обновлены интерфейсы и DTO для обработки новых типов документов, добавлены методы для генерации бюллетеней и голосования. Исправлены типы данных для идентификаторов вопросов повестки. 2025-04-21 20:29:12 +05:00
Alex Ant b1958c5442 Добавление новых методов для подписания решений председателем и секретарем на общем собрании. Удален метод закрытия собрания, обновлены интерфейсы и DTO для обработки новых типов документов и действий. 2025-04-21 16:44:27 +05:00
Alex Ant 01b9590e81 Добавление новых типов и методов для работы с собраниями в модуле общих собраний. Реализованы методы получения данных о собраниях, обновлены интерфейсы и DTO для обработки информации о голосованиях и документах собраний. 2025-04-20 16:41:20 +05:00
Alex Ant 985a288bf3 Добавление новых входных типов и методов для получения данных о собраниях в модуле общих собраний. Реализованы методы getMeet и getMeets, а также обновлены интерфейсы и DTO для обработки данных. 2025-04-20 12:56:42 +05:00
Alex Ant 01dcfb88e7 Обновление документации и DTO для модуля общих собраний. Добавлены описания для полей в DTO, улучшена структура и добавлены новые типы данных для обработки информации о собраниях и голосованиях. 2025-04-20 11:59:29 +05:00
Alex Ant 76415a8dec Добавление модуля общих собраний и расширение DTO для документов, включая новые интерфейсы и классы для обработки документов собраний и решений. 2025-04-20 11:39:27 +05:00
Alex Ant 586b7c14f8 meet module & extends all documents DTOs 2025-04-18 15:27:35 +05:00
Alex Ant 0ee4bf2b25 update release script 2025-04-16 22:03:36 +05:00
Alex Ant 5673e8abe8 update releases script 2025-04-16 22:02:08 +05:00
Alex Ant c446e32a8a generate changelog releases 2025-04-16 21:42:37 +05:00
Alex Ant eee9392fb4 make Templates correct 2025-04-16 20:08:50 +05:00
Alex Ant 82a3961608 move templates #1 2025-04-16 20:08:24 +05:00
Alex Ant f8689fc409 wtf?! 2025-04-16 20:06:49 +05:00
Alex Ant 7de93e1780 add meet contract, cooptypes and empty documents templates 2025-04-16 19:58:49 +05:00
Alex Ant 19e742b7d1 desktop bug fixs 2025-04-15 15:57:55 +05:00
Alex Ant e3f0250fd2 remove Env.ts file from desktop and move params to .env 2025-04-15 12:27:29 +05:00
Alex Ant e4b39b89f3 fix system contract action name 2025-04-15 10:27:53 +05:00
Alex Ant d2888b49e8 fix contracts build 2025-04-15 10:14:07 +05:00
Alex Ant b97ed49a60 coopStore release 2025-04-11 18:29:07 +05:00
Alex Ant 65936dc85b refactoring desktop 2025-04-10 11:40:14 +05:00
Alex Ant b1d02ee302 claim -> result, result -> assignment 2025-04-06 12:56:55 +05:00
Alex Ant cca47abb9c before make refactoring 2025-04-06 11:25:29 +05:00
Alex Ant c810ba62b4 shared actions 2025-04-05 11:36:06 +05:00
Alex Ant dcce7ffacc loan contract 2025-04-03 18:52:53 +05:00
Alex Ant e9fb137146 contracts refactoring 2025-04-03 09:36:48 +05:00
Alex Ant 7100c9c300 appStore & medusa component & capital contract (start rework) 2025-03-28 18:42:28 +05:00
Alex Ant e9b5496387 refactoring participant widget to page 2025-03-27 19:14:02 +05:00
Alex Ant 87ecde390d chore(release): publish 2025-03-27 18:13:33 +05:00
Alex Ant 8b33c66e22 update mutation simplification 2025-03-27 17:30:31 +05:00
Alex Ant b3bbb6624e make participants editable 2025-03-27 14:32:23 +05:00
Alex Ant 2ddac45612 change decision dto and logout on some auth problems 2025-03-26 22:18:12 +05:00
Alex Ant ddd7d47516 Merge pull request #201 from coopenomics/kamilocean/sprint-4
Kamilocean/sprint 4
2025-03-26 20:09:37 +03:00
Alex Ant a770072809 README.md for cleos wallet 2025-03-26 18:27:05 +05:00
Alex Ant 5b38ce0b37 make cleos separated component 2025-03-26 18:19:52 +05:00
Alex Ant 804708076a make cleos wallet accessable 2025-03-26 13:08:04 +05:00
Alex Ant a0ad71a524 make unnesassary result 2025-03-26 11:42:05 +05:00
Alex Ant 9d03694ea7 some updates on contracts and tests 2025-03-22 13:58:51 +05:00
Alex Ant 7a619e0e9e update 2025-03-21 17:58:33 +05:00
Alex Ant 6bd5eb7930 Merge branch 'dev' into TSK-900 2025-03-19 10:58:53 +05:00
Alex Ant 744d1859d5 Создание кошелька при регистрации участника 2025-03-19 10:58:20 +05:00
Alex Ant 8033e3fc8e update 2025-03-18 21:04:12 +05:00
Alex Ant abb0b629f3 TSK-900 capital contract - fund by membership contributions and distribution it 2025-03-18 11:50:07 +05:00
kamilocean 34a61f49f6 Merge branch 'dev' into kamilocean/sprint-4 2025-03-17 16:07:50 +03:00
kamilocean 08c31171a0 WIP: fix EditableActions instead of ActionButton 2025-03-17 16:07:28 +03:00
Ilia Smirnov 40addbf595 Merged readme fixes 2025-03-17 12:52:02 +03:00
Ilia Smirnov abd6da0a37 Merge branch 'dev' of github.com:coopenomics/mono into TSK-878 2025-03-17 12:49:40 +03:00
Alex Ant 794d1c5019 Merge pull request #217 from coopenomics/dacom-dark-sun/sprint-4
Спринт-4 | dacom-dark-sun
2025-03-17 09:57:34 +03:00
Alex Ant b8d048bf3c README.md 2025-03-17 11:55:18 +05:00
Ilia Smirnov bb7b650ebc docs(install): updated installation instructions 2025-03-17 09:44:10 +03:00
kamilocean 5253de9279 WIP: add EditableOrganizationCard 2025-03-16 21:04:40 +03:00
Alex Ant 094945e350 make it works 2025-03-14 13:20:41 +05:00
kamilocean eb6b58e6db Merge branch 'dev' into kamilocean/sprint-4 2025-03-13 23:54:25 +03:00
kamilocean 7bcb6e30a7 fix: add Zeus type 2025-03-13 23:54:02 +03:00
Alex Ant 7ed4024555 run container on boot 2025-03-13 22:58:46 +05:00
Alex Ant 6fa45c5958 bug fix 2025-03-13 22:39:41 +05:00
Alex Ant a883f140d4 clear database on reboot 2025-03-13 21:04:21 +05:00
Alex Ant 1bec52efcb bug fix #2 2025-03-13 20:50:42 +05:00
Alex Ant 674e58ec3f fix bug 2025-03-13 20:46:53 +05:00
Alex Ant 373d705387 update nodemon for notificator 2025-03-13 20:33:56 +05:00
Alex Ant 46fb693020 add clear method 2025-03-13 20:10:47 +05:00
Alex Ant f1fe7d1545 make boot better 2025-03-13 19:57:35 +05:00
kamilocean 44ab386835 WIP: EditableAccountCard 2025-03-13 00:30:00 +03:00
Alex Ant 51d736eba4 chore(release): publish 2025-03-12 11:33:00 +05:00
Alex Ant dcc4f6bd03 fix packages 2025-03-12 10:31:41 +05:00
Alex Ant eef2482423 README.md and some setup fixs 2025-03-12 10:24:48 +05:00
Alex Ant f46a1fb9b5 ascii text fix 2025-03-12 09:51:52 +05:00
Alex Ant bae45af414 contracts path change 2025-03-12 09:33:47 +05:00
Alex Ant aff3835f50 fix data paths 2025-03-12 09:26:43 +05:00
Alex Ant 5f249f6032 add lossed lib dir 2025-03-12 09:03:45 +05:00
Alex Ant a185d7e9e8 fix build 2025-03-11 23:34:27 +05:00
Alex Ant 3449caf0e2 fix build 2025-03-11 23:15:03 +05:00
Alex Ant cc458cc916 fix some files 2025-03-11 22:59:52 +05:00
Alex Ant 2b6b56ace9 move contracts inside and make common setup script 2025-03-11 22:57:08 +05:00
Alex Ant 4d72c920c6 capital cooptypes 2025-03-11 19:57:49 +05:00
Alex Ant b0186a1baa add Env-testnet.ts 2025-03-06 13:53:31 +05:00
Alex Ant bc3836b316 docker-compose for infra 2025-03-06 11:34:04 +05:00
Alex Ant 0a444efe55 sosediAgreement and docker-compose-infra.yaml 2025-03-06 11:22:43 +05:00
Alex Ant fba3988834 env controller 2025-03-05 21:55:40 +05:00
Alex Ant b99e1abb03 update package 2025-03-05 21:54:10 +05:00
Alex Ant ab44237bb9 update cooptypes 2025-03-05 17:33:48 +05:00
Alex Ant 6d98dc073f add capital contract 2025-03-04 20:23:36 +05:00
Alex Ant 9709ef4333 investment templates 2025-02-25 20:35:03 +05:00
Alex Ant cb60f6f735 update test structure 2025-02-22 15:43:00 +05:00
Alex Ant 5d0ab2e2db fix 2025-02-13 10:14:32 +05:00
Alex Ant 4e3b0b52c8 branch bug fix 2025-02-13 10:08:46 +05:00
Alex Ant 973590281c chore(release): publish 2025-02-10 14:58:11 +05:00
Alex Ant 4f7defb85c update 2025-02-10 14:56:44 +05:00
Alex Ant 59f4d8dc26 delete onewallet structure 2025-02-10 14:44:03 +05:00
Alex Ant be736e105a wallet fast fix 2025-02-10 13:39:31 +05:00
Alex Ant 3be56ba462 chore(release): publish 2025-02-07 19:35:06 +05:00
Alex Ant f7adf8457b Dockerfile fix 2025-02-07 19:25:01 +05:00
Alex Ant 80b8856f15 fix 2025-02-07 18:48:44 +05:00
Alex Ant 0860f47d88 capital sdk mutations 2025-02-07 18:39:39 +05:00
Alex Ant 382b75fccf cooplace 2025-01-30 19:25:35 +05:00
Alex Ant d3dacbd32d add production cooperative to the list 2025-01-28 23:08:02 +05:00
Alex Ant 6c51e4b596 fix selectBranch bug and add IP for entrepreneur user 2025-01-28 16:27:22 +05:00
Alex Ant d0bd4428be chore(release): publish 2025-01-27 11:08:26 +05:00
Alex Ant 43ffcb7362 update 2025-01-27 10:54:50 +05:00
Alex Ant ca5dfca290 update table style on documents 2025-01-27 10:29:08 +05:00
Alex Ant 8a495eff37 add new templates for documents and fix QR-pay interface 2025-01-27 10:07:52 +05:00
Alex Ant bee6af12fb get COOPBACK const from system.info everywhere 2025-01-23 18:52:33 +05:00
Alex Ant 4a3dfc3eb7 update 2025-01-22 17:49:33 +05:00
Alex Ant 4e87a4adc4 fix init process 2025-01-22 16:08:24 +05:00
Alex Ant d9bb9d5884 update system info 2025-01-22 12:23:34 +05:00
Alex Ant 562be0cb89 update 2025-01-21 17:51:03 +05:00
Alex Ant 2fdc86af97 chore(release): publish 2025-01-19 18:52:27 +05:00
Alex Ant 220d1225b2 update 2025-01-19 17:04:34 +05:00
Alex Ant e047a6e449 remove username input on getAccounts & remove deleteAccount mutation on SDK 2025-01-19 16:34:54 +05:00
Alex Ant 97b21a9d69 chore(release): publish 2025-01-18 16:15:43 +05:00
Alex Ant 9be9570dea document and blockchain classes on SDK, move sign documents on signup to use SDK 2025-01-18 16:11:32 +05:00
Alex Ant cbfe37dbba chore(release): publish 2025-01-17 13:52:58 +05:00
Alex Ant bf176a2c05 fix connection button only for voskhod coops 2025-01-17 13:50:36 +05:00
Alex Ant 173c51eb26 connection button for coops on desktop 2025-01-17 13:46:47 +05:00
Alex Ant 71dbb090fb memberButton for access to coop settings 2025-01-17 13:02:40 +05:00
Alex Ant 832133e6cc Canvas SDK class 2025-01-17 12:57:46 +05:00
Alex Ant 2730a92b01 update 2025-01-16 19:54:20 +05:00
Alex Ant 40fb5c80eb update 2025-01-16 19:45:35 +05:00
Alex Ant 6c65095961 add account class 2025-01-16 17:46:08 +05:00
Alex Ant d02f7ae7bc rollback 2025-01-16 12:40:17 +05:00
Alex Ant 9f0b4b24ba update SDK 2025-01-16 12:34:04 +05:00
Alex Ant 237357c1d5 canvas class and update types on dto 2025-01-16 12:30:57 +05:00
Alex Ant aefb1caf57 update 2025-01-16 12:17:00 +05:00
Alex Ant a3328e7ef0 move to sdk login 2025-01-16 12:09:04 +05:00
Alex Ant db24588273 fix paymentMethods orders 2025-01-15 13:47:58 +05:00
Alex Ant 2cabeeb6bd temp fix order id bug 2025-01-15 10:52:02 +05:00
Alex Ant 88352202b0 update 2025-01-14 21:50:45 +05:00
Alex Ant e02d8a949b update 2025-01-14 20:40:26 +05:00
Alex Ant e7e5457cf2 uppdate 2025-01-14 20:39:39 +05:00
Alex Ant 29b98b0f7d add login method to SDK 2025-01-14 20:32:49 +05:00
Alex Ant ae7378f474 update 2025-01-14 18:07:31 +05:00
Alex Ant b05c17bee4 chore(release): publish 2025-01-14 17:50:44 +05:00
Alex Ant a2d3dac226 chore(release): publish 2025-01-14 17:41:40 +05:00
Alex Ant a8ec41e255 fix 2025-01-14 13:48:53 +05:00
Alex Ant 1d16062961 renaming and sdk 2025-01-14 13:45:45 +05:00
Alex Ant 2a614e8656 move to sdk #1 2025-01-14 12:32:58 +05:00
Alex Ant baaaaf01bf sdk-client docs 2025-01-10 10:35:54 +05:00
Alex Ant 20f1fc51b1 hard payment migration 2025-01-01 21:07:59 +05:00
Alex Ant d749ebf981 add a lot of queries and mutations 2025-01-01 12:06:41 +05:00
Alex Ant 04364c503c chore(release): publish 2024-12-24 23:43:08 +05:00
Alex Ant ae2a040fe4 free decision 2024-12-24 22:45:50 +05:00
Alex Ant 0debf23b5e move to a documented ql-client 2024-12-23 13:45:49 +05:00
Alex Ant 55e7849b43 visual fixs 2024-12-21 18:37:31 +05:00
Alex Ant 34d9a73677 Merge branch 'dev' into testnet 2024-12-20 21:04:35 +05:00
Alex Ant 0b9ccf5bc0 update 2024-12-20 21:04:07 +05:00
Alex Ant 48e72bb9df update 2024-12-20 21:03:36 +05:00
Alex Ant 35aed44bcb update card and add selectors for generate free decision and selectBranch documents 2024-12-20 21:02:19 +05:00
Alex Ant e4cf693c0d Merge branch 'testnet' 2024-12-20 16:47:35 +05:00
Alex Ant f0755f5f90 update 2024-12-20 16:47:29 +05:00
Alex Ant bdfc6af688 selectors update coopjs 2024-12-20 16:26:26 +05:00
Alex Ant 31b4061a43 resolver of free decision 2024-12-20 14:44:20 +05:00
Alex Ant a1b80f0323 drafts migration complete 2024-12-18 13:36:52 +05:00
Alex Ant 1678686ce7 freeDecision and projectFreeDecision document templates 2024-12-18 13:29:10 +05:00
Alex Ant c25d05196d generate selectBranch document throw graphql 2024-12-16 20:16:44 +05:00
Alex Ant bdddc7ad03 selectBranch for added members 2024-12-14 21:09:13 +05:00
Alex Ant 1d1ad4f9fa branches 2024-12-11 21:01:22 +05:00
Alex Ant 099fcc7981 update! 2024-12-05 19:00:58 +05:00
Alex Ant 2ef44e45f6 from 2024-12-03 20:19:36 +05:00
Alex Ant ebe62d0498 migrate 2024-12-03 19:11:46 +05:00
Alex Ant 6472b20ea4 branches auto enable 2024-12-03 14:00:11 +05:00
Alex Ant 69cdb2d754 enable / disable branches 2024-12-02 16:11:05 +05:00
Alex Ant f7d8000b48 coopjs mutations and queries for branches 2024-11-29 21:10:54 +05:00
Alex Ant a44afbe1b9 make branches happen #1 2024-11-19 22:19:26 +05:00
Alex Ant 662da1b8a9 update 2024-11-15 16:24:39 +05:00
Alex Ant 2a3d743204 router refactoring 2024-11-14 20:30:39 +05:00
Alex Ant 7241ee4c7a pre-release 2024-11-14 20:08:56 +05:00
Alex Ant 5c084d6e8b add reflect-metadata 2024-11-10 20:03:16 +05:00
Alex Ant 1060c7fdfc package fix 2024-11-10 19:53:15 +05:00
Alex Ant b5d6c0e0b3 fix bug on parser with return function 2024-11-10 17:42:59 +05:00
Alex Ant d69644350e integration coopjs & terminal 2024-11-10 17:33:29 +05:00
Alex Ant 8634622a6a coopjs 0.01 2024-11-09 21:24:29 +05:00
Alex Ant cc73554350 graphql & apollo server & guards & documentator prototype 2024-11-07 21:06:17 +05:00
Alex Ant 8adf93d592 graphql implementation 2024-11-07 19:42:17 +05:00
Alex Ant 6bd60ddf96 extensions #3 2024-11-07 12:43:33 +05:00
Alex Ant ea5bcbe4dd extensions #2 2024-11-07 10:38:36 +05:00
Alex Ant 541b49069d nestjs & postgres migration #1 2024-11-06 10:54:38 +05:00
Alex Ant ba868866ec postgres initialization 2024-11-04 12:48:58 +05:00
Alex Ant 606ae48f13 update 2024-11-04 11:54:33 +05:00
Alex Ant 09c5445f83 nestjs but fix 2024-11-04 11:46:26 +05:00
Alex Ant 4a0a18a7b0 nestjs integration 2024-11-03 20:18:40 +05:00
Alex Ant ed9d1ab738 test 2024-11-03 14:25:08 +05:00
Alex Ant a61e8084dd fix 2024-11-03 14:13:39 +05:00
Alex Ant e169380178 make settings visible only for logged in 2024-11-03 14:09:15 +05:00
Alex Ant b07d4ef6c3 fix cooperative settings for everone 2024-11-03 13:49:39 +05:00
Alex Ant 4c713c7652 make common header layout and better settings menu 2024-11-03 13:22:24 +05:00
Alex Ant 90e8c6b3c4 chore(release): publish 2024-10-30 19:49:43 +05:00
Alex Ant 07bf05cb2c normal plugin model with some payment plugins 2024-10-30 19:42:48 +05:00
Alex Ant 49d29902a8 update 2024-10-29 23:42:49 +05:00
Alex Ant 32a90c2a9e controller-next initialization 2024-10-29 23:42:14 +05:00
Alex Ant 16ed2c1517 support 2024-10-29 11:50:49 +05:00
Alex Ant 8bb0f1c799 chore(release): publish 2024-10-28 21:49:21 +05:00
Alex Ant f14fe2dd64 update cardcoop 2024-10-28 20:45:08 +05:00
Alex Ant 884f0ee0de changeAuthorizedHome 2024-10-28 19:47:55 +05:00
Alex Ant 744270f48c update 2024-10-28 19:42:04 +05:00
Alex Ant c30849be3c cardcoop on a main screen 2024-10-28 19:06:15 +05:00
Alex Ant f295ac8b4d separated settings page 2024-10-28 17:56:40 +05:00
Alex Ant 9469a8f43d update 2024-10-28 14:18:07 +05:00
Alex Ant 786799ca40 update 2024-10-28 14:16:53 +05:00
Alex Ant aa6238cf5a fix 2024-10-28 13:38:54 +05:00
Alex Ant 1ed31ee2e2 update 2024-10-28 13:26:42 +05:00
Alex Ant 7d8c12977c generateOptions for Documents 2024-10-28 13:15:07 +05:00
Alex Ant 81ee1d63a6 Merge branch 'main' into dev 2024-10-28 11:59:00 +05:00
Alex Ant cf1c1b3198 chore(release): publish 2024-10-28 11:55:43 +05:00
Alex Ant bc7b1e8472 update 2024-10-28 11:55:02 +05:00
Alex Ant 7319c41cc1 chore(release): publish 2024-10-28 11:51:09 +05:00
Alex Ant 2f09fc32c0 finish bugfix 2024-10-28 11:50:41 +05:00
Alex Ant f85b3f54a1 chore(release): publish 2024-10-28 10:49:06 +05:00
Alex Ant 1a68669d6d update Dockerfile 2024-10-28 10:48:04 +05:00
Alex Ant 6345c2d414 chore(release): publish 2024-10-28 10:16:08 +05:00
Alex Ant 87930cad75 update 2024-10-28 10:14:41 +05:00
Alex Ant 3ab2232121 Dockerfile 2024-10-28 10:06:40 +05:00
Alex Ant 9719e25421 move to weasyprint 2024-10-28 10:03:29 +05:00
Alex Ant 8e1f998c39 try to fix it ! 2024-10-27 20:34:08 +05:00
Alex Ant deb1c224f8 update 2024-10-27 19:33:06 +05:00
Alex Ant b2fa79898a arial embded font 2024-10-27 17:56:49 +05:00
Alex Ant da2759a3c6 update 2024-10-27 15:29:12 +05:00
Alex Ant f6bc696426 add common Arial font 2024-10-27 15:09:17 +05:00
Alex Ant da653e9b32 looking for bug #2 2024-10-27 12:46:47 +05:00
Alex Ant 227e153bde looking for bug 2024-10-27 12:03:18 +05:00
Alex Ant 12f906b9b0 update 2024-10-26 21:09:25 +05:00
Alex Ant c8236d4d10 update 2024-10-26 21:01:26 +05:00
Alex Ant e2006da50d TSK-289 Устранить избыточное сохранение документа при регенерации (1) 2024-10-26 20:20:05 +05:00
Alex Ant 433a7d3641 chore(release): publish 2024-10-26 17:45:45 +05:00
Alex Ant 6b41c74b43 regenerate document button, some bugs and fixs 2024-10-26 17:38:12 +05:00
Alex Ant cc3e7ff7c6 fix bug auto powerup on every restart 2024-10-26 13:42:11 +05:00
Alex Ant a35a6bf642 separate init payment factory 2024-10-26 13:10:52 +05:00
Alex Ant 9ecd523646 fix double subscriber bug 2024-10-26 12:52:24 +05:00
Alex Ant e7f896c38e update notification template 2024-10-26 10:49:28 +05:00
Alex Ant 624ec743b1 fix bug loading button 2024-10-25 19:26:41 +05:00
Alex Ant 553c5745ef fix update soviet bug 2024-10-25 16:46:26 +05:00
Alex Ant 3f2779ca3d fix bug voskhod everywhere 2024-10-25 16:42:18 +05:00
Alex Ant e51b962627 databazor bug fix 2024-10-25 16:20:58 +05:00
Alex Ant f709e135b6 Merge branch 'testnet' 2024-10-25 11:10:33 +05:00
Alex Ant 50b48aa247 update 2024-10-24 11:44:05 +05:00
Alex Ant 508f2abc82 update 2024-10-24 11:37:39 +05:00
Alex Ant 42ec56e578 fix 2024-10-24 11:26:07 +05:00
Alex Ant 92673dac6e chore(release): publish 2024-10-23 21:21:41 +05:00
Alex Ant daf57aba35 fix 2024-10-23 21:21:00 +05:00
Alex Ant dee629c429 chore(release): publish 2024-10-23 21:16:50 +05:00
Alex Ant 67f9092350 fix lib 2024-10-23 21:15:52 +05:00
Alex Ant 88691d47a5 chore(release): publish 2024-10-23 21:02:47 +05:00
Alex Ant 0fdd9bc803 update 2024-10-23 21:02:25 +05:00
Alex Ant 8452c607b4 chore(release): publish 2024-10-23 20:57:27 +05:00
Alex Ant 4fc57c2d57 update 2024-10-23 20:56:58 +05:00
Alex Ant 9f0b707a30 chore(release): publish 2024-10-23 20:51:30 +05:00
Alex Ant 511bc351d5 publish 2024-10-23 20:49:38 +05:00
Alex Ant 56ee3e962c chore(release): publish 2024-10-23 20:42:13 +05:00
Alex Ant 2781e8519d fix 2024-10-23 20:40:34 +05:00
Alex Ant 46575348fe chore(release): publish 2024-10-23 20:24:23 +05:00
Alex Ant bae2ca646b publish again 2024-10-23 20:24:00 +05:00
Alex Ant 0686c6ab00 chore(release): publish 2024-10-23 20:20:51 +05:00
Alex Ant db04b66ce5 update 2024-10-23 20:20:25 +05:00
Alex Ant c43c8a29af chore(release): publish 2024-10-23 20:17:40 +05:00
Alex Ant aaea18abe1 publish 2024-10-23 20:16:35 +05:00
Alex Ant 0b6076cb61 chore(release): publish 2024-10-23 20:10:05 +05:00
Alex Ant 3b6d02f02c fix 2024-10-23 20:08:45 +05:00
Alex Ant 625a0586a3 public 2024-10-23 20:06:22 +05:00
Alex Ant 10d63ca586 powerup is private plugin 2024-10-23 20:06:01 +05:00
Alex Ant d2697bf9de make library from terminal 2024-10-23 20:04:34 +05:00
Alex Ant fa8c8843e2 make powerup private plugin 2024-10-19 22:07:20 +05:00
Alex Ant 7b59ea4b96 chore(release): publish 2024-10-19 22:03:06 +05:00
Alex Ant 058215934e Merge branch 'testnet' 2024-10-19 22:02:08 +05:00
Alex Ant 1d724d841f plugin factory and powerup plugin 2024-10-19 21:58:34 +05:00
Alex Ant 32db2100de implementation plugins worker system 2024-10-18 11:27:39 +05:00
Alex Ant 095c77b65b chore(release): publish 2024-10-17 16:20:02 +05:00
Alex Ant c1c07bff8f plugin factory and powerup plugin sketch 2024-10-17 16:18:39 +05:00
Alex Ant 1206bd0e98 fix voskhod everywhere bug 2024-10-17 13:22:35 +05:00
Alex Ant 67bcd1b307 update text on install 2024-10-17 10:52:06 +05:00
Alex Ant 31ef70e433 health check 2024-10-16 13:56:37 +05:00
Alex Ant afb12961d2 fix launch errors 2024-10-16 13:38:08 +05:00
Alex Ant 3dbd40e334 bug fix soviet update 2024-10-16 11:10:18 +05:00
Alex Ant bc5d6e38c8 console.error(e 2024-10-15 23:37:27 +05:00
Alex Ant 5a39143051 openReplay connection 2024-10-14 21:24:45 +05:00
Alex Ant 18e9571877 fix css bug 2024-10-13 16:52:55 +05:00
Alex Ant a828f4c831 chore(release): publish 2024-10-13 16:26:37 +05:00
Alex Ant 54ac12f250 update migrations 2024-10-13 16:24:26 +05:00
Alex Ant 9a6a72f605 feat: запрос соглашений
fix: интерфейс
2024-10-13 16:13:52 +05:00
Alex Ant 03949489e8 docs: добавлен файл конвенции коммитов 2024-10-13 13:19:16 +05:00
Alex Ant 8ebd735e7e update 2024-10-13 13:08:59 +05:00
Alex Ant 39246da73f update amount in agreement and fix bug in terminal 2024-10-13 12:00:39 +05:00
Alex Ant bf33f60368 cooperative connection 2024-10-13 11:50:22 +05:00
Alex Ant 492a613769 fix bugs 2024-10-12 00:59:58 +05:00
Alex Ant 2c02c3434e update 2024-10-12 00:51:37 +05:00
Alex Ant a186ddd9d2 chore(release): publish 2024-10-12 00:46:06 +05:00
Alex Ant 4b0c7a5e4e update 2024-10-12 00:45:35 +05:00
Alex Ant 54cfbe3ab6 fix 2024-10-12 00:39:07 +05:00
Alex Ant 02015cf0b8 update migrator package.json 2024-10-12 00:37:39 +05:00
Alex Ant 416e4d3598 interface rework & documents style change 2024-10-12 00:31:52 +05:00
Alex Ant e0d9c4b0ea make migrator private 2024-10-10 20:55:46 +05:00
Alex Ant 2659e3bc09 migrator release 2024-10-10 20:54:27 +05:00
Alex Ant d296167b6a agreementChecker fix, payment description fix, loader on add user 2024-10-10 20:41:18 +05:00
Alex Ant 89b0aa7fec chore(release): publish 2024-10-10 18:38:19 +05:00
Alex Ant 787aadf444 fix bugs 2024-10-10 18:09:22 +05:00
Alex Ant d67161a29b slice secret 2024-10-10 15:02:12 +05:00
Alex Ant 7f4777ead4 правка текста вступительного взноса 2024-10-10 14:41:26 +05:00
Alex Ant 1e2147b143 fix aggregation 2 2024-10-10 12:09:10 +05:00
Alex Ant 9f0a2fbf63 chore(release): publish 2024-10-10 11:28:11 +05:00
Alex Ant 7804851bc9 update agregate pipeline 2024-10-10 11:15:47 +05:00
Alex Ant adc50dd89e chore(release): publish 2024-10-09 22:20:55 +05:00
Alex Ant 5378cf5ddc template fix 2024-10-09 22:14:11 +05:00
Alex Ant a733bb605f fix model 2024-10-09 14:17:19 +05:00
Alex Ant aaa1b5a264 test update 2024-10-09 14:01:21 +05:00
Alex Ant 5855cdee65 install process 2024-10-09 13:46:08 +05:00
Alex Ant c0d584e644 TSK-225 vaultModel and wif store for cooperative operations 2024-10-04 12:01:44 +05:00
Alex Ant 955f0f473e fix bug 2024-09-30 23:10:59 +05:00
Alex Ant 9ceb888124 update 2024-09-30 22:13:59 +05:00
Alex Ant e902933693 update 2024-09-30 21:43:41 +05:00
Alex Ant e07b47fb10 update 2024-09-30 21:37:54 +05:00
Alex Ant 5bf08d9701 update 2024-09-30 21:33:02 +05:00
Alex Ant 597fa1e6fa update package 2024-09-30 21:21:45 +05:00
Alex Ant dda3ec0ba0 chore(release): publish 2024-09-30 21:09:57 +05:00
Alex Ant 991f08c749 dompurify and coopback <br> fix 2024-09-30 21:08:26 +05:00
Alex Ant 923865cd7c bug fix #3 2024-09-30 20:00:25 +05:00
Alex Ant 606aee8ccd chore(release): publish 2024-09-30 17:24:04 +05:00
Alex Ant 4a1cb27d0a big bug #2 2024-09-30 17:21:38 +05:00
Alex Ant 26cd7f3a12 chore(release): publish 2024-09-30 17:09:39 +05:00
Alex Ant f4045dbc56 chore(release): publish 2024-09-30 17:07:54 +05:00
Alex Ant 33c2b24550 fix bug of parallel generation 2024-09-30 17:06:17 +05:00
Alex Ant cd86f3c8ea redis auth 2024-09-30 15:15:57 +05:00
Alex Ant 58026ebc2d fix redis auth 2024-09-30 15:07:33 +05:00
Alex Ant 9183275dad redis authentification 2024-09-30 15:00:38 +05:00
Alex Ant 5e3a625d95 chore(release): publish 2024-09-30 14:52:28 +05:00
Alex Ant 3297f9d2d2 update package.json 2024-09-30 14:51:18 +05:00
Alex Ant 29b8306a28 chore(release): publish 2024-09-29 19:17:36 +05:00
Alex Ant d84746bac6 add compression package 2024-09-29 19:14:12 +05:00
Alex Ant 4eacf2ff0b chore(release): publish 2024-09-29 19:01:29 +05:00
Alex Ant a68e0d6f61 update 2024-09-29 18:57:09 +05:00
Alex Ant ddf44304c7 order_id -> order_num, stable initial_order 2024-09-29 15:28:16 +05:00
Alex Ant 789d98f58e chore(release): publish 2024-09-29 09:39:57 +05:00
Alex Ant 205574620d Merge branch 'testnet' 2024-09-29 09:39:19 +05:00
Alex Ant d9bae12b31 chore(release): publish 2024-09-29 09:36:26 +05:00
Alex Ant c951190794 update 2024-09-29 09:34:32 +05:00
Alex Ant d4e1d69c3c update 2024-09-29 09:29:53 +05:00
Alex Ant f93a32c07b update 2024-09-29 09:25:10 +05:00
Alex Ant 8e7c152c0d update 2024-09-29 09:23:20 +05:00
Alex Ant 6a64404f20 update 2024-09-29 09:19:43 +05:00
Alex Ant 1a09589add from-packages 2024-09-29 09:18:03 +05:00
Alex Ant d0f9072ab5 fixed packet version 2024-09-29 09:15:58 +05:00
Alex Ant 011ed9f2d8 update 2024-09-29 09:11:57 +05:00
Alex Ant 12332f83d9 Merge branch 'dev' into testnet 2024-09-29 09:05:09 +05:00
Alex Ant 8f75829948 update 2024-09-29 09:04:53 +05:00
Alex Ant a7ffedb3b2 update 2024-09-29 09:03:14 +05:00
Alex Ant 378d3b9747 update 2024-09-29 09:02:06 +05:00
Alex Ant 5ba05409c4 chore(release): publish
- coopback@1.7.38-alpha.3
 - coopdoc-generator-ts@1.0.21-alpha.3
 - cooptypes@1.0.26-alpha.3
 - coop-notificator@0.0.29-alpha.3
 - terminal@0.1.51-alpha.3
2024-09-29 08:58:35 +05:00
Alex Ant d86beef58f document updates 2024-09-29 08:57:37 +05:00
Alex Ant 7315d67c9f chore(release): publish
- coopback@1.7.38-alpha.2
 - coopdoc-generator-ts@1.0.21-alpha.2
 - cooptypes@1.0.26-alpha.2
 - coop-notificator@0.0.29-alpha.2
 - terminal@0.1.51-alpha.2
2024-09-28 19:43:01 +05:00
Alex Ant 59d79b8c7a update order statuses, list order statuses, add passport data, update registry documents 2024-09-28 19:41:12 +05:00
Alex Ant 3df97653a2 TSK-181 StatusPage and setStatus for orders [pre] 2024-09-26 21:30:08 +05:00
Alex Ant 948d55e418 download qr and show order data 2024-09-23 21:18:10 +05:00
Alex Ant 1d2c7281b1 sberbankPollingProvider prototype 2024-09-23 12:46:12 +05:00
Alex Ant 35759b943c chore(release): publish
- coopback@1.7.38-alpha.1
 - coopdoc-generator-ts@1.0.21-alpha.1
 - cooptypes@1.0.26-alpha.1
 - coop-notificator@0.0.29-alpha.1
 - terminal@0.1.51-alpha.1
2024-09-20 12:13:47 +05:00
Alex Ant 29da33e200 update 2024-09-20 12:12:06 +05:00
Alex Ant 1d758f8126 gitignore 2024-09-20 10:09:54 +05:00
Alex Ant b663dac2ab delete logs 2024-09-20 10:09:32 +05:00
Alex Ant 485a3971e9 update 2024-09-20 10:09:13 +05:00
Alex Ant 36b5d64ca6 chore(release): publish
- coopback@1.7.38-alpha.0
 - coopdoc-generator-ts@1.0.21-alpha.0
 - cooptypes@1.0.26-alpha.0
 - coop-notificator@0.0.29-alpha.0
 - terminal@0.1.51-alpha.0
2024-09-16 12:14:29 +05:00
Alex Ant 8462a709bc hz 2024-09-16 12:13:44 +05:00
Alex Ant 20cabe8362 update 2024-09-16 12:00:54 +05:00
Alex Ant 6967864361 chore(release): publish
- coopback@1.7.37-alpha.3
 - coopdoc-generator-ts@1.0.11-alpha.2
 - terminal@0.1.41-alpha.2
2024-09-16 11:58:50 +05:00
Alex Ant a6ee3840ae update 2024-09-16 11:57:43 +05:00
Alex Ant 01de6139df update 2024-09-16 11:46:48 +05:00
Alex Ant 6ba0924f6c chore(release): publish
- coopback@1.7.37-alpha.2
 - coopdoc-generator-ts@1.0.11-alpha.2
 - cooptypes@1.0.22-alpha.6
 - coop-notificator@0.0.28-alpha.1
 - terminal@0.1.41-alpha.1
2024-09-16 11:44:22 +05:00
Alex Ant 00c75d1fd8 update 2024-09-16 11:43:37 +05:00
Alex Ant 93f28fa9d5 update 2024-09-16 11:38:25 +05:00
Alex Ant 0aed10eb8b chore(release): publish
- coopback@1.7.37-alpha.1
 - coopdoc-generator-ts@1.0.11-alpha.1
 - cooptypes@1.0.22-alpha.6
 - coop-notificator@0.0.28-alpha.0
 - terminal@0.1.41-alpha.0
2024-09-16 11:37:13 +05:00
Alex Ant d84d687eee update 2024-09-16 11:36:50 +05:00
Alex Ant d046f56832 update 2024-09-16 11:34:07 +05:00
Alex Ant 0af1fbf313 update 2024-09-16 11:24:50 +05:00
Alex Ant e9aaf4309e chore(release): publish
- cooparser-ts@1.0.20-alpha.0
 - coopback@1.7.37-alpha.0
 - coopdoc-generator-ts@1.0.11-alpha.0
 - cooptypes@1.0.22-alpha.6
 - coop-notificator@0.0.27
 - terminal@0.1.40
2024-09-16 11:19:45 +05:00
Alex Ant 80fa1085d2 FUCK 2024-09-16 11:13:22 +05:00
Alex Ant 88195291fd update 2024-09-16 11:09:40 +05:00
Alex Ant 39ad600d00 update 2024-09-16 10:58:59 +05:00
Alex Ant c63a3aba6b update 2024-09-16 10:41:15 +05:00
Alex Ant 782ecbe307 dfdf 2024-09-16 10:36:54 +05:00
Alex Ant f75bbfa048 fix 2024-09-16 10:15:16 +05:00
Alex Ant 3a772cc983 herna 2024-09-16 10:00:29 +05:00
Alex Ant 807113523e documents update 2024-09-16 09:52:00 +05:00
Alex Ant 7df2af8611 update 2024-09-15 17:28:33 +05:00
Alex Ant 10c1697b00 update 2024-09-15 17:23:58 +05:00
Alex Ant 742e5d38ab chore(release): publish
- coopback@1.7.35-alpha.5
 - coopdoc-generator-ts@1.0.79-alpha.5
 - cooptypes@1.0.22-alpha.5
 - coop-notificator@0.0.26-alpha.5
 - terminal@0.1.39-alpha.5
2024-09-15 17:20:44 +05:00
Alex Ant 1d3e7f8af0 update 2024-09-15 17:19:13 +05:00
Alex Ant c99bacab64 before update 2024-09-15 10:40:18 +05:00
Alex Ant 95d7555ebc ssr & covars -> vars 2024-09-15 09:38:02 +05:00
Alex Ant 5854e0a23c chore(release): publish
- coopback@1.7.35-alpha.4
 - coopdoc-generator-ts@1.0.79-alpha.4
 - cooptypes@1.0.22-alpha.4
 - coop-notificator@0.0.26-alpha.4
 - terminal@0.1.39-alpha.4
2024-09-14 17:02:55 +05:00
Alex Ant 81f7f32767 fix 2024-09-14 17:02:33 +05:00
Alex Ant c0374a7da1 chore(release): publish
- coopback@1.7.35-alpha.3
 - coopdoc-generator-ts@1.0.79-alpha.3
 - cooptypes@1.0.22-alpha.3
 - coop-notificator@0.0.26-alpha.3
 - terminal@0.1.39-alpha.3
2024-09-14 16:44:32 +05:00
Alex Ant ed65e655b9 update 2024-09-14 16:43:06 +05:00
Alex Ant d250e516b5 update document models 2024-09-14 12:43:06 +05:00
Alex Ant e4f404b2c7 documents update 2024-09-13 20:41:00 +05:00
Alex Ant 86571331f8 update registry 2024-09-12 15:05:11 +05:00
Alex Ant 163d420af9 request agreements 2024-09-11 16:12:05 +05:00
Alex Ant 4925ea4af0 chore(release): publish
- cooparser-ts@1.0.19-alpha.1
 - coopback@1.7.35-alpha.2
 - coopdoc-generator-ts@1.0.79-alpha.2
 - cooptypes@1.0.22-alpha.2
 - coop-notificator@0.0.26-alpha.2
 - terminal@0.1.39-alpha.2
2024-09-11 10:04:46 +05:00
Alex Ant 57b05ce348 registration agreements 2024-09-11 10:01:09 +05:00
Alex Ant 427b53fcbd chore(release): publish
- coopback@1.7.35-alpha.1
 - coopdoc-generator-ts@1.0.79-alpha.1
 - cooptypes@1.0.22-alpha.1
 - coop-notificator@0.0.26-alpha.1
 - terminal@0.1.39-alpha.1
2024-09-10 10:06:12 +05:00
Alex Ant 2ac7a31be6 промежуточный результат добавления кооперативных соглашений 2024-09-10 10:05:17 +05:00
Alex Ant 4baed6409f chore(release): publish
- cooparser-ts@1.0.19-alpha.0
 - coopback@1.7.35-alpha.0
 - coopdoc-generator-ts@1.0.79-alpha.0
 - cooptypes@1.0.22-alpha.0
 - coop-notificator@0.0.26-alpha.0
 - terminal@0.1.39-alpha.0
2024-09-06 16:39:34 +05:00
Alex Ant 2ea0ff0965 big update 2024-09-06 16:29:18 +05:00
Alex Ant 88b9a7edce small letters 2024-09-05 19:27:23 +05:00
Alex Ant 538066b960 ufff template or Template ??? always should be small letters 2024-09-05 19:25:37 +05:00
Alex Ant b10dd1d75a update generator with new type of document 2024-09-04 20:57:59 +05:00
Alex Ant f743580b55 fix signature collection name 2024-09-03 20:33:30 +05:00
Alex Ant 0688467302 update 2024-09-03 20:11:17 +05:00
Alex Ant 29e972dbf2 fix is_paid 2024-08-27 18:47:39 +05:00
Alex Ant bd99697c5b chore(release): publish
- coopback@1.7.34
 - coopdoc-generator-ts@1.0.78
 - cooptypes@1.0.21
 - coop-notificator@0.0.25
 - terminal@0.1.38
2024-08-25 11:39:35 +05:00
Alex Ant 1d5c431ff6 update types 2024-08-25 11:38:40 +05:00
Alex Ant 3736c510ff chore(release): publish
- cooparser-ts@1.0.18
 - coopback@1.7.33
 - coopdoc-generator-ts@1.0.77
 - terminal@0.1.37
2024-08-25 11:27:44 +05:00
Alex Ant 26c12c3a85 update 2024-08-25 11:25:28 +05:00
Alex Ant 10bb08e5e6 chore(release): publish
- coopback@1.7.32
 - coopdoc-generator-ts@1.0.76
 - terminal@0.1.36
2024-08-25 11:19:13 +05:00
Alex Ant b50d5b6121 publish 2024-08-25 11:07:57 +05:00
Alex Ant 38b28752e1 chore(release): publish
- coopback@1.7.31
 - coopdoc-generator-ts@1.0.75
 - cooptypes@1.0.20
 - coop-notificator@0.0.24
 - terminal@0.1.35
2024-08-25 11:02:44 +05:00
Alex Ant 87c51009de ProgramProvision | ЦПП Цифровой Кошелёк 2024-08-25 10:59:57 +05:00
Alex Ant a950a47b28 chore(release): publish
- coopback@1.7.31-alpha.1
 - coopdoc-generator-ts@1.0.75-alpha.1
 - cooptypes@1.0.20-alpha.1
 - coop-notificator@0.0.24-alpha.1
 - terminal@0.1.35-alpha.1
2024-08-23 10:38:04 +05:00
Alex Ant 2609d10c0b update 2024-08-23 10:35:48 +05:00
Alex Ant 7b4cb0f66c publish 2024-08-23 10:34:38 +05:00
Alex Ant 26db0e1e69 push 2024-08-21 15:57:02 +05:00
Alex Ant 62e64cbd22 upgrade 2024-08-21 14:43:43 +05:00
Alex Ant 844a47830f fix types 2024-08-21 13:11:37 +05:00
Alex Ant 2cc1e32f45 chore(release): publish
- coopback@1.7.31-alpha.0
 - coopdoc-generator-ts@1.0.75-alpha.0
 - cooptypes@1.0.20-alpha.0
 - coop-notificator@0.0.24-alpha.0
 - terminal@0.1.35-alpha.0
2024-08-21 12:53:38 +05:00
Alex Ant 9890958b1e update contracts interface 2024-08-21 12:50:44 +05:00
Alex Ant 6dbd6d6edc fix 2024-08-19 14:31:01 +05:00
Alex Ant bf7a4dfd28 путь установки 2024-08-19 14:20:38 +05:00
Alex Ant f52626bda0 Полное разделение форм ввода данных пользователя пригодное для использования в процессе инсталляции 2024-08-16 16:17:24 +05:00
Alex Ant 88cec4bf2b рефакторинг | вынос форм для ввода пользовательской информации в shared для дальнейшего использования в модуле установки 2024-08-15 20:30:01 +05:00
Alex Ant b880def108 fix 2024-08-15 12:39:19 +05:00
Alex Ant bfd5dc039a addUser в панели управления 2024-08-15 12:28:18 +05:00
5513 changed files with 441690 additions and 100802 deletions
Vendored
BIN
View File
Binary file not shown.
+3
View File
@@ -0,0 +1,3 @@
{
"agentCanUpdateSnapshot": true
}
+8
View File
@@ -0,0 +1,8 @@
---
description:
globs:
alwaysApply: true
---
ВАЖНО!!! Мы работаем в МОНО-репозитории pnpm, любая установка пакетов производится ЧЕРЕЗ ФИЛЬТР компонента в корне: pnpm add glob --filter notificator2.
ВАЖНО!!! НИКОГДА НЕ ЗАПУСКАЙ ПРИЛОЖЕНИЕ ИЛИ ЕГО СБОРКУ!!! Просто отчитайся что всё сделал.
+151
View File
@@ -0,0 +1,151 @@
---
description:
globs: components/controller/**
alwaysApply: false
---
# NestJS Controller и Чистая архитектура
## Основные принципы
1. Чистая архитектура - главный архитектурный подход. Пиши код с комментариями.
2. Типы IName, IChecksum256, ITimePointSec - это просто строки.
3. Домен должен быть полностью изолирован от инфраструктурных деталей.
4. Направление зависимостей - внутрь (к ядру, домену).
5. Домен, инфраструктура и приложение связаны через App.module, НЕ НУЖНО импортировать их друг в друга, а достаточно просто импортировать домен на уровне приложения чтобы использовать все экспорты домена.
## Структура проекта
- `domain/` - доменный слой (бизнес-логика, независимая от инфраструктуры)
- `infrastructure/` - инфраструктурный слой (адаптеры к внешним системам)
- `modules/` - слой приложения (DTO, резолверы, сервисы)
## Слои и их взаимодействие
1. **Домен**:
- Содержит чистые доменные интерфейсы и реализованные на них сущности
- НЕ должен зависеть от `cooptypes` (инфраструктурный контракт)
- Использует собственные доменные типы (например, Date вместо строковых timestamp)
- Интерфейсы портов описывают взаимодействие с внешними системами
2. **Инфраструктура**:
- Содержит адаптеры к внешним системам (блокчейн, БД и т.д.)
- Осуществляет преобразование между доменными и инфраструктурными типами
- Общая логика преобразования выносится в утилитарные классы (например, `DomainToBlockchainUtils`)
3. **Модули (приложение)**:
- DTO имплементируют доменные интерфейсы напрямую
- Резолвер вызывает сервис, который принимает DTO
- Сервис передает объекты DTO в интерактор домена
## Поток данных
1. Резолвер принимает входные данные и передает их в сервис
2. Сервис вызывает интерактор домена, передавая ему объекты DTO (имплементирующие доменный интерфейс)
3. Интерактор выполняет бизнес-логику и взаимодействует с портами домена
4. Адаптеры (инфраструктурный слой) преобразуют доменные объекты в формат внешних систем (JSON для хранения мета-данных, ISO для дат и т.д.)
5. Адаптеры возвращают результаты в домен, домен возвращает данные в сервис, который возвращает их в резолвер
## Правила преобразования данных
1. Преобразование DTO → доменный объект: не требуется, если DTO имплементирует доменный интерфейс
2. Преобразование доменный объект → инфраструктурный тип: происходит в адаптерах
3. Преобразование документов, дат и других сложных объектов: используются утилитарные классы уровня инфраструктуры
## Работа с типами данных
1. **Даты**:
- В доменных интерфейсах используется тип `Date`
- В DTO используется тип `Date` с декораторами `@IsDate()` и `@Type(() => Date)`
- В инфраструктурном слое происходит преобразование `Date` → `string` (ISO формат)
```typescript
// Доменный интерфейс
interface MeetDomainInterface {
open_at: Date;
}
// DTO
@Field(() => Date)
@IsDate()
@Type(() => Date)
open_at!: Date;
// Адаптер
const blockchainData = {
open_at: domainToBlockchainUtils.convertDateToBlockchainFormat(data.open_at)
};
```
2. **Документы**:
- В доменных интерфейсах используется собственный тип `SignedDocumentDomainInterface<T>`
- В DTO используется соответствующий DTO-класс (например, `SignedDigitalDocumentInputDTO`)
- В инфраструктурном слое происходит преобразование между форматами (meta-поля в JSON и т.д.)
## Типовые ошибки
1. **Нарушение изоляции домена**: домен должен быть изолирован от инфраструктуры. Не используйте импорты из `cooptypes` в доменных интерфейсах.
```typescript
// Неправильно
import { MeetContract } from 'cooptypes';
export type VoteDomainInterface = MeetContract.Actions.Vote.IInput;
// Правильно
export interface VoteDomainInterface {
coopname: string;
hash: string;
// ... доменные поля
}
```
2. **Преобразование в неправильном слое**: преобразование доменных объектов в инфраструктурные типы должно происходить в адаптерах, а не в доменном слое или сервисе.
```typescript
// Неправильно (в доменном интеракторе)
async vote(data: VoteDomainInterface) {
const blockchainData = { ...data, meta: JSON.stringify(data.meta) };
// ...
}
// Правильно (в адаптере)
async vote(data: VoteDomainInterface) {
const blockchainData = this.convertToBlockchainFormat(data);
// ...
}
```
3. **Дублирование логики преобразования**: общая логика преобразования должна быть вынесена в утилитарные классы.
```typescript
// Неправильно (дублирование в разных адаптерах)
// В MeetAdapter
private convertDoc(doc) { return { ...doc, meta: JSON.stringify(doc.meta) }; }
// В BranchAdapter
private convertDoc(doc) { return { ...doc, meta: JSON.stringify(doc.meta) }; }
// Правильно (общий утилитарный класс)
// DomainToBlockchainUtils
convertSignedDocumentToBlockchainFormat(doc) {
return { ...doc, meta: JSON.stringify(doc.meta) };
}
```
## Примеры
```typescript
// Доменный интерфейс - чистый, без зависимостей от инфраструктуры
export interface VoteOnAnnualGeneralMeetInputDomainInterface {
coopname: string;
hash: string;
member: string;
ballot: VoteItemInputDomainInterface[];
}
// DTO имплементирует доменный интерфейс напрямую
@InputType('VoteOnAnnualGeneralMeetInput')
export class VoteOnAnnualGeneralMeetInputDTO implements VoteOnAnnualGeneralMeetInputDomainInterface {
@Field(() => String)
@IsString()
coopname!: string;
// ... остальные поля
}
// Адаптер преобразует доменный объект в инфраструктурный тип
async vote(data: VoteOnAnnualGeneralMeetInputDomainInterface): Promise<TransactionResult> {
// Преобразуем доменный объект в инфраструктурный тип
const blockchainData: MeetContract.Actions.Vote.IInput = {
coopname: data.coopname,
hash: data.hash,
// ... преобразование других полей
};
// ... отправка данных во внешнюю систему
}
```
@@ -0,0 +1,41 @@
---
description: SDK мутации и запросы для подключения на рабочем столе
globs:
alwaysApply: false
---
Бэкенд реализован здесь components/controller, sdk здесь components/sdk.
Пример создания Query к API через SDK:
``` ts
async function loadBranches(data: IGetBranchesInput): Promise<IBranch[]> {
const { [Queries.Branches.GetBranches.name]: output } = await client.Query(
Queries.Branches.GetBranches.query,
{
variables: {
data
}
}
);
return output;
}
```
Такие запросы обычно хранятся в папке Entities и вызываются из его store.
Пример мутации:
``` ts
async function selectBranch(data: ISelectBranchInput): Promise<boolean>{
const {[Mutations.Branches.SelectBranch.name]: result} = await client.Mutation(Mutations.Branches.SelectBranch.mutation, {variables: {
data
}})
return result
}
```
Мутации обычно храним в папке features.
Как можешь обратить внимание, все мутации и запросы строятся по одному шаблону. Вся необходимая информация уже есть в SDK.
+12
View File
@@ -0,0 +1,12 @@
---
alwaysApply: true
globs: **/desktop/**
---
# DESKTOP
- Пишем код фронтенда в архитектуре Feature Sliced Design (FSD).
- Стиль шаблонов PUG на composite API.
- Всегда создаём index.ts файлы для vue компонент.
- Создавай индексные файлы для vue через export {default as NAME} from './where', а на уровне выше, если это необходимо, делай export * from './ui'
- Всегда удаляем неиспользуемые импорты.
- Не используем emit избыточно. Вместо них используем композабл функции моделей фич, если необходимо. Emit только в крайнем случае.
+62
View File
@@ -0,0 +1,62 @@
---
description:
globs:
alwaysApply: false
---
Файл [main.py](mdc:monocoop/monocoop/monocoop/components/docs/main.py) автоматически генерит ссылки на документацию SDK и GraphQL, которые формируются и публикуются автоматически. При создании документации к методам всегда применяй ссылки на SDK и GraphQL по форме:
{{ get_sdk_doc("Mutations", "Accounts", "RegisterAccount") }} | {{ get_graphql_doc("Mutation.registerAccount") }}
### 🎯 Основные паттерны использования
**1. Стандартная структура для методов API:**
```markdown
## Название действия
{{ get_sdk_doc("Namespace", "Module", "Method") }} | {{ get_graphql_doc("Type.methodName") }}
{{ get_typedoc_input("Namespace.Module.Method") }}
Результат:
{{ get_typedoc_definition("Namespace.Module.Method", "IOutput") }}
```
**2. Описание + пример (для сложных методов):**
```markdown
{{ get_typedoc_desc("Namespace.Module.Method") }}
{{ get_typedoc_input("Namespace.Module.Method") }}
```
**3. Ссылки на типы данных:**
```markdown
У каждого аккаунта есть объект {{ get_graphql_definition("Account") }} в GraphQL-API
```
### 🔧 Макросы и их применение
| Макрос | Назначение | Пример использования |
|--------|------------|---------------------|
| `get_sdk_doc` | Ссылка на SDK документацию | `{{ get_sdk_doc("Mutations", "Payments", "CreateDeposit") }}` |
| `get_graphql_doc` | Ссылка на GraphQL операцию | `{{ get_graphql_doc("Query.getAccount") }}` |
| `get_graphql_definition` | Ссылка на GraphQL тип | `{{ get_graphql_definition("Account") }}` |
| `get_class_doc` | Ссылка на класс/метод SDK | `{{ get_class_doc("Document", "sign") }}` |
| `get_typedoc_input` | **Полный пример** TypeScript вызова | `{{ get_typedoc_input("Mutations.Auth.Login") }}` |
| `get_typedoc_definition` | **Структура интерфейса** | `{{ get_typedoc_definition("Mutations.Auth.Login", "IOutput") }}` |
| `get_typedoc_desc` | Описание + примеры | `{{ get_typedoc_desc("Mutations.Auth.Login") }}` |
| `get_typedoc_value` | Значение константы | `{{ get_typedoc_value("Constants.API_VERSION") }}` |
### 📝 Правила оформления
**ОБЯЗАТЕЛЬНО:**
- Всегда используй `get_typedoc_input` для демонстрации **КАК вызывать** метод
- Всегда используй `get_typedoc_definition` для показа **ЧТО возвращается**
- Комбинируй SDK и GraphQL ссылки через ` | `: `{{ get_sdk_doc(...) }} | {{ get_graphql_doc(...) }}`
**ЖЕЛАТЕЛЬНО:**
- Для сложных методов добавляй `get_typedoc_desc` в начало
- Используй `get_graphql_definition` для ссылок на типы данных в тексте
- Группируй связанные операции в одном разделе
**ФОРМАТ ССЫЛОК:**
- SDK: `"Namespace", "Module", "Method"` (3 аргумента)
- GraphQL: `"Type.methodName"` (точка между типом и методом)
- Определения: просто имя типа `"TypeName"`
+96
View File
@@ -0,0 +1,96 @@
---
description:
globs:
alwaysApply: false
---
# Структура файлов шаблонов документов и алгоритм правки
## Основные директории и файлы
### 1. Определение типов и интерфейсов (cooptypes)
**Путь:** `/cooptypes/src/cooperative/registry/[ID.DocumentName]/index.ts`
В этих файлах определяются:
- Интерфейсы данных (`IAgendaMeet`, etc.)
- Основная модель данных документа (`Model`)
- HTML шаблон документа (`context`)
- Переводы строк (`translations`)
- Пример данных для тестирования (`exampleData`)
**Для изменения шаблона нужно править:**
- Интерфейсы модели данных при изменении структуры
- HTML в переменной `context` для изменения внешнего вида
- Строки переводов в `translations.ru`
### 2. Схемы валидации (factory)
**Путь:** `/factory/src/Schema/[SchemaName].ts`
Содержат:
- JSON схемы для валидации данных
- Определение обязательных полей
**При изменении структуры данных:**
- Обновите соответствующую схему валидации
- Обновите список обязательных полей в `required`
### 3. Фабрики документов (factory)
**Путь:** `/factory/src/Actions/[ID.DocumentName].ts`
Обрабатывают:
- Получение данных из разных источников
- Сборку модели для шаблонизатора
- Валидацию данных по схеме
- Генерацию PDF
**При изменении логики сборки документа:**
- Обновите метод `generateDocument()`
- Добавьте новые источники данных
### 4. Шаблоны (factory)
**Путь:** `/factory/src/Templates/[ID.DocumentName].ts`
Связывают:
- Шаблон из cooptypes
- Схему валидации
- Метаданные документа
**После изменения в cooptypes:**
- Убедитесь, что схема в Templates соответствует новой модели
### 5. Тесты (factory)
**Путь:** `/factory/test/[category].test.ts`
Содержат:
- Тестовые данные для генерации документов
- Вызовы функции `testDocumentGeneration`
**После внесения изменений:**
- Обновите тестовые данные в соответствии с новой структурой
- Запустите тесты командой `pnpm test`
## Алгоритм внесения изменений
1. **Модификация типов**
- Изменить файл в `/cooptypes/src/cooperative/registry/[ID.DocumentName]/index.ts`
- Обновить интерфейсы, шаблон HTML и переводы
2. **Обновление схемы валидации**
- Изменить соответствующую схему в `/factory/src/Schema/`
- Убедиться, что обязательные поля совпадают с интерфейсом
3. **Компиляция библиотеки типов**
- Выполнить `cd /cooptypes && pnpm build`
4. **Обновление тестовых данных**
- Привести тестовые данные в соответствие с новой структурой
5. **Запуск тестов**
- Выполнить `cd /factory && pnpm test [filename].test.ts`
## Особенности шаблонизации
- Используется Nunjucks для шаблонов
- Поддерживаются конструкции: `{% if %}`, `{% for %}`, `{% trans %}`
- Переменные вставляются через `{{ variable }}`
- Переводы через `{% trans 'KEY' %}`
+225
View File
@@ -0,0 +1,225 @@
# Архитектура расширений в MonoCoop
## Основные принципы
1. Расширения построены на модулях NestJS с использованием шаблона "Порты и адаптеры"
2. Каждое расширение наследуется от `BaseExtModule` и реализует интерфейс `OnModuleInit`
3. Расширения могут взаимодействовать с блокчейном через соответствующие порты
4. Конфигурации расширений хранятся в БД и описываются с помощью Zod-схем
5. Расширения регистрируются в глобальном реестре `AppRegistry`
## Структура расширения
Минимальная структура расширения включает:
- `XXX-extension.module.ts` - основной модуль расширения
- `package.json` - информация о пакете
- `README.md` - документация
- `INSTALL.md` - инструкции по установке
- `CHANGELOG.md` - история изменений
## Создание нового расширения
1. Создайте директорию для расширения в `components/controller/src/extensions/`
2. Создайте основной класс расширения, наследующийся от `BaseExtModule`
3. Определите Zod-схему для конфигурации
4. Реализуйте метод `initialize()`
5. Зарегистрируйте расширение в `extensions.registry.ts`
6. Добавьте расширение в список дефолтных приложений в `extension-domain.service.ts`
## Пример структуры модуля расширения
```typescript
// XXX-extension.module.ts
export class XXXPlugin extends BaseExtModule {
constructor(...) {
super();
}
name = 'xxx';
plugin!: ExtensionDomainEntity<IConfig>;
public configSchemas = Schema;
async initialize() {
// Инициализация расширения
// Настройка cron-задач
}
}
@Module({
providers: [XXXPlugin],
})
export class XXXPluginModule {
constructor(private readonly xxxPlugin: XXXPlugin) {}
async initialize() {
await this.xxxPlugin.initialize();
}
}
```
## Управление отображением конфигурации
Zod-схемы используются для автоматического отображения формы настроек в интерфейсе пользователя.
Через интерфейс `DeserializedDescriptionOfExtension` из `components/controller/src/types/shared/extension.types.ts`
можно управлять отображением полей формы:
```typescript
export const Schema = z.object({
// Базовое поле с меткой
simpleField: z.string().describe(
describeField({
label: 'Название поля',
note: 'Подсказка под полем'
})
),
// Скрытое поле для служебного использования
hiddenField: z.string().describe(
describeField({
label: 'Скрытое поле',
visible: false
})
),
// Поле с проверкой значения
validatedField: z.number().describe(
describeField({
label: 'Поле с валидацией',
rules: ['val >= 5', 'val <= 100'],
})
),
// Форматированное поле с префиксом и суффиксом
formattedField: z.number().describe(
describeField({
label: 'Форматированное поле',
prepend: '$',
append: 'USD',
})
),
// Многострочное текстовое поле
multilineField: z.string().describe(
describeField({
label: 'Многострочное поле',
maxRows: 5,
minLength: 10,
maxLength: 1000
})
),
});
```
Доступные поля для управления отображением:
- `label` - название поля (обязательное)
- `note` - пояснение или подсказка
- `visible` - видимость поля (по умолчанию true)
- `rules` - правила валидации в виде строковых выражений
- `mask` - маска для ввода
- `fillMask` - автозаполнение маски
- `minLength` / `maxLength` - ограничения длины для текстовых полей
- `maxRows` - количество строк для многострочного ввода
- `append` / `prepend` - текст до/после значения поля
## Взаимодействие с блокчейном
Для взаимодействия с блокчейном:
1. Определите порт в доменном слое (например, `SovietBlockchainPort`)
2. Инжектируйте порт в конструкторе расширения через DI
3. Используйте методы порта для взаимодействия с блокчейном
```typescript
@Inject(SOVIET_BLOCKCHAIN_PORT) private readonly sovietBlockchainPort: SovietBlockchainPort
// ...
const decisions = await this.sovietBlockchainPort.getDecisions(coopname);
```
## Настройка планировщика задач
Расширения могут использовать cron-задачи для периодического выполнения операций:
```typescript
import cron from 'node-cron';
// Регистрация cron-задачи (каждые N минут)
const cronExpression = `*/${this.plugin.config.checkInterval} * * * *`;
cron.schedule(cronExpression, () => {
this.logger.info('Запуск запланированной задачи');
this.runTask();
});
```
## Работа с конфигурацией
1. Определите Zod-схему для конфигурации
2. Используйте `describeField` для добавления UI-метаданных к полям
3. Получайте и обновляйте конфигурацию через репозиторий `extensionRepository`
```typescript
export const Schema = z.object({
checkInterval: z.number().describe(
describeField({
label: 'Интервал проверки (в минутах)',
note: 'Минимум: 5 минут',
rules: ['val >= 5'],
})
),
});
// Обновление конфигурации
this.plugin.config.lastCheckDate = new Date().toISOString();
await this.extensionRepository.update(this.plugin);
```
## Логирование действий
Расширения должны логировать свои действия:
1. Используйте `WinstonLoggerService` для системного логирования
2. Используйте `LogExtensionDomainRepository` для хранения логов в БД
```typescript
// Системное логирование
this.logger.info(`Выполнение операции для ${id}`);
// Сохранение лога в БД
await this.logExtensionRepository.push(this.name, {
type: 'operation',
timestamp: new Date().toISOString(),
data: { ... },
});
```
## Регистрация расширения
После создания расширения, добавьте его в `extensions.registry.ts`:
```typescript
export const AppRegistry: INamedExtension = {
myExtension: {
is_builtin: false,
is_internal: true,
is_available: true,
is_desktop: false,
title: 'Моё расширение',
description: 'Описание функциональности.',
image: 'https://example.com/image.png',
class: MyExtensionPluginModule,
schema: MyExtensionSchema,
tags: ['тег1', 'тег2'],
readme: getReadmeContent('./myExtension'),
instructions: getInstructionsContent('./myExtension'),
},
};
```
## Дефолтные настройки
Добавьте расширение в список дефолтных приложений в `extension-domain.service.ts`:
```typescript
getDefaultApps(): Partial<ExtensionDomainEntity>[] {
return [
// ...
{
name: 'myExtension',
enabled: true,
config: {
// Дефолтные значения конфигурации
parameter1: 'value1',
parameter2: 42,
},
},
// ...
];
}
```
+168
View File
@@ -0,0 +1,168 @@
---
description:
globs: **/controller/src/extensions/**
alwaysApply: false
---
# Архитектура расширений в MonoCoop
## Основные принципы
1. Расширения построены на модулях NestJS с использованием шаблона "Порты и адаптеры"
2. Каждое расширение наследуется от `BaseExtModule` и реализует интерфейс `OnModuleInit`
3. Расширения могут взаимодействовать с блокчейном через соответствующие порты
4. Конфигурации расширений хранятся в БД и описываются с помощью Zod-схем
5. Расширения регистрируются в глобальном реестре `AppRegistry`
## Структура расширения
Минимальная структура расширения включает:
- `XXX-extension.module.ts` - основной модуль расширения
- `package.json` - информация о пакете
- `README.md` - документация
- `INSTALL.md` - инструкции по установке
- `CHANGELOG.md` - история изменений
## Создание нового расширения
1. Создайте директорию для расширения в `components/controller/src/extensions/`
2. Создайте основной класс расширения, наследующийся от `BaseExtModule`
3. Определите Zod-схему для конфигурации
4. Реализуйте метод `initialize()`
5. Зарегистрируйте расширение в `extensions.registry.ts`
6. Добавьте расширение в список дефолтных приложений в `extension-domain.service.ts`
## Пример структуры модуля расширения
```typescript
// XXX-extension.module.ts
export class XXXPlugin extends BaseExtModule {
constructor(...) {
super();
}
name = 'xxx';
plugin!: ExtensionDomainEntity<IConfig>;
public configSchemas = Schema;
async initialize() {
// Инициализация расширения
// Настройка cron-задач
}
// Дополнительные методы расширения
}
@Module({
providers: [XXXPlugin],
})
export class XXXPluginModule {
constructor(private readonly xxxPlugin: XXXPlugin) {}
async initialize() {
await this.xxxPlugin.initialize();
}
}
```
## Взаимодействие с блокчейном
Для взаимодействия с блокчейном:
1. Определите порт в доменном слое (например, `SovietBlockchainPort`)
2. Инжектируйте порт в конструкторе расширения через DI
3. Используйте методы порта для взаимодействия с блокчейном
```typescript
@Inject(SOVIET_BLOCKCHAIN_PORT) private readonly sovietBlockchainPort: SovietBlockchainPort
// ...
const decisions = await this.sovietBlockchainPort.getDecisions(coopname);
```
## Настройка планировщика задач
Расширения могут использовать cron-задачи для периодического выполнения операций:
```typescript
import cron from 'node-cron';
// Регистрация cron-задачи (каждые N минут)
const cronExpression = `*/${this.plugin.config.checkInterval} * * * *`;
cron.schedule(cronExpression, () => {
this.logger.info('Запуск запланированной задачи');
this.runTask();
});
```
## Работа с конфигурацией
1. Определите Zod-схему для конфигурации
2. Используйте `describeField` для добавления UI-метаданных к полям
3. Получайте и обновляйте конфигурацию через репозиторий `extensionRepository`
```typescript
export const Schema = z.object({
checkInterval: z.number().describe(
describeField({
label: 'Интервал проверки (в минутах)',
note: 'Минимум: 5 минут',
rules: ['val >= 5'],
})
),
});
// Обновление конфигурации
this.plugin.config.lastCheckDate = new Date().toISOString();
await this.extensionRepository.update(this.plugin);
```
## Логирование действий
Расширения должны логировать свои действия:
1. Используйте `WinstonLoggerService` для системного логирования
2. Используйте `LogExtensionDomainRepository` для хранения логов в БД
```typescript
// Системное логирование
this.logger.info(`Выполнение операции для ${id}`);
// Сохранение лога в БД
await this.logExtensionRepository.push(this.name, {
type: 'operation',
timestamp: new Date().toISOString(),
data: { ... },
});
```
## Регистрация расширения
После создания расширения, добавьте его в `extensions.registry.ts`:
```typescript
export const AppRegistry: INamedExtension = {
myExtension: {
is_builtin: false,
is_internal: true,
is_available: true,
is_desktop: false,
title: 'Моё расширение',
description: 'Описание функциональности.',
image: 'https://example.com/image.png',
class: MyExtensionPluginModule,
schema: MyExtensionSchema,
tags: ['тег1', 'тег2'],
readme: getReadmeContent('./myExtension'),
instructions: getInstructionsContent('./myExtension'),
},
};
```
## Дефолтные настройки
Добавьте расширение в список дефолтных приложений в `extension-domain.service.ts`:
```typescript
getDefaultApps(): Partial<ExtensionDomainEntity>[] {
return [
// ...
{
name: 'myExtension',
enabled: true,
config: {
// Дефолтные значения конфигурации
parameter1: 'value1',
parameter2: 42,
},
},
// ...
];
}
```
+261
View File
@@ -0,0 +1,261 @@
---
description:
globs: src/**/*.ts
alwaysApply: false
---
# Фабрика Документов Кооперативов
## Общая Архитектура
Фабрика документов — это система генерации PDF документов для кооперативов, построенная на TypeScript с использованием MongoDB для хранения данных. Система состоит из трех основных частей:
1. **registry/** — JSON-шаблоны документов (статические данные)
2. **factory/** — основная фабрика с логикой генерации
3. **cooptypes/** — типы данных и интерфейсы
## Структура Registry
В корневой папке `registry/` находятся JSON файлы с номерными названиями, представляющие шаблоны документов:
### Основные документы:
- `1.walletProgramAgreement.json` — соглашение о кошельке
- `2.regulationElectronicSignature.json` — регламент электронной подписи
- `3.privacyPolicy.json` — политика конфиденциальности
- `4.userAgreement.json` — пользовательское соглашение
- `50.CoopenomicsAgreement.json` — соглашение с партнерами
- `100.participantApplication.json` — заявление участника
- `101.selectBranchStatement.json` — заявление о выборе филиала
### Документы общих собраний (300-304):
- `300.annualGeneralMeetingAgenda.json` — предложение повестки дня
- `301.annualGeneralMeetingSovietDecision.json` — протокол заседания совета
- `302.annualGeneralMeetingNotification.json` — уведомление о собрании
- `303.annualGeneralMeetingVotingBallot.json` — бюллетень для голосования
- `304.annualGeneralMeetingDecision.json` — протокол общего собрания
### Инвестиционные документы (1000+):
- `1000.investAgreement.json` — инвестиционное соглашение
- `1001.investByResultStatement.json` — заявление о зачете по результатам
- `1002.investByResultAct.json` — акт зачета по результатам
- `1005.investByMoneyStatement.json` — заявление о зачете денежных средств
### Структура JSON-шаблона:
```json
{
"context": "<div>...HTML шаблон с переменными...</div>",
"model": {...данные для примера...},
"translation": {...переводы ключей...},
"object_model": {...схема объектной модели...}
}
```
## Фабрика (factory/)
### Основные компоненты:
#### src/index.ts — Главный класс Generator
```typescript
export class Generator implements IGenerator {
// Хранилище фабрик для каждого типа документа
factories: { [K in Numbers]: DocFactory<IGenerate> }
// MongoDB коннектор
public storage: MongoDBConnector
// Основной метод генерации
async generate(data: IGenerate, options?: IGenerationOptions): Promise<IGeneratedDocument>
}
```
#### Архитектура Factory Pattern:
- Базовый класс `DocFactory<T>` в `src/Factory/index.ts`
- Каждый документ имеет свою фабрику в `src/Actions/`
- Фабрики наследуются от `DocFactory` и реализуют метод `generateDocument()`
### Сервисы:
#### Services/Generator/ — PDF генерация
- `PDFService` — конвертирует HTML в PDF через WeasyPrint
- Использует шрифт Arial (base64)
- Добавляет метаданные в PDF
- Вычисляет SHA-256 хеш документа
#### Services/Templator/ — Шаблонизация
- Основан на Nunjucks
- Поддерживает кастомное расширение `{% trans %}` для переводов
- Рендерит HTML из шаблона с подстановкой переменных
#### Services/Validator/ — Валидация
- Использует AJV для JSON Schema валидации
- Поддерживает кастомные форматы (телефон)
- Локализация ошибок на русском языке
#### Services/Databazor/ — База данных
- `MongoDBConnector` — работа с MongoDB
- `DataService` — абстракция над данными
- Коллекции: `deltas`, `actions`, `documents`, и другие
### Модели данных (src/Models/):
#### Основные типы пользователей:
- `Individual` — физические лица (ФИО, паспорт, адрес)
- `Organization` — организации (ИНН, ОГРН, представитель)
- `Entrepreneur` — ИП (ФИО + ИНН/ОГРН)
#### Кооперативные данные:
- `Cooperative` — данные кооператива
- `PaymentMethod` — платежные методы
- `Vars` — переменные кооператива
- `Project` — проекты
### Система Action-ов:
Каждый документ имеет Action класс в `src/Actions/` с методом `generateDocument()`:
1. **Получение шаблона** — из локального Registry или MongoDB
2. **Сбор данных** — пользователь, кооператив, переменные, специфичные данные
3. **Валидация** — проверка по JSON схеме
4. **Рендеринг** — HTML из шаблона + данные
5. **PDF генерация** — HTML → PDF с метаданными
6. **Сохранение** — в MongoDB (если не skip_save)
## Система типов (cooptypes/)
### cooperative/registry/ — Типы документов
Каждый документ имеет папку с интерфейсами:
- `Action` — входные данные для генерации
- `Model` — модель данных для шаблона
- `Template` — структура шаблона
### contracts/ — Блокчейн контракты
- `registrator/` — регистрация кооперативов
- `soviet/` — управление советом
- `meet/` — общие собрания
- `wallet/`, `capital/`, `fund/` — финансовые операции
## База данных MongoDB
### Основные коллекции:
#### deltas — Состояние блокчейна
```javascript
{
block_num: number,
present: boolean,
code: string, // название контракта
scope: string, // область действия
table: string, // имя таблицы
primary_key: string,
value: {...} // данные записи
}
```
#### actions — Действия блокчейна
```javascript
{
block_num: number,
account: string,
name: string, // имя действия
receiver: string,
data: {...} // данные действия
}
```
#### documents — Сгенерированные документы
```javascript
{
hash: string, // SHA-256 хеш
binary: Uint8Array, // PDF данные
html: string, // HTML исходник
meta: { // метаданные
title: string,
created_at: string,
lang: string
}
}
```
### Таблицы данных:
- `coops` — кооперативы
- `meets` — собрания
- `questions` — вопросы собраний
- `decisions` — решения совета
- `individuals` — физические лица
- `organizations` — организации
- `entrepreneurs` — ИП
- `paymentMethods` — платежные методы
- `vars` — переменные кооперативов
## Генерация документов
### Процесс генерации:
1. **Вызов** `generator.generate(action, options)`
2. **Поиск фабрики** по `registry_id`
3. **Загрузка шаблона** (локально или из БД)
4. **Сбор данных** из MongoDB по `coopname`, `username`, `block_num`
5. **Создание модели** — объединение всех данных
6. **Валидация** модели по JSON схеме
7. **Рендеринг HTML** через Nunjucks
8. **Генерация PDF** через WeasyPrint
9. **Добавление метаданных** в PDF
10. **Вычисление хеша** SHA-256
11. **Сохранение** в MongoDB
### Пример использования:
```typescript
const generator = new Generator()
await generator.connect(mongoUri)
const document = await generator.generate({
registry_id: '300',
coopname: 'voskhod',
username: 'ant',
block_num: 0,
meet: {...},
questions: [...]
})
```
## Особенности реализации
### Шаблонизация:
- HTML шаблоны с CSS стилями
- Переменные в формате `{{variable.field}}`
- Условная логика `{% if condition %}`
- Циклы `{% for item in array %}`
- Переводы `{% trans 'KEY', var1, var2 %}`
### Подписи:
- Цифровые подписи вместо физических
- Текст "Подписано электронной подписью"
- Убраны подчеркивания для подписей
### Типы собраний:
- `regular` — очередное
- `extraordinary` — внеочередное
- Условная логика в шаблонах
### Филиалы:
- `coop.is_branched` — проверка на наличие филиалов
- "пайщиков" vs "уполномоченных" в зависимости от типа
### Форматирование дат:
- Формат: "г. Москва, 15 декабря 2024 г."
- Без кавычек вокруг дат
- Запятая после города
## Тестирование
### test/utils/index.ts — Тестовые утилиты:
- `preLoading()` — инициализация тестовых данных
- Создание кооператива, пользователей, платежных методов
- Настройка данных собраний и решений
- Очистка временных файлов
### Тестовые данные:
- Кооператив "ВОСХОД"
- Пользователи: ant, individual, entrepreneur
- Организации: voskhod, branch, exampleorg
- Собрания с вопросами и решениями
Фабрика поддерживает полный цикл создания документов кооператива от заявлений до протоколов собраний с возможностью кастомизации под разные типы кооперативов и требования.
+59
View File
@@ -0,0 +1,59 @@
---
description:
globs: components/sdk/**
alwaysApply: false
---
# Руководство по работе с GraphQL Zeus в SDK
## Основной процесс
1. **Анализ DTO бэкенда**:
- Изучите структуру DTO классов (`@ObjectType`) в бэкенде
- Обратите внимание на имена типов в декораторах `@ObjectType('ИмяТипа')`
- Отметьте поля, связи и вложенные объекты
2. **Создание селекторов**:
- Для каждого DTO создайте соответствующий селектор с именем `raw<ИмяТипа>Selector`
- Селектор - это объект, где ключи соответствуют полям DTO, а значения - `true`
- Для вложенных объектов используйте вложенные селекторы: `field: nestedSelector`
- Для списков используйте один селектор без массива: `items: itemSelector`
3. **Валидация селекторов**:
- Для каждого селектора создайте проверку типа:
```typescript
const _validate: MakeAllFieldsRequired<ValueTypes['ТочноеИмяГрафКьЭлТипа']> = rawSelector
```
- Имя типа должно точно совпадать с именем в декораторе `@ObjectType`
4. **Экспорт селекторов**:
- Создайте финальный селектор с помощью функции `Selector`:
```typescript
export const typeSelector = Selector('ТочноеИмяГрафКьЭлТипа')(rawTypeSelector)
```
- Экспортируйте сырой селектор для переиспользования
- Экспортируйте тип модели: `export type modelType = ModelTypes['ТочноеИмяГрафКьЭлТипа']`
5. **Создание запросов/мутаций**:
- Используйте селекторы в запросах и мутациях:
```typescript
export const query = Selector('Query')({
queryName: [{ data: $('data', 'ТочноеИмяВходногоТипа!') }, exportedSelector]
})
```
- Для параметров используйте оператор `$` с точным именем входного типа
- Создайте интерфейс входных данных:
```typescript
export interface IInput {
data: ModelTypes['ТочноеИмяВходногоТипа']
}
```
## Особенности работы
- **Документы**: всегда сохраняйте структуру `{ hash, signatures, rawDocument }`
- **Сложные DTO**: разбивайте на атомарные селекторы и комбинируйте их
- **Типы в Zeus**: часто отличаются от имен классов в бэкенде, всегда проверяйте в `schema.gql`
- **Массивы**: Zeus автоматически обрабатывает массивы, не используйте `[selector]`
Это руководство поможет правильно структурировать работу с SDK и избежать типичных ошибок при работе с Zeus.
+20
View File
@@ -0,0 +1,20 @@
---
globs: notifications/src/workflows/**/*.ts
---
# Правила валидации воркфлоу
## 🚫 ID воркфлоу
- **Длина ID не должна превышать 32 символа**
- Используйте описательные, но короткие идентификаторы малыми латинскими буквами и тире.
## 🚫 Условия в шаблонах
- **Запрещено использовать JavaScript выражения в шаблонах Novu**
- Нельзя использовать:
- Тернарные операторы: `{{condition ? "text1" : "text2"}}`
- Логические операторы: `{{field && "text"}}`
- Любые другие JS конструкции
## ✅ Рекомендации
- Добавляйте текстовые поля в payload для условной логики
- Вычисляйте значения на стороне сервера перед отправкой уведомления
- Используйте только простые переменные: `{{payload.fieldName}}`
+3
View File
@@ -0,0 +1,3 @@
node_modules
dist
+122
View File
@@ -0,0 +1,122 @@
name: Build Docker Images
on:
push:
branches:
- testnet
tags:
- '*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
ref: ${{ github.ref }}
fetch-depth: 0
- name: Debug info
run: |
echo "Текущая ветка:"
git branch --show-current
echo "Последние коммиты:"
git log -n 3 --oneline
echo "Проверяем файлы в директории components/desktop/src-ssr:"
ls -la components/desktop/src-ssr/ || echo "Директория не найдена!"
echo "Проверяем файлы в middlewares:"
ls -la components/desktop/src-ssr/middlewares/ || echo "Директория middlewares не найдена!"
- name: Set docker tag
run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then
echo "DOCKER_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
else
echo "DOCKER_TAG=latest" >> $GITHUB_ENV
fi
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# Сначала собираем базовый образ с runtime
- name: Build base image
run: |
docker build --target runtime -t dicoop/mono-base:${{ env.DOCKER_TAG }} .
docker push dicoop/mono-base:${{ env.DOCKER_TAG }}
# Создаем сервисные образы на основе базового
- name: Build desktop image
run: |
echo "FROM dicoop/mono-base:${{ env.DOCKER_TAG }}" > Dockerfile.desktop
echo "CMD [\"pnpm\", \"-F\", \"@coopenomics/desktop\", \"run\", \"start\"]" >> Dockerfile.desktop
docker build -t dicoop/desktop:${{ env.DOCKER_TAG }} -f Dockerfile.desktop .
docker push dicoop/desktop:${{ env.DOCKER_TAG }}
- name: Build controller image
run: |
echo "FROM dicoop/mono-base:${{ env.DOCKER_TAG }}" > Dockerfile.coopback
echo "CMD [\"pnpm\", \"-F\", \"@coopenomics/controller\", \"run\", \"start\"]" >> Dockerfile.coopback
docker build -t dicoop/coopback:${{ env.DOCKER_TAG }} -f Dockerfile.coopback .
docker push dicoop/coopback:${{ env.DOCKER_TAG }}
- name: Build parser image
run: |
echo "FROM dicoop/mono-base:${{ env.DOCKER_TAG }}" > Dockerfile.cooparser
echo "CMD [\"pnpm\", \"-F\", \"@coopenomics/parser\", \"run\", \"start\"]" >> Dockerfile.cooparser
docker build -t dicoop/cooparser:${{ env.DOCKER_TAG }} -f Dockerfile.cooparser .
docker push dicoop/cooparser:${{ env.DOCKER_TAG }}
- name: Build notificator image
run: |
echo "FROM dicoop/mono-base:${{ env.DOCKER_TAG }}" > Dockerfile.notificator
echo "CMD [\"pnpm\", \"-F\", \"coop-notificator\", \"run\", \"start\"]" >> Dockerfile.notificator
docker build -t dicoop/notificator:${{ env.DOCKER_TAG }} -f Dockerfile.notificator .
docker push dicoop/notificator:${{ env.DOCKER_TAG }}
- name: Build notifications image
run: |
echo "FROM dicoop/mono-base:${{ env.DOCKER_TAG }}" > Dockerfile.notifications
echo "CMD [\"pnpm\", \"-F\", \"@coopenomics/notifications\", \"run\", \"sync\"]" >> Dockerfile.notifications
docker build -t dicoop/notifications:${{ env.DOCKER_TAG }} -f Dockerfile.notifications .
docker push dicoop/notifications:${{ env.DOCKER_TAG }}
# Отправка хука для деплоя
- name: Trigger deployment webhook
if: ${{ success() }}
run: |
if [[ $GITHUB_REF == refs/tags/latest ]]; then
# Хук для тестнета
curl -X POST ${{ vars.TESTNET_WEBHOOK_URL }} \
-H 'Content-Type: application/json' \
-d '${{ env.DOCKER_TAG }}'
elif [[ $GITHUB_REF == refs/tags/* ]]; then
# Хук для продакшена
curl -X POST ${{ vars.PRODUCTION_WEBHOOK_URL }} \
-H 'Content-Type: application/json' \
-d '${{ env.DOCKER_TAG }}'
else
# Хук для тестнета (обычная ветка)
curl -X POST ${{ vars.TESTNET_WEBHOOK_URL }} \
-H 'Content-Type: application/json' \
-d '${{ env.DOCKER_TAG }}'
fi
# Уведомление в Telegram об успехе
- name: Telegram notify success
if: ${{ success() }}
run: |
curl -s -X POST https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage \
-d chat_id=${{ secrets.TELEGRAM_CHAT_ID }} \
-d text="✅ [GITHUB MONO] Успешная сборка контейнеров: $GITHUB_REPOSITORY ($GITHUB_REF) [${{ env.DOCKER_TAG }}]"
# Уведомление в Telegram об ошибке
- name: Telegram notify failure
if: ${{ failure() }}
run: |
curl -s -X POST https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage \
-d chat_id=${{ secrets.TELEGRAM_CHAT_ID }} \
-d text="❌ [GITHUB MONO] Ошибка при сборке контейнеров: $GITHUB_REPOSITORY ($GITHUB_REF) [${{ env.DOCKER_TAG }}]"
@@ -0,0 +1,18 @@
# .github/workflows/trigger-coopenomics.yml
name: Trigger Contracts Docs Deploy
on:
push:
branches: [dev, testnet, main, capital] # или когда нужно триггерить
jobs:
trigger-coopenomics:
runs-on: ubuntu-latest
steps:
- name: Trigger Coopenomics deployment
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ secrets.COOPENOMICS_PAT }}
repository: coopenomics/coopenomics # укажи правильный owner/repo
event-type: deploy_from_mono
client-payload: '{"repository": "${{ github.repository }}", "sha": "${{ github.sha }}", "ref": "${{ github.ref }}", "actor": "${{ github.actor }}"}'
+93
View File
@@ -0,0 +1,93 @@
name: Publish Docs
on:
push:
branches:
- main
jobs:
build-and-publish-docs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 20
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install pnpm
run: npm install -g pnpm
- name: Install Python requirements
run: |
python -m venv venv
source venv/bin/activate
pip install mkdocs-material mkdocs-macros-plugin mkdocs-section-index pymdown-extensions
working-directory: ./components/docs
- name: Install Node.js dependencies
run: pnpm install
working-directory: ./components/docs
- name: Patch spectaql-config.yml for CI
run: |
sed -i.bak "0,/url:.*/s|url:.*|url: 'https://testnet.coopenomics.world/backend/v1/graphql'|" spectaql-config.yml
working-directory: ./components/controller
- name: Show patched spectaql-config.yml
run: cat spectaql-config.yml
working-directory: ./components/controller
- name: Build cooptypes
run: pnpm run build
working-directory: ./components/cooptypes
- name: Generate controller docs
run: pnpm run docs
working-directory: ./components/controller
- name: Copy controller docs
run: |
mkdir -p ./components/docs/docs/graphql
cp -r ./components/controller/docs/* ./components/docs/docs/graphql/
- name: Generate sdk docs
run: pnpm run docs
working-directory: ./components/sdk
- name: Copy sdk docs
run: |
mkdir -p ./components/docs/docs/sdk
cp -r ./components/sdk/docs/* ./components/docs/docs/sdk/
- name: Generate cooptypes docs
run: pnpm run docs
working-directory: ./components/cooptypes
- name: Copy cooptypes docs
run: |
mkdir -p ./components/docs/docs/cooptypes
cp -r ./components/cooptypes/docs/* ./components/docs/docs/cooptypes/
- name: Build docs (mkdocs)
run: |
source venv/bin/activate
mkdocs build
working-directory: ./components/docs
- name: Publish to GitHub Pages
run: npx gh-pages --nojekyll -d site --repo https://x-access-token:${GITHUB_TOKEN}@github.com/coopenomics/mono.git
working-directory: ./components/docs
env:
GIT_AUTHOR_NAME: github-actions
GIT_AUTHOR_EMAIL: github-actions@github.com
GIT_COMMITTER_NAME: github-actions
GIT_COMMITTER_EMAIL: github-actions@github.com
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+33
View File
@@ -0,0 +1,33 @@
name: Publish Packages
on:
push:
tags:
- '*'
jobs:
build-and-publish:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 20
registry-url: 'https://registry.npmjs.org'
- name: Install pnpm
run: npm install -g pnpm
- name: Install dependencies
run: pnpm install
- name: Build all packages
run: pnpm lerna run build
- name: Publish to npm
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: pnpm lerna publish from-package --yes --no-verify-access
+9
View File
@@ -1,2 +1,11 @@
node_modules/
lerna-debug.log
components/controller/graph.png
blockchain-data/
scripts/changelog-prompt.md
scripts/changelog-release.md
scripts/release-info.md
components/docs/docs/sdk
dist/
.env
.DS_Store
+7
View File
@@ -0,0 +1,7 @@
{
"recommendations": [
"vue.volar",
"vue.vscode-typescript-vue-plugin"
]
}
+71
View File
@@ -0,0 +1,71 @@
{
"editor.bracketPairColorization.enabled": true,
"editor.guides.bracketPairs": true,
"editor.tabCompletion": "onlySnippets",
"editor.defaultFormatter": "esbenp.prettier-vscode",
"eslint.run": "onType",
"eslint.validate": ["javascript", "typescript", "vue"],
"i18n-ally.localesPaths": ["src/i18n"],
"typescript.format.enable": true,
"typescript.format.indentSwitchCase": false,
"typescript.validate.enable": true,
"notebook.defaultFormatter": "Vue.volar",
// Оптимизация для монорепозитория
"typescript.preferences.useAliasesForRenames": false,
"typescript.preferences.includePackageJsonAutoImports": "on",
"typescript.suggest.autoImports": true,
"typescript.suggest.paths": true,
"typescript.updateImportsOnFileMove.enabled": "always",
"typescript.workspaceSymbols.scope": "currentProject",
// Настройки для снижения нагрузки
"files.watcherExclude": {
"**/node_modules/**": true,
"**/dist/**": true,
"**/.git/objects/**": true,
"**/.git/subtree-cache/**": true,
"**/node_modules/*/**": true,
"**/.cache/**": true,
"**/.quasar/**": true,
"**/*.tsbuildinfo": true
},
"search.exclude": {
"**/node_modules": true,
"**/dist": true,
"**/.cache": true,
"**/.quasar": true,
"**/*.tsbuildinfo": true
},
"files.exclude": {
"**/.cache": true,
"**/*.tsbuildinfo": true,
"**/node_modules/.cache": true
},
// TypeScript server настройки для монорепозитория
"typescript.tsserver.maxTsServerMemory": 8192,
"typescript.tsserver.watchOptions": {
"excludeDirectories": [
"**/node_modules",
"**/dist",
"**/.cache",
"**/.quasar",
"**/build"
]
},
// Использовать локальный TypeScript из монорепо
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true,
// КРИТИЧЕСКИ ВАЖНО: включить project references для монорепозитория
"typescript.tsserver.useSyntaxServer": "auto",
"typescript.tsserver.experimental.enableProjectDiagnostics": true,
// Оптимизация для больших монорепозиториев
"typescript.disableAutomaticTypeAcquisition": true,
"typescript.surveys.enabled": false
}
+371
View File
@@ -0,0 +1,371 @@
# v2025.9.1
В системе Кооперативной Экономики развернут смарт-контракт CAPITAL v0.2 для генерации и капитализации результатов интеллектуальной деятельности. Контракт описывает и обеспечивает:
- бизнес-процесс производства результатов интеллектуальной деятельности в кооперативах создателями, авторами, инвесторами, координаторами, мастерами и собственниками имущества в кооперации на проектах;
- приём результатов интеллектуальной деятельности в качестве паевых взносов в кооператив;
- распределение потока членских взносов среди вкладчиков;
- капитализацию результатов интеллектуальной деятельности новыми результатами по модели золотого сечения;
- оценку вкладов авторов и создателей по методу Водянова;
В основе математической модели контракта лежит принцип распределения справедливой выгоды между вкладчиками согласно концепции "Общественно-полезного времени", разработанной в рамках теорий Кузнецова и академика Глушкова при работе над проектом общегосударственной автоматизированной системы учета и обработки информации (ОГАС).
Подробнее в документации: https://coopenomics.world/contracts/group__public__capital.html
✨ Новые функции
- [#301](https://github.com/coopenomics/mono/issues/301): Реализация контракта "Капитализация" v0.2: регистрация вкладчиков, создание и управление проектами, поддержка инвестиций, ссуд, членских взносов, проведение голосований, расчет капитализации, интеграция с внешними контрактами, поддержка импорта данных.
#releases
---
# v2025.7.1-1
В этом релизе реализованы механизмы возврата паевого взноса пайщика и инструменты управления этим процессом для членов совета. Также внесены визуальные доработки интерфейсов для улучшения восприятия информации.
✨ Новые функции
- [#276](https://github.com/coopenomics/mono/issues/276): Реализовать путь возврата паевого взноса из кошелька пайщика
- [#281](https://github.com/coopenomics/mono/issues/281): Генерация заявления на возврат паевого взноса
- [#282](https://github.com/coopenomics/mono/issues/282): Генерация решения совета на возврат паевого взноса
- [#278](https://github.com/coopenomics/mono/issues/278): Введение методов управления возвратами паевых взносов в контроллере
- [#279](https://github.com/coopenomics/mono/issues/279): Отобразить исходящие платежи с кнопками управления в реестре платежей для совета
🐛 Исправления ошибок
- [#286](https://github.com/coopenomics/mono/issues/286): Поправить ошибки склонений времени
- [#262](https://github.com/coopenomics/mono/issues/262): Баг: рабочий стол совета включается, однако, страница всегда открывается со стола пайщика
- [#261](https://github.com/coopenomics/mono/issues/261): Баг: первая загрузка переадресует на главную страницу всегда - прямой переход на собрание становится недоступен.
🔧 Улучшения
- [#285](https://github.com/coopenomics/mono/issues/285): Корректировка дизайна кошелька, профиля, повестки совета, реестра документов, реестра платежей
- [#284](https://github.com/coopenomics/mono/issues/284): Разместить кошелек на главную вместо профиля
- [#283](https://github.com/coopenomics/mono/issues/283): Ввести лоадер на переходе между рабочими столами
- [#280](https://github.com/coopenomics/mono/issues/280): Мигрировать имеющиеся данные о входящих платежах в новую модель
- [#277](https://github.com/coopenomics/mono/issues/277): Рефакторинг модуля платежей: переход на унифицированную модель входящего и исходящего платежа
#releases
---
# v2025.6.14
Разработан модуль для проведения очередных общих собраний пайщиков. Исправлены баги, внесены улучшения пользовательского интерфейса.
✨ Новые функции
- [#264](https://github.com/coopenomics/mono/issues/264): Разработан смарт-контракт общего собрания пайщиков (meet)
- [#263](https://github.com/coopenomics/mono/issues/263): Реализован модуль оповещений на электронные почты по жизненному циклу общего собрания пайщиков
- [#273](https://github.com/coopenomics/mono/issues/273): Встроены реальные шаблоны документов общего собрания
- [#268](https://github.com/coopenomics/mono/issues/268): Добавлена страница результатов общего собрания
- [#267](https://github.com/coopenomics/mono/issues/267): Добавлена страница просмотра и скачивания бюллетеней и уведомлений по собранию
- [#270](https://github.com/coopenomics/mono/issues/270): Ссылка в оповещении ведет на страницу собрания с документом-уведомлением для подписи
🐛 Исправления ошибок
- [#262](https://github.com/coopenomics/mono/issues/262): Исправлено некорректное открытие рабочего стола совета
- [#261](https://github.com/coopenomics/mono/issues/261): Исправлена ошибка с редиректом при первой загрузке и прямом переходе на собрание
- [#259](https://github.com/coopenomics/mono/issues/259): Исправлены отступы в мобильной карточке пайщика
- [#258](https://github.com/coopenomics/mono/issues/258): Убран hover-эффект на документе и пайщике в таблице
🔧 Улучшения
- [#274](https://github.com/coopenomics/mono/issues/274): Настроена рассылка оповещений на почту при получении решения о проведении собрания
- [#272](https://github.com/coopenomics/mono/issues/272): Подписанные уведомления сохраняются и извлекаются из реестра по Graph-QL
- [#271](https://github.com/coopenomics/mono/issues/271): Ведется подсчет количества пайщиков в каждом кооперативе при добавлении и удалении
- [#260](https://github.com/coopenomics/mono/issues/260): Введен счетчик количества пайщиков в кооперативе на контракте регистратора
- [#256](https://github.com/coopenomics/mono/issues/256): Отображается статус членства каждого пайщика
- [#255](https://github.com/coopenomics/mono/issues/255): В разделе Платежи отображается ФИО/Наименование плательщика
- [#269](https://github.com/coopenomics/mono/issues/269): Реализована рассылка уведомлений перед началом собрания
- [#265](https://github.com/coopenomics/mono/issues/265): Проведена отладка и тестирование процесса общего собрания пайщиков
- [#266](https://github.com/coopenomics/mono/issues/266): Протестированы все процессы общего собрания
#releases
---
# v2025.5.14
В этом релизе реализован новый стандарт передачи и хранения документов по блокчейну с поддержкой неограниченного количества подписей и их валидацией. Также внесены улучшения в интерфейс и исправлены ошибки.
✨ Новые функции
- [#252](https://github.com/coopenomics/mono/issues/252): Внедрение обновленного стандарта хранения и передачи документов по блокчейну
- [#251](https://github.com/coopenomics/mono/issues/251): Реализация версионированного мигратора данных для контроллера кооператива
- [#244](https://github.com/coopenomics/mono/issues/244): Обновление стандарта сборки документов и переход на хэш-идентификаторы
🐛 Исправления ошибок
- [#249](https://github.com/coopenomics/mono/issues/249): Исправлена спутанная маршрутизация между рабочими столами кооперативов
- [#253](https://github.com/coopenomics/mono/issues/253): Исправлена избыточная точность суммы оплаты в заявлении на вступление
🔧 Улучшения
- [#259](https://github.com/coopenomics/mono/issues/259): Исправлены отступы в мобильной карточке пайщика на странице пайщиков
- [#258](https://github.com/coopenomics/mono/issues/258): Удалён hover-эффект для документов и пайщиков в таблице
- [#257](https://github.com/coopenomics/mono/issues/257): Добавлено сохранение светлой/тёмной темы в localStorage и восстановление при загрузке страницы
- [#256](https://github.com/coopenomics/mono/issues/256): Отображение статуса членства каждого пайщика в разделе "Пайщики"
- [#255](https://github.com/coopenomics/mono/issues/255): Отображение ФИО/Наименования плательщика в разделе "Платежи"
#releases
---
# v2025.5.2
В этом релизе рабочие столы переведены на серверный рендеринг, что улучшает стабильность развертывания и упрощает автоматизацию поставки ПО. Данный релиз является подготовительным к переходу на новый стандарт цифровых документов на платформе.
✨ Новые функции
- [#245](https://github.com/coopenomics/mono/issues/245): Перевод десктопа на серверный рендеринг с поддержкой динамических переменных окружения
🐛 Исправления ошибок
- [#247](https://github.com/coopenomics/mono/issues/247): Исправлен баг с повторной поставкой ПО при обрывах соединения между серверами
🔧 Улучшения
- [#246](https://github.com/coopenomics/mono/issues/246): Перевод CI/CD на сборку и поставку предсобранных докер-контейнеров
#releases
---
# MONO v2025.4.29
В этом релизе реализована новая архитектура рабочих столов с установкой через маркетплейс. Добавлены стол пайщика и стол совета, переработаны разделы документов и подписей, улучшено разделение кошелька и профиля для повышения удобства пользователей.
✨ Новые функции
- [#234](https://github.com/coopenomics/mono/issues/234): Маркетплейс рабочих столов с поддержкой разных ролей и микросервисной архитектурой
- [#238](https://github.com/coopenomics/mono/issues/238): Контроллер общего собрания пайщиков с поддержкой документооборота и подписей
- [#233](https://github.com/coopenomics/mono/issues/233): Минимальный смарт-контракт общих собраний пайщиков
- [#232](https://github.com/coopenomics/mono/issues/232): Бэкенд полного обозревателя блоков
🐛 Исправления ошибок
- [#231](https://github.com/coopenomics/mono/issues/231): Исправления ошибок регистрации, выхода из системы, отображения платежей и редактирования организации
🔧 Улучшения
- [#243](https://github.com/coopenomics/mono/issues/243): Контроль прав доступа на получении документов пайщика
- [#242](https://github.com/coopenomics/mono/issues/242): Бесконечный скролл на документах пайщика и кооператива
- [#241](https://github.com/coopenomics/mono/issues/241): Раздел "Документы" для пайщика
- [#240](https://github.com/coopenomics/mono/issues/240): Множественные подписи на одном документе
- [#239](https://github.com/coopenomics/mono/issues/239): Последовательные методы подписи протокола общего собрания
- [#237](https://github.com/coopenomics/mono/issues/237): Мобильная вёрстка на страницах стола совета
- [#236](https://github.com/coopenomics/mono/issues/236): Пересобран лендинг для MONO
- [#235](https://github.com/coopenomics/mono/issues/235): Настроен флоу гитхаб-релизов с описаниями
- [#226](https://github.com/coopenomics/mono/issues/226): Встроено редактирование пайщиков
- [#224](https://github.com/coopenomics/mono/issues/224): Добавлено ТЗ по контракту капитализации
---
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.2.10](https://github.com/coopenomics/mono/compare/v2.2.9...v2.2.10) (2025-03-27)
### Bug Fixes
* add Zeus type ([7bcb6e3](https://github.com/coopenomics/mono/commit/7bcb6e30a77b0ab89c5293188b58f08f19c8761e))
## [2.2.9](https://github.com/coopenomics/mono/compare/v2.2.8...v2.2.9) (2025-03-12)
**Note:** Version bump only for package monocoop
## [2.2.8](https://github.com/coopenomics/monocoop/compare/v2.2.7...v2.2.8) (2025-02-10)
**Note:** Version bump only for package monocoop
## [2.2.7](https://github.com/coopenomics/monocoop/compare/v2.2.6...v2.2.7) (2025-02-07)
**Note:** Version bump only for package monocoop
## [2.2.6](https://github.com/coopenomics/monocoop/compare/v2.2.6-alpha.0...v2.2.6) (2025-01-27)
**Note:** Version bump only for package monocoop
## [2.2.5](https://github.com/coopenomics/monocoop/compare/v2.2.4...v2.2.5) (2025-01-18)
**Note:** Version bump only for package monocoop
## [2.2.4](https://github.com/coopenomics/monocoop/compare/v2.2.0...v2.2.4) (2025-01-17)
**Note:** Version bump only for package monocoop
## [2.2.3](https://github.com/coopenomics/monocoop/compare/v2.2.0...v2.2.3) (2025-01-16)
**Note:** Version bump only for package monocoop
## [2.2.1](https://github.com/coopenomics/monocoop/compare/v2.2.0...v2.2.1) (2025-01-14)
**Note:** Version bump only for package monocoop
## [2.1.9](https://github.com/coopenomics/monocoop/compare/v2.1.8...v2.1.9) (2025-01-14)
**Note:** Version bump only for package monocoop
## [2.1.8](https://github.com/coopenomics/monocoop/compare/v2.1.6...v2.1.8) (2024-12-24)
**Note:** Version bump only for package monocoop
## [2.1.7](https://github.com/coopenomics/monocoop/compare/v2.1.6...v2.1.7) (2024-12-03)
**Note:** Version bump only for package monocoop
## [2.1.6](https://github.com/coopenomics/monocoop/compare/v2.1.5...v2.1.6) (2024-10-30)
**Note:** Version bump only for package monocoop
## [2.1.5](https://github.com/coopenomics/monocoop/compare/v2.1.4...v2.1.5) (2024-10-28)
**Note:** Version bump only for package monocoop
## [2.1.4](https://github.com/coopenomics/monocoop/compare/v2.1.4-alpha.2...v2.1.4) (2024-10-28)
**Note:** Version bump only for package monocoop
## [2.1.3](https://github.com/coopenomics/monocoop/compare/v2.1.2-alpha.10...v2.1.3) (2024-10-26)
## [2.1.2](https://github.com/coopenomics/monocoop/compare/v2.1.1...v2.1.2) (2024-10-19)
**Note:** Version bump only for package monocoop
## [2.1.2](https://github.com/coopenomics/monocoop/compare/v2.1.1...v2.1.2) (2024-10-19)
**Note:** Version bump only for package monocoop
# [2.1.0](https://github.com/coopenomics/monocoop/compare/v2.0.10-alpha.3...v2.1.0) (2024-10-13)
### Features
* запрос соглашений ([9a6a72f](https://github.com/coopenomics/monocoop/commit/9a6a72f605ba52eef2ed6f18ccee6fbed287ea00))
## [2.0.9](https://github.com/coopenomics/monocoop/compare/v2.0.8...v2.0.9) (2024-10-10)
**Note:** Version bump only for package monocoop
## [2.0.8](https://github.com/coopenomics/monocoop/compare/v2.0.7...v2.0.8) (2024-10-09)
**Note:** Version bump only for package monocoop
## [2.0.7](https://github.com/coopenomics/monocoop/compare/v2.0.6...v2.0.7) (2024-09-30)
**Note:** Version bump only for package monocoop
## [2.0.6](https://github.com/coopenomics/monocoop/compare/v2.0.5...v2.0.6) (2024-09-30)
**Note:** Version bump only for package monocoop
## [2.0.5](https://github.com/coopenomics/monocoop/compare/v2.0.5-alpha.0...v2.0.5) (2024-09-30)
**Note:** Version bump only for package monocoop
## [2.0.2](https://github.com/coopenomics/monocoop/compare/v2.0.2-alpha.1...v2.0.2) (2024-09-29)
**Note:** Version bump only for package monocoop
# 2.1.0 (2024-09-29)
### Bug Fixes
* **importers:** исправлена ошибка в импорте модуля @wharfkit/contract ([bf89032](https://github.com/coopenomics/monocoop/commit/bf89032d8f66444804a2521f4eb96ffc75b0f605))
* **terminal:** исправлен шрифт в README ([889447a](https://github.com/coopenomics/monocoop/commit/889447a93ceadb577613ddb5b1cb2ef1cc3d54b6))
* **terminal:** исправлено описание проекта ([989b318](https://github.com/coopenomics/monocoop/commit/989b3180ded99a871e018cf26e6c493449223c01))
* **terminal:** fix typo in README.md ([fdf9996](https://github.com/coopenomics/monocoop/commit/fdf999619d2d69e960b062fe6815f5b057c95f48))
### Features
* добавлен docker-compose.yaml ([6a46697](https://github.com/coopenomics/monocoop/commit/6a46697c9d6cc3cde14dbce8f70997c00f9850de))
* **package:** добавлен скрипт gpt-commit для удобного коммита ([e0b5107](https://github.com/coopenomics/monocoop/commit/e0b510799bb0ac68890d572deb652beefd0651c4))
* **terminal:** добавлена поддержка новых команд ([73e4ca2](https://github.com/coopenomics/monocoop/commit/73e4ca226acebcbea3ae59a62def99d86efb1353))
+39
View File
@@ -0,0 +1,39 @@
k# Conventional Commits
### Основные типы коммитов:
- **`feat`**: Добавление новой функциональности (feature).
- Пример: `feat: добавлена возможность загрузки файлов`
- **`fix`**: Исправление бага.
- Пример: `fix: исправлена ошибка отображения кнопки на мобильных устройствах`
- **`chore`**: Изменения, не влияющие на исходный код (например, обновление зависимостей или инструментария).
- Пример: `chore: обновление зависимостей`
- **`docs`**: Изменения в документации.
- Пример: `docs: обновлено руководство пользователя`
- **`style`**: Изменения стиля кода, не влияющие на его функциональность (форматирование, пробелы, и т.д.).
- Пример: `style: исправлены отступы в коде`
- **`refactor`**: Изменения в коде, которые не исправляют баги и не добавляют новую функциональность.
- Пример: `refactor: улучшена структура класса`
- **`perf`**: Изменения, направленные на улучшение производительности.
- Пример: `perf: оптимизирована работа с массивами`
- **`test`**: Добавление или изменение тестов.
- Пример: `test: добавлен тест для проверки функции отправки сообщений`
### Дополнительные типы коммитов:
- **`build`**: Изменения, связанные с процессом сборки или зависимостями.
- Пример: `build: обновление конфигурации Webpack`
- **`ci`**: Изменения, касающиеся настроек непрерывной интеграции (например, Travis, Jenkins).
- Пример: `ci: настройка Travis для автоматических сборок`
- **`revert`**: Откат на предыдущие изменения.
- Пример: `revert: откат коммита e0b5107`
+43
View File
@@ -0,0 +1,43 @@
FROM node:20-alpine AS builder
WORKDIR /app
# Сразу копируем все файлы
COPY . .
# Устанавливаем инструменты
RUN npm install -g pnpm lerna
# Установка зависимостей
# Используем версию pnpm, совместимую с существующим lock-файлом
RUN pnpm install
# Установка системных зависимостей для WeasyPrint
RUN apk add --no-cache \
python3 \
py3-pip \
gcc \
musl-dev \
python3-dev \
pango \
zlib-dev \
jpeg-dev \
openjpeg-dev \
g++ \
libffi-dev \
harfbuzz-subset \
&& python3 -m venv /venv \
&& /venv/bin/pip install WeasyPrint==62.3 \
&& rm -rf /var/cache/*
# Сборка всех компонентов
RUN lerna run build
# Финальный образ
FROM builder AS runtime
# Настройка переменных окружения
ENV PATH="/venv/bin:$PATH"
# Проверка WeasyPrint
RUN weasyprint --version
+134 -3
View File
@@ -1,4 +1,135 @@
# MONOCOOP
# MONO
Моно-репозиторий компонент Цифрового Кооператива.
Система управления взаимоотношениями в кооперативе. Включает в себя полный комплект программного обеспечения для подключения к платформе "Кооперативная Экономика" и управления взаимоотношениями с пайщиками в кооперативе и самим кооперативом на основе смарт-контрактов и простой электронной подписи.
## Ветки
- Для разработки используется ветка `dev`.
- Для стейджа используется ветка `testnet`.
- Для продакшена используется ветка `main`.
## Установка
```sh
pnpm install
```
Также для работы потребуется установленная фабрика документов `weasyprint` для вашей операционной системы: <https://doc.courtbouillon.org/weasyprint/stable/first_steps.html#installation>
## Конфигурация
Для конфигурации потребуетcя установленный `docker` и `docker-compose`. Выполните команду и следуйте инструкциям:
```sh
pnpm run setup
```
## Запуск
### Инфраструктура
Для работы системы необходимы базы `mongo`, `postgres` и `redis`.
Команда запуска баз данных в контейнерах для работы в фоновом режиме:
```sh
docker compose up -d
```
### Блокчейн и контракты
```sh
pnpm boot
```
Команда запустит блокчейн и установит все смарт-контракты, подготовив систему к локальной разработке или применению.
### Бэкенд
```sh
pnpm run dev:backend
```
Команда запустит набор сервисов бэкенда и точку доступа GraphQL-API на 2998 порту.
### Фронтенд
Команда запустит рабочий стол кооператива на 3005 порту:
```sh
pnpm run dev:desktop
```
### Очистка базы
Команда очистит базу mongodb и начнет производство блоков с начала:
```sh
pnpm run clear
```
Правильная последовательность команд при переустановке проекта "с нуля":
```sh
git pull
pnpm install
pnpm run setup
pnpm run clear
pnpm run boot
pnpm run dev:backend
pnpm run dev:desktop
```
### Кошелёк
Для работы с кошельком блокчейна используется утилита cleos, которая позволяет извлекать таблицы смарт-контрактов и отправлять транзакции в блокчейн если это требуется.
Для работы с командным кошельком `cleos` локально необходимо чтобы инфраструктура была поднята:
```
docker compose up -d
```
Запускаем контейнер с кошельком и входим в него командой:
```
pnpm run cleos
```
В кошельке уже находится дефолтный ключ для работы с локальной средой. Этот ключ зашифрован паролем. Пароль хранится в файле `password` и используется автоматически при разблокировке. Для разблокировки кошелька, находясь в контейнере выполняем:
```
./unlock.sh
```
Для использования кошелька выполняем:
```
./cleos.sh <command>
```
Для получения полного списка команд вызываем кошелек без команд:
```
./cleos.sh
```
Например, для получения информации о текущем состоянии блокчейна:
```
./cleos.sh get info
```
### Возможные проблемы
В случае, если при выполнении ./unlock.sh возникает проблема:
`Unable to connect to keosd, if keosd is running please kill the process and try again`, то выполните команду:
```
./reset.sh
```
Данная команда удалит созданный ранее сокет кошелька, после чего, выполните ./unlock.sh повторно.
## Лицензия
Продукт Потребительского Кооператива "ВОСХОД" распространяется по лицензии BY-NC-SA 4.0.
Разрешено делиться, копировать и распространять материал на любом носителе и форме, адаптировать, делать ремиксы, видоизменять и создавать новое, опираясь на этот материал. При использовании, Вы должны обеспечить указание авторства, предоставить ссылку, и обозначить изменения, если таковые были сделаны. Если вы перерабатываете, преобразовываете материал или берёте его за основу для производного произведения, вы должны распространять переделанные вами части материала на условиях той же лицензии , в соответствии с которой распространяется оригинал. Запрещено коммерческое использование материала. Использование в коммерческих целях – это использование, в первую очередь направленное на получение коммерческого преимущества или денежного вознаграждения.
Юридический текст лицензии: <https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.ru>
+129
View File
@@ -0,0 +1,129 @@
# 📋 Резюме создания компонентов Notifications
## ✅ Что создано
### 1. 📚 Библиотека `@monocoop/notifications`
**Расположение:** `components/notifications/`
**Функции:**
- ✅ Типизированные интерфейсы для workflow с Zod
- ✅ Builder паттерн для создания workflow
- ✅ Базовые шаблоны для email, in-app, push, SMS
- ✅ Автоматическая конвертация Zod схем в JSON Schema для Novu
- ✅ Экспорт всех workflow для использования в других пакетах
**Структура:**
```
src/
├── types/ # Базовые типы и интерфейсы
├── base/ # Утилиты и настройки по умолчанию
├── workflows/ # Папки с workflow
│ └── welcome/ # Пример приветственного workflow
└── index.ts # Главный экспорт
```
### 2. 🚀 NestJS приложение `@monocoop/notificator2`
**Расположение:** `components/notificator2/`
**Функции:**
- ✅ Автоматический upsert всех workflow в Novu при запуске
- ✅ RESTful API для триггера уведомлений
- ✅ Типизированная валидация payload
- ✅ Health check endpoints
- ✅ Использует библиотеку notifications для типов
**API Endpoints:**
- `GET /api/notifications/health` - Health check
- `GET /api/notifications/workflows` - Список workflow
- `POST /api/notifications/trigger` - Универсальный триггер
- `POST /api/notifications/trigger/welcome` - Триггер welcome workflow
- `POST /api/notifications/workflows/upsert-all` - Принудительный upsert
## 🔧 Как использовать
### 1. Настройка библиотеки notifications
```bash
cd components/notifications
pnpm install # или npm install
pnpm build # для компиляции TypeScript
```
### 2. Настройка notificator2
```bash
cd components/notificator2
pnpm install # или npm install
# Настройка окружения
cp .env.example .env
# Добавить NOVU_API_KEY в .env
# Запуск
pnpm start:dev
```
### 3. Добавление нового workflow
**В библиотеке notifications:**
```typescript
// components/notifications/src/workflows/order/order-workflow.ts
export const orderWorkflow = WorkflowBuilder
.create<OrderPayload>()
.name('Order Confirmation')
.workflowId('order-confirmation')
.payloadSchema(orderPayloadSchema)
.addSteps([...])
.build();
```
**Регистрация в index.ts:**
```typescript
// components/notifications/src/workflows/index.ts
import { orderWorkflow } from './order';
export const allWorkflows = [
welcomeWorkflow,
orderWorkflow, // ← добавить новый workflow
];
```
### 4. Использование API
**Триггер welcome workflow:**
```bash
curl -X POST http://localhost:3000/api/notifications/trigger/welcome \
-H "Content-Type: application/json" \
-d '{
"subscriberId": "user-123",
"email": "user@example.com",
"payload": {
"userName": "Иван Иванов",
"userEmail": "user@example.com",
"age": 25
}
}'
```
## 🎯 Преимущества архитектуры
1. **Типобезопасность** - Zod схемы обеспечивают валидацию на уровне TypeScript и runtime
2. **Разделение ответственности** - Библиотека содержит только типы, сервер - логику
3. **Расширяемость** - Легко добавлять новые workflow
4. **Автоматизация** - Workflow автоматически синхронизируются с Novu
5. **Переиспользование** - Типы можно использовать в других частях системы
## 🔄 Workflow при запуске
1. **Запуск notificator2**
2. **Чтение всех workflow из библиотеки**
3. **Проверка существования в Novu**
4. **Создание/обновление workflow**
5. **Готов к приёму запросов на триггеры**
## 📁 Структура как в testFramework2.ts
Вся логика из `testFramework2.ts` была перенесена в structured архитектуру:
-`buildWorkflowData``WorkflowBuilder`
-`baseSteps``createEmailStep`, `createInAppStep`, etc.
-`upsertWorkflow``NovuService.upsertWorkflow`
-`triggerWorkflow``NovuService.triggerWorkflow`
- ✅ Типизация payload → Zod схемы + TypeScript типы
File diff suppressed because one or more lines are too long
BIN
View File
Binary file not shown.
+10
View File
@@ -0,0 +1,10 @@
EOSIO_PUB_KEY=EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
EOSIO_PRV_KEY=5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
DATADIR=blockchain-data
BPACCOUNT=eosio
PASSWORD=PW5JGe4WsTPGrjnMzkGd4wfVdzoHCEySgbyq2WBWGAxSfevbXqAG4
SERVER_SECRET=SECRET
SERVER_URL=http://127.0.0.1:2998
MONGO_URI=mongodb://127.0.0.1:27017/cooperative-x
SIMPLE_EXPLORER_API=http://localhost:4000
SKIP_BLOCK_FETCH=TRUE
+14
View File
@@ -0,0 +1,14 @@
.cache
.DS_Store
.idea
*.log
*.tgz
coverage
dist
lib-cov
logs
node_modules
temp
.env
blockchain-data/*
wallet-data/*
+22
View File
@@ -0,0 +1,22 @@
{
"configurations": [
{
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/lib/**",
"${workspaceFolder}/lib/eosiolib/contracts/**",
"${workspaceFolder}/lib/eosiolib/core/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE",
"int128_t=__int128_t",
"uint128_t=__uint128_t"
],
"cStandard": "c17",
"cppStandard": "c++20"
}
],
"version": 4
}
+68
View File
@@ -0,0 +1,68 @@
{
// Enable the ESlint flat config support
"prettier.enable": false,
"editor.formatOnSave": true,
// Auto fix
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
// "source.fixAll": "explicit",
// "source.organizeImports": "never"
},
// Silent the stylistic rules in you IDE, but still auto fix them
"eslint.rules.customizations": [
{
"rule": "style/*",
"severity": "off"
},
{
"rule": "*-indent",
"severity": "off"
},
{
"rule": "*-spacing",
"severity": "off"
},
{
"rule": "*-spaces",
"severity": "off"
},
{
"rule": "*-order",
"severity": "off"
},
{
"rule": "*-dangle",
"severity": "off"
},
{
"rule": "*-newline",
"severity": "off"
},
{
"rule": "*quotes",
"severity": "off"
},
{
"rule": "*semi",
"severity": "off"
}
],
// Enable eslint for all supported languages
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue",
"html",
"markdown",
"json",
"jsonc",
"yaml"
],
// "[cpp]": {
// "editor.defaultFormatter": "ms-vscode.cpptools",
// },
// "C_Cpp.vcFormat.indent.withinParentheses": "indent",
"C_Cpp.errorSquiggles": "disabled"
}
+80
View File
@@ -0,0 +1,80 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.2.10](https://github.com/coopenomics/mono/compare/v2.2.9...v2.2.10) (2025-03-27)
**Note:** Version bump only for package @coopenomics/boot
## [2.2.9](https://github.com/coopenomics/mono/compare/v2.2.8...v2.2.9) (2025-03-12)
**Note:** Version bump only for package @coopenomics/boot
## [0.1.8](https://github.com/coopenomics/contracts/compare/boot@0.1.7...boot@0.1.8) (2024-12-24)
**Note:** Version bump only for package boot
## [0.1.7](https://github.com/coopenomics/contracts/compare/boot@0.1.7-alpha.0...boot@0.1.7) (2024-10-16)
**Note:** Version bump only for package boot
## [0.1.6](https://github.com/coopenomics/contracts/compare/boot@0.1.5...boot@0.1.6) (2024-10-13)
**Note:** Version bump only for package boot
## [0.1.5](https://github.com/coopenomics/contracts/compare/boot@0.1.5-alpha.0...boot@0.1.5) (2024-09-26)
**Note:** Version bump only for package boot
## [0.1.4](https://github.com/coopenomics/contracts/compare/boot@0.1.4-alpha.0...boot@0.1.4) (2024-08-13)
**Note:** Version bump only for package boot
## [0.1.3](https://github.com/coopenomics/contracts/compare/boot@0.1.3-alpha.0...boot@0.1.3) (2024-08-13)
**Note:** Version bump only for package boot
## [0.1.2](https://github.com/coopenomics/contracts/compare/boot@0.1.2-alpha.0...boot@0.1.2) (2024-08-10)
**Note:** Version bump only for package boot
## [0.1.1](https://github.com/coopenomics/contracts/compare/boot@0.1.1-alpha.1...boot@0.1.1) (2024-08-09)
**Note:** Version bump only for package boot
+1
View File
@@ -0,0 +1 @@
# Загрузчик.
+19
View File
@@ -0,0 +1,19 @@
// @ts-check
import antfu from '@antfu/eslint-config'
export default antfu(
{
ignores: [
// eslint ignore globs here
],
},
{
rules: {
'no-unused-vars': 'off',
'unused-imports/no-unused-vars': 'off',
'no-console': 'off',
'unicorn/prefer-number-properties': 'off',
// overrides
},
},
)
+54
View File
@@ -0,0 +1,54 @@
{
"name": "@coopenomics/boot",
"type": "module",
"version": "2025.10.16",
"private": true,
"packageManager": "pnpm@9.0.6",
"description": "",
"author": "Alex Ant <dacom.dark.sun@gmail.com>",
"license": "",
"keywords": [],
"scripts": {
"enter": "./scripts/enter.sh",
"cli": "esno src/index.ts",
"deploy": "esno src/index.ts deploy",
"cleos": "esno src/index.ts cleos",
"unlock": "esno src/index.ts unlock",
"boot": "esno src/index.ts boot",
"clear": "esno src/index.ts clear",
"start": "./scripts/restart.sh",
"stop": "./scripts/stop.sh"
},
"dependencies": {
"@coopenomics/factory": "workspace:*",
"axios": "^1.6.8",
"chai": "^5.1.2",
"commander": "^12.1.0",
"cooptypes": "workspace:*",
"dockerode": "^4.0.2",
"dotenv": "^16.4.5",
"eosjs": "^22.1.0",
"eosjs-api": "^7.0.4",
"eosjs-ecc": "^4.0.7",
"execa": "^9.5.2",
"mocha": "^10.7.3",
"mongoose": "^8.10.0"
},
"devDependencies": {
"@antfu/eslint-config": "^2.18.0",
"@antfu/ni": "^0.21.12",
"@antfu/utils": "^0.7.8",
"@types/dockerode": "^3.3.31",
"@types/node": "^20.12.12",
"bumpp": "^9.4.1",
"eslint": "^9.2.0",
"esno": "^4.7.0",
"pnpm": "^9.1.1",
"rimraf": "^5.0.7",
"simple-git-hooks": "^2.11.1",
"typescript": "^5.4.5",
"unbuild": "^2.0.0",
"vite": "^5.2.11",
"vitest": "^1.6.0"
}
}
+80
View File
@@ -0,0 +1,80 @@
#!/bin/zsh
# Определение ассоциативных массивов
typeset -A contract_params_test contract_params_prod
contract_params_test=(
[ano]="ano"
[gateway]="gateway"
[draft]="draft"
[marketplace]="marketplace"
[soviet]="soviet"
[registrator]="registrator"
[system]="eosio"
[fund]="fund"
)
contract_params_prod=(
[ano]="ano"
[gateway]="gateway"
[draft]="draft"
[marketplace]="marketplace"
[soviet]="soviet"
[registrator]="registrator"
[system]="eosio"
[fund]="fund"
[template]="template"
)
# Выбор массива параметров в зависимости от входящего аргумента
if [ "$2" = "prod" ]; then
contract_params=("${(@kv)contract_params_prod}")
elif [ "$2" = "test" ]; then
contract_params=("${(@kv)contract_params_test}")
else
contract_params=("${(@kv)contract_params_test}")
fi
# Форматирование строки для переменной окружения
contract_params_str=""
for key value in "${(@kv)contract_params}"; do
contract_params_str+="${key}=${value},"
done
# Проверяем, задан ли аргумент для контрактов
if [ -n "$1" ]; then
contracts=$1
else
contracts="*"
fi
# Запуск контейнера Docker
docker run --rm --name cdt_v4.1.0 \
--volume $(pwd):/project \
-w /project \
--env CONTRACT_PARAMS="$contract_params_str" \
dicoop/cdt_v4.1.0 /bin/bash -c "
cd ../cpp
# Перебираем все папки в директории
for folder in $contracts ; do
# Убираем слэш из названия папки, чтобы получить имя контракта
contract=\${folder%/}
contract=\${contract##*/}
echo \"Сборка контракта \$contract в \$folder...\"
# Переходим в директорию контракта
cd \$folder
# Извлекаем параметр для -contract из переменной окружения
contract_param=\$(echo \$CONTRACT_PARAMS | grep -o \"\$contract=[^,]*\" | cut -d'=' -f2)
# Компилируем с использованием параметра -contract
cdt-cpp -abigen -I include -R include -contract \$contract_param -o \$contract.wasm \$contract.cpp
# Возвращаемся назад
cd ..
echo \"Сборка контракта \$contract завершена!\"
done
"
+1
View File
@@ -0,0 +1 @@
cd ../system/build && cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON -Dcdt_DIR="/cdt/build/lib/cmake/cdt" -Dleap_DIR="/blockchain/build/lib/cmake/leap" .. && make -j 2
+5
View File
@@ -0,0 +1,5 @@
#!/bin/bash
# Передача аргументов cleos
docker exec -it node /usr/local/bin/cleos "$@"
+108
View File
@@ -0,0 +1,108 @@
#!/bin/bash
# Импорт параметров сетей
source ./networks.sh
# Устанавливаем значения по умолчанию
network_param=$local
account_name_param=""
network=""
# Получаем первый аргумент, который должен быть именем контракта
contract_name=$1
rm /Users/darksun/testnet/wallet/keosd.sock
./kill.sh
# Проверяем наличие параметра -n и устанавливаем соответствующую сеть
while [[ $# -gt 0 ]]; do
case $1 in
-n)
network=$2
shift
shift
;;
-t)
account_name_param=$2
shift
shift
;;
*)
shift
;;
esac
done
# Устанавливаем значение сети из networks.sh
case $network in
prod)
network_param=$prod
;;
test)
network_param=$test
;;
local)
network_param=$local
;;
esac
# Разблокировка кошелька
./unlock.sh
# Функция для установки контракта
deploy_contract() {
local contract=$1
local dir=$2
local account_name=$3
echo "Устанавливаем контракт $contract на аккаунт $account_name..."
if [ -z "$account_name_param" ]; then
echo ./cleos.sh $network_param set contract $account_name $dir -p $account_name
./cleos.sh $network_param set contract $account_name $dir -p $account_name
else
echo ./cleos.sh $network_param set contract $account_name_param $dir -p $account_name_param
./cleos.sh $network_param set contract $account_name_param $dir -p $account_name_param
fi
}
# Если контракт указан, деплоим только его
if [ ! -z "$contract_name" ]; then
ls ./
echo "Проверка наличия папки для контракта $contract_name..."
if [ -d "./$contract_name" ]; then
echo "Папка контракта найдена. Содержимое папки:"
deploy_contract $contract_name "/contracts/cpp/$contract_name" $contract_name
elif [[ "$contract_name" == "eosio.msig" || "$contract_name" == "eosio.token" || "$contract_name" == "eosio.wrap" ]]; then
echo "Папка системного контракта найдена. Содержимое папки:"
ls "/contracts/cpp/system/build/contracts/$contract_name"
deploy_contract $contract_name "/contracts/cpp/system/build/contracts/$contract_name" $contract_name
elif [ "$contract_name" == "eosio.system" ]; then
echo "Папка системного контракта найдена. Содержимое папки:"
ls "/contracts/cpp/system/build/contracts/$contract_name"
deploy_contract $contract_name "/contracts/cpp/system/build/contracts/$contract_name" "eosio"
elif [ "$contract_name" == "eosio.boot" ]; then
echo "Папка системного контракта найдена. Содержимое папки:"
ls "/contracts/cpp/system/build/contracts/$contract_name"
deploy_contract $contract_name "/contracts/cpp/system/build/contracts/$contract_name" "eosio"
else
echo "Контракт $contract_name не найден"
fi
exit 0
fi
# Перебираем все папки с контрактами на верхнем уровне, исключая 'system'
for dir in $(find /contracts/cpp/* -maxdepth 0 -type d ! -name 'system'); do
contract=$(basename $dir)
echo "Найдена папка $dir для контракта $contract. Содержимое папки:"
ls $dir
deploy_contract $contract $dir $contract
done
# Исключение для контрактов в папке system
special_system_contracts=("eosio.msig" "eosio.token" "eosio.wrap")
for contract in "${special_system_contracts[@]}"; do
echo "Найдена папка системного контракта для $contract. Содержимое папки:"
ls "/contracts/cpp/system/build/contracts/$contract"
deploy_contract $contract "/contracts/cpp/system/build/contracts/$contract" $contract
done
deploy_contract "eosio.system" "/contracts/cpp/system/build/contracts/eosio.system" "eosio"
+4
View File
@@ -0,0 +1,4 @@
docker run --rm -it --name cdt \
--volume $(pwd)/:/project \
-w /project \
dicoop/blockchain_v5.1.1:dev /bin/bash
+3
View File
@@ -0,0 +1,3 @@
cd ../
doxygen
cp -r ../docs/html/* ../../doctrine/site/contracts
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
# убиваем keosd на всякий случай
docker exec -it node pkill keosd
+35
View File
@@ -0,0 +1,35 @@
#!/bin/bash
# Получаем текущую директорию
dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Проверяем, существуют ли директории
if [ ! -d ~/testnet ]; then
echo "Директория ~/testnet не найдена. Создание..."
mkdir -p ~/testnet
fi
if [ ! -d ~/testnet/config ]; then
echo "Директория ~/testnet/config не найдена. Создание..."
mkdir -p ~/testnet/config
fi
# Проверяем, существует ли файл
if [ ! -f ~/testnet/config/config.ini ]; then
echo "Файл config.ini не найден. Копирование..."
cp $dir/configs/master/config.ini ~/testnet/config/config.ini
fi
# Запускаем контейнер Docker с нужными параметрами
docker run --name node -d -p 8888:8888 -p 9876:9876 -p 8080:8080 \
-v ~/testnet/data:/mnt/dev/data \
-v ~/testnet/config:/mnt/dev/config \
-v ~/testnet/wallet:/root/eosio-wallet \
-v $dir/../../contracts:/contracts \
dicoop/blockchain:v5.1.0-dev \
/bin/bash -c '/usr/local/bin/nodeos -d /mnt/dev/data -p eosio --config-dir /mnt/dev/config --genesis-json /mnt/dev/config/genesis.json'
docker network connect hyperion node
echo "Контейнер node установлен - блокчейн запущен."
sleep 10
+5
View File
@@ -0,0 +1,5 @@
#!/bin/bash
local="-u http://localhost:8888"
test="-u https://testnet.coopenomics.world/api"
prod="-u https://voskhod.coopenomics.world/api"
+22
View File
@@ -0,0 +1,22 @@
{
"net": {
"assumed_stake_weight": 10000000,
"current_weight_ratio": 500000000000000,
"decay_secs": 86400,
"exponent": 1,
"max_price": "1000.0000 AXON",
"min_price": "1000.0000 AXON",
"target_weight_ratio": 500000000000000
},
"cpu": {
"assumed_stake_weight": 10000000,
"current_weight_ratio": 500000000000000,
"decay_secs": 86400,
"exponent": 1,
"max_price": "1000.0000 AXON",
"min_price": "1000.0000 AXON",
"target_weight_ratio": 500000000000000
},
"min_powerup_fee": "0.0001 AXON",
"powerup_days": 1
}
+1
View File
@@ -0,0 +1 @@
cleos push action eosio cfgpowerup "[`cat ./powerup.json`]" -p eosio
+39
View File
@@ -0,0 +1,39 @@
#!/bin/bash
# Run unlock script before activating features
./unlock.sh
# Activate PREACTIVATE_FEATURE before installing eosio.boot
#./cleos.sh push action eosio activate '["0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd"]' -p eosio@active
curl --noproxy -X POST "http://localhost:8888/v1/producer/schedule_protocol_feature_activations" -d '{"protocol_features_to_activate": ["0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd"]}'
# Install eosio.boot which supports the native actions and activate
# action that allows activating desired protocol features prior to
# deploying a system contract with more features such as eosio.bios
# or eosio.system
./deploy.sh eosio.boot
# Activate remaining features
./cleos.sh push action eosio activate '["c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071"]' -p eosio@active
./cleos.sh push action eosio activate '["d528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40"]' -p eosio@active
./cleos.sh push action eosio activate '["5443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4"]' -p eosio@active
./cleos.sh push action eosio activate '["f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d"]' -p eosio@active
./cleos.sh push action eosio activate '["2652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25"]' -p eosio@active
./cleos.sh push action eosio activate '["8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405"]' -p eosio@active
./cleos.sh push action eosio activate '["ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43"]' -p eosio@active
./cleos.sh push action eosio activate '["68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428"]' -p eosio@active
./cleos.sh push action eosio activate '["e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526"]' -p eosio@active
./cleos.sh push action eosio activate '["ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99"]' -p eosio@active
./cleos.sh push action eosio activate '["4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f"]' -p eosio@active
./cleos.sh push action eosio activate '["1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241"]' -p eosio@active
./cleos.sh push action eosio activate '["4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d67"]' -p eosio@active
./cleos.sh push action eosio activate '["4fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2"]' -p eosio@active
./cleos.sh push action eosio activate '["299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707"]' -p eosio@active
./cleos.sh push action eosio activate '["bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99"]' -p eosio@active
./cleos.sh push action eosio activate '["35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b"]' -p eosio@active
./cleos.sh push action eosio activate '["6bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc"]' -p eosio@active
# Install the eosio.system contract
./deploy.sh eosio.system
+10
View File
@@ -0,0 +1,10 @@
#!/bin/bash
# Останавливаем и удаляем контейнер, если он существует
docker stop node > /dev/null 2>&1 && docker rm node > /dev/null 2>&1
# Очищаем папку с данными блокчейна
rm -rf ~/testnet/data/*
echo "Очистка завершена."
+47
View File
@@ -0,0 +1,47 @@
#!/bin/bash
# Останавливаем и удаляем контейнеры вместе с volumes
echo "Останавливаем и удаляем контейнеры с volumes..."
docker compose down -v mongo postgres cooparser || true
# Останавливаем blockchain контейнер перед удалением данных
echo "Останавливаем blockchain контейнер..."
docker compose stop node || true
# Удаляем blockchain data
echo "Удаляем blockchain data..."
# sudo chmod -R 755 ../blockchain-data/ 2>/dev/null || true
sudo rm -rf ../blockchain-data/
# Пересоздаем и запускаем базы данных
echo "Пересоздаем и запускаем базы данных..."
docker compose up -d mongo postgres
# Ждем готовности MongoDB
echo "Ждем готовности MongoDB..."
until docker exec mongo mongosh --eval "db.adminCommand('ping')" --quiet > /dev/null 2>&1; do
echo "MongoDB еще не готов, ждем..."
sleep 2
done
echo "MongoDB готов!"
# Ждем готовности PostgreSQL
echo "Ждем готовности PostgreSQL..."
until docker exec postgres pg_isready -U postgres -d voskhod > /dev/null 2>&1; do
echo "PostgreSQL еще не готов, ждем..."
sleep 2
done
echo "PostgreSQL готов!"
# Запускаем boot процесс
echo "Запускаем boot процесс..."
pnpm run boot
# Запускаем parser
echo "Запускаем parser..."
docker compose up -d cooparser
echo "Запускаем контроллер..."
docker compose restart coopback || true
echo "Перезапуск завершен!"
+1
View File
@@ -0,0 +1 @@
cd ../cpp/system/build/tests && ctest -j $(nproc) --rerun-failed --output-on-failure
+46
View File
@@ -0,0 +1,46 @@
#!/bin/sh
if [ ! -d $DATADIR ]; then
mkdir -p $DATADIR;
fi
ARCH=`uname -m`
NODEOS='/usr/local/bin/nodeos'
if [ "${ARCH}" = "x86_64" ]; then
EOSVM=eos-vm-jit
else
EOSVM=eos-vm
fi
$NODEOS \
--signature-provider $EOSIO_PUB_KEY=KEY:$EOSIO_PRV_KEY \
--plugin eosio::net_plugin \
--plugin eosio::net_api_plugin \
--plugin eosio::producer_plugin \
--plugin eosio::producer_api_plugin \
--plugin eosio::chain_plugin \
--plugin eosio::chain_api_plugin \
--plugin eosio::http_plugin \
--data-dir $DATADIR"/data" \
--blocks-dir $DATADIR"/blocks" \
--config-dir $DATADIR"/config" \
--producer-name $BPACCOUNT \
--http-server-address 0.0.0.0:8888 \
--p2p-listen-endpoint 0.0.0.0:9010 \
--access-control-allow-origin=* \
--contracts-console \
--http-validate-host=false \
--verbose-http-errors \
--enable-stale-production \
--trace-history \
--chain-state-history \
--max-transaction-time=2000 \
--abi-serializer-max-time-ms=60000 \
--http-max-response-time-ms=8000 \
--chain-state-db-size-mb 8192 \
--chain-state-db-guard-size-mb 1024 \
--wasm-runtime=$EOSVM \
>> $DATADIR"/coopos.log" 2>&1 & \
echo $! > $DATADIR"/coopos.pid"
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
VERBOSE=""
if [[ $1 == "--verbose" ]]; then
VERBOSE="--verbose"
fi
cd ../cpp/system/build/tests && ctest -j $(nproc) --output-on-failure $VERBOSE
+15
View File
@@ -0,0 +1,15 @@
source .env
if [ -f $DATADIR"/eosd.pid" ]; then
pid=`cat $DATADIR"/eosd.pid"`
echo $pid
kill $pid
rm -r $DATADIR"/eosd.pid"
echo -ne "Stoping Node"
while true; do
[ ! -d "/proc/$pid/fd" ] && break
echo -ne "."
sleep 1
done
echo -ne "\rNode Stopped. \n"
fi
+33
View File
@@ -0,0 +1,33 @@
#!/bin/bash
# Переходим в директорию скрипта
cd "$(dirname "$0")"
# Проверяем наличие папки для хранения данных о кошельке
if [ ! -d "$HOME/testnet/wallet" ]; then
mkdir -p $HOME/testnet/wallet
fi
# Проверяем наличие файла с паролем
if [ ! -f "$HOME/testnet/wallet/password" ]; then
echo "Создание нового кошелька..."
# Создаем новый кошелек и сохраняем пароль в файл внутри контейнера
docker exec -it node /usr/local/bin/cleos wallet create --file password.txt
if [ $? -eq 0 ]; then
# Копируем пароль из файла контейнера в локальный файл
docker cp node:/workdir/password.txt $HOME/testnet/wallet/password
# Удаляем временный файл из контейнера
docker exec -it node rm /workdir/password.txt
echo "Пароль от кошелька сохранён в файле $HOME/testnet/wallet/password"
# Импортируем ключ в кошелек
docker exec -it node /usr/local/bin/cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
else
echo "Не удалось создать кошелек"
exit 1
fi
else
echo "Использование существующего кошелька..."
# Разблокировка кошелька
docker exec -it node /usr/local/bin/cleos wallet unlock --password $(cat $HOME/testnet/wallet/password) > /dev/null 2>&1
fi
File diff suppressed because it is too large Load Diff
+532
View File
@@ -0,0 +1,532 @@
plugin = eosio::chain_plugin
plugin = eosio::producer_plugin
plugin = eosio::chain_api_plugin
plugin = eosio::http_plugin
plugin = eosio::state_history_plugin
plugin = eosio::producer_api_plugin
plugin = eosio::resource_monitor_plugin
enable-stale-production = true
read-only-read-window-time-us = 120000
net-threads = 2
max-transaction-time=2000
http-server-address = 0.0.0.0:8888
p2p-listen-endpoint = 0.0.0.0:9876
access-control-allow-origin = *
access-control-allow-credentials = false
http-validate-host = false
producer-name=eosio
producer-name=core
signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
http-max-response-time-ms = 30000
max-body-size = 10485760
abi-serializer-max-time-ms = 200000
contracts-console = true
max-block-cpu-usage-threshold-us = 5000
max-block-net-usage-threshold-bytes = 1024
verbose-http-errors = true
chain-state-history = true
trace-history = true
state-history-endpoint = 0.0.0.0:8070
resource-monitor-space-threshold = 99
resource-monitor-not-shutdown-on-threshold-exceeded = true
wasm-runtime = eos-vm
# Percentage of cpu block production time used to produce block. Whole number percentages, e.g. 80 for 80% (eosio::producer_plugin)
# cpu-effort-percent = 80
# Percentage of cpu block production time used to produce last block. Whole number percentages, e.g. 80 for 80% (eosio::producer_plugin)
# last-block-cpu-effort-percent = 80
# the location of the blocks directory (absolute path or relative to application data dir) (eosio::chain_plugin)
# blocks-dir = "blocks"
# split the block log file when the head block number is the multiple of the stride
# When the stride is reached, the current block log and index will be renamed '<blocks-retained-dir>/blocks-<start num>-<end num>.log/index'
# and a new current block log and index will be created with the most recent block. All files following
# this format will be used to construct an extended block log. (eosio::chain_plugin)
# blocks-log-stride =
# the maximum number of blocks files to retain so that the blocks in those files can be queried.
# When the number is reached, the oldest block file would be moved to archive dir or deleted if the archive dir is empty.
# The retained block log files should not be manipulated by users. (eosio::chain_plugin)
# max-retained-block-files =
# the location of the blocks retained directory (absolute path or relative to blocks dir).
# If the value is empty, it is set to the value of blocks dir. (eosio::chain_plugin)
# blocks-retained-dir =
# the location of the blocks archive directory (absolute path or relative to blocks dir).
# If the value is empty, blocks files beyond the retained limit will be deleted.
# All files in the archive directory are completely under user's control, i.e. they won't be accessed by nodeos anymore. (eosio::chain_plugin)
# blocks-archive-dir =
# the location of the state directory (absolute path or relative to application data dir) (eosio::chain_plugin)
# state-dir = "state"
# the location of the protocol_features directory (absolute path or relative to application config dir) (eosio::chain_plugin)
# protocol-features-dir = "protocol_features"
# Pairs of [BLOCK_NUM,BLOCK_ID] that should be enforced as checkpoints. (eosio::chain_plugin)
# checkpoint =
# Override default WASM runtime ( "eos-vm-jit", "eos-vm")
# "eos-vm-jit" : A WebAssembly runtime that compiles WebAssembly code to native x86 code prior to execution.
# "eos-vm" : A WebAssembly interpreter.
# (eosio::chain_plugin)
# wasm-runtime = eos-vm-jit
# The name of an account whose code will be profiled (eosio::chain_plugin)
# profile-account =
# Override default maximum ABI serialization time allowed in ms (eosio::chain_plugin)
# abi-serializer-max-time-ms = 15
# Maximum size (in MiB) of the chain state database (eosio::chain_plugin)
# chain-state-db-size-mb = 1024
# Safely shut down node when free space remaining in the chain state database drops below this size (in MiB). (eosio::chain_plugin)
# chain-state-db-guard-size-mb = 128
# Percentage of actual signature recovery cpu to bill. Whole number percentages, e.g. 50 for 50% (eosio::chain_plugin)
# signature-cpu-billable-pct = 50
# Number of worker threads in controller thread pool (eosio::chain_plugin)
# chain-threads = 2
# print contract's output to console (eosio::chain_plugin)
# contracts-console = false
# print deeper information about chain operations (eosio::chain_plugin)
deep-mind = false
# Account added to actor whitelist (may specify multiple times) (eosio::chain_plugin)
# actor-whitelist =
# Account added to actor blacklist (may specify multiple times) (eosio::chain_plugin)
# actor-blacklist =
# Contract account added to contract whitelist (may specify multiple times) (eosio::chain_plugin)
# contract-whitelist =
# Contract account added to contract blacklist (may specify multiple times) (eosio::chain_plugin)
# contract-blacklist =
# Action (in the form code::action) added to action blacklist (may specify multiple times) (eosio::chain_plugin)
# action-blacklist =
# Public key added to blacklist of keys that should not be included in authorities (may specify multiple times) (eosio::chain_plugin)
# key-blacklist =
# Deferred transactions sent by accounts in this list do not have any of the subjective whitelist/blacklist checks applied to them (may specify multiple times) (eosio::chain_plugin)
# sender-bypass-whiteblacklist =
# Database read mode ("head", "irreversible", "speculative").
# In "head" mode: database contains state changes up to the head block; transactions received by the node are relayed if valid.
# In "irreversible" mode: database contains state changes up to the last irreversible block; transactions received via the P2P network are not relayed and transactions cannot be pushed via the chain API.
# In "speculative" mode: database contains state changes by transactions in the blockchain up to the head block as well as some transactions not yet included in the blockchain; transactions received by the node are relayed if valid.
# (eosio::chain_plugin)
# read-mode = head
# Allow API transactions to be evaluated and relayed if valid. (eosio::chain_plugin)
api-accept-transactions = true
# Chain validation mode ("full" or "light").
# In "full" mode all incoming blocks will be fully validated.
# In "light" mode all incoming blocks headers will be fully validated; transactions in those validated blocks will be trusted
# (eosio::chain_plugin)
# validation-mode = full
# Disable the check which subjectively fails a transaction if a contract bills more RAM to another account within the context of a notification handler (i.e. when the receiver is not the code of the action). (eosio::chain_plugin)
# disable-ram-billing-notify-checks = false
# Subjectively limit the maximum length of variable components in a variable legnth signature to this size in bytes (eosio::chain_plugin)
# maximum-variable-signature-length = 16384
# Indicate a producer whose blocks headers signed by it will be fully validated, but transactions in those validated blocks will be trusted. (eosio::chain_plugin)
# trusted-producer =
# Database map mode ("mapped", "heap", or "locked").
# In "mapped" mode database is memory mapped as a file.
# In "heap" mode database is preloaded in to swappable memory and will use huge pages if available.
# In "locked" mode database is preloaded, locked in to memory, and will use huge pages if available.
# (eosio::chain_plugin)
# database-map-mode = mapped
# Maximum size (in MiB) of the EOS VM OC code cache (eosio::chain_plugin)
# eos-vm-oc-cache-size-mb = 1024
# Number of threads to use for EOS VM OC tier-up (eosio::chain_plugin)
# eos-vm-oc-compile-threads = 1
# Enable EOS VM OC tier-up runtime (eosio::chain_plugin)
# eos-vm-oc-enable = false
# enable queries to find accounts by various metadata. (eosio::chain_plugin)
# enable-account-queries = false
# maximum allowed size (in bytes) of an inline action for a nonprivileged account (eosio::chain_plugin)
# max-nonprivileged-inline-action-size = 4096
# Maximum size (in GiB) allowed to be allocated for the Transaction Retry feature. Setting above 0 enables this feature. (eosio::chain_plugin)
# transaction-retry-max-storage-size-gb =
# How often, in seconds, to resend an incoming transaction to network if not seen in a block.
# Needs to be at least twice as large as p2p-dedup-cache-expire-time-sec. (eosio::chain_plugin)
# transaction-retry-interval-sec = 20
# Maximum allowed transaction expiration for retry transactions, will retry transactions up to this value.
# Should be larger than transaction-retry-interval-sec. (eosio::chain_plugin)
# transaction-retry-max-expiration-sec = 120
# Maximum size (in GiB) allowed to be allocated for the Transaction Finality Status feature. Setting above 0 enables this feature. (eosio::chain_plugin)
# transaction-finality-status-max-storage-size-gb =
# Duration (in seconds) a successful transaction's Finality Status will remain available from being first identified. (eosio::chain_plugin)
# transaction-finality-status-success-duration-sec = 180
# Duration (in seconds) a failed transaction's Finality Status will remain available from being first identified. (eosio::chain_plugin)
# transaction-finality-status-failure-duration-sec = 180
# Log the state integrity hash on startup (eosio::chain_plugin)
# integrity-hash-on-start = false
# Log the state integrity hash on shutdown (eosio::chain_plugin)
# integrity-hash-on-stop = false
# If set to greater than 0, periodically prune the block log to store only configured number of most recent blocks.
# If set to 0, no blocks are be written to the block log; block log file is removed after startup. (eosio::chain_plugin)
# block-log-retain-blocks =
# The filename (relative to data-dir) to create a unix socket for HTTP RPC; set blank to disable. (eosio::http_plugin)
# unix-socket-path =
# The local IP and port to listen for incoming http connections; set blank to disable. (eosio::http_plugin)
# http-server-address = 127.0.0.1:8888
# Specify the Access-Control-Allow-Origin to be returned on each request (eosio::http_plugin)
# access-control-allow-origin =
# Specify the Access-Control-Allow-Headers to be returned on each request (eosio::http_plugin)
# access-control-allow-headers =
# Specify the Access-Control-Max-Age to be returned on each request. (eosio::http_plugin)
# access-control-max-age =
# Specify if Access-Control-Allow-Credentials: true should be returned on each request. (eosio::http_plugin)
# access-control-allow-credentials = false
# The maximum body size in bytes allowed for incoming RPC requests (eosio::http_plugin)
# max-body-size = 2097152
# Maximum size in megabytes http_plugin should use for processing http requests. -1 for unlimited. 429 error response when exceeded. (eosio::http_plugin)
# http-max-bytes-in-flight-mb = 500
# Maximum number of requests http_plugin should use for processing http requests. 429 error response when exceeded. (eosio::http_plugin)
# http-max-in-flight-requests = -1
# Maximum time for processing a request, -1 for unlimited (eosio::http_plugin)
# http-max-response-time-ms = 30
# Append the error log to HTTP responses (eosio::http_plugin)
# verbose-http-errors = false
# If set to false, then any incoming "Host" header is considered valid (eosio::http_plugin)
# http-validate-host = true
# Additionaly acceptable values for the "Host" header of incoming HTTP requests, can be specified multiple times. Includes http/s_server_address by default. (eosio::http_plugin)
# http-alias =
# Number of worker threads in http thread pool (eosio::http_plugin)
# http-threads = 2
# If set to false, do not keep HTTP connections alive, even if client requests. (eosio::http_plugin)
# http-keep-alive = true
# The actual host:port used to listen for incoming p2p connections. (eosio::net_plugin)
# p2p-listen-endpoint = 0.0.0.0:9876
# An externally accessible host:port for identifying this node. Defaults to p2p-listen-endpoint. (eosio::net_plugin)
# p2p-server-address =
# The public endpoint of a peer node to connect to. Use multiple p2p-peer-address options as needed to compose a network.
# Syntax: host:port[:<trx>|<blk>]
# The optional 'trx' and 'blk' indicates to node that only transactions 'trx' or blocks 'blk' should be sent. Examples:
# p2p.eos.io:9876
# p2p.trx.eos.io:9876:trx
# p2p.blk.eos.io:9876:blk
# (eosio::net_plugin)
# p2p-peer-address =
# Maximum number of client nodes from any single IP address (eosio::net_plugin)
# p2p-max-nodes-per-host = 1
# Allow transactions received over p2p network to be evaluated and relayed if valid. (eosio::net_plugin)
# p2p-accept-transactions = true
# The account and public p2p endpoint of a block producer node to automatically connect to when the it is in producer schedule proximity
# . Syntax: account,host:port
# Example,
# eosproducer1,p2p.eos.io:9876
# eosproducer2,p2p.trx.eos.io:9876:trx
# eosproducer3,p2p.blk.eos.io:9876:blk
# (eosio::net_plugin)
# p2p-auto-bp-peer =
# The name supplied to identify this node amongst the peers. (eosio::net_plugin)
# agent-name = EOS Test Agent
# Can be 'any' or 'producers' or 'specified' or 'none'. If 'specified', peer-key must be specified at least once. If only 'producers', peer-key is not required. 'producers' and 'specified' may be combined. (eosio::net_plugin)
# allowed-connection = any
# Optional public key of peer allowed to connect. May be used multiple times. (eosio::net_plugin)
# peer-key =
# Tuple of [PublicKey, WIF private key] (may specify multiple times) (eosio::net_plugin)
# peer-private-key =
# Maximum number of clients from which connections are accepted, use 0 for no limit (eosio::net_plugin)
# max-clients = 25
# number of seconds to wait before cleaning up dead connections (eosio::net_plugin)
# connection-cleanup-period = 30
# max connection cleanup time per cleanup call in milliseconds (eosio::net_plugin)
# max-cleanup-time-msec = 10
# Maximum time to track transaction for duplicate optimization (eosio::net_plugin)
# p2p-dedup-cache-expire-time-sec = 10
# Number of worker threads in net_plugin thread pool (eosio::net_plugin)
# net-threads = 4
# number of blocks to retrieve in a chunk from any individual peer during synchronization (eosio::net_plugin)
# sync-fetch-span = 100
# Enable experimental socket read watermark optimization (eosio::net_plugin)
# use-socket-read-watermark = false
# The string used to format peers when logging messages about them. Variables are escaped with ${<variable name>}.
# Available Variables:
# _name self-reported name
#
# _cid assigned connection id
#
# _id self-reported ID (64 hex characters)
#
# _sid first 8 characters of _peer.id
#
# _ip remote IP address of peer
#
# _port remote port number of peer
#
# _lip local IP address connected to peer
#
# _lport local port number connected to peer
#
# (eosio::net_plugin)
# peer-log-format = ["${_name}" - ${_cid} ${_ip}:${_port}]
# peer heartbeat keepalive message interval in milliseconds (eosio::net_plugin)
# p2p-keepalive-interval-ms = 10000
# Enable block production, even if the chain is stale. (eosio::producer_plugin)
# enable-stale-production = false
# Start this node in a state where production is paused (eosio::producer_plugin)
# pause-on-startup = false
# Limits the maximum time (in milliseconds) that is allowed a pushed transaction's code to execute before being considered invalid (eosio::producer_plugin)
# max-transaction-time = 30
# Limits the maximum age (in seconds) of the DPOS Irreversible Block for a chain this node will produce blocks on (use negative value to indicate unlimited) (eosio::producer_plugin)
# max-irreversible-block-age = -1
# ID of producer controlled by this node (e.g. inita; may specify multiple times) (eosio::producer_plugin)
# producer-name =
# Key=Value pairs in the form <public-key>=<provider-spec>
# Where:
# <public-key> is a string form of a vaild EOSIO public key
#
# <provider-spec> is a string in the form <provider-type>:<data>
#
# <provider-type> is KEY, KEOSD, or SE
#
# KEY:<data> is a string form of a valid EOSIO private key which maps to the provided public key
#
# KEOSD:<data> is the URL where keosd is available and the approptiate wallet(s) are unlocked
#
# (eosio::producer_plugin)
# signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
# account that can not access to extended CPU/NET virtual resources (eosio::producer_plugin)
# greylist-account =
# Limit (between 1 and 1000) on the multiple that CPU/NET virtual resources can extend during low usage (only enforced subjectively; use 1000 to not enforce any limit) (eosio::producer_plugin)
# greylist-limit = 1000
# Offset of non last block producing time in microseconds. Valid range 0 .. -block_time_interval. (eosio::producer_plugin)
# produce-time-offset-us = 0
# Offset of last block producing time in microseconds. Valid range 0 .. -block_time_interval. (eosio::producer_plugin)
# last-block-time-offset-us = -200000
# Percentage of cpu block production time used to produce block. Whole number percentages, e.g. 80 for 80% (eosio::producer_plugin)
# cpu-effort-percent = 10
# Percentage of cpu block production time used to produce last block. Whole number percentages, e.g. 80 for 80% (eosio::producer_plugin)
# last-block-cpu-effort-percent = 10
# Threshold of CPU block production to consider block full; when within threshold of max-block-cpu-usage block can be produced immediately (eosio::producer_plugin)
# max-block-cpu-usage-threshold-us = 5000
# Threshold of NET block production to consider block full; when within threshold of max-block-net-usage block can be produced immediately (eosio::producer_plugin)
# max-block-net-usage-threshold-bytes = 1024
# Maximum wall-clock time, in milliseconds, spent retiring scheduled transactions (and incoming transactions according to incoming-defer-ratio) in any block before returning to normal transaction processing. (eosio::producer_plugin)
# max-scheduled-transaction-time-per-block-ms = 100
# Time in microseconds allowed for a transaction that starts with insufficient CPU quota to complete and cover its CPU usage. (eosio::producer_plugin)
# subjective-cpu-leeway-us = 31000
# Sets the maximum amount of failures that are allowed for a given account per window size. (eosio::producer_plugin)
# subjective-account-max-failures = 3
# Sets the window size in number of blocks for subjective-account-max-failures. (eosio::producer_plugin)
# subjective-account-max-failures-window-size = 1
# Sets the time to return full subjective cpu for accounts (eosio::producer_plugin)
# subjective-account-decay-time-minutes = 1440
# ratio between incoming transactions and deferred transactions when both are queued for execution (eosio::producer_plugin)
# incoming-defer-ratio = 1
# Maximum size (in MiB) of the incoming transaction queue. Exceeding this value will subjectively drop transaction with resource exhaustion. (eosio::producer_plugin)
# incoming-transaction-queue-size-mb = 1024
# Disable subjective CPU billing for API/P2P transactions (eosio::producer_plugin)
# disable-subjective-billing = true
# Account which is excluded from subjective CPU billing (eosio::producer_plugin)
# disable-subjective-account-billing =
# Disable subjective CPU billing for P2P transactions (eosio::producer_plugin)
# disable-subjective-p2p-billing = true
# Disable subjective CPU billing for API transactions (eosio::producer_plugin)
# disable-subjective-api-billing = true
# Number of worker threads in producer thread pool (eosio::producer_plugin)
# producer-threads = 1
# the location of the snapshots directory (absolute path or relative to application data dir) (eosio::producer_plugin)
# snapshots-dir = "snapshots"
# Number of worker threads in read-only execution thread pool. Max 8. (eosio::producer_plugin)
# read-only-threads =
# Time in microseconds the write window lasts. (eosio::producer_plugin)
# read-only-write-window-time-us = 200000
# Time in microseconds the read window lasts. (eosio::producer_plugin)
# read-only-read-window-time-us = 60000
# The local IP and port to listen for incoming prometheus metrics http request. (eosio::prometheus_plugin)
# prometheus-exporter-address = 127.0.0.1:9101
# Time in seconds between two consecutive checks of resource usage. Should be between 1 and 300 (eosio::resource_monitor_plugin)
# resource-monitor-interval-seconds = 2
# Threshold in terms of percentage of used space vs total space. If used space is above (threshold - 5%), a warning is generated. Unless resource-monitor-not-shutdown-on-threshold-exceeded is enabled, a graceful shutdown is initiated if used space is above the threshold. The value should be between 6 and 99 (eosio::resource_monitor_plugin)
# resource-monitor-space-threshold = 90
# Absolute threshold in gibibytes of remaining space; applied to each monitored directory. If remaining space is less than value for any monitored directories then threshold is considered exceeded.Overrides resource-monitor-space-threshold value. (eosio::resource_monitor_plugin)
# resource-monitor-space-absolute-gb =
# Used to indicate nodeos will not shutdown when threshold is exceeded. (eosio::resource_monitor_plugin)
# resource-monitor-not-shutdown-on-threshold-exceeded =
# Number of resource monitor intervals between two consecutive warnings when the threshold is hit. Should be between 1 and 450 (eosio::resource_monitor_plugin)
# resource-monitor-warning-interval = 30
# Limits the maximum time (in milliseconds) that is allowed for sending requests to a keosd provider for signing (eosio::signature_provider_plugin)
# keosd-provider-timeout = 5
# the location of the state-history directory (absolute path or relative to application data dir) (eosio::state_history_plugin)
# state-history-dir = "state-history"
# the location of the state history retained directory (absolute path or relative to state-history dir). (eosio::state_history_plugin)
# state-history-retained-dir =
# the location of the state history archive directory (absolute path or relative to state-history dir).
# If the value is empty string, blocks files beyond the retained limit will be deleted.
# All files in the archive directory are completely under user's control, i.e. they won't be accessed by nodeos anymore. (eosio::state_history_plugin)
# state-history-archive-dir =
# split the state history log files when the block number is the multiple of the stride
# When the stride is reached, the current history log and index will be renamed '*-history-<start num>-<end num>.log/index'
# and a new current history log and index will be created with the most recent blocks. All files following
# this format will be used to construct an extended history log. (eosio::state_history_plugin)
# state-history-stride =
# the maximum number of history file groups to retain so that the blocks in those files can be queried.
# When the number is reached, the oldest history file would be moved to archive dir or deleted if the archive dir is empty.
# The retained history log files should not be manipulated by users. (eosio::state_history_plugin)
# max-retained-history-files =
# enable trace history (eosio::state_history_plugin)
# trace-history = false
# enable chain state history (eosio::state_history_plugin)
# chain-state-history = false
# the endpoint upon which to listen for incoming connections. Caution: only expose this port to your internal network. (eosio::state_history_plugin)
# state-history-endpoint = 127.0.0.1:8080
# the path (relative to data-dir) to create a unix socket upon which to listen for incoming connections. (eosio::state_history_plugin)
# state-history-unix-socket-path =
# enable debug mode for trace history (eosio::state_history_plugin)
# trace-history-debug-mode = false
# if set, periodically prune the state history files to store only configured number of most recent blocks (eosio::state_history_plugin)
# state-history-log-retain-blocks =
# the location of the trace directory (absolute path or relative to application data dir) (eosio::trace_api_plugin)
# trace-dir = "traces"
# the number of blocks each "slice" of trace data will contain on the filesystem (eosio::trace_api_plugin)
# trace-slice-stride = 10000
# Number of blocks to ensure are kept past LIB for retrieval before "slice" files can be automatically removed.
# A value of -1 indicates that automatic removal of "slice" files will be turned off. (eosio::trace_api_plugin)
# trace-minimum-irreversible-history-blocks = -1
# Number of blocks to ensure are uncompressed past LIB. Compressed "slice" files are still accessible but may carry a performance loss on retrieval
# A value of -1 indicates that automatic compression of "slice" files will be turned off. (eosio::trace_api_plugin)
# trace-minimum-uncompressed-irreversible-history-blocks = -1
# ABIs used when decoding trace RPC responses.
# There must be at least one ABI specified OR the flag trace-no-abis must be used.
# ABIs are specified as "Key=Value" pairs in the form <account-name>=<abi-def>
# Where <abi-def> can be:
# an absolute path to a file containing a valid JSON-encoded ABI
# a relative path from `data-dir` to a file containing a valid JSON-encoded ABI
# (eosio::trace_api_plugin)
# trace-rpc-abi =
# Use to indicate that the RPC responses will not use ABIs.
# Failure to specify this option when there are no trace-rpc-abi configuations will result in an Error.
# This option is mutually exclusive with trace-rpc-api (eosio::trace_api_plugin)
# trace-no-abis =
# Plugin(s) to enable, may be specified multiple times
# plugin =
+103
View File
@@ -0,0 +1,103 @@
/* eslint-disable node/prefer-global/process */
import path from 'node:path'
import { config } from 'dotenv'
config()
export default [
{
name: 'eosio.boot',
path: path.resolve(process.cwd(), '../contracts/build/contracts/system/contracts/eosio.boot'),
target: 'eosio',
},
{
name: 'eosio.system',
path: path.resolve(process.cwd(), '../contracts/build/contracts/system/contracts/eosio.system'),
target: 'eosio',
},
{
name: 'eosio.token',
path: path.resolve(process.cwd(), '../contracts/build/contracts/system/contracts/eosio.token'),
target: 'eosio.token',
},
{
name: 'eosio.msig',
path: path.resolve(process.cwd(), '../contracts/build/contracts/system/contracts/eosio.msig'),
target: 'eosio.msig',
},
{
name: 'eosio.wrap',
path: path.resolve(process.cwd(), '../contracts/build/contracts/system/contracts/eosio.wrap'),
target: 'eosio.wrap',
},
{
name: 'registrator',
path: path.resolve(process.cwd(), '../contracts/build/contracts/registrator'),
target: 'registrator',
},
{
name: 'soviet',
path: path.resolve(process.cwd(), '../contracts/build/contracts/soviet'),
target: 'soviet',
},
{
name: 'marketplace',
path: path.resolve(process.cwd(), '../contracts/build/contracts/marketplace'),
target: 'marketplace',
},
{
name: 'draft',
path: path.resolve(process.cwd(), '../contracts/build/contracts/draft'),
target: 'draft',
},
{
name: 'branch',
path: path.resolve(process.cwd(), '../contracts/build/contracts/branch'),
target: 'branch',
},
{
name: 'gateway',
path: path.resolve(process.cwd(), '../contracts/build/contracts/gateway'),
target: 'gateway',
},
{
name: 'fund',
path: path.resolve(process.cwd(), '../contracts/build/contracts/fund'),
target: 'fund',
},
{
name: 'ledger',
path: path.resolve(process.cwd(), '../contracts/build/contracts/ledger'),
target: 'ledger',
},
{
name: 'test',
path: path.resolve(process.cwd(), '../contracts/build/contracts/test'),
target: 'test',
},
{
name: 'contributor',
path: path.resolve(process.cwd(), '../contracts/build/contracts/contributor'),
target: 'contributor',
},
{
name: 'capital',
path: path.resolve(process.cwd(), '../contracts/build/contracts/capital'),
target: 'capital',
},
{
name: 'wallet',
path: path.resolve(process.cwd(), '../contracts/build/contracts/wallet'),
target: 'wallet',
},
{
name: 'loan',
path: path.resolve(process.cwd(), '../contracts/build/contracts/loan'),
target: 'loan',
},
{
name: 'meet',
path: path.resolve(process.cwd(), '../contracts/build/contracts/meet'),
target: 'meet',
},
]
+24
View File
@@ -0,0 +1,24 @@
{
"initial_timestamp": "2024-06-19T06:00:00.000",
"initial_key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"initial_configuration": {
"max_block_net_usage": 1048576,
"target_block_net_usage_pct": 1000,
"max_transaction_net_usage": 1048575,
"base_per_transaction_net_usage": 12,
"net_usage_leeway": 500,
"context_free_discount_net_usage_num": 20,
"context_free_discount_net_usage_den": 100,
"max_block_cpu_usage": 300000,
"target_block_cpu_usage_pct": 500,
"max_transaction_cpu_usage": 290000,
"min_transaction_cpu_usage": 100,
"max_transaction_lifetime": 3600,
"deferred_trx_expiration_window": 600,
"max_transaction_delay": 3888000,
"max_inline_action_size": 4096,
"max_inline_action_depth": 10,
"max_authority_depth": 6
},
"initial_chain_id": "0000000000000000000000000000000000000000000000000000000000000000"
}
+221
View File
@@ -0,0 +1,221 @@
/* eslint-disable node/prefer-global/process */
import path from 'node:path'
import { config } from 'dotenv'
import contracts from './contracts'
config()
const network = {
name: 'local',
protocol: 'http',
host: 'localhost',
port: ':8888',
}
// const network = {
// name: 'local',
// protocol: 'https',
// host: 'test.coopenomics.world:443/api',
// port: '',
// }
export const SYMBOL = 'AXON'
export const GOVERN_SYMBOL = 'RUB'
export const provider = 'voskhod'
export const provider_chairman = 'ant'
export const public_key = process.env.EOSIO_PUB_KEY as string
export const private_key = process.env.EOSIO_PRV_KEY as string
export default {
network,
default_public_key: public_key,
system: 'eosio',
provider,
provider_chairman,
private_keys: [private_key],
emission: {
left_border: `1000.0000 ${SYMBOL}`,
tact_duration: 86400,
emission_factor: 0.618,
},
token: {
symbol: SYMBOL,
govern_symbol: GOVERN_SYMBOL,
precision: 4,
max_supply: `1000000000.0000 ${SYMBOL}`,
},
powerup: {
days: 1,
min_powerup: `0.0001 ${SYMBOL}`,
},
allocations: [
{
to: 'eosio',
quantity: `10000.0000 ${SYMBOL}`,
},
],
accounts: [
{
name: 'eosio.token',
},
{
name: 'eosio.bpay',
},
{
name: 'eosio.vpay',
},
{
name: 'eosio.msig',
},
{
name: 'eosio.wrap',
},
{
name: 'eosio.power',
},
{
name: 'eosio.saving',
code_permissions_to: ['eosio.saving'],
},
{
name: 'registrator',
code_permissions_to: ['registrator'],
},
{
name: 'capital',
code_permissions_to: ['capital'],
},
{
name: 'loan',
code_permissions_to: ['loan'],
},
{
name: 'ledger',
code_permissions_to: ['ledger'],
},
{
name: 'test',
code_permissions_to: ['test'],
},
{
name: 'meet',
code_permissions_to: ['meet'],
},
{
name: 'wallet',
code_permissions_to: ['wallet'],
},
{
name: 'soviet',
code_permissions_to: ['soviet'],
},
{
name: 'branch',
code_permissions_to: ['branch'],
},
{
name: 'marketplace',
code_permissions_to: ['marketplace'],
},
{
name: 'draft',
code_permissions_to: ['draft'],
},
{
name: 'gateway',
code_permissions_to: ['gateway'],
},
{
name: 'fund',
code_permissions_to: ['fund'],
},
{
name: 'contributor',
code_permissions_to: ['contributor'],
},
{
name: provider_chairman,
},
{
name: provider,
code_permissions_to: ['registrator'],
},
],
contracts,
features: [
{
name: 'ACTION_RETURN_VALUE',
hash: 'c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071',
},
{
name: 'CONFIGURABLE_WASM_LIMITS2',
hash: 'd528b9f6e9693f45ed277af93474fd473ce7d831dae2180cca35d907bd10cb40',
},
{
name: 'BLOCKCHAIN_PARAMETERS',
hash: '5443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4',
},
{
name: 'GET_SENDER',
hash: 'f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d',
},
{
name: 'FORWARD_SETCODE',
hash: '2652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25',
},
{
name: 'ONLY_BILL_FIRST_AUTHORIZER',
hash: '8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405',
},
{
name: 'RESTRICT_ACTION_TO_SELF',
hash: 'ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43',
},
{
name: 'DISALLOW_EMPTY_PRODUCER_SCHEDULE',
hash: '68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428',
},
{
name: 'FIX_LINKAUTH_RESTRICTION',
hash: 'e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526',
},
{
name: 'REPLACE_DEFERRED',
hash: 'ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99',
},
{
name: 'NO_DUPLICATE_DEFERRED_ID',
hash: '4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f',
},
{
name: 'ONLY_LINK_TO_EXISTING_PERMISSION',
hash: '1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241',
},
{
name: 'RAM_RESTRICTIONS',
hash: '4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d67',
},
{
name: 'WEBAUTHN_KEY',
hash: '4fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2',
},
{
name: 'WTMSIG_BLOCK_SIGNATURES',
hash: '299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707',
},
{
name: 'GET_CODE_HASH',
hash: 'bcd2a26394b36614fd4894241d3c451ab0f6fd110958c3423073621a70826e99',
},
{
name: 'GET_BLOCK_NUM',
hash: '35c2186cc36f7bb4aeaf4487b36e57039ccf45a9136aa856a5d569ecca55ef2b',
},
{
name: 'CRYPTO_PRIMITIVES',
hash: '6bcb40a24e49c26d0a60513b6aeb8551d264e4717f306b81a37a5afb3b47cedc',
},
],
}
+10
View File
@@ -0,0 +1,10 @@
import type { Network } from '../types'
export const networks: Network[] = [
{
name: 'local',
protocol: 'http',
host: '127.0.0.1',
port: ':8888',
},
]
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "69b064c5178e2738e144ed6caa9349a3995370d78db29e494b3126ebd9111966",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "ACTION_RETURN_VALUE"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "70787548dcea1a2c52c913a37f74ce99e6caae79110d7ca7b859936a0075b314",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "BLOCKCHAIN_PARAMETERS"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "c0cce5bcd8ea19a28d9e12eafda65ebe6d0e0177e280d4f20c7ad66dcd9e011b",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "BLS_PRIMITIVES2"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "8139e99247b87f18ef7eae99f07f00ea3adf39ed53f4d2da3f44e6aa0bfd7c62",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "CONFIGURABLE_WASM_LIMITS2"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "68d6405cb8df3de95bd834ebb408196578500a9f818ff62ccc68f60b932f7d82",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "CRYPTO_PRIMITIVES"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "440c3efaaab212c387ce967c574dc813851cf8332d041beb418dfaf55facd5a9",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "DISABLE_DEFERRED_TRXS_STAGE_1"
}
@@ -0,0 +1,13 @@
{
"protocol_feature_type": "builtin",
"dependencies": [
"fce57d2331667353a0eac6b4209b67b843a7262a848af0a49a6e2fa9f6584eb4"
],
"description_digest": "a857eeb932774c511a40efb30346ec01bfb7796916b54c3c69fe7e5fb70d5cba",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "DISABLE_DEFERRED_TRXS_STAGE_2"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "2853617cec3eabd41881eb48882e6fc5e81a0db917d375057864b3befbe29acd",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "DISALLOW_EMPTY_PRODUCER_SCHEDULE"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "a98241c83511dc86c857221b9372b4aa7cea3aaebc567a48604e1d3db3557050",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "FIX_LINKAUTH_RESTRICTION"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "898082c59f921d0042e581f00a59d5ceb8be6f1d9c7a45b6f07c0e26eaee0222",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "FORWARD_SETCODE"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "e5d7992006e628a38c5e6c28dd55ff5e57ea682079bf41fef9b3cced0f46b491",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "GET_BLOCK_NUM"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "d2596697fed14a0840013647b99045022ae6a885089f35a7e78da7a43ad76ed4",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "GET_CODE_HASH"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "1eab748b95a2e6f4d7cb42065bdee5566af8efddf01a55a0a8d831b823f8828a",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "GET_SENDER"
}
@@ -0,0 +1,13 @@
{
"protocol_feature_type": "builtin",
"dependencies": [
"ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99"
],
"description_digest": "45967387ee92da70171efd9fefd1ca8061b5efe6f124d269cd2468b47f1575a0",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "NO_DUPLICATE_DEFERRED_ID"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "2f1f13e291c79da5a2bbad259ed7c1f2d34f697ea460b14b565ac33b063b73e2",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "ONLY_BILL_FIRST_AUTHORIZER"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "f3c3d91c4603cde2397268bfed4e662465293aab10cd9416db0d442b8cec2949",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "ONLY_LINK_TO_EXISTING_PERMISSION"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "64fe7df32e9b86be2b296b3f81dfd527f84e82b98e363bc97e40bc7a83733310",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": false,
"enabled": true
},
"builtin_feature_codename": "PREACTIVATE_FEATURE"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "1812fdb5096fd854a4958eb9d53b43219d114de0e858ce00255bd46569ad2c68",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "RAM_RESTRICTIONS"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "9908b3f8413c8474ab2a6be149d3f4f6d0421d37886033f27d4759c47a26d944",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "REPLACE_DEFERRED"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "e71b6712188391994c78d8c722c1d42c477cf091e5601b5cf1befd05721a57f3",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "RESTRICT_ACTION_TO_SELF"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "927fdf78c51e77a899f2db938249fb1f8bb38f4e43d9c1f75b190492080cbc34",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "WEBAUTHN_KEY"
}
@@ -0,0 +1,11 @@
{
"protocol_feature_type": "builtin",
"dependencies": [],
"description_digest": "ab76031cad7a457f4fd5f5fca97a3f03b8a635278e0416f77dcc91eb99a48e10",
"subjective_restrictions": {
"earliest_allowed_activation_time": "1970-01-01T00:00:00.000",
"preactivation_required": true,
"enabled": true
},
"builtin_feature_codename": "WTMSIG_BLOCK_SIGNATURES"
}
+3
View File
@@ -0,0 +1,3 @@
import { runContainer } from './run'
export const container = await runContainer()
+34
View File
@@ -0,0 +1,34 @@
/* eslint-disable node/prefer-global/process */
import Blockchain from '../blockchain'
import contracts from '../configs/contracts'
import type { INetwork } from '../configs/networks'
import { networks } from '../configs/networks'
import type { Contract } from '../types'
import { execCommand } from './exec'
export async function deployCommand(name: string, pre_target: string, pre_network: string): Promise<void> {
const network: INetwork | undefined = networks.find(el => el.name === pre_network)
if (!network)
throw new Error('Сеть не найдена')
const contract = contracts.find(el => el.name === name)
if (!contract)
throw new Error('Контракт не найден')
let target = contract.target
if (pre_target)
target = pre_target
const contract_for_deploy: Contract = {
path: contract.path,
name,
target,
}
const blockchain = new Blockchain(network, [process.env.EOSIO_PRV_KEY as string])
await blockchain.update_pass_instance()
await blockchain.setContract(contract_for_deploy)
}
+25
View File
@@ -0,0 +1,25 @@
import { exec } from 'node:child_process'
import { promisify } from 'node:util'
const execAsync = promisify(exec)
export async function execCommand(command: string[]): Promise<void> {
const fullCmd = ['docker', 'compose', 'exec', 'node', ...command].join(' ')
try {
// eslint-disable-next-line node/prefer-global/process
const { stdout, stderr } = await execAsync(fullCmd, { env: process.env })
if (stdout)
console.log(stdout.trim())
if (stderr)
console.error(stderr.trim())
}
catch (err: any) {
if (err.stdout)
console.log(err.stdout.trim())
if (err.stderr)
console.error(err.stderr.trim())
// опционально:
// console.error(`Command failed with code ${err.code}`)
}
}
+14
View File
@@ -0,0 +1,14 @@
import Docker from 'dockerode'
const docker = new Docker()
export async function findContainerByName(name: string) {
const containers = await docker.listContainers({ all: true })
const containerInfo = containers.find(c => c.Names.includes(`/${name}`))
if (containerInfo) {
return docker.getContainer(containerInfo.Id)
}
return null
}
+28
View File
@@ -0,0 +1,28 @@
import axios from 'axios'
async function sleep(ms: number): Promise<void> {
return new Promise(resolve => setTimeout(resolve, ms))
}
export async function checkHealth() {
const check = async (): Promise<void> => {
try {
const response = await axios.post('http://127.0.0.1:8888/v1/chain/get_info')
const result = response.data
await sleep(1000)
console.log('Node is healthy. Continue.', result)
}
catch (error: any) {
console.error(error)
console.log('Блокчейн не доступен с ошибкой. Он поднят? docker compose up -d')
await sleep(1000)
return check() // Повторный вызов функции
}
}
return check()
}
+70
View File
@@ -0,0 +1,70 @@
import { promises as fs } from 'node:fs'
import * as path from 'node:path'
import mongoose from 'mongoose'
export async function clearDB(): Promise<void> {
// eslint-disable-next-line node/prefer-global/process
await mongoose.connect(process.env.MONGO_URI as string)
try {
await mongoose.connection.collection('users').deleteMany({})
console.log('Все документы удалены из коллекции users')
}
catch (e) {
console.error('Ошибка при удалении:', e)
}
try {
await mongoose.connection.collection('sync').deleteMany({})
console.log('Все документы удалены из коллекции sync')
}
catch (e) {
console.error('Ошибка при удалении:', e)
}
try {
await mongoose.connection.collection('actions').deleteMany({})
console.log('Все документы удалены из коллекции actions')
}
catch (e) {
console.error('Ошибка при удалении:', e)
}
try {
await mongoose.connection.collection('deltas').deleteMany({})
console.log('Все документы удалены из коллекции deltas')
}
catch (e) {
console.error('Ошибка при удалении:', e)
}
}
export async function clearDirectory(dirPath: string): Promise<void> {
try {
const files = await fs.readdir(dirPath)
for (const file of files) {
const filePath = path.join(dirPath, file)
const stats = await fs.stat(filePath)
if (stats.isDirectory()) {
await clearDirectory(filePath)
await fs.rmdir(filePath)
}
else {
await fs.unlink(filePath)
}
}
}
catch (err) {
console.error(`Error clearing directory ${dirPath}:`, err)
}
}
export async function deleteFile(filePath: string): Promise<void> {
try {
await fs.unlink(filePath)
}
catch (err) {
// console.error(`Error deleting file ${filePath}:`, err)
}
}
+17
View File
@@ -0,0 +1,17 @@
import { exec } from 'node:child_process'
import { config } from 'dotenv'
config()
export async function runContainer(): Promise<void> {
return new Promise((resolve, reject) => {
exec('docker compose up -d node', (error, stdout, stderr) => {
if (error) {
console.error(`Ошибка при запуске контейнера: ${error.message}`)
reject(error)
return
}
resolve()
})
})
}
+11
View File
@@ -0,0 +1,11 @@
import Docker from 'dockerode'
import { findContainerByName } from './find'
export async function stopContainerByName(name: string) {
const container = await findContainerByName(name)
if (container) {
await container.stop()
console.log(`Container stopped.`)
}
}
+192
View File
@@ -0,0 +1,192 @@
/* eslint-disable node/prefer-global/process */
import path from 'node:path'
import fs from 'node:fs'
import { Command } from 'commander'
import { config } from 'dotenv'
import { execCommand } from './docker/exec'
import { stopContainerByName } from './docker/stop'
import { runContainer } from './docker/run'
import { boot } from './init/booter'
import { sleep } from './utils'
import { checkHealth } from './docker/health'
import { clearDB, clearDirectory, deleteFile } from './docker/purge'
import { deployCommand } from './docker/deploy'
config()
const basePath = path.resolve(process.cwd(), './blockchain-data')
const keosdPath = path.resolve(process.cwd(), './wallet-data/keosd.sock')
if (!fs.existsSync(basePath)) {
fs.mkdirSync(basePath, { recursive: true })
}
if (!fs.existsSync(keosdPath)) {
fs.mkdirSync(keosdPath, { recursive: true })
}
const program = new Command()
program.version('0.1.0')
// Команда для запуска команды в контейнере
program
.command('cleos [cmd...]')
.description('Execute a cleos command in a Node container')
.allowUnknownOption()
.action(async (cmd: string[] = []) => {
await execCommand(['cleos', ...cmd])
})
// Команда для запуска команды в контейнере
program
.command('deploy <contract_name>')
.description('Execute a deploy command in a Node container')
.option('-t, --target <target>', 'Specify the target')
.option('-n, --network <network>', 'Specify the network', 'local')
.allowUnknownOption()
.action(async (cmd: string, options: any) => {
try {
const { target, network } = options
await deleteFile(keosdPath)
await deployCommand(cmd, target, network)
}
catch (error) {
console.error('Command execution failed:', error)
}
})
// Команда для получения списка контейнеров
program
.command('stop')
.description('Stop blockchain node as is')
.action(async () => {
try {
await stopContainerByName('node')
console.log('Container is stopped')
}
catch (error) {
console.error('Failed to list containers:', error)
}
})
// Команда для запуска команды в контейнере
program
.command('unlock')
.description('Unlock a cleos wallet with a .env password')
.allowUnknownOption()
.action(async () => {
try {
await execCommand([
'cleos',
'wallet',
'unlock',
'--password',
process.env.PASSWORD!,
])
}
catch (error) {
console.error('Command execution failed:', error)
}
})
// Команда для получения списка контейнеров
program
.command('start')
.description('Start blockchain node as is')
.action(async () => {
try {
await deleteFile(keosdPath)
await runContainer()
console.log('Container is started')
}
catch (error) {
console.error('Failed to list containers:', error)
}
})
// Команда для получения списка контейнеров
program
.command('boot')
.description('Purge blockchain data and boot a Protocol')
.action(async () => {
try {
await stopContainerByName('node')
}
catch (e) {
console.log('Нет контейнера для остановки. Стартуем новый..')
}
try {
await runContainer()
await sleep(5000)
await checkHealth()
await boot()
console.log(`
Boot is
.d8888b. .d88888b. 888b d888 8888888b. 888 8888888888 88888888888 8888888888
d88P Y88b d88P" "Y88b 8888b d8888 888 Y88b 888 888 888 888
888 888 888 888 88888b.d88888 888 888 888 888 888 888
888 888 888 888Y88888P888 888 d88P 888 8888888 888 8888888
888 888 888 888 Y888P 888 8888888P" 888 888 888 888
888 888 888 888 888 Y8P 888 888 888 888 888 888
Y88b d88P Y88b. .d88P 888 " 888 888 888 888 888 888
"Y8888P" "Y88888P" 888 888 888 88888888 8888888888 888 8888888888
`)
process.exit(0)
}
catch (error) {
console.error('Failed to boot:', error)
process.exit(1)
}
})
// Команда для получения списка контейнеров
program
.command('clear')
.description('Purge blockchain data and boot a Protocol')
.action(async () => {
try {
await stopContainerByName('node')
await deleteFile(keosdPath)
await clearDirectory(basePath)
await sleep(5000)
await clearDB()
await runContainer()
console.log('Блокчейн очищен и перезапущен. Запустите загрузку: pnpm run boot')
process.exit(0)
}
catch (error) {
console.error('Failed to boot:', error)
process.exit(1)
}
})
// Команда для получения списка контейнеров
program
.command('only-boot')
.description('Boot a Protocol')
.action(async () => {
try {
await boot()
}
catch (error) {
console.error('Failed to boot:', error)
}
})
program.parse(process.argv) // Пуск парсинга аргументов
async function gracefulShutdown() {
// console.log('Stopping container...')
// await stopContainerByName('node')
process.exit(0)
}
process.on('SIGINT', gracefulShutdown)
process.on('SIGTERM', gracefulShutdown)
+7
View File
@@ -0,0 +1,7 @@
import { startInfra } from './infra'
import { startCoop } from './cooperative'
export async function boot() {
await startInfra()
await startCoop()
}
+219
View File
@@ -0,0 +1,219 @@
import type { Cooperative } from 'cooptypes'
import type { Keys } from '../types'
import config, { GOVERN_SYMBOL, SYMBOL } from '../configs'
import Blockchain from '../blockchain'
import { generateRandomSHA256 } from '../utils/randomHash'
import { processLastDecision } from '../tests/soviet/processLastDecision'
const test_hash
= '157192b276da23cc84ab078fc8755c051c5f0430bf4802e55718221e6b76c777'
const test_sign
= 'SIG_K1_KmKWPBC8dZGGDGhbKEoZEzPr3h5crRrR2uLdGRF5DJbeibY1MY1bZ9sPwHsgmPfiGFv9psfoCVsXFh9TekcLuvaeuxRKA8'
const test_pkey = 'EOS5JhMfxbsNebajHcTEK8yC9uNN9Dit9hEmzE8ri8yMhhzxrLg3J'
const test_meta = JSON.stringify({})
const document: Cooperative.Document.ISignedDocument2 = {
hash: test_hash,
signatures: [
{
id: 1,
signed_hash: test_hash,
public_key: test_pkey,
signed_at: '2025-05-14T12:22:26',
meta: test_meta,
signer: 'cooperative1',
signature: test_sign,
},
],
meta: test_meta,
version: '1.0.0',
doc_hash: test_hash,
meta_hash: test_hash,
}
export class CooperativeClass {
public blockchain: Blockchain
constructor(blockchain: Blockchain) {
this.blockchain = blockchain
}
async createPrograms(coopname: string) {
await this.blockchain.createProgram({
coopname,
username: coopname,
type: 'marketplace',
title: 'КООПЛЕЙС',
announce: '',
description: '',
preview: '',
images: '',
calculation_type: 'relative',
fixed_membership_contribution: `${Number(0).toFixed(4)} ${GOVERN_SYMBOL}`,
membership_percent_fee: 10000, // 10%
meta: '',
is_can_coop_spend_share_contributions: false,
})
await this.blockchain.createProgram({
coopname,
username: coopname,
type: 'source',
title: 'Генерация',
announce: '',
description: '',
preview: '',
images: '',
calculation_type: 'free',
fixed_membership_contribution: `${Number(0).toFixed(4)} ${GOVERN_SYMBOL}`,
membership_percent_fee: 0, // 10%
meta: '',
is_can_coop_spend_share_contributions: true,
})
await this.blockchain.createProgram({
coopname,
username: coopname,
type: 'capital',
title: 'Благосостояние',
announce: '',
description: '',
preview: '',
images: '',
calculation_type: 'free',
fixed_membership_contribution: `${Number(0).toFixed(4)} ${GOVERN_SYMBOL}`,
membership_percent_fee: 0, // 10%
meta: '',
is_can_coop_spend_share_contributions: true,
})
}
async createCooperative(username: string, keys?: Keys) {
const account = await this.blockchain.generateKeypair(
username,
keys,
'Аккаунт кооператива',
)
console.log('Регистрируем аккаунт')
await this.blockchain.createAccount({
coopname: config.provider,
referer: '',
username: account.username,
public_key: account.publicKey,
meta: '',
})
console.log('Регистрируем аккаунт как пользователя')
const registration_hash = generateRandomSHA256()
await this.blockchain.registerUser({
coopname: config.provider,
braname: '',
username: account.username,
type: 'organization',
statement: document,
registration_hash,
})
console.log('Отправляем заявление на вступление')
await this.blockchain.ConfirmPayment({
coopname: config.provider,
income_hash: registration_hash,
})
await processLastDecision(this.blockchain, config.provider)
// console.log('Голосуем по решению в провайдере')
// await this.blockchain.votefor({
// version: '1.0.0',
// signed_at: '2025-05-14T12:22:26',
// signed_hash: test_hash,
// signature: test_sign,
// public_key: test_pkey,
// coopname: config.provider,
// username: config.provider_chairman,
// decision_id: 1,
// })
// console.log('Утверждаем решение в провайдере')
// await this.blockchain.authorize({
// coopname: config.provider,
// chairman: config.provider_chairman,
// decision_id: 1,
// document,
// })
// console.log('Исполняем решение в провайдере')
// await this.blockchain.exec({
// executer: config.provider_chairman,
// coopname: config.provider,
// decision_id: 1,
// })
console.log('Отправляем подписанное положение о ЦПП Кошелька оператору')
await this.blockchain.sendAgreement({
coopname: config.provider,
administrator: config.provider,
username: username!,
agreement_type: 'wallet',
document,
})
console.log('Переводим аккаунт в кооператив')
await this.blockchain.registerCooperative({
username: account.username,
coopname: account.username,
params: {
is_cooperative: true,
coop_type: 'conscoop',
announce: 'Тестовый кооператив',
description: 'Тестовое описание',
initial: `100.0000 ${config.token.govern_symbol}`,
minimum: `300.0000 ${config.token.govern_symbol}`,
org_initial: `1000.0000 ${config.token.govern_symbol}`,
org_minimum: `3000.0000 ${config.token.govern_symbol}`,
},
document,
})
console.log('Переводим инициализационные токены')
await this.blockchain.transfer({ from: 'eosio', to: account.username, quantity: `100.0000 ${SYMBOL}`, memo: '' })
console.log(`Арендуем ресурсы кооперативу`)
await this.blockchain.powerup({
payer: 'eosio',
receiver: username,
days: config.powerup.days,
payment: `100.0000 ${config.token.symbol}`,
transfer: true,
})
}
}
export async function startCoop() {
// инициализируем инстанс с ключами
const blockchain = new Blockchain(config.network, config.private_keys)
const cooperative = new CooperativeClass(blockchain)
await cooperative.createCooperative('cooperative1', {
// eslint-disable-next-line node/prefer-global/process
privateKey: process.env.EOSIO_PRV_KEY!,
// eslint-disable-next-line node/prefer-global/process
publicKey: process.env.EOSIO_PUB_KEY!,
})
await blockchain.preInit({
coopname: 'cooperative1',
username: config.provider,
status: 'active',
})
console.log('Кооператив предварительно подготовлен к установке совета.')
}
+338
View File
@@ -0,0 +1,338 @@
import { randomUUID } from 'node:crypto'
import axios from 'axios'
import { Generator, Registry } from '@coopenomics/factory'
import type { Cooperative } from 'cooptypes'
import { DraftContract } from 'cooptypes'
import mongoose from 'mongoose'
import type { Account, Contract } from '../types'
import config from '../configs'
import Blockchain from '../blockchain'
import { sleep } from '../utils'
import { CooperativeClass } from './cooperative'
export async function startInfra() {
// инициализируем инстанс с ключами
const blockchain = new Blockchain(config.network, config.private_keys)
await blockchain.update_pass_instance()
// регистрируем базовые аккаунты
for (const account of config.accounts) {
const { name, ownerPublicKey, activePublicKey } = account as Account
await blockchain.createStandartAccount(
'eosio',
name,
ownerPublicKey || config.default_public_key,
activePublicKey || config.default_public_key,
)
}
// пре-активируем фичу для запуска
const url = `${config.network.protocol}://${config.network.host}${config.network.port}`
try {
const response = await axios.post(
`${url}/v1/producer/schedule_protocol_feature_activations`,
{
protocol_features_to_activate: [
'0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd',
],
},
)
console.log('ok -> init activation: ', response.data)
}
catch (e) {
console.log('error -> init activation: ', e)
}
// чуть ждём
await sleep(1000)
// устанавливаем биос
const bios = config.contracts.find(el => el.name === 'eosio.boot')
await blockchain.setContract(bios as Contract)
// чуть ждём
await sleep(2000)
// активируем все оставшиеся фичи
for (const feature of config.features)
await blockchain.activateFeature(feature)
// чуть ждём
await sleep(2000)
// устанавливаем все оставшиеся контракты
const filtered_contracts = config.contracts.filter(
el => el.name !== 'eosio.boot',
)
for (const contract of filtered_contracts)
await blockchain.setContract(contract)
await sleep(2000)
console.log('создаём токен')
await blockchain.createToken({
issuer: 'eosio',
maximum_supply: config.token.max_supply,
})
await sleep(2000)
console.log('выпускаем токены')
for (const allocation of config.allocations) {
await blockchain.issueToken({
to: allocation.to,
quantity: allocation.quantity,
memo: '',
})
}
await sleep(2000)
// выдаём кодовые разрешения всем указанным аккаунтам
for (const account of config.accounts.filter(
el => !!el.code_permissions_to,
)) {
for (const permission_to of account.code_permissions_to ?? []) {
await blockchain.updateAccountPermissionsToCode(
account.name,
permission_to,
)
}
}
await sleep(1000)
// инициализируем системный контракт
await blockchain.initSystem({
version: 0,
core: `${config.token.precision},${config.token.symbol}`,
})
await sleep(1000)
// инициализируем эмиссию
await blockchain.initEmission({
init_supply: config.emission.left_border,
tact_duration: config.emission.tact_duration,
emission_factor: config.emission.emission_factor,
})
await sleep(2000)
await blockchain.initPowerup({
args: {
powerup_days: config.powerup.days,
min_powerup_fee: config.powerup.min_powerup,
},
})
await sleep(2000)
for (const id in Registry) {
const template = Registry[(id as unknown) as keyof typeof Registry]
await blockchain.createDraft({
scope: DraftContract.contractName.production,
username: 'eosio',
registry_id: id,
lang: 'ru',
title: template.Template.title,
description: template.Template.description,
context: template.Template.context,
model: JSON.stringify(template.Template.model),
translation_data: JSON.stringify(template.Template.translations.ru),
})
}
const organizationData: Cooperative.Users.IOrganizationData = {
username: 'voskhod',
type: 'coop',
short_name: '"ПК Восход"',
full_name: 'Потребительский Кооператив "ВОСХОД"',
represented_by: {
first_name: 'Иван',
last_name: 'Иванов',
middle_name: 'Иванович',
position: 'Председатель',
based_on: 'Решение общего собрания №1',
},
country: 'Российская Федерация',
city: 'Москва',
fact_address: '117593 г. Москва, муниципальный округ Ясенево, проезд Соловьиный, дом 1, помещение 1/1',
full_address:
'117593 г. Москва, муниципальный округ Ясенево, проезд Соловьиный, дом 1, помещение 1/1',
email: 'copenomics@yandex.ru',
phone: '+71234567890',
details: {
inn: '9728130611',
ogrn: '1247700283346',
kpp: '772801001',
},
}
const generator = new Generator()
// eslint-disable-next-line node/prefer-global/process
await generator.connect(process.env.MONGO_URI as string)
await generator.save('organization', organizationData)
console.log('Провайдер добавлен: ', organizationData)
await generator.save('paymentMethod', {
is_default: true,
method_id: randomUUID(),
method_type: 'bank_transfer',
username: 'voskhod',
data: {
account_number: '40703810038000110117',
currency: 'RUB',
card_number: '',
bank_name: 'ПАО Сбербанк',
details: {
bik: '044525225',
corr: '30101810400000000225',
kpp: '773643001',
},
},
})
const userData: Cooperative.Users.IIndividualData = {
username: 'ant',
first_name: 'Иван',
last_name: 'Иванов',
middle_name: 'Иванович',
birthdate: '1990/04/01',
phone: '+71234567890',
email: 'ivanov@example.com',
full_address: 'Переулок Правды д. 1',
passport: {
series: 7122,
number: 112233,
issued_by: 'отделом УФМС по г. Москва',
issued_at: '2010/05/10',
code: '111-232',
},
}
await generator.save('individual', userData)
// добавляем переменные кооператива
const vars: Cooperative.Model.IVars = {
coopname: 'voskhod',
full_abbr: 'потребительский кооператив',
full_abbr_genitive: 'потребительского кооператива',
full_abbr_dative: 'потребительскому кооперативу',
short_abbr: 'ПК',
website: 'цифровой-кооператив.рф',
name: 'Восход',
confidential_link: 'coopenomics.world/privacy',
confidential_email: 'privacy@coopenomics.world',
contact_email: 'contact@coopenomics.world',
passport_request: 'no',
wallet_agreement: {
protocol_number: '10-04-2024',
protocol_day_month_year: '10 апреля 2024 г.',
},
signature_agreement: {
protocol_number: '10-04-2024',
protocol_day_month_year: '10 апреля 2024 г.',
},
privacy_agreement: {
protocol_number: '10-04-2024',
protocol_day_month_year: '10 апреля 2024 г.',
},
user_agreement: {
protocol_number: '10-04-2024',
protocol_day_month_year: '10 апреля 2024 г.',
},
participant_application: {
protocol_number: '10-04-2024',
protocol_day_month_year: '10 апреля 2024 г.',
},
}
await generator.save('vars', vars)
// eslint-disable-next-line node/prefer-global/process
await mongoose.connect(process.env.MONGO_URI as string)
try {
await mongoose.connection.collection('sync').deleteMany({})
console.log('Все документы удалены из коллекции sync')
}
catch (e) {
console.error('Ошибка при удалении:', e)
}
try {
await mongoose.connection.collection('actions').deleteMany({})
console.log('Все документы удалены из коллекции actions')
}
catch (e) {
console.error('Ошибка при удалении:', e)
}
try {
await mongoose.connection.collection('deltas').deleteMany({})
console.log('Все документы удалены из коллекции deltas')
}
catch (e) {
console.error('Ошибка при удалении:', e)
}
// добавляем пользователя для подключений
try {
await mongoose.connection.collection('users').insertOne({
email: 'ivanov@example.com',
username: 'ant',
type: 'individual',
role: 'chairman',
is_registered: true,
})
}
catch (e) { console.log('user is exist') }
// имитируем установку
try {
await mongoose.connection.collection('monos').insertOne({
coopname: 'voskhod',
status: 'active',
})
}
catch (e) {
console.log('system is exist')
}
// сохраняем зашированный ключ в vault
try {
await mongoose.connection.collection('vaults').insertOne({
username: 'voskhod',
permission: 'active',
wif: '9d6479a9d77ead53fb0e5e54b3608a95:2046ee3c1577d48aecbee49e8f25c4c2df37ab02f15d73d0d1b6352f53a4b774cb9e71b6028fd7caf64568e195c7878dfbb5d2bf10a3766d90ba9e92ea724428',
})
}
catch (e) { console.log('vault is exist') }
console.log('Создаём программы и соглашения')
const cooperative = new CooperativeClass(blockchain)
await cooperative.createPrograms(config.provider)
console.log(`Арендуем ресурсы провайдеру`)
await blockchain.powerup({
payer: 'eosio',
receiver: config.provider,
days: config.powerup.days,
payment: `100.0000 ${config.token.symbol}`,
transfer: true,
})
await blockchain.transfer({
from: 'eosio',
to: config.provider,
quantity: `1000.0000 ${config.token.symbol}`,
memo: '',
})
console.log('Базовая установка завершена')
}
+203
View File
@@ -0,0 +1,203 @@
import axios from 'axios'
import { describe, expect, it } from 'vitest'
import { Registry } from '@coopenomics/factory'
import { RegistratorContract, Cooperative as TCooperative } from 'cooptypes'
import type { Account, Contract, Keys } from '../types'
import config, { GOVERN_SYMBOL, SYMBOL } from '../configs'
import Blockchain from '../blockchain'
import { sendPostToCoopbackWithSecret, sleep } from '../utils'
import { fakeDocument } from '../tests/shared/fakeDocument'
export class ParticipantsClass {
public blockchain: Blockchain
constructor(blockchain: Blockchain) {
this.blockchain = blockchain
}
async addUser2(coopname: string, username: string, keys?: Keys, referer?: string) {
const account = await this.blockchain.generateKeypair(
username,
keys,
'Аккаунт участника',
)
console.log('Регистрируем аккаунт')
const data: RegistratorContract.Actions.AddUser.IAddUser = {
coopname,
referer: referer || '',
username: account.username,
type: 'individual',
created_at: '2025-02-05T09:34:27',
initial: '100.0000 RUB',
minimum: '100.0000 RUB',
spread_initial: false,
meta: '',
}
await this.blockchain.api.transact({
actions: [
{
account: RegistratorContract.contractName.production,
name: RegistratorContract.Actions.AddUser.actionName,
authorization: [{ actor: coopname, permission: 'active' }],
data,
},
],
}, {
blocksBehind: 3,
expireSeconds: 30,
})
console.log('Регистрируем аккаунт как пользователя')
const changeKey: RegistratorContract.Actions.ChangeKey.IChangeKey = {
coopname,
username,
public_key: account.publicKey,
changer: coopname,
}
await this.blockchain.api.transact({
actions: [
{
account: RegistratorContract.contractName.production,
name: RegistratorContract.Actions.ChangeKey.actionName,
authorization: [{ actor: coopname, permission: 'active' }],
data: changeKey,
},
],
}, {
blocksBehind: 3,
expireSeconds: 30,
})
// console.log('Отправляем подписанное положение о ЦПП Кошелька оператору')
// await this.blockchain.sendAgreement({
// coopname: config.provider,
// administrator: config.provider,
// username: username!,
// agreement_type: 'wallet',
// document: fakeDocument,
// })
// console.log('создаём кошелёк')
// console.log(`Арендуем ресурсы кооперативу`)
// await this.blockchain.powerup({
// payer: 'eosio',
// receiver: username,
// days: config.powerup.days,
// payment: `100.0000 ${config.token.symbol}`,
// transfer: true,
// })
}
async addUser(username: string, keys?: Keys, referer?: string) {
const account = await this.blockchain.generateKeypair(
username,
keys,
'Аккаунт участника',
)
console.log('Регистрируем аккаунт')
const data: RegistratorContract.Actions.AddUser.IAddUser = {
coopname: config.provider,
referer: referer || '',
username: account.username,
type: 'individual',
created_at: '2025-02-05T09:34:27',
initial: '100.0000 RUB',
minimum: '100.0000 RUB',
spread_initial: false,
meta: '',
}
await this.blockchain.api.transact({
actions: [
{
account: RegistratorContract.contractName.production,
name: RegistratorContract.Actions.AddUser.actionName,
authorization: [{ actor: config.provider, permission: 'active' }],
data,
},
],
}, {
blocksBehind: 3,
expireSeconds: 30,
})
console.log('Регистрируем аккаунт как пользователя')
const changeKey: RegistratorContract.Actions.ChangeKey.IChangeKey = {
coopname: config.provider,
changer: config.provider,
username: account.username,
public_key: account.publicKey,
}
await this.blockchain.api.transact({
actions: [
{
account: RegistratorContract.contractName.production,
name: RegistratorContract.Actions.ChangeKey.actionName,
authorization: [{ actor: config.provider, permission: 'active' }],
data: changeKey,
},
],
}, {
blocksBehind: 3,
expireSeconds: 30,
})
console.log('Отправляем подписанное положение о ЦПП Кошелька оператору')
await this.blockchain.sendAgreement({
coopname: config.provider,
administrator: config.provider,
username: username!,
agreement_type: 'wallet',
document: fakeDocument,
})
console.log('создаём кошелёк')
// console.log(`Арендуем ресурсы кооперативу`)
// await this.blockchain.powerup({
// payer: 'eosio',
// receiver: username,
// days: config.powerup.days,
// payment: `100.0000 ${config.token.symbol}`,
// transfer: true,
// })
}
}
export async function addUser(username: string, referer?: string) {
// инициализируем инстанс с ключами
const blockchain = new Blockchain(config.network, config.private_keys)
const participants = new ParticipantsClass(blockchain)
await participants.addUser(username, {
// eslint-disable-next-line node/prefer-global/process
privateKey: process.env.EOSIO_PRV_KEY!,
// eslint-disable-next-line node/prefer-global/process
publicKey: process.env.EOSIO_PUB_KEY!,
}, referer)
}
export async function addUser2(coopname: string, username: string, referer?: string) {
// инициализируем инстанс с ключами
const blockchain = new Blockchain(config.network, config.private_keys)
const participants = new ParticipantsClass(blockchain)
await participants.addUser2(coopname, username, {
// eslint-disable-next-line node/prefer-global/process
privateKey: process.env.EOSIO_PRV_KEY!,
// eslint-disable-next-line node/prefer-global/process
publicKey: process.env.EOSIO_PUB_KEY!,
}, referer)
}
@@ -0,0 +1,450 @@
import { afterAll, beforeAll, describe, expect, it } from 'vitest'
import { CapitalContract, SovietContract } from 'cooptypes'
import Blockchain from '../blockchain'
import config from '../configs'
import { getTotalRamUsage, globalRamStats } from '../utils/getTotalRamUsage'
import { addUser, addUser2 } from '../init/participant'
import { generateRandomUsername } from '../utils/randomUsername'
import { generateRandomSHA256 } from '../utils/randomHash'
import { sleep } from '../utils'
import { CooperativeClass } from '../init/cooperative'
import { getCirculationAccount, getCoopProgramWallet, getLedgerAccountById, getUserProgramWalletAmount } from './wallet/walletUtils'
import { registerContributor } from './capital/registerContributor'
import { signAppendix } from './capital/signAppendix'
import { capitalProgramId, circulationAccountId, sourceProgramId } from './capital/consts'
import { commitToResult } from './capital/commitToResult'
import { refreshSegment } from './capital/refreshSegment'
import { signWalletAgreement } from './wallet/signWalletAgreement'
import { fakeDocument } from './shared/fakeDocument'
import { depositToWallet } from './wallet/depositToWallet'
import { signCapitalAgreement } from './capital/signCapitalAgreement'
import { addAuthor } from './capital/addAuthor'
import { getSegment } from './capital/getSegment'
import { investInProject } from './capital/investInProject'
import { processDebt } from './capital/processDebt'
import { processCreateProjectProperty } from './capital/processCreateProjectProperty'
import { processCreateProgramProperty } from './capital/processCreateProgramProperty'
import { processStartVoting } from './capital/processStartVoting'
import { createVoteDistribution, submitVote } from './capital/submitVote'
import { processCompleteVoting } from './capital/processCompleteVoting'
import { processPushResult } from './capital/processPushResult'
import { processConvertSegment } from './capital/processConvertSegment'
import { processCalculateVotes } from './capital/processCalculateVotes'
import { processAddContributor } from './capital/processAddContributor'
import { processDeleteProject } from './capital/processDeleteProject'
import { getProject } from './capital/getProject'
import { processFundProgram } from './capital/processFundProgram'
import { processRefreshProg } from './capital/processRefreshProg'
import { processFundProject } from './capital/processFundProject'
import { processRefreshProj } from './capital/processRefreshProj'
// const CLI_PATH = 'src/index.ts'
const blockchain = new Blockchain(config.network, config.private_keys)
let metaProject: CapitalContract.Actions.CreateProject.ICreateProject
let componentProject: CapitalContract.Actions.CreateProject.ICreateProject
let newComponentProject: CapitalContract.Actions.CreateProject.ICreateProject
let testCoop: string
let chairman: string
let tester1: string
let tester2: string
let tester3: string
let tester4: string
let tester5: string
let investor1: string
let investor2: string
let investor3: string
// let result1: CapitalContract.Actions.CreateResult.ICreateResult
// let result2: CapitalContract.Actions.CreateResult.ICreateResult
// let result3: CapitalContract.Actions.CreateResult.ICreateResult
const commits: string[] = []
const tester1CommitHours = 10
const tester2CommitHours = 20
const tester3CommitHours = 100
const investAmount1 = 100000
const investAmount2 = 25000
const investAmount3 = 25000
const totalToCapitalConvertAmount = 0
const totalToProjectConvertAmount = 0
// Хранение хэшей долгов для каждого пользователя
let userDebtHashes: { [username: string]: string[] } = {}
beforeAll(async () => {
testCoop = generateRandomUsername()
chairman = generateRandomUsername()
await blockchain.update_pass_instance()
const coop = new CooperativeClass(blockchain)
await coop.createCooperative(testCoop, {
privateKey: process.env.EOSIO_PRV_KEY!,
publicKey: process.env.EOSIO_PUB_KEY!,
})
await blockchain.preInit({
coopname: testCoop,
username: config.provider,
status: 'active',
})
await addUser2(testCoop, chairman)
await blockchain.createBoard({
coopname: testCoop,
username: testCoop,
type: 'soviet',
members: [{
username: chairman,
is_voting: true,
position_title: 'Председатель совета',
position: 'chairman',
}],
name: 'Совет',
description: '',
})
console.log('testcoop: ', testCoop)
investor1 = generateRandomUsername()
console.log('investor1: ', investor1)
await addUser2(testCoop, investor1)
tester1 = generateRandomUsername()
console.log('tester1: ', tester1)
await addUser2(testCoop, tester1)
tester2 = generateRandomUsername()
console.log('tester2: ', tester2)
await addUser2(testCoop, tester2)
tester3 = generateRandomUsername()
console.log('tester3: ', tester3)
await addUser2(testCoop, tester3)
tester4 = generateRandomUsername()
console.log('tester4: ', tester4)
await addUser2(testCoop, tester4)
tester5 = generateRandomUsername()
console.log('tester5: ', tester5)
await addUser2(testCoop, tester5)
// Инициализируем массивы хэшей долгов для каждого пользователя
userDebtHashes = {
[tester1]: [],
[tester2]: [],
[tester3]: [],
[tester4]: [],
[tester5]: [],
[investor1]: [],
[investor2]: [],
[investor3]: [],
}
investor2 = generateRandomUsername()
console.log('investor2: ', investor2)
await addUser2(testCoop, investor2, tester4)
investor3 = generateRandomUsername()
console.log('investor3: ', investor3)
await addUser2(testCoop, investor3, tester5)
// const { stdout } = await execa('esno', [CLI_PATH, 'boot'], { stdio: 'inherit' })
// expect(stdout).toContain('Boot process completed')
}, 500_000)
afterAll(() => {
console.log('\n📊 **RAM USAGE SUMMARY** 📊')
let totalGlobalRam = 0
for (const [key, ramUsed] of Object.entries(globalRamStats)) {
const ramKb = (ramUsed / 1024).toFixed(2)
console.log(` ${key} = ${ramKb} kb`)
totalGlobalRam += ramUsed
}
console.log(`\n💾 **TOTAL RAM USED IN TESTS**: ${(totalGlobalRam / 1024).toFixed(2)} kb\n`)
console.log(`testCoop: ${testCoop}\ntester1: ${tester1}\ntester2: ${tester2}\ntester3: ${tester3}\ntester4: ${tester4}\ntester5: ${tester5}\ninvestor1: ${investor1}\ninvestor2: ${investor2}\ninvestor3: ${investor3}`)
})
describe('тест контракта CAPITAL', () => {
it('создаём программу генерации', async () => {
const program = await getCoopProgramWallet(blockchain, testCoop, sourceProgramId)
if (!program) {
const data: SovietContract.Actions.Programs.CreateProgram.ICreateProgram = {
coopname: testCoop,
is_can_coop_spend_share_contributions: true,
username: chairman,
title: 'Договор УХД',
announce: '',
description: '',
preview: '',
images: '',
calculation_type: 'free',
fixed_membership_contribution: '0.0000 RUB',
membership_percent_fee: '0',
meta: '',
type: 'source',
}
const result = await blockchain.api.transact(
{
actions: [
{
account: SovietContract.contractName.production,
name: SovietContract.Actions.Programs.CreateProgram.actionName,
authorization: [
{
actor: chairman,
permission: 'active',
},
],
data,
},
],
},
{
blocksBehind: 3,
expireSeconds: 30,
},
)
getTotalRamUsage(result)
expect(result.transaction_id).toBeDefined()
}
})
it('создаём программу капитализации', async () => {
const program = await getCoopProgramWallet(blockchain, testCoop, capitalProgramId)
if (!program) {
const data: SovietContract.Actions.Programs.CreateProgram.ICreateProgram = {
coopname: testCoop,
is_can_coop_spend_share_contributions: false,
username: chairman,
title: 'Капитализация',
announce: '',
description: '',
preview: '',
images: '',
calculation_type: 'free',
fixed_membership_contribution: '0.0000 RUB',
membership_percent_fee: '0',
meta: '',
type: 'capital',
}
const result = await blockchain.api.transact(
{
actions: [
{
account: SovietContract.contractName.production,
name: SovietContract.Actions.Programs.CreateProgram.actionName,
authorization: [
{
actor: chairman,
permission: 'active',
},
],
data,
},
],
},
{
blocksBehind: 3,
expireSeconds: 30,
},
)
getTotalRamUsage(result)
expect(result.transaction_id).toBeDefined()
}
})
it('импорт вкладчика ДО установки конфига - должен работать', async () => {
// Создаем тестового пользователя для импорта
const importUsername = generateRandomUsername()
console.log('importUsername: ', importUsername)
await addUser2(testCoop, importUsername)
const contributorHash = generateRandomSHA256()
const contributionAmount = '10000.0000 RUB'
// Получаем состояние паевого счета ДО импорта
const shareFundBefore = await getCirculationAccount(blockchain, testCoop)
const shareFundBalanceBefore = parseFloat(shareFundBefore.available)
console.log('Share fund before import:', shareFundBalanceBefore)
// Импортируем вкладчика
const importData: CapitalContract.Actions.ImportContributor.IImportContributor = {
coopname: testCoop,
username: importUsername,
contributor_hash: contributorHash,
contribution_amount: contributionAmount,
memo: 'договор №123 от такого то числа',
}
const result = await blockchain.api.transact(
{
actions: [
{
account: CapitalContract.contractName.production,
name: CapitalContract.Actions.ImportContributor.actionName,
authorization: [
{
actor: testCoop,
permission: 'active',
},
],
data: importData,
},
],
},
{
blocksBehind: 3,
expireSeconds: 30,
},
)
getTotalRamUsage(result)
expect(result.transaction_id).toBeDefined()
// Проверяем, что вкладчик был создан
const contributorTable = await blockchain.getTableRows(
CapitalContract.contractName.production,
testCoop,
'contributors',
)
console.log('contributorTable: ', contributorTable)
expect(contributorTable.length).toBe(1)
const contributor = contributorTable[0]
expect(contributor.username).toBe(importUsername)
expect(contributor.status).toBe('active')
// Проверяем, что кошелек программы был создан
const wallet = await getUserProgramWalletAmount(blockchain, testCoop, importUsername, capitalProgramId)
expect(parseFloat(wallet)).toBe(parseFloat(contributionAmount))
// Проверяем увеличение паевого счета
const shareFundAfter = await getCirculationAccount(blockchain, testCoop)
const shareFundBalanceAfter = parseFloat(shareFundAfter.available)
console.log('Share fund after import:', shareFundBalanceAfter)
expect(shareFundBalanceAfter).toBe(shareFundBalanceBefore + parseFloat(contributionAmount))
})
it('инициализируем контракт CAPITAL и сверяем конфиг', async () => {
const data: CapitalContract.Actions.SetConfig.ISetConfig = {
coopname: testCoop,
config: {
coordinator_bonus_percent: 4,
expense_pool_percent: 100,
coordinator_invite_validity_days: 30,
voting_period_in_days: 7,
authors_voting_percent: 38.2,
creators_voting_percent: 38.2,
},
}
const result = await blockchain.api.transact(
{
actions: [
{
account: CapitalContract.contractName.production,
name: CapitalContract.Actions.SetConfig.actionName,
authorization: [
{
actor: testCoop,
permission: 'active',
},
],
data,
},
],
},
{
blocksBehind: 3,
expireSeconds: 30,
},
)
getTotalRamUsage(result)
expect(result.transaction_id).toBeDefined()
const state = (await blockchain.getTableRows(
CapitalContract.contractName.production,
CapitalContract.contractName.production,
'state',
1,
testCoop,
testCoop,
))[0]
console.log('state: ', state)
expect(state).toBeDefined()
expect(state.coopname).toBe(testCoop)
expect(parseFloat(state.config.coordinator_bonus_percent)).toBe(data.config.coordinator_bonus_percent)
expect(parseFloat(state.config.expense_pool_percent)).toBe(data.config.expense_pool_percent)
expect(parseFloat(state.config.coordinator_invite_validity_days)).toBe(data.config.coordinator_invite_validity_days)
expect(parseFloat(state.config.voting_period_in_days)).toBe(data.config.voting_period_in_days)
expect(parseFloat(state.config.authors_voting_percent)).toBe(data.config.authors_voting_percent)
expect(parseFloat(state.config.creators_voting_percent)).toBe(data.config.creators_voting_percent)
})
it('импорт вкладчика ПОСЛЕ установки конфига - должен провалиться', async () => {
// Создаем еще одного тестового пользователя для импорта
const importUsername2 = generateRandomUsername()
console.log('importUsername2: ', importUsername2)
await addUser(importUsername2)
const contributorHash2 = generateRandomSHA256()
const contributionAmount2 = '5000.0000 RUB'
// Пытаемся импортировать вкладчика после установки конфига
const importData2: CapitalContract.Actions.ImportContributor.IImportContributor = {
coopname: testCoop,
username: importUsername2,
contributor_hash: contributorHash2,
contribution_amount: contributionAmount2,
memo: 'договор №123 от такого то числа',
}
// Ожидаем, что транзакция провалится
await expect(
blockchain.api.transact(
{
actions: [
{
account: CapitalContract.contractName.production,
name: CapitalContract.Actions.ImportContributor.actionName,
authorization: [
{
actor: testCoop,
permission: 'active',
},
],
data: importData2,
},
],
},
{
blocksBehind: 3,
expireSeconds: 30,
},
),
).rejects.toThrow() // Ожидаем ошибку
// Проверяем, что вкладчик НЕ был создан
const contributorTable = await blockchain.getTableRows(
CapitalContract.contractName.production,
testCoop,
'contributors',
)
expect(contributorTable.length).toBe(1)
// Проверяем, что кошелек программы НЕ был создан
const wallet = await getUserProgramWalletAmount(blockchain, testCoop, importUsername2, capitalProgramId)
expect(wallet).toBe('0.0000 RUB')
})
})
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More