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,359 @@
1
+ /**
2
+ * @fileoverview Per-holon contract management for Holosphere.
3
+ * Links holons to their smart contracts for fractal fund distribution.
4
+ * @module contracts/holon-contracts
5
+ */
6
+
7
+ import { ContractDeployer, ABIs } from './deployer.js';
8
+ import { ContractOperations } from './operations.js';
9
+
10
+ /**
11
+ * Manages the mapping between holons and their deployed contracts.
12
+ * Provides deployment, linking, and retrieval operations.
13
+ * @class
14
+ */
15
+ export class HolonContracts {
16
+ /**
17
+ * Create a new HolonContracts instance.
18
+ * @param {ChainManager} chainManager - Chain manager instance
19
+ * @param {ContractDeployer} [deployer] - Contract deployer instance (auto-created if not provided)
20
+ */
21
+ constructor(chainManager, deployer) {
22
+ this.chainManager = chainManager;
23
+ this.deployer = deployer || new ContractDeployer(chainManager);
24
+
25
+ // Maps holonId -> { address, type, contract, operations }
26
+ this.holonContracts = new Map();
27
+
28
+ // Storage for persistence (can be overridden)
29
+ this.storage = null;
30
+ }
31
+
32
+ /**
33
+ * Set storage adapter for persisting holon-contract mappings.
34
+ * @param {Object} storage - Storage adapter with get/set/delete methods
35
+ */
36
+ setStorage(storage) {
37
+ this.storage = storage;
38
+ }
39
+
40
+ /**
41
+ * Deploy a new contract for a holon.
42
+ * @param {string} holonId - Holon identifier
43
+ * @param {string} [type='Splitter'] - Contract type (Splitter, Managed, Zoned, Appreciative, Bundle)
44
+ * @param {Object} [options={}] - Deployment options (varies by contract type)
45
+ * @returns {Promise<{contract: Object, address: string, operations: ContractOperations, txHash: string, type: string}>} Deployment details
46
+ * @throws {Error} If holon already has a contract
47
+ */
48
+ async deploy(holonId, type = 'Splitter', options = {}) {
49
+ if (this.holonContracts.has(holonId)) {
50
+ throw new Error(`Holon ${holonId} already has a contract. Use unlink() first to remove it.`);
51
+ }
52
+
53
+ const name = options.name || holonId;
54
+ const creatorUserId = options.creatorUserId || holonId;
55
+ let result;
56
+
57
+ switch (type) {
58
+ case 'Splitter':
59
+ result = await this.deployer.deploySplitter(
60
+ holonId,
61
+ name,
62
+ options.splitPercentage || 70,
63
+ { creatorUserId, ...options }
64
+ );
65
+ break;
66
+
67
+ case 'Managed':
68
+ result = await this.deployer.deployManaged(name, options);
69
+ break;
70
+
71
+ case 'Zoned':
72
+ result = await this.deployer.deployZoned(name, options.nZones || 6, options);
73
+ break;
74
+
75
+ case 'Appreciative':
76
+ result = await this.deployer.deployAppreciative(name, creatorUserId, options);
77
+ break;
78
+
79
+ case 'Bundle':
80
+ result = await this.deployer.deployBundle(
81
+ name,
82
+ options.steepness,
83
+ options.nZones || 6,
84
+ { creatorUserId, ...options }
85
+ );
86
+ break;
87
+
88
+ default:
89
+ throw new Error(`Unknown contract type: ${type}`);
90
+ }
91
+
92
+ // Create operations wrapper
93
+ const operations = new ContractOperations(result.contract, type, this.chainManager);
94
+
95
+ // Store mapping
96
+ const holonData = {
97
+ holonId,
98
+ address: result.address,
99
+ type,
100
+ contract: result.contract,
101
+ operations,
102
+ deployedAt: new Date().toISOString(),
103
+ txHash: result.txHash
104
+ };
105
+
106
+ this.holonContracts.set(holonId, holonData);
107
+
108
+ // Persist if storage available
109
+ await this._saveMapping(holonId, holonData);
110
+
111
+ return {
112
+ contract: result.contract,
113
+ address: result.address,
114
+ operations,
115
+ txHash: result.txHash,
116
+ type
117
+ };
118
+ }
119
+
120
+ /**
121
+ * Link a holon to an existing deployed contract.
122
+ * @param {string} holonId - Holon identifier
123
+ * @param {string} contractAddress - Existing contract address
124
+ * @param {string} [type='Splitter'] - Contract type
125
+ * @returns {Promise<{contract: Object, address: string, operations: ContractOperations, type: string}>} Link details
126
+ * @throws {Error} If holon already has a contract or contract is invalid
127
+ */
128
+ async link(holonId, contractAddress, type = 'Splitter') {
129
+ if (this.holonContracts.has(holonId)) {
130
+ throw new Error(`Holon ${holonId} already has a contract. Use unlink() first.`);
131
+ }
132
+
133
+ const abi = ABIs[type];
134
+ if (!abi) {
135
+ throw new Error(`Unknown contract type: ${type}`);
136
+ }
137
+
138
+ // Create contract instance
139
+ const contract = await this.chainManager.getContract(contractAddress, abi.abi);
140
+
141
+ // Verify it's a valid contract by calling a read method
142
+ try {
143
+ await contract.name();
144
+ } catch (error) {
145
+ throw new Error(`Invalid contract at ${contractAddress}: ${error.message}`);
146
+ }
147
+
148
+ // Create operations wrapper
149
+ const operations = new ContractOperations(contract, type, this.chainManager);
150
+
151
+ // Store mapping
152
+ const holonData = {
153
+ holonId,
154
+ address: contractAddress,
155
+ type,
156
+ contract,
157
+ operations,
158
+ linkedAt: new Date().toISOString()
159
+ };
160
+
161
+ this.holonContracts.set(holonId, holonData);
162
+
163
+ // Persist if storage available
164
+ await this._saveMapping(holonId, holonData);
165
+
166
+ return {
167
+ contract,
168
+ address: contractAddress,
169
+ operations,
170
+ type
171
+ };
172
+ }
173
+
174
+ /**
175
+ * Unlink a holon from its contract.
176
+ * @param {string} holonId - Holon identifier
177
+ * @returns {Promise<boolean>} True if unlinked, false if no contract was linked
178
+ */
179
+ async unlink(holonId) {
180
+ if (!this.holonContracts.has(holonId)) {
181
+ return false;
182
+ }
183
+
184
+ this.holonContracts.delete(holonId);
185
+
186
+ // Remove from storage if available
187
+ if (this.storage) {
188
+ await this.storage.delete?.(`holon_contract:${holonId}`);
189
+ }
190
+
191
+ return true;
192
+ }
193
+
194
+ /**
195
+ * Get contract instance for a holon.
196
+ * @param {string} holonId - Holon identifier
197
+ * @returns {Object|null} Ethers.js Contract instance or null if not found
198
+ */
199
+ getContract(holonId) {
200
+ const data = this.holonContracts.get(holonId);
201
+ return data?.contract || null;
202
+ }
203
+
204
+ /**
205
+ * Get contract address for a holon.
206
+ * @param {string} holonId - Holon identifier
207
+ * @returns {string|null} Contract address or null if not found
208
+ */
209
+ getAddress(holonId) {
210
+ const data = this.holonContracts.get(holonId);
211
+ return data?.address || null;
212
+ }
213
+
214
+ /**
215
+ * Get operations wrapper for a holon.
216
+ * @param {string} holonId - Holon identifier
217
+ * @returns {ContractOperations|null} Operations wrapper or null if not found
218
+ */
219
+ getOperations(holonId) {
220
+ const data = this.holonContracts.get(holonId);
221
+ return data?.operations || null;
222
+ }
223
+
224
+ /**
225
+ * Get contract type for a holon.
226
+ * @param {string} holonId - Holon identifier
227
+ * @returns {string|null} Contract type or null if not found
228
+ */
229
+ getType(holonId) {
230
+ const data = this.holonContracts.get(holonId);
231
+ return data?.type || null;
232
+ }
233
+
234
+ /**
235
+ * Check if a holon has a linked contract.
236
+ * @param {string} holonId - Holon identifier
237
+ * @returns {boolean} True if holon has a contract
238
+ */
239
+ hasContract(holonId) {
240
+ return this.holonContracts.has(holonId);
241
+ }
242
+
243
+ /**
244
+ * Get all holon-contract mappings.
245
+ * @returns {Array<{holonId: string, address: string, type: string, deployedAt?: string, linkedAt?: string}>} Array of mappings
246
+ */
247
+ listAll() {
248
+ const result = [];
249
+ for (const [holonId, data] of this.holonContracts) {
250
+ result.push({
251
+ holonId,
252
+ address: data.address,
253
+ type: data.type,
254
+ deployedAt: data.deployedAt,
255
+ linkedAt: data.linkedAt
256
+ });
257
+ }
258
+ return result;
259
+ }
260
+
261
+ /**
262
+ * Get holons by contract type.
263
+ * @param {string} type - Contract type
264
+ * @returns {Array<{holonId: string, address: string}>} Array of holons with matching type
265
+ */
266
+ getByType(type) {
267
+ const result = [];
268
+ for (const [holonId, data] of this.holonContracts) {
269
+ if (data.type === type) {
270
+ result.push({
271
+ holonId,
272
+ address: data.address
273
+ });
274
+ }
275
+ }
276
+ return result;
277
+ }
278
+
279
+ /**
280
+ * Load holon-contract mappings from storage.
281
+ * @returns {Promise<number>} Number of mappings successfully loaded
282
+ */
283
+ async loadFromStorage() {
284
+ if (!this.storage) {
285
+ return 0;
286
+ }
287
+
288
+ const mappings = await this.storage.get?.('holon_contracts_index') || [];
289
+ let loaded = 0;
290
+
291
+ for (const holonId of mappings) {
292
+ try {
293
+ const data = await this.storage.get?.(`holon_contract:${holonId}`);
294
+ if (data && data.address && data.type) {
295
+ // Recreate contract instance
296
+ const abi = ABIs[data.type];
297
+ if (abi) {
298
+ const contract = await this.chainManager.getContract(data.address, abi.abi);
299
+ const operations = new ContractOperations(contract, data.type, this.chainManager);
300
+
301
+ this.holonContracts.set(holonId, {
302
+ ...data,
303
+ contract,
304
+ operations
305
+ });
306
+ loaded++;
307
+ }
308
+ }
309
+ } catch (error) {
310
+ console.warn(`Failed to load contract for holon ${holonId}: ${error.message}`);
311
+ }
312
+ }
313
+
314
+ return loaded;
315
+ }
316
+
317
+ /**
318
+ * Save a holon-contract mapping to storage.
319
+ * @private
320
+ * @param {string} holonId - Holon identifier
321
+ * @param {Object} data - Holon contract data
322
+ */
323
+ async _saveMapping(holonId, data) {
324
+ if (!this.storage) return;
325
+
326
+ // Save the mapping (without contract/operations which can't be serialized)
327
+ await this.storage.set?.(`holon_contract:${holonId}`, {
328
+ holonId: data.holonId,
329
+ address: data.address,
330
+ type: data.type,
331
+ deployedAt: data.deployedAt,
332
+ linkedAt: data.linkedAt,
333
+ txHash: data.txHash
334
+ });
335
+
336
+ // Update index
337
+ const index = await this.storage.get?.('holon_contracts_index') || [];
338
+ if (!index.includes(holonId)) {
339
+ index.push(holonId);
340
+ await this.storage.set?.('holon_contracts_index', index);
341
+ }
342
+ }
343
+
344
+ /**
345
+ * Get required holon operations, throwing if not linked.
346
+ * @param {string} holonId - Holon identifier
347
+ * @returns {ContractOperations} Operations wrapper
348
+ * @throws {Error} If holon has no linked contract
349
+ */
350
+ requireOperations(holonId) {
351
+ const ops = this.getOperations(holonId);
352
+ if (!ops) {
353
+ throw new Error(`Holon ${holonId} has no linked contract. Deploy or link one first.`);
354
+ }
355
+ return ops;
356
+ }
357
+ }
358
+
359
+ export default HolonContracts;
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @fileoverview Holosphere Contracts Module - Smart contract integration for fractal fund distribution.
3
+ * Provides a complete toolkit for deploying, managing, and interacting with Holosphere smart contracts.
4
+ * @module contracts
5
+ */
6
+
7
+ // Core classes
8
+ export { ChainManager } from './chain-manager.js';
9
+ export { ContractDeployer, ABIs } from './deployer.js';
10
+ export { HolonContracts } from './holon-contracts.js';
11
+ export { ContractOperations } from './operations.js';
12
+ export { EventListener, SANKEY_EVENTS } from './event-listener.js';
13
+ export { ContractQueries } from './queries.js';
14
+
15
+ // Network utilities
16
+ export {
17
+ NETWORKS,
18
+ getNetwork,
19
+ getNetworksByType,
20
+ listNetworks,
21
+ isNetworkSupported,
22
+ getTxUrl,
23
+ getAddressUrl
24
+ } from './networks.js';
25
+
26
+ // Re-export ABIs for direct access
27
+ import SplitterABI from './abis/Splitter.json' with { type: 'json' };
28
+ import ManagedABI from './abis/Managed.json' with { type: 'json' };
29
+ import ZonedABI from './abis/Zoned.json' with { type: 'json' };
30
+ import AppreciativeABI from './abis/Appreciative.json' with { type: 'json' };
31
+ import BundleABI from './abis/Bundle.json' with { type: 'json' };
32
+ import HolonsABI from './abis/Holons.json' with { type: 'json' };
33
+ import TestTokenABI from './abis/TestToken.json' with { type: 'json' };
34
+
35
+ export const ContractABIs = {
36
+ Splitter: SplitterABI,
37
+ Managed: ManagedABI,
38
+ Zoned: ZonedABI,
39
+ Appreciative: AppreciativeABI,
40
+ Bundle: BundleABI,
41
+ Holons: HolonsABI,
42
+ TestToken: TestTokenABI
43
+ };
44
+
45
+ // Import for default export
46
+ import { ChainManager } from './chain-manager.js';
47
+ import { ContractDeployer } from './deployer.js';
48
+ import { HolonContracts } from './holon-contracts.js';
49
+ import { ContractOperations } from './operations.js';
50
+ import { EventListener, SANKEY_EVENTS } from './event-listener.js';
51
+ import { ContractQueries } from './queries.js';
52
+ import { NETWORKS } from './networks.js';
53
+
54
+ /**
55
+ * Create a complete contracts module instance with all components initialized.
56
+ * @param {Object} [config={}] - Configuration options for ChainManager
57
+ * @returns {Promise<{chainManager: ChainManager, deployer: ContractDeployer, holonContracts: HolonContracts}>} Initialized contracts module
58
+ */
59
+ export async function createContractsModule(config = {}) {
60
+ const chainManager = new ChainManager(config);
61
+ const deployer = new ContractDeployer(chainManager);
62
+ const holonContracts = new HolonContracts(chainManager, deployer);
63
+
64
+ return {
65
+ chainManager,
66
+ deployer,
67
+ holonContracts
68
+ };
69
+ }
70
+
71
+ export default {
72
+ ChainManager,
73
+ ContractDeployer,
74
+ HolonContracts,
75
+ ContractOperations,
76
+ EventListener,
77
+ ContractQueries,
78
+ SANKEY_EVENTS,
79
+ NETWORKS,
80
+ ABIs: ContractABIs,
81
+ createContractsModule
82
+ };
@@ -0,0 +1,229 @@
1
+ /**
2
+ * @fileoverview Multi-chain network configurations for Holosphere contracts.
3
+ * Supports Ethereum, Polygon, Arbitrum, Base, Optimism, and their testnets.
4
+ * @module contracts/networks
5
+ */
6
+
7
+ /**
8
+ * Network configurations for all supported EVM chains.
9
+ * @constant {Object}
10
+ */
11
+ export const NETWORKS = {
12
+ // ========== MAINNETS ==========
13
+ ethereum: {
14
+ name: 'Ethereum Mainnet',
15
+ chainId: 1,
16
+ rpc: 'https://eth.llamarpc.com',
17
+ explorer: 'https://etherscan.io',
18
+ currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
19
+ type: 'mainnet'
20
+ },
21
+ polygon: {
22
+ name: 'Polygon Mainnet',
23
+ chainId: 137,
24
+ rpc: 'https://polygon-rpc.com',
25
+ explorer: 'https://polygonscan.com',
26
+ currency: { name: 'MATIC', symbol: 'MATIC', decimals: 18 },
27
+ type: 'mainnet'
28
+ },
29
+ arbitrum: {
30
+ name: 'Arbitrum One',
31
+ chainId: 42161,
32
+ rpc: 'https://arb1.arbitrum.io/rpc',
33
+ explorer: 'https://arbiscan.io',
34
+ currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
35
+ type: 'mainnet'
36
+ },
37
+ base: {
38
+ name: 'Base',
39
+ chainId: 8453,
40
+ rpc: 'https://mainnet.base.org',
41
+ explorer: 'https://basescan.org',
42
+ currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
43
+ type: 'mainnet'
44
+ },
45
+ optimism: {
46
+ name: 'Optimism',
47
+ chainId: 10,
48
+ rpc: 'https://mainnet.optimism.io',
49
+ explorer: 'https://optimistic.etherscan.io',
50
+ currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
51
+ type: 'mainnet'
52
+ },
53
+ avalanche: {
54
+ name: 'Avalanche C-Chain',
55
+ chainId: 43114,
56
+ rpc: 'https://api.avax.network/ext/bc/C/rpc',
57
+ explorer: 'https://snowtrace.io',
58
+ currency: { name: 'AVAX', symbol: 'AVAX', decimals: 18 },
59
+ type: 'mainnet'
60
+ },
61
+ bsc: {
62
+ name: 'BNB Smart Chain',
63
+ chainId: 56,
64
+ rpc: 'https://bsc-dataseed.binance.org',
65
+ explorer: 'https://bscscan.com',
66
+ currency: { name: 'BNB', symbol: 'BNB', decimals: 18 },
67
+ type: 'mainnet'
68
+ },
69
+
70
+ // ========== TESTNETS ==========
71
+ sepolia: {
72
+ name: 'Sepolia',
73
+ chainId: 11155111,
74
+ rpc: 'https://rpc.sepolia.org',
75
+ explorer: 'https://sepolia.etherscan.io',
76
+ currency: { name: 'Sepolia ETH', symbol: 'ETH', decimals: 18 },
77
+ type: 'testnet',
78
+ faucet: 'https://sepoliafaucet.com'
79
+ },
80
+ goerli: {
81
+ name: 'Goerli',
82
+ chainId: 5,
83
+ rpc: 'https://rpc.goerli.eth.gateway.fm',
84
+ explorer: 'https://goerli.etherscan.io',
85
+ currency: { name: 'Goerli ETH', symbol: 'ETH', decimals: 18 },
86
+ type: 'testnet',
87
+ faucet: 'https://goerlifaucet.com'
88
+ },
89
+ mumbai: {
90
+ name: 'Polygon Mumbai',
91
+ chainId: 80001,
92
+ rpc: 'https://rpc-mumbai.maticvigil.com',
93
+ explorer: 'https://mumbai.polygonscan.com',
94
+ currency: { name: 'MATIC', symbol: 'MATIC', decimals: 18 },
95
+ type: 'testnet',
96
+ faucet: 'https://faucet.polygon.technology'
97
+ },
98
+ amoy: {
99
+ name: 'Polygon Amoy',
100
+ chainId: 80002,
101
+ rpc: 'https://rpc-amoy.polygon.technology',
102
+ explorer: 'https://amoy.polygonscan.com',
103
+ currency: { name: 'MATIC', symbol: 'MATIC', decimals: 18 },
104
+ type: 'testnet',
105
+ faucet: 'https://faucet.polygon.technology'
106
+ },
107
+ arbitrumSepolia: {
108
+ name: 'Arbitrum Sepolia',
109
+ chainId: 421614,
110
+ rpc: 'https://sepolia-rollup.arbitrum.io/rpc',
111
+ explorer: 'https://sepolia.arbiscan.io',
112
+ currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
113
+ type: 'testnet'
114
+ },
115
+ baseSepolia: {
116
+ name: 'Base Sepolia',
117
+ chainId: 84532,
118
+ rpc: 'https://sepolia.base.org',
119
+ explorer: 'https://sepolia.basescan.org',
120
+ currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
121
+ type: 'testnet'
122
+ },
123
+ optimismSepolia: {
124
+ name: 'Optimism Sepolia',
125
+ chainId: 11155420,
126
+ rpc: 'https://sepolia.optimism.io',
127
+ explorer: 'https://sepolia-optimism.etherscan.io',
128
+ currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
129
+ type: 'testnet'
130
+ },
131
+
132
+ // ========== LOCAL ==========
133
+ hardhat: {
134
+ name: 'Hardhat Local',
135
+ chainId: 31337,
136
+ rpc: 'http://127.0.0.1:8545',
137
+ explorer: null,
138
+ currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
139
+ type: 'local'
140
+ },
141
+ anvil: {
142
+ name: 'Anvil Local',
143
+ chainId: 31337,
144
+ rpc: 'http://127.0.0.1:8545',
145
+ explorer: null,
146
+ currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
147
+ type: 'local'
148
+ },
149
+ ganache: {
150
+ name: 'Ganache Local',
151
+ chainId: 1337,
152
+ rpc: 'http://127.0.0.1:7545',
153
+ explorer: null,
154
+ currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
155
+ type: 'local'
156
+ }
157
+ };
158
+
159
+ /**
160
+ * Get network configuration by name or chain ID.
161
+ * @param {string|number} networkOrChainId - Network name (e.g., 'sepolia') or chain ID (e.g., 11155111)
162
+ * @returns {Object|null} Network configuration object or null if not found
163
+ */
164
+ export function getNetwork(networkOrChainId) {
165
+ if (typeof networkOrChainId === 'string') {
166
+ return NETWORKS[networkOrChainId] || null;
167
+ }
168
+ // Search by chain ID
169
+ for (const [name, config] of Object.entries(NETWORKS)) {
170
+ if (config.chainId === networkOrChainId) {
171
+ return { ...config, key: name };
172
+ }
173
+ }
174
+ return null;
175
+ }
176
+
177
+ /**
178
+ * Get all networks of a specific type.
179
+ * @param {'mainnet'|'testnet'|'local'} type - Network type
180
+ * @returns {Object} Map of networks matching the specified type
181
+ */
182
+ export function getNetworksByType(type) {
183
+ return Object.fromEntries(
184
+ Object.entries(NETWORKS).filter(([_, config]) => config.type === type)
185
+ );
186
+ }
187
+
188
+ /**
189
+ * List all available network names.
190
+ * @returns {string[]} Array of network names
191
+ */
192
+ export function listNetworks() {
193
+ return Object.keys(NETWORKS);
194
+ }
195
+
196
+ /**
197
+ * Check if a network is supported.
198
+ * @param {string} network - Network name
199
+ * @returns {boolean} True if network is supported
200
+ */
201
+ export function isNetworkSupported(network) {
202
+ return network in NETWORKS;
203
+ }
204
+
205
+ /**
206
+ * Get block explorer URL for a transaction.
207
+ * @param {string} network - Network name
208
+ * @param {string} txHash - Transaction hash
209
+ * @returns {string|null} Explorer URL or null if network has no explorer
210
+ */
211
+ export function getTxUrl(network, txHash) {
212
+ const config = NETWORKS[network];
213
+ if (!config?.explorer) return null;
214
+ return `${config.explorer}/tx/${txHash}`;
215
+ }
216
+
217
+ /**
218
+ * Get block explorer URL for an address.
219
+ * @param {string} network - Network name
220
+ * @param {string} address - Contract or wallet address
221
+ * @returns {string|null} Explorer URL or null if network has no explorer
222
+ */
223
+ export function getAddressUrl(network, address) {
224
+ const config = NETWORKS[network];
225
+ if (!config?.explorer) return null;
226
+ return `${config.explorer}/address/${address}`;
227
+ }
228
+
229
+ export default NETWORKS;