eigen-skills 1.1.8 → 2.0.1

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/README.md CHANGED
@@ -1,196 +1,755 @@
1
1
  # eigen-skills
2
2
 
3
- **Deploy any app to EigenCompute TEE hardware-isolated enclaves with encrypted memory, sealed secrets, and cryptographic attestation**
3
+ **EigenLayer Agent SkillsPlug-and-play AI agent capabilities for the entire EigenLayer stack**
4
4
 
5
- [![npm](https://img.shields.io/npm/v/eigen-skills)](https://www.npmjs.com/package/eigen-skills)
6
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
5
+ [Installation](#installation) | [Skills](#skills-overview) | [Architecture](#architecture) | [Usage](#usage) | [API Reference](#api-reference)
7
6
 
8
7
  ---
9
8
 
10
- ## Quick Start
9
+ ## What is this?
10
+
11
+ **eigen-skills** is a modular skills package that gives any AI agent instant access to the full EigenLayer ecosystem. Inspired by the [Agent Skills specification](https://github.com/anthropics/skills), it follows the `SKILL.md` standard so agents like Claude Code, OpenClaw, or any compatible framework can discover and use these capabilities automatically.
11
12
 
12
13
  ```bash
13
- npm install eigen-skills
14
+ npx skills add zeeshan8281/eigen-skills
14
15
  ```
15
16
 
16
- The postinstall script copies `SKILL.md` into `.claude/skills/eigen/` so Claude Code discovers it automatically. Then just ask:
17
+ > Think of it like `npm install` but for AI agents instead of code libraries, you're installing **knowledge and capabilities**.
18
+
19
+ ---
20
+
21
+ ## Skills Overview
17
22
 
18
- > "Read https://eigencloud-skills.vercel.app/ and deploy my app to eigencompute"
23
+ | Skill | Emoji | Domain | Data Source |
24
+ |-------|-------|--------|-------------|
25
+ | [`eigen-restaking`](#eigen-restaking) | 🔄 | Operators, TVL, stakers, deposits, withdrawals | EigenExplorer API |
26
+ | [`eigen-avs`](#eigen-avs) | 🛡️ | Actively Validated Services, registrations, operator-sets | EigenExplorer API |
27
+ | [`eigen-rewards`](#eigen-rewards) | 💰 | Rewards, APY rankings, yield strategies | EigenExplorer API |
28
+ | [`eigen-delegation`](#eigen-delegation) | 🤝 | Delegation events, staker positions, top operators | EigenExplorer API |
29
+ | [`eigen-compute`](#eigen-compute) | 🔒 | TEE deployment, attestation, lifecycle management | EigenCompute (ecloud CLI) |
30
+ | [`eigen-da`](#eigen-da) | 📦 | Blob storage & retrieval, data availability | EigenDA Proxy |
19
31
 
20
32
  ---
21
33
 
22
- ## What is EigenCompute?
34
+ ## Architecture
23
35
 
24
- EigenCompute runs your Docker containers inside **hardware-isolated Trusted Execution Environments** (Intel TDX / SEV-SNP). Every deployment gets:
36
+ ### How Agent Skills Work
25
37
 
26
- - **Encrypted memory** — the host cannot read your app's data
27
- - **Unique wallet** — cryptographic identity per deployment
28
- - **KMS signing key** — at `/usr/local/bin/kms-signing-public-key.pem`
29
- - **Sealed secrets** env vars decrypted only inside the TEE
30
- - **Cryptographic attestation** — verifiable proof of code integrity
38
+ ```
39
+ ┌─────────────────────────────────────────────────────────────┐
40
+ │ AI Agent │
41
+ │ (Claude Code / OpenClaw / Any Agent Skills-compatible) │
42
+ │ │
43
+ │ 1. User asks: "What are the top EigenLayer operators?" │
44
+ │ 2. Agent scans installed skills/ │
45
+ │ 3. Matches intent → eigen-restaking/SKILL.md │
46
+ │ 4. Reads SKILL.md for instructions │
47
+ │ 5. Executes the appropriate curl/CLI command │
48
+ │ 6. Formats and returns results │
49
+ └──────────────┬──────────────────────────────────────────────┘
50
+
51
+
52
+ ┌──────────────────────────────────────────────────────────────┐
53
+ │ eigen-skills/ │
54
+ │ │
55
+ │ skills/ │
56
+ │ ├── eigen-restaking/ │
57
+ │ │ ├── SKILL.md ← Agent reads this │
58
+ │ │ └── scripts/ │
59
+ │ │ └── eigen-api.js ← JS client (optional) │
60
+ │ ├── eigen-avs/ │
61
+ │ ├── eigen-rewards/ │
62
+ │ ├── eigen-delegation/ │
63
+ │ ├── eigen-compute/ │
64
+ │ └── eigen-da/ │
65
+ └──────────────┬──────────────────────────────────────────────┘
66
+
67
+
68
+ ┌──────────────────────────────────────────────────────────────┐
69
+ │ EigenLayer Ecosystem │
70
+ │ │
71
+ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
72
+ │ │ EigenExplorer │ │ EigenCompute │ │ EigenDA │ │
73
+ │ │ REST API │ │ (ecloud CLI)│ │ (Proxy) │ │
74
+ │ │ │ │ │ │ │ │
75
+ │ │ Operators │ │ TEE Deploy │ │ Blob Store │ │
76
+ │ │ AVS │ │ Attestation │ │ Blob Get │ │
77
+ │ │ Stakers │ │ KMS Signing │ │ KZG Verify │ │
78
+ │ │ Rewards │ │ Lifecycle │ │ Commitment │ │
79
+ │ │ Events │ │ Monitoring │ │ Explorer │ │
80
+ │ └──────────────┘ └──────────────┘ └──────────────┘ │
81
+ │ │ │ │ │
82
+ │ ▼ ▼ ▼ │
83
+ │ ┌─────────────────────────────────────────────────┐ │
84
+ │ │ EigenLayer Protocol (L1) │ │
85
+ │ │ DelegationManager · StrategyManager · AVSDir │ │
86
+ │ │ AllocationManager · RewardsCoordinator │ │
87
+ │ └─────────────────────────────────────────────────┘ │
88
+ └──────────────────────────────────────────────────────────────┘
89
+ ```
90
+
91
+ ### Data Flow
92
+
93
+ ```
94
+ ┌─────────────────┐
95
+ │ User Query │
96
+ │ "top operators" │
97
+ └────────┬────────┘
98
+
99
+ ┌────────▼────────┐
100
+ │ AI Agent │
101
+ │ reads SKILL.md│
102
+ └────────┬────────┘
103
+
104
+ ┌──────────────┼──────────────┐
105
+ │ │ │
106
+ ┌────────▼─────┐ ┌─────▼──────┐ ┌─────▼──────┐
107
+ │ REST API │ │ ecloud CLI │ │ DA Proxy │
108
+ │ (curl) │ │ (shell) │ │ (curl) │
109
+ └────────┬─────┘ └─────┬──────┘ └─────┬──────┘
110
+ │ │ │
111
+ ┌────────▼─────┐ ┌─────▼──────┐ ┌─────▼──────┐
112
+ │ EigenExplorer│ │ EigenCloud │ │ EigenDA │
113
+ │ Mainnet │ │ TEE │ │ Network │
114
+ └──────────────┘ └────────────┘ └────────────┘
115
+ ```
31
116
 
32
117
  ---
33
118
 
34
- ## Setup
119
+ ## Installation
35
120
 
36
- ### 1. Install the ecloud CLI
121
+ ### For Claude Code (one command)
37
122
 
38
123
  ```bash
39
- npm install -g @layr-labs/ecloud-cli
124
+ npm install eigen-skills
40
125
  ```
41
126
 
42
- ### 2. Authenticate
127
+ That's it. The postinstall script automatically copies the `SKILL.md` into `.claude/skills/eigen/` — Claude Code discovers it instantly. Just set your API key:
43
128
 
44
129
  ```bash
45
- # First time — generates a new key
46
- ecloud auth generate --store
130
+ export EIGEN_API_KEY="your-key-here"
131
+ ```
47
132
 
48
- # Or login with an existing key
49
- ecloud auth login
133
+ Then open Claude Code and ask anything about EigenLayer.
134
+
135
+ ### Alternative: curl (no npm)
50
136
 
51
- # Verify
52
- ecloud auth whoami
137
+ ```bash
138
+ mkdir -p .claude/skills/eigen
139
+ curl -o .claude/skills/eigen/SKILL.md https://raw.githubusercontent.com/zeeshan8281/eigen-agent-skills/main/SKILL.md
53
140
  ```
54
141
 
55
- ### 3. Subscribe to billing
142
+ ### As an MCP Server (Claude Desktop, Cursor, Windsurf, Claude Code)
143
+
144
+ Install the separate [`eigen-mcp`](https://www.npmjs.com/package/eigen-mcp) package for MCP support — all 21 tools, no SKILL.md files or curl needed:
56
145
 
57
146
  ```bash
58
- ecloud billing subscribe
59
- ecloud billing status
147
+ npm install -g eigen-mcp
60
148
  ```
61
149
 
62
- ### 4. Docker
150
+ See the [eigen-mcp README](https://www.npmjs.com/package/eigen-mcp) for config examples for Claude Desktop, Cursor, Windsurf, and Claude Code.
63
151
 
64
- Docker must be installed and running. The deploy process builds and pushes images.
152
+ ### For Programmatic Use (JavaScript)
65
153
 
66
- ```bash
67
- docker info
154
+ ```javascript
155
+ const { EigenAPI, AVSAPI, RewardsAPI, DelegationAPI, EigenCompute, EigenDA } = require('eigen-skills');
68
156
  ```
69
157
 
70
158
  ---
71
159
 
72
- ## Deploying an App
160
+ ## Prerequisites
161
+
162
+ ### Data Skills (restaking, AVS, rewards, delegation)
163
+
164
+ | Requirement | How to Get |
165
+ |-------------|-----------|
166
+ | EigenExplorer API Key | Free at [developer.eigenexplorer.com](https://developer.eigenexplorer.com) |
167
+ | Set env var | `export EIGEN_API_KEY=your_key` |
73
168
 
74
- ### Step 1: Ensure a Dockerfile exists
169
+ ### EigenCompute Skill
75
170
 
76
- If the project doesn't have one, the agent will generate one based on the project type (Node.js, Python, Go, Rust, etc.).
171
+ | Requirement | How to Get |
172
+ |-------------|-----------|
173
+ | ecloud CLI | `npm install -g @layr-labs/ecloud-cli` |
174
+ | Auth | `ecloud auth login` or `ecloud auth generate --store` |
77
175
 
78
- ### Step 2: Build for linux/amd64
176
+ ### EigenDA Skill
79
177
 
80
- EigenCompute TEEs run on x86_64:
178
+ | Requirement | How to Get |
179
+ |-------------|-----------|
180
+ | EigenDA Proxy | See [EigenDA Proxy Setup](#eigenda-proxy-setup) below |
181
+ | Ethereum RPC | Any Sepolia RPC endpoint |
81
182
 
183
+ ---
184
+
185
+ ## Usage
186
+
187
+ ### Agent Usage (SKILL.md driven)
188
+
189
+ When an agent has eigen-skills installed, it reads the `SKILL.md` files to know what to do:
190
+
191
+ **User:** "What are the top EigenLayer operators by TVL?"
192
+ **Agent reads:** `skills/eigen-restaking/SKILL.md`
193
+ **Agent runs:**
82
194
  ```bash
83
- docker build --platform linux/amd64 -t <REGISTRY_USER>/<APP_NAME>:latest .
195
+ curl -s "https://api.eigenexplorer.com/operators?withTvl=true&sortByTvl=desc&take=10" \
196
+ -H "x-api-token: $EIGEN_API_KEY"
84
197
  ```
198
+ **Agent formats:** Bold names, TVL in human-readable form, staker counts.
85
199
 
86
- ### Step 3: Push to a public registry
200
+ ---
87
201
 
202
+ **User:** "Deploy my Dockerfile to EigenCompute"
203
+ **Agent reads:** `skills/eigen-compute/SKILL.md`
204
+ **Agent runs:**
88
205
  ```bash
89
- docker push <REGISTRY_USER>/<APP_NAME>:latest
206
+ ecloud compute app deploy
207
+ # Selects "Build and deploy from Dockerfile"
208
+ # Selects Linux/AMD64
90
209
  ```
91
210
 
92
- ### Step 4: Deploy
93
-
94
- The `ecloud compute app deploy` CLI is interactive. The agent uses an expect script to automate all prompts:
211
+ ---
95
212
 
213
+ **User:** "Store this verification proof on EigenDA"
214
+ **Agent reads:** `skills/eigen-da/SKILL.md`
215
+ **Agent runs:**
96
216
  ```bash
97
- ecloud compute app deploy \
98
- --name "<APP_NAME>" \
99
- --image-ref "<REGISTRY_USER>/<APP_NAME>:latest" \
100
- --skip-profile \
101
- --log-visibility public
217
+ curl -s -X POST "http://127.0.0.1:3100/put?commitment_mode=standard" \
218
+ -H "Content-Type: application/json" \
219
+ -d '{"verified": true, "model": "gpt-oss-120b", "timestamp": "2025-01-01"}'
102
220
  ```
103
221
 
104
- On success you get an **App ID** and **IP address**.
222
+ ### Programmatic Usage (JavaScript)
223
+
224
+ ```javascript
225
+ const { EigenAPI, AVSAPI, RewardsAPI, DelegationAPI, EigenCompute, EigenDA } = require('eigen-skills');
226
+
227
+ // ─── Restaking Data ─────────────────────────────────
228
+ const eigen = new EigenAPI(process.env.EIGEN_API_KEY);
229
+
230
+ // Ecosystem overview
231
+ const metrics = await eigen.getMetrics();
232
+ console.log(`Total TVL: ${metrics.tvl}`);
233
+ console.log(`Operators: ${metrics.totalOperators}`);
234
+ console.log(`Stakers: ${metrics.totalStakers}`);
235
+
236
+ // Top operators
237
+ const ops = await eigen.getOperators({ sortByTvl: 'desc', take: 5 });
238
+ ops.data.forEach(op => {
239
+ console.log(`${op.metadataName} — TVL: ${op.tvl?.tvl} — Stakers: ${op.totalStakers}`);
240
+ });
241
+
242
+ // ─── AVS Data ───────────────────────────────────────
243
+ const avs = new AVSAPI(process.env.EIGEN_API_KEY);
244
+
245
+ // All services
246
+ const services = await avs.getAllAVS({ sortByTvl: 'desc', take: 10 });
247
+
248
+ // Operators securing a specific AVS
249
+ const avsOps = await avs.getAVSOperators('0xAVS_ADDRESS');
250
+
251
+ // ─── Rewards & Yield ────────────────────────────────
252
+ const rewards = new RewardsAPI(process.env.EIGEN_API_KEY);
253
+
254
+ // Best yield operators
255
+ const topYield = await rewards.getTopOperatorsByAPY(10);
256
+
257
+ // Rewards for a specific operator
258
+ const opRewards = await rewards.getOperatorRewards('0xOPERATOR');
259
+
260
+ // ─── Delegation ─────────────────────────────────────
261
+ const delegation = new DelegationAPI(process.env.EIGEN_API_KEY);
105
262
 
106
- ### Step 5: Verify
263
+ // Most delegated operators
264
+ const topDelegated = await delegation.getTopDelegatedOperators(10);
107
265
 
266
+ // Staker's delegation position
267
+ const stakerInfo = await delegation.getStakerDelegation('0xSTAKER');
268
+
269
+ // ─── TEE Compute ────────────────────────────────────
270
+ const compute = new EigenCompute();
271
+
272
+ // Check if running inside TEE
273
+ const health = compute.healthCheck();
274
+ console.log(`Inside TEE: ${health.insideTEE}`);
275
+
276
+ // Collect attestation (inside TEE container)
277
+ const attestation = compute.collectAttestation();
278
+ console.log(`App ID: ${attestation.appId}`);
279
+ console.log(`KMS Key: ${attestation.kmsKeyFingerprint}`);
280
+
281
+ // ─── Data Availability ──────────────────────────────
282
+ const da = new EigenDA();
283
+
284
+ // Store data
285
+ const commitment = await da.store({
286
+ proof: { verified: true, model: 'gpt-oss-120b' },
287
+ timestamp: new Date().toISOString(),
288
+ });
289
+ console.log(`Stored! Commitment: ${commitment}`);
290
+ console.log(`Explorer: ${da.getExplorerUrl(commitment)}`);
291
+
292
+ // Retrieve data
293
+ const data = await da.retrieve(commitment);
294
+ console.log(`Retrieved:`, data);
295
+ ```
296
+
297
+ ---
298
+
299
+ ## Detailed Skill Reference
300
+
301
+ ### eigen-restaking
302
+
303
+ 🔄 **Query EigenLayer restaking data**
304
+
305
+ ```
306
+ Operators ←→ Stakers ←→ Strategies ←→ TVL
307
+
308
+ └── Deposits / Withdrawals / Events
309
+ ```
310
+
311
+ **Key endpoints:**
312
+
313
+ | Method | What |
314
+ |--------|------|
315
+ | `getMetrics()` | Ecosystem-wide TVL, operator count, staker count |
316
+ | `getOperators(opts)` | List operators with sorting/filtering |
317
+ | `getOperator(address)` | Single operator detail |
318
+ | `getStaker(address)` | Staker info and positions |
319
+ | `getDeposits()` | Recent deposit events |
320
+ | `getWithdrawals()` | Recent withdrawal events |
321
+ | `getHistoricalMetrics()` | TVL over time |
322
+
323
+ **Example queries:**
108
324
  ```bash
109
- ecloud compute app list
110
- ecloud compute app info <APP_ID>
325
+ # Top 10 operators by TVL
326
+ curl -s "https://api.eigenexplorer.com/operators?withTvl=true&sortByTvl=desc&take=10" \
327
+ -H "x-api-token: $EIGEN_API_KEY"
328
+
329
+ # Search operator by name
330
+ curl -s "https://api.eigenexplorer.com/operators?searchByText=p2p&withTvl=true" \
331
+ -H "x-api-token: $EIGEN_API_KEY"
332
+
333
+ # Staker position
334
+ curl -s "https://api.eigenexplorer.com/stakers/0xADDRESS" \
335
+ -H "x-api-token: $EIGEN_API_KEY"
111
336
  ```
112
337
 
113
338
  ---
114
339
 
115
- ## Instance Types
340
+ ### eigen-avs
341
+
342
+ 🛡️ **Query Actively Validated Services**
343
+
344
+ ```
345
+ AVS (Service)
346
+ ├── Operators (securing it)
347
+ ├── Stakers (delegated via operators)
348
+ ├── Registration Events
349
+ └── Operator-Sets (slashing-era grouping)
350
+ ```
351
+
352
+ **Key endpoints:**
116
353
 
117
- | Instance | Specs | TEE Type |
118
- |----------|-------|----------|
119
- | g1-micro-1v | 2 shared vCPUs, 1 GB RAM | Shielded VM |
120
- | g1-medium-1v | 2 shared vCPUs, 4 GB RAM | Shielded VM |
121
- | g1-custom-2-4096s | 2 vCPUs, 4 GB RAM | SEV-SNP |
122
- | g1-standard-2s | 2 vCPUs, 8 GB RAM | SEV-SNP |
123
- | g1-standard-4t | 4 vCPUs, 16 GB RAM | TDX |
124
- | g1-standard-8t | 8 vCPUs, 32 GB RAM | TDX |
354
+ | Method | What |
355
+ |--------|------|
356
+ | `getAllAVS(opts)` | List all AVS with sorting/filtering |
357
+ | `getAVS(address)` | Single AVS detail |
358
+ | `getAVSOperators(address)` | Operators registered to an AVS |
359
+ | `getAVSStakers(address)` | Stakers delegated to an AVS |
360
+ | `getAVSRegistrationEvents(address)` | Registration/deregistration events |
361
+ | `getAVSOperatorSets(address)` | Operator-sets for an AVS |
125
362
 
126
363
  ---
127
364
 
128
- ## Managing Apps
365
+ ### eigen-rewards
366
+
367
+ 💰 **Query rewards and yield data**
129
368
 
130
- ```bash
131
- ecloud compute app list # List all apps
132
- ecloud compute app info <APP_ID> # App status and IP
133
- ecloud compute app logs <APP_ID> # View logs
134
- ecloud compute app start <APP_ID> # Start a stopped app
135
- ecloud compute app stop <APP_ID> # Stop a running app
136
- ecloud compute app terminate <APP_ID> # Permanently destroy
137
- ecloud compute app upgrade <APP_ID> # Update running app
138
369
  ```
370
+ AVS distributes rewards
371
+
372
+
373
+ ┌─────────┐
374
+ │ Operator │ ← takes fee (0-100%)
375
+ └────┬────┘
376
+
377
+
378
+ ┌─────────┐
379
+ │ Staker │ ← receives remaining rewards
380
+ └─────────┘
381
+ ```
382
+
383
+ **Key endpoints:**
384
+
385
+ | Method | What |
386
+ |--------|------|
387
+ | `getTopOperatorsByAPY(limit)` | Best yield operators |
388
+ | `getTopAVSByAPY(limit)` | Best yield AVS |
389
+ | `getOperatorRewards(address)` | Reward strategies for an operator |
390
+ | `getStakerRewards(address)` | Rewards earned by a staker |
391
+ | `getAVSRewards(address)` | Rewards distributed by an AVS |
139
392
 
140
393
  ---
141
394
 
142
- ## Sealed Secrets
395
+ ### eigen-delegation
396
+
397
+ 🤝 **Query delegation relationships**
143
398
 
144
- ```bash
145
- ecloud compute app env set MY_SECRET="value" API_KEY="key"
146
399
  ```
400
+ Staker ──delegates──▶ Operator ──registers──▶ AVS
401
+ │ │
402
+ └── withdrawals └── operator-sets
403
+ ```
404
+
405
+ **Key endpoints:**
147
406
 
148
- Secrets are encrypted at rest and only decrypted inside the TEE at runtime. You cannot inspect them after they're set.
407
+ | Method | What |
408
+ |--------|------|
409
+ | `getTopDelegatedOperators(limit)` | Most delegated by staker count |
410
+ | `getTopOperatorsByTVL(limit)` | Most capital delegated |
411
+ | `getOperatorDelegation(address)` | Operator's full delegation profile |
412
+ | `getOperatorStakers(address)` | Stakers delegating to an operator |
413
+ | `getStakerDelegation(address)` | Which operator a staker is delegated to |
414
+ | `getDelegationEvents()` | Recent delegation/undelegation events |
415
+ | `getOperatorSets()` | Operator-sets (slashing-era model) |
149
416
 
150
417
  ---
151
418
 
152
- ## Attestation
419
+ ### eigen-compute
153
420
 
154
- Verify any deployed app at:
421
+ 🔒 **Deploy and manage TEE applications**
155
422
 
156
423
  ```
157
- https://verify-sepolia.eigencloud.xyz/app/<APP_ID>
424
+ ┌─────────────────────────────────────────┐
425
+ │ EigenCompute TEE │
426
+ │ (Intel TDX Enclave) │
427
+ │ │
428
+ │ ┌─────────────────────────────────┐ │
429
+ │ │ Your Docker Container │ │
430
+ │ │ │ │
431
+ │ │ • Encrypted memory │ │
432
+ │ │ • Sealed secrets │ │
433
+ │ │ • KMS signing key │ │
434
+ │ │ • Unique wallet identity │ │
435
+ │ │ • Cryptographic attestation │ │
436
+ │ └─────────────────────────────────┘ │
437
+ │ │
438
+ │ /usr/local/bin/ │
439
+ │ ├── compute-source-env.sh (secrets) │
440
+ │ ├── kms-signing-public-key.pem │
441
+ │ └── kms-client │
442
+ └─────────────────────────────────────────┘
158
443
  ```
159
444
 
160
- Inside the TEE, the KMS signing key is at `/usr/local/bin/kms-signing-public-key.pem`.
445
+ **Lifecycle:**
446
+
447
+ ```
448
+ ecloud auth login
449
+
450
+
451
+ ecloud compute app deploy ← builds Dockerfile in TEE
452
+
453
+
454
+ ecloud compute app list ← check status + IP
455
+
456
+
457
+ ecloud compute app logs <id> ← view logs
458
+
459
+
460
+ ecloud compute app stop <id> ← pause
461
+
462
+
463
+ ecloud compute app terminate <id> ← permanent destroy
464
+ ```
465
+
466
+ **Key methods:**
467
+
468
+ | Method | What |
469
+ |--------|------|
470
+ | `whoami()` | Check authenticated address |
471
+ | `listApps()` | List all deployed apps |
472
+ | `getAppInfo(id)` | App status and details |
473
+ | `getAppLogs(id)` | View app logs |
474
+ | `startApp(id)` / `stopApp(id)` | Lifecycle control |
475
+ | `collectAttestation()` | Gather TEE attestation data |
476
+ | `computeConfigHash(files)` | Hash config files for integrity proof |
477
+
478
+ **Known issues:** See [Troubleshooting](#troubleshooting).
479
+
480
+ ---
481
+
482
+ ### eigen-da
483
+
484
+ 📦 **Store and retrieve data blobs**
485
+
486
+ ```
487
+ Your App ──POST /put──▶ EigenDA Proxy ──disperse──▶ EigenDA Network
488
+ │ │
489
+ commitment KZG commitment
490
+ │ stored on-chain
491
+
492
+ ┌──────────┐
493
+ │ Explorer │
494
+ │ blobs- │
495
+ │ sepolia. │
496
+ │eigenda. │
497
+ │ xyz │
498
+ └──────────┘
499
+
500
+ Your App ──GET /get/X──▶ EigenDA Proxy ──retrieve──▶ EigenDA Network
501
+
502
+ original data
503
+ ```
504
+
505
+ **Proxy endpoints:**
506
+
507
+ | Endpoint | Method | What |
508
+ |----------|--------|------|
509
+ | `/put?commitment_mode=standard` | POST | Store a blob, returns commitment |
510
+ | `/get/<commitment>?commitment_mode=standard` | GET | Retrieve a blob by commitment |
511
+ | `/health` | GET | Proxy health check |
512
+
513
+ **Key methods:**
514
+
515
+ | Method | What |
516
+ |--------|------|
517
+ | `store(data)` | Store JSON on EigenDA, returns commitment |
518
+ | `retrieve(commitment)` | Retrieve JSON by commitment |
519
+ | `getExplorerUrl(commitment)` | Get blob explorer URL |
520
+ | `healthCheck()` | Check proxy availability |
521
+
522
+ **Networks:**
523
+
524
+ | Network | Disperser RPC | Service Manager |
525
+ |---------|---------------|-----------------|
526
+ | Sepolia | `disperser-sepolia.eigenda.xyz:443` | `0xD4A7E1Bd8015057293f0D0A557088c286942e84b` |
527
+ | Mainnet | `disperser.eigenda.xyz:443` | See EigenLayer docs |
528
+
529
+ ### EigenDA Proxy Setup
530
+
531
+ ```bash
532
+ docker run -d \
533
+ --name eigenda-proxy \
534
+ -p 3100:3100 \
535
+ ghcr.io/layr-labs/eigenda-proxy:latest \
536
+ --eigenda.disperser-rpc=disperser-sepolia.eigenda.xyz:443 \
537
+ --eigenda.service-manager-addr=0xD4A7E1Bd8015057293f0D0A557088c286942e84b \
538
+ --eigenda.eth-rpc=YOUR_SEPOLIA_RPC_URL \
539
+ --eigenda.status-query-timeout=45s \
540
+ --eigenda.signer-private-key-hex=YOUR_PRIVATE_KEY \
541
+ --memstore.enabled=false \
542
+ --eigenda.disable-tls=false
543
+ ```
544
+
545
+ ---
546
+
547
+ ## API Reference
548
+
549
+ ### Constructor Options
550
+
551
+ #### EigenAPI / AVSAPI / RewardsAPI / DelegationAPI
552
+
553
+ ```javascript
554
+ new EigenAPI(apiKey, { network: 'mainnet' | 'holesky' })
555
+ ```
556
+
557
+ | Param | Type | Default | Description |
558
+ |-------|------|---------|-------------|
559
+ | `apiKey` | string | **required** | EigenExplorer API key |
560
+ | `network` | string | `'mainnet'` | `'mainnet'` or `'holesky'` |
561
+
562
+ #### EigenDA
563
+
564
+ ```javascript
565
+ new EigenDA({ proxyUrl, commitmentMode, timeout })
566
+ ```
567
+
568
+ | Param | Type | Default | Description |
569
+ |-------|------|---------|-------------|
570
+ | `proxyUrl` | string | `'http://127.0.0.1:3100'` | EigenDA proxy URL |
571
+ | `commitmentMode` | string | `'standard'` | `'standard'` or `'optimistic'` |
572
+ | `timeout` | number | `60000` | Request timeout in ms |
573
+
574
+ #### EigenCompute
575
+
576
+ ```javascript
577
+ new EigenCompute() // No args — wraps ecloud CLI
578
+ ```
579
+
580
+ ### Pagination
581
+
582
+ All list endpoints support pagination:
583
+
584
+ ```javascript
585
+ const results = await eigen.getOperators({
586
+ skip: 0, // offset
587
+ take: 12, // page size (default: 12)
588
+ sortByTvl: 'desc',
589
+ });
590
+
591
+ console.log(results.meta.total); // total records
592
+ console.log(results.meta.skip); // current offset
593
+ console.log(results.meta.take); // page size
594
+ ```
595
+
596
+ ### Sorting Options
597
+
598
+ | Parameter | Valid Values | Available On |
599
+ |-----------|-------------|-------------|
600
+ | `sortByTvl` | `'asc'` / `'desc'` | Operators, AVS |
601
+ | `sortByApy` | `'asc'` / `'desc'` | Operators, AVS |
602
+ | `sortByTotalStakers` | `'asc'` / `'desc'` | Operators, AVS |
603
+ | `sortByTotalAvs` | `'asc'` / `'desc'` | Operators |
604
+ | `searchByText` | any string | Operators, AVS |
605
+ | `withTvl` | `true` / `false` | Operators, AVS |
161
606
 
162
607
  ---
163
608
 
164
- ## TEE Container Internals
609
+ ## Environment Variables
610
+
611
+ | Variable | Required For | Description |
612
+ |----------|-------------|-------------|
613
+ | `EIGEN_API_KEY` | Data skills | EigenExplorer API key |
614
+ | `EIGENDA_PROXY_URL` | eigen-da | Proxy URL (default: `http://127.0.0.1:3100`) |
615
+ | `EIGENDA_COMMITMENT_MODE` | eigen-da | `standard` or `optimistic` |
616
+ | `EIGENDA_TIMEOUT` | eigen-da | Timeout in ms (default: `60000`) |
617
+ | `ECLOUD_APP_ID` | eigen-compute | Auto-set inside TEE |
165
618
 
166
- | Path | What |
167
- |------|------|
168
- | `/usr/local/bin/compute-source-env.sh` | Sources sealed env vars at runtime |
169
- | `/usr/local/bin/kms-signing-public-key.pem` | KMS signing public key |
170
- | `/usr/local/bin/kms-client` | KMS signing client binary |
619
+ ---
620
+
621
+ ## Demo
171
622
 
172
- ### Entrypoint pattern
623
+ Run the interactive demo to verify all data skills work:
173
624
 
174
625
  ```bash
175
- #!/bin/bash
176
- if [ -f "/usr/local/bin/compute-source-env.sh" ]; then
177
- source /usr/local/bin/compute-source-env.sh
178
- fi
179
- node server.js
626
+ EIGEN_API_KEY=your_key npm run demo
627
+ ```
628
+
629
+ Sample output:
630
+ ```
631
+ 🔄 Eigen Agent Skills — Demo
632
+
633
+ 📡 Health check...
634
+ Status: ✅ Healthy
635
+ EigenLayer TVL: 4,754,266
636
+
637
+ 👥 Top 5 Operators by TVL:
638
+ 1. EigenYields — Stakers: 25,700 — AVS: 32
639
+ 2. AltLayer — Stakers: 21,826 — AVS: 14
640
+ 3. InfStones — Stakers: 21,617 — AVS: 11
641
+
642
+ 🛡️ Top 5 AVS:
643
+ 1. Brevis coChain AVS
644
+ 2. DIN
645
+ 3. Renzo wBTC DVN
646
+
647
+ 💰 Top 5 by APY:
648
+ 1. EigenYields — APY: 484.3%
649
+ 2. Nodes.Guru — APY: 484.3%
650
+
651
+ ✅ All skills working!
180
652
  ```
181
653
 
182
654
  ---
183
655
 
184
656
  ## Troubleshooting
185
657
 
658
+ ### Data Skills (EigenExplorer)
659
+
660
+ | Issue | Fix |
661
+ |-------|-----|
662
+ | `401 Unauthorized` | Check your `EIGEN_API_KEY` is set correctly |
663
+ | Timeout on `withTvl=true` | TVL calculations are expensive — set `withTvl=false` for faster queries, or increase timeout |
664
+ | Rate limited | EigenExplorer has rate limits on the free tier — add delays between requests |
665
+
666
+ ### EigenCompute
667
+
668
+ | Issue | Fix |
669
+ |-------|-----|
670
+ | `ecloud: command not found` | Run `npm install -g @layr-labs/ecloud-cli` |
671
+ | App stuck in `Status: Unknown` | Use "Build from Dockerfile" method instead of "Deploy from registry" |
672
+ | `app logs` returns 403 | Known issue — add HTTP logging endpoint in your app as workaround |
673
+ | 429 rate limiting after deploy | Wait 30-60 seconds before running `app list` or `app info` |
674
+ | IP changes on every deploy | No static IP available — use DNS/webhook updates in your entrypoint |
675
+
676
+ ### EigenDA
677
+
186
678
  | Issue | Fix |
187
679
  |-------|-----|
188
- | `ecloud: command not found` | `npm install -g @layr-labs/ecloud-cli` |
189
- | App stuck in `Status: Unknown` | Use "Build from Dockerfile" instead of "Deploy from registry" |
190
- | `app logs` returns 403 | Add HTTP logging endpoint in your app as workaround |
191
- | 429 rate limiting after deploy | Wait 30-60s before running `app list` or `app info` |
192
- | IP changes on every deploy | No static IP — use DNS/webhook updates in your entrypoint |
193
- | Secret rotation | Requires terminate + redeploy (no hot update) |
680
+ | `ECONNREFUSED 127.0.0.1:3100` | Start the EigenDA proxy Docker container |
681
+ | Store timeout | Increase `EIGENDA_TIMEOUT` dispersal can take 30-60s |
682
+ | Invalid commitment | Ensure `commitment_mode` matches between store and retrieve |
683
+
684
+ ---
685
+
686
+ ## Project Structure
687
+
688
+ ```
689
+ eigen-skills/
690
+ ├── package.json # npm package with "agents" field
691
+ ├── index.js # programmatic entry point (all 6 modules)
692
+ ├── README.md # this file
693
+ ├── .gitignore
694
+ ├── .npmignore
695
+ ├── scripts/
696
+ │ └── demo.js # interactive demo
697
+ └── skills/
698
+ ├── eigen-restaking/ # 🔄 Operators, TVL, stakers
699
+ │ ├── SKILL.md # agent instructions
700
+ │ └── scripts/
701
+ │ └── eigen-api.js # JS API client
702
+
703
+ ├── eigen-avs/ # 🛡️ Actively Validated Services
704
+ │ ├── SKILL.md
705
+ │ └── scripts/
706
+ │ └── avs-api.js
707
+
708
+ ├── eigen-rewards/ # 💰 Rewards & APY
709
+ │ ├── SKILL.md
710
+ │ └── scripts/
711
+ │ └── rewards-api.js
712
+
713
+ ├── eigen-delegation/ # 🤝 Delegation & operator-sets
714
+ │ ├── SKILL.md
715
+ │ └── scripts/
716
+ │ └── delegation-api.js
717
+
718
+ ├── eigen-compute/ # 🔒 TEE deployment & attestation
719
+ │ ├── SKILL.md
720
+ │ └── scripts/
721
+ │ └── compute-api.js
722
+
723
+ └── eigen-da/ # 📦 Blob storage & data availability
724
+ ├── SKILL.md
725
+ └── scripts/
726
+ └── da-api.js
727
+ ```
728
+
729
+ ---
730
+
731
+ ## How It Compares
732
+
733
+ | Feature | eigen-skills | Manual curl | Custom SDK |
734
+ |---------|-------------|-------------|------------|
735
+ | Agent-compatible | ✅ SKILL.md standard | ❌ | ❌ |
736
+ | Zero config | ✅ just add API key | ✅ | ❌ needs setup |
737
+ | Covers restaking data | ✅ | ✅ manual | ✅ |
738
+ | Covers TEE compute | ✅ | ❌ need CLI | ❌ |
739
+ | Covers data availability | ✅ | ✅ manual | ❌ |
740
+ | Programmatic JS API | ✅ | ❌ | ✅ |
741
+ | Works with Claude/OpenClaw | ✅ auto-discovered | ❌ | ❌ |
742
+
743
+ ---
744
+
745
+ ## Contributing
746
+
747
+ 1. Fork the repo
748
+ 2. Create a new skill directory under `skills/`
749
+ 3. Add a `SKILL.md` following the [Agent Skills spec](https://github.com/anthropics/skills)
750
+ 4. Add scripts in `scripts/` for programmatic use
751
+ 5. Update `index.js` to export the new module
752
+ 6. PR it
194
753
 
195
754
  ---
196
755
 
@@ -201,5 +760,5 @@ MIT
201
760
  ---
202
761
 
203
762
  <p align="center">
204
- Built on <a href="https://eigencloud.xyz">EigenCompute</a>
763
+ Built with data from <a href="https://eigenexplorer.com">EigenExplorer</a>, <a href="https://eigencloud.xyz">EigenCloud</a>, and <a href="https://docs.eigenlayer.xyz">EigenDA</a>
205
764
  </p>