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.
- package/.github/workflows/engine-cyberia.cd.yml +8 -2
- package/.github/workflows/npmpkg.ci.yml +1 -0
- package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
- package/.github/workflows/release.cd.yml +2 -2
- package/.vscode/extensions.json +9 -9
- package/.vscode/settings.json +20 -4
- package/CHANGELOG.md +563 -1
- package/CLI-HELP.md +130 -34
- package/Dockerfile +0 -4
- package/README.md +194 -607
- package/bin/build.js +42 -12
- package/bin/build.template.js +187 -0
- package/bin/cyberia.js +1367 -281
- package/bin/deploy.js +582 -3
- package/bin/index.js +1367 -281
- package/bump.config.js +26 -0
- package/conf.js +195 -111
- package/deployment.yaml +6 -222
- package/hardhat/package-lock.json +118 -149
- package/hardhat/package.json +5 -4
- package/jsconfig.json +1 -1
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +6 -222
- package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
- package/manifests/deployment/dd-test-development/deployment.yaml +138 -66
- package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
- package/manifests/kind-config-dev.yaml +8 -0
- package/manifests/lxd/lxd-admin-profile.yaml +12 -3
- package/manifests/mongodb/pv-pvc.yaml +44 -8
- package/manifests/mongodb/statefulset.yaml +55 -68
- package/manifests/mongodb-4.4/headless-service.yaml +10 -0
- package/manifests/mongodb-4.4/kustomization.yaml +3 -1
- package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
- package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
- package/manifests/mongodb-4.4/statefulset.yaml +79 -0
- package/manifests/mongodb-4.4/storage-class.yaml +9 -0
- package/manifests/valkey/statefulset.yaml +1 -1
- package/manifests/valkey/valkey-nodeport.yaml +17 -0
- package/package.json +45 -24
- package/proxy.yaml +10 -118
- package/scripts/ipxe-setup.sh +52 -49
- package/scripts/k3s-node-setup.sh +83 -48
- package/scripts/lxd-vm-setup.sh +193 -8
- package/scripts/maas-nat-firewalld.sh +145 -0
- package/scripts/nat-iptables.sh +103 -18
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +91 -36
- package/src/api/core/core.controller.js +10 -10
- package/src/api/core/core.router.js +19 -14
- package/src/api/core/core.service.js +15 -15
- package/src/api/crypto/crypto.controller.js +8 -8
- package/src/api/crypto/crypto.router.js +18 -12
- package/src/api/crypto/crypto.service.js +11 -11
- package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
- package/src/api/cyberia-action/cyberia-action.model.js +87 -0
- package/src/api/cyberia-action/cyberia-action.router.js +31 -0
- package/src/api/cyberia-action/cyberia-action.service.js +42 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
- package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +22 -22
- package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
- package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
- package/src/api/cyberia-entity/cyberia-entity.service.js +15 -15
- package/src/api/cyberia-instance/cyberia-fallback-world.js +83 -198
- package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
- package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
- package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
- package/src/api/cyberia-instance/cyberia-instance.service.js +32 -67
- package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
- package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +18 -49
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +19 -15
- package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
- package/src/api/cyberia-map/cyberia-map.router.js +35 -30
- package/src/api/cyberia-map/cyberia-map.service.js +17 -17
- package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
- package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
- package/src/api/cyberia-quest/cyberia-quest.router.js +31 -0
- package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +31 -0
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
- package/src/api/default/default.controller.js +10 -10
- package/src/api/default/default.router.js +22 -18
- package/src/api/default/default.service.js +15 -15
- package/src/api/document/document.controller.js +12 -12
- package/src/api/document/document.model.js +10 -16
- package/src/api/document/document.router.js +28 -23
- package/src/api/document/document.service.js +100 -23
- package/src/api/file/file.controller.js +8 -8
- package/src/api/file/file.model.js +10 -10
- package/src/api/file/file.router.js +19 -13
- package/src/api/file/file.service.js +45 -43
- package/src/api/instance/instance.controller.js +10 -10
- package/src/api/instance/instance.model.js +4 -10
- package/src/api/instance/instance.router.js +29 -24
- package/src/api/instance/instance.service.js +16 -16
- package/src/api/ipfs/ipfs.controller.js +12 -12
- package/src/api/ipfs/ipfs.model.js +4 -13
- package/src/api/ipfs/ipfs.router.js +21 -16
- package/src/api/ipfs/ipfs.service.js +22 -36
- package/src/api/object-layer/object-layer.controller.js +12 -12
- package/src/api/object-layer/object-layer.model.js +4 -17
- package/src/api/object-layer/object-layer.router.js +512 -507
- package/src/api/object-layer/object-layer.service.js +29 -26
- package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
- package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
- package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
- package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +19 -15
- package/src/api/test/test.controller.js +8 -8
- package/src/api/test/test.router.js +17 -12
- package/src/api/test/test.service.js +8 -8
- package/src/api/types.js +24 -0
- package/src/api/user/guest.service.js +100 -0
- package/src/api/user/user.controller.js +6 -6
- package/src/api/user/user.model.js +8 -13
- package/src/api/user/user.router.js +297 -288
- package/src/api/user/user.service.js +103 -55
- package/src/cli/baremetal.js +132 -101
- package/src/cli/cluster.js +732 -217
- package/src/cli/db.js +106 -62
- package/src/cli/deploy.js +260 -149
- package/src/cli/fs.js +90 -9
- package/src/cli/image.js +43 -1
- package/src/cli/index.js +106 -16
- package/src/cli/ipfs.js +4 -6
- package/src/cli/kubectl.js +4 -1
- package/src/cli/lxd.js +1099 -223
- package/src/cli/monitor.js +9 -3
- package/src/cli/release.js +336 -86
- package/src/cli/repository.js +136 -53
- package/src/cli/run.js +599 -76
- package/src/cli/secrets.js +11 -2
- package/src/cli/ssh.js +1 -1
- package/src/cli/static.js +43 -115
- package/src/cli/test.js +9 -3
- package/src/client/Cryptokoyn.index.js +18 -21
- package/src/client/CyberiaPortal.index.js +19 -23
- package/src/client/Default.index.js +30 -36
- package/src/client/Itemledger.index.js +20 -26
- package/src/client/Underpost.index.js +19 -23
- package/src/client/components/core/404.js +4 -4
- package/src/client/components/core/500.js +4 -4
- package/src/client/components/core/Account.js +73 -60
- package/src/client/components/core/AgGrid.js +23 -33
- package/src/client/components/core/Alert.js +12 -13
- package/src/client/components/core/AppStore.js +1 -1
- package/src/client/components/core/Auth.js +40 -37
- package/src/client/components/core/Badge.js +7 -13
- package/src/client/components/core/BtnIcon.js +15 -17
- package/src/client/components/core/CalendarCore.js +42 -63
- package/src/client/components/core/Chat.js +13 -15
- package/src/client/components/core/ClientEvents.js +163 -0
- package/src/client/components/core/ColorPaletteElement.js +309 -0
- package/src/client/components/core/Content.js +17 -14
- package/src/client/components/core/Css.js +15 -71
- package/src/client/components/core/CssCore.js +12 -16
- package/src/client/components/core/D3Chart.js +4 -4
- package/src/client/components/core/Docs.js +64 -91
- package/src/client/components/core/DropDown.js +69 -91
- package/src/client/components/core/EventBus.js +96 -0
- package/src/client/components/core/EventsUI.js +14 -17
- package/src/client/components/core/FileExplorer.js +96 -228
- package/src/client/components/core/FullScreen.js +47 -75
- package/src/client/components/core/Input.js +24 -69
- package/src/client/components/core/Keyboard.js +25 -18
- package/src/client/components/core/KeyboardAvoidance.js +145 -0
- package/src/client/components/core/LoadingAnimation.js +25 -31
- package/src/client/components/core/LogIn.js +41 -41
- package/src/client/components/core/LogOut.js +23 -14
- package/src/client/components/core/Modal.js +544 -219
- package/src/client/components/core/NotificationManager.js +14 -18
- package/src/client/components/core/Panel.js +54 -50
- package/src/client/components/core/PanelForm.js +81 -177
- package/src/client/components/core/Polyhedron.js +110 -214
- package/src/client/components/core/PublicProfile.js +39 -32
- package/src/client/components/core/Recover.js +48 -44
- package/src/client/components/core/Responsive.js +88 -32
- package/src/client/components/core/RichText.js +9 -18
- package/src/client/components/core/Router.js +24 -3
- package/src/client/components/core/SearchBox.js +37 -37
- package/src/client/components/core/SignUp.js +39 -30
- package/src/client/components/core/SocketIo.js +31 -2
- package/src/client/components/core/SocketIoHandler.js +6 -6
- package/src/client/components/core/ToggleSwitch.js +8 -20
- package/src/client/components/core/ToolTip.js +5 -17
- package/src/client/components/core/Translate.js +56 -59
- package/src/client/components/core/Validator.js +26 -16
- package/src/client/components/core/Wallet.js +15 -26
- package/src/client/components/core/Worker.js +211 -276
- package/src/client/components/core/windowGetDimensions.js +7 -7
- package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
- package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
- package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
- package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
- package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
- package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
- package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
- package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
- package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
- package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
- package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
- package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
- package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
- package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
- package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
- package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
- package/src/client/components/default/CssDefault.js +12 -12
- package/src/client/components/default/LogInDefault.js +6 -4
- package/src/client/components/default/LogOutDefault.js +6 -4
- package/src/client/components/default/RouterDefault.js +47 -0
- package/src/client/components/default/SettingsDefault.js +4 -4
- package/src/client/components/default/SignUpDefault.js +6 -4
- package/src/client/components/default/TranslateDefault.js +3 -3
- package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
- package/src/client/components/itemledger/CssItemledger.js +15 -15
- package/src/client/components/itemledger/LogInItemledger.js +6 -4
- package/src/client/components/itemledger/LogOutItemledger.js +6 -4
- package/src/client/components/itemledger/RouterItemledger.js +38 -0
- package/src/client/components/itemledger/SettingsItemledger.js +4 -4
- package/src/client/components/itemledger/SignUpItemledger.js +6 -4
- package/src/client/components/itemledger/TranslateItemledger.js +3 -3
- package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
- package/src/client/components/underpost/CssUnderpost.js +14 -14
- package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
- package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
- package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
- package/src/client/components/underpost/LogInUnderpost.js +6 -4
- package/src/client/components/underpost/LogOutUnderpost.js +6 -4
- package/src/client/components/underpost/RouterUnderpost.js +45 -0
- package/src/client/components/underpost/SettingsUnderpost.js +4 -4
- package/src/client/components/underpost/SignUpUnderpost.js +6 -4
- package/src/client/components/underpost/TranslateUnderpost.js +4 -4
- package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +83 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +291 -0
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +278 -0
- package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
- package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
- package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
- package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
- package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
- package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
- package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
- package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
- package/src/client/services/core/core.service.js +17 -49
- package/src/client/services/crypto/crypto.service.js +8 -13
- package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
- package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
- package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
- package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
- package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
- package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
- package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
- package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
- package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
- package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
- package/src/client/services/default/default.management.js +159 -267
- package/src/client/services/default/default.service.js +10 -16
- package/src/client/services/document/document.service.js +14 -19
- package/src/client/services/file/file.service.js +8 -13
- package/src/client/services/instance/instance.management.js +5 -5
- package/src/client/services/instance/instance.service.js +10 -15
- package/src/client/services/ipfs/ipfs.service.js +12 -18
- package/src/client/services/object-layer/object-layer.management.js +12 -12
- package/src/client/services/object-layer/object-layer.service.js +20 -26
- package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
- package/src/client/services/test/test.service.js +8 -13
- package/src/client/services/user/guest.service.js +86 -0
- package/src/client/services/user/user.management.js +5 -5
- package/src/client/services/user/user.service.js +14 -20
- package/src/client/ssr/body/404.js +3 -3
- package/src/client/ssr/body/500.js +3 -3
- package/src/client/ssr/body/CacheControl.js +5 -2
- package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
- package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
- package/src/client/ssr/head/PwaItemledger.js +197 -60
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
- package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
- package/src/client/ssr/{offline → views}/Maintenance.js +12 -11
- package/src/client/ssr/{offline → views}/NoNetworkConnection.js +3 -3
- package/src/client/ssr/{pages → views}/Test.js +2 -2
- package/src/client/sw/core.sw.js +274 -0
- package/src/db/DataBaseProvider.js +115 -15
- package/src/db/mariadb/MariaDB.js +2 -1
- package/src/db/mongo/MongoBootstrap.js +657 -0
- package/src/db/mongo/MongooseDB.js +129 -21
- package/src/grpc/cyberia/grpc-server.js +185 -105
- package/src/index.js +1 -1
- package/src/runtime/cyberia-client/Dockerfile +101 -0
- package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
- package/src/runtime/cyberia-server/Dockerfile +62 -0
- package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
- package/src/runtime/express/Dockerfile +4 -4
- package/src/runtime/express/Express.js +2 -2
- package/src/runtime/lampp/Dockerfile +8 -7
- package/src/runtime/wp/Dockerfile +11 -17
- package/src/runtime/wp/Wp.js +8 -5
- package/src/server/atlas-sprite-sheet-generator.js +4 -2
- package/src/server/auth.js +2 -2
- package/src/server/client-build-docs.js +46 -47
- package/src/server/client-build.js +371 -132
- package/src/server/client-formatted.js +47 -16
- package/src/server/conf.js +91 -87
- package/src/server/data-query.js +32 -20
- package/src/server/dns.js +22 -0
- package/src/server/ipfs-client.js +232 -91
- package/src/server/object-layer.js +1 -6
- package/src/server/process.js +192 -45
- package/src/server/proxy.js +9 -2
- package/src/server/runtime.js +1 -1
- package/src/server/semantic-layer-generator-floor.js +11 -51
- package/src/server/semantic-layer-generator-resource.js +259 -0
- package/src/server/semantic-layer-generator-skin.js +41 -171
- package/src/server/semantic-layer-generator.js +122 -14
- package/src/server/shape-generator.js +108 -0
- package/src/server/start.js +34 -8
- package/src/server/valkey.js +143 -235
- package/src/ws/IoInterface.js +16 -16
- package/src/ws/core/channels/core.ws.chat.js +11 -11
- package/src/ws/core/channels/core.ws.mailer.js +29 -29
- package/src/ws/core/channels/core.ws.stream.js +19 -19
- package/src/ws/core/core.ws.connection.js +8 -8
- package/src/ws/core/core.ws.server.js +6 -5
- package/src/ws/default/channels/default.ws.main.js +10 -10
- package/src/ws/default/default.ws.connection.js +4 -4
- package/src/ws/default/default.ws.server.js +4 -3
- package/tsconfig.docs.json +15 -0
- package/typedoc.dd-cyberia.json +29 -0
- package/typedoc.json +29 -0
- package/WHITE-PAPER.md +0 -1540
- package/bin/file.js +0 -196
- package/bin/vs.js +0 -74
- package/bin/zed.js +0 -84
- package/hardhat/README.md +0 -531
- package/hardhat/WHITE-PAPER.md +0 -1540
- package/jsdoc.dd-cyberia.json +0 -68
- package/jsdoc.json +0 -68
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -413
- package/src/api/object-layer/README.md +0 -672
- package/src/client/components/core/ColorPalette.js +0 -5267
- package/src/client/components/core/JoyStick.js +0 -80
- package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -223
- package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
- package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
- package/src/client/components/default/RoutesDefault.js +0 -49
- package/src/client/components/itemledger/RoutesItemledger.js +0 -40
- package/src/client/components/underpost/RoutesUnderpost.js +0 -47
- package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
- package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
- package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
- package/src/client/sw/default.sw.js +0 -127
- package/src/client/sw/template.sw.js +0 -84
- package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
- 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`).
|