holosphere 2.0.0-alpha0 → 2.0.0-alpha10

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 (418) hide show
  1. package/CHANGELOG.md +473 -0
  2. package/FEATURES.md +431 -0
  3. package/LICENSE +29 -42
  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/cdn/holosphere.min.js +55 -0
  19. package/dist/cdn/holosphere.min.js.map +1 -0
  20. package/dist/cjs/holosphere.cjs +2 -0
  21. package/dist/cjs/holosphere.cjs.map +1 -0
  22. package/dist/esm/holosphere.js +53 -0
  23. package/dist/esm/holosphere.js.map +1 -0
  24. package/dist/index-DDGt_V9o.cjs +12 -0
  25. package/dist/index-DDGt_V9o.cjs.map +1 -0
  26. package/dist/index-DJXftyvB.js +39841 -0
  27. package/dist/index-DJXftyvB.js.map +1 -0
  28. package/dist/index-DMbdcMtK.cjs +18 -0
  29. package/dist/index-DMbdcMtK.cjs.map +1 -0
  30. package/dist/index-DeZ1xz_s.js +15104 -0
  31. package/dist/index-DeZ1xz_s.js.map +1 -0
  32. package/dist/indexeddb-storage-BFt6hMeF.js +176 -0
  33. package/dist/indexeddb-storage-BFt6hMeF.js.map +1 -0
  34. package/dist/indexeddb-storage-BK5tv4Sh.cjs +2 -0
  35. package/dist/indexeddb-storage-BK5tv4Sh.cjs.map +1 -0
  36. package/dist/memory-storage-C9HuoL2E.js +91 -0
  37. package/dist/memory-storage-C9HuoL2E.js.map +1 -0
  38. package/dist/memory-storage-Dao7jfYG.cjs +2 -0
  39. package/dist/memory-storage-Dao7jfYG.cjs.map +1 -0
  40. package/dist/secp256k1-BbKzbLtD.cjs +12 -0
  41. package/dist/secp256k1-BbKzbLtD.cjs.map +1 -0
  42. package/dist/secp256k1-CreY7Pcl.js +1890 -0
  43. package/dist/secp256k1-CreY7Pcl.js.map +1 -0
  44. package/docs/CONTRACTS.md +797 -0
  45. package/docs/FOSDEM_PROPOSAL.md +388 -0
  46. package/docs/LOCALFIRST.md +266 -0
  47. package/docs/api/ai_aggregation.js.html +333 -0
  48. package/docs/api/ai_breakdown.js.html +524 -0
  49. package/docs/api/ai_classifier.js.html +231 -0
  50. package/docs/api/ai_council.js.html +246 -0
  51. package/docs/api/ai_embeddings.js.html +304 -0
  52. package/docs/api/ai_federation-ai.js.html +338 -0
  53. package/docs/api/ai_h3-ai.js.html +970 -0
  54. package/docs/api/ai_index.js.html +124 -0
  55. package/docs/api/ai_json-ops.js.html +241 -0
  56. package/docs/api/ai_llm-service.js.html +239 -0
  57. package/docs/api/ai_nl-query.js.html +236 -0
  58. package/docs/api/ai_relationships.js.html +367 -0
  59. package/docs/api/ai_schema-extractor.js.html +235 -0
  60. package/docs/api/ai_spatial.js.html +307 -0
  61. package/docs/api/ai_tts.js.html +214 -0
  62. package/docs/api/content_social-protocols.js.html +180 -0
  63. package/docs/api/core_holosphere.js.html +757 -0
  64. package/docs/api/crypto_nostr-utils.js.html +306 -0
  65. package/docs/api/crypto_secp256k1.js.html +267 -0
  66. package/docs/api/data/search.json +1 -0
  67. package/docs/api/federation_discovery.js.html +337 -0
  68. package/docs/api/federation_handshake.js.html +478 -0
  69. package/docs/api/federation_hologram.js.html +1053 -0
  70. package/docs/api/federation_registry.js.html +389 -0
  71. package/docs/api/fonts/Inconsolata-Regular.ttf +0 -0
  72. package/docs/api/fonts/OpenSans-Regular.ttf +0 -0
  73. package/docs/api/fonts/WorkSans-Bold.ttf +0 -0
  74. package/docs/api/global.html +3 -0
  75. package/docs/api/hierarchical_upcast.js.html +128 -0
  76. package/docs/api/index.html +265 -0
  77. package/docs/api/index.js.html +1868 -0
  78. package/docs/api/lib_ai-methods.js.html +660 -0
  79. package/docs/api/lib_contract-methods.js.html +445 -0
  80. package/docs/api/lib_errors.js.html +56 -0
  81. package/docs/api/lib_federation-methods.js.html +348 -0
  82. package/docs/api/lib_index.js.html +33 -0
  83. package/docs/api/module-ai.html +5 -0
  84. package/docs/api/module-ai_aggregation-SmartAggregation.html +6 -0
  85. package/docs/api/module-ai_aggregation.SmartAggregation.html +3 -0
  86. package/docs/api/module-ai_aggregation.html +3 -0
  87. package/docs/api/module-ai_breakdown-TaskBreakdown.html +5 -0
  88. package/docs/api/module-ai_breakdown.TaskBreakdown.html +3 -0
  89. package/docs/api/module-ai_breakdown.html +3 -0
  90. package/docs/api/module-ai_classifier-Classifier.html +6 -0
  91. package/docs/api/module-ai_classifier.Classifier.html +3 -0
  92. package/docs/api/module-ai_classifier.html +3 -0
  93. package/docs/api/module-ai_council-Council.html +6 -0
  94. package/docs/api/module-ai_council.Council.html +3 -0
  95. package/docs/api/module-ai_council.html +3 -0
  96. package/docs/api/module-ai_embeddings-Embeddings.html +5 -0
  97. package/docs/api/module-ai_embeddings.Embeddings.html +3 -0
  98. package/docs/api/module-ai_embeddings.html +3 -0
  99. package/docs/api/module-ai_federation-ai-FederationAdvisor.html +6 -0
  100. package/docs/api/module-ai_federation-ai.FederationAdvisor.html +3 -0
  101. package/docs/api/module-ai_federation-ai.html +3 -0
  102. package/docs/api/module-ai_h3-ai-H3AI.html +6 -0
  103. package/docs/api/module-ai_h3-ai.H3AI.html +3 -0
  104. package/docs/api/module-ai_h3-ai.html +3 -0
  105. package/docs/api/module-ai_json-ops-JSONOps.html +5 -0
  106. package/docs/api/module-ai_json-ops.JSONOps.html +3 -0
  107. package/docs/api/module-ai_json-ops.html +3 -0
  108. package/docs/api/module-ai_llm-service-LLMService.html +5 -0
  109. package/docs/api/module-ai_llm-service.LLMService.html +3 -0
  110. package/docs/api/module-ai_llm-service.html +3 -0
  111. package/docs/api/module-ai_nl-query-NLQuery.html +5 -0
  112. package/docs/api/module-ai_nl-query.NLQuery.html +3 -0
  113. package/docs/api/module-ai_nl-query.html +3 -0
  114. package/docs/api/module-ai_relationships-RelationshipDiscovery.html +6 -0
  115. package/docs/api/module-ai_relationships.RelationshipDiscovery.html +3 -0
  116. package/docs/api/module-ai_relationships.html +3 -0
  117. package/docs/api/module-ai_schema-extractor-SchemaExtractor.html +5 -0
  118. package/docs/api/module-ai_schema-extractor.SchemaExtractor.html +3 -0
  119. package/docs/api/module-ai_schema-extractor.html +3 -0
  120. package/docs/api/module-ai_spatial-SpatialAnalysis.html +6 -0
  121. package/docs/api/module-ai_spatial.SpatialAnalysis.html +3 -0
  122. package/docs/api/module-ai_spatial.html +3 -0
  123. package/docs/api/module-ai_tts-TTS.html +5 -0
  124. package/docs/api/module-ai_tts.TTS.html +3 -0
  125. package/docs/api/module-ai_tts.html +3 -0
  126. package/docs/api/module-content_social-protocols.html +3 -0
  127. package/docs/api/module-core_holosphere-HoloSphere.html +6 -0
  128. package/docs/api/module-core_holosphere.HoloSphere.html +3 -0
  129. package/docs/api/module-core_holosphere.html +3 -0
  130. package/docs/api/module-crypto_nostr-utils.html +3 -0
  131. package/docs/api/module-crypto_secp256k1.html +3 -0
  132. package/docs/api/module-federation_hologram.html +3 -0
  133. package/docs/api/module-hierarchical_upcast.html +3 -0
  134. package/docs/api/module-holosphere-HoloSphereBase.html +3 -0
  135. package/docs/api/module-holosphere.html +3 -0
  136. package/docs/api/module-lib_ai-methods.html +3 -0
  137. package/docs/api/module-lib_contract-methods.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.AuthorizationError.html +3 -0
  141. package/docs/api/module-lib_errors.ValidationError.html +3 -0
  142. package/docs/api/module-lib_errors.html +3 -0
  143. package/docs/api/module-lib_federation-methods.html +3 -0
  144. package/docs/api/module-lib_index.html +3 -0
  145. package/docs/api/module-schema_validator-ValidationError.html +3 -0
  146. package/docs/api/module-schema_validator.ValidationError.html +3 -0
  147. package/docs/api/module-schema_validator.html +3 -0
  148. package/docs/api/module-spatial_h3-operations.html +4 -0
  149. package/docs/api/module-storage_backend-factory.BackendFactory.html +3 -0
  150. package/docs/api/module-storage_backend-factory.html +3 -0
  151. package/docs/api/module-storage_backend-interface-StorageBackend.html +3 -0
  152. package/docs/api/module-storage_backend-interface.StorageBackend.html +3 -0
  153. package/docs/api/module-storage_backend-interface.html +3 -0
  154. package/docs/api/module-storage_backends_activitypub-backend-ActivityPubBackend.html +7 -0
  155. package/docs/api/module-storage_backends_activitypub-backend.ActivityPubBackend.html +3 -0
  156. package/docs/api/module-storage_backends_activitypub-backend.html +3 -0
  157. package/docs/api/module-storage_backends_activitypub_server-ActivityPubServer.html +8 -0
  158. package/docs/api/module-storage_backends_activitypub_server.ActivityPubServer.html +3 -0
  159. package/docs/api/module-storage_backends_activitypub_server.html +3 -0
  160. package/docs/api/module-storage_backends_gundb-backend-GunDBBackend.html +7 -0
  161. package/docs/api/module-storage_backends_gundb-backend.GunDBBackend.html +3 -0
  162. package/docs/api/module-storage_backends_gundb-backend.html +3 -0
  163. package/docs/api/module-storage_backends_nostr-backend-NostrBackend.html +8 -0
  164. package/docs/api/module-storage_backends_nostr-backend.NostrBackend.html +3 -0
  165. package/docs/api/module-storage_backends_nostr-backend.html +3 -0
  166. package/docs/api/module-storage_filesystem-storage-FileSystemStorage.html +5 -0
  167. package/docs/api/module-storage_filesystem-storage-browser-FileSystemStorage.html +3 -0
  168. package/docs/api/module-storage_filesystem-storage-browser.FileSystemStorage.html +3 -0
  169. package/docs/api/module-storage_filesystem-storage-browser.html +3 -0
  170. package/docs/api/module-storage_filesystem-storage.FileSystemStorage.html +3 -0
  171. package/docs/api/module-storage_filesystem-storage.html +3 -0
  172. package/docs/api/module-storage_global-tables.html +3 -0
  173. package/docs/api/module-storage_gun-async.html +3 -0
  174. package/docs/api/module-storage_gun-auth-GunAuth.html +5 -0
  175. package/docs/api/module-storage_gun-auth.GunAuth.html +3 -0
  176. package/docs/api/module-storage_gun-auth.html +3 -0
  177. package/docs/api/module-storage_gun-federation.html +3 -0
  178. package/docs/api/module-storage_gun-references-GunReferenceHandler.html +5 -0
  179. package/docs/api/module-storage_gun-references.GunReferenceHandler.html +3 -0
  180. package/docs/api/module-storage_gun-references.html +3 -0
  181. package/docs/api/module-storage_gun-schema-GunSchemaValidator.html +5 -0
  182. package/docs/api/module-storage_gun-schema.GunSchemaValidator.html +3 -0
  183. package/docs/api/module-storage_gun-schema.html +3 -0
  184. package/docs/api/module-storage_gun-wrapper.html +11 -0
  185. package/docs/api/module-storage_indexeddb-storage-IndexedDBStorage.html +5 -0
  186. package/docs/api/module-storage_indexeddb-storage.IndexedDBStorage.html +3 -0
  187. package/docs/api/module-storage_indexeddb-storage.html +3 -0
  188. package/docs/api/module-storage_key-storage-simple.html +3 -0
  189. package/docs/api/module-storage_key-storage.html +4 -0
  190. package/docs/api/module-storage_memory-storage-MemoryStorage.html +5 -0
  191. package/docs/api/module-storage_memory-storage.MemoryStorage.html +3 -0
  192. package/docs/api/module-storage_memory-storage.html +3 -0
  193. package/docs/api/module-storage_migration-MigrationTool.html +6 -0
  194. package/docs/api/module-storage_migration.MigrationTool.html +3 -0
  195. package/docs/api/module-storage_migration.html +3 -0
  196. package/docs/api/module-storage_nostr-async.html +18 -0
  197. package/docs/api/module-storage_nostr-client-LRUCache.html +3 -0
  198. package/docs/api/module-storage_nostr-client-NostrClient.html +7 -0
  199. package/docs/api/module-storage_nostr-client.NostrClient.html +15 -0
  200. package/docs/api/module-storage_nostr-client.html +6 -0
  201. package/docs/api/module-storage_nostr-wrapper.html +3 -0
  202. package/docs/api/module-storage_outbox-queue-OutboxQueue.html +4 -0
  203. package/docs/api/module-storage_outbox-queue.OutboxQueue.html +3 -0
  204. package/docs/api/module-storage_outbox-queue.html +3 -0
  205. package/docs/api/module-storage_persistent-storage-PersistentStorage.html +3 -0
  206. package/docs/api/module-storage_persistent-storage.html +4 -0
  207. package/docs/api/module-storage_sync-service-SyncService.html +5 -0
  208. package/docs/api/module-storage_sync-service.SyncService.html +3 -0
  209. package/docs/api/module-storage_sync-service.html +3 -0
  210. package/docs/api/module-storage_unified-storage.html +3 -0
  211. package/docs/api/module-subscriptions_manager.SubscriptionRegistry.html +3 -0
  212. package/docs/api/module-subscriptions_manager.html +3 -0
  213. package/docs/api/schema_validator.js.html +113 -0
  214. package/docs/api/scripts/core.js +726 -0
  215. package/docs/api/scripts/core.min.js +23 -0
  216. package/docs/api/scripts/resize.js +90 -0
  217. package/docs/api/scripts/search.js +265 -0
  218. package/docs/api/scripts/search.min.js +6 -0
  219. package/docs/api/scripts/third-party/Apache-License-2.0.txt +202 -0
  220. package/docs/api/scripts/third-party/fuse.js +9 -0
  221. package/docs/api/scripts/third-party/hljs-line-num-original.js +369 -0
  222. package/docs/api/scripts/third-party/hljs-line-num.js +1 -0
  223. package/docs/api/scripts/third-party/hljs-original.js +5171 -0
  224. package/docs/api/scripts/third-party/hljs.js +1 -0
  225. package/docs/api/scripts/third-party/popper.js +5 -0
  226. package/docs/api/scripts/third-party/tippy.js +1 -0
  227. package/docs/api/scripts/third-party/tocbot.js +672 -0
  228. package/docs/api/scripts/third-party/tocbot.min.js +1 -0
  229. package/docs/api/spatial_h3-operations.js.html +129 -0
  230. package/docs/api/storage_backend-factory.js.html +133 -0
  231. package/docs/api/storage_backend-interface.js.html +164 -0
  232. package/docs/api/storage_backends_activitypub-backend.js.html +298 -0
  233. package/docs/api/storage_backends_activitypub_server.js.html +678 -0
  234. package/docs/api/storage_backends_gundb-backend.js.html +878 -0
  235. package/docs/api/storage_backends_nostr-backend.js.html +254 -0
  236. package/docs/api/storage_filesystem-storage-browser.js.html +83 -0
  237. package/docs/api/storage_filesystem-storage.js.html +207 -0
  238. package/docs/api/storage_global-tables.js.html +116 -0
  239. package/docs/api/storage_gun-async.js.html +344 -0
  240. package/docs/api/storage_gun-auth.js.html +376 -0
  241. package/docs/api/storage_gun-federation.js.html +788 -0
  242. package/docs/api/storage_gun-references.js.html +212 -0
  243. package/docs/api/storage_gun-schema.js.html +309 -0
  244. package/docs/api/storage_gun-wrapper.js.html +645 -0
  245. package/docs/api/storage_indexeddb-storage.js.html +224 -0
  246. package/docs/api/storage_key-storage-simple.js.html +102 -0
  247. package/docs/api/storage_key-storage.js.html +171 -0
  248. package/docs/api/storage_memory-storage.js.html +128 -0
  249. package/docs/api/storage_migration.js.html +354 -0
  250. package/docs/api/storage_nostr-async.js.html +1076 -0
  251. package/docs/api/storage_nostr-client.js.html +1598 -0
  252. package/docs/api/storage_nostr-wrapper.js.html +218 -0
  253. package/docs/api/storage_outbox-queue.js.html +248 -0
  254. package/docs/api/storage_persistent-storage.js.html +160 -0
  255. package/docs/api/storage_sync-service.js.html +201 -0
  256. package/docs/api/storage_unified-storage.js.html +157 -0
  257. package/docs/api/styles/clean-jsdoc-theme-base.css +1159 -0
  258. package/docs/api/styles/clean-jsdoc-theme-dark.css +412 -0
  259. package/docs/api/styles/clean-jsdoc-theme-light.css +482 -0
  260. package/docs/api/styles/clean-jsdoc-theme-scrollbar.css +30 -0
  261. package/docs/api/styles/clean-jsdoc-theme-without-scrollbar.min.css +1 -0
  262. package/docs/api/styles/clean-jsdoc-theme.min.css +1 -0
  263. package/docs/api/subscriptions_manager.js.html +162 -0
  264. package/docs/contracts/api-interface.md +793 -0
  265. package/docs/data-model.md +476 -0
  266. package/docs/gun-async-usage.md +338 -0
  267. package/docs/plan.md +349 -0
  268. package/docs/quickstart.md +674 -0
  269. package/docs/research.md +362 -0
  270. package/docs/spec.md +244 -0
  271. package/docs/storage-backends.md +326 -0
  272. package/docs/tasks.md +947 -0
  273. package/examples/demo.html +47 -0
  274. package/examples/holosphere-widget.js +1242 -0
  275. package/examples/widget-demo.html +274 -0
  276. package/examples/widget.html +703 -0
  277. package/jsdoc.json +26 -0
  278. package/package.json +25 -7
  279. package/src/ai/aggregation.js +13 -2
  280. package/src/ai/breakdown.js +12 -2
  281. package/src/ai/classifier.js +14 -3
  282. package/src/ai/council.js +22 -7
  283. package/src/ai/embeddings.js +37 -15
  284. package/src/ai/federation-ai.js +13 -2
  285. package/src/ai/h3-ai.js +14 -2
  286. package/src/ai/index.js +16 -7
  287. package/src/ai/json-ops.js +18 -5
  288. package/src/ai/llm-service.js +62 -31
  289. package/src/ai/nl-query.js +12 -2
  290. package/src/ai/relationships.js +13 -2
  291. package/src/ai/schema-extractor.js +24 -10
  292. package/src/ai/spatial.js +13 -2
  293. package/src/ai/tts.js +25 -8
  294. package/src/cdn-entry.js +22 -0
  295. package/src/content/social-protocols.js +34 -25
  296. package/src/contracts/abis/Appreciative.json +1280 -0
  297. package/src/contracts/abis/AppreciativeFactory.json +101 -0
  298. package/src/contracts/abis/Bundle.json +1438 -0
  299. package/src/contracts/abis/BundleFactory.json +106 -0
  300. package/src/contracts/abis/Holon.json +881 -0
  301. package/src/contracts/abis/Holons.json +330 -0
  302. package/src/contracts/abis/Managed.json +1262 -0
  303. package/src/contracts/abis/ManagedFactory.json +149 -0
  304. package/src/contracts/abis/Membrane.json +261 -0
  305. package/src/contracts/abis/Splitter.json +1624 -0
  306. package/src/contracts/abis/SplitterFactory.json +220 -0
  307. package/src/contracts/abis/TestToken.json +321 -0
  308. package/src/contracts/abis/Zoned.json +1461 -0
  309. package/src/contracts/abis/ZonedFactory.json +154 -0
  310. package/src/contracts/chain-manager.js +403 -0
  311. package/src/contracts/deployer.js +500 -0
  312. package/src/contracts/event-listener.js +539 -0
  313. package/src/contracts/holon-contracts.js +359 -0
  314. package/src/contracts/index.js +82 -0
  315. package/src/contracts/networks.js +229 -0
  316. package/src/contracts/operations.js +687 -0
  317. package/src/contracts/queries.js +638 -0
  318. package/src/core/holosphere.js +487 -6
  319. package/src/crypto/nostr-utils.js +303 -0
  320. package/src/crypto/secp256k1.js +7 -2
  321. package/src/federation/handshake.js +475 -0
  322. package/src/federation/hologram.js +117 -3
  323. package/src/hierarchical/upcast.js +40 -25
  324. package/src/index.js +1501 -1909
  325. package/src/lib/ai-methods.js +657 -0
  326. package/src/lib/contract-methods.js +442 -0
  327. package/src/lib/errors.js +53 -0
  328. package/src/lib/federation-methods.js +345 -0
  329. package/src/lib/index.js +30 -0
  330. package/src/schema/validator.js +22 -3
  331. package/src/spatial/h3-operations.js +19 -3
  332. package/src/storage/backend-factory.js +7 -2
  333. package/src/storage/backend-interface.js +21 -2
  334. package/src/storage/backends/activitypub/server.js +25 -3
  335. package/src/storage/backends/activitypub-backend.js +25 -2
  336. package/src/storage/backends/gundb-backend.js +692 -50
  337. package/src/storage/backends/nostr-backend.js +116 -1
  338. package/src/storage/filesystem-storage-browser.js +42 -2
  339. package/src/storage/filesystem-storage.js +72 -5
  340. package/src/storage/global-tables.js +35 -3
  341. package/src/storage/gun-async.js +75 -15
  342. package/src/storage/gun-auth.js +373 -0
  343. package/src/storage/gun-federation.js +785 -0
  344. package/src/storage/gun-references.js +209 -0
  345. package/src/storage/gun-schema.js +306 -0
  346. package/src/storage/gun-wrapper.js +475 -54
  347. package/src/storage/indexeddb-storage.js +112 -13
  348. package/src/storage/key-storage-simple.js +32 -9
  349. package/src/storage/key-storage.js +45 -13
  350. package/src/storage/memory-storage.js +68 -2
  351. package/src/storage/migration.js +20 -7
  352. package/src/storage/nostr-async.js +412 -122
  353. package/src/storage/nostr-client.js +749 -76
  354. package/src/storage/nostr-wrapper.js +6 -2
  355. package/src/storage/outbox-queue.js +55 -18
  356. package/src/storage/persistent-storage.js +62 -14
  357. package/src/storage/sync-service.js +51 -17
  358. package/src/storage/unified-storage.js +154 -0
  359. package/src/subscriptions/manager.js +34 -17
  360. package/types/index.d.ts +133 -0
  361. package/vite.config.cdn.js +60 -0
  362. package/tests/unit/ai/aggregation.test.js +0 -295
  363. package/tests/unit/ai/breakdown.test.js +0 -446
  364. package/tests/unit/ai/classifier.test.js +0 -294
  365. package/tests/unit/ai/council.test.js +0 -262
  366. package/tests/unit/ai/embeddings.test.js +0 -384
  367. package/tests/unit/ai/federation-ai.test.js +0 -344
  368. package/tests/unit/ai/h3-ai.test.js +0 -458
  369. package/tests/unit/ai/index.test.js +0 -304
  370. package/tests/unit/ai/json-ops.test.js +0 -307
  371. package/tests/unit/ai/llm-service.test.js +0 -390
  372. package/tests/unit/ai/nl-query.test.js +0 -383
  373. package/tests/unit/ai/relationships.test.js +0 -311
  374. package/tests/unit/ai/schema-extractor.test.js +0 -384
  375. package/tests/unit/ai/spatial.test.js +0 -279
  376. package/tests/unit/ai/tts.test.js +0 -279
  377. package/tests/unit/content.test.js +0 -332
  378. package/tests/unit/contract/core.test.js +0 -88
  379. package/tests/unit/contract/crypto.test.js +0 -198
  380. package/tests/unit/contract/data.test.js +0 -223
  381. package/tests/unit/contract/federation.test.js +0 -181
  382. package/tests/unit/contract/hierarchical.test.js +0 -113
  383. package/tests/unit/contract/schema.test.js +0 -114
  384. package/tests/unit/contract/social.test.js +0 -217
  385. package/tests/unit/contract/spatial.test.js +0 -110
  386. package/tests/unit/contract/subscriptions.test.js +0 -128
  387. package/tests/unit/contract/utils.test.js +0 -159
  388. package/tests/unit/core.test.js +0 -152
  389. package/tests/unit/crypto.test.js +0 -328
  390. package/tests/unit/federation.test.js +0 -234
  391. package/tests/unit/gun-async.test.js +0 -252
  392. package/tests/unit/hierarchical.test.js +0 -399
  393. package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
  394. package/tests/unit/integration/scenario-02-federation.test.js +0 -76
  395. package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
  396. package/tests/unit/integration/scenario-04-validation.test.js +0 -129
  397. package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
  398. package/tests/unit/integration/scenario-06-social.test.js +0 -135
  399. package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
  400. package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
  401. package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
  402. package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
  403. package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
  404. package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
  405. package/tests/unit/performance/benchmark.test.js +0 -85
  406. package/tests/unit/schema.test.js +0 -213
  407. package/tests/unit/spatial.test.js +0 -158
  408. package/tests/unit/storage.test.js +0 -195
  409. package/tests/unit/subscriptions.test.js +0 -328
  410. package/tests/unit/test-data-permanence-debug.js +0 -197
  411. package/tests/unit/test-data-permanence.js +0 -340
  412. package/tests/unit/test-key-persistence-fixed.js +0 -148
  413. package/tests/unit/test-key-persistence.js +0 -172
  414. package/tests/unit/test-relay-permanence.js +0 -376
  415. package/tests/unit/test-second-node.js +0 -95
  416. package/tests/unit/test-simple-write.js +0 -89
  417. /package/{cleanup-test-data.js → scripts/cleanup-test-data.js} +0 -0
  418. /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;