eigen-skills 1.0.0

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