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,638 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Contract query utilities for reading contract state.
|
|
3
|
+
* Provides read-only queries for zones, splits, appreciation, members, balances, and more.
|
|
4
|
+
* @module contracts/queries
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { ethers } from 'ethers';
|
|
8
|
+
// Import ABIs directly to avoid circular dependency with index.js
|
|
9
|
+
import SplitterABI from './abis/Splitter.json' with { type: 'json' };
|
|
10
|
+
import ManagedABI from './abis/Managed.json' with { type: 'json' };
|
|
11
|
+
import ZonedABI from './abis/Zoned.json' with { type: 'json' };
|
|
12
|
+
import AppreciativeABI from './abis/Appreciative.json' with { type: 'json' };
|
|
13
|
+
import BundleABI from './abis/Bundle.json' with { type: 'json' };
|
|
14
|
+
import HolonsABI from './abis/Holons.json' with { type: 'json' };
|
|
15
|
+
|
|
16
|
+
const ContractABIs = {
|
|
17
|
+
Splitter: SplitterABI,
|
|
18
|
+
Managed: ManagedABI,
|
|
19
|
+
Zoned: ZonedABI,
|
|
20
|
+
Appreciative: AppreciativeABI,
|
|
21
|
+
Bundle: BundleABI,
|
|
22
|
+
Holons: HolonsABI
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Helper to format wei to ETH.
|
|
27
|
+
* @private
|
|
28
|
+
* @param {bigint} wei - Wei amount
|
|
29
|
+
* @returns {string} ETH as decimal string
|
|
30
|
+
*/
|
|
31
|
+
function formatEth(wei) {
|
|
32
|
+
return ethers.formatEther(wei);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Helper to format wei to ETH as number.
|
|
37
|
+
* @private
|
|
38
|
+
* @param {bigint} wei - Wei amount
|
|
39
|
+
* @returns {number} ETH as number
|
|
40
|
+
*/
|
|
41
|
+
function formatEthNumber(wei) {
|
|
42
|
+
return Number(ethers.formatEther(wei));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Query utilities for all Holosphere contract types.
|
|
47
|
+
* Provides read-only access to contract state without requiring a signer.
|
|
48
|
+
* @class
|
|
49
|
+
*/
|
|
50
|
+
export class ContractQueries {
|
|
51
|
+
/**
|
|
52
|
+
* Create a new ContractQueries instance.
|
|
53
|
+
* @param {Object} provider - Ethers.js provider instance
|
|
54
|
+
*/
|
|
55
|
+
constructor(provider) {
|
|
56
|
+
this.provider = provider;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Get a contract instance with the appropriate ABI.
|
|
61
|
+
* @param {string} address - Contract address
|
|
62
|
+
* @param {string} flavor - Contract flavor (Splitter, Managed, Zoned, Appreciative, Bundle, Holons)
|
|
63
|
+
* @returns {Object} Ethers.js Contract instance
|
|
64
|
+
* @throws {Error} If unknown contract flavor
|
|
65
|
+
*/
|
|
66
|
+
getContract(address, flavor) {
|
|
67
|
+
const abi = ContractABIs[flavor];
|
|
68
|
+
if (!abi) {
|
|
69
|
+
throw new Error(`Unknown contract flavor: ${flavor}`);
|
|
70
|
+
}
|
|
71
|
+
return new ethers.Contract(address, abi, this.provider);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Auto-detect contract flavor by calling flavor() method.
|
|
76
|
+
* @param {string} address - Contract address
|
|
77
|
+
* @returns {Promise<string>} Contract flavor or 'Unknown'
|
|
78
|
+
*/
|
|
79
|
+
async detectFlavor(address) {
|
|
80
|
+
// Try with a minimal ABI that has flavor()
|
|
81
|
+
const minAbi = [
|
|
82
|
+
'function flavor() view returns (string)',
|
|
83
|
+
'function version() view returns (string)'
|
|
84
|
+
];
|
|
85
|
+
const contract = new ethers.Contract(address, minAbi, this.provider);
|
|
86
|
+
try {
|
|
87
|
+
return await contract.flavor();
|
|
88
|
+
} catch {
|
|
89
|
+
return 'Unknown';
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ==================== COMMON QUERIES ====================
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Get basic contract information.
|
|
97
|
+
* @param {string} address - Contract address
|
|
98
|
+
* @param {string} flavor - Contract flavor
|
|
99
|
+
* @returns {Promise<{address: string, name: string, flavor: string, version: string, creator: string, memberCount: number}>} Contract info
|
|
100
|
+
*/
|
|
101
|
+
async getContractInfo(address, flavor) {
|
|
102
|
+
const contract = this.getContract(address, flavor);
|
|
103
|
+
const [name, contractFlavor, version, creator, size] = await Promise.all([
|
|
104
|
+
contract.name().catch(() => ''),
|
|
105
|
+
contract.flavor().catch(() => flavor),
|
|
106
|
+
contract.version().catch(() => ''),
|
|
107
|
+
contract.creator().catch(() => ethers.ZeroAddress),
|
|
108
|
+
contract.getSize().catch(() => 0n)
|
|
109
|
+
]);
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
address,
|
|
113
|
+
name,
|
|
114
|
+
flavor: contractFlavor,
|
|
115
|
+
version,
|
|
116
|
+
creator,
|
|
117
|
+
memberCount: Number(size)
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Get all member user IDs.
|
|
123
|
+
* @param {string} address - Contract address
|
|
124
|
+
* @param {string} flavor - Contract flavor
|
|
125
|
+
* @returns {Promise<string[]>} Array of user IDs
|
|
126
|
+
*/
|
|
127
|
+
async getMembers(address, flavor) {
|
|
128
|
+
const contract = this.getContract(address, flavor);
|
|
129
|
+
const size = await contract.getSize();
|
|
130
|
+
const members = [];
|
|
131
|
+
for (let i = 0; i < size; i++) {
|
|
132
|
+
const userId = await contract.userIds(i);
|
|
133
|
+
members.push(userId);
|
|
134
|
+
}
|
|
135
|
+
return members;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Get user's ETH balance in the contract.
|
|
140
|
+
* @param {string} address - Contract address
|
|
141
|
+
* @param {string} flavor - Contract flavor
|
|
142
|
+
* @param {string} userId - User identifier
|
|
143
|
+
* @returns {Promise<{wei: string, eth: number}>} Balance in wei and ETH
|
|
144
|
+
*/
|
|
145
|
+
async getUserEthBalance(address, flavor, userId) {
|
|
146
|
+
const contract = this.getContract(address, flavor);
|
|
147
|
+
const balance = await contract.etherBalance(userId);
|
|
148
|
+
return {
|
|
149
|
+
wei: balance.toString(),
|
|
150
|
+
eth: formatEthNumber(balance)
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Get user's ERC20 token balance in the contract.
|
|
156
|
+
* @param {string} address - Contract address
|
|
157
|
+
* @param {string} flavor - Contract flavor
|
|
158
|
+
* @param {string} userId - User identifier
|
|
159
|
+
* @param {string} tokenAddress - ERC20 token address
|
|
160
|
+
* @returns {Promise<{wei: string, formatted: number}>} Token balance
|
|
161
|
+
*/
|
|
162
|
+
async getUserTokenBalance(address, flavor, userId, tokenAddress) {
|
|
163
|
+
const contract = this.getContract(address, flavor);
|
|
164
|
+
const balance = await contract.tokenBalance(userId, tokenAddress);
|
|
165
|
+
return {
|
|
166
|
+
wei: balance.toString(),
|
|
167
|
+
formatted: formatEthNumber(balance)
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Get total deposited amount for a token.
|
|
173
|
+
* @param {string} address - Contract address
|
|
174
|
+
* @param {string} flavor - Contract flavor
|
|
175
|
+
* @param {string} [tokenAddress] - Token address (defaults to ETH/zero address)
|
|
176
|
+
* @returns {Promise<{wei: string, formatted: number}>} Total deposited
|
|
177
|
+
*/
|
|
178
|
+
async getTotalDeposited(address, flavor, tokenAddress) {
|
|
179
|
+
const contract = this.getContract(address, flavor);
|
|
180
|
+
// For ETH, use address(0)
|
|
181
|
+
const token = tokenAddress || ethers.ZeroAddress;
|
|
182
|
+
const total = await contract.totalDeposited(token);
|
|
183
|
+
return {
|
|
184
|
+
wei: total.toString(),
|
|
185
|
+
formatted: formatEthNumber(total)
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Check if user has claimed their rewards.
|
|
191
|
+
* @param {string} address - Contract address
|
|
192
|
+
* @param {string} flavor - Contract flavor
|
|
193
|
+
* @param {string} userId - User identifier
|
|
194
|
+
* @returns {Promise<boolean>} True if claimed
|
|
195
|
+
*/
|
|
196
|
+
async hasClaimed(address, flavor, userId) {
|
|
197
|
+
const contract = this.getContract(address, flavor);
|
|
198
|
+
return contract.hasClaimed(userId);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// ==================== SPLITTER QUERIES ====================
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Get Splitter's internal/external split configuration
|
|
205
|
+
*/
|
|
206
|
+
async getSplitterSplit(address) {
|
|
207
|
+
const contract = this.getContract(address, 'Splitter');
|
|
208
|
+
const [internal, external] = await Promise.all([
|
|
209
|
+
contract.internalContractSplitPercentage(),
|
|
210
|
+
contract.externalContractSplitPercentage()
|
|
211
|
+
]);
|
|
212
|
+
return {
|
|
213
|
+
internalPercentage: Number(internal),
|
|
214
|
+
externalPercentage: Number(external),
|
|
215
|
+
internalPercent: Number(internal) / 100,
|
|
216
|
+
externalPercent: Number(external) / 100
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Get Splitter's child contracts
|
|
222
|
+
*/
|
|
223
|
+
async getSplitterChildren(address) {
|
|
224
|
+
const contract = this.getContract(address, 'Splitter');
|
|
225
|
+
const [keys, addresses] = await contract.getContractAddresses();
|
|
226
|
+
const children = [];
|
|
227
|
+
for (let i = 0; i < keys.length; i++) {
|
|
228
|
+
children.push({
|
|
229
|
+
key: keys[i],
|
|
230
|
+
address: addresses[i]
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
return children;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Get user's percentage split in Splitter
|
|
238
|
+
*/
|
|
239
|
+
async getSplitterUserPercentage(address, userId) {
|
|
240
|
+
const contract = this.getContract(address, 'Splitter');
|
|
241
|
+
const pct = await contract.percentages(userId);
|
|
242
|
+
return {
|
|
243
|
+
basisPoints: Number(pct),
|
|
244
|
+
percent: Number(pct) / 100
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Get all member percentages in Splitter
|
|
250
|
+
*/
|
|
251
|
+
async getSplitterAllPercentages(address) {
|
|
252
|
+
const members = await this.getMembers(address, 'Splitter');
|
|
253
|
+
const contract = this.getContract(address, 'Splitter');
|
|
254
|
+
const results = [];
|
|
255
|
+
for (const userId of members) {
|
|
256
|
+
const pct = await contract.percentages(userId);
|
|
257
|
+
results.push({
|
|
258
|
+
userId,
|
|
259
|
+
basisPoints: Number(pct),
|
|
260
|
+
percent: Number(pct) / 100
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
return results;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// ==================== ZONED QUERIES ====================
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Get Zoned contract configuration
|
|
270
|
+
*/
|
|
271
|
+
async getZonedConfig(address) {
|
|
272
|
+
const contract = this.getContract(address, 'Zoned');
|
|
273
|
+
const [nzones, a, b, c] = await Promise.all([
|
|
274
|
+
contract.nzones(),
|
|
275
|
+
contract.a(),
|
|
276
|
+
contract.b(),
|
|
277
|
+
contract.c()
|
|
278
|
+
]);
|
|
279
|
+
return {
|
|
280
|
+
numberOfZones: Number(nzones),
|
|
281
|
+
rewardFunction: {
|
|
282
|
+
a: Number(a),
|
|
283
|
+
b: Number(b),
|
|
284
|
+
c: Number(c)
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Get user's zone assignment
|
|
291
|
+
*/
|
|
292
|
+
async getUserZone(address, userId) {
|
|
293
|
+
const contract = this.getContract(address, 'Zoned');
|
|
294
|
+
const zone = await contract.zone(userId);
|
|
295
|
+
return Number(zone);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Get all members in a specific zone
|
|
300
|
+
*/
|
|
301
|
+
async getZoneMembers(address, zoneNumber) {
|
|
302
|
+
const contract = this.getContract(address, 'Zoned');
|
|
303
|
+
return contract.getZoneMembers(zoneNumber);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Get complete zone breakdown
|
|
308
|
+
*/
|
|
309
|
+
async getZonedBreakdown(address) {
|
|
310
|
+
const config = await this.getZonedConfig(address);
|
|
311
|
+
const contract = this.getContract(address, 'Zoned');
|
|
312
|
+
const zones = [];
|
|
313
|
+
|
|
314
|
+
for (let z = 1; z <= config.numberOfZones; z++) {
|
|
315
|
+
const members = await contract.getZoneMembers(z);
|
|
316
|
+
zones.push({
|
|
317
|
+
zone: z,
|
|
318
|
+
members,
|
|
319
|
+
memberCount: members.length
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Also get calculated rewards
|
|
324
|
+
const rewards = await contract.calculateRewards();
|
|
325
|
+
const rewardsByZone = rewards.map((r, i) => ({
|
|
326
|
+
zone: i + 1,
|
|
327
|
+
weight: Number(r)
|
|
328
|
+
}));
|
|
329
|
+
|
|
330
|
+
return {
|
|
331
|
+
config,
|
|
332
|
+
zones,
|
|
333
|
+
rewardWeights: rewardsByZone
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// ==================== MANAGED QUERIES ====================
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Get Managed contract appreciation info
|
|
341
|
+
*/
|
|
342
|
+
async getManagedAppreciation(address, userId) {
|
|
343
|
+
const contract = this.getContract(address, 'Managed');
|
|
344
|
+
const appreciation = await contract.appreciation(userId);
|
|
345
|
+
const totalAppreciation = await contract.totalappreciation();
|
|
346
|
+
return {
|
|
347
|
+
userAppreciation: Number(appreciation),
|
|
348
|
+
totalAppreciation: Number(totalAppreciation),
|
|
349
|
+
sharePercent: Number(totalAppreciation) > 0
|
|
350
|
+
? (Number(appreciation) / Number(totalAppreciation)) * 100
|
|
351
|
+
: 0
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Get all member appreciation in Managed contract
|
|
357
|
+
*/
|
|
358
|
+
async getManagedAllAppreciation(address) {
|
|
359
|
+
const members = await this.getMembers(address, 'Managed');
|
|
360
|
+
const contract = this.getContract(address, 'Managed');
|
|
361
|
+
const totalAppreciation = await contract.totalappreciation();
|
|
362
|
+
const maxAppreciation = await contract.maxAppreciation().catch(() => 0n);
|
|
363
|
+
|
|
364
|
+
const results = [];
|
|
365
|
+
for (const userId of members) {
|
|
366
|
+
const appreciation = await contract.appreciation(userId);
|
|
367
|
+
results.push({
|
|
368
|
+
userId,
|
|
369
|
+
appreciation: Number(appreciation),
|
|
370
|
+
sharePercent: Number(totalAppreciation) > 0
|
|
371
|
+
? (Number(appreciation) / Number(totalAppreciation)) * 100
|
|
372
|
+
: 0
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
return {
|
|
377
|
+
members: results,
|
|
378
|
+
totalAppreciation: Number(totalAppreciation),
|
|
379
|
+
maxAppreciation: Number(maxAppreciation)
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// ==================== APPRECIATIVE QUERIES ====================
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Get Appreciative contract peer appreciation
|
|
387
|
+
*/
|
|
388
|
+
async getAppreciativePeer(address, userId) {
|
|
389
|
+
const contract = this.getContract(address, 'Appreciative');
|
|
390
|
+
const [appreciation, remaining, totalAppreciation] = await Promise.all([
|
|
391
|
+
contract.appreciation(userId),
|
|
392
|
+
contract.remainingappreciation(userId),
|
|
393
|
+
contract.totalappreciation()
|
|
394
|
+
]);
|
|
395
|
+
return {
|
|
396
|
+
received: Number(appreciation),
|
|
397
|
+
remainingToGive: Number(remaining),
|
|
398
|
+
totalPool: Number(totalAppreciation),
|
|
399
|
+
sharePercent: Number(totalAppreciation) > 0
|
|
400
|
+
? (Number(appreciation) / Number(totalAppreciation)) * 100
|
|
401
|
+
: 0
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Get all peer appreciation in Appreciative contract
|
|
407
|
+
*/
|
|
408
|
+
async getAppreciativeAll(address) {
|
|
409
|
+
const members = await this.getMembers(address, 'Appreciative');
|
|
410
|
+
const contract = this.getContract(address, 'Appreciative');
|
|
411
|
+
const totalAppreciation = await contract.totalappreciation();
|
|
412
|
+
|
|
413
|
+
const results = [];
|
|
414
|
+
for (const userId of members) {
|
|
415
|
+
const [appreciation, remaining] = await Promise.all([
|
|
416
|
+
contract.appreciation(userId),
|
|
417
|
+
contract.remainingappreciation(userId)
|
|
418
|
+
]);
|
|
419
|
+
results.push({
|
|
420
|
+
userId,
|
|
421
|
+
received: Number(appreciation),
|
|
422
|
+
remainingToGive: Number(remaining),
|
|
423
|
+
sharePercent: Number(totalAppreciation) > 0
|
|
424
|
+
? (Number(appreciation) / Number(totalAppreciation)) * 100
|
|
425
|
+
: 0
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
return {
|
|
430
|
+
members: results,
|
|
431
|
+
totalAppreciation: Number(totalAppreciation)
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// ==================== BUNDLE QUERIES ====================
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Get Bundle contract configuration
|
|
439
|
+
*/
|
|
440
|
+
async getBundleConfig(address) {
|
|
441
|
+
const contract = this.getContract(address, 'Bundle');
|
|
442
|
+
const [steepness, nzones, interiorPct, exteriorPct, electionActive] = await Promise.all([
|
|
443
|
+
contract.steepness(),
|
|
444
|
+
contract.nzones(),
|
|
445
|
+
contract.interiorPercentage(),
|
|
446
|
+
contract.exteriorPercentage(),
|
|
447
|
+
contract.electionActive()
|
|
448
|
+
]);
|
|
449
|
+
|
|
450
|
+
return {
|
|
451
|
+
steepness: Number(steepness),
|
|
452
|
+
numberOfZones: Number(nzones),
|
|
453
|
+
interiorPercentage: Number(interiorPct) / 100, // Basis points to percent
|
|
454
|
+
exteriorPercentage: Number(exteriorPct) / 100,
|
|
455
|
+
electionActive
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Get Bundle interior/exterior split
|
|
461
|
+
*/
|
|
462
|
+
async getBundleSplit(address) {
|
|
463
|
+
const contract = this.getContract(address, 'Bundle');
|
|
464
|
+
const [interior, exterior] = await Promise.all([
|
|
465
|
+
contract.interiorPercentage(),
|
|
466
|
+
contract.exteriorPercentage()
|
|
467
|
+
]);
|
|
468
|
+
return {
|
|
469
|
+
interiorBasisPoints: Number(interior),
|
|
470
|
+
exteriorBasisPoints: Number(exterior),
|
|
471
|
+
interiorPercent: Number(interior) / 100,
|
|
472
|
+
exteriorPercent: Number(exterior) / 100
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Get Bundle zone weights
|
|
478
|
+
*/
|
|
479
|
+
async getBundleZoneWeights(address) {
|
|
480
|
+
const contract = this.getContract(address, 'Bundle');
|
|
481
|
+
const weights = await contract.getZoneWeights();
|
|
482
|
+
return weights.map((w, i) => ({
|
|
483
|
+
zone: i + 1,
|
|
484
|
+
weight: Number(w)
|
|
485
|
+
}));
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/**
|
|
489
|
+
* Get Bundle user's zone and interior share
|
|
490
|
+
*/
|
|
491
|
+
async getBundleUserInfo(address, userId) {
|
|
492
|
+
const contract = this.getContract(address, 'Bundle');
|
|
493
|
+
const [zone, interiorShare, isInterior, isExterior, isMember] = await Promise.all([
|
|
494
|
+
contract.zone(userId),
|
|
495
|
+
contract.interiorShare(userId),
|
|
496
|
+
contract.isInteriorMember(userId),
|
|
497
|
+
contract.isExteriorMember(userId),
|
|
498
|
+
contract.isBundleMember(userId)
|
|
499
|
+
]);
|
|
500
|
+
return {
|
|
501
|
+
zone: Number(zone),
|
|
502
|
+
interiorShareBasisPoints: Number(interiorShare),
|
|
503
|
+
interiorSharePercent: Number(interiorShare) / 100,
|
|
504
|
+
isInteriorMember: isInterior,
|
|
505
|
+
isExteriorMember: isExterior,
|
|
506
|
+
isMember
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
/**
|
|
511
|
+
* Get Bundle interior members
|
|
512
|
+
*/
|
|
513
|
+
async getBundleInteriorMembers(address) {
|
|
514
|
+
const contract = this.getContract(address, 'Bundle');
|
|
515
|
+
return contract.getInteriorMembers();
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
* Get Bundle zone breakdown (exterior)
|
|
520
|
+
*/
|
|
521
|
+
async getBundleZoneBreakdown(address) {
|
|
522
|
+
const config = await this.getBundleConfig(address);
|
|
523
|
+
const contract = this.getContract(address, 'Bundle');
|
|
524
|
+
const zones = [];
|
|
525
|
+
|
|
526
|
+
for (let z = 1; z <= config.numberOfZones; z++) {
|
|
527
|
+
const members = await contract.getZoneMembers(z);
|
|
528
|
+
zones.push({
|
|
529
|
+
zone: z,
|
|
530
|
+
members,
|
|
531
|
+
memberCount: members.length
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
return {
|
|
536
|
+
config,
|
|
537
|
+
zones,
|
|
538
|
+
zoneWeights: await this.getBundleZoneWeights(address)
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/**
|
|
543
|
+
* Get Bundle election info
|
|
544
|
+
*/
|
|
545
|
+
async getBundleElection(address) {
|
|
546
|
+
const contract = this.getContract(address, 'Bundle');
|
|
547
|
+
const [electionActive, candidates] = await Promise.all([
|
|
548
|
+
contract.electionActive(),
|
|
549
|
+
contract.getCandidates()
|
|
550
|
+
]);
|
|
551
|
+
|
|
552
|
+
if (!electionActive) {
|
|
553
|
+
return { active: false, candidates: [] };
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
const candidateInfo = [];
|
|
557
|
+
for (const candidate of candidates) {
|
|
558
|
+
const votes = await contract.votes(candidate);
|
|
559
|
+
candidateInfo.push({
|
|
560
|
+
userId: candidate,
|
|
561
|
+
votes: Number(votes)
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
return {
|
|
566
|
+
active: true,
|
|
567
|
+
candidates: candidateInfo.sort((a, b) => b.votes - a.votes)
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
// ==================== FULL SNAPSHOT ====================
|
|
572
|
+
|
|
573
|
+
/**
|
|
574
|
+
* Get complete contract state snapshot including all members and configuration.
|
|
575
|
+
* @param {string} address - Contract address
|
|
576
|
+
* @returns {Promise<Object>} Complete contract state
|
|
577
|
+
*/
|
|
578
|
+
async getFullSnapshot(address) {
|
|
579
|
+
const flavor = await this.detectFlavor(address);
|
|
580
|
+
const info = await this.getContractInfo(address, flavor);
|
|
581
|
+
const members = await this.getMembers(address, flavor);
|
|
582
|
+
|
|
583
|
+
const snapshot = {
|
|
584
|
+
...info,
|
|
585
|
+
members,
|
|
586
|
+
memberDetails: []
|
|
587
|
+
};
|
|
588
|
+
|
|
589
|
+
// Get member-specific details
|
|
590
|
+
for (const userId of members) {
|
|
591
|
+
const balance = await this.getUserEthBalance(address, flavor, userId);
|
|
592
|
+
const claimed = await this.hasClaimed(address, flavor, userId);
|
|
593
|
+
|
|
594
|
+
const memberDetail = {
|
|
595
|
+
userId,
|
|
596
|
+
ethBalance: balance,
|
|
597
|
+
hasClaimed: claimed
|
|
598
|
+
};
|
|
599
|
+
|
|
600
|
+
// Flavor-specific details
|
|
601
|
+
if (flavor === 'Splitter') {
|
|
602
|
+
const pct = await this.getSplitterUserPercentage(address, userId);
|
|
603
|
+
memberDetail.percentage = pct;
|
|
604
|
+
} else if (flavor === 'Zoned') {
|
|
605
|
+
memberDetail.zone = await this.getUserZone(address, userId);
|
|
606
|
+
} else if (flavor === 'Managed') {
|
|
607
|
+
memberDetail.appreciation = await this.getManagedAppreciation(address, userId);
|
|
608
|
+
} else if (flavor === 'Appreciative') {
|
|
609
|
+
memberDetail.appreciation = await this.getAppreciativePeer(address, userId);
|
|
610
|
+
} else if (flavor === 'Bundle') {
|
|
611
|
+
memberDetail.bundleInfo = await this.getBundleUserInfo(address, userId);
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
snapshot.memberDetails.push(memberDetail);
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
// Add flavor-specific configuration
|
|
618
|
+
if (flavor === 'Splitter') {
|
|
619
|
+
snapshot.split = await this.getSplitterSplit(address);
|
|
620
|
+
snapshot.children = await this.getSplitterChildren(address);
|
|
621
|
+
} else if (flavor === 'Zoned') {
|
|
622
|
+
snapshot.zoneConfig = await this.getZonedBreakdown(address);
|
|
623
|
+
} else if (flavor === 'Managed') {
|
|
624
|
+
snapshot.appreciationSummary = await this.getManagedAllAppreciation(address);
|
|
625
|
+
} else if (flavor === 'Appreciative') {
|
|
626
|
+
snapshot.appreciationSummary = await this.getAppreciativeAll(address);
|
|
627
|
+
} else if (flavor === 'Bundle') {
|
|
628
|
+
snapshot.bundleConfig = await this.getBundleConfig(address);
|
|
629
|
+
snapshot.bundleSplit = await this.getBundleSplit(address);
|
|
630
|
+
snapshot.bundleZones = await this.getBundleZoneBreakdown(address);
|
|
631
|
+
snapshot.election = await this.getBundleElection(address);
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
return snapshot;
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
export default ContractQueries;
|