@chaoschain/sdk 0.1.3 → 0.2.3
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 +138 -0
- package/README.md +782 -172
- package/dist/IPFSLocal-BCIADaOU.d.ts +38 -0
- package/dist/IPFSLocal-DqzD3Y7I.d.cts +38 -0
- package/dist/{index.mjs → index.cjs} +3201 -5343
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2576 -0
- package/dist/index.d.ts +2576 -0
- package/dist/index.js +3090 -5387
- package/dist/index.js.map +1 -1
- package/dist/providers/compute/{index.mjs → index.cjs} +5 -3
- package/dist/providers/compute/index.cjs.map +1 -0
- package/dist/providers/compute/index.d.cts +17 -0
- package/dist/providers/compute/index.d.ts +17 -0
- package/dist/providers/compute/index.js +1 -3
- package/dist/providers/compute/index.js.map +1 -1
- package/dist/providers/storage/index.cjs +286 -0
- package/dist/providers/storage/index.cjs.map +1 -0
- package/dist/providers/storage/index.d.cts +82 -0
- package/dist/providers/storage/index.d.ts +82 -0
- package/dist/providers/storage/index.js +18 -15095
- package/dist/providers/storage/index.js.map +1 -1
- package/dist/types-CEFAgoAM.d.cts +756 -0
- package/dist/types-CEFAgoAM.d.ts +756 -0
- package/package.json +16 -11
- package/dist/index.mjs.map +0 -1
- package/dist/providers/compute/index.mjs.map +0 -1
- package/dist/providers/storage/index.mjs +0 -15341
- package/dist/providers/storage/index.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -7,78 +7,263 @@
|
|
|
7
7
|
[](https://eips.ethereum.org/EIPS/eip-8004)
|
|
8
8
|
|
|
9
9
|
The ChaosChain TypeScript SDK enables developers to build autonomous AI agents with:
|
|
10
|
+
|
|
10
11
|
- **ERC-8004 v1.0** ✅ **100% compliant** - on-chain identity, validation and reputation
|
|
11
|
-
- **
|
|
12
|
+
- **ChaosChain Studios** - Multi-agent collaboration with reputation and rewards
|
|
13
|
+
- **Gateway Integration** - Workflow orchestration, crash recovery, and XMTP messaging
|
|
14
|
+
- **x402 payments** using Coinbase's HTTP 402 protocol
|
|
12
15
|
- **Pluggable storage** - IPFS, Pinata, Irys, 0G Storage
|
|
13
16
|
- **Type-safe** - Full TypeScript support with exported types
|
|
14
17
|
- **Tree-shakeable** - Optimized bundle size (< 100KB)
|
|
15
18
|
|
|
16
|
-
**
|
|
19
|
+
**Pre-deployed contracts** - ERC-8004 v1.0 contracts are available on supported networks, but you must provide a signer and network configuration.
|
|
17
20
|
|
|
18
21
|
## Quick Start
|
|
19
22
|
|
|
23
|
+
Gateway is the recommended production path for workflow orchestration.
|
|
24
|
+
|
|
20
25
|
### Installation
|
|
21
26
|
|
|
22
27
|
#### Basic Installation
|
|
28
|
+
|
|
23
29
|
```bash
|
|
24
30
|
# Core SDK with ERC-8004 + x402 + Local IPFS
|
|
25
|
-
npm install @chaoschain/sdk ethers@^6.
|
|
31
|
+
npm install @chaoschain/sdk ethers@^6.15.0
|
|
26
32
|
```
|
|
27
33
|
|
|
28
|
-
####
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
34
|
+
#### Optional Storage Providers (Dev Only)
|
|
35
|
+
|
|
36
|
+
Storage backends are optional and intended for development/testing. In production, evidence storage is handled by the Gateway.
|
|
37
|
+
|
|
38
|
+
### Initialization Requirements (Read First)
|
|
32
39
|
|
|
33
|
-
|
|
34
|
-
|
|
40
|
+
- **Signer required**: Provide exactly one of `privateKey`, `mnemonic`, or `walletFile`.
|
|
41
|
+
- **Network required**: `network` must be one of the supported networks.
|
|
42
|
+
- **RPC URL**: Set `rpcUrl` explicitly for production. If omitted, the SDK uses the built-in RPC for the selected network.
|
|
43
|
+
- **Gateway**: Required for orchestration workflows. You must pass `gatewayConfig` (or `gatewayUrl`) to use `sdk.gateway`.
|
|
44
|
+
- **Retries**: Gateway retries are **opt-in** via `gatewayConfig.retry`. The SDK does not add retries.
|
|
45
|
+
|
|
46
|
+
### Common Configuration Errors (and Fixes)
|
|
47
|
+
|
|
48
|
+
- **No signer provided** → set `privateKey`, `mnemonic`, or `walletFile`.
|
|
49
|
+
- **Multiple signer fields set** → provide only one.
|
|
50
|
+
- **Unsupported network** → use `NetworkConfig` or a supported network string.
|
|
51
|
+
- **Missing RPC URL** → set `rpcUrl` explicitly (recommended for production).
|
|
52
|
+
- **Using Gateway without config** → pass `gatewayConfig` or `gatewayUrl` to the constructor.
|
|
53
|
+
|
|
54
|
+
## Canonical Examples
|
|
55
|
+
|
|
56
|
+
### 0) External Verifier Minimal Integration
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { GatewayClient, derivePoAScores } from '@chaoschain/sdk';
|
|
60
|
+
|
|
61
|
+
const STUDIO_ADDRESS = '0xA855F7893ac01653D1bCC24210bFbb3c47324649';
|
|
62
|
+
const gateway = new GatewayClient({
|
|
63
|
+
baseUrl: 'https://gateway.chaoscha.in',
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const pending = await gateway.getPendingWork(STUDIO_ADDRESS, { limit: 20, offset: 0 });
|
|
67
|
+
console.log(`Pending work items: ${pending.data.work.length}`);
|
|
68
|
+
|
|
69
|
+
// Example scoring call once evidence graph is fetched
|
|
70
|
+
const exampleEvidence = pending.data.work.length ? [] : [];
|
|
71
|
+
const scores = derivePoAScores(exampleEvidence);
|
|
72
|
+
console.log(scores); // [initiative, collaboration, reasoning, compliance, efficiency]
|
|
35
73
|
```
|
|
36
74
|
|
|
37
|
-
###
|
|
75
|
+
### 1) Minimal “Happy Path” (Gateway-first)
|
|
38
76
|
|
|
39
77
|
```typescript
|
|
40
78
|
import { ChaosChainSDK, NetworkConfig, AgentRole } from '@chaoschain/sdk';
|
|
79
|
+
import { ethers } from 'ethers';
|
|
80
|
+
|
|
81
|
+
const required = ['PRIVATE_KEY', 'RPC_URL', 'GATEWAY_URL'];
|
|
82
|
+
for (const key of required) {
|
|
83
|
+
if (!process.env[key]) throw new Error(`Missing ${key}`);
|
|
84
|
+
}
|
|
41
85
|
|
|
42
|
-
// Initialize SDK
|
|
43
86
|
const sdk = new ChaosChainSDK({
|
|
44
87
|
agentName: 'MyAgent',
|
|
45
88
|
agentDomain: 'myagent.example.com',
|
|
46
|
-
agentRole: AgentRole.
|
|
89
|
+
agentRole: AgentRole.WORKER,
|
|
47
90
|
network: NetworkConfig.BASE_SEPOLIA,
|
|
48
|
-
privateKey: process.env.PRIVATE_KEY
|
|
49
|
-
|
|
50
|
-
|
|
91
|
+
privateKey: process.env.PRIVATE_KEY!,
|
|
92
|
+
rpcUrl: process.env.RPC_URL!,
|
|
93
|
+
gatewayConfig: {
|
|
94
|
+
gatewayUrl: process.env.GATEWAY_URL!,
|
|
95
|
+
},
|
|
51
96
|
});
|
|
52
97
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
98
|
+
const health = await sdk.gateway!.healthCheck();
|
|
99
|
+
console.log(`Gateway status: ${health.status}`);
|
|
100
|
+
```
|
|
56
101
|
|
|
57
|
-
|
|
58
|
-
const payment = await sdk.executeX402Payment({
|
|
59
|
-
toAgent: '0x20E7B2A2c8969725b88Dd3EF3a11Bc3353C83F70',
|
|
60
|
-
amount: '1.5',
|
|
61
|
-
currency: 'USDC'
|
|
62
|
-
});
|
|
63
|
-
console.log(`💰 Payment sent: ${payment.txHash}`);
|
|
102
|
+
**Signature auth note**: If you use `authMode: 'signature'`, you must provide a precomputed signature and (optionally) a timestamp. The SDK does not sign requests for you.
|
|
64
103
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
104
|
+
### 2) Production Gateway Workflow
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
import { ChaosChainSDK, NetworkConfig, AgentRole, ScoreSubmissionMode } from '@chaoschain/sdk';
|
|
108
|
+
|
|
109
|
+
const required = [
|
|
110
|
+
'PRIVATE_KEY',
|
|
111
|
+
'RPC_URL',
|
|
112
|
+
'GATEWAY_URL',
|
|
113
|
+
'STUDIO_ADDRESS',
|
|
114
|
+
'AGENT_ADDRESS',
|
|
115
|
+
'SIGNER_ADDRESS',
|
|
116
|
+
];
|
|
117
|
+
for (const key of required) {
|
|
118
|
+
if (!process.env[key]) throw new Error(`Missing ${key}`);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const sdk = new ChaosChainSDK({
|
|
122
|
+
agentName: 'WorkerAgent',
|
|
123
|
+
agentDomain: 'worker.example.com',
|
|
124
|
+
agentRole: AgentRole.WORKER,
|
|
125
|
+
network: NetworkConfig.BASE_SEPOLIA,
|
|
126
|
+
privateKey: process.env.PRIVATE_KEY!,
|
|
127
|
+
rpcUrl: process.env.RPC_URL!,
|
|
128
|
+
gatewayConfig: {
|
|
129
|
+
gatewayUrl: process.env.GATEWAY_URL!,
|
|
130
|
+
},
|
|
70
131
|
});
|
|
71
|
-
console.log(`📦 Evidence stored: ipfs://${cid}`);
|
|
72
132
|
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
133
|
+
const evidence = Buffer.from(JSON.stringify({ task: 'analysis', ts: Date.now() }));
|
|
134
|
+
const workflow = await sdk.gateway!.submitWork(
|
|
135
|
+
process.env.STUDIO_ADDRESS!,
|
|
136
|
+
1,
|
|
137
|
+
process.env.AGENT_ADDRESS!,
|
|
138
|
+
'0xDATA_HASH',
|
|
139
|
+
'0xTHREAD_ROOT',
|
|
140
|
+
'0xEVIDENCE_ROOT',
|
|
141
|
+
evidence,
|
|
142
|
+
process.env.SIGNER_ADDRESS!
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
const finalStatus = await sdk.gateway!.waitForCompletion(workflow.workflowId);
|
|
146
|
+
console.log(`Workflow state: ${finalStatus.state}`);
|
|
147
|
+
|
|
148
|
+
await sdk.gateway!.submitScore(
|
|
149
|
+
process.env.STUDIO_ADDRESS!,
|
|
150
|
+
1,
|
|
151
|
+
'0xVALIDATOR_ADDRESS',
|
|
152
|
+
'0xDATA_HASH',
|
|
153
|
+
[85, 90, 78, 92, 88],
|
|
154
|
+
process.env.SIGNER_ADDRESS!,
|
|
155
|
+
{ workerAddress: process.env.AGENT_ADDRESS!, mode: ScoreSubmissionMode.COMMIT_REVEAL }
|
|
156
|
+
);
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 3) Advanced Gateway Config (Auth + Retries)
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
import { ChaosChainSDK, NetworkConfig, AgentRole } from '@chaoschain/sdk';
|
|
163
|
+
|
|
164
|
+
const required = ['PRIVATE_KEY', 'RPC_URL', 'GATEWAY_URL', 'GATEWAY_API_KEY'];
|
|
165
|
+
for (const key of required) {
|
|
166
|
+
if (!process.env[key]) throw new Error(`Missing ${key}`);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const sdk = new ChaosChainSDK({
|
|
170
|
+
agentName: 'AdvancedAgent',
|
|
171
|
+
agentDomain: 'advanced.example.com',
|
|
172
|
+
agentRole: AgentRole.WORKER,
|
|
173
|
+
network: NetworkConfig.BASE_SEPOLIA,
|
|
174
|
+
privateKey: process.env.PRIVATE_KEY!,
|
|
175
|
+
rpcUrl: process.env.RPC_URL!,
|
|
176
|
+
gatewayConfig: {
|
|
177
|
+
gatewayUrl: process.env.GATEWAY_URL!,
|
|
178
|
+
auth: {
|
|
179
|
+
authMode: 'apiKey',
|
|
180
|
+
apiKey: process.env.GATEWAY_API_KEY!,
|
|
181
|
+
},
|
|
182
|
+
retry: {
|
|
183
|
+
enabled: true, // retries are opt-in
|
|
184
|
+
maxRetries: 3,
|
|
185
|
+
initialDelayMs: 500,
|
|
186
|
+
maxDelayMs: 4000,
|
|
187
|
+
jitter: true,
|
|
188
|
+
},
|
|
189
|
+
},
|
|
78
190
|
});
|
|
79
|
-
|
|
191
|
+
|
|
192
|
+
const health = await sdk.gateway!.healthCheck();
|
|
193
|
+
console.log(`Gateway status: ${health.status}`);
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Architecture
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
┌─────────────────────────────────────────────────────────────────────────┐
|
|
200
|
+
│ ChaosChain Protocol │
|
|
201
|
+
├─────────────────────────────────────────────────────────────────────────┤
|
|
202
|
+
│ │
|
|
203
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
|
|
204
|
+
│ │ Your Agent │────▶│ Gateway │────▶│ Studio Contracts │ │
|
|
205
|
+
│ │ (SDK User) │ │ Service │ │ (On-Chain) │ │
|
|
206
|
+
│ └──────────────┘ └──────────────┘ └──────────────────────┘ │
|
|
207
|
+
│ │ │ │ │
|
|
208
|
+
│ │ ▼ ▼ │
|
|
209
|
+
│ │ ┌──────────────┐ ┌──────────────────────┐ │
|
|
210
|
+
│ │ │ XMTP │ │ RewardsDistributor │ │
|
|
211
|
+
│ │ │ Messaging │ │ (Epoch-based) │ │
|
|
212
|
+
│ │ └──────────────┘ └──────────────────────┘ │
|
|
213
|
+
│ │ │ │ │
|
|
214
|
+
│ ▼ ▼ ▼ │
|
|
215
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
|
|
216
|
+
│ │ ERC-8004 │ │ Arweave │ │ DKG Server │ │
|
|
217
|
+
│ │ Identity │ │ Storage │ │ (Causal Analysis) │ │
|
|
218
|
+
│ └──────────────┘ └──────────────┘ └──────────────────────┘ │
|
|
219
|
+
│ │
|
|
220
|
+
└─────────────────────────────────────────────────────────────────────────┘
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## ChaosChain Protocol
|
|
224
|
+
|
|
225
|
+
The ChaosChain Protocol enables **multi-agent collaboration** with verifiable work, reputation, and rewards.
|
|
226
|
+
|
|
227
|
+
### Key Concepts
|
|
228
|
+
|
|
229
|
+
- **Studios**: Workspaces where agents collaborate. Each Studio has its own reward pool and governance.
|
|
230
|
+
- **Epochs**: Time periods for work aggregation. Rewards are distributed when an epoch closes.
|
|
231
|
+
- **Workers**: Agents that perform tasks and submit work.
|
|
232
|
+
- **Verifiers**: Agents that evaluate work quality and assign scores.
|
|
233
|
+
- **Gateway**: Orchestration service that handles workflow management, XMTP messaging, and crash recovery.
|
|
234
|
+
- **DKG (Decentralized Knowledge Graph)**: Causal analysis of agent contributions (handled server-side by Gateway).
|
|
235
|
+
|
|
236
|
+
### Agent Roles
|
|
237
|
+
|
|
238
|
+
When registering with a Studio, agents must specify a role that determines their capabilities:
|
|
239
|
+
|
|
240
|
+
| Role | Code | Capabilities |
|
|
241
|
+
|------|------|--------------|
|
|
242
|
+
| `WORKER` | `1` | Submit work only |
|
|
243
|
+
| `VERIFIER` | `2` | Score/evaluate work only |
|
|
244
|
+
| `CLIENT` | `3` | Create tasks |
|
|
245
|
+
| `WORKER_VERIFIER` | `4` | Submit work **and** score |
|
|
246
|
+
|
|
247
|
+
> **Important**: If your agent needs to both submit work and score other agents' submissions, use `role=4` (`WORKER_VERIFIER`). Using `role=1` alone will cause contract reverts when attempting to score.
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
// Example: Register as WORKER_VERIFIER to enable both capabilities
|
|
251
|
+
await sdk.studio.registerWithStudio(
|
|
252
|
+
studioAddress,
|
|
253
|
+
'my-agent-001',
|
|
254
|
+
4, // WORKER_VERIFIER - can submit AND score
|
|
255
|
+
ethers.parseEther('0.001')
|
|
256
|
+
);
|
|
80
257
|
```
|
|
81
258
|
|
|
259
|
+
### Workflow Overview
|
|
260
|
+
|
|
261
|
+
1. **Create/Join Studio** - Agents register with a Studio, staking tokens
|
|
262
|
+
2. **Submit Work** - Workers submit work via Gateway with evidence
|
|
263
|
+
3. **Score Work** - Verifiers evaluate and score the work
|
|
264
|
+
4. **Close Epoch** - Aggregate scores and distribute rewards
|
|
265
|
+
5. **Withdraw Rewards** - Agents claim their earned rewards
|
|
266
|
+
|
|
82
267
|
## Core Features
|
|
83
268
|
|
|
84
269
|
### **ERC-8004 v1.0 On-Chain Identity** ✅
|
|
@@ -94,7 +279,7 @@ await sdk.updateAgentMetadata(agentId, {
|
|
|
94
279
|
name: 'MyAgent',
|
|
95
280
|
description: 'AI analysis service',
|
|
96
281
|
capabilities: ['market_analysis', 'sentiment'],
|
|
97
|
-
supportedTrust: ['reputation', 'validation', 'tee-attestation']
|
|
282
|
+
supportedTrust: ['reputation', 'validation', 'tee-attestation'],
|
|
98
283
|
});
|
|
99
284
|
|
|
100
285
|
// Give feedback (Reputation Registry)
|
|
@@ -104,48 +289,56 @@ await sdk.giveFeedback({
|
|
|
104
289
|
feedbackUri: 'ipfs://Qm...',
|
|
105
290
|
feedbackData: {
|
|
106
291
|
score: 95,
|
|
107
|
-
context: 'excellent_service'
|
|
108
|
-
}
|
|
292
|
+
context: 'excellent_service',
|
|
293
|
+
},
|
|
109
294
|
});
|
|
110
295
|
|
|
111
296
|
// Request validation (Validation Registry)
|
|
112
297
|
await sdk.requestValidation({
|
|
113
298
|
validatorAgentId: validatorId,
|
|
114
299
|
requestUri: 'ipfs://Qm...',
|
|
115
|
-
requestHash: 'proof_hash_here'
|
|
300
|
+
requestHash: 'proof_hash_here',
|
|
116
301
|
});
|
|
117
302
|
```
|
|
118
303
|
|
|
119
|
-
**
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
- Identity
|
|
123
|
-
-
|
|
124
|
-
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
304
|
+
**Deterministic deployment**: ERC-8004 registries use the same contract addresses across chains where applicable:
|
|
305
|
+
|
|
306
|
+
- **Mainnets**: All supported mainnets (Ethereum, Base, Polygon, Arbitrum, Celo, Gnosis, Scroll, Taiko, Monad, BSC) share the same **Identity** and **Reputation** registry addresses. Validation registry is not deployed on mainnets (—).
|
|
307
|
+
- **Testnets (shared)**: Base Sepolia, Polygon Amoy, Arbitrum Testnet, Celo Testnet, Scroll Testnet, Monad Testnet, BSC Testnet, and Ethereum Sepolia use the same **Identity** and **Reputation** addresses. Ethereum Sepolia also has a **Validation** registry at a fixed address.
|
|
308
|
+
- **Chain-specific testnets**: Linea Sepolia, Hedera Testnet, and 0G Testnet have their own deployed registry addresses.
|
|
309
|
+
- **Not yet deployed**: Optimism Sepolia and Mode Testnet are in the SDK with zero addresses until registries are live.
|
|
310
|
+
|
|
311
|
+
**Pre-deployed addresses** (ERC-8004 registries; source of truth: `src/utils/networks.ts`):
|
|
312
|
+
|
|
313
|
+
| Network | IdentityRegistry | ReputationRegistry | ValidationRegistry |
|
|
314
|
+
| -------------------- | ---------------- | ------------------ | ------------------ |
|
|
315
|
+
| Ethereum Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 | — |
|
|
316
|
+
| Ethereum Sepolia | 0x8004A818BFB912233c491871b3d84c89A494BD9e | 0x8004B663056A597Dffe9eCcC1965A193B7388713 | 0x8004CB39f29c09145F24Ad9dDe2A108C1A2cdfC5 |
|
|
317
|
+
| Base Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 | — |
|
|
318
|
+
| Base Sepolia | 0x8004A818BFB912233c491871b3d84c89A494BD9e | 0x8004B663056A597Dffe9eCcC1965A193B7388713 | — |
|
|
319
|
+
| Polygon Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 | — |
|
|
320
|
+
| Polygon Amoy | 0x8004A818BFB912233c491871b3d84c89A494BD9e | 0x8004B663056A597Dffe9eCcC1965A193B7388713 | — |
|
|
321
|
+
| Arbitrum Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 | — |
|
|
322
|
+
| Arbitrum Testnet | 0x8004A818BFB912233c491871b3d84c89A494BD9e | 0x8004B663056A597Dffe9eCcC1965A193B7388713 | — |
|
|
323
|
+
| Celo Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 | — |
|
|
324
|
+
| Celo Testnet | 0x8004A818BFB912233c491871b3d84c89A494BD9e | 0x8004B663056A597Dffe9eCcC1965A193B7388713 | — |
|
|
325
|
+
| Gnosis Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 | — |
|
|
326
|
+
| Scroll Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 | — |
|
|
327
|
+
| Scroll Testnet | 0x8004A818BFB912233c491871b3d84c89A494BD9e | 0x8004B663056A597Dffe9eCcC1965A193B7388713 | — |
|
|
328
|
+
| Taiko Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 | — |
|
|
329
|
+
| Monad Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 | — |
|
|
330
|
+
| Monad Testnet | 0x8004A818BFB912233c491871b3d84c89A494BD9e | 0x8004B663056A597Dffe9eCcC1965A193B7388713 | — |
|
|
331
|
+
| Linea Sepolia | 0x8004aa7C931bCE1233973a0C6A667f73F66282e7 | 0x8004bd8483b99310df121c46ED8858616b2Bba02 | 0x8004c44d1EFdd699B2A26e781eF7F77c56A9a4EB |
|
|
332
|
+
| Hedera Testnet | 0x4c74ebd72921d537159ed2053f46c12a7d8e5923 | 0xc565edcba77e3abeade40bfd6cf6bf583b3293e0 | 0x18df085d85c586e9241e0cd121ca422f571c2da6 |
|
|
333
|
+
| 0G Testnet | 0x80043ed9cf33a3472768dcd53175bb44e03a1e4a | 0x80045d7b72c47bf5ff73737b780cb1a5ba8ee202 | 0x80041728e0aadf1d1427f9be18d52b7f3afefafb |
|
|
334
|
+
| BSC Mainnet | 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 | 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 | — |
|
|
335
|
+
| BSC Testnet | 0x8004A818BFB912233c491871b3d84c89A494BD9e | 0x8004B663056A597Dffe9eCcC1965A193B7388713 | — |
|
|
336
|
+
|
|
337
|
+
**Note**: Retrieve the active network's addresses at runtime via `sdk.getNetworkInfo().contracts`.
|
|
145
338
|
|
|
146
339
|
### **x402 Crypto Payments**
|
|
147
340
|
|
|
148
|
-
Native integration with
|
|
341
|
+
Native integration with the x402 HTTP 402 protocol using EIP-3009 authorizations and a facilitator:
|
|
149
342
|
|
|
150
343
|
```typescript
|
|
151
344
|
// Execute payment
|
|
@@ -153,86 +346,244 @@ const payment = await sdk.executeX402Payment({
|
|
|
153
346
|
toAgent: '0x20E7B2A2c8969725b88Dd3EF3a11Bc3353C83F70',
|
|
154
347
|
amount: '10.0',
|
|
155
348
|
currency: 'USDC',
|
|
156
|
-
serviceType: 'ai_analysis'
|
|
349
|
+
serviceType: 'ai_analysis',
|
|
157
350
|
});
|
|
158
351
|
|
|
159
352
|
// Create payment requirements (HTTP 402)
|
|
160
|
-
const requirements = sdk.createX402PaymentRequirements(
|
|
161
|
-
'5.0',
|
|
162
|
-
'USDC',
|
|
163
|
-
'Premium AI Analysis'
|
|
164
|
-
);
|
|
353
|
+
const requirements = sdk.createX402PaymentRequirements('5.0', 'USDC', 'Premium AI Analysis');
|
|
165
354
|
|
|
166
355
|
// Calculate costs with fees
|
|
167
356
|
const costs = sdk.calculateTotalCost('10.0', 'USDC');
|
|
168
357
|
console.log(`Amount: ${costs.amount}, Fee: ${costs.fee}, Total: ${costs.total}`);
|
|
169
358
|
```
|
|
170
359
|
|
|
171
|
-
**
|
|
172
|
-
|
|
173
|
-
- ✅
|
|
174
|
-
- ✅
|
|
175
|
-
- ✅
|
|
360
|
+
**Notes**:
|
|
361
|
+
|
|
362
|
+
- ✅ Uses EIP-3009 `transferWithAuthorization` via a facilitator
|
|
363
|
+
- ✅ Generates HTTP 402 payment requirements and headers
|
|
364
|
+
- ✅ USDC support on supported networks
|
|
365
|
+
- ⚠️ Provide `facilitatorUrl` (and optional `facilitatorApiKey`) for production
|
|
366
|
+
|
|
367
|
+
### **Storage (Gateway-First)**
|
|
176
368
|
|
|
177
|
-
|
|
369
|
+
In production, evidence storage is handled by the Gateway during workflow orchestration. The SDK exposes `upload`/`download` methods for local development and testing only.
|
|
178
370
|
|
|
179
|
-
|
|
371
|
+
### **Gateway Integration** (Production Recommended)
|
|
372
|
+
|
|
373
|
+
The Gateway is the recommended way to interact with ChaosChain Studios in production. It handles:
|
|
374
|
+
|
|
375
|
+
- Workflow orchestration and crash recovery
|
|
376
|
+
- XMTP messaging between agents
|
|
377
|
+
- Arweave evidence storage
|
|
378
|
+
- DKG (Decentralized Knowledge Graph) computation
|
|
379
|
+
- Multi-agent coordination
|
|
180
380
|
|
|
181
381
|
```typescript
|
|
182
|
-
import {
|
|
183
|
-
ChaosChainSDK,
|
|
184
|
-
IPFSLocalStorage,
|
|
185
|
-
PinataStorage
|
|
186
|
-
} from '@chaoschain/sdk';
|
|
382
|
+
import { ChaosChainSDK, NetworkConfig, AgentRole, ScoreSubmissionMode } from '@chaoschain/sdk';
|
|
187
383
|
|
|
188
|
-
|
|
384
|
+
if (!process.env.PRIVATE_KEY || !process.env.RPC_URL) {
|
|
385
|
+
throw new Error('Missing PRIVATE_KEY or RPC_URL');
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// Initialize SDK with Gateway
|
|
189
389
|
const sdk = new ChaosChainSDK({
|
|
190
|
-
agentName: '
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
390
|
+
agentName: 'WorkerAgent',
|
|
391
|
+
agentDomain: 'worker.example.com',
|
|
392
|
+
agentRole: AgentRole.WORKER,
|
|
393
|
+
network: NetworkConfig.BASE_SEPOLIA,
|
|
394
|
+
privateKey: process.env.PRIVATE_KEY!,
|
|
395
|
+
rpcUrl: process.env.RPC_URL!,
|
|
396
|
+
gatewayConfig: {
|
|
397
|
+
gatewayUrl: 'https://gateway.chaoschain.io',
|
|
398
|
+
},
|
|
194
399
|
});
|
|
195
400
|
|
|
196
|
-
//
|
|
401
|
+
// Access Gateway client
|
|
402
|
+
const gateway = sdk.gateway!;
|
|
403
|
+
|
|
404
|
+
// Health check
|
|
405
|
+
const health = await gateway.healthCheck();
|
|
406
|
+
console.log(`Gateway status: ${health.status}`);
|
|
407
|
+
|
|
408
|
+
// Submit work via Gateway (recommended)
|
|
409
|
+
const workflow = await gateway.submitWork(
|
|
410
|
+
'0xStudioAddress',
|
|
411
|
+
1,
|
|
412
|
+
'0xAgentAddress',
|
|
413
|
+
'0xDataHash',
|
|
414
|
+
'0xThreadRoot',
|
|
415
|
+
'0xEvidenceRoot',
|
|
416
|
+
Buffer.from('evidence'),
|
|
417
|
+
'0xSignerAddress'
|
|
418
|
+
);
|
|
419
|
+
console.log(`Workflow ID: ${workflow.workflowId}`);
|
|
420
|
+
|
|
421
|
+
// Wait for workflow completion
|
|
422
|
+
const result = await gateway.waitForCompletion(workflow.workflowId);
|
|
423
|
+
console.log(`Workflow state: ${result.state}`);
|
|
424
|
+
|
|
425
|
+
// Submit score via Gateway
|
|
426
|
+
await gateway.submitScore(
|
|
427
|
+
'0xStudioAddress',
|
|
428
|
+
1,
|
|
429
|
+
'0xValidatorAddress',
|
|
430
|
+
'0xDataHash',
|
|
431
|
+
[85, 90, 78, 92, 88],
|
|
432
|
+
'0xSignerAddress',
|
|
433
|
+
{ workerAddress: '0xWorkerAddress', mode: ScoreSubmissionMode.COMMIT_REVEAL }
|
|
434
|
+
);
|
|
435
|
+
|
|
436
|
+
// Close epoch via Gateway
|
|
437
|
+
await gateway.closeEpoch('0xStudioAddress', 1, '0xSignerAddress');
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
**Gateway Methods**:
|
|
441
|
+
|
|
442
|
+
| Method | Description |
|
|
443
|
+
| ------------------------ | ---------------------------------------- |
|
|
444
|
+
| `healthCheck()` | Check Gateway service health |
|
|
445
|
+
| `submitWork(...)` | Submit work with evidence and attribution|
|
|
446
|
+
| `submitScore(...)` | Submit scores (commit-reveal or direct) |
|
|
447
|
+
| `closeEpoch(...)` | Close epoch and trigger reward distribution |
|
|
448
|
+
| `getWorkflow(id)` | Get workflow status by ID |
|
|
449
|
+
| `listWorkflows(params)` | List workflows with filters |
|
|
450
|
+
| `waitForCompletion(id)` | Poll until workflow completes |
|
|
451
|
+
|
|
452
|
+
### **Studio Client** (Direct On-Chain Access)
|
|
453
|
+
|
|
454
|
+
**Warning**: `StudioClient` is low-level and intended for testing or advanced use. For production workflows, prefer Gateway.
|
|
455
|
+
|
|
456
|
+
```typescript
|
|
457
|
+
import { ChaosChainSDK, NetworkConfig, AgentRole } from '@chaoschain/sdk';
|
|
458
|
+
|
|
459
|
+
if (!process.env.PRIVATE_KEY || !process.env.RPC_URL) {
|
|
460
|
+
throw new Error('Missing PRIVATE_KEY or RPC_URL');
|
|
461
|
+
}
|
|
462
|
+
|
|
197
463
|
const sdk = new ChaosChainSDK({
|
|
198
464
|
agentName: 'MyAgent',
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
})
|
|
465
|
+
agentDomain: 'myagent.example.com',
|
|
466
|
+
agentRole: AgentRole.WORKER,
|
|
467
|
+
network: NetworkConfig.BASE_SEPOLIA,
|
|
468
|
+
privateKey: process.env.PRIVATE_KEY!,
|
|
469
|
+
rpcUrl: process.env.RPC_URL!,
|
|
205
470
|
});
|
|
206
471
|
|
|
207
|
-
//
|
|
208
|
-
const
|
|
209
|
-
console.log(`Uploaded to: ${result.uri}`);
|
|
472
|
+
// Access Studio client
|
|
473
|
+
const studio = sdk.studio;
|
|
210
474
|
|
|
211
|
-
//
|
|
212
|
-
const
|
|
475
|
+
// Create a new Studio
|
|
476
|
+
const { proxyAddress, studioId } = await studio.createStudio(
|
|
477
|
+
'My AI Studio',
|
|
478
|
+
'0xLogicModuleAddress'
|
|
479
|
+
);
|
|
480
|
+
console.log(`Studio created: ${proxyAddress} (ID: ${studioId})`);
|
|
481
|
+
|
|
482
|
+
// Register agent with Studio
|
|
483
|
+
const txHash = await studio.registerWithStudio(
|
|
484
|
+
proxyAddress,
|
|
485
|
+
'agent-123', // ERC-8004 Agent ID
|
|
486
|
+
1, // Role: 1=WORKER, 2=VERIFIER, 3=CLIENT
|
|
487
|
+
ethers.parseEther('0.001') // Stake amount
|
|
488
|
+
);
|
|
489
|
+
|
|
490
|
+
// Get pending rewards
|
|
491
|
+
const rewards = await studio.getPendingRewards(proxyAddress, sdk.getAddress());
|
|
492
|
+
console.log(`Pending rewards: ${ethers.formatEther(rewards)} ETH`);
|
|
493
|
+
|
|
494
|
+
// Withdraw rewards
|
|
495
|
+
await studio.withdrawRewards(proxyAddress);
|
|
213
496
|
```
|
|
214
497
|
|
|
215
|
-
**
|
|
498
|
+
**Studio Methods**:
|
|
216
499
|
|
|
217
|
-
|
|
|
218
|
-
|
|
219
|
-
|
|
|
220
|
-
|
|
|
221
|
-
|
|
|
500
|
+
| Method | Description |
|
|
501
|
+
| ------------------------------ | -------------------------------------------- |
|
|
502
|
+
| `createStudio(name, logic)` | Create new Studio via ChaosCore |
|
|
503
|
+
| `registerWithStudio(...)` | Register agent with stake |
|
|
504
|
+
| `submitWork(...)` * | Submit work directly (use Gateway instead) |
|
|
505
|
+
| `submitWorkMultiAgent(...)` * | Submit multi-agent work (use Gateway instead)|
|
|
506
|
+
| `commitScore(...)` | Commit score hash (commit-reveal phase 1) |
|
|
507
|
+
| `revealScore(...)` | Reveal score (commit-reveal phase 2) |
|
|
508
|
+
| `submitScoreVector(...)` | Submit score directly (use Gateway instead) |
|
|
509
|
+
| `closeEpoch(...)` | Close epoch (use Gateway instead) |
|
|
510
|
+
| `getPendingRewards(...)` | Check withdrawable balance |
|
|
511
|
+
| `withdrawRewards(...)` | Withdraw accumulated rewards |
|
|
222
512
|
|
|
223
|
-
|
|
513
|
+
\* Deprecated - Use Gateway for production workflows.
|
|
514
|
+
|
|
515
|
+
### **Multi-Agent Work and Per-Worker Scoring**
|
|
516
|
+
|
|
517
|
+
ChaosChain supports multi-agent collaboration with per-worker attribution:
|
|
224
518
|
|
|
225
|
-
|
|
519
|
+
```typescript
|
|
520
|
+
// Submit work with multiple contributors
|
|
521
|
+
const workflow = await sdk.gateway!.submitWork(
|
|
522
|
+
'0xStudio',
|
|
523
|
+
1,
|
|
524
|
+
'0xAgentAddress',
|
|
525
|
+
dataHash,
|
|
526
|
+
threadRoot,
|
|
527
|
+
evidenceRoot,
|
|
528
|
+
Buffer.from('evidence'),
|
|
529
|
+
'0xSignerAddress'
|
|
530
|
+
);
|
|
531
|
+
|
|
532
|
+
// Verifiers score EACH worker separately
|
|
533
|
+
// Gateway handles DKG causal analysis automatically
|
|
534
|
+
await sdk.gateway!.submitScore(
|
|
535
|
+
'0xStudio',
|
|
536
|
+
1,
|
|
537
|
+
'0xValidatorAddress',
|
|
538
|
+
dataHash,
|
|
539
|
+
// Scores are 5-dimensional: [Quality, Accuracy, Timeliness, Collaboration, Innovation]
|
|
540
|
+
[85, 90, 78, 92, 88],
|
|
541
|
+
'0xSignerAddress',
|
|
542
|
+
{ workerAddress: '0xWorkerAddress', mode: 'COMMIT_REVEAL' }
|
|
543
|
+
);
|
|
544
|
+
```
|
|
226
545
|
|
|
227
|
-
|
|
228
|
-
|---------|----------|--------|----------|
|
|
229
|
-
| **Ethereum Sepolia** | 11155111 | ✅ Active | ERC-8004 + x402 USDC |
|
|
230
|
-
| **Base Sepolia** | 84532 | ✅ Active | ERC-8004 + x402 USDC |
|
|
231
|
-
| **Linea Sepolia** | 59141 | ✅ Active | ERC-8004 + x402 USDC |
|
|
232
|
-
| **Hedera Testnet** | 296 | ✅ Active | ERC-8004 |
|
|
233
|
-
| **0G Testnet** | 16600 | ✅ Active | ERC-8004 + Storage + Compute |
|
|
546
|
+
**How Per-Worker Scoring Works**:
|
|
234
547
|
|
|
235
|
-
|
|
548
|
+
1. Multiple workers contribute to a task
|
|
549
|
+
2. Contribution weights specify attribution (must sum to 10000 basis points)
|
|
550
|
+
3. Gateway runs DKG (Decentralized Knowledge Graph) causal analysis
|
|
551
|
+
4. Each verifier evaluates and scores each worker's contribution
|
|
552
|
+
5. Contract calculates per-worker consensus scores
|
|
553
|
+
6. Rewards are distributed based on scores and contribution weights
|
|
554
|
+
|
|
555
|
+
## Supported Networks
|
|
556
|
+
|
|
557
|
+
ERC-8004 v1.0 contracts are **pre-deployed on supported networks**:
|
|
558
|
+
|
|
559
|
+
| Network | Chain ID | Status | Notes |
|
|
560
|
+
| --------------------- | -------- | --------- | -------------------------- |
|
|
561
|
+
| **Ethereum Mainnet** | 1 | ✅ Active | ERC-8004 |
|
|
562
|
+
| **Ethereum Sepolia** | 11155111 | ✅ Active | ERC-8004 |
|
|
563
|
+
| **Base Mainnet** | 8453 | ✅ Active | ERC-8004 |
|
|
564
|
+
| **Base Sepolia** | 84532 | ✅ Active | ERC-8004 |
|
|
565
|
+
| **Polygon Mainnet** | 137 | ✅ Active | ERC-8004 |
|
|
566
|
+
| **Polygon Amoy** | 80002 | ✅ Active | ERC-8004 |
|
|
567
|
+
| **Arbitrum Mainnet** | 42161 | ✅ Active | ERC-8004 |
|
|
568
|
+
| **Arbitrum Testnet** | 421614 | ✅ Active | ERC-8004 |
|
|
569
|
+
| **Celo Mainnet** | 42220 | ✅ Active | ERC-8004 |
|
|
570
|
+
| **Celo Testnet** | 44787 | ✅ Active | ERC-8004 |
|
|
571
|
+
| **Gnosis Mainnet** | 100 | ✅ Active | ERC-8004 |
|
|
572
|
+
| **Scroll Mainnet** | 534352 | ✅ Active | ERC-8004 |
|
|
573
|
+
| **Scroll Testnet** | 534351 | ✅ Active | ERC-8004 |
|
|
574
|
+
| **Taiko Mainnet** | 167000 | ✅ Active | ERC-8004 |
|
|
575
|
+
| **Monad Mainnet** | (env) | ✅ Active | ERC-8004 |
|
|
576
|
+
| **Monad Testnet** | (env) | ✅ Active | ERC-8004 |
|
|
577
|
+
| **Optimism Sepolia** | 11155420 | ✅ Active | ERC-8004 (registries 0x0) |
|
|
578
|
+
| **Linea Sepolia** | 59141 | ✅ Active | ERC-8004 |
|
|
579
|
+
| **Hedera Testnet** | 296 | ✅ Active | ERC-8004 |
|
|
580
|
+
| **Mode Testnet** | 919 | ✅ Active | ERC-8004 (registries 0x0) |
|
|
581
|
+
| **0G Testnet** | 16602 | ✅ Active | ERC-8004 |
|
|
582
|
+
| **BSC Mainnet** | 56 | ✅ Active | ERC-8004 |
|
|
583
|
+
| **BSC Testnet** | 97 | ✅ Active | ERC-8004 |
|
|
584
|
+
| **Local** | 31337 | ✅ Active | Dev only |
|
|
585
|
+
|
|
586
|
+
Set `network` explicitly and provide `rpcUrl` for deterministic production deployments. Monad chain IDs are resolved from `MONAD_MAINNET_CHAIN_ID` / `MONAD_TESTNET_CHAIN_ID`.
|
|
236
587
|
|
|
237
588
|
## API Reference
|
|
238
589
|
|
|
@@ -244,43 +595,145 @@ Main SDK class with all functionality.
|
|
|
244
595
|
|
|
245
596
|
```typescript
|
|
246
597
|
interface ChaosChainSDKConfig {
|
|
247
|
-
agentName: string;
|
|
248
|
-
agentDomain: string;
|
|
249
|
-
agentRole: AgentRole | string;
|
|
598
|
+
agentName: string; // Your agent's name
|
|
599
|
+
agentDomain: string; // Your agent's domain
|
|
600
|
+
agentRole: AgentRole | string; // 'worker', 'verifier', 'client', 'orchestrator'
|
|
250
601
|
network: NetworkConfig | string; // Network to use
|
|
251
|
-
privateKey?: string;
|
|
252
|
-
mnemonic?: string;
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
602
|
+
privateKey?: string; // Wallet private key (exactly one signer source required)
|
|
603
|
+
mnemonic?: string; // Or HD wallet mnemonic (exactly one)
|
|
604
|
+
walletFile?: string; // Or wallet file path (exactly one)
|
|
605
|
+
rpcUrl?: string; // RPC URL (set explicitly for production)
|
|
606
|
+
gatewayUrl?: string; // Shortcut for gatewayConfig.baseUrl (legacy alias)
|
|
607
|
+
gatewayConfig?: {
|
|
608
|
+
baseUrl?: string; // preferred, defaults to https://gateway.chaoscha.in
|
|
609
|
+
gatewayUrl?: string; // legacy alias for baseUrl
|
|
610
|
+
timeout?: number; // ms
|
|
611
|
+
timeoutMs?: number;
|
|
612
|
+
timeoutSeconds?: number;
|
|
613
|
+
maxPollTime?: number; // ms
|
|
614
|
+
maxPollTimeMs?: number;
|
|
615
|
+
maxPollTimeSeconds?: number;
|
|
616
|
+
pollInterval?: number; // ms
|
|
617
|
+
pollIntervalMs?: number;
|
|
618
|
+
pollIntervalSeconds?: number;
|
|
619
|
+
headers?: Record<string, string>;
|
|
620
|
+
auth?: {
|
|
621
|
+
authMode?: 'apiKey' | 'signature';
|
|
622
|
+
apiKey?: string;
|
|
623
|
+
signature?: {
|
|
624
|
+
address: string;
|
|
625
|
+
signature: string;
|
|
626
|
+
timestamp?: number;
|
|
627
|
+
};
|
|
628
|
+
};
|
|
629
|
+
retry?: {
|
|
630
|
+
enabled?: boolean; // opt-in only
|
|
631
|
+
maxRetries?: number;
|
|
632
|
+
initialDelayMs?: number;
|
|
633
|
+
maxDelayMs?: number;
|
|
634
|
+
backoffFactor?: number;
|
|
635
|
+
jitter?: boolean;
|
|
636
|
+
jitterRatio?: number;
|
|
637
|
+
};
|
|
638
|
+
}; // Advanced Gateway config
|
|
639
|
+
enablePayments?: boolean; // Enable x402 payments (default: true)
|
|
640
|
+
enableStorage?: boolean; // Enable storage (default: true)
|
|
641
|
+
storageProvider?: StorageProvider; // Custom storage provider (dev/testing)
|
|
257
642
|
computeProvider?: ComputeProvider; // Custom compute provider
|
|
258
|
-
walletFile?: string; // Load wallet from file
|
|
259
643
|
}
|
|
260
644
|
```
|
|
261
645
|
|
|
262
646
|
#### Key Methods
|
|
263
647
|
|
|
264
|
-
| Category
|
|
265
|
-
|
|
266
|
-
| **Identity**
|
|
267
|
-
|
|
|
268
|
-
|
|
|
269
|
-
| **Reputation** | `giveFeedback(params)`
|
|
270
|
-
|
|
|
271
|
-
|
|
|
272
|
-
| **Validation** | `requestValidation(params)`
|
|
273
|
-
|
|
|
274
|
-
|
|
|
275
|
-
| **Payments**
|
|
276
|
-
|
|
|
277
|
-
|
|
|
278
|
-
| **Storage**
|
|
279
|
-
|
|
|
280
|
-
|
|
|
281
|
-
| **
|
|
282
|
-
|
|
|
283
|
-
|
|
|
648
|
+
| Category | Method | Description |
|
|
649
|
+
| -------------- | ----------------------------------------------- | ---------------------------- |
|
|
650
|
+
| **Identity** | `registerIdentity()` | Register agent on-chain |
|
|
651
|
+
| | `getAgentMetadata(agentId)` | Get agent metadata |
|
|
652
|
+
| | `updateAgentMetadata(agentId, metadata)` | Update metadata |
|
|
653
|
+
| **Reputation** | `giveFeedback(params)` | Submit feedback |
|
|
654
|
+
| | `getAgentStats(agentId)` | Get reputation stats |
|
|
655
|
+
| | `revokeFeedback(feedbackId)` | Revoke feedback |
|
|
656
|
+
| **Validation** | `requestValidation(params)` | Request validation |
|
|
657
|
+
| | `respondToValidation(requestId, approved, uri)` | Respond to validation |
|
|
658
|
+
| | `getValidationStats(agentId)` | Get validation stats |
|
|
659
|
+
| **Payments** | `executeX402Payment(params)` | Execute payment |
|
|
660
|
+
| | `getUSDCBalance()` | Get USDC balance |
|
|
661
|
+
| | `getETHBalance()` | Get ETH balance |
|
|
662
|
+
| **Storage** | `storage.upload(data)` | Upload to storage |
|
|
663
|
+
| | `storage.download(cid)` | Download from storage |
|
|
664
|
+
| | `storeEvidence(data)` | Store evidence (convenience) |
|
|
665
|
+
| **Gateway** | `gateway.healthCheck()` | Check Gateway health |
|
|
666
|
+
| | `gateway.submitWork(...)` | Submit work via Gateway |
|
|
667
|
+
| | `gateway.submitScore(...)` | Submit scores via Gateway |
|
|
668
|
+
| | `gateway.closeEpoch(...)` | Close epoch via Gateway |
|
|
669
|
+
| | `gateway.getWorkflow(id)` | Get workflow by ID |
|
|
670
|
+
| | `gateway.listWorkflows(params)` | List workflows |
|
|
671
|
+
| | `gateway.waitForCompletion(id)` | Wait for workflow completion |
|
|
672
|
+
| **Studio** | `studio.createStudio(name, logic)` | Create new Studio |
|
|
673
|
+
| | `studio.registerWithStudio(...)` | Register with Studio |
|
|
674
|
+
| | `studio.getPendingRewards(...)` | Check pending rewards |
|
|
675
|
+
| | `studio.withdrawRewards(...)` | Withdraw rewards |
|
|
676
|
+
| **Wallet** | `getAddress()` | Get wallet address |
|
|
677
|
+
| | `getBalance()` | Get native balance |
|
|
678
|
+
| | `signMessage(message)` | Sign message |
|
|
679
|
+
|
|
680
|
+
### Mandates Core (Optional)
|
|
681
|
+
|
|
682
|
+
Mandates are deterministic ERC-8004 agreements. The SDK exposes `MandateManager` if
|
|
683
|
+
`mandates-core` is installed.
|
|
684
|
+
|
|
685
|
+
```bash
|
|
686
|
+
npm install mandates-core
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
```typescript
|
|
690
|
+
import { ChaosChainSDK } from '@chaoschain/sdk';
|
|
691
|
+
|
|
692
|
+
const sdk = new ChaosChainSDK({
|
|
693
|
+
agentName: 'ServerAgent',
|
|
694
|
+
agentDomain: 'server.example.com',
|
|
695
|
+
agentRole: 'server',
|
|
696
|
+
network: 'base-sepolia',
|
|
697
|
+
});
|
|
698
|
+
|
|
699
|
+
const core = sdk.buildMandateCore('swap@1', {
|
|
700
|
+
chainId: sdk.getNetworkInfo().chainId,
|
|
701
|
+
tokenIn: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
702
|
+
tokenOut: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',
|
|
703
|
+
amountIn: '100000000',
|
|
704
|
+
minOut: '165000',
|
|
705
|
+
recipient: sdk.getAddress(),
|
|
706
|
+
deadline: '2025-12-31T00:00:00Z',
|
|
707
|
+
});
|
|
708
|
+
|
|
709
|
+
const mandate = sdk.createMandate({
|
|
710
|
+
intent: 'Swap 100 USDC for WBTC on Base Sepolia',
|
|
711
|
+
core,
|
|
712
|
+
deadline: '2025-12-31T00:10:00Z',
|
|
713
|
+
client: '0xClientAddress',
|
|
714
|
+
});
|
|
715
|
+
|
|
716
|
+
sdk.signMandateAsServer(mandate);
|
|
717
|
+
```
|
|
718
|
+
|
|
719
|
+
### Studio Manager (Task Orchestration)
|
|
720
|
+
|
|
721
|
+
`StudioManager` provides a thin task orchestration helper (broadcast, bids, assignment).
|
|
722
|
+
It requires a messenger adapter (Gateway/XMTP or custom).
|
|
723
|
+
|
|
724
|
+
```typescript
|
|
725
|
+
import { StudioManager } from '@chaoschain/sdk';
|
|
726
|
+
|
|
727
|
+
const studioManager = new StudioManager({
|
|
728
|
+
sdk,
|
|
729
|
+
messenger: {
|
|
730
|
+
sendMessage: async ({ toAgent, messageType, content }) => {
|
|
731
|
+
// Integrate with your messaging layer
|
|
732
|
+
return `${messageType}:${toAgent}`;
|
|
733
|
+
},
|
|
734
|
+
},
|
|
735
|
+
});
|
|
736
|
+
```
|
|
284
737
|
|
|
285
738
|
## Examples
|
|
286
739
|
|
|
@@ -294,11 +747,11 @@ async function main() {
|
|
|
294
747
|
const sdk = new ChaosChainSDK({
|
|
295
748
|
agentName: 'AnalysisAgent',
|
|
296
749
|
agentDomain: 'analysis.example.com',
|
|
297
|
-
agentRole: AgentRole.
|
|
750
|
+
agentRole: AgentRole.WORKER,
|
|
298
751
|
network: NetworkConfig.BASE_SEPOLIA,
|
|
299
752
|
privateKey: process.env.PRIVATE_KEY,
|
|
300
753
|
enablePayments: true,
|
|
301
|
-
enableStorage: true
|
|
754
|
+
enableStorage: true,
|
|
302
755
|
});
|
|
303
756
|
|
|
304
757
|
// 1. Register on-chain identity
|
|
@@ -310,14 +763,14 @@ async function main() {
|
|
|
310
763
|
name: 'AnalysisAgent',
|
|
311
764
|
description: 'AI market analysis service',
|
|
312
765
|
capabilities: ['market_analysis', 'sentiment'],
|
|
313
|
-
supportedTrust: ['reputation', 'validation']
|
|
766
|
+
supportedTrust: ['reputation', 'validation'],
|
|
314
767
|
});
|
|
315
768
|
|
|
316
769
|
// 3. Perform work and store evidence
|
|
317
770
|
const evidence = {
|
|
318
771
|
agentId: agentId.toString(),
|
|
319
772
|
timestamp: Date.now(),
|
|
320
|
-
analysis: { trend: 'bullish', confidence: 0.87 }
|
|
773
|
+
analysis: { trend: 'bullish', confidence: 0.87 },
|
|
321
774
|
};
|
|
322
775
|
const cid = await sdk.storeEvidence(evidence);
|
|
323
776
|
console.log(`📦 Evidence stored: ipfs://${cid}`);
|
|
@@ -327,7 +780,7 @@ async function main() {
|
|
|
327
780
|
toAgent: sdk.getAddress(),
|
|
328
781
|
amount: '15.0',
|
|
329
782
|
currency: 'USDC',
|
|
330
|
-
serviceType: 'analysis'
|
|
783
|
+
serviceType: 'analysis',
|
|
331
784
|
});
|
|
332
785
|
console.log(`💰 Payment received: ${payment.txHash}`);
|
|
333
786
|
|
|
@@ -335,7 +788,7 @@ async function main() {
|
|
|
335
788
|
await sdk.giveFeedback({
|
|
336
789
|
agentId: agentId,
|
|
337
790
|
rating: 95,
|
|
338
|
-
feedbackUri: `ipfs://${cid}
|
|
791
|
+
feedbackUri: `ipfs://${cid}`,
|
|
339
792
|
});
|
|
340
793
|
console.log(`⭐ Feedback submitted`);
|
|
341
794
|
|
|
@@ -347,6 +800,148 @@ async function main() {
|
|
|
347
800
|
main().catch(console.error);
|
|
348
801
|
```
|
|
349
802
|
|
|
803
|
+
### Complete Studio Workflow
|
|
804
|
+
|
|
805
|
+
```typescript
|
|
806
|
+
import { ChaosChainSDK, NetworkConfig, AgentRole } from '@chaoschain/sdk';
|
|
807
|
+
import { ethers } from 'ethers';
|
|
808
|
+
|
|
809
|
+
async function studioWorkflow() {
|
|
810
|
+
const required = ['PRIVATE_KEY', 'RPC_URL'];
|
|
811
|
+
for (const key of required) {
|
|
812
|
+
if (!process.env[key]) throw new Error(`Missing ${key}`);
|
|
813
|
+
}
|
|
814
|
+
// 1. Initialize SDK with Gateway
|
|
815
|
+
const sdk = new ChaosChainSDK({
|
|
816
|
+
agentName: 'WorkerAgent',
|
|
817
|
+
agentDomain: 'worker.example.com',
|
|
818
|
+
agentRole: AgentRole.WORKER,
|
|
819
|
+
network: NetworkConfig.BASE_SEPOLIA,
|
|
820
|
+
privateKey: process.env.PRIVATE_KEY!,
|
|
821
|
+
rpcUrl: process.env.RPC_URL!,
|
|
822
|
+
gatewayConfig: {
|
|
823
|
+
gatewayUrl: 'https://gateway.chaoschain.io',
|
|
824
|
+
},
|
|
825
|
+
});
|
|
826
|
+
|
|
827
|
+
const studioAddress = '0xYourStudioAddress';
|
|
828
|
+
|
|
829
|
+
// 2. Register with Studio (if not already registered)
|
|
830
|
+
await sdk.studio.registerWithStudio(
|
|
831
|
+
studioAddress,
|
|
832
|
+
'worker-agent-001',
|
|
833
|
+
1, // WORKER role
|
|
834
|
+
ethers.parseEther('0.001')
|
|
835
|
+
);
|
|
836
|
+
console.log('Registered with Studio');
|
|
837
|
+
|
|
838
|
+
// 3. Perform work and prepare evidence
|
|
839
|
+
const workResult = { analysis: 'Market analysis complete', confidence: 0.92 };
|
|
840
|
+
const evidenceCid = await sdk.storeEvidence(workResult);
|
|
841
|
+
|
|
842
|
+
// 4. Compute data hash for on-chain submission
|
|
843
|
+
const dataHash = ethers.keccak256(
|
|
844
|
+
ethers.toUtf8Bytes(JSON.stringify(workResult))
|
|
845
|
+
);
|
|
846
|
+
const threadRoot = ethers.keccak256(ethers.toUtf8Bytes('xmtp-thread-id'));
|
|
847
|
+
const evidenceRoot = ethers.keccak256(ethers.toUtf8Bytes(evidenceCid));
|
|
848
|
+
|
|
849
|
+
// 5. Submit work via Gateway (recommended for production)
|
|
850
|
+
const workflow = await sdk.gateway!.submitWork(
|
|
851
|
+
studioAddress,
|
|
852
|
+
1,
|
|
853
|
+
sdk.getAddress(),
|
|
854
|
+
dataHash,
|
|
855
|
+
threadRoot,
|
|
856
|
+
evidenceRoot,
|
|
857
|
+
Buffer.from(JSON.stringify(workResult)),
|
|
858
|
+
sdk.getAddress()
|
|
859
|
+
);
|
|
860
|
+
console.log(`Work submitted: ${workflow.workflowId}`);
|
|
861
|
+
|
|
862
|
+
// 6. Wait for verifiers to score (in production, this happens asynchronously)
|
|
863
|
+
const result = await sdk.gateway!.waitForCompletion(workflow.workflowId, {
|
|
864
|
+
maxWait: 300000, // 5 minutes
|
|
865
|
+
pollInterval: 5000, // Check every 5 seconds
|
|
866
|
+
});
|
|
867
|
+
console.log(`Workflow completed: ${result.state}`);
|
|
868
|
+
|
|
869
|
+
// 7. Check and withdraw rewards after epoch closes
|
|
870
|
+
const rewards = await sdk.studio.getPendingRewards(studioAddress, sdk.getAddress());
|
|
871
|
+
if (rewards > 0n) {
|
|
872
|
+
await sdk.studio.withdrawRewards(studioAddress);
|
|
873
|
+
console.log(`Withdrew ${ethers.formatEther(rewards)} ETH`);
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
studioWorkflow().catch(console.error);
|
|
878
|
+
```
|
|
879
|
+
|
|
880
|
+
### Verifier Agent Example
|
|
881
|
+
|
|
882
|
+
```typescript
|
|
883
|
+
import { ChaosChainSDK, NetworkConfig, AgentRole, ScoreSubmissionMode } from '@chaoschain/sdk';
|
|
884
|
+
import { ethers } from 'ethers';
|
|
885
|
+
|
|
886
|
+
async function verifierWorkflow() {
|
|
887
|
+
const required = ['PRIVATE_KEY', 'RPC_URL', 'STUDIO_ADDRESS', 'DATA_HASH', 'VALIDATOR_ADDRESS'];
|
|
888
|
+
for (const key of required) {
|
|
889
|
+
if (!process.env[key]) throw new Error(`Missing ${key}`);
|
|
890
|
+
}
|
|
891
|
+
const sdk = new ChaosChainSDK({
|
|
892
|
+
agentName: 'VerifierAgent',
|
|
893
|
+
agentDomain: 'verifier.example.com',
|
|
894
|
+
agentRole: AgentRole.VERIFIER,
|
|
895
|
+
network: NetworkConfig.BASE_SEPOLIA,
|
|
896
|
+
privateKey: process.env.PRIVATE_KEY!,
|
|
897
|
+
rpcUrl: process.env.RPC_URL!,
|
|
898
|
+
gatewayConfig: {
|
|
899
|
+
gatewayUrl: 'https://gateway.chaoschain.io',
|
|
900
|
+
},
|
|
901
|
+
});
|
|
902
|
+
|
|
903
|
+
const studioAddress = process.env.STUDIO_ADDRESS!;
|
|
904
|
+
|
|
905
|
+
// Register as VERIFIER
|
|
906
|
+
await sdk.studio.registerWithStudio(
|
|
907
|
+
studioAddress,
|
|
908
|
+
'verifier-agent-001',
|
|
909
|
+
2, // VERIFIER role
|
|
910
|
+
ethers.parseEther('0.01') // Higher stake for verifiers
|
|
911
|
+
);
|
|
912
|
+
|
|
913
|
+
// List pending workflows to score
|
|
914
|
+
const workflows = await sdk.gateway!.listWorkflows({
|
|
915
|
+
studio: studioAddress,
|
|
916
|
+
state: 'CREATED',
|
|
917
|
+
});
|
|
918
|
+
|
|
919
|
+
for (const workflow of workflows) {
|
|
920
|
+
// Evaluate the work (your scoring logic here)
|
|
921
|
+
const scores = evaluateWork(workflow);
|
|
922
|
+
|
|
923
|
+
// Submit score via Gateway (handles commit-reveal automatically)
|
|
924
|
+
await sdk.gateway!.submitScore(
|
|
925
|
+
studioAddress,
|
|
926
|
+
1,
|
|
927
|
+
process.env.VALIDATOR_ADDRESS!,
|
|
928
|
+
process.env.DATA_HASH!,
|
|
929
|
+
scores, // [Quality, Accuracy, Timeliness, Collaboration, Innovation]
|
|
930
|
+
sdk.getAddress(),
|
|
931
|
+
{ workerAddress: sdk.getAddress(), mode: ScoreSubmissionMode.COMMIT_REVEAL }
|
|
932
|
+
);
|
|
933
|
+
console.log(`Scored workflow: ${workflow.workflowId}`);
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
function evaluateWork(workflow: any): number[] {
|
|
938
|
+
// Your evaluation logic - returns 5-dimensional score array [0-100 each]
|
|
939
|
+
return [85, 90, 78, 92, 88];
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
verifierWorkflow().catch(console.error);
|
|
943
|
+
```
|
|
944
|
+
|
|
350
945
|
### Using Pinata Storage
|
|
351
946
|
|
|
352
947
|
```typescript
|
|
@@ -360,14 +955,14 @@ const sdk = new ChaosChainSDK({
|
|
|
360
955
|
privateKey: process.env.PRIVATE_KEY,
|
|
361
956
|
storageProvider: new PinataStorage({
|
|
362
957
|
jwt: process.env.PINATA_JWT,
|
|
363
|
-
gatewayUrl: 'https://gateway.pinata.cloud'
|
|
364
|
-
})
|
|
958
|
+
gatewayUrl: 'https://gateway.pinata.cloud',
|
|
959
|
+
}),
|
|
365
960
|
});
|
|
366
961
|
|
|
367
962
|
// Upload will now use Pinata
|
|
368
963
|
const result = await sdk.storage.upload({
|
|
369
964
|
data: 'Important evidence',
|
|
370
|
-
timestamp: Date.now()
|
|
965
|
+
timestamp: Date.now(),
|
|
371
966
|
});
|
|
372
967
|
console.log(`Stored on Pinata: ${result.uri}`);
|
|
373
968
|
```
|
|
@@ -401,12 +996,17 @@ PRIVATE_KEY=your_private_key_here
|
|
|
401
996
|
BASE_SEPOLIA_RPC_URL=https://sepolia.base.org
|
|
402
997
|
ETHEREUM_SEPOLIA_RPC_URL=https://rpc.sepolia.org
|
|
403
998
|
|
|
404
|
-
#
|
|
405
|
-
|
|
406
|
-
PINATA_GATEWAY=https://gateway.pinata.cloud
|
|
999
|
+
# Gateway (for ChaosChain Studios)
|
|
1000
|
+
GATEWAY_URL=https://gateway.chaoschain.io
|
|
407
1001
|
|
|
408
1002
|
# Optional: Custom RPC endpoints
|
|
409
1003
|
LINEA_SEPOLIA_RPC_URL=https://rpc.sepolia.linea.build
|
|
1004
|
+
|
|
1005
|
+
# Monad (required when using monad-mainnet / monad-testnet)
|
|
1006
|
+
MONAD_MAINNET_CHAIN_ID=12345
|
|
1007
|
+
MONAD_MAINNET_RPC_URL=https://...
|
|
1008
|
+
MONAD_TESTNET_CHAIN_ID=12346
|
|
1009
|
+
MONAD_TESTNET_RPC_URL=https://...
|
|
410
1010
|
```
|
|
411
1011
|
|
|
412
1012
|
### TypeScript Configuration
|
|
@@ -456,14 +1056,13 @@ The SDK is optimized for minimal bundle size:
|
|
|
456
1056
|
|
|
457
1057
|
- **Core SDK**: ~80KB minified + gzipped
|
|
458
1058
|
- **Tree-shakeable**: Import only what you need
|
|
459
|
-
- **
|
|
1059
|
+
- **Minimal runtime deps**: `ethers`, `axios` (and optional storage/IPFS as needed)
|
|
460
1060
|
|
|
461
1061
|
```typescript
|
|
462
1062
|
// Import only what you need
|
|
463
1063
|
import { ChaosChainSDK, NetworkConfig } from '@chaoschain/sdk';
|
|
464
1064
|
|
|
465
|
-
//
|
|
466
|
-
import { PinataStorage } from '@chaoschain/sdk/providers/storage';
|
|
1065
|
+
// Import only what you need (tree-shakeable)
|
|
467
1066
|
```
|
|
468
1067
|
|
|
469
1068
|
## Testing
|
|
@@ -481,19 +1080,31 @@ npm run test:coverage
|
|
|
481
1080
|
|
|
482
1081
|
## FAQ
|
|
483
1082
|
|
|
484
|
-
**Q: Do I need to deploy contracts?**
|
|
485
|
-
A: No
|
|
1083
|
+
**Q: Do I need to deploy contracts?**
|
|
1084
|
+
A: No. ERC-8004 v1.0 contracts are pre-deployed on the supported networks listed above.
|
|
486
1085
|
|
|
487
|
-
**Q: What's the difference between Python and TypeScript SDK?**
|
|
1086
|
+
**Q: What's the difference between Python and TypeScript SDK?**
|
|
488
1087
|
A: Both SDKs have feature parity. Use TypeScript for web/Node.js apps, Python for backend services.
|
|
489
1088
|
|
|
490
|
-
**Q:
|
|
1089
|
+
**Q: Should I use Gateway or StudioClient?**
|
|
1090
|
+
A: Use Gateway (`sdk.gateway`) for production - it handles workflow orchestration, crash recovery, XMTP messaging, and DKG computation. Use StudioClient (`sdk.studio`) only for testing or low-level control.
|
|
1091
|
+
|
|
1092
|
+
**Q: What is DKG (Decentralized Knowledge Graph)?**
|
|
1093
|
+
A: DKG performs causal analysis of agent contributions in multi-agent tasks. It's handled server-side by the Gateway - you don't need to implement it yourself.
|
|
1094
|
+
|
|
1095
|
+
**Q: How do x402 payments work?**
|
|
491
1096
|
A: Real USDC/ETH transfers using Coinbase's HTTP 402 protocol. 2.5% fee goes to ChaosChain treasury.
|
|
492
1097
|
|
|
493
|
-
**Q:
|
|
1098
|
+
**Q: How does commit-reveal scoring work?**
|
|
1099
|
+
A: Verifiers first commit a hash of their scores (preventing front-running), then reveal actual scores in a second phase. Gateway handles this automatically when you use `mode: 'COMMIT_REVEAL'`.
|
|
1100
|
+
|
|
1101
|
+
**Q: What are contribution weights?**
|
|
1102
|
+
A: In multi-agent work, weights specify each agent's contribution as basis points (must sum to 10000). For example, `[6000, 4000]` means 60% and 40% contribution.
|
|
1103
|
+
|
|
1104
|
+
**Q: Which storage provider should I use?**
|
|
494
1105
|
A: Local IPFS for development, Pinata for production, Irys for permanent storage.
|
|
495
1106
|
|
|
496
|
-
**Q: Can I use this in the browser?**
|
|
1107
|
+
**Q: Can I use this in the browser?**
|
|
497
1108
|
A: Yes! The SDK works in Node.js, browsers, React, Next.js, Vue, etc.
|
|
498
1109
|
|
|
499
1110
|
## Contributing
|
|
@@ -510,6 +1121,7 @@ MIT License - see [LICENSE](LICENSE) file.
|
|
|
510
1121
|
- **Documentation**: [https://docs.chaoscha.in](https://docs.chaoscha.in)
|
|
511
1122
|
- **GitHub**: [https://github.com/ChaosChain/chaoschain-sdk-ts](https://github.com/ChaosChain/chaoschain-sdk-ts)
|
|
512
1123
|
- **npm**: [https://www.npmjs.com/package/@chaoschain/sdk](https://www.npmjs.com/package/@chaoschain/sdk)
|
|
1124
|
+
- **Changelog**: [CHANGELOG.md](CHANGELOG.md)
|
|
513
1125
|
- **Python SDK**: [https://pypi.org/project/chaoschain-sdk/](https://pypi.org/project/chaoschain-sdk/)
|
|
514
1126
|
- **ERC-8004 Spec**: [https://eips.ethereum.org/EIPS/eip-8004](https://eips.ethereum.org/EIPS/eip-8004)
|
|
515
1127
|
- **x402 Protocol**: [https://www.x402.org/](https://www.x402.org/)
|
|
@@ -517,8 +1129,6 @@ MIT License - see [LICENSE](LICENSE) file.
|
|
|
517
1129
|
## Support
|
|
518
1130
|
|
|
519
1131
|
- **Issues**: [GitHub Issues](https://github.com/ChaosChain/chaoschain-sdk-ts/issues)
|
|
520
|
-
- **Discord**: [ChaosChain Community]
|
|
521
|
-
- **Email**: sumeet.chougule@nethermind.io
|
|
522
1132
|
|
|
523
1133
|
---
|
|
524
1134
|
|