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,687 @@
1
+ /**
2
+ * @fileoverview Unified operations interface for all Holosphere contract types.
3
+ * Provides a clean API for member management, fund distribution, and contract-specific operations.
4
+ * @module contracts/operations
5
+ */
6
+
7
+ /**
8
+ * Provides a unified interface for interacting with all Holosphere contract types.
9
+ * Wraps contract functions with clear parameters and type checking.
10
+ * @class
11
+ */
12
+ export class ContractOperations {
13
+ /**
14
+ * Create a new ContractOperations instance.
15
+ * @param {Object} contract - Ethers.js Contract instance
16
+ * @param {string} type - Contract type (Splitter, Managed, Zoned, Appreciative, Bundle)
17
+ * @param {ChainManager} chainManager - Chain manager instance
18
+ */
19
+ constructor(contract, type, chainManager) {
20
+ this.contract = contract;
21
+ this.type = type;
22
+ this.chainManager = chainManager;
23
+ this.ethers = null;
24
+ }
25
+
26
+ /**
27
+ * Load ethers.js library dynamically.
28
+ * @private
29
+ * @returns {Promise<Object>} Ethers.js module
30
+ */
31
+ async _loadEthers() {
32
+ if (!this.ethers) {
33
+ this.ethers = await import('ethers');
34
+ }
35
+ return this.ethers;
36
+ }
37
+
38
+ // ========================================================================
39
+ // MEMBER MANAGEMENT
40
+ // ========================================================================
41
+
42
+ /**
43
+ * Add a single member to the contract.
44
+ * @param {string} userId - User identifier (string-based, e.g., 'alice', 'telegram_12345')
45
+ * @returns {Promise<{txHash: string, receipt: Object}>} Transaction details
46
+ */
47
+ async addMember(userId) {
48
+ const tx = await this.contract.addMember(userId);
49
+ const receipt = await tx.wait();
50
+ return { txHash: receipt.hash, receipt };
51
+ }
52
+
53
+ /**
54
+ * Add multiple members at once (batch operation).
55
+ * @param {string[]} userIds - Array of user identifiers
56
+ * @returns {Promise<{txHash: string, receipt: Object}>} Transaction details
57
+ */
58
+ async addMembers(userIds) {
59
+ const tx = await this.contract.addMembers(userIds);
60
+ const receipt = await tx.wait();
61
+ return { txHash: receipt.hash, receipt };
62
+ }
63
+
64
+ /**
65
+ * Get all member user IDs.
66
+ * @returns {Promise<string[]>} Array of user IDs
67
+ */
68
+ async getMembers() {
69
+ const userIds = await this.contract.userIds();
70
+ // userIds is typically a getter for the array - try different approaches
71
+ try {
72
+ // Try to get all members by iterating
73
+ const members = [];
74
+ let i = 0;
75
+ while (true) {
76
+ try {
77
+ const userId = await this.contract.userIds(i);
78
+ members.push(userId);
79
+ i++;
80
+ } catch {
81
+ break;
82
+ }
83
+ }
84
+ return members;
85
+ } catch {
86
+ return [];
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Check if a user is a member.
92
+ * @param {string} userId - User identifier
93
+ * @returns {Promise<boolean>} True if user is a member
94
+ */
95
+ async isMember(userId) {
96
+ try {
97
+ // Different contracts use different naming conventions
98
+ if (this.type === 'Splitter') {
99
+ return await this.contract.isSplitterMember(userId);
100
+ }
101
+ return await this.contract.isMember(userId);
102
+ } catch {
103
+ return false;
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Get the Ethereum address associated with a user ID.
109
+ * @param {string} userId - User identifier
110
+ * @returns {Promise<string>} Ethereum address (or zero address if not set)
111
+ */
112
+ async getUserAddress(userId) {
113
+ return this.contract.userIdToAddress(userId);
114
+ }
115
+
116
+ // ========================================================================
117
+ // FUND DISTRIBUTION
118
+ // ========================================================================
119
+
120
+ /**
121
+ * Trigger reward distribution for ERC20 tokens.
122
+ * @param {string} tokenAddress - ERC20 token contract address
123
+ * @param {string|bigint} amount - Amount in wei (or token's smallest unit)
124
+ * @returns {Promise<{txHash: string, receipt: Object}>} Transaction details
125
+ */
126
+ async reward(tokenAddress, amount) {
127
+ const ethers = await this._loadEthers();
128
+ const amountBigInt = typeof amount === 'string' ? ethers.parseUnits(amount, 18) : amount;
129
+ const tx = await this.contract.reward(tokenAddress, amountBigInt);
130
+ const receipt = await tx.wait();
131
+ return { txHash: receipt.hash, receipt };
132
+ }
133
+
134
+ /**
135
+ * Trigger reward distribution for ETH.
136
+ * @param {string} amount - Amount in ETH (e.g., '1.5' for 1.5 ETH)
137
+ * @returns {Promise<{txHash: string, receipt: Object}>} Transaction details
138
+ */
139
+ async rewardEth(amount) {
140
+ const ethers = await this._loadEthers();
141
+ const amountWei = ethers.parseEther(amount);
142
+ const tx = await this.contract.reward(
143
+ '0x0000000000000000000000000000000000000000',
144
+ amountWei,
145
+ { value: amountWei }
146
+ );
147
+ const receipt = await tx.wait();
148
+ return { txHash: receipt.hash, receipt };
149
+ }
150
+
151
+ /**
152
+ * Send ETH directly to contract (triggers receive/fallback).
153
+ * @param {string} amount - Amount in ETH
154
+ * @returns {Promise<{txHash: string, receipt: Object}>} Transaction details
155
+ */
156
+ async sendEth(amount) {
157
+ const ethers = await this._loadEthers();
158
+ const signer = this.chainManager.getSigner();
159
+ const amountWei = ethers.parseEther(amount);
160
+ const tx = await signer.sendTransaction({
161
+ to: await this.contract.getAddress(),
162
+ value: amountWei
163
+ });
164
+ const receipt = await tx.wait();
165
+ return { txHash: receipt.hash, receipt };
166
+ }
167
+
168
+ /**
169
+ * Claim accumulated rewards for a user.
170
+ * @param {string} userId - User identifier
171
+ * @param {string} beneficiaryAddress - Ethereum address to receive funds
172
+ * @returns {Promise<{txHash: string, receipt: Object}>} Transaction details
173
+ */
174
+ async claim(userId, beneficiaryAddress) {
175
+ const tx = await this.contract.claim(userId, beneficiaryAddress);
176
+ const receipt = await tx.wait();
177
+ return { txHash: receipt.hash, receipt };
178
+ }
179
+
180
+ /**
181
+ * Get ETH balance for a user.
182
+ * @param {string} userId - User identifier
183
+ * @returns {Promise<string>} Balance in ETH as decimal string
184
+ */
185
+ async getEthBalance(userId) {
186
+ const ethers = await this._loadEthers();
187
+ const balance = await this.contract.etherBalance(userId);
188
+ return ethers.formatEther(balance);
189
+ }
190
+
191
+ /**
192
+ * Get ERC20 token balance for a user.
193
+ * @param {string} userId - User identifier
194
+ * @param {string} tokenAddress - ERC20 token address
195
+ * @returns {Promise<string>} Balance in tokens (18 decimals assumed) as decimal string
196
+ */
197
+ async getTokenBalance(userId, tokenAddress) {
198
+ const ethers = await this._loadEthers();
199
+ const balance = await this.contract.tokenBalance(userId, tokenAddress);
200
+ return ethers.formatUnits(balance, 18);
201
+ }
202
+
203
+ /**
204
+ * Check if user has already claimed rewards.
205
+ * @param {string} userId - User identifier
206
+ * @returns {Promise<boolean>} True if user has claimed
207
+ */
208
+ async hasClaimed(userId) {
209
+ return this.contract.hasClaimed(userId);
210
+ }
211
+
212
+ /**
213
+ * Get total deposited amount for a token.
214
+ * @param {string} tokenAddress - Token address (use zero address for ETH)
215
+ * @returns {Promise<string>} Total deposited as decimal string
216
+ */
217
+ async getTotalDeposited(tokenAddress) {
218
+ const ethers = await this._loadEthers();
219
+ const total = await this.contract.totalDeposited(tokenAddress);
220
+ return ethers.formatUnits(total, 18);
221
+ }
222
+
223
+ // ========================================================================
224
+ // SPLITTER OPERATIONS
225
+ // ========================================================================
226
+
227
+ /**
228
+ * Set the internal/external split percentages (Splitter only).
229
+ * @param {number} internalPct - Internal percentage (0-100)
230
+ * @param {number} externalPct - External percentage (0-100, must sum to 100 with internal)
231
+ * @returns {Promise<{txHash: string, receipt: Object}>} Transaction details
232
+ * @throws {Error} If percentages don't sum to 100 or not a Splitter contract
233
+ */
234
+ async setContractSplit(internalPct, externalPct) {
235
+ this._requireType(['Splitter']);
236
+ if (internalPct + externalPct !== 100) {
237
+ throw new Error('Percentages must sum to 100');
238
+ }
239
+ const tx = await this.contract.setContractSplit(internalPct, externalPct);
240
+ const receipt = await tx.wait();
241
+ return { txHash: receipt.hash, receipt };
242
+ }
243
+
244
+ /**
245
+ * Get current split percentages (Splitter only).
246
+ * @returns {Promise<{internal: number, external: number}>} Split percentages
247
+ * @throws {Error} If not a Splitter contract
248
+ */
249
+ async getContractSplit() {
250
+ this._requireType(['Splitter']);
251
+ const internal = await this.contract.internalContractSplitPercentage();
252
+ const external = await this.contract.externalContractSplitPercentage();
253
+ return {
254
+ internal: Number(internal),
255
+ external: Number(external)
256
+ };
257
+ }
258
+
259
+ /**
260
+ * Create a Managed child contract (Splitter only)
261
+ * @param {string} creatorUserId - Creator's user ID
262
+ * @param {string} name - Contract name
263
+ * @param {number} [parameter=0] - Optional parameter
264
+ * @returns {Promise<{address, txHash, receipt}>}
265
+ */
266
+ async createManagedContract(creatorUserId, name, parameter = 0) {
267
+ this._requireType(['Splitter']);
268
+ const tx = await this.contract.createManagedContract(creatorUserId, name, parameter);
269
+ const receipt = await tx.wait();
270
+ const address = await this.contract.contractsByType(`${name}_managed`);
271
+ return { address, txHash: receipt.hash, receipt };
272
+ }
273
+
274
+ /**
275
+ * Create a Zoned child contract (Splitter only)
276
+ * @param {string} creatorUserId - Creator's user ID
277
+ * @param {string} name - Contract name
278
+ * @param {number} [nZones=6] - Number of zones
279
+ * @returns {Promise<{address, txHash, receipt}>}
280
+ */
281
+ async createZonedContract(creatorUserId, name, nZones = 6) {
282
+ this._requireType(['Splitter']);
283
+ const tx = await this.contract.createZonedContract(creatorUserId, name, nZones);
284
+ const receipt = await tx.wait();
285
+ const address = await this.contract.contractsByType(`${name}_zoned`);
286
+ return { address, txHash: receipt.hash, receipt };
287
+ }
288
+
289
+ /**
290
+ * Get all child contract keys (Splitter only)
291
+ * @returns {Promise<string[]>}
292
+ */
293
+ async getChildContractKeys() {
294
+ this._requireType(['Splitter']);
295
+ return this.contract.getContractKeys();
296
+ }
297
+
298
+ /**
299
+ * Get child contract addresses (Splitter only)
300
+ * @returns {Promise<{keys: string[], addresses: string[]}>}
301
+ */
302
+ async getChildContracts() {
303
+ this._requireType(['Splitter']);
304
+ const [keys, addresses] = await this.contract.getContractAddresses();
305
+ return { keys, addresses };
306
+ }
307
+
308
+ /**
309
+ * Get child contract address by key (Splitter only)
310
+ * @param {string} key - Contract key (e.g., 'MyHolon_managed')
311
+ * @returns {Promise<string>}
312
+ */
313
+ async getChildContract(key) {
314
+ this._requireType(['Splitter']);
315
+ return this.contract.contractsByType(key);
316
+ }
317
+
318
+ // ========================================================================
319
+ // MANAGED OPERATIONS (Appreciation-Based)
320
+ // ========================================================================
321
+
322
+ /**
323
+ * Set appreciation values for members (Managed only)
324
+ * Appreciation determines reward distribution proportionally
325
+ * @param {string[]} userIds - Array of user identifiers
326
+ * @param {number[]} amounts - Array of appreciation amounts (integers)
327
+ * @returns {Promise<{txHash, receipt}>}
328
+ * @example
329
+ * // Alice gets 60%, Bob gets 40%
330
+ * await ops.setAppreciation(['alice', 'bob'], [300, 200]);
331
+ */
332
+ async setAppreciation(userIds, amounts) {
333
+ this._requireType(['Managed']);
334
+ if (userIds.length !== amounts.length) {
335
+ throw new Error('userIds and amounts arrays must have same length');
336
+ }
337
+ const tx = await this.contract.setAppreciation(userIds, amounts);
338
+ const receipt = await tx.wait();
339
+ return { txHash: receipt.hash, receipt };
340
+ }
341
+
342
+ /**
343
+ * Get appreciation value for a user (Managed only)
344
+ * @param {string} userId - User identifier
345
+ * @returns {Promise<number>}
346
+ */
347
+ async getAppreciation(userId) {
348
+ this._requireType(['Managed']);
349
+ const appreciation = await this.contract.appreciation(userId);
350
+ return Number(appreciation);
351
+ }
352
+
353
+ /**
354
+ * Get total appreciation across all members (Managed only)
355
+ * @returns {Promise<number>}
356
+ */
357
+ async getTotalAppreciation() {
358
+ this._requireType(['Managed']);
359
+ const total = await this.contract.totalappreciation();
360
+ return Number(total);
361
+ }
362
+
363
+ // ========================================================================
364
+ // ZONED OPERATIONS (Tier-Based)
365
+ // ========================================================================
366
+
367
+ /**
368
+ * Add a user to a zone (Zoned only)
369
+ * Higher zones receive more rewards based on quadratic formula
370
+ * @param {string} senderUserId - Sender's user ID (for authorization)
371
+ * @param {string} userId - User to add to zone
372
+ * @param {number} zone - Zone number (0 = unassigned, 1-N = contribution tiers)
373
+ * @returns {Promise<{txHash, receipt}>}
374
+ */
375
+ async addToZone(senderUserId, userId, zone) {
376
+ this._requireType(['Zoned']);
377
+ const tx = await this.contract.addToZone(senderUserId, userId, zone);
378
+ const receipt = await tx.wait();
379
+ return { txHash: receipt.hash, receipt };
380
+ }
381
+
382
+ /**
383
+ * Remove a user from their zone (Zoned only)
384
+ * @param {string} senderUserId - Sender's user ID
385
+ * @param {string} userId - User to remove
386
+ * @returns {Promise<{txHash, receipt}>}
387
+ */
388
+ async removeFromZone(senderUserId, userId) {
389
+ this._requireType(['Zoned']);
390
+ const tx = await this.contract.removeFromZone(senderUserId, userId);
391
+ const receipt = await tx.wait();
392
+ return { txHash: receipt.hash, receipt };
393
+ }
394
+
395
+ /**
396
+ * Get a user's zone (Zoned only)
397
+ * @param {string} userId - User identifier
398
+ * @returns {Promise<number>}
399
+ */
400
+ async getZone(userId) {
401
+ this._requireType(['Zoned']);
402
+ const zone = await this.contract.zones(userId);
403
+ return Number(zone);
404
+ }
405
+
406
+ /**
407
+ * Get number of zones (Zoned only)
408
+ * @returns {Promise<number>}
409
+ */
410
+ async getNumZones() {
411
+ this._requireType(['Zoned']);
412
+ const nzones = await this.contract.nzones();
413
+ return Number(nzones);
414
+ }
415
+
416
+ /**
417
+ * Set the reward function parameters (Zoned only)
418
+ * Formula: reward_units = a*zone² + b*zone + c
419
+ * @param {string} senderUserId - Sender's user ID
420
+ * @param {number} a - Quadratic coefficient
421
+ * @param {number} b - Linear coefficient
422
+ * @param {number} c - Constant
423
+ * @returns {Promise<{txHash, receipt}>}
424
+ */
425
+ async setZoneParameters(senderUserId, a, b, c) {
426
+ this._requireType(['Zoned']);
427
+ const tx = await this.contract.setRewardFunction(senderUserId, a, b, c);
428
+ const receipt = await tx.wait();
429
+ return { txHash: receipt.hash, receipt };
430
+ }
431
+
432
+ // ========================================================================
433
+ // APPRECIATIVE OPERATIONS (Peer-to-Peer)
434
+ // ========================================================================
435
+
436
+ /**
437
+ * Give appreciation from one user to another (Appreciative only)
438
+ * Each member has a limited appreciation pool to distribute
439
+ * @param {string} fromUserId - Giver's user ID
440
+ * @param {string} toUserId - Receiver's user ID
441
+ * @param {number} amount - Amount of appreciation to give
442
+ * @returns {Promise<{txHash, receipt}>}
443
+ */
444
+ async appreciate(fromUserId, toUserId, amount) {
445
+ this._requireType(['Appreciative']);
446
+ const tx = await this.contract.appreciate(fromUserId, toUserId, amount);
447
+ const receipt = await tx.wait();
448
+ return { txHash: receipt.hash, receipt };
449
+ }
450
+
451
+ /**
452
+ * Get appreciation given by a user (Appreciative only)
453
+ * @param {string} userId - User identifier
454
+ * @returns {Promise<number>}
455
+ */
456
+ async getAppreciationGiven(userId) {
457
+ this._requireType(['Appreciative']);
458
+ const given = await this.contract.appreciationGiven(userId);
459
+ return Number(given);
460
+ }
461
+
462
+ /**
463
+ * Get appreciation received by a user (Appreciative only)
464
+ * @param {string} userId - User identifier
465
+ * @returns {Promise<number>}
466
+ */
467
+ async getAppreciationReceived(userId) {
468
+ this._requireType(['Appreciative']);
469
+ const received = await this.contract.appreciationReceived(userId);
470
+ return Number(received);
471
+ }
472
+
473
+ /**
474
+ * Get remaining appreciation pool for a user (Appreciative only)
475
+ * @param {string} userId - User identifier
476
+ * @returns {Promise<number>}
477
+ */
478
+ async getAppreciationRemaining(userId) {
479
+ this._requireType(['Appreciative']);
480
+ const remaining = await this.contract.appreciationRemaining(userId);
481
+ return Number(remaining);
482
+ }
483
+
484
+ // ========================================================================
485
+ // BUNDLE OPERATIONS (2-Way Split)
486
+ // ========================================================================
487
+
488
+ /**
489
+ * Set steepness for zone decay (Bundle only)
490
+ * Higher steepness = faster decay = more concentration in higher zones
491
+ * @param {string|bigint} steepness - Steepness value (0 < s < 1e18, e.g., 0.5e18 for 50% decay)
492
+ * @returns {Promise<{txHash, receipt}>}
493
+ */
494
+ async setSteepness(steepness) {
495
+ this._requireType(['Bundle']);
496
+ const ethers = await this._loadEthers();
497
+ const steepnessValue = typeof steepness === 'string' ? ethers.parseEther(steepness) : steepness;
498
+ const tx = await this.contract.setSteepness(steepnessValue);
499
+ const receipt = await tx.wait();
500
+ return { txHash: receipt.hash, receipt };
501
+ }
502
+
503
+ /**
504
+ * Get current steepness (Bundle only)
505
+ * @returns {Promise<string>} Steepness as decimal string (e.g., '0.5')
506
+ */
507
+ async getSteepness() {
508
+ this._requireType(['Bundle']);
509
+ const ethers = await this._loadEthers();
510
+ const steepness = await this.contract.steepness();
511
+ return ethers.formatEther(steepness);
512
+ }
513
+
514
+ /**
515
+ * Set interior split percentages (Bundle only)
516
+ * @param {string[]} userIds - User identifiers
517
+ * @param {number[]} percentages - Percentages (must sum to 100)
518
+ * @returns {Promise<{txHash, receipt}>}
519
+ */
520
+ async setInteriorSplit(userIds, percentages) {
521
+ this._requireType(['Bundle']);
522
+ const total = percentages.reduce((a, b) => a + b, 0);
523
+ if (total !== 100) {
524
+ throw new Error('Percentages must sum to 100');
525
+ }
526
+ const tx = await this.contract.setInteriorSplit(userIds, percentages);
527
+ const receipt = await tx.wait();
528
+ return { txHash: receipt.hash, receipt };
529
+ }
530
+
531
+ // ========================================================================
532
+ // GOVERNANCE (Bundle)
533
+ // ========================================================================
534
+
535
+ /**
536
+ * Start an election for new owner (Bundle only)
537
+ * @returns {Promise<{txHash, receipt}>}
538
+ */
539
+ async startElection() {
540
+ this._requireType(['Bundle']);
541
+ const tx = await this.contract.startElection();
542
+ const receipt = await tx.wait();
543
+ return { txHash: receipt.hash, receipt };
544
+ }
545
+
546
+ /**
547
+ * Nominate yourself as candidate (Bundle only)
548
+ * @returns {Promise<{txHash, receipt}>}
549
+ */
550
+ async nominateSelf() {
551
+ this._requireType(['Bundle']);
552
+ const tx = await this.contract.nominateSelf();
553
+ const receipt = await tx.wait();
554
+ return { txHash: receipt.hash, receipt };
555
+ }
556
+
557
+ /**
558
+ * Vote for a nominee (Bundle only)
559
+ * @param {string} nomineeAddress - Address of the nominee
560
+ * @returns {Promise<{txHash, receipt}>}
561
+ */
562
+ async vote(nomineeAddress) {
563
+ this._requireType(['Bundle']);
564
+ const tx = await this.contract.vote(nomineeAddress);
565
+ const receipt = await tx.wait();
566
+ return { txHash: receipt.hash, receipt };
567
+ }
568
+
569
+ /**
570
+ * Finalize election and transfer ownership to winner (Bundle only)
571
+ * @returns {Promise<{txHash, receipt}>}
572
+ */
573
+ async finalizeElection() {
574
+ this._requireType(['Bundle']);
575
+ const tx = await this.contract.finalizeElection();
576
+ const receipt = await tx.wait();
577
+ return { txHash: receipt.hash, receipt };
578
+ }
579
+
580
+ // ========================================================================
581
+ // READ-ONLY QUERIES
582
+ // ========================================================================
583
+
584
+ /**
585
+ * Get contract name
586
+ * @returns {Promise<string>}
587
+ */
588
+ async getName() {
589
+ return this.contract.name();
590
+ }
591
+
592
+ /**
593
+ * Get contract owner address
594
+ * @returns {Promise<string>}
595
+ */
596
+ async getOwner() {
597
+ return this.contract.owner();
598
+ }
599
+
600
+ /**
601
+ * Get bot address (for Managed/Zoned)
602
+ * @returns {Promise<string>}
603
+ */
604
+ async getBotAddress() {
605
+ try {
606
+ return await this.contract.botAddress();
607
+ } catch {
608
+ return null;
609
+ }
610
+ }
611
+
612
+ /**
613
+ * Get creator user ID
614
+ * @returns {Promise<string>}
615
+ */
616
+ async getCreatorUserId() {
617
+ try {
618
+ return await this.contract.creatorUserId();
619
+ } catch {
620
+ return null;
621
+ }
622
+ }
623
+
624
+ /**
625
+ * Get contract address
626
+ * @returns {Promise<string>}
627
+ */
628
+ async getAddress() {
629
+ return this.contract.getAddress();
630
+ }
631
+
632
+ /**
633
+ * Get contract type
634
+ * @returns {string}
635
+ */
636
+ getType() {
637
+ return this.type;
638
+ }
639
+
640
+ // ========================================================================
641
+ // UTILITIES
642
+ // ========================================================================
643
+
644
+ /**
645
+ * Require specific contract type(s).
646
+ * @private
647
+ * @param {string[]} allowedTypes - Array of allowed contract types
648
+ * @throws {Error} If contract type doesn't match
649
+ */
650
+ _requireType(allowedTypes) {
651
+ if (!allowedTypes.includes(this.type)) {
652
+ throw new Error(`Operation only available for ${allowedTypes.join('/')} contracts. This is a ${this.type} contract.`);
653
+ }
654
+ }
655
+
656
+ /**
657
+ * Get raw contract instance for advanced usage.
658
+ * @returns {Object} Ethers.js Contract instance
659
+ */
660
+ getRawContract() {
661
+ return this.contract;
662
+ }
663
+
664
+ /**
665
+ * Execute a raw contract call.
666
+ * @param {string} method - Method name
667
+ * @param {...*} args - Method arguments
668
+ * @returns {Promise<*>} Method return value
669
+ */
670
+ async call(method, ...args) {
671
+ return this.contract[method](...args);
672
+ }
673
+
674
+ /**
675
+ * Execute a raw contract transaction.
676
+ * @param {string} method - Method name
677
+ * @param {...*} args - Method arguments
678
+ * @returns {Promise<{txHash: string, receipt: Object}>} Transaction details
679
+ */
680
+ async send(method, ...args) {
681
+ const tx = await this.contract[method](...args);
682
+ const receipt = await tx.wait();
683
+ return { txHash: receipt.hash, receipt };
684
+ }
685
+ }
686
+
687
+ export default ContractOperations;