holosphere 2.0.0-alpha1 → 2.0.0-alpha11

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 (416) hide show
  1. package/CHANGELOG.md +473 -0
  2. package/FEATURES.md +431 -0
  3. package/LICENSE +29 -166
  4. package/LICENSE-AGPL.md +180 -0
  5. package/README.md +97 -16
  6. package/dist/2019-D2OG2idw.js +6680 -0
  7. package/dist/2019-D2OG2idw.js.map +1 -0
  8. package/dist/2019-EION3wKo.cjs +8 -0
  9. package/dist/2019-EION3wKo.cjs.map +1 -0
  10. package/dist/_commonjsHelpers-C37NGDzP.cjs +2 -0
  11. package/dist/_commonjsHelpers-C37NGDzP.cjs.map +1 -0
  12. package/dist/_commonjsHelpers-CUmg6egw.js +7 -0
  13. package/dist/_commonjsHelpers-CUmg6egw.js.map +1 -0
  14. package/dist/browser-BSniCNqO.js +3058 -0
  15. package/dist/browser-BSniCNqO.js.map +1 -0
  16. package/dist/browser-Cq59Ij19.cjs +2 -0
  17. package/dist/browser-Cq59Ij19.cjs.map +1 -0
  18. package/dist/cjs/holosphere.cjs +2 -0
  19. package/dist/cjs/holosphere.cjs.map +1 -0
  20. package/dist/esm/holosphere.js +53 -0
  21. package/dist/esm/holosphere.js.map +1 -0
  22. package/dist/index-Bl6rM1NW.js +15104 -0
  23. package/dist/index-Bl6rM1NW.js.map +1 -0
  24. package/dist/index-Bwg3OzRM.cjs +12 -0
  25. package/dist/index-Bwg3OzRM.cjs.map +1 -0
  26. package/dist/index-D-jZhliX.js +40274 -0
  27. package/dist/index-D-jZhliX.js.map +1 -0
  28. package/dist/index-Dc6Z8Aob.cjs +18 -0
  29. package/dist/index-Dc6Z8Aob.cjs.map +1 -0
  30. package/dist/indexeddb-storage-5eiUNsHC.js +176 -0
  31. package/dist/indexeddb-storage-5eiUNsHC.js.map +1 -0
  32. package/dist/indexeddb-storage-FNFUVvTJ.cjs +2 -0
  33. package/dist/indexeddb-storage-FNFUVvTJ.cjs.map +1 -0
  34. package/dist/memory-storage-CI-gfmuG.js +91 -0
  35. package/dist/memory-storage-CI-gfmuG.js.map +1 -0
  36. package/dist/memory-storage-DMt36uZO.cjs +2 -0
  37. package/dist/memory-storage-DMt36uZO.cjs.map +1 -0
  38. package/dist/secp256k1-CEwJNcfV.js +1890 -0
  39. package/dist/secp256k1-CEwJNcfV.js.map +1 -0
  40. package/dist/secp256k1-CiEONUnj.cjs +12 -0
  41. package/dist/secp256k1-CiEONUnj.cjs.map +1 -0
  42. package/docs/CONTRACTS.md +797 -0
  43. package/docs/FOSDEM_PROPOSAL.md +388 -0
  44. package/docs/LOCALFIRST.md +266 -0
  45. package/docs/api/ai_aggregation.js.html +333 -0
  46. package/docs/api/ai_breakdown.js.html +524 -0
  47. package/docs/api/ai_classifier.js.html +231 -0
  48. package/docs/api/ai_council.js.html +246 -0
  49. package/docs/api/ai_embeddings.js.html +304 -0
  50. package/docs/api/ai_federation-ai.js.html +338 -0
  51. package/docs/api/ai_h3-ai.js.html +970 -0
  52. package/docs/api/ai_index.js.html +124 -0
  53. package/docs/api/ai_json-ops.js.html +241 -0
  54. package/docs/api/ai_llm-service.js.html +239 -0
  55. package/docs/api/ai_nl-query.js.html +236 -0
  56. package/docs/api/ai_relationships.js.html +367 -0
  57. package/docs/api/ai_schema-extractor.js.html +235 -0
  58. package/docs/api/ai_spatial.js.html +307 -0
  59. package/docs/api/ai_tts.js.html +214 -0
  60. package/docs/api/content_social-protocols.js.html +180 -0
  61. package/docs/api/core_holosphere.js.html +757 -0
  62. package/docs/api/crypto_nostr-utils.js.html +306 -0
  63. package/docs/api/crypto_secp256k1.js.html +267 -0
  64. package/docs/api/data/search.json +1 -0
  65. package/docs/api/federation_discovery.js.html +337 -0
  66. package/docs/api/federation_handshake.js.html +478 -0
  67. package/docs/api/federation_hologram.js.html +1053 -0
  68. package/docs/api/federation_registry.js.html +389 -0
  69. package/docs/api/fonts/Inconsolata-Regular.ttf +0 -0
  70. package/docs/api/fonts/OpenSans-Regular.ttf +0 -0
  71. package/docs/api/fonts/WorkSans-Bold.ttf +0 -0
  72. package/docs/api/global.html +3 -0
  73. package/docs/api/hierarchical_upcast.js.html +128 -0
  74. package/docs/api/index.html +265 -0
  75. package/docs/api/index.js.html +1868 -0
  76. package/docs/api/lib_ai-methods.js.html +660 -0
  77. package/docs/api/lib_contract-methods.js.html +445 -0
  78. package/docs/api/lib_errors.js.html +56 -0
  79. package/docs/api/lib_federation-methods.js.html +348 -0
  80. package/docs/api/lib_index.js.html +33 -0
  81. package/docs/api/module-ai.html +5 -0
  82. package/docs/api/module-ai_aggregation-SmartAggregation.html +6 -0
  83. package/docs/api/module-ai_aggregation.SmartAggregation.html +3 -0
  84. package/docs/api/module-ai_aggregation.html +3 -0
  85. package/docs/api/module-ai_breakdown-TaskBreakdown.html +5 -0
  86. package/docs/api/module-ai_breakdown.TaskBreakdown.html +3 -0
  87. package/docs/api/module-ai_breakdown.html +3 -0
  88. package/docs/api/module-ai_classifier-Classifier.html +6 -0
  89. package/docs/api/module-ai_classifier.Classifier.html +3 -0
  90. package/docs/api/module-ai_classifier.html +3 -0
  91. package/docs/api/module-ai_council-Council.html +6 -0
  92. package/docs/api/module-ai_council.Council.html +3 -0
  93. package/docs/api/module-ai_council.html +3 -0
  94. package/docs/api/module-ai_embeddings-Embeddings.html +5 -0
  95. package/docs/api/module-ai_embeddings.Embeddings.html +3 -0
  96. package/docs/api/module-ai_embeddings.html +3 -0
  97. package/docs/api/module-ai_federation-ai-FederationAdvisor.html +6 -0
  98. package/docs/api/module-ai_federation-ai.FederationAdvisor.html +3 -0
  99. package/docs/api/module-ai_federation-ai.html +3 -0
  100. package/docs/api/module-ai_h3-ai-H3AI.html +6 -0
  101. package/docs/api/module-ai_h3-ai.H3AI.html +3 -0
  102. package/docs/api/module-ai_h3-ai.html +3 -0
  103. package/docs/api/module-ai_json-ops-JSONOps.html +5 -0
  104. package/docs/api/module-ai_json-ops.JSONOps.html +3 -0
  105. package/docs/api/module-ai_json-ops.html +3 -0
  106. package/docs/api/module-ai_llm-service-LLMService.html +5 -0
  107. package/docs/api/module-ai_llm-service.LLMService.html +3 -0
  108. package/docs/api/module-ai_llm-service.html +3 -0
  109. package/docs/api/module-ai_nl-query-NLQuery.html +5 -0
  110. package/docs/api/module-ai_nl-query.NLQuery.html +3 -0
  111. package/docs/api/module-ai_nl-query.html +3 -0
  112. package/docs/api/module-ai_relationships-RelationshipDiscovery.html +6 -0
  113. package/docs/api/module-ai_relationships.RelationshipDiscovery.html +3 -0
  114. package/docs/api/module-ai_relationships.html +3 -0
  115. package/docs/api/module-ai_schema-extractor-SchemaExtractor.html +5 -0
  116. package/docs/api/module-ai_schema-extractor.SchemaExtractor.html +3 -0
  117. package/docs/api/module-ai_schema-extractor.html +3 -0
  118. package/docs/api/module-ai_spatial-SpatialAnalysis.html +6 -0
  119. package/docs/api/module-ai_spatial.SpatialAnalysis.html +3 -0
  120. package/docs/api/module-ai_spatial.html +3 -0
  121. package/docs/api/module-ai_tts-TTS.html +5 -0
  122. package/docs/api/module-ai_tts.TTS.html +3 -0
  123. package/docs/api/module-ai_tts.html +3 -0
  124. package/docs/api/module-content_social-protocols.html +3 -0
  125. package/docs/api/module-core_holosphere-HoloSphere.html +6 -0
  126. package/docs/api/module-core_holosphere.HoloSphere.html +3 -0
  127. package/docs/api/module-core_holosphere.html +3 -0
  128. package/docs/api/module-crypto_nostr-utils.html +3 -0
  129. package/docs/api/module-crypto_secp256k1.html +3 -0
  130. package/docs/api/module-federation_hologram.html +3 -0
  131. package/docs/api/module-hierarchical_upcast.html +3 -0
  132. package/docs/api/module-holosphere-HoloSphereBase.html +3 -0
  133. package/docs/api/module-holosphere.html +3 -0
  134. package/docs/api/module-lib_ai-methods.html +3 -0
  135. package/docs/api/module-lib_contract-methods.html +3 -0
  136. package/docs/api/module-lib_errors-AuthorizationError.html +3 -0
  137. package/docs/api/module-lib_errors-ValidationError.html +3 -0
  138. package/docs/api/module-lib_errors.AuthorizationError.html +3 -0
  139. package/docs/api/module-lib_errors.ValidationError.html +3 -0
  140. package/docs/api/module-lib_errors.html +3 -0
  141. package/docs/api/module-lib_federation-methods.html +3 -0
  142. package/docs/api/module-lib_index.html +3 -0
  143. package/docs/api/module-schema_validator-ValidationError.html +3 -0
  144. package/docs/api/module-schema_validator.ValidationError.html +3 -0
  145. package/docs/api/module-schema_validator.html +3 -0
  146. package/docs/api/module-spatial_h3-operations.html +4 -0
  147. package/docs/api/module-storage_backend-factory.BackendFactory.html +3 -0
  148. package/docs/api/module-storage_backend-factory.html +3 -0
  149. package/docs/api/module-storage_backend-interface-StorageBackend.html +3 -0
  150. package/docs/api/module-storage_backend-interface.StorageBackend.html +3 -0
  151. package/docs/api/module-storage_backend-interface.html +3 -0
  152. package/docs/api/module-storage_backends_activitypub-backend-ActivityPubBackend.html +7 -0
  153. package/docs/api/module-storage_backends_activitypub-backend.ActivityPubBackend.html +3 -0
  154. package/docs/api/module-storage_backends_activitypub-backend.html +3 -0
  155. package/docs/api/module-storage_backends_activitypub_server-ActivityPubServer.html +8 -0
  156. package/docs/api/module-storage_backends_activitypub_server.ActivityPubServer.html +3 -0
  157. package/docs/api/module-storage_backends_activitypub_server.html +3 -0
  158. package/docs/api/module-storage_backends_gundb-backend-GunDBBackend.html +7 -0
  159. package/docs/api/module-storage_backends_gundb-backend.GunDBBackend.html +3 -0
  160. package/docs/api/module-storage_backends_gundb-backend.html +3 -0
  161. package/docs/api/module-storage_backends_nostr-backend-NostrBackend.html +8 -0
  162. package/docs/api/module-storage_backends_nostr-backend.NostrBackend.html +3 -0
  163. package/docs/api/module-storage_backends_nostr-backend.html +3 -0
  164. package/docs/api/module-storage_filesystem-storage-FileSystemStorage.html +5 -0
  165. package/docs/api/module-storage_filesystem-storage-browser-FileSystemStorage.html +3 -0
  166. package/docs/api/module-storage_filesystem-storage-browser.FileSystemStorage.html +3 -0
  167. package/docs/api/module-storage_filesystem-storage-browser.html +3 -0
  168. package/docs/api/module-storage_filesystem-storage.FileSystemStorage.html +3 -0
  169. package/docs/api/module-storage_filesystem-storage.html +3 -0
  170. package/docs/api/module-storage_global-tables.html +3 -0
  171. package/docs/api/module-storage_gun-async.html +3 -0
  172. package/docs/api/module-storage_gun-auth-GunAuth.html +5 -0
  173. package/docs/api/module-storage_gun-auth.GunAuth.html +3 -0
  174. package/docs/api/module-storage_gun-auth.html +3 -0
  175. package/docs/api/module-storage_gun-federation.html +3 -0
  176. package/docs/api/module-storage_gun-references-GunReferenceHandler.html +5 -0
  177. package/docs/api/module-storage_gun-references.GunReferenceHandler.html +3 -0
  178. package/docs/api/module-storage_gun-references.html +3 -0
  179. package/docs/api/module-storage_gun-schema-GunSchemaValidator.html +5 -0
  180. package/docs/api/module-storage_gun-schema.GunSchemaValidator.html +3 -0
  181. package/docs/api/module-storage_gun-schema.html +3 -0
  182. package/docs/api/module-storage_gun-wrapper.html +11 -0
  183. package/docs/api/module-storage_indexeddb-storage-IndexedDBStorage.html +5 -0
  184. package/docs/api/module-storage_indexeddb-storage.IndexedDBStorage.html +3 -0
  185. package/docs/api/module-storage_indexeddb-storage.html +3 -0
  186. package/docs/api/module-storage_key-storage-simple.html +3 -0
  187. package/docs/api/module-storage_key-storage.html +4 -0
  188. package/docs/api/module-storage_memory-storage-MemoryStorage.html +5 -0
  189. package/docs/api/module-storage_memory-storage.MemoryStorage.html +3 -0
  190. package/docs/api/module-storage_memory-storage.html +3 -0
  191. package/docs/api/module-storage_migration-MigrationTool.html +6 -0
  192. package/docs/api/module-storage_migration.MigrationTool.html +3 -0
  193. package/docs/api/module-storage_migration.html +3 -0
  194. package/docs/api/module-storage_nostr-async.html +18 -0
  195. package/docs/api/module-storage_nostr-client-LRUCache.html +3 -0
  196. package/docs/api/module-storage_nostr-client-NostrClient.html +7 -0
  197. package/docs/api/module-storage_nostr-client.NostrClient.html +15 -0
  198. package/docs/api/module-storage_nostr-client.html +6 -0
  199. package/docs/api/module-storage_nostr-wrapper.html +3 -0
  200. package/docs/api/module-storage_outbox-queue-OutboxQueue.html +4 -0
  201. package/docs/api/module-storage_outbox-queue.OutboxQueue.html +3 -0
  202. package/docs/api/module-storage_outbox-queue.html +3 -0
  203. package/docs/api/module-storage_persistent-storage-PersistentStorage.html +3 -0
  204. package/docs/api/module-storage_persistent-storage.html +4 -0
  205. package/docs/api/module-storage_sync-service-SyncService.html +5 -0
  206. package/docs/api/module-storage_sync-service.SyncService.html +3 -0
  207. package/docs/api/module-storage_sync-service.html +3 -0
  208. package/docs/api/module-storage_unified-storage.html +3 -0
  209. package/docs/api/module-subscriptions_manager.SubscriptionRegistry.html +3 -0
  210. package/docs/api/module-subscriptions_manager.html +3 -0
  211. package/docs/api/schema_validator.js.html +113 -0
  212. package/docs/api/scripts/core.js +726 -0
  213. package/docs/api/scripts/core.min.js +23 -0
  214. package/docs/api/scripts/resize.js +90 -0
  215. package/docs/api/scripts/search.js +265 -0
  216. package/docs/api/scripts/search.min.js +6 -0
  217. package/docs/api/scripts/third-party/Apache-License-2.0.txt +202 -0
  218. package/docs/api/scripts/third-party/fuse.js +9 -0
  219. package/docs/api/scripts/third-party/hljs-line-num-original.js +369 -0
  220. package/docs/api/scripts/third-party/hljs-line-num.js +1 -0
  221. package/docs/api/scripts/third-party/hljs-original.js +5171 -0
  222. package/docs/api/scripts/third-party/hljs.js +1 -0
  223. package/docs/api/scripts/third-party/popper.js +5 -0
  224. package/docs/api/scripts/third-party/tippy.js +1 -0
  225. package/docs/api/scripts/third-party/tocbot.js +672 -0
  226. package/docs/api/scripts/third-party/tocbot.min.js +1 -0
  227. package/docs/api/spatial_h3-operations.js.html +129 -0
  228. package/docs/api/storage_backend-factory.js.html +133 -0
  229. package/docs/api/storage_backend-interface.js.html +164 -0
  230. package/docs/api/storage_backends_activitypub-backend.js.html +298 -0
  231. package/docs/api/storage_backends_activitypub_server.js.html +678 -0
  232. package/docs/api/storage_backends_gundb-backend.js.html +878 -0
  233. package/docs/api/storage_backends_nostr-backend.js.html +254 -0
  234. package/docs/api/storage_filesystem-storage-browser.js.html +83 -0
  235. package/docs/api/storage_filesystem-storage.js.html +207 -0
  236. package/docs/api/storage_global-tables.js.html +116 -0
  237. package/docs/api/storage_gun-async.js.html +344 -0
  238. package/docs/api/storage_gun-auth.js.html +376 -0
  239. package/docs/api/storage_gun-federation.js.html +788 -0
  240. package/docs/api/storage_gun-references.js.html +212 -0
  241. package/docs/api/storage_gun-schema.js.html +309 -0
  242. package/docs/api/storage_gun-wrapper.js.html +645 -0
  243. package/docs/api/storage_indexeddb-storage.js.html +224 -0
  244. package/docs/api/storage_key-storage-simple.js.html +102 -0
  245. package/docs/api/storage_key-storage.js.html +171 -0
  246. package/docs/api/storage_memory-storage.js.html +128 -0
  247. package/docs/api/storage_migration.js.html +354 -0
  248. package/docs/api/storage_nostr-async.js.html +1076 -0
  249. package/docs/api/storage_nostr-client.js.html +1598 -0
  250. package/docs/api/storage_nostr-wrapper.js.html +218 -0
  251. package/docs/api/storage_outbox-queue.js.html +248 -0
  252. package/docs/api/storage_persistent-storage.js.html +160 -0
  253. package/docs/api/storage_sync-service.js.html +201 -0
  254. package/docs/api/storage_unified-storage.js.html +157 -0
  255. package/docs/api/styles/clean-jsdoc-theme-base.css +1159 -0
  256. package/docs/api/styles/clean-jsdoc-theme-dark.css +412 -0
  257. package/docs/api/styles/clean-jsdoc-theme-light.css +482 -0
  258. package/docs/api/styles/clean-jsdoc-theme-scrollbar.css +30 -0
  259. package/docs/api/styles/clean-jsdoc-theme-without-scrollbar.min.css +1 -0
  260. package/docs/api/styles/clean-jsdoc-theme.min.css +1 -0
  261. package/docs/api/subscriptions_manager.js.html +162 -0
  262. package/docs/contracts/api-interface.md +793 -0
  263. package/docs/data-model.md +476 -0
  264. package/docs/gun-async-usage.md +338 -0
  265. package/docs/plan.md +349 -0
  266. package/docs/quickstart.md +674 -0
  267. package/docs/research.md +362 -0
  268. package/docs/spec.md +244 -0
  269. package/docs/storage-backends.md +326 -0
  270. package/docs/tasks.md +947 -0
  271. package/examples/demo.html +47 -0
  272. package/examples/holosphere-widget.js +1242 -0
  273. package/examples/widget-demo.html +274 -0
  274. package/examples/widget.html +703 -0
  275. package/jsdoc.json +26 -0
  276. package/package.json +25 -7
  277. package/src/ai/aggregation.js +13 -2
  278. package/src/ai/breakdown.js +12 -2
  279. package/src/ai/classifier.js +14 -3
  280. package/src/ai/council.js +22 -7
  281. package/src/ai/embeddings.js +37 -15
  282. package/src/ai/federation-ai.js +13 -2
  283. package/src/ai/h3-ai.js +14 -2
  284. package/src/ai/index.js +16 -7
  285. package/src/ai/json-ops.js +18 -5
  286. package/src/ai/llm-service.js +62 -31
  287. package/src/ai/nl-query.js +12 -2
  288. package/src/ai/relationships.js +13 -2
  289. package/src/ai/schema-extractor.js +24 -10
  290. package/src/ai/spatial.js +13 -2
  291. package/src/ai/tts.js +25 -8
  292. package/src/cdn-entry.js +22 -0
  293. package/src/content/social-protocols.js +34 -25
  294. package/src/contracts/abis/Appreciative.json +1280 -0
  295. package/src/contracts/abis/AppreciativeFactory.json +101 -0
  296. package/src/contracts/abis/Bundle.json +1438 -0
  297. package/src/contracts/abis/BundleFactory.json +106 -0
  298. package/src/contracts/abis/Holon.json +881 -0
  299. package/src/contracts/abis/Holons.json +330 -0
  300. package/src/contracts/abis/Managed.json +1262 -0
  301. package/src/contracts/abis/ManagedFactory.json +149 -0
  302. package/src/contracts/abis/Membrane.json +261 -0
  303. package/src/contracts/abis/Splitter.json +1624 -0
  304. package/src/contracts/abis/SplitterFactory.json +220 -0
  305. package/src/contracts/abis/TestToken.json +321 -0
  306. package/src/contracts/abis/Zoned.json +1461 -0
  307. package/src/contracts/abis/ZonedFactory.json +154 -0
  308. package/src/contracts/chain-manager.js +403 -0
  309. package/src/contracts/deployer.js +500 -0
  310. package/src/contracts/event-listener.js +539 -0
  311. package/src/contracts/holon-contracts.js +359 -0
  312. package/src/contracts/index.js +82 -0
  313. package/src/contracts/networks.js +229 -0
  314. package/src/contracts/operations.js +687 -0
  315. package/src/contracts/queries.js +638 -0
  316. package/src/core/holosphere.js +487 -6
  317. package/src/crypto/nostr-utils.js +303 -0
  318. package/src/crypto/secp256k1.js +7 -2
  319. package/src/federation/handshake.js +475 -0
  320. package/src/federation/hologram.js +117 -3
  321. package/src/hierarchical/upcast.js +40 -25
  322. package/src/index.js +1547 -1912
  323. package/src/lib/ai-methods.js +657 -0
  324. package/src/lib/contract-methods.js +442 -0
  325. package/src/lib/errors.js +53 -0
  326. package/src/lib/federation-methods.js +345 -0
  327. package/src/lib/index.js +30 -0
  328. package/src/schema/validator.js +22 -3
  329. package/src/spatial/h3-operations.js +19 -3
  330. package/src/storage/backend-factory.js +7 -2
  331. package/src/storage/backend-interface.js +21 -2
  332. package/src/storage/backends/activitypub/server.js +25 -3
  333. package/src/storage/backends/activitypub-backend.js +25 -2
  334. package/src/storage/backends/gundb-backend.js +692 -50
  335. package/src/storage/backends/nostr-backend.js +116 -1
  336. package/src/storage/filesystem-storage-browser.js +42 -2
  337. package/src/storage/filesystem-storage.js +72 -5
  338. package/src/storage/global-tables.js +35 -3
  339. package/src/storage/gun-async.js +75 -15
  340. package/src/storage/gun-auth.js +373 -0
  341. package/src/storage/gun-federation.js +785 -0
  342. package/src/storage/gun-references.js +209 -0
  343. package/src/storage/gun-schema.js +306 -0
  344. package/src/storage/gun-wrapper.js +475 -54
  345. package/src/storage/indexeddb-storage.js +112 -13
  346. package/src/storage/key-storage-simple.js +32 -9
  347. package/src/storage/key-storage.js +45 -13
  348. package/src/storage/memory-storage.js +68 -2
  349. package/src/storage/migration.js +20 -7
  350. package/src/storage/nostr-async.js +412 -122
  351. package/src/storage/nostr-client.js +749 -76
  352. package/src/storage/nostr-wrapper.js +6 -2
  353. package/src/storage/outbox-queue.js +55 -18
  354. package/src/storage/persistent-storage.js +62 -14
  355. package/src/storage/sync-service.js +51 -17
  356. package/src/storage/unified-storage.js +154 -0
  357. package/src/subscriptions/manager.js +34 -17
  358. package/types/index.d.ts +133 -0
  359. package/vite.config.cdn.js +60 -0
  360. package/tests/unit/ai/aggregation.test.js +0 -295
  361. package/tests/unit/ai/breakdown.test.js +0 -446
  362. package/tests/unit/ai/classifier.test.js +0 -294
  363. package/tests/unit/ai/council.test.js +0 -262
  364. package/tests/unit/ai/embeddings.test.js +0 -384
  365. package/tests/unit/ai/federation-ai.test.js +0 -344
  366. package/tests/unit/ai/h3-ai.test.js +0 -458
  367. package/tests/unit/ai/index.test.js +0 -304
  368. package/tests/unit/ai/json-ops.test.js +0 -307
  369. package/tests/unit/ai/llm-service.test.js +0 -390
  370. package/tests/unit/ai/nl-query.test.js +0 -383
  371. package/tests/unit/ai/relationships.test.js +0 -311
  372. package/tests/unit/ai/schema-extractor.test.js +0 -384
  373. package/tests/unit/ai/spatial.test.js +0 -279
  374. package/tests/unit/ai/tts.test.js +0 -279
  375. package/tests/unit/content.test.js +0 -332
  376. package/tests/unit/contract/core.test.js +0 -88
  377. package/tests/unit/contract/crypto.test.js +0 -198
  378. package/tests/unit/contract/data.test.js +0 -223
  379. package/tests/unit/contract/federation.test.js +0 -181
  380. package/tests/unit/contract/hierarchical.test.js +0 -113
  381. package/tests/unit/contract/schema.test.js +0 -114
  382. package/tests/unit/contract/social.test.js +0 -217
  383. package/tests/unit/contract/spatial.test.js +0 -110
  384. package/tests/unit/contract/subscriptions.test.js +0 -128
  385. package/tests/unit/contract/utils.test.js +0 -159
  386. package/tests/unit/core.test.js +0 -152
  387. package/tests/unit/crypto.test.js +0 -328
  388. package/tests/unit/federation.test.js +0 -234
  389. package/tests/unit/gun-async.test.js +0 -252
  390. package/tests/unit/hierarchical.test.js +0 -399
  391. package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
  392. package/tests/unit/integration/scenario-02-federation.test.js +0 -76
  393. package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
  394. package/tests/unit/integration/scenario-04-validation.test.js +0 -129
  395. package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
  396. package/tests/unit/integration/scenario-06-social.test.js +0 -135
  397. package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
  398. package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
  399. package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
  400. package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
  401. package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
  402. package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
  403. package/tests/unit/performance/benchmark.test.js +0 -85
  404. package/tests/unit/schema.test.js +0 -213
  405. package/tests/unit/spatial.test.js +0 -158
  406. package/tests/unit/storage.test.js +0 -195
  407. package/tests/unit/subscriptions.test.js +0 -328
  408. package/tests/unit/test-data-permanence-debug.js +0 -197
  409. package/tests/unit/test-data-permanence.js +0 -340
  410. package/tests/unit/test-key-persistence-fixed.js +0 -148
  411. package/tests/unit/test-key-persistence.js +0 -172
  412. package/tests/unit/test-relay-permanence.js +0 -376
  413. package/tests/unit/test-second-node.js +0 -95
  414. package/tests/unit/test-simple-write.js +0 -89
  415. /package/{cleanup-test-data.js → scripts/cleanup-test-data.js} +0 -0
  416. /package/{test-ai-real-api.js → scripts/test-ai-real-api.js} +0 -0
@@ -0,0 +1,500 @@
1
+ /**
2
+ * @fileoverview Contract deployment utilities for Holosphere smart contracts.
3
+ * Provides 1-click deployment for all factories, registry, and individual holon contracts.
4
+ * @module contracts/deployer
5
+ */
6
+
7
+ // Import ABIs
8
+ import SplitterABI from './abis/Splitter.json' with { type: 'json' };
9
+ import ManagedABI from './abis/Managed.json' with { type: 'json' };
10
+ import ZonedABI from './abis/Zoned.json' with { type: 'json' };
11
+ import AppreciativeABI from './abis/Appreciative.json' with { type: 'json' };
12
+ import BundleABI from './abis/Bundle.json' with { type: 'json' };
13
+ import HolonsABI from './abis/Holons.json' with { type: 'json' };
14
+ import SplitterFactoryABI from './abis/SplitterFactory.json' with { type: 'json' };
15
+ import ManagedFactoryABI from './abis/ManagedFactory.json' with { type: 'json' };
16
+ import ZonedFactoryABI from './abis/ZonedFactory.json' with { type: 'json' };
17
+ import AppreciativeFactoryABI from './abis/AppreciativeFactory.json' with { type: 'json' };
18
+ import BundleFactoryABI from './abis/BundleFactory.json' with { type: 'json' };
19
+ import TestTokenABI from './abis/TestToken.json' with { type: 'json' };
20
+
21
+ import { getTxUrl, getAddressUrl } from './networks.js';
22
+
23
+ // Export ABIs for external use
24
+ export const ABIs = {
25
+ Splitter: SplitterABI,
26
+ Managed: ManagedABI,
27
+ Zoned: ZonedABI,
28
+ Appreciative: AppreciativeABI,
29
+ Bundle: BundleABI,
30
+ Holons: HolonsABI,
31
+ SplitterFactory: SplitterFactoryABI,
32
+ ManagedFactory: ManagedFactoryABI,
33
+ ZonedFactory: ZonedFactoryABI,
34
+ AppreciativeFactory: AppreciativeFactoryABI,
35
+ BundleFactory: BundleFactoryABI,
36
+ TestToken: TestTokenABI
37
+ };
38
+
39
+ /**
40
+ * Contract deployment manager for Holosphere contracts.
41
+ * Handles deployment of all contract types and factory infrastructure.
42
+ * @class
43
+ */
44
+ export class ContractDeployer {
45
+ /**
46
+ * Create a new ContractDeployer instance.
47
+ * @param {ChainManager} chainManager - Chain manager instance
48
+ */
49
+ constructor(chainManager) {
50
+ this.chainManager = chainManager;
51
+ this.deployedContracts = {};
52
+ this.ethers = null;
53
+ }
54
+
55
+ /**
56
+ * Load ethers.js library.
57
+ * @private
58
+ * @returns {Promise<Object>} Ethers.js module
59
+ */
60
+ async _loadEthers() {
61
+ if (!this.ethers) {
62
+ this.ethers = await import('ethers');
63
+ }
64
+ return this.ethers;
65
+ }
66
+
67
+ /**
68
+ * 1-CLICK DEPLOY: Deploy entire Holosphere contract infrastructure.
69
+ * Deploys all factories, Holons registry, and optional TestToken.
70
+ * @param {Object} [options={}] - Deployment options
71
+ * @param {string} [options.botAddress] - Bot address for managed operations (defaults to deployer)
72
+ * @param {string} [options.testTokenSupply='1000000'] - Initial supply for test token (in whole tokens)
73
+ * @param {boolean} [options.deployTestToken=true] - Whether to deploy test token
74
+ * @param {Function} [options.onProgress] - Callback for deployment progress updates
75
+ * @returns {Promise<Object>} Deployment details including contract addresses, explorer URLs, and metadata
76
+ * @throws {Error} If deployment fails
77
+ */
78
+ async deployAll(options = {}) {
79
+ const ethers = await this._loadEthers();
80
+ const signer = this.chainManager.getSigner();
81
+ const deployerAddress = await signer.getAddress();
82
+
83
+ const botAddress = options.botAddress || deployerAddress;
84
+ const testTokenSupply = options.testTokenSupply || '1000000';
85
+ const deployTestToken = options.deployTestToken !== false;
86
+ const onProgress = options.onProgress || (() => {});
87
+
88
+ const deployment = {
89
+ network: this.chainManager.networkName,
90
+ chainId: this.chainManager.getChainId(),
91
+ deployer: deployerAddress,
92
+ botAddress,
93
+ timestamp: new Date().toISOString(),
94
+ contracts: {}
95
+ };
96
+
97
+ try {
98
+ // Step 1: Deploy ManagedFactory
99
+ onProgress({ step: 1, total: deployTestToken ? 8 : 7, message: 'Deploying ManagedFactory...' });
100
+ const managedFactory = await this._deployContract(
101
+ ManagedFactoryABI.abi,
102
+ ManagedFactoryABI.bytecode,
103
+ [botAddress]
104
+ );
105
+ deployment.contracts.managedFactory = managedFactory.address;
106
+ onProgress({ step: 1, done: true, address: managedFactory.address });
107
+
108
+ // Step 2: Deploy ZonedFactory
109
+ onProgress({ step: 2, total: deployTestToken ? 8 : 7, message: 'Deploying ZonedFactory...' });
110
+ const zonedFactory = await this._deployContract(
111
+ ZonedFactoryABI.abi,
112
+ ZonedFactoryABI.bytecode,
113
+ [botAddress]
114
+ );
115
+ deployment.contracts.zonedFactory = zonedFactory.address;
116
+ onProgress({ step: 2, done: true, address: zonedFactory.address });
117
+
118
+ // Step 3: Deploy SplitterFactory
119
+ onProgress({ step: 3, total: deployTestToken ? 8 : 7, message: 'Deploying SplitterFactory...' });
120
+ const splitterFactory = await this._deployContract(
121
+ SplitterFactoryABI.abi,
122
+ SplitterFactoryABI.bytecode,
123
+ []
124
+ );
125
+ deployment.contracts.splitterFactory = splitterFactory.address;
126
+ onProgress({ step: 3, done: true, address: splitterFactory.address });
127
+
128
+ // Step 4: Deploy AppreciativeFactory
129
+ onProgress({ step: 4, total: deployTestToken ? 8 : 7, message: 'Deploying AppreciativeFactory...' });
130
+ const appreciativeFactory = await this._deployContract(
131
+ AppreciativeFactoryABI.abi,
132
+ AppreciativeFactoryABI.bytecode,
133
+ []
134
+ );
135
+ deployment.contracts.appreciativeFactory = appreciativeFactory.address;
136
+ onProgress({ step: 4, done: true, address: appreciativeFactory.address });
137
+
138
+ // Step 5: Deploy BundleFactory
139
+ onProgress({ step: 5, total: deployTestToken ? 8 : 7, message: 'Deploying BundleFactory...' });
140
+ const bundleFactory = await this._deployContract(
141
+ BundleFactoryABI.abi,
142
+ BundleFactoryABI.bytecode,
143
+ []
144
+ );
145
+ deployment.contracts.bundleFactory = bundleFactory.address;
146
+ onProgress({ step: 5, done: true, address: bundleFactory.address });
147
+
148
+ // Step 6: Deploy Holons (Central Registry)
149
+ onProgress({ step: 6, total: deployTestToken ? 8 : 7, message: 'Deploying Holons Registry...' });
150
+ const holons = await this._deployContract(
151
+ HolonsABI.abi,
152
+ HolonsABI.bytecode,
153
+ []
154
+ );
155
+ deployment.contracts.holons = holons.address;
156
+ onProgress({ step: 6, done: true, address: holons.address });
157
+
158
+ // Step 7: Configure Holons Registry
159
+ onProgress({ step: 7, total: deployTestToken ? 8 : 7, message: 'Configuring Holons Registry...' });
160
+
161
+ // Set factories
162
+ await holons.contract.setFactories(managedFactory.address, zonedFactory.address);
163
+
164
+ // Register flavors
165
+ await holons.contract.newFlavor('Splitter', splitterFactory.address);
166
+ await holons.contract.newFlavor('Managed', managedFactory.address);
167
+ await holons.contract.newFlavor('Zoned', zonedFactory.address);
168
+ await holons.contract.newFlavor('Appreciative', appreciativeFactory.address);
169
+ await holons.contract.newFlavor('Bundle', bundleFactory.address);
170
+
171
+ onProgress({ step: 7, done: true, message: 'Registry configured' });
172
+
173
+ // Step 8: Deploy TestToken (optional)
174
+ if (deployTestToken) {
175
+ onProgress({ step: 8, total: 8, message: 'Deploying TestToken...' });
176
+ const supply = ethers.parseEther(testTokenSupply);
177
+ const testToken = await this._deployContract(
178
+ TestTokenABI.abi,
179
+ TestTokenABI.bytecode,
180
+ [supply]
181
+ );
182
+ deployment.contracts.testToken = testToken.address;
183
+ onProgress({ step: 8, done: true, address: testToken.address });
184
+ }
185
+
186
+ // Store deployed contracts
187
+ this.deployedContracts = deployment.contracts;
188
+
189
+ // Add explorer URLs
190
+ deployment.explorerUrls = {};
191
+ for (const [name, address] of Object.entries(deployment.contracts)) {
192
+ const url = getAddressUrl(deployment.network, address);
193
+ if (url) deployment.explorerUrls[name] = url;
194
+ }
195
+
196
+ return deployment;
197
+
198
+ } catch (error) {
199
+ throw new Error(`Deployment failed: ${error.message}`);
200
+ }
201
+ }
202
+
203
+ /**
204
+ * Deploy a Splitter contract for fractal ownership distribution.
205
+ * @param {string} holonId - Holon identifier
206
+ * @param {string} name - Contract display name
207
+ * @param {number} [splitPercentage=70] - Internal/External split (e.g., 70 = 70% internal, 30% external)
208
+ * @param {Object} [options={}] - Additional deployment options
209
+ * @param {string} [options.creatorUserId] - Creator user ID (defaults to holonId)
210
+ * @param {string} [options.managedFactory] - Managed factory address
211
+ * @param {string} [options.zonedFactory] - Zoned factory address
212
+ * @returns {Promise<{contract: Object, address: string, txHash: string, holonId: string, type: string, splitPercentage: number}>} Deployment details
213
+ * @throws {Error} If factories not deployed
214
+ */
215
+ async deploySplitter(holonId, name, splitPercentage = 70, options = {}) {
216
+ const signer = this.chainManager.getSigner();
217
+ const deployerAddress = await signer.getAddress();
218
+
219
+ const creatorUserId = options.creatorUserId || holonId;
220
+ const managedFactory = options.managedFactory || this.deployedContracts.managedFactory;
221
+ const zonedFactory = options.zonedFactory || this.deployedContracts.zonedFactory;
222
+
223
+ if (!managedFactory || !zonedFactory) {
224
+ throw new Error('Factories not deployed. Run deployAll() first or provide factory addresses.');
225
+ }
226
+
227
+ const result = await this._deployContract(
228
+ SplitterABI.abi,
229
+ SplitterABI.bytecode,
230
+ [deployerAddress, creatorUserId, name, splitPercentage, managedFactory, zonedFactory]
231
+ );
232
+
233
+ // Configure the split
234
+ await result.contract.setContractSplit(splitPercentage, 100 - splitPercentage);
235
+
236
+ // Create child contracts
237
+ await result.contract.createManagedContract(creatorUserId, name, 0);
238
+ await result.contract.createZonedContract(creatorUserId, name, 6); // 6 zones default
239
+
240
+ return {
241
+ ...result,
242
+ holonId,
243
+ type: 'Splitter',
244
+ splitPercentage
245
+ };
246
+ }
247
+
248
+ /**
249
+ * Deploy a Managed contract for appreciation-based distribution.
250
+ * @param {string} name - Contract name
251
+ * @param {Object} [options={}] - Additional deployment options
252
+ * @param {string} [options.botAddress] - Bot address for managing appreciation (defaults to deployer)
253
+ * @returns {Promise<{contract: Object, address: string, txHash: string, type: string}>} Deployment details
254
+ */
255
+ async deployManaged(name, options = {}) {
256
+ const signer = this.chainManager.getSigner();
257
+ const deployerAddress = await signer.getAddress();
258
+ const botAddress = options.botAddress || deployerAddress;
259
+
260
+ const result = await this._deployContract(
261
+ ManagedABI.abi,
262
+ ManagedABI.bytecode,
263
+ [deployerAddress, name, botAddress]
264
+ );
265
+
266
+ return {
267
+ ...result,
268
+ type: 'Managed'
269
+ };
270
+ }
271
+
272
+ /**
273
+ * Deploy a Zoned contract for tier-based distribution.
274
+ * @param {string} name - Contract name
275
+ * @param {number} [nZones=6] - Number of zones
276
+ * @param {Object} [options={}] - Additional deployment options
277
+ * @param {string} [options.botAddress] - Bot address for managing zones (defaults to deployer)
278
+ * @param {string} [options.creatorUserId] - Creator user ID (defaults to 'creator')
279
+ * @returns {Promise<{contract: Object, address: string, txHash: string, type: string, nZones: number}>} Deployment details
280
+ */
281
+ async deployZoned(name, nZones = 6, options = {}) {
282
+ const signer = this.chainManager.getSigner();
283
+ const deployerAddress = await signer.getAddress();
284
+ const botAddress = options.botAddress || deployerAddress;
285
+ const creatorUserId = options.creatorUserId || 'creator';
286
+
287
+ const result = await this._deployContract(
288
+ ZonedABI.abi,
289
+ ZonedABI.bytecode,
290
+ [creatorUserId, deployerAddress, name, nZones, botAddress]
291
+ );
292
+
293
+ return {
294
+ ...result,
295
+ type: 'Zoned',
296
+ nZones
297
+ };
298
+ }
299
+
300
+ /**
301
+ * Deploy an Appreciative contract for peer-to-peer appreciation.
302
+ * @param {string} name - Contract name
303
+ * @param {string} creatorUserId - Creator's user ID
304
+ * @param {Object} [options={}] - Additional deployment options
305
+ * @returns {Promise<{contract: Object, address: string, txHash: string, type: string}>} Deployment details
306
+ */
307
+ async deployAppreciative(name, creatorUserId, options = {}) {
308
+ const signer = this.chainManager.getSigner();
309
+ const deployerAddress = await signer.getAddress();
310
+
311
+ const result = await this._deployContract(
312
+ AppreciativeABI.abi,
313
+ AppreciativeABI.bytecode,
314
+ [name, creatorUserId, deployerAddress]
315
+ );
316
+
317
+ return {
318
+ ...result,
319
+ type: 'Appreciative'
320
+ };
321
+ }
322
+
323
+ /**
324
+ * Deploy a Bundle contract for 2-way split with steepness-based zone decay.
325
+ * This is the simplest way to deploy a holon - no registry needed.
326
+ * @param {string} name - Contract name
327
+ * @param {bigint|string} [steepness] - Steepness factor (e.g., 0.5e18 = 50% decay, defaults to 0.5e18)
328
+ * @param {number} [nZones=6] - Number of zones
329
+ * @param {Object} [options={}] - Additional deployment options
330
+ * @param {string} [options.creatorUserId] - Creator user ID (defaults to 'creator')
331
+ * @returns {Promise<{contract: Object, address: string, txHash: string, type: string, steepness: bigint, nZones: number, creatorUserId: string, name: string}>} Deployment details
332
+ * @throws {Error} If bytecode is not available
333
+ */
334
+ async deployBundle(name, steepness, nZones = 6, options = {}) {
335
+ const ethers = await this._loadEthers();
336
+ const signer = this.chainManager.getSigner();
337
+ const deployerAddress = await signer.getAddress();
338
+ const creatorUserId = options.creatorUserId || 'creator';
339
+
340
+ // Default steepness: 0.5e18 (50% decay per zone)
341
+ const steepnessValue = steepness || ethers.parseEther('0.5');
342
+
343
+ // BundleABI now has { abi, bytecode } structure
344
+ const abi = BundleABI.abi || BundleABI;
345
+ const bytecode = BundleABI.bytecode;
346
+
347
+ if (!bytecode) {
348
+ throw new Error('Bundle bytecode not available. Please rebuild contracts.');
349
+ }
350
+
351
+ const result = await this._deployContract(
352
+ abi,
353
+ bytecode,
354
+ [deployerAddress, creatorUserId, name, steepnessValue, nZones]
355
+ );
356
+
357
+ return {
358
+ ...result,
359
+ type: 'Bundle',
360
+ steepness: steepnessValue,
361
+ nZones,
362
+ creatorUserId,
363
+ name
364
+ };
365
+ }
366
+
367
+ /**
368
+ * Deploy a Bundle contract directly (simplified 1-click deployment).
369
+ * No registry needed - just deploys and returns the address.
370
+ * @param {string} holonId - Unique identifier for the holon
371
+ * @param {string} name - Display name for the holon
372
+ * @param {Object} [options={}] - Deployment options
373
+ * @param {bigint|string} [options.steepness] - Steepness factor
374
+ * @param {number} [options.nZones=6] - Number of zones
375
+ * @returns {Promise<{contract: Object, address: string, txHash: string, type: string, steepness: bigint, nZones: number, creatorUserId: string, name: string}>} Deployment details
376
+ */
377
+ async deployBundleDirect(holonId, name, options = {}) {
378
+ const steepness = options.steepness;
379
+ const nZones = options.nZones || 6;
380
+
381
+ return this.deployBundle(name, steepness, nZones, {
382
+ creatorUserId: holonId,
383
+ ...options
384
+ });
385
+ }
386
+
387
+ /**
388
+ * Deploy a TestToken ERC20 for testing.
389
+ * @param {string} [initialSupply='1000000'] - Initial supply in whole tokens
390
+ * @returns {Promise<{contract: Object, address: string, txHash: string, type: string, initialSupply: string}>} Deployment details
391
+ */
392
+ async deployTestToken(initialSupply = '1000000') {
393
+ const ethers = await this._loadEthers();
394
+ const supply = ethers.parseEther(initialSupply);
395
+
396
+ const result = await this._deployContract(
397
+ TestTokenABI.abi,
398
+ TestTokenABI.bytecode,
399
+ [supply]
400
+ );
401
+
402
+ return {
403
+ ...result,
404
+ type: 'TestToken',
405
+ initialSupply
406
+ };
407
+ }
408
+
409
+ /**
410
+ * Create a holon bundle through the Holons registry.
411
+ * @param {string} creatorUserId - Creator's user ID
412
+ * @param {string} name - Bundle name
413
+ * @param {number} [parameter=70] - Split parameter
414
+ * @returns {Promise<{address: string, txHash: string, name: string, creatorUserId: string}>} Created holon details
415
+ * @throws {Error} If Holons registry not deployed
416
+ */
417
+ async createHolonBundle(creatorUserId, name, parameter = 70) {
418
+ if (!this.deployedContracts.holons) {
419
+ throw new Error('Holons registry not deployed. Run deployAll() first.');
420
+ }
421
+
422
+ const holons = await this.chainManager.getContract(
423
+ this.deployedContracts.holons,
424
+ HolonsABI.abi
425
+ );
426
+
427
+ const tx = await holons.newHolonBundle(creatorUserId, name, parameter);
428
+ const receipt = await tx.wait();
429
+
430
+ // Get the created address from events
431
+ const event = receipt.logs.find(log => {
432
+ try {
433
+ const parsed = holons.interface.parseLog(log);
434
+ return parsed?.name === 'NewHolon';
435
+ } catch {
436
+ return false;
437
+ }
438
+ });
439
+
440
+ const address = event ? holons.interface.parseLog(event).args.addr : await holons.toAddress(name);
441
+
442
+ return {
443
+ address,
444
+ txHash: receipt.hash,
445
+ name,
446
+ creatorUserId
447
+ };
448
+ }
449
+
450
+ /**
451
+ * Get contract instance by address and type.
452
+ * @param {string} address - Contract address
453
+ * @param {string} type - Contract type (Splitter, Managed, Zoned, Appreciative, Bundle, Holons, TestToken)
454
+ * @returns {Promise<Object>} Ethers.js Contract instance
455
+ * @throws {Error} If unknown contract type
456
+ */
457
+ async getContract(address, type) {
458
+ const abi = ABIs[type];
459
+ if (!abi) {
460
+ throw new Error(`Unknown contract type: ${type}`);
461
+ }
462
+ return this.chainManager.getContract(address, abi.abi);
463
+ }
464
+
465
+ /**
466
+ * Get deployed contract addresses.
467
+ * @returns {Object} Map of contract names to addresses
468
+ */
469
+ getDeployedAddresses() {
470
+ return { ...this.deployedContracts };
471
+ }
472
+
473
+ /**
474
+ * Load previously deployed contract addresses.
475
+ * @param {Object} addresses - Map of contract names to addresses
476
+ */
477
+ loadDeployedAddresses(addresses) {
478
+ this.deployedContracts = { ...addresses };
479
+ }
480
+
481
+ /**
482
+ * Internal helper to deploy a contract.
483
+ * @private
484
+ * @param {Array} abi - Contract ABI
485
+ * @param {string} bytecode - Contract bytecode
486
+ * @param {Array} constructorArgs - Constructor arguments
487
+ * @returns {Promise<{contract: Object, address: string, txHash: string, explorerUrl: string|null}>} Deployment result
488
+ */
489
+ async _deployContract(abi, bytecode, constructorArgs) {
490
+ const result = await this.chainManager.deployContract(abi, bytecode, constructorArgs);
491
+ return {
492
+ contract: result.contract,
493
+ address: result.address,
494
+ txHash: result.txHash,
495
+ explorerUrl: getAddressUrl(this.chainManager.networkName, result.address)
496
+ };
497
+ }
498
+ }
499
+
500
+ export default ContractDeployer;