cyberia 3.2.5 → 3.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +8 -2
  2. package/.github/workflows/npmpkg.ci.yml +1 -0
  3. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  4. package/.github/workflows/release.cd.yml +2 -2
  5. package/.vscode/extensions.json +9 -9
  6. package/.vscode/settings.json +20 -4
  7. package/CHANGELOG.md +563 -1
  8. package/CLI-HELP.md +130 -34
  9. package/Dockerfile +0 -4
  10. package/README.md +194 -607
  11. package/bin/build.js +42 -12
  12. package/bin/build.template.js +187 -0
  13. package/bin/cyberia.js +1367 -281
  14. package/bin/deploy.js +582 -3
  15. package/bin/index.js +1367 -281
  16. package/bump.config.js +26 -0
  17. package/conf.js +195 -111
  18. package/deployment.yaml +6 -222
  19. package/hardhat/package-lock.json +118 -149
  20. package/hardhat/package.json +5 -4
  21. package/jsconfig.json +1 -1
  22. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  23. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
  24. package/manifests/deployment/dd-cyberia-development/deployment.yaml +6 -222
  25. package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
  26. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  27. package/manifests/deployment/dd-test-development/deployment.yaml +138 -66
  28. package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
  29. package/manifests/kind-config-dev.yaml +8 -0
  30. package/manifests/lxd/lxd-admin-profile.yaml +12 -3
  31. package/manifests/mongodb/pv-pvc.yaml +44 -8
  32. package/manifests/mongodb/statefulset.yaml +55 -68
  33. package/manifests/mongodb-4.4/headless-service.yaml +10 -0
  34. package/manifests/mongodb-4.4/kustomization.yaml +3 -1
  35. package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
  36. package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
  37. package/manifests/mongodb-4.4/statefulset.yaml +79 -0
  38. package/manifests/mongodb-4.4/storage-class.yaml +9 -0
  39. package/manifests/valkey/statefulset.yaml +1 -1
  40. package/manifests/valkey/valkey-nodeport.yaml +17 -0
  41. package/package.json +45 -24
  42. package/proxy.yaml +10 -118
  43. package/scripts/ipxe-setup.sh +52 -49
  44. package/scripts/k3s-node-setup.sh +83 -48
  45. package/scripts/lxd-vm-setup.sh +193 -8
  46. package/scripts/maas-nat-firewalld.sh +145 -0
  47. package/scripts/nat-iptables.sh +103 -18
  48. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
  49. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
  50. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
  51. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +91 -36
  52. package/src/api/core/core.controller.js +10 -10
  53. package/src/api/core/core.router.js +19 -14
  54. package/src/api/core/core.service.js +15 -15
  55. package/src/api/crypto/crypto.controller.js +8 -8
  56. package/src/api/crypto/crypto.router.js +18 -12
  57. package/src/api/crypto/crypto.service.js +11 -11
  58. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  59. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  60. package/src/api/cyberia-action/cyberia-action.router.js +31 -0
  61. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  62. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
  63. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
  64. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
  65. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
  66. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
  67. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
  68. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
  69. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +22 -22
  70. package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
  71. package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
  72. package/src/api/cyberia-entity/cyberia-entity.service.js +15 -15
  73. package/src/api/cyberia-instance/cyberia-fallback-world.js +83 -198
  74. package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
  75. package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
  76. package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
  77. package/src/api/cyberia-instance/cyberia-instance.service.js +32 -67
  78. package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
  79. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  80. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
  81. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +18 -49
  82. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
  83. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +19 -15
  84. package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
  85. package/src/api/cyberia-map/cyberia-map.router.js +35 -30
  86. package/src/api/cyberia-map/cyberia-map.service.js +17 -17
  87. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  88. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  89. package/src/api/cyberia-quest/cyberia-quest.router.js +31 -0
  90. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  91. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  92. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  93. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +31 -0
  94. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  95. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
  96. package/src/api/default/default.controller.js +10 -10
  97. package/src/api/default/default.router.js +22 -18
  98. package/src/api/default/default.service.js +15 -15
  99. package/src/api/document/document.controller.js +12 -12
  100. package/src/api/document/document.model.js +10 -16
  101. package/src/api/document/document.router.js +28 -23
  102. package/src/api/document/document.service.js +100 -23
  103. package/src/api/file/file.controller.js +8 -8
  104. package/src/api/file/file.model.js +10 -10
  105. package/src/api/file/file.router.js +19 -13
  106. package/src/api/file/file.service.js +45 -43
  107. package/src/api/instance/instance.controller.js +10 -10
  108. package/src/api/instance/instance.model.js +4 -10
  109. package/src/api/instance/instance.router.js +29 -24
  110. package/src/api/instance/instance.service.js +16 -16
  111. package/src/api/ipfs/ipfs.controller.js +12 -12
  112. package/src/api/ipfs/ipfs.model.js +4 -13
  113. package/src/api/ipfs/ipfs.router.js +21 -16
  114. package/src/api/ipfs/ipfs.service.js +22 -36
  115. package/src/api/object-layer/object-layer.controller.js +12 -12
  116. package/src/api/object-layer/object-layer.model.js +4 -17
  117. package/src/api/object-layer/object-layer.router.js +512 -507
  118. package/src/api/object-layer/object-layer.service.js +29 -26
  119. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  120. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  121. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
  122. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +19 -15
  123. package/src/api/test/test.controller.js +8 -8
  124. package/src/api/test/test.router.js +17 -12
  125. package/src/api/test/test.service.js +8 -8
  126. package/src/api/types.js +24 -0
  127. package/src/api/user/guest.service.js +100 -0
  128. package/src/api/user/user.controller.js +6 -6
  129. package/src/api/user/user.model.js +8 -13
  130. package/src/api/user/user.router.js +297 -288
  131. package/src/api/user/user.service.js +103 -55
  132. package/src/cli/baremetal.js +132 -101
  133. package/src/cli/cluster.js +732 -217
  134. package/src/cli/db.js +106 -62
  135. package/src/cli/deploy.js +260 -149
  136. package/src/cli/fs.js +90 -9
  137. package/src/cli/image.js +43 -1
  138. package/src/cli/index.js +106 -16
  139. package/src/cli/ipfs.js +4 -6
  140. package/src/cli/kubectl.js +4 -1
  141. package/src/cli/lxd.js +1099 -223
  142. package/src/cli/monitor.js +9 -3
  143. package/src/cli/release.js +336 -86
  144. package/src/cli/repository.js +136 -53
  145. package/src/cli/run.js +599 -76
  146. package/src/cli/secrets.js +11 -2
  147. package/src/cli/ssh.js +1 -1
  148. package/src/cli/static.js +43 -115
  149. package/src/cli/test.js +9 -3
  150. package/src/client/Cryptokoyn.index.js +18 -21
  151. package/src/client/CyberiaPortal.index.js +19 -23
  152. package/src/client/Default.index.js +30 -36
  153. package/src/client/Itemledger.index.js +20 -26
  154. package/src/client/Underpost.index.js +19 -23
  155. package/src/client/components/core/404.js +4 -4
  156. package/src/client/components/core/500.js +4 -4
  157. package/src/client/components/core/Account.js +73 -60
  158. package/src/client/components/core/AgGrid.js +23 -33
  159. package/src/client/components/core/Alert.js +12 -13
  160. package/src/client/components/core/AppStore.js +1 -1
  161. package/src/client/components/core/Auth.js +40 -37
  162. package/src/client/components/core/Badge.js +7 -13
  163. package/src/client/components/core/BtnIcon.js +15 -17
  164. package/src/client/components/core/CalendarCore.js +42 -63
  165. package/src/client/components/core/Chat.js +13 -15
  166. package/src/client/components/core/ClientEvents.js +163 -0
  167. package/src/client/components/core/ColorPaletteElement.js +309 -0
  168. package/src/client/components/core/Content.js +17 -14
  169. package/src/client/components/core/Css.js +15 -71
  170. package/src/client/components/core/CssCore.js +12 -16
  171. package/src/client/components/core/D3Chart.js +4 -4
  172. package/src/client/components/core/Docs.js +64 -91
  173. package/src/client/components/core/DropDown.js +69 -91
  174. package/src/client/components/core/EventBus.js +96 -0
  175. package/src/client/components/core/EventsUI.js +14 -17
  176. package/src/client/components/core/FileExplorer.js +96 -228
  177. package/src/client/components/core/FullScreen.js +47 -75
  178. package/src/client/components/core/Input.js +24 -69
  179. package/src/client/components/core/Keyboard.js +25 -18
  180. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  181. package/src/client/components/core/LoadingAnimation.js +25 -31
  182. package/src/client/components/core/LogIn.js +41 -41
  183. package/src/client/components/core/LogOut.js +23 -14
  184. package/src/client/components/core/Modal.js +544 -219
  185. package/src/client/components/core/NotificationManager.js +14 -18
  186. package/src/client/components/core/Panel.js +54 -50
  187. package/src/client/components/core/PanelForm.js +81 -177
  188. package/src/client/components/core/Polyhedron.js +110 -214
  189. package/src/client/components/core/PublicProfile.js +39 -32
  190. package/src/client/components/core/Recover.js +48 -44
  191. package/src/client/components/core/Responsive.js +88 -32
  192. package/src/client/components/core/RichText.js +9 -18
  193. package/src/client/components/core/Router.js +24 -3
  194. package/src/client/components/core/SearchBox.js +37 -37
  195. package/src/client/components/core/SignUp.js +39 -30
  196. package/src/client/components/core/SocketIo.js +31 -2
  197. package/src/client/components/core/SocketIoHandler.js +6 -6
  198. package/src/client/components/core/ToggleSwitch.js +8 -20
  199. package/src/client/components/core/ToolTip.js +5 -17
  200. package/src/client/components/core/Translate.js +56 -59
  201. package/src/client/components/core/Validator.js +26 -16
  202. package/src/client/components/core/Wallet.js +15 -26
  203. package/src/client/components/core/Worker.js +211 -276
  204. package/src/client/components/core/windowGetDimensions.js +7 -7
  205. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
  206. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  207. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
  208. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
  209. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  210. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  211. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  212. package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
  213. package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
  214. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  215. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
  216. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
  217. package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
  218. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
  219. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  220. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
  221. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
  222. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  223. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  224. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  225. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  226. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
  227. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
  228. package/src/client/components/default/CssDefault.js +12 -12
  229. package/src/client/components/default/LogInDefault.js +6 -4
  230. package/src/client/components/default/LogOutDefault.js +6 -4
  231. package/src/client/components/default/RouterDefault.js +47 -0
  232. package/src/client/components/default/SettingsDefault.js +4 -4
  233. package/src/client/components/default/SignUpDefault.js +6 -4
  234. package/src/client/components/default/TranslateDefault.js +3 -3
  235. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
  236. package/src/client/components/itemledger/CssItemledger.js +15 -15
  237. package/src/client/components/itemledger/LogInItemledger.js +6 -4
  238. package/src/client/components/itemledger/LogOutItemledger.js +6 -4
  239. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  240. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  241. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  242. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  243. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
  244. package/src/client/components/underpost/CssUnderpost.js +14 -14
  245. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  246. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  247. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  248. package/src/client/components/underpost/LogInUnderpost.js +6 -4
  249. package/src/client/components/underpost/LogOutUnderpost.js +6 -4
  250. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  251. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  252. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  253. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  254. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  255. package/src/client/public/cyberia-docs/ARCHITECTURE.md +83 -0
  256. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
  257. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +291 -0
  258. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +278 -0
  259. package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
  260. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  261. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  262. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  263. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  264. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  265. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
  266. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  267. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  268. package/src/client/services/core/core.service.js +17 -49
  269. package/src/client/services/crypto/crypto.service.js +8 -13
  270. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  271. package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
  272. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
  273. package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
  274. package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
  275. package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
  276. package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
  277. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
  278. package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
  279. package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
  280. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  281. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  282. package/src/client/services/default/default.management.js +159 -267
  283. package/src/client/services/default/default.service.js +10 -16
  284. package/src/client/services/document/document.service.js +14 -19
  285. package/src/client/services/file/file.service.js +8 -13
  286. package/src/client/services/instance/instance.management.js +5 -5
  287. package/src/client/services/instance/instance.service.js +10 -15
  288. package/src/client/services/ipfs/ipfs.service.js +12 -18
  289. package/src/client/services/object-layer/object-layer.management.js +12 -12
  290. package/src/client/services/object-layer/object-layer.service.js +20 -26
  291. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  292. package/src/client/services/test/test.service.js +8 -13
  293. package/src/client/services/user/guest.service.js +86 -0
  294. package/src/client/services/user/user.management.js +5 -5
  295. package/src/client/services/user/user.service.js +14 -20
  296. package/src/client/ssr/body/404.js +3 -3
  297. package/src/client/ssr/body/500.js +3 -3
  298. package/src/client/ssr/body/CacheControl.js +5 -2
  299. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  300. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  301. package/src/client/ssr/head/PwaItemledger.js +197 -60
  302. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  303. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  304. package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
  305. package/src/client/ssr/{offline → views}/Maintenance.js +12 -11
  306. package/src/client/ssr/{offline → views}/NoNetworkConnection.js +3 -3
  307. package/src/client/ssr/{pages → views}/Test.js +2 -2
  308. package/src/client/sw/core.sw.js +274 -0
  309. package/src/db/DataBaseProvider.js +115 -15
  310. package/src/db/mariadb/MariaDB.js +2 -1
  311. package/src/db/mongo/MongoBootstrap.js +657 -0
  312. package/src/db/mongo/MongooseDB.js +129 -21
  313. package/src/grpc/cyberia/grpc-server.js +185 -105
  314. package/src/index.js +1 -1
  315. package/src/runtime/cyberia-client/Dockerfile +101 -0
  316. package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
  317. package/src/runtime/cyberia-server/Dockerfile +62 -0
  318. package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
  319. package/src/runtime/express/Dockerfile +4 -4
  320. package/src/runtime/express/Express.js +2 -2
  321. package/src/runtime/lampp/Dockerfile +8 -7
  322. package/src/runtime/wp/Dockerfile +11 -17
  323. package/src/runtime/wp/Wp.js +8 -5
  324. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  325. package/src/server/auth.js +2 -2
  326. package/src/server/client-build-docs.js +46 -47
  327. package/src/server/client-build.js +371 -132
  328. package/src/server/client-formatted.js +47 -16
  329. package/src/server/conf.js +91 -87
  330. package/src/server/data-query.js +32 -20
  331. package/src/server/dns.js +22 -0
  332. package/src/server/ipfs-client.js +232 -91
  333. package/src/server/object-layer.js +1 -6
  334. package/src/server/process.js +192 -45
  335. package/src/server/proxy.js +9 -2
  336. package/src/server/runtime.js +1 -1
  337. package/src/server/semantic-layer-generator-floor.js +11 -51
  338. package/src/server/semantic-layer-generator-resource.js +259 -0
  339. package/src/server/semantic-layer-generator-skin.js +41 -171
  340. package/src/server/semantic-layer-generator.js +122 -14
  341. package/src/server/shape-generator.js +108 -0
  342. package/src/server/start.js +34 -8
  343. package/src/server/valkey.js +143 -235
  344. package/src/ws/IoInterface.js +16 -16
  345. package/src/ws/core/channels/core.ws.chat.js +11 -11
  346. package/src/ws/core/channels/core.ws.mailer.js +29 -29
  347. package/src/ws/core/channels/core.ws.stream.js +19 -19
  348. package/src/ws/core/core.ws.connection.js +8 -8
  349. package/src/ws/core/core.ws.server.js +6 -5
  350. package/src/ws/default/channels/default.ws.main.js +10 -10
  351. package/src/ws/default/default.ws.connection.js +4 -4
  352. package/src/ws/default/default.ws.server.js +4 -3
  353. package/tsconfig.docs.json +15 -0
  354. package/typedoc.dd-cyberia.json +29 -0
  355. package/typedoc.json +29 -0
  356. package/WHITE-PAPER.md +0 -1540
  357. package/bin/file.js +0 -196
  358. package/bin/vs.js +0 -74
  359. package/bin/zed.js +0 -84
  360. package/hardhat/README.md +0 -531
  361. package/hardhat/WHITE-PAPER.md +0 -1540
  362. package/jsdoc.dd-cyberia.json +0 -68
  363. package/jsdoc.json +0 -68
  364. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -413
  365. package/src/api/object-layer/README.md +0 -672
  366. package/src/client/components/core/ColorPalette.js +0 -5267
  367. package/src/client/components/core/JoyStick.js +0 -80
  368. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  369. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -223
  370. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
  371. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  372. package/src/client/components/default/RoutesDefault.js +0 -49
  373. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  374. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  375. package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
  376. package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
  377. package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
  378. package/src/client/sw/default.sw.js +0 -127
  379. package/src/client/sw/template.sw.js +0 -84
  380. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
  381. package/src/grpc/cyberia/README.md +0 -326
@@ -0,0 +1,300 @@
1
+ # Hardhat Module
2
+
3
+ **Path:** `hardhat/`
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ The Hardhat module is the smart contract development, testing, and deployment environment for the **ObjectLayerToken** ERC-1155 contract — the on-chain economic reality layer of the Object Layer Protocol. It targets Hyperledger Besu private networks (IBFT2/QBFT) running on Kubernetes.
10
+
11
+ ---
12
+
13
+ ## Directory Structure
14
+
15
+ ```
16
+ hardhat/
17
+ hardhat.config.js Main Hardhat configuration
18
+ package.json
19
+ contracts/
20
+ ObjectLayerToken.sol ERC-1155 multi-token contract
21
+ scripts/
22
+ deployObjectLayerToken.js Deployment script
23
+ test/ Contract tests (Mocha + ethers v6)
24
+ deployments/ Deployment artifacts (auto-generated)
25
+ ignition/ Hardhat Ignition modules (optional)
26
+ networks/ Network-specific genesis configs
27
+ ```
28
+
29
+ ---
30
+
31
+ ## ObjectLayerToken Contract
32
+
33
+ ### Inheritance Chain
34
+
35
+ ```
36
+ ObjectLayerToken
37
+ └─ ERC1155 (OpenZeppelin 5.x — core multi-token standard)
38
+ └─ ERC1155Burnable (holders can burn their tokens)
39
+ └─ ERC1155Pausable (owner can freeze all transfers)
40
+ └─ ERC1155Supply (on-chain total supply per token ID)
41
+ └─ Ownable (mint, register, pause restricted to owner)
42
+ ```
43
+
44
+ ### Token ID Semantics
45
+
46
+ | Token ID | Semantic | Supply | Managed By |
47
+ | ---------------- | ------------------------------------------------ | ------------------------------------ | -------------- |
48
+ | `0` (CRYPTOKOYN) | Fungible in-game currency (CKY) | 10,000,000 × 10^18 | cryptokoyn.net |
49
+ | `≥ 1` | Object Layer item (weapon, skin, resource, etc.) | 1 = non-fungible; >1 = semi-fungible | itemledger.com |
50
+
51
+ ### Token ID Derivation
52
+
53
+ Token IDs ≥ 1 use a deterministic namespace-scoped derivation:
54
+
55
+ ```solidity
56
+ // computeTokenId(itemId) = uint256(keccak256(abi.encodePacked(namespace, itemId)))
57
+ // namespace = "cyberia.object-layer:"
58
+ uint256 tokenId = uint256(keccak256(abi.encodePacked("cyberia.object-layer:", itemId)));
59
+ ```
60
+
61
+ This guarantees:
62
+
63
+ - The same `itemId` always produces the same `tokenId`.
64
+ - Token IDs are collision-resistant across different item namespaces.
65
+ - Any party can independently verify a `tokenId` from an `itemId`.
66
+
67
+ ### Key State Variables
68
+
69
+ ```solidity
70
+ uint256 public constant CRYPTOKOYN = 0;
71
+ uint256 public constant INITIAL_CRYPTOKOYN_SUPPLY = 10_000_000 * 1e18;
72
+
73
+ mapping(uint256 => string) private _tokenCIDs; // tokenId → canonical IPFS CID
74
+ mapping(uint256 => string) private _itemIds; // tokenId → itemId string
75
+ mapping(bytes32 => uint256) private _itemIdToTokenId; // keccak256(itemId) → tokenId
76
+ ```
77
+
78
+ ### Events
79
+
80
+ | Event | Description |
81
+ | -------------------------------------------------------------------- | --------------------------------- |
82
+ | `ObjectLayerRegistered(tokenId, itemId, metadataCid, initialSupply)` | New item type registered on-chain |
83
+ | `MetadataUpdated(tokenId, metadataCid)` | Item metadata CID updated |
84
+ | `TransferSingle(operator, from, to, id, value)` | Single token transfer |
85
+ | `TransferBatch(operator, from, to, ids, values)` | Batch token transfer |
86
+ | `Paused(account)` | All transfers frozen |
87
+ | `Unpaused(account)` | Transfers resumed |
88
+
89
+ ### Key Functions
90
+
91
+ | Function | Access | Description |
92
+ | ------------------------------------------------------------ | ----------- | ----------------------------------------- |
93
+ | `registerObjectLayer(to, itemId, metadataCid, supply, data)` | `onlyOwner` | Register a new item + mint initial supply |
94
+ | `batchRegisterObjectLayers(to, items[])` | `onlyOwner` | Batch registration + mint |
95
+ | `mint(to, tokenId, amount, data)` | `onlyOwner` | Mint additional supply for existing token |
96
+ | `mintBatch(to, ids[], amounts[], data)` | `onlyOwner` | Batch mint |
97
+ | `burn(from, tokenId, amount)` | holder | Burn tokens |
98
+ | `burnBatch(from, ids[], amounts[])` | holder | Batch burn |
99
+ | `setTokenMetadataCID(tokenId, metadataCid)` | `onlyOwner` | Update IPFS metadata CID |
100
+ | `pause()` / `unpause()` | `onlyOwner` | Emergency transfer freeze |
101
+ | `computeTokenId(itemId)` | pure | Deterministic token ID computation |
102
+ | `getItemId(tokenId)` | view | Reverse lookup tokenId → itemId |
103
+ | `getTokenCID(tokenId)` | view | Get canonical IPFS CID for token |
104
+
105
+ ### URI Resolution
106
+
107
+ ```solidity
108
+ // uri(tokenId) returns: {baseTokenURI}{_tokenCIDs[tokenId]}
109
+ // e.g.: "ipfs://bafkrei...json"
110
+ // The returned URI resolves to the full ObjectLayer data JSON (AtomicPrefab)
111
+ ```
112
+
113
+ ---
114
+
115
+ ## Networks
116
+
117
+ ### Network Configuration (`hardhat.config.js`)
118
+
119
+ | Network | URL | Chain ID | Use Case |
120
+ | ------------ | ----------------------------------------------- | -------- | --------------------- |
121
+ | `hardhat` | in-process | - | Local testing |
122
+ | `besu-ibft2` | `BESU_IBFT2_RPC_URL` or `http://127.0.0.1:8545` | 777771 | Direct Besu IBFT2 RPC |
123
+ | `besu-qbft` | `BESU_QBFT_RPC_URL` or `http://127.0.0.1:8545` | 777771 | Direct Besu QBFT RPC |
124
+ | `besu-k8s` | `BESU_K8S_RPC_URL` or `http://127.0.0.1:30545` | 777771 | Kubernetes NodePort |
125
+
126
+ All Besu networks: `gasPrice: 0` (permissioned network, gasless model).
127
+
128
+ ### Coinbase Key Management
129
+
130
+ The deployment uses a coinbase private key read from `engine-private/eth-networks/besu/coinbase`:
131
+
132
+ ```javascript
133
+ const coinbaseKey = readPrivateKey('../engine-private/eth-networks/besu/coinbase');
134
+ ```
135
+
136
+ If the key file does not exist, the config falls back to a dummy key (safe for compilation-only workflows).
137
+
138
+ ---
139
+
140
+ ## Deployment
141
+
142
+ ### Prerequisites
143
+
144
+ ```bash
145
+ cd hardhat
146
+ npm install
147
+ ```
148
+
149
+ ### Compile Contracts
150
+
151
+ ```bash
152
+ npx hardhat compile
153
+ # Artifacts written to hardhat/artifacts/
154
+ ```
155
+
156
+ ### Deploy to Besu
157
+
158
+ ```bash
159
+ # Deploy to IBFT2 network
160
+ npx hardhat run scripts/deployObjectLayerToken.js --network besu-ibft2
161
+
162
+ # Deploy to QBFT network
163
+ npx hardhat run scripts/deployObjectLayerToken.js --network besu-qbft
164
+
165
+ # Deploy to Kubernetes cluster (via NodePort :30545)
166
+ npx hardhat run scripts/deployObjectLayerToken.js --network besu-k8s
167
+ ```
168
+
169
+ **Deployment script actions:**
170
+
171
+ 1. Connect to Besu RPC using the coinbase secp256k1 key.
172
+ 2. Deploy `ObjectLayerToken` contract.
173
+ 3. Mint `INITIAL_CRYPTOKOYN_SUPPLY` (10M CKY) to the deployer address.
174
+ 4. Verify initial state: total supply, deployer balance.
175
+ 5. Write deployment artifact to `hardhat/deployments/{network}/ObjectLayerToken.json`.
176
+
177
+ **Deployment artifact structure:**
178
+
179
+ ```json
180
+ {
181
+ "address": "0x...",
182
+ "abi": [...],
183
+ "txHash": "0x...",
184
+ "blockNumber": 42,
185
+ "deployer": "0x...",
186
+ "network": "besu-ibft2",
187
+ "chainId": 777771,
188
+ "timestamp": "2026-01-01T00:00:00.000Z"
189
+ }
190
+ ```
191
+
192
+ The artifact is consumed by:
193
+
194
+ - `bin/cyberia.js` CLI (`cyberia chain` subcommands).
195
+ - Engine gRPC server for contract address resolution.
196
+ - itemledger.com and cryptokoyn.net API servers.
197
+
198
+ ---
199
+
200
+ ## Running Tests
201
+
202
+ ```bash
203
+ cd hardhat
204
+ npx hardhat test
205
+
206
+ # With gas report
207
+ REPORT_GAS=true npx hardhat test
208
+ ```
209
+
210
+ Tests use **Mocha + ethers v6** via `@nomicfoundation/hardhat-toolbox-mocha-ethers`. The `hardhat` in-process network simulates Besu behavior.
211
+
212
+ ---
213
+
214
+ ## Cyberia CLI Integration
215
+
216
+ The Cyberia CLI (`bin/cyberia.js`) exposes the full Besu chain and contract lifecycle:
217
+
218
+ ### Key Management
219
+
220
+ ```bash
221
+ # Generate new Ethereum secp256k1 key pair
222
+ cyberia chain key-gen
223
+ # Save key pair to default paths
224
+ cyberia chain key-gen --save
225
+
226
+ # Set the coinbase deployer key from hex
227
+ cyberia chain set-coinbase --private-key 0xYOUR_PRIVATE_KEY_HEX
228
+ # Set from saved key file
229
+ cyberia chain set-coinbase --from-file ./engine-private/eth-networks/besu/<address>.key.json
230
+ ```
231
+
232
+ ### Network Lifecycle
233
+
234
+ ```bash
235
+ # Deploy Besu network to Kubernetes
236
+ cyberia chain deploy
237
+ cyberia chain deploy --consensus qbft
238
+
239
+ # Remove Besu network
240
+ cyberia chain remove
241
+ ```
242
+
243
+ ### Contract Lifecycle
244
+
245
+ ```bash
246
+ # Compile contracts
247
+ cyberia chain compile
248
+
249
+ # Deploy ObjectLayerToken (mints 10M CKY to deployer)
250
+ cyberia chain deploy-contract --network besu-ibft2
251
+
252
+ # Run contract tests
253
+ cyberia chain test
254
+ ```
255
+
256
+ ### Token Operations
257
+
258
+ ```bash
259
+ # Register a non-fungible unique item (uses canonical CID from MongoDB)
260
+ cyberia chain register --item-id legendary-hatchet --from-db --supply 1
261
+
262
+ # Register semi-fungible stackable resource
263
+ cyberia chain register --item-id gold-ore --from-db --supply 1000000
264
+
265
+ # Manual CID override
266
+ cyberia chain register --item-id legendary-hatchet --metadata-cid bafkrei... --supply 1
267
+
268
+ # Batch-register multiple items
269
+ cyberia chain batch-register --from-db --items '[{"itemId":"wood","supply":500000},{"itemId":"stone","supply":500000}]'
270
+
271
+ # Mint additional CKY
272
+ cyberia chain mint --token-id 0 --to 0xABCD...1234 --amount 1000000000000000000000
273
+
274
+ # Query balance
275
+ cyberia chain balance --address 0xABCD...1234 --token-id 0
276
+
277
+ # Transfer
278
+ cyberia chain transfer --from 0x... --to 0x... --token-id 0 --amount 1000
279
+
280
+ # Burn
281
+ cyberia chain burn --token-id 0 --amount 500 --address 0x...
282
+
283
+ # Status and governance
284
+ cyberia chain status
285
+ cyberia chain pause
286
+ cyberia chain unpause
287
+ ```
288
+
289
+ ---
290
+
291
+ ## Environment Variables
292
+
293
+ | Variable | Default | Description |
294
+ | --------------------- | ------------------------ | ----------------------------------- |
295
+ | `BESU_IBFT2_RPC_URL` | `http://127.0.0.1:8545` | Besu IBFT2 JSON-RPC URL |
296
+ | `BESU_QBFT_RPC_URL` | `http://127.0.0.1:8545` | Besu QBFT JSON-RPC URL |
297
+ | `BESU_K8S_RPC_URL` | `http://127.0.0.1:30545` | Kubernetes NodePort RPC URL |
298
+ | `BESU_IBFT2_CHAIN_ID` | `777771` | Chain ID override for IBFT2 |
299
+ | `REPORT_GAS` | `false` | Enable gas usage reporting in tests |
300
+ | `GAS_REPORT_FILE` | _(stdout)_ | Path for gas report output file |
@@ -0,0 +1,279 @@
1
+ # Off-Chain Economy: Fountain & Sink Architecture
2
+
3
+ **Module:** `cyberia-server/src/economy.go` · `src/api/cyberia-instance-conf`
4
+
5
+ > **Status:** Alpha (sinks disabled by default; all values reset on reconnect).
6
+ > **On-chain bridge:** CKY ERC-1155 token (ID 0) on Hyperledger Besu.
7
+ > The bridge protocol stays aligned with the project's CKY tokenomics model.
8
+
9
+ ---
10
+
11
+ ## 1. Model Overview
12
+
13
+ Cyberia Online uses the **Fountain & Sink** economy — the industry standard for sustainable in-game economies, pioneered by _Ultima Online_ and refined in _EVE Online_ and _World of Warcraft_.
14
+
15
+ ```
16
+ ┌─────────────────────────────┐
17
+ │ FOUNTAINS │
18
+ │ (inject coins into economy) │
19
+ │ │
20
+ │ botSpawnCoins ──► Bot │
21
+ │ playerSpawnCoins ► Player │
22
+ └──────────────┬──────────────┘
23
+ │ new coins
24
+
25
+ ┌──────────────────────────────┐
26
+ │ CIRCULATING SUPPLY │
27
+ │ (player & bot wallets) │
28
+ └──────┬───────────────────────┘
29
+
30
+ ┌────────────┴────────────┐
31
+ │ KILL TRANSFER │ zero-sum redistribution
32
+ │ loser → winner │
33
+ │ │
34
+ │ PvE: coinKillPercentVsBot │
35
+ │ PvP: coinKillPercentVsPlayer │
36
+ │ floor: coinKillMinAmount │
37
+ └────────────┬────────────┘
38
+
39
+ ┌──────▼──────────────────────┐
40
+ │ SINKS │
41
+ │ (destroy coins — alpha=0) │
42
+ │ │
43
+ │ respawnCostPercent │
44
+ │ portalFee │
45
+ │ craftingFeePercent │
46
+ └─────────────────────────────┘
47
+ ```
48
+
49
+ ### Core Rules
50
+
51
+ | Rule | Description |
52
+ | ----------------------------- | ----------------------------------------------------------------------------------------------- |
53
+ | **Bots are infinite mint** | Every bot respawn resets wallet to `botSpawnCoins`. Supply bounded by player kill rate. |
54
+ | **Players are zero-sum** | Killing a player transfers coins but creates no new ones. PvP is redistribution only. |
55
+ | **Kill floor** | `coinKillMinAmount` guarantees every successful kill pays out even against a near-empty wallet. |
56
+ | **Sinks scale with activity** | Fees burn a fraction — more activity = more burn, preventing indefinite inflation. |
57
+
58
+ ---
59
+
60
+ ## 2. Configuration Structure
61
+
62
+ Economy parameters live in `CyberiaInstanceConf.economyRules`. A document without an `economyRules` sub-document receives canonical defaults automatically.
63
+
64
+ ### 2.1 JavaScript Defaults (`cyberia-server-defaults.js`)
65
+
66
+ ```javascript
67
+ economyRules: {
68
+ // ── Fountains ──────────────────────────────────────────
69
+ botSpawnCoins: 50, // coins on bot spawn/respawn (infinite mint)
70
+ playerSpawnCoins: 50, // guest starting wallet (resets on reconnect)
71
+
72
+ // ── Kill Transfer ───────────────────────────────────────
73
+ coinKillPercentVsBot: 0.40, // 40% of bot wallet → killer on PvE kill
74
+ coinKillPercentVsPlayer: 0.15, // 15% of player wallet → killer on PvP kill
75
+ coinKillMinAmount: 10, // minimum coins per kill (hard floor)
76
+
77
+ // ── Sinks (alpha: all 0 = disabled) ────────────────────
78
+ respawnCostPercent: 0.0, // fraction burned on player death
79
+ portalFee: 0, // flat coins burned per portal use
80
+ craftingFeePercent: 0.0, // fraction burned per crafting action
81
+ }
82
+ ```
83
+
84
+ ### 2.2 Protobuf Message (`proto/cyberia.proto`)
85
+
86
+ ```proto
87
+ message EconomyRules {
88
+ int32 bot_spawn_coins = 1;
89
+ int32 player_spawn_coins = 2;
90
+ double coin_kill_percent_vs_bot = 3;
91
+ double coin_kill_percent_vs_player = 4;
92
+ int32 coin_kill_min_amount = 5;
93
+ double respawn_cost_percent = 6;
94
+ int32 portal_fee = 7;
95
+ double crafting_fee_percent = 8;
96
+ }
97
+ ```
98
+
99
+ ### 2.3 Go Server (`server.go → ApplyInstanceConfig`)
100
+
101
+ ```go
102
+ er := cfg.GetEconomyRules()
103
+ if er == nil { er = &pb.EconomyRules{} }
104
+
105
+ s.botSpawnCoins = int(er.GetBotSpawnCoins())
106
+ s.playerSpawnCoins = int(er.GetPlayerSpawnCoins())
107
+ s.coinKillPercentVsBot = er.GetCoinKillPercentVsBot()
108
+ s.coinKillPercentVsPlayer = er.GetCoinKillPercentVsPlayer()
109
+ s.coinKillMinAmount = int(er.GetCoinKillMinAmount())
110
+ s.respawnCostPercent = er.GetRespawnCostPercent()
111
+ s.portalFee = int(er.GetPortalFee())
112
+ s.craftingFeePercent = er.GetCraftingFeePercent()
113
+ ```
114
+
115
+ ---
116
+
117
+ ## 3. Runtime Economy API (`economy.go`)
118
+
119
+ All economy logic is encapsulated in a single file enforcing the single-source principle. Callers (`handlers.go`, `collision.go`, `skill.go`) call named methods and never manipulate coin wallets directly.
120
+
121
+ ### Method Reference
122
+
123
+ | Method | Caller | Description |
124
+ | ------------------------------------- | ---------------------------------- | ---------------------------------------------------- |
125
+ | `FountainInitPlayer(player)` | `handlers.go` on WebSocket connect | Credits `playerSpawnCoins` to new player |
126
+ | `FountainInitBot(bot)` | `collision.go` on bot respawn | Resets bot wallet to `botSpawnCoins` (infinite mint) |
127
+ | `ExecuteKillTransfer(caster, victim)` | `skill.go HandleOnKillSkills` | Transfers coins based on kill scenario |
128
+ | `SinkRespawnCost(player)` | `collision.go handlePlayerDeath` | Burns `respawnCostPercent`% of player coins |
129
+ | `SinkPortalFee(player)` | Portal handler | Burns flat `portalFee` coins on portal use |
130
+ | `SinkCraftingFee(player, item)` | Craft handler | Burns `craftingFeePercent`% on crafting |
131
+
132
+ ### Kill Transfer Logic
133
+
134
+ ```
135
+ ExecuteKillTransfer(caster, victim):
136
+
137
+ if caster=Player, victim=Bot → rate = coinKillPercentVsBot (PvE farming)
138
+ if caster=Player, victim=Player → rate = coinKillPercentVsPlayer (PvP)
139
+ if caster=Bot, victim=Player → rate = coinKillPercentVsPlayer (bot kills player)
140
+ if caster=Bot, victim=Bot → rate = coinKillPercentVsBot (bot-on-bot)
141
+
142
+ transfer = max(floor(victim.coins × rate), coinKillMinAmount)
143
+ transfer = min(transfer, victim.coins) // can't take more than available
144
+
145
+ victim.coins -= transfer
146
+ caster.coins += transfer // bots ignore received coins
147
+ → sendFCT(caster, FCTTypeCoinGain, worldX, worldY, transfer)
148
+ → sendFCT(victim, FCTTypeCoinLoss, worldX, worldY, transfer)
149
+ ```
150
+
151
+ ---
152
+
153
+ ## 4. Coin Balance Architecture
154
+
155
+ Coins use a **flat + display split** design:
156
+
157
+ | Field | Type | Role |
158
+ | ----------------------------- | ----------------------------------------------------- | ----------------------------------------------------------------- |
159
+ | `entity.Coins` | `uint32` | **Single source of truth** — O(1) read/write for all economy math |
160
+ | `coinItemId` ObjectLayer slot | `ObjectLayerState { Active: false, Quantity: Coins }` | **Display only** — synced by `syncCoinOL()` on every mutation |
161
+
162
+ **Why split:**
163
+
164
+ - Economy math uses `Coins` directly (O(1)); no OL iteration.
165
+ - Coin slot is always `Active: false` — the inventory UI automatically renders it with a lock indicator (non-activable).
166
+ - No risk of coin OL being activated by the `item_activation` handler.
167
+
168
+ ---
169
+
170
+ ## 5. Floating Combat Text (FCT) Wire Protocol
171
+
172
+ Economy events trigger client-side visual feedback via the binary AOI protocol.
173
+
174
+ **Coin FCT (14 bytes, fixed):**
175
+
176
+ ```
177
+ MsgTypeFCT = 0x04
178
+
179
+ Offset Size Field
180
+ ────── ──── ─────────────────────────────
181
+ 0 u8 message type (0x04)
182
+ 1 u8 fct_type (see table)
183
+ 2 f32 world_x (entity position)
184
+ 6 f32 world_y
185
+ 10 u32 value (always positive; sign implied by type)
186
+ ```
187
+
188
+ **Item FCT (variable length):**
189
+
190
+ ```
191
+ MsgTypeItemFCT = 0x05
192
+
193
+ Offset Size Field
194
+ ────── ──── ─────────────────────────────
195
+ 0 u8 message type (0x05)
196
+ 1 u8 fct_type (FCTTypeItemGain or FCTTypeItemLoss)
197
+ 2 f32 world_x
198
+ 6 f32 world_y
199
+ 10 u32 quantity
200
+ 14 u8 itemId length
201
+ 15 str itemId bytes
202
+ ```
203
+
204
+ | `fct_type` | Constant | Color | Display |
205
+ | ---------- | ----------------- | ------ | -------------- |
206
+ | `0x00` | `FCTTypeDamage` | Red | `-N` HP lost |
207
+ | `0x01` | `FCTTypeRegen` | Green | `+N` HP gained |
208
+ | `0x02` | `FCTTypeCoinGain` | Yellow | `+N` coins |
209
+ | `0x03` | `FCTTypeCoinLoss` | Yellow | `-N` coins |
210
+ | `0x04` | `FCTTypeItemGain` | Cyan | `+N ItemID` |
211
+ | `0x05` | `FCTTypeItemLoss` | Purple | `-N ItemID` |
212
+
213
+ ---
214
+
215
+ ## 6. MongoDB Document Example
216
+
217
+ ```json
218
+ {
219
+ "instanceCode": "alpha-01",
220
+ "economyRules": {
221
+ "botSpawnCoins": 50,
222
+ "playerSpawnCoins": 50,
223
+ "coinKillPercentVsBot": 0.4,
224
+ "coinKillPercentVsPlayer": 0.15,
225
+ "coinKillMinAmount": 10,
226
+ "respawnCostPercent": 0.0,
227
+ "portalFee": 0,
228
+ "craftingFeePercent": 0.0
229
+ }
230
+ }
231
+ ```
232
+
233
+ ---
234
+
235
+ ## 7. gRPC Config Builder
236
+
237
+ The `toInstanceConfig()` function in `grpc-server.js` resolves `economyRules` with a two-tier fallback:
238
+
239
+ ```
240
+ priority: gc.economyRules.field (instance document in MongoDB)
241
+ → fb.economyRules.field (CYBERIA_INSTANCE_CONF_DEFAULTS — always set)
242
+ ```
243
+
244
+ ---
245
+
246
+ ## 8. On-Chain Bridge
247
+
248
+ The off-chain `coin` balance maps to the on-chain **CKY token (ERC-1155 Token ID 0)** on Hyperledger Besu:
249
+
250
+ ```
251
+ Off-chain Coins (uint32)
252
+ ↕ conversion (via cryptokoyn.net withdrawal protocol)
253
+ On-chain CKY (ERC-1155, Token ID 0, 18-decimal precision)
254
+ ```
255
+
256
+ **Bridge mechanics:**
257
+
258
+ - **Withdrawal:** Player requests conversion of off-chain coins to on-chain CKY via cryptokoyn.net.
259
+ - **Deposit:** Player deposits on-chain CKY to top up off-chain balance.
260
+ - **CKY Minting Fee:** Converting off-chain items to ERC-1155 tokens requires a CKY fee — the primary on-chain sink mechanism.
261
+
262
+ ---
263
+
264
+ ## 9. Enabling Sinks (Alpha → Beta)
265
+
266
+ To activate economy pressure:
267
+
268
+ ```javascript
269
+ // Update CyberiaInstanceConf in MongoDB for the target instance
270
+ {
271
+ "economyRules": {
272
+ "respawnCostPercent": 0.05, // 5% burned on death
273
+ "portalFee": 5, // 5 coins burned per portal use
274
+ "craftingFeePercent": 0.03 // 3% burned on each crafting action
275
+ }
276
+ }
277
+ ```
278
+
279
+ The Go server picks up updated config via gRPC hot-reload (`GetFullInstance` polling at `ENGINE_GRPC_RELOAD_INTERVAL_SEC`).