holosphere 2.0.0-alpha1 → 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 -166
- 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,154 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"type": "constructor",
|
|
4
|
+
"inputs": [
|
|
5
|
+
{
|
|
6
|
+
"name": "_botAddress",
|
|
7
|
+
"type": "address",
|
|
8
|
+
"internalType": "address"
|
|
9
|
+
}
|
|
10
|
+
],
|
|
11
|
+
"stateMutability": "nonpayable"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"type": "function",
|
|
15
|
+
"name": "botAddress",
|
|
16
|
+
"inputs": [],
|
|
17
|
+
"outputs": [
|
|
18
|
+
{
|
|
19
|
+
"name": "",
|
|
20
|
+
"type": "address",
|
|
21
|
+
"internalType": "address"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"stateMutability": "view"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"type": "function",
|
|
28
|
+
"name": "createZoned",
|
|
29
|
+
"inputs": [
|
|
30
|
+
{
|
|
31
|
+
"name": "_creatorUserId",
|
|
32
|
+
"type": "string",
|
|
33
|
+
"internalType": "string"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"name": "_name",
|
|
37
|
+
"type": "string",
|
|
38
|
+
"internalType": "string"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "_parameter",
|
|
42
|
+
"type": "uint256",
|
|
43
|
+
"internalType": "uint256"
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"outputs": [
|
|
47
|
+
{
|
|
48
|
+
"name": "",
|
|
49
|
+
"type": "address",
|
|
50
|
+
"internalType": "address"
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"stateMutability": "nonpayable"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"type": "function",
|
|
57
|
+
"name": "listHolons",
|
|
58
|
+
"inputs": [],
|
|
59
|
+
"outputs": [
|
|
60
|
+
{
|
|
61
|
+
"name": "",
|
|
62
|
+
"type": "address[]",
|
|
63
|
+
"internalType": "address[]"
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"stateMutability": "view"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"type": "function",
|
|
70
|
+
"name": "listHolonsOf",
|
|
71
|
+
"inputs": [
|
|
72
|
+
{
|
|
73
|
+
"name": "_address",
|
|
74
|
+
"type": "address",
|
|
75
|
+
"internalType": "address"
|
|
76
|
+
}
|
|
77
|
+
],
|
|
78
|
+
"outputs": [
|
|
79
|
+
{
|
|
80
|
+
"name": "",
|
|
81
|
+
"type": "address[]",
|
|
82
|
+
"internalType": "address[]"
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"stateMutability": "view"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"type": "function",
|
|
89
|
+
"name": "newHolon",
|
|
90
|
+
"inputs": [
|
|
91
|
+
{
|
|
92
|
+
"name": "creatorUserId",
|
|
93
|
+
"type": "string",
|
|
94
|
+
"internalType": "string"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"name": "_name",
|
|
98
|
+
"type": "string",
|
|
99
|
+
"internalType": "string"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"name": "_parameter",
|
|
103
|
+
"type": "uint256",
|
|
104
|
+
"internalType": "uint256"
|
|
105
|
+
}
|
|
106
|
+
],
|
|
107
|
+
"outputs": [
|
|
108
|
+
{
|
|
109
|
+
"name": "",
|
|
110
|
+
"type": "address",
|
|
111
|
+
"internalType": "address"
|
|
112
|
+
}
|
|
113
|
+
],
|
|
114
|
+
"stateMutability": "nonpayable"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"type": "function",
|
|
118
|
+
"name": "toAddress",
|
|
119
|
+
"inputs": [
|
|
120
|
+
{
|
|
121
|
+
"name": "",
|
|
122
|
+
"type": "string",
|
|
123
|
+
"internalType": "string"
|
|
124
|
+
}
|
|
125
|
+
],
|
|
126
|
+
"outputs": [
|
|
127
|
+
{
|
|
128
|
+
"name": "",
|
|
129
|
+
"type": "address",
|
|
130
|
+
"internalType": "address"
|
|
131
|
+
}
|
|
132
|
+
],
|
|
133
|
+
"stateMutability": "view"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"type": "event",
|
|
137
|
+
"name": "NewHolon",
|
|
138
|
+
"inputs": [
|
|
139
|
+
{
|
|
140
|
+
"name": "name",
|
|
141
|
+
"type": "string",
|
|
142
|
+
"indexed": false,
|
|
143
|
+
"internalType": "string"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"name": "addr",
|
|
147
|
+
"type": "address",
|
|
148
|
+
"indexed": false,
|
|
149
|
+
"internalType": "address"
|
|
150
|
+
}
|
|
151
|
+
],
|
|
152
|
+
"anonymous": false
|
|
153
|
+
}
|
|
154
|
+
]
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Multi-chain connection manager for Holosphere smart contracts.
|
|
3
|
+
* Handles provider/signer setup, network switching, and wallet management across EVM chains.
|
|
4
|
+
* @module contracts/chain-manager
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { NETWORKS, getNetwork, isNetworkSupported } from './networks.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Multi-chain connection manager for Holosphere contracts.
|
|
11
|
+
* Supports both RPC providers and browser wallets (MetaMask, etc.).
|
|
12
|
+
* @class
|
|
13
|
+
*/
|
|
14
|
+
export class ChainManager {
|
|
15
|
+
/**
|
|
16
|
+
* Create a new ChainManager instance.
|
|
17
|
+
* @param {Object} [config={}] - Configuration options
|
|
18
|
+
*/
|
|
19
|
+
constructor(config = {}) {
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.provider = null;
|
|
22
|
+
this.signer = null;
|
|
23
|
+
this.network = null;
|
|
24
|
+
this.networkName = null;
|
|
25
|
+
this.ethers = null;
|
|
26
|
+
this._initialized = false;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Initialize ethers.js library (lazy load).
|
|
31
|
+
* @private
|
|
32
|
+
* @returns {Promise<Object>} Ethers.js module
|
|
33
|
+
*/
|
|
34
|
+
async _loadEthers() {
|
|
35
|
+
if (!this.ethers) {
|
|
36
|
+
// Dynamic import for ethers
|
|
37
|
+
const ethersModule = await import('ethers');
|
|
38
|
+
this.ethers = ethersModule;
|
|
39
|
+
}
|
|
40
|
+
return this.ethers;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Connect to a network using RPC provider.
|
|
45
|
+
* @param {string} networkName - Network name (e.g., 'sepolia', 'polygon')
|
|
46
|
+
* @param {string} [privateKey] - Private key for signing transactions
|
|
47
|
+
* @param {string} [rpcUrl] - Custom RPC URL (overrides default)
|
|
48
|
+
* @returns {Promise<{provider: Object, signer: Object|null, network: Object, networkName: string, config: Object}>} Connection details
|
|
49
|
+
* @throws {Error} If network is unsupported and no custom RPC URL provided
|
|
50
|
+
*/
|
|
51
|
+
async connect(networkName, privateKey, rpcUrl) {
|
|
52
|
+
const ethers = await this._loadEthers();
|
|
53
|
+
|
|
54
|
+
if (!isNetworkSupported(networkName) && !rpcUrl) {
|
|
55
|
+
throw new Error(`Unsupported network: ${networkName}. Use a custom rpcUrl or choose from: ${Object.keys(NETWORKS).join(', ')}`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const networkConfig = getNetwork(networkName) || { chainId: 0, name: networkName };
|
|
59
|
+
const url = rpcUrl || networkConfig.rpc;
|
|
60
|
+
|
|
61
|
+
// Create provider
|
|
62
|
+
this.provider = new ethers.JsonRpcProvider(url, {
|
|
63
|
+
chainId: networkConfig.chainId,
|
|
64
|
+
name: networkConfig.name
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Wait for provider to be ready
|
|
68
|
+
await this.provider.ready;
|
|
69
|
+
|
|
70
|
+
// Get actual network info
|
|
71
|
+
this.network = await this.provider.getNetwork();
|
|
72
|
+
this.networkName = networkName;
|
|
73
|
+
|
|
74
|
+
// Create signer if private key provided
|
|
75
|
+
if (privateKey) {
|
|
76
|
+
// Remove 0x prefix if present
|
|
77
|
+
const cleanKey = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`;
|
|
78
|
+
this.signer = new ethers.Wallet(cleanKey, this.provider);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
this._initialized = true;
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
provider: this.provider,
|
|
85
|
+
signer: this.signer,
|
|
86
|
+
network: this.network,
|
|
87
|
+
networkName: this.networkName,
|
|
88
|
+
config: networkConfig
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Connect using browser wallet (MetaMask, etc.).
|
|
94
|
+
* @param {string} [networkName] - Optionally switch to this network
|
|
95
|
+
* @returns {Promise<{provider: Object, signer: Object, network: Object, address: string}>} Connection details including user address
|
|
96
|
+
* @throws {Error} If no browser wallet is detected
|
|
97
|
+
*/
|
|
98
|
+
async connectBrowser(networkName) {
|
|
99
|
+
const ethers = await this._loadEthers();
|
|
100
|
+
|
|
101
|
+
if (typeof window === 'undefined' || !window.ethereum) {
|
|
102
|
+
throw new Error('No browser wallet detected. Please install MetaMask or another Web3 wallet.');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Request account access
|
|
106
|
+
await window.ethereum.request({ method: 'eth_requestAccounts' });
|
|
107
|
+
|
|
108
|
+
// Create provider from browser
|
|
109
|
+
this.provider = new ethers.BrowserProvider(window.ethereum);
|
|
110
|
+
this.signer = await this.provider.getSigner();
|
|
111
|
+
this.network = await this.provider.getNetwork();
|
|
112
|
+
|
|
113
|
+
// Switch network if requested
|
|
114
|
+
if (networkName && isNetworkSupported(networkName)) {
|
|
115
|
+
const targetConfig = getNetwork(networkName);
|
|
116
|
+
if (this.network.chainId !== BigInt(targetConfig.chainId)) {
|
|
117
|
+
await this.switchNetwork(networkName);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const address = await this.signer.getAddress();
|
|
122
|
+
this._initialized = true;
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
provider: this.provider,
|
|
126
|
+
signer: this.signer,
|
|
127
|
+
network: this.network,
|
|
128
|
+
address
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Switch to a different network (browser wallet only).
|
|
134
|
+
* Adds the network to the wallet if it doesn't exist.
|
|
135
|
+
* @param {string} networkName - Target network name
|
|
136
|
+
* @returns {Promise<void>}
|
|
137
|
+
* @throws {Error} If not using a browser wallet or network is unknown
|
|
138
|
+
*/
|
|
139
|
+
async switchNetwork(networkName) {
|
|
140
|
+
if (typeof window === 'undefined' || !window.ethereum) {
|
|
141
|
+
throw new Error('Network switching requires a browser wallet');
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const config = getNetwork(networkName);
|
|
145
|
+
if (!config) {
|
|
146
|
+
throw new Error(`Unknown network: ${networkName}`);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const chainIdHex = '0x' + config.chainId.toString(16);
|
|
150
|
+
|
|
151
|
+
try {
|
|
152
|
+
// Try to switch to the network
|
|
153
|
+
await window.ethereum.request({
|
|
154
|
+
method: 'wallet_switchEthereumChain',
|
|
155
|
+
params: [{ chainId: chainIdHex }]
|
|
156
|
+
});
|
|
157
|
+
} catch (switchError) {
|
|
158
|
+
// If the network doesn't exist, add it
|
|
159
|
+
if (switchError.code === 4902) {
|
|
160
|
+
await window.ethereum.request({
|
|
161
|
+
method: 'wallet_addEthereumChain',
|
|
162
|
+
params: [{
|
|
163
|
+
chainId: chainIdHex,
|
|
164
|
+
chainName: config.name,
|
|
165
|
+
nativeCurrency: config.currency,
|
|
166
|
+
rpcUrls: [config.rpc],
|
|
167
|
+
blockExplorerUrls: config.explorer ? [config.explorer] : []
|
|
168
|
+
}]
|
|
169
|
+
});
|
|
170
|
+
} else {
|
|
171
|
+
throw switchError;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Refresh provider/signer after network switch
|
|
176
|
+
const ethers = await this._loadEthers();
|
|
177
|
+
this.provider = new ethers.BrowserProvider(window.ethereum);
|
|
178
|
+
this.signer = await this.provider.getSigner();
|
|
179
|
+
this.network = await this.provider.getNetwork();
|
|
180
|
+
this.networkName = networkName;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Get the current provider.
|
|
185
|
+
* @returns {Object} Ethers.js provider instance
|
|
186
|
+
* @throws {Error} If not initialized
|
|
187
|
+
*/
|
|
188
|
+
getProvider() {
|
|
189
|
+
this._requireInitialized();
|
|
190
|
+
return this.provider;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Get the current signer.
|
|
195
|
+
* @returns {Object} Ethers.js signer instance
|
|
196
|
+
* @throws {Error} If not initialized or no signer available
|
|
197
|
+
*/
|
|
198
|
+
getSigner() {
|
|
199
|
+
this._requireInitialized();
|
|
200
|
+
if (!this.signer) {
|
|
201
|
+
throw new Error('No signer available. Connect with a private key or use connectBrowser().');
|
|
202
|
+
}
|
|
203
|
+
return this.signer;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Get the connected wallet address.
|
|
208
|
+
* @returns {Promise<string>} Ethereum address
|
|
209
|
+
* @throws {Error} If no signer available
|
|
210
|
+
*/
|
|
211
|
+
async getAddress() {
|
|
212
|
+
const signer = this.getSigner();
|
|
213
|
+
return signer.getAddress();
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Get ETH balance of an address.
|
|
218
|
+
* @param {string} [address] - Address to check (defaults to signer)
|
|
219
|
+
* @returns {Promise<string>} Balance in ETH as decimal string
|
|
220
|
+
* @throws {Error} If not initialized or no address/signer available
|
|
221
|
+
*/
|
|
222
|
+
async getBalance(address) {
|
|
223
|
+
this._requireInitialized();
|
|
224
|
+
const ethers = await this._loadEthers();
|
|
225
|
+
const addr = address || (this.signer ? await this.signer.getAddress() : null);
|
|
226
|
+
if (!addr) {
|
|
227
|
+
throw new Error('No address provided and no signer available');
|
|
228
|
+
}
|
|
229
|
+
const balance = await this.provider.getBalance(addr);
|
|
230
|
+
return ethers.formatEther(balance);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Get current network configuration.
|
|
235
|
+
* @returns {Object} Network configuration object
|
|
236
|
+
* @throws {Error} If not initialized
|
|
237
|
+
*/
|
|
238
|
+
getNetworkConfig() {
|
|
239
|
+
this._requireInitialized();
|
|
240
|
+
return getNetwork(this.networkName);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Get current chain ID.
|
|
245
|
+
* @returns {number} Chain ID as number
|
|
246
|
+
* @throws {Error} If not initialized
|
|
247
|
+
*/
|
|
248
|
+
getChainId() {
|
|
249
|
+
this._requireInitialized();
|
|
250
|
+
return Number(this.network.chainId);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Check if connected to the expected network.
|
|
255
|
+
* @param {string} expectedNetwork - Expected network name
|
|
256
|
+
* @returns {boolean} True if on expected network
|
|
257
|
+
*/
|
|
258
|
+
isOnNetwork(expectedNetwork) {
|
|
259
|
+
if (!this._initialized) return false;
|
|
260
|
+
const expected = getNetwork(expectedNetwork);
|
|
261
|
+
if (!expected) return false;
|
|
262
|
+
return this.getChainId() === expected.chainId;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Create a contract instance.
|
|
267
|
+
* @param {string} address - Contract address
|
|
268
|
+
* @param {Array} abi - Contract ABI
|
|
269
|
+
* @param {boolean} [useSigner=true] - Use signer for write operations
|
|
270
|
+
* @returns {Promise<Object>} Ethers.js Contract instance
|
|
271
|
+
* @throws {Error} If not initialized
|
|
272
|
+
*/
|
|
273
|
+
async getContract(address, abi, useSigner = true) {
|
|
274
|
+
this._requireInitialized();
|
|
275
|
+
const ethers = await this._loadEthers();
|
|
276
|
+
const signerOrProvider = useSigner && this.signer ? this.signer : this.provider;
|
|
277
|
+
return new ethers.Contract(address, abi, signerOrProvider);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Deploy a contract.
|
|
282
|
+
* @param {Array} abi - Contract ABI
|
|
283
|
+
* @param {string} bytecode - Contract bytecode
|
|
284
|
+
* @param {Array} [constructorArgs=[]] - Constructor arguments
|
|
285
|
+
* @returns {Promise<{contract: Object, address: string, deployTx: Object, txHash: string}>} Deployment details
|
|
286
|
+
* @throws {Error} If not initialized or no signer available
|
|
287
|
+
*/
|
|
288
|
+
async deployContract(abi, bytecode, constructorArgs = []) {
|
|
289
|
+
this._requireInitialized();
|
|
290
|
+
if (!this.signer) {
|
|
291
|
+
throw new Error('Signer required for contract deployment');
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const ethers = await this._loadEthers();
|
|
295
|
+
const factory = new ethers.ContractFactory(abi, bytecode, this.signer);
|
|
296
|
+
const contract = await factory.deploy(...constructorArgs);
|
|
297
|
+
|
|
298
|
+
// Wait for deployment
|
|
299
|
+
await contract.waitForDeployment();
|
|
300
|
+
const address = await contract.getAddress();
|
|
301
|
+
const deployTx = contract.deploymentTransaction();
|
|
302
|
+
|
|
303
|
+
return {
|
|
304
|
+
contract,
|
|
305
|
+
address,
|
|
306
|
+
deployTx,
|
|
307
|
+
txHash: deployTx?.hash
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Wait for a transaction to be mined.
|
|
313
|
+
* @param {string} txHash - Transaction hash
|
|
314
|
+
* @param {number} [confirmations=1] - Number of confirmations to wait for
|
|
315
|
+
* @returns {Promise<Object>} Transaction receipt
|
|
316
|
+
* @throws {Error} If not initialized
|
|
317
|
+
*/
|
|
318
|
+
async waitForTransaction(txHash, confirmations = 1) {
|
|
319
|
+
this._requireInitialized();
|
|
320
|
+
return this.provider.waitForTransaction(txHash, confirmations);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Estimate gas for a transaction.
|
|
325
|
+
* @param {Object} tx - Transaction object
|
|
326
|
+
* @returns {Promise<bigint>} Estimated gas amount
|
|
327
|
+
* @throws {Error} If not initialized
|
|
328
|
+
*/
|
|
329
|
+
async estimateGas(tx) {
|
|
330
|
+
this._requireInitialized();
|
|
331
|
+
return this.provider.estimateGas(tx);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Get current gas price and fee data.
|
|
336
|
+
* @returns {Promise<{gasPrice: string|null, maxFeePerGas: string|null, maxPriorityFeePerGas: string|null}>} Fee data in gwei
|
|
337
|
+
* @throws {Error} If not initialized
|
|
338
|
+
*/
|
|
339
|
+
async getGasPrice() {
|
|
340
|
+
this._requireInitialized();
|
|
341
|
+
const ethers = await this._loadEthers();
|
|
342
|
+
const feeData = await this.provider.getFeeData();
|
|
343
|
+
return {
|
|
344
|
+
gasPrice: feeData.gasPrice ? ethers.formatUnits(feeData.gasPrice, 'gwei') : null,
|
|
345
|
+
maxFeePerGas: feeData.maxFeePerGas ? ethers.formatUnits(feeData.maxFeePerGas, 'gwei') : null,
|
|
346
|
+
maxPriorityFeePerGas: feeData.maxPriorityFeePerGas ? ethers.formatUnits(feeData.maxPriorityFeePerGas, 'gwei') : null
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Parse units (e.g., ETH to wei).
|
|
352
|
+
* @param {string|number} value - Value to parse
|
|
353
|
+
* @param {string|number} [unit='ether'] - Unit name or decimals
|
|
354
|
+
* @returns {Promise<bigint>} Parsed value as bigint
|
|
355
|
+
*/
|
|
356
|
+
async parseUnits(value, unit = 'ether') {
|
|
357
|
+
const ethers = await this._loadEthers();
|
|
358
|
+
return ethers.parseUnits(value.toString(), unit);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Format units (e.g., wei to ETH).
|
|
363
|
+
* @param {bigint|string} value - Value to format
|
|
364
|
+
* @param {string|number} [unit='ether'] - Unit name or decimals
|
|
365
|
+
* @returns {Promise<string>} Formatted value as decimal string
|
|
366
|
+
*/
|
|
367
|
+
async formatUnits(value, unit = 'ether') {
|
|
368
|
+
const ethers = await this._loadEthers();
|
|
369
|
+
return ethers.formatUnits(value, unit);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Check if manager is initialized.
|
|
374
|
+
* @private
|
|
375
|
+
* @throws {Error} If not initialized
|
|
376
|
+
*/
|
|
377
|
+
_requireInitialized() {
|
|
378
|
+
if (!this._initialized) {
|
|
379
|
+
throw new Error('ChainManager not initialized. Call connect() or connectBrowser() first.');
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Check if connected to a network.
|
|
385
|
+
* @returns {boolean} True if connected
|
|
386
|
+
*/
|
|
387
|
+
isConnected() {
|
|
388
|
+
return this._initialized && this.provider !== null;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Disconnect and clean up resources.
|
|
393
|
+
*/
|
|
394
|
+
disconnect() {
|
|
395
|
+
this.provider = null;
|
|
396
|
+
this.signer = null;
|
|
397
|
+
this.network = null;
|
|
398
|
+
this.networkName = null;
|
|
399
|
+
this._initialized = false;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
export default ChainManager;
|