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 +753 -0
- package/index.js +23 -0
- package/package.json +29 -0
- package/scripts/demo.js +93 -0
- package/skills/eigen-avs/SKILL.md +92 -0
- package/skills/eigen-avs/scripts/avs-api.js +131 -0
- package/skills/eigen-compute/SKILL.md +198 -0
- package/skills/eigen-compute/scripts/compute-api.js +153 -0
- package/skills/eigen-da/SKILL.md +148 -0
- package/skills/eigen-da/scripts/da-api.js +128 -0
- package/skills/eigen-delegation/SKILL.md +98 -0
- package/skills/eigen-delegation/scripts/delegation-api.js +160 -0
- package/skills/eigen-restaking/SKILL.md +92 -0
- package/skills/eigen-restaking/scripts/eigen-api.js +186 -0
- package/skills/eigen-rewards/SKILL.md +83 -0
- package/skills/eigen-rewards/scripts/rewards-api.js +108 -0
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>
|