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.
- package/CHANGELOG.md +473 -0
- package/FEATURES.md +431 -0
- package/LICENSE +29 -42
- package/LICENSE-AGPL.md +180 -0
- package/README.md +97 -16
- package/dist/2019-D2OG2idw.js +6680 -0
- package/dist/2019-D2OG2idw.js.map +1 -0
- package/dist/2019-EION3wKo.cjs +8 -0
- package/dist/2019-EION3wKo.cjs.map +1 -0
- package/dist/_commonjsHelpers-C37NGDzP.cjs +2 -0
- package/dist/_commonjsHelpers-C37NGDzP.cjs.map +1 -0
- package/dist/_commonjsHelpers-CUmg6egw.js +7 -0
- package/dist/_commonjsHelpers-CUmg6egw.js.map +1 -0
- package/dist/browser-BSniCNqO.js +3058 -0
- package/dist/browser-BSniCNqO.js.map +1 -0
- package/dist/browser-Cq59Ij19.cjs +2 -0
- package/dist/browser-Cq59Ij19.cjs.map +1 -0
- package/dist/cdn/holosphere.min.js +55 -0
- package/dist/cdn/holosphere.min.js.map +1 -0
- package/dist/cjs/holosphere.cjs +2 -0
- package/dist/cjs/holosphere.cjs.map +1 -0
- package/dist/esm/holosphere.js +53 -0
- package/dist/esm/holosphere.js.map +1 -0
- package/dist/index-DDGt_V9o.cjs +12 -0
- package/dist/index-DDGt_V9o.cjs.map +1 -0
- package/dist/index-DJXftyvB.js +39841 -0
- package/dist/index-DJXftyvB.js.map +1 -0
- package/dist/index-DMbdcMtK.cjs +18 -0
- package/dist/index-DMbdcMtK.cjs.map +1 -0
- package/dist/index-DeZ1xz_s.js +15104 -0
- package/dist/index-DeZ1xz_s.js.map +1 -0
- package/dist/indexeddb-storage-BFt6hMeF.js +176 -0
- package/dist/indexeddb-storage-BFt6hMeF.js.map +1 -0
- package/dist/indexeddb-storage-BK5tv4Sh.cjs +2 -0
- package/dist/indexeddb-storage-BK5tv4Sh.cjs.map +1 -0
- package/dist/memory-storage-C9HuoL2E.js +91 -0
- package/dist/memory-storage-C9HuoL2E.js.map +1 -0
- package/dist/memory-storage-Dao7jfYG.cjs +2 -0
- package/dist/memory-storage-Dao7jfYG.cjs.map +1 -0
- package/dist/secp256k1-BbKzbLtD.cjs +12 -0
- package/dist/secp256k1-BbKzbLtD.cjs.map +1 -0
- package/dist/secp256k1-CreY7Pcl.js +1890 -0
- package/dist/secp256k1-CreY7Pcl.js.map +1 -0
- package/docs/CONTRACTS.md +797 -0
- package/docs/FOSDEM_PROPOSAL.md +388 -0
- package/docs/LOCALFIRST.md +266 -0
- package/docs/api/ai_aggregation.js.html +333 -0
- package/docs/api/ai_breakdown.js.html +524 -0
- package/docs/api/ai_classifier.js.html +231 -0
- package/docs/api/ai_council.js.html +246 -0
- package/docs/api/ai_embeddings.js.html +304 -0
- package/docs/api/ai_federation-ai.js.html +338 -0
- package/docs/api/ai_h3-ai.js.html +970 -0
- package/docs/api/ai_index.js.html +124 -0
- package/docs/api/ai_json-ops.js.html +241 -0
- package/docs/api/ai_llm-service.js.html +239 -0
- package/docs/api/ai_nl-query.js.html +236 -0
- package/docs/api/ai_relationships.js.html +367 -0
- package/docs/api/ai_schema-extractor.js.html +235 -0
- package/docs/api/ai_spatial.js.html +307 -0
- package/docs/api/ai_tts.js.html +214 -0
- package/docs/api/content_social-protocols.js.html +180 -0
- package/docs/api/core_holosphere.js.html +757 -0
- package/docs/api/crypto_nostr-utils.js.html +306 -0
- package/docs/api/crypto_secp256k1.js.html +267 -0
- package/docs/api/data/search.json +1 -0
- package/docs/api/federation_discovery.js.html +337 -0
- package/docs/api/federation_handshake.js.html +478 -0
- package/docs/api/federation_hologram.js.html +1053 -0
- package/docs/api/federation_registry.js.html +389 -0
- package/docs/api/fonts/Inconsolata-Regular.ttf +0 -0
- package/docs/api/fonts/OpenSans-Regular.ttf +0 -0
- package/docs/api/fonts/WorkSans-Bold.ttf +0 -0
- package/docs/api/global.html +3 -0
- package/docs/api/hierarchical_upcast.js.html +128 -0
- package/docs/api/index.html +265 -0
- package/docs/api/index.js.html +1868 -0
- package/docs/api/lib_ai-methods.js.html +660 -0
- package/docs/api/lib_contract-methods.js.html +445 -0
- package/docs/api/lib_errors.js.html +56 -0
- package/docs/api/lib_federation-methods.js.html +348 -0
- package/docs/api/lib_index.js.html +33 -0
- package/docs/api/module-ai.html +5 -0
- package/docs/api/module-ai_aggregation-SmartAggregation.html +6 -0
- package/docs/api/module-ai_aggregation.SmartAggregation.html +3 -0
- package/docs/api/module-ai_aggregation.html +3 -0
- package/docs/api/module-ai_breakdown-TaskBreakdown.html +5 -0
- package/docs/api/module-ai_breakdown.TaskBreakdown.html +3 -0
- package/docs/api/module-ai_breakdown.html +3 -0
- package/docs/api/module-ai_classifier-Classifier.html +6 -0
- package/docs/api/module-ai_classifier.Classifier.html +3 -0
- package/docs/api/module-ai_classifier.html +3 -0
- package/docs/api/module-ai_council-Council.html +6 -0
- package/docs/api/module-ai_council.Council.html +3 -0
- package/docs/api/module-ai_council.html +3 -0
- package/docs/api/module-ai_embeddings-Embeddings.html +5 -0
- package/docs/api/module-ai_embeddings.Embeddings.html +3 -0
- package/docs/api/module-ai_embeddings.html +3 -0
- package/docs/api/module-ai_federation-ai-FederationAdvisor.html +6 -0
- package/docs/api/module-ai_federation-ai.FederationAdvisor.html +3 -0
- package/docs/api/module-ai_federation-ai.html +3 -0
- package/docs/api/module-ai_h3-ai-H3AI.html +6 -0
- package/docs/api/module-ai_h3-ai.H3AI.html +3 -0
- package/docs/api/module-ai_h3-ai.html +3 -0
- package/docs/api/module-ai_json-ops-JSONOps.html +5 -0
- package/docs/api/module-ai_json-ops.JSONOps.html +3 -0
- package/docs/api/module-ai_json-ops.html +3 -0
- package/docs/api/module-ai_llm-service-LLMService.html +5 -0
- package/docs/api/module-ai_llm-service.LLMService.html +3 -0
- package/docs/api/module-ai_llm-service.html +3 -0
- package/docs/api/module-ai_nl-query-NLQuery.html +5 -0
- package/docs/api/module-ai_nl-query.NLQuery.html +3 -0
- package/docs/api/module-ai_nl-query.html +3 -0
- package/docs/api/module-ai_relationships-RelationshipDiscovery.html +6 -0
- package/docs/api/module-ai_relationships.RelationshipDiscovery.html +3 -0
- package/docs/api/module-ai_relationships.html +3 -0
- package/docs/api/module-ai_schema-extractor-SchemaExtractor.html +5 -0
- package/docs/api/module-ai_schema-extractor.SchemaExtractor.html +3 -0
- package/docs/api/module-ai_schema-extractor.html +3 -0
- package/docs/api/module-ai_spatial-SpatialAnalysis.html +6 -0
- package/docs/api/module-ai_spatial.SpatialAnalysis.html +3 -0
- package/docs/api/module-ai_spatial.html +3 -0
- package/docs/api/module-ai_tts-TTS.html +5 -0
- package/docs/api/module-ai_tts.TTS.html +3 -0
- package/docs/api/module-ai_tts.html +3 -0
- package/docs/api/module-content_social-protocols.html +3 -0
- package/docs/api/module-core_holosphere-HoloSphere.html +6 -0
- package/docs/api/module-core_holosphere.HoloSphere.html +3 -0
- package/docs/api/module-core_holosphere.html +3 -0
- package/docs/api/module-crypto_nostr-utils.html +3 -0
- package/docs/api/module-crypto_secp256k1.html +3 -0
- package/docs/api/module-federation_hologram.html +3 -0
- package/docs/api/module-hierarchical_upcast.html +3 -0
- package/docs/api/module-holosphere-HoloSphereBase.html +3 -0
- package/docs/api/module-holosphere.html +3 -0
- package/docs/api/module-lib_ai-methods.html +3 -0
- package/docs/api/module-lib_contract-methods.html +3 -0
- package/docs/api/module-lib_errors-AuthorizationError.html +3 -0
- package/docs/api/module-lib_errors-ValidationError.html +3 -0
- package/docs/api/module-lib_errors.AuthorizationError.html +3 -0
- package/docs/api/module-lib_errors.ValidationError.html +3 -0
- package/docs/api/module-lib_errors.html +3 -0
- package/docs/api/module-lib_federation-methods.html +3 -0
- package/docs/api/module-lib_index.html +3 -0
- package/docs/api/module-schema_validator-ValidationError.html +3 -0
- package/docs/api/module-schema_validator.ValidationError.html +3 -0
- package/docs/api/module-schema_validator.html +3 -0
- package/docs/api/module-spatial_h3-operations.html +4 -0
- package/docs/api/module-storage_backend-factory.BackendFactory.html +3 -0
- package/docs/api/module-storage_backend-factory.html +3 -0
- package/docs/api/module-storage_backend-interface-StorageBackend.html +3 -0
- package/docs/api/module-storage_backend-interface.StorageBackend.html +3 -0
- package/docs/api/module-storage_backend-interface.html +3 -0
- package/docs/api/module-storage_backends_activitypub-backend-ActivityPubBackend.html +7 -0
- package/docs/api/module-storage_backends_activitypub-backend.ActivityPubBackend.html +3 -0
- package/docs/api/module-storage_backends_activitypub-backend.html +3 -0
- package/docs/api/module-storage_backends_activitypub_server-ActivityPubServer.html +8 -0
- package/docs/api/module-storage_backends_activitypub_server.ActivityPubServer.html +3 -0
- package/docs/api/module-storage_backends_activitypub_server.html +3 -0
- package/docs/api/module-storage_backends_gundb-backend-GunDBBackend.html +7 -0
- package/docs/api/module-storage_backends_gundb-backend.GunDBBackend.html +3 -0
- package/docs/api/module-storage_backends_gundb-backend.html +3 -0
- package/docs/api/module-storage_backends_nostr-backend-NostrBackend.html +8 -0
- package/docs/api/module-storage_backends_nostr-backend.NostrBackend.html +3 -0
- package/docs/api/module-storage_backends_nostr-backend.html +3 -0
- package/docs/api/module-storage_filesystem-storage-FileSystemStorage.html +5 -0
- package/docs/api/module-storage_filesystem-storage-browser-FileSystemStorage.html +3 -0
- package/docs/api/module-storage_filesystem-storage-browser.FileSystemStorage.html +3 -0
- package/docs/api/module-storage_filesystem-storage-browser.html +3 -0
- package/docs/api/module-storage_filesystem-storage.FileSystemStorage.html +3 -0
- package/docs/api/module-storage_filesystem-storage.html +3 -0
- package/docs/api/module-storage_global-tables.html +3 -0
- package/docs/api/module-storage_gun-async.html +3 -0
- package/docs/api/module-storage_gun-auth-GunAuth.html +5 -0
- package/docs/api/module-storage_gun-auth.GunAuth.html +3 -0
- package/docs/api/module-storage_gun-auth.html +3 -0
- package/docs/api/module-storage_gun-federation.html +3 -0
- package/docs/api/module-storage_gun-references-GunReferenceHandler.html +5 -0
- package/docs/api/module-storage_gun-references.GunReferenceHandler.html +3 -0
- package/docs/api/module-storage_gun-references.html +3 -0
- package/docs/api/module-storage_gun-schema-GunSchemaValidator.html +5 -0
- package/docs/api/module-storage_gun-schema.GunSchemaValidator.html +3 -0
- package/docs/api/module-storage_gun-schema.html +3 -0
- package/docs/api/module-storage_gun-wrapper.html +11 -0
- package/docs/api/module-storage_indexeddb-storage-IndexedDBStorage.html +5 -0
- package/docs/api/module-storage_indexeddb-storage.IndexedDBStorage.html +3 -0
- package/docs/api/module-storage_indexeddb-storage.html +3 -0
- package/docs/api/module-storage_key-storage-simple.html +3 -0
- package/docs/api/module-storage_key-storage.html +4 -0
- package/docs/api/module-storage_memory-storage-MemoryStorage.html +5 -0
- package/docs/api/module-storage_memory-storage.MemoryStorage.html +3 -0
- package/docs/api/module-storage_memory-storage.html +3 -0
- package/docs/api/module-storage_migration-MigrationTool.html +6 -0
- package/docs/api/module-storage_migration.MigrationTool.html +3 -0
- package/docs/api/module-storage_migration.html +3 -0
- package/docs/api/module-storage_nostr-async.html +18 -0
- package/docs/api/module-storage_nostr-client-LRUCache.html +3 -0
- package/docs/api/module-storage_nostr-client-NostrClient.html +7 -0
- package/docs/api/module-storage_nostr-client.NostrClient.html +15 -0
- package/docs/api/module-storage_nostr-client.html +6 -0
- package/docs/api/module-storage_nostr-wrapper.html +3 -0
- package/docs/api/module-storage_outbox-queue-OutboxQueue.html +4 -0
- package/docs/api/module-storage_outbox-queue.OutboxQueue.html +3 -0
- package/docs/api/module-storage_outbox-queue.html +3 -0
- package/docs/api/module-storage_persistent-storage-PersistentStorage.html +3 -0
- package/docs/api/module-storage_persistent-storage.html +4 -0
- package/docs/api/module-storage_sync-service-SyncService.html +5 -0
- package/docs/api/module-storage_sync-service.SyncService.html +3 -0
- package/docs/api/module-storage_sync-service.html +3 -0
- package/docs/api/module-storage_unified-storage.html +3 -0
- package/docs/api/module-subscriptions_manager.SubscriptionRegistry.html +3 -0
- package/docs/api/module-subscriptions_manager.html +3 -0
- package/docs/api/schema_validator.js.html +113 -0
- package/docs/api/scripts/core.js +726 -0
- package/docs/api/scripts/core.min.js +23 -0
- package/docs/api/scripts/resize.js +90 -0
- package/docs/api/scripts/search.js +265 -0
- package/docs/api/scripts/search.min.js +6 -0
- package/docs/api/scripts/third-party/Apache-License-2.0.txt +202 -0
- package/docs/api/scripts/third-party/fuse.js +9 -0
- package/docs/api/scripts/third-party/hljs-line-num-original.js +369 -0
- package/docs/api/scripts/third-party/hljs-line-num.js +1 -0
- package/docs/api/scripts/third-party/hljs-original.js +5171 -0
- package/docs/api/scripts/third-party/hljs.js +1 -0
- package/docs/api/scripts/third-party/popper.js +5 -0
- package/docs/api/scripts/third-party/tippy.js +1 -0
- package/docs/api/scripts/third-party/tocbot.js +672 -0
- package/docs/api/scripts/third-party/tocbot.min.js +1 -0
- package/docs/api/spatial_h3-operations.js.html +129 -0
- package/docs/api/storage_backend-factory.js.html +133 -0
- package/docs/api/storage_backend-interface.js.html +164 -0
- package/docs/api/storage_backends_activitypub-backend.js.html +298 -0
- package/docs/api/storage_backends_activitypub_server.js.html +678 -0
- package/docs/api/storage_backends_gundb-backend.js.html +878 -0
- package/docs/api/storage_backends_nostr-backend.js.html +254 -0
- package/docs/api/storage_filesystem-storage-browser.js.html +83 -0
- package/docs/api/storage_filesystem-storage.js.html +207 -0
- package/docs/api/storage_global-tables.js.html +116 -0
- package/docs/api/storage_gun-async.js.html +344 -0
- package/docs/api/storage_gun-auth.js.html +376 -0
- package/docs/api/storage_gun-federation.js.html +788 -0
- package/docs/api/storage_gun-references.js.html +212 -0
- package/docs/api/storage_gun-schema.js.html +309 -0
- package/docs/api/storage_gun-wrapper.js.html +645 -0
- package/docs/api/storage_indexeddb-storage.js.html +224 -0
- package/docs/api/storage_key-storage-simple.js.html +102 -0
- package/docs/api/storage_key-storage.js.html +171 -0
- package/docs/api/storage_memory-storage.js.html +128 -0
- package/docs/api/storage_migration.js.html +354 -0
- package/docs/api/storage_nostr-async.js.html +1076 -0
- package/docs/api/storage_nostr-client.js.html +1598 -0
- package/docs/api/storage_nostr-wrapper.js.html +218 -0
- package/docs/api/storage_outbox-queue.js.html +248 -0
- package/docs/api/storage_persistent-storage.js.html +160 -0
- package/docs/api/storage_sync-service.js.html +201 -0
- package/docs/api/storage_unified-storage.js.html +157 -0
- package/docs/api/styles/clean-jsdoc-theme-base.css +1159 -0
- package/docs/api/styles/clean-jsdoc-theme-dark.css +412 -0
- package/docs/api/styles/clean-jsdoc-theme-light.css +482 -0
- package/docs/api/styles/clean-jsdoc-theme-scrollbar.css +30 -0
- package/docs/api/styles/clean-jsdoc-theme-without-scrollbar.min.css +1 -0
- package/docs/api/styles/clean-jsdoc-theme.min.css +1 -0
- package/docs/api/subscriptions_manager.js.html +162 -0
- package/docs/contracts/api-interface.md +793 -0
- package/docs/data-model.md +476 -0
- package/docs/gun-async-usage.md +338 -0
- package/docs/plan.md +349 -0
- package/docs/quickstart.md +674 -0
- package/docs/research.md +362 -0
- package/docs/spec.md +244 -0
- package/docs/storage-backends.md +326 -0
- package/docs/tasks.md +947 -0
- package/examples/demo.html +47 -0
- package/examples/holosphere-widget.js +1242 -0
- package/examples/widget-demo.html +274 -0
- package/examples/widget.html +703 -0
- package/jsdoc.json +26 -0
- package/package.json +25 -7
- package/src/ai/aggregation.js +13 -2
- package/src/ai/breakdown.js +12 -2
- package/src/ai/classifier.js +14 -3
- package/src/ai/council.js +22 -7
- package/src/ai/embeddings.js +37 -15
- package/src/ai/federation-ai.js +13 -2
- package/src/ai/h3-ai.js +14 -2
- package/src/ai/index.js +16 -7
- package/src/ai/json-ops.js +18 -5
- package/src/ai/llm-service.js +62 -31
- package/src/ai/nl-query.js +12 -2
- package/src/ai/relationships.js +13 -2
- package/src/ai/schema-extractor.js +24 -10
- package/src/ai/spatial.js +13 -2
- package/src/ai/tts.js +25 -8
- package/src/cdn-entry.js +22 -0
- package/src/content/social-protocols.js +34 -25
- package/src/contracts/abis/Appreciative.json +1280 -0
- package/src/contracts/abis/AppreciativeFactory.json +101 -0
- package/src/contracts/abis/Bundle.json +1438 -0
- package/src/contracts/abis/BundleFactory.json +106 -0
- package/src/contracts/abis/Holon.json +881 -0
- package/src/contracts/abis/Holons.json +330 -0
- package/src/contracts/abis/Managed.json +1262 -0
- package/src/contracts/abis/ManagedFactory.json +149 -0
- package/src/contracts/abis/Membrane.json +261 -0
- package/src/contracts/abis/Splitter.json +1624 -0
- package/src/contracts/abis/SplitterFactory.json +220 -0
- package/src/contracts/abis/TestToken.json +321 -0
- package/src/contracts/abis/Zoned.json +1461 -0
- package/src/contracts/abis/ZonedFactory.json +154 -0
- package/src/contracts/chain-manager.js +403 -0
- package/src/contracts/deployer.js +500 -0
- package/src/contracts/event-listener.js +539 -0
- package/src/contracts/holon-contracts.js +359 -0
- package/src/contracts/index.js +82 -0
- package/src/contracts/networks.js +229 -0
- package/src/contracts/operations.js +687 -0
- package/src/contracts/queries.js +638 -0
- package/src/core/holosphere.js +487 -6
- package/src/crypto/nostr-utils.js +303 -0
- package/src/crypto/secp256k1.js +7 -2
- package/src/federation/handshake.js +475 -0
- package/src/federation/hologram.js +117 -3
- package/src/hierarchical/upcast.js +40 -25
- package/src/index.js +1501 -1909
- package/src/lib/ai-methods.js +657 -0
- package/src/lib/contract-methods.js +442 -0
- package/src/lib/errors.js +53 -0
- package/src/lib/federation-methods.js +345 -0
- package/src/lib/index.js +30 -0
- package/src/schema/validator.js +22 -3
- package/src/spatial/h3-operations.js +19 -3
- package/src/storage/backend-factory.js +7 -2
- package/src/storage/backend-interface.js +21 -2
- package/src/storage/backends/activitypub/server.js +25 -3
- package/src/storage/backends/activitypub-backend.js +25 -2
- package/src/storage/backends/gundb-backend.js +692 -50
- package/src/storage/backends/nostr-backend.js +116 -1
- package/src/storage/filesystem-storage-browser.js +42 -2
- package/src/storage/filesystem-storage.js +72 -5
- package/src/storage/global-tables.js +35 -3
- package/src/storage/gun-async.js +75 -15
- package/src/storage/gun-auth.js +373 -0
- package/src/storage/gun-federation.js +785 -0
- package/src/storage/gun-references.js +209 -0
- package/src/storage/gun-schema.js +306 -0
- package/src/storage/gun-wrapper.js +475 -54
- package/src/storage/indexeddb-storage.js +112 -13
- package/src/storage/key-storage-simple.js +32 -9
- package/src/storage/key-storage.js +45 -13
- package/src/storage/memory-storage.js +68 -2
- package/src/storage/migration.js +20 -7
- package/src/storage/nostr-async.js +412 -122
- package/src/storage/nostr-client.js +749 -76
- package/src/storage/nostr-wrapper.js +6 -2
- package/src/storage/outbox-queue.js +55 -18
- package/src/storage/persistent-storage.js +62 -14
- package/src/storage/sync-service.js +51 -17
- package/src/storage/unified-storage.js +154 -0
- package/src/subscriptions/manager.js +34 -17
- package/types/index.d.ts +133 -0
- package/vite.config.cdn.js +60 -0
- package/tests/unit/ai/aggregation.test.js +0 -295
- package/tests/unit/ai/breakdown.test.js +0 -446
- package/tests/unit/ai/classifier.test.js +0 -294
- package/tests/unit/ai/council.test.js +0 -262
- package/tests/unit/ai/embeddings.test.js +0 -384
- package/tests/unit/ai/federation-ai.test.js +0 -344
- package/tests/unit/ai/h3-ai.test.js +0 -458
- package/tests/unit/ai/index.test.js +0 -304
- package/tests/unit/ai/json-ops.test.js +0 -307
- package/tests/unit/ai/llm-service.test.js +0 -390
- package/tests/unit/ai/nl-query.test.js +0 -383
- package/tests/unit/ai/relationships.test.js +0 -311
- package/tests/unit/ai/schema-extractor.test.js +0 -384
- package/tests/unit/ai/spatial.test.js +0 -279
- package/tests/unit/ai/tts.test.js +0 -279
- package/tests/unit/content.test.js +0 -332
- package/tests/unit/contract/core.test.js +0 -88
- package/tests/unit/contract/crypto.test.js +0 -198
- package/tests/unit/contract/data.test.js +0 -223
- package/tests/unit/contract/federation.test.js +0 -181
- package/tests/unit/contract/hierarchical.test.js +0 -113
- package/tests/unit/contract/schema.test.js +0 -114
- package/tests/unit/contract/social.test.js +0 -217
- package/tests/unit/contract/spatial.test.js +0 -110
- package/tests/unit/contract/subscriptions.test.js +0 -128
- package/tests/unit/contract/utils.test.js +0 -159
- package/tests/unit/core.test.js +0 -152
- package/tests/unit/crypto.test.js +0 -328
- package/tests/unit/federation.test.js +0 -234
- package/tests/unit/gun-async.test.js +0 -252
- package/tests/unit/hierarchical.test.js +0 -399
- package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
- package/tests/unit/integration/scenario-02-federation.test.js +0 -76
- package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
- package/tests/unit/integration/scenario-04-validation.test.js +0 -129
- package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
- package/tests/unit/integration/scenario-06-social.test.js +0 -135
- package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
- package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
- package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
- package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
- package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
- package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
- package/tests/unit/performance/benchmark.test.js +0 -85
- package/tests/unit/schema.test.js +0 -213
- package/tests/unit/spatial.test.js +0 -158
- package/tests/unit/storage.test.js +0 -195
- package/tests/unit/subscriptions.test.js +0 -328
- package/tests/unit/test-data-permanence-debug.js +0 -197
- package/tests/unit/test-data-permanence.js +0 -340
- package/tests/unit/test-key-persistence-fixed.js +0 -148
- package/tests/unit/test-key-persistence.js +0 -172
- package/tests/unit/test-relay-permanence.js +0 -376
- package/tests/unit/test-second-node.js +0 -95
- package/tests/unit/test-simple-write.js +0 -89
- /package/{cleanup-test-data.js → scripts/cleanup-test-data.js} +0 -0
- /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;
|