holosphere 2.0.0-alpha1 → 2.0.0-alpha4
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/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/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-BB_vVJgv.cjs +5 -0
- package/dist/index-BB_vVJgv.cjs.map +1 -0
- package/dist/index-CBitK71M.cjs +12 -0
- package/dist/index-CBitK71M.cjs.map +1 -0
- package/dist/index-CV0eOogK.js +37423 -0
- package/dist/index-CV0eOogK.js.map +1 -0
- package/dist/index-Cz-PLCUR.js +15104 -0
- package/dist/index-Cz-PLCUR.js.map +1 -0
- package/dist/indexeddb-storage-CRsZyB2f.cjs +2 -0
- package/dist/indexeddb-storage-CRsZyB2f.cjs.map +1 -0
- package/dist/indexeddb-storage-DZaGlY_a.js +132 -0
- package/dist/indexeddb-storage-DZaGlY_a.js.map +1 -0
- package/dist/memory-storage-BkUi6sZG.js +51 -0
- package/dist/memory-storage-BkUi6sZG.js.map +1 -0
- package/dist/memory-storage-C0DuUsdY.cjs +2 -0
- package/dist/memory-storage-C0DuUsdY.cjs.map +1 -0
- package/dist/secp256k1-0kPdAVkK.cjs +12 -0
- package/dist/secp256k1-0kPdAVkK.cjs.map +1 -0
- package/dist/secp256k1-DN4FVXcv.js +1890 -0
- package/dist/secp256k1-DN4FVXcv.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/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/package.json +10 -5
- package/src/contracts/abis/Appreciative.json +1280 -0
- package/src/contracts/abis/AppreciativeFactory.json +101 -0
- package/src/contracts/abis/Bundle.json +1435 -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 +375 -0
- package/src/contracts/deployer.js +443 -0
- package/src/contracts/event-listener.js +507 -0
- package/src/contracts/holon-contracts.js +344 -0
- package/src/contracts/index.js +83 -0
- package/src/contracts/networks.js +224 -0
- package/src/contracts/operations.js +670 -0
- package/src/contracts/queries.js +589 -0
- package/src/core/holosphere.js +453 -1
- package/src/crypto/nostr-utils.js +263 -0
- package/src/federation/handshake.js +455 -0
- package/src/federation/hologram.js +1 -1
- package/src/hierarchical/upcast.js +6 -5
- package/src/index.js +463 -1939
- package/src/lib/ai-methods.js +308 -0
- package/src/lib/contract-methods.js +293 -0
- package/src/lib/errors.js +23 -0
- package/src/lib/federation-methods.js +238 -0
- package/src/lib/index.js +26 -0
- package/src/spatial/h3-operations.js +2 -2
- package/src/storage/backends/gundb-backend.js +377 -46
- package/src/storage/global-tables.js +28 -1
- package/src/storage/gun-auth.js +303 -0
- package/src/storage/gun-federation.js +776 -0
- package/src/storage/gun-references.js +198 -0
- package/src/storage/gun-schema.js +291 -0
- package/src/storage/gun-wrapper.js +347 -31
- package/src/storage/indexeddb-storage.js +49 -11
- package/src/storage/memory-storage.js +5 -0
- package/src/storage/nostr-async.js +45 -23
- package/src/storage/nostr-client.js +11 -5
- package/src/storage/persistent-storage.js +6 -1
- package/src/storage/unified-storage.js +119 -0
- package/src/subscriptions/manager.js +1 -1
- package/types/index.d.ts +133 -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
|
@@ -0,0 +1,797 @@
|
|
|
1
|
+
# Holosphere Smart Contracts Integration
|
|
2
|
+
|
|
3
|
+
This guide covers the smart contracts module in Holosphere, enabling fractal fund distribution where every holon can become a recipient of ETH/ERC20 tokens.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
1. [Overview](#overview)
|
|
8
|
+
2. [Quick Start](#quick-start)
|
|
9
|
+
3. [Contract Types](#contract-types)
|
|
10
|
+
4. [1-Click Deployment](#1-click-deployment)
|
|
11
|
+
5. [Per-Holon Contracts](#per-holon-contracts)
|
|
12
|
+
6. [All Contract Operations](#all-contract-operations)
|
|
13
|
+
7. [Multi-Chain Support](#multi-chain-support)
|
|
14
|
+
8. [Examples](#examples)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Overview
|
|
19
|
+
|
|
20
|
+
The contracts module integrates a hierarchical fund distribution system into Holosphere:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
┌─────────────────────┐
|
|
24
|
+
│ Funds Received │
|
|
25
|
+
│ (ETH or ERC20) │
|
|
26
|
+
└──────────┬──────────┘
|
|
27
|
+
│
|
|
28
|
+
┌──────────▼──────────┐
|
|
29
|
+
│ Splitter │
|
|
30
|
+
│ (70% / 30% split) │
|
|
31
|
+
└──────────┬──────────┘
|
|
32
|
+
│
|
|
33
|
+
┌────────────────┴────────────────┐
|
|
34
|
+
│ │
|
|
35
|
+
┌─────────▼─────────┐ ┌─────────▼─────────┐
|
|
36
|
+
│ Managed │ │ Zoned │
|
|
37
|
+
│ (Appreciation) │ │ (Tier-based) │
|
|
38
|
+
└─────────┬─────────┘ └─────────┬─────────┘
|
|
39
|
+
│ │
|
|
40
|
+
┌─────────┴─────────┐ ┌─────────┴─────────┐
|
|
41
|
+
│ │ │ │
|
|
42
|
+
Alice(60%) Bob(40%) Zone3(high) Zone1(low)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Key Concepts
|
|
46
|
+
|
|
47
|
+
- **Fractal Ownership**: Each holon can have its own smart contract
|
|
48
|
+
- **String-based User IDs**: Members identified by strings (e.g., 'alice', 'telegram_12345')
|
|
49
|
+
- **Accumulated Rewards**: Funds stored until claimed (users pay claim gas)
|
|
50
|
+
- **Multiple Distribution Models**: Splitter, Managed, Zoned, Appreciative, Bundle
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Quick Start
|
|
55
|
+
|
|
56
|
+
### Initialize Contracts
|
|
57
|
+
|
|
58
|
+
```javascript
|
|
59
|
+
import HoloSphere from 'holosphere';
|
|
60
|
+
|
|
61
|
+
const hs = new HoloSphere({ appName: 'myapp' });
|
|
62
|
+
|
|
63
|
+
// Connect to network with private key
|
|
64
|
+
await hs.initContracts({
|
|
65
|
+
network: 'sepolia', // or 'polygon', 'base', etc.
|
|
66
|
+
privateKey: process.env.PRIVATE_KEY
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Or connect with browser wallet (MetaMask)
|
|
70
|
+
await hs.initContractsBrowser('polygon');
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Deploy Everything (1-Click)
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
const deployment = await hs.deployContracts({
|
|
77
|
+
testTokenSupply: '1000000' // Optional: deploy test ERC20
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
console.log(deployment);
|
|
81
|
+
// {
|
|
82
|
+
// network: 'sepolia',
|
|
83
|
+
// chainId: 11155111,
|
|
84
|
+
// contracts: {
|
|
85
|
+
// holons: '0x...', // Main registry
|
|
86
|
+
// managedFactory: '0x...',
|
|
87
|
+
// zonedFactory: '0x...',
|
|
88
|
+
// splitterFactory: '0x...',
|
|
89
|
+
// appreciativeFactory: '0x...',
|
|
90
|
+
// bundleFactory: '0x...',
|
|
91
|
+
// testToken: '0x...'
|
|
92
|
+
// }
|
|
93
|
+
// }
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Create Holon with Contract
|
|
97
|
+
|
|
98
|
+
```javascript
|
|
99
|
+
// Deploy contract for a holon
|
|
100
|
+
await hs.deployHolonContract('my_organization', 'Splitter', {
|
|
101
|
+
name: 'MyOrg',
|
|
102
|
+
splitPercentage: 70 // 70% internal, 30% external
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// Add members
|
|
106
|
+
await hs.contractAddMembers('my_organization', ['alice', 'bob', 'charlie']);
|
|
107
|
+
|
|
108
|
+
// Send funds (they're distributed automatically!)
|
|
109
|
+
await hs.contractSendEth('my_organization', '1.0');
|
|
110
|
+
|
|
111
|
+
// Members claim their rewards
|
|
112
|
+
await hs.contractClaim('my_organization', 'alice', '0xAliceWallet...');
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Contract Types
|
|
118
|
+
|
|
119
|
+
### 1. Splitter
|
|
120
|
+
|
|
121
|
+
**Purpose**: Split incoming funds between internal and external distribution
|
|
122
|
+
|
|
123
|
+
**Use Case**: Organizations with core team + external contributors
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
await hs.deployHolonContract('org', 'Splitter', { splitPercentage: 70 });
|
|
127
|
+
|
|
128
|
+
// Set split: 70% to internal (Managed), 30% to external (Zoned)
|
|
129
|
+
await hs.contractSetSplit('org', 70, 30);
|
|
130
|
+
|
|
131
|
+
// Create child contracts automatically
|
|
132
|
+
// Splitter creates: org_managed and org_zoned
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**How Rewards Flow**:
|
|
136
|
+
1. Funds sent to Splitter
|
|
137
|
+
2. 70% forwarded to Managed contract
|
|
138
|
+
3. 30% forwarded to Zoned contract
|
|
139
|
+
4. Each child distributes to its members
|
|
140
|
+
|
|
141
|
+
### 2. Managed (Appreciation-Based)
|
|
142
|
+
|
|
143
|
+
**Purpose**: Distribute funds based on admin-set appreciation weights
|
|
144
|
+
|
|
145
|
+
**Use Case**: Core teams where leadership decides contribution weights
|
|
146
|
+
|
|
147
|
+
```javascript
|
|
148
|
+
await hs.deployHolonContract('team', 'Managed');
|
|
149
|
+
|
|
150
|
+
// Add members
|
|
151
|
+
await hs.contractAddMembers('team', ['alice', 'bob', 'charlie']);
|
|
152
|
+
|
|
153
|
+
// Set appreciation weights (determines reward %)
|
|
154
|
+
await hs.contractSetAppreciation('team',
|
|
155
|
+
['alice', 'bob', 'charlie'],
|
|
156
|
+
[300, 200, 100] // Alice:50%, Bob:33%, Charlie:17%
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
// When 1 ETH is received:
|
|
160
|
+
// - Alice gets 0.5 ETH
|
|
161
|
+
// - Bob gets 0.33 ETH
|
|
162
|
+
// - Charlie gets 0.17 ETH
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**Key Points**:
|
|
166
|
+
- Only owner/bot can set appreciation
|
|
167
|
+
- Appreciation is relative (300:200:100 = 3:2:1 ratio)
|
|
168
|
+
- If no appreciation set, rewards split equally
|
|
169
|
+
|
|
170
|
+
### 3. Zoned (Tier-Based)
|
|
171
|
+
|
|
172
|
+
**Purpose**: Distribute funds based on contribution zones/tiers
|
|
173
|
+
|
|
174
|
+
**Use Case**: Communities with different contribution levels
|
|
175
|
+
|
|
176
|
+
```javascript
|
|
177
|
+
await hs.deployHolonContract('community', 'Zoned', { nZones: 5 });
|
|
178
|
+
|
|
179
|
+
// Add members and assign to zones
|
|
180
|
+
await hs.contractAddMember('community', 'alice');
|
|
181
|
+
await hs.contractAddToZone('community', 'admin', 'alice', 4); // High tier
|
|
182
|
+
|
|
183
|
+
await hs.contractAddMember('community', 'bob');
|
|
184
|
+
await hs.contractAddToZone('community', 'admin', 'bob', 2); // Medium tier
|
|
185
|
+
|
|
186
|
+
await hs.contractAddMember('community', 'charlie');
|
|
187
|
+
await hs.contractAddToZone('community', 'admin', 'charlie', 1); // Low tier
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Zone Reward Formula**:
|
|
191
|
+
```
|
|
192
|
+
reward_units = a × zone² + b × zone + c
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Default: `a=0, b=0, c=1` (equal distribution)
|
|
196
|
+
Quadratic: `a=1, b=1, c=0` (higher zones get exponentially more)
|
|
197
|
+
|
|
198
|
+
```javascript
|
|
199
|
+
// Set quadratic rewards (zone 4 gets much more than zone 1)
|
|
200
|
+
await hs.contractSetZoneParams('community', 'admin', 1, 1, 0);
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### 4. Appreciative (Peer-to-Peer)
|
|
204
|
+
|
|
205
|
+
**Purpose**: Members give appreciation to each other; rewards based on received appreciation
|
|
206
|
+
|
|
207
|
+
**Use Case**: DAOs, cooperatives, peer-evaluated teams
|
|
208
|
+
|
|
209
|
+
```javascript
|
|
210
|
+
await hs.deployHolonContract('dao', 'Appreciative');
|
|
211
|
+
|
|
212
|
+
await hs.contractAddMembers('dao', ['alice', 'bob', 'charlie']);
|
|
213
|
+
|
|
214
|
+
// Each member has 100 points to give
|
|
215
|
+
// Alice appreciates Bob's work
|
|
216
|
+
await hs.contractAppreciate('dao', 'alice', 'bob', 30);
|
|
217
|
+
|
|
218
|
+
// Bob appreciates Charlie
|
|
219
|
+
await hs.contractAppreciate('dao', 'bob', 'charlie', 50);
|
|
220
|
+
|
|
221
|
+
// Charlie appreciates Alice
|
|
222
|
+
await hs.contractAppreciate('dao', 'charlie', 'alice', 25);
|
|
223
|
+
|
|
224
|
+
// Check appreciation stats
|
|
225
|
+
const received = await hs.contractGetAppreciationReceived('dao', 'bob'); // 30
|
|
226
|
+
const given = await hs.contractGetAppreciationGiven('dao', 'alice'); // 30
|
|
227
|
+
const remaining = await hs.contractGetAppreciationRemaining('dao', 'alice'); // 70
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### 5. Bundle (2-Way Split with Governance)
|
|
231
|
+
|
|
232
|
+
**Purpose**: Advanced splitting with interior/exterior + election mechanism
|
|
233
|
+
|
|
234
|
+
**Use Case**: Complex organizations needing governance rotation
|
|
235
|
+
|
|
236
|
+
```javascript
|
|
237
|
+
await hs.deployHolonContract('project', 'Bundle', {
|
|
238
|
+
steepness: '0.5', // 50% decay per zone
|
|
239
|
+
nZones: 6
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
// Interior split (explicit percentages)
|
|
243
|
+
await hs.contractSetInteriorSplit('project',
|
|
244
|
+
['founder', 'cto'],
|
|
245
|
+
[60, 40]
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
// Exterior uses zone-based with steepness decay
|
|
249
|
+
await hs.contractSetSteepness('project', '0.7'); // 70% decay
|
|
250
|
+
|
|
251
|
+
// Governance: Run election for new owner
|
|
252
|
+
await hs.contractStartElection('project');
|
|
253
|
+
await hs.contractNominate('project'); // Caller nominates self
|
|
254
|
+
await hs.contractVote('project', '0xNomineeAddress');
|
|
255
|
+
await hs.contractFinalizeElection('project');
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 1-Click Deployment
|
|
261
|
+
|
|
262
|
+
Deploy the entire contract infrastructure with a single call:
|
|
263
|
+
|
|
264
|
+
```javascript
|
|
265
|
+
const deployment = await hs.deployContracts({
|
|
266
|
+
// Optional: bot address for member management (defaults to deployer)
|
|
267
|
+
botAddress: '0xBotAddress',
|
|
268
|
+
|
|
269
|
+
// Optional: deploy test ERC20 token
|
|
270
|
+
deployTestToken: true,
|
|
271
|
+
testTokenSupply: '1000000',
|
|
272
|
+
|
|
273
|
+
// Optional: progress callback
|
|
274
|
+
onProgress: ({ step, total, message, done, address }) => {
|
|
275
|
+
console.log(`[${step}/${total}] ${message}`);
|
|
276
|
+
if (done) console.log(` -> ${address}`);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**What Gets Deployed**:
|
|
282
|
+
1. `ManagedFactory` - Creates Managed contracts
|
|
283
|
+
2. `ZonedFactory` - Creates Zoned contracts
|
|
284
|
+
3. `SplitterFactory` - Creates Splitter contracts
|
|
285
|
+
4. `AppreciativeFactory` - Creates Appreciative contracts
|
|
286
|
+
5. `BundleFactory` - Creates Bundle contracts
|
|
287
|
+
6. `Holons` - Central registry
|
|
288
|
+
7. `TestToken` (optional) - ERC20 for testing
|
|
289
|
+
|
|
290
|
+
**Save Addresses for Later**:
|
|
291
|
+
```javascript
|
|
292
|
+
// Save deployment
|
|
293
|
+
localStorage.setItem('deployment', JSON.stringify(deployment.contracts));
|
|
294
|
+
|
|
295
|
+
// Load later
|
|
296
|
+
const saved = JSON.parse(localStorage.getItem('deployment'));
|
|
297
|
+
hs.loadDeployedContracts(saved);
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Per-Holon Contracts
|
|
303
|
+
|
|
304
|
+
Each holon can have its own smart contract (1:1 fractal mapping):
|
|
305
|
+
|
|
306
|
+
### Deploy Contract for Holon
|
|
307
|
+
|
|
308
|
+
```javascript
|
|
309
|
+
// Deploy new contract
|
|
310
|
+
const result = await hs.deployHolonContract(holonId, type, options);
|
|
311
|
+
|
|
312
|
+
// Types: 'Splitter', 'Managed', 'Zoned', 'Appreciative', 'Bundle'
|
|
313
|
+
|
|
314
|
+
// Examples:
|
|
315
|
+
await hs.deployHolonContract('team_alpha', 'Managed');
|
|
316
|
+
await hs.deployHolonContract('community', 'Zoned', { nZones: 6 });
|
|
317
|
+
await hs.deployHolonContract('dao', 'Appreciative');
|
|
318
|
+
await hs.deployHolonContract('org', 'Splitter', { splitPercentage: 70 });
|
|
319
|
+
await hs.deployHolonContract('project', 'Bundle', { steepness: '0.5' });
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Link Existing Contract
|
|
323
|
+
|
|
324
|
+
```javascript
|
|
325
|
+
// Link holon to existing contract
|
|
326
|
+
await hs.linkHolonContract('my_holon', '0xExistingContract', 'Splitter');
|
|
327
|
+
|
|
328
|
+
// Check if linked
|
|
329
|
+
const hasContract = hs.hasHolonContract('my_holon'); // true
|
|
330
|
+
|
|
331
|
+
// Get address
|
|
332
|
+
const address = hs.getHolonContractAddress('my_holon');
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Unlink Contract
|
|
336
|
+
|
|
337
|
+
```javascript
|
|
338
|
+
await hs.unlinkHolonContract('my_holon');
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### List All Mappings
|
|
342
|
+
|
|
343
|
+
```javascript
|
|
344
|
+
const mappings = hs.listHolonContracts();
|
|
345
|
+
// [
|
|
346
|
+
// { holonId: 'team_alpha', address: '0x...', type: 'Managed' },
|
|
347
|
+
// { holonId: 'community', address: '0x...', type: 'Zoned' }
|
|
348
|
+
// ]
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## All Contract Operations
|
|
354
|
+
|
|
355
|
+
### Member Management
|
|
356
|
+
|
|
357
|
+
```javascript
|
|
358
|
+
// Add single member
|
|
359
|
+
await hs.contractAddMember(holonId, 'alice');
|
|
360
|
+
|
|
361
|
+
// Add multiple members
|
|
362
|
+
await hs.contractAddMembers(holonId, ['alice', 'bob', 'charlie']);
|
|
363
|
+
|
|
364
|
+
// Check membership
|
|
365
|
+
const isMember = await hs.contractIsMember(holonId, 'alice'); // true
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Fund Distribution
|
|
369
|
+
|
|
370
|
+
```javascript
|
|
371
|
+
// Send ETH (triggers distribution)
|
|
372
|
+
await hs.contractSendEth(holonId, '1.0'); // 1 ETH
|
|
373
|
+
|
|
374
|
+
// Trigger ERC20 reward distribution
|
|
375
|
+
await hs.contractReward(holonId, tokenAddress, amount);
|
|
376
|
+
|
|
377
|
+
// Check balances
|
|
378
|
+
const ethBalance = await hs.contractGetEthBalance(holonId, 'alice');
|
|
379
|
+
const tokenBalance = await hs.contractGetTokenBalance(holonId, 'alice', tokenAddress);
|
|
380
|
+
|
|
381
|
+
// Claim rewards
|
|
382
|
+
await hs.contractClaim(holonId, 'alice', '0xAliceWallet');
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
### Splitter Operations
|
|
386
|
+
|
|
387
|
+
```javascript
|
|
388
|
+
// Set split percentages
|
|
389
|
+
await hs.contractSetSplit(holonId, 70, 30); // 70% internal, 30% external
|
|
390
|
+
|
|
391
|
+
// Get current split
|
|
392
|
+
const { internal, external } = await hs.contractGetSplit(holonId);
|
|
393
|
+
|
|
394
|
+
// Create child contracts
|
|
395
|
+
await hs.contractCreateManaged(holonId, 'creator', 'ChildName');
|
|
396
|
+
await hs.contractCreateZoned(holonId, 'creator', 'ChildName', 6);
|
|
397
|
+
|
|
398
|
+
// List children
|
|
399
|
+
const { keys, addresses } = await hs.contractGetChildContracts(holonId);
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### Managed Operations
|
|
403
|
+
|
|
404
|
+
```javascript
|
|
405
|
+
// Set appreciation weights
|
|
406
|
+
await hs.contractSetAppreciation(holonId,
|
|
407
|
+
['alice', 'bob'],
|
|
408
|
+
[300, 200] // Alice: 60%, Bob: 40%
|
|
409
|
+
);
|
|
410
|
+
|
|
411
|
+
// Get appreciation
|
|
412
|
+
const appreciation = await hs.contractGetAppreciation(holonId, 'alice');
|
|
413
|
+
const total = await hs.contractGetTotalAppreciation(holonId);
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
### Zoned Operations
|
|
417
|
+
|
|
418
|
+
```javascript
|
|
419
|
+
// Add to zone
|
|
420
|
+
await hs.contractAddToZone(holonId, 'admin', 'alice', 3);
|
|
421
|
+
|
|
422
|
+
// Remove from zone
|
|
423
|
+
await hs.contractRemoveFromZone(holonId, 'admin', 'alice');
|
|
424
|
+
|
|
425
|
+
// Get zone
|
|
426
|
+
const zone = await hs.contractGetZone(holonId, 'alice');
|
|
427
|
+
|
|
428
|
+
// Set reward formula: reward = a*zone² + b*zone + c
|
|
429
|
+
await hs.contractSetZoneParams(holonId, 'admin', 1, 1, 0);
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### Appreciative Operations
|
|
433
|
+
|
|
434
|
+
```javascript
|
|
435
|
+
// Give appreciation
|
|
436
|
+
await hs.contractAppreciate(holonId, 'alice', 'bob', 25);
|
|
437
|
+
|
|
438
|
+
// Check stats
|
|
439
|
+
const given = await hs.contractGetAppreciationGiven(holonId, 'alice');
|
|
440
|
+
const received = await hs.contractGetAppreciationReceived(holonId, 'bob');
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### Bundle Operations
|
|
444
|
+
|
|
445
|
+
```javascript
|
|
446
|
+
// Set steepness (0.5 = 50% decay per zone)
|
|
447
|
+
await hs.contractSetSteepness(holonId, '0.5');
|
|
448
|
+
const steepness = await hs.contractGetSteepness(holonId);
|
|
449
|
+
|
|
450
|
+
// Set interior split
|
|
451
|
+
await hs.contractSetInteriorSplit(holonId, ['a', 'b'], [60, 40]);
|
|
452
|
+
|
|
453
|
+
// Governance
|
|
454
|
+
await hs.contractStartElection(holonId);
|
|
455
|
+
await hs.contractNominate(holonId);
|
|
456
|
+
await hs.contractVote(holonId, nomineeAddress);
|
|
457
|
+
await hs.contractFinalizeElection(holonId);
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
### Read-Only Queries
|
|
461
|
+
|
|
462
|
+
```javascript
|
|
463
|
+
const name = await hs.contractGetName(holonId);
|
|
464
|
+
const owner = await hs.contractGetOwner(holonId);
|
|
465
|
+
const bot = await hs.contractGetBotAddress(holonId);
|
|
466
|
+
const total = await hs.contractGetTotalDeposited(holonId, tokenAddress);
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
---
|
|
470
|
+
|
|
471
|
+
## Multi-Chain Support
|
|
472
|
+
|
|
473
|
+
### Supported Networks
|
|
474
|
+
|
|
475
|
+
| Network | Chain ID | Type | Usage |
|
|
476
|
+
|---------|----------|------|-------|
|
|
477
|
+
| `ethereum` | 1 | Mainnet | Production |
|
|
478
|
+
| `polygon` | 137 | Mainnet | Low fees |
|
|
479
|
+
| `arbitrum` | 42161 | Mainnet | L2 |
|
|
480
|
+
| `base` | 8453 | Mainnet | L2 |
|
|
481
|
+
| `optimism` | 10 | Mainnet | L2 |
|
|
482
|
+
| `sepolia` | 11155111 | Testnet | Testing |
|
|
483
|
+
| `mumbai` | 80001 | Testnet | Testing |
|
|
484
|
+
| `hardhat` | 31337 | Local | Development |
|
|
485
|
+
| `anvil` | 31337 | Local | Development |
|
|
486
|
+
|
|
487
|
+
### Connect to Different Networks
|
|
488
|
+
|
|
489
|
+
```javascript
|
|
490
|
+
// Testnet (recommended for testing)
|
|
491
|
+
await hs.initContracts({
|
|
492
|
+
network: 'sepolia',
|
|
493
|
+
privateKey: process.env.PRIVATE_KEY
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
// Polygon (low fees)
|
|
497
|
+
await hs.initContracts({
|
|
498
|
+
network: 'polygon',
|
|
499
|
+
privateKey: process.env.PRIVATE_KEY
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
// Custom RPC
|
|
503
|
+
await hs.initContracts({
|
|
504
|
+
network: 'ethereum',
|
|
505
|
+
privateKey: process.env.PRIVATE_KEY,
|
|
506
|
+
rpcUrl: 'https://my-custom-rpc.com'
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
// Local development
|
|
510
|
+
await hs.initContracts({
|
|
511
|
+
network: 'hardhat',
|
|
512
|
+
privateKey: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'
|
|
513
|
+
});
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
### Network Utilities
|
|
517
|
+
|
|
518
|
+
```javascript
|
|
519
|
+
import {
|
|
520
|
+
NETWORKS,
|
|
521
|
+
getNetwork,
|
|
522
|
+
getTxUrl,
|
|
523
|
+
getAddressUrl,
|
|
524
|
+
isNetworkSupported
|
|
525
|
+
} from 'holosphere';
|
|
526
|
+
|
|
527
|
+
// Get network config
|
|
528
|
+
const config = getNetwork('polygon');
|
|
529
|
+
// { name: 'Polygon Mainnet', chainId: 137, rpc: '...', ... }
|
|
530
|
+
|
|
531
|
+
// Get explorer URLs
|
|
532
|
+
const txUrl = getTxUrl('ethereum', '0xTxHash...');
|
|
533
|
+
// https://etherscan.io/tx/0xTxHash...
|
|
534
|
+
|
|
535
|
+
const addrUrl = getAddressUrl('polygon', '0xAddress...');
|
|
536
|
+
// https://polygonscan.com/address/0xAddress...
|
|
537
|
+
|
|
538
|
+
// Check support
|
|
539
|
+
isNetworkSupported('polygon'); // true
|
|
540
|
+
isNetworkSupported('solana'); // false
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
---
|
|
544
|
+
|
|
545
|
+
## Examples
|
|
546
|
+
|
|
547
|
+
### Example 1: Simple Team Distribution
|
|
548
|
+
|
|
549
|
+
```javascript
|
|
550
|
+
import HoloSphere from 'holosphere';
|
|
551
|
+
|
|
552
|
+
async function setupTeam() {
|
|
553
|
+
const hs = new HoloSphere({ appName: 'myteam' });
|
|
554
|
+
|
|
555
|
+
// Connect to Sepolia testnet
|
|
556
|
+
await hs.initContracts({
|
|
557
|
+
network: 'sepolia',
|
|
558
|
+
privateKey: process.env.PRIVATE_KEY
|
|
559
|
+
});
|
|
560
|
+
|
|
561
|
+
// Deploy infrastructure
|
|
562
|
+
await hs.deployContracts();
|
|
563
|
+
|
|
564
|
+
// Create team contract
|
|
565
|
+
await hs.deployHolonContract('dev_team', 'Managed');
|
|
566
|
+
|
|
567
|
+
// Add team members
|
|
568
|
+
await hs.contractAddMembers('dev_team', ['alice', 'bob', 'charlie']);
|
|
569
|
+
|
|
570
|
+
// Set contributions (alice: 50%, bob: 30%, charlie: 20%)
|
|
571
|
+
await hs.contractSetAppreciation('dev_team',
|
|
572
|
+
['alice', 'bob', 'charlie'],
|
|
573
|
+
[500, 300, 200]
|
|
574
|
+
);
|
|
575
|
+
|
|
576
|
+
// When client pays 1 ETH...
|
|
577
|
+
await hs.contractSendEth('dev_team', '1.0');
|
|
578
|
+
|
|
579
|
+
// Check balances
|
|
580
|
+
const aliceBalance = await hs.contractGetEthBalance('dev_team', 'alice');
|
|
581
|
+
console.log(`Alice can claim: ${aliceBalance} ETH`); // ~0.5 ETH
|
|
582
|
+
|
|
583
|
+
// Alice claims her rewards
|
|
584
|
+
await hs.contractClaim('dev_team', 'alice', '0xAliceWallet');
|
|
585
|
+
}
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
### Example 2: Organization with Departments
|
|
589
|
+
|
|
590
|
+
```javascript
|
|
591
|
+
async function setupOrganization() {
|
|
592
|
+
const hs = new HoloSphere({ appName: 'myorg' });
|
|
593
|
+
await hs.initContracts({ network: 'polygon', privateKey: KEY });
|
|
594
|
+
await hs.deployContracts();
|
|
595
|
+
|
|
596
|
+
// Main organization (Splitter)
|
|
597
|
+
await hs.deployHolonContract('organization', 'Splitter', {
|
|
598
|
+
name: 'Acme Corp',
|
|
599
|
+
splitPercentage: 60 // 60% internal, 40% external
|
|
600
|
+
});
|
|
601
|
+
|
|
602
|
+
// Get child contract addresses
|
|
603
|
+
const children = await hs.contractGetChildContracts('organization');
|
|
604
|
+
console.log('Managed:', children.addresses[0]);
|
|
605
|
+
console.log('Zoned:', children.addresses[1]);
|
|
606
|
+
|
|
607
|
+
// Now funds sent to organization automatically split:
|
|
608
|
+
// - 60% -> Managed (for core team)
|
|
609
|
+
// - 40% -> Zoned (for contributors)
|
|
610
|
+
|
|
611
|
+
// Configure the Managed child for core team
|
|
612
|
+
const managedHolon = 'organization_managed';
|
|
613
|
+
await hs.linkHolonContract(managedHolon, children.addresses[0], 'Managed');
|
|
614
|
+
await hs.contractAddMembers(managedHolon, ['ceo', 'cto', 'cfo']);
|
|
615
|
+
await hs.contractSetAppreciation(managedHolon,
|
|
616
|
+
['ceo', 'cto', 'cfo'],
|
|
617
|
+
[400, 350, 250]
|
|
618
|
+
);
|
|
619
|
+
|
|
620
|
+
// Configure the Zoned child for contributors
|
|
621
|
+
const zonedHolon = 'organization_zoned';
|
|
622
|
+
await hs.linkHolonContract(zonedHolon, children.addresses[1], 'Zoned');
|
|
623
|
+
await hs.contractAddMembers(zonedHolon, ['dev1', 'dev2', 'designer']);
|
|
624
|
+
await hs.contractAddToZone(zonedHolon, 'admin', 'dev1', 3);
|
|
625
|
+
await hs.contractAddToZone(zonedHolon, 'admin', 'dev2', 2);
|
|
626
|
+
await hs.contractAddToZone(zonedHolon, 'admin', 'designer', 2);
|
|
627
|
+
}
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
### Example 3: DAO with Peer Appreciation
|
|
631
|
+
|
|
632
|
+
```javascript
|
|
633
|
+
async function setupDAO() {
|
|
634
|
+
const hs = new HoloSphere({ appName: 'mydao' });
|
|
635
|
+
await hs.initContracts({ network: 'base', privateKey: KEY });
|
|
636
|
+
await hs.deployContracts();
|
|
637
|
+
|
|
638
|
+
// Create DAO with peer appreciation
|
|
639
|
+
await hs.deployHolonContract('dao', 'Appreciative');
|
|
640
|
+
|
|
641
|
+
// Add members
|
|
642
|
+
const members = ['alice', 'bob', 'charlie', 'david'];
|
|
643
|
+
await hs.contractAddMembers('dao', members);
|
|
644
|
+
|
|
645
|
+
// Members appreciate each other's contributions
|
|
646
|
+
// (Each has 100 points to distribute)
|
|
647
|
+
|
|
648
|
+
// Alice appreciates Bob and Charlie
|
|
649
|
+
await hs.contractAppreciate('dao', 'alice', 'bob', 40);
|
|
650
|
+
await hs.contractAppreciate('dao', 'alice', 'charlie', 30);
|
|
651
|
+
|
|
652
|
+
// Bob appreciates Alice and David
|
|
653
|
+
await hs.contractAppreciate('dao', 'bob', 'alice', 50);
|
|
654
|
+
await hs.contractAppreciate('dao', 'bob', 'david', 25);
|
|
655
|
+
|
|
656
|
+
// Check how much appreciation everyone received
|
|
657
|
+
for (const member of members) {
|
|
658
|
+
const received = await hs.contractGetAppreciationReceived('dao', member);
|
|
659
|
+
console.log(`${member} received ${received} appreciation`);
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
// Rewards distributed based on appreciation received!
|
|
663
|
+
}
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
### Example 4: Browser Integration (MetaMask)
|
|
667
|
+
|
|
668
|
+
```javascript
|
|
669
|
+
async function connectWallet() {
|
|
670
|
+
const hs = new HoloSphere({ appName: 'dapp' });
|
|
671
|
+
|
|
672
|
+
// Connect with MetaMask
|
|
673
|
+
const { address, network } = await hs.initContractsBrowser('polygon');
|
|
674
|
+
console.log(`Connected: ${address} on ${network.name}`);
|
|
675
|
+
|
|
676
|
+
// Load existing deployment
|
|
677
|
+
const saved = localStorage.getItem('deployment');
|
|
678
|
+
if (saved) {
|
|
679
|
+
hs.loadDeployedContracts(JSON.parse(saved));
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// User can now interact with contracts
|
|
683
|
+
// (MetaMask will prompt for each transaction)
|
|
684
|
+
}
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
### Example 5: Progress Tracking for Deployment
|
|
688
|
+
|
|
689
|
+
```javascript
|
|
690
|
+
async function deployWithProgress() {
|
|
691
|
+
const hs = new HoloSphere({ appName: 'myapp' });
|
|
692
|
+
await hs.initContracts({ network: 'sepolia', privateKey: KEY });
|
|
693
|
+
|
|
694
|
+
const deployment = await hs.deployContracts({
|
|
695
|
+
testTokenSupply: '1000000',
|
|
696
|
+
onProgress: ({ step, total, message, done, address }) => {
|
|
697
|
+
const progress = Math.round((step / total) * 100);
|
|
698
|
+
console.log(`[${progress}%] ${message}`);
|
|
699
|
+
|
|
700
|
+
if (done && address) {
|
|
701
|
+
console.log(` Contract deployed at: ${address}`);
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
});
|
|
705
|
+
|
|
706
|
+
// Output:
|
|
707
|
+
// [12%] Deploying ManagedFactory...
|
|
708
|
+
// Contract deployed at: 0x...
|
|
709
|
+
// [25%] Deploying ZonedFactory...
|
|
710
|
+
// Contract deployed at: 0x...
|
|
711
|
+
// ...
|
|
712
|
+
|
|
713
|
+
return deployment;
|
|
714
|
+
}
|
|
715
|
+
```
|
|
716
|
+
|
|
717
|
+
---
|
|
718
|
+
|
|
719
|
+
## API Reference
|
|
720
|
+
|
|
721
|
+
### HoloSphere Contract Methods
|
|
722
|
+
|
|
723
|
+
| Method | Description |
|
|
724
|
+
|--------|-------------|
|
|
725
|
+
| `initContracts(config)` | Initialize with private key |
|
|
726
|
+
| `initContractsBrowser(network?)` | Initialize with browser wallet |
|
|
727
|
+
| `deployContracts(options?)` | 1-click deploy all contracts |
|
|
728
|
+
| `loadDeployedContracts(addresses)` | Load existing deployment |
|
|
729
|
+
| `getDeployedContracts()` | Get deployed addresses |
|
|
730
|
+
| `deployHolonContract(holonId, type, options?)` | Deploy contract for holon |
|
|
731
|
+
| `linkHolonContract(holonId, address, type)` | Link existing contract |
|
|
732
|
+
| `unlinkHolonContract(holonId)` | Remove contract link |
|
|
733
|
+
| `hasHolonContract(holonId)` | Check if holon has contract |
|
|
734
|
+
| `getHolonContractAddress(holonId)` | Get contract address |
|
|
735
|
+
| `listHolonContracts()` | List all holon-contract mappings |
|
|
736
|
+
| `contractAddMember(holonId, userId)` | Add member |
|
|
737
|
+
| `contractAddMembers(holonId, userIds)` | Add multiple members |
|
|
738
|
+
| `contractIsMember(holonId, userId)` | Check membership |
|
|
739
|
+
| `contractSendEth(holonId, amount)` | Send ETH to contract |
|
|
740
|
+
| `contractReward(holonId, token, amount)` | Trigger ERC20 distribution |
|
|
741
|
+
| `contractClaim(holonId, userId, beneficiary)` | Claim rewards |
|
|
742
|
+
| `contractGetEthBalance(holonId, userId)` | Get ETH balance |
|
|
743
|
+
| `contractGetTokenBalance(holonId, userId, token)` | Get token balance |
|
|
744
|
+
| `contractSetSplit(holonId, internal, external)` | Set Splitter percentages |
|
|
745
|
+
| `contractGetSplit(holonId)` | Get Splitter percentages |
|
|
746
|
+
| `contractSetAppreciation(holonId, users, amounts)` | Set Managed weights |
|
|
747
|
+
| `contractGetAppreciation(holonId, userId)` | Get user appreciation |
|
|
748
|
+
| `contractAddToZone(holonId, sender, user, zone)` | Add to Zoned tier |
|
|
749
|
+
| `contractRemoveFromZone(holonId, sender, user)` | Remove from zone |
|
|
750
|
+
| `contractGetZone(holonId, userId)` | Get user's zone |
|
|
751
|
+
| `contractAppreciate(holonId, from, to, amount)` | Give peer appreciation |
|
|
752
|
+
| `contractSetSteepness(holonId, steepness)` | Set Bundle decay |
|
|
753
|
+
| `contractStartElection(holonId)` | Start Bundle election |
|
|
754
|
+
| `contractVote(holonId, nominee)` | Vote in election |
|
|
755
|
+
|
|
756
|
+
---
|
|
757
|
+
|
|
758
|
+
## Troubleshooting
|
|
759
|
+
|
|
760
|
+
### Common Issues
|
|
761
|
+
|
|
762
|
+
**"Contracts not initialized"**
|
|
763
|
+
```javascript
|
|
764
|
+
// Make sure to call initContracts first
|
|
765
|
+
await hs.initContracts({ network: 'sepolia', privateKey: KEY });
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
**"Holon has no linked contract"**
|
|
769
|
+
```javascript
|
|
770
|
+
// Deploy or link a contract first
|
|
771
|
+
await hs.deployHolonContract('myholon', 'Managed');
|
|
772
|
+
// or
|
|
773
|
+
await hs.linkHolonContract('myholon', '0xExisting...', 'Managed');
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
**"Operation only available for X contracts"**
|
|
777
|
+
```javascript
|
|
778
|
+
// Make sure you're using the right contract type
|
|
779
|
+
// Splitter: setContractSplit, createManagedContract, etc.
|
|
780
|
+
// Managed: setAppreciation, getAppreciation, etc.
|
|
781
|
+
// Zoned: addToZone, removeFromZone, etc.
|
|
782
|
+
// Appreciative: appreciate, getAppreciationGiven, etc.
|
|
783
|
+
// Bundle: setSteepness, startElection, etc.
|
|
784
|
+
```
|
|
785
|
+
|
|
786
|
+
**"Insufficient funds"**
|
|
787
|
+
```javascript
|
|
788
|
+
// Check balance before transactions
|
|
789
|
+
const balance = await hs.getChainManager().getBalance();
|
|
790
|
+
console.log(`Balance: ${balance} ETH`);
|
|
791
|
+
```
|
|
792
|
+
|
|
793
|
+
---
|
|
794
|
+
|
|
795
|
+
## License
|
|
796
|
+
|
|
797
|
+
MIT License - See LICENSE file for details.
|