eigen-skills 2.0.2 → 2.0.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/README.md +75 -665
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,424 +1,113 @@
|
|
|
1
1
|
# eigen-skills
|
|
2
2
|
|
|
3
|
-
**
|
|
4
|
-
|
|
5
|
-
[Installation](#installation) | [Skills](#skills-overview) | [Architecture](#architecture) | [Usage](#usage) | [API Reference](#api-reference)
|
|
3
|
+
**EigenCompute Agent Skill — Deploy and manage apps in Trusted Execution Environments (TEE) with one command**
|
|
6
4
|
|
|
7
5
|
---
|
|
8
6
|
|
|
9
7
|
## What is this?
|
|
10
8
|
|
|
11
|
-
**eigen-skills**
|
|
9
|
+
**eigen-skills** gives AI agents (Claude Code, OpenClaw, etc.) the ability to deploy and manage apps on [EigenCompute](https://eigencloud.xyz) — hardware-isolated TEEs powered by Intel TDX with encrypted secrets and cryptographic attestation.
|
|
12
10
|
|
|
13
11
|
```bash
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
|
|
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
|
|
22
|
-
|
|
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 |
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## Architecture
|
|
35
|
-
|
|
36
|
-
### How Agent Skills Work
|
|
37
|
-
|
|
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
|
-
└──────────────────────────────────────────────────────────────┘
|
|
12
|
+
npm install -g eigen-skills@latest
|
|
89
13
|
```
|
|
90
14
|
|
|
91
|
-
|
|
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
|
-
```
|
|
15
|
+
> Install once, then any compatible AI agent can deploy to EigenCompute automatically via the `SKILL.md` standard.
|
|
116
16
|
|
|
117
17
|
---
|
|
118
18
|
|
|
119
|
-
##
|
|
120
|
-
|
|
121
|
-
### For Claude Code (one command)
|
|
122
|
-
|
|
123
|
-
```bash
|
|
124
|
-
npm install eigen-skills
|
|
125
|
-
```
|
|
126
|
-
|
|
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:
|
|
128
|
-
|
|
129
|
-
```bash
|
|
130
|
-
export EIGEN_API_KEY="your-key-here"
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
Then open Claude Code and ask anything about EigenLayer.
|
|
134
|
-
|
|
135
|
-
### Alternative: curl (no npm)
|
|
19
|
+
## Setup
|
|
136
20
|
|
|
137
21
|
```bash
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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:
|
|
145
|
-
|
|
146
|
-
```bash
|
|
147
|
-
npm install -g eigen-mcp
|
|
22
|
+
npm install -g @layr-labs/ecloud-cli@latest # minimum v0.4.3
|
|
23
|
+
ecloud auth login
|
|
24
|
+
ecloud auth whoami
|
|
148
25
|
```
|
|
149
26
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
### For Programmatic Use (JavaScript)
|
|
153
|
-
|
|
154
|
-
```javascript
|
|
155
|
-
const { EigenAPI, AVSAPI, RewardsAPI, DelegationAPI, EigenCompute, EigenDA } = require('eigen-skills');
|
|
156
|
-
```
|
|
27
|
+
**CRITICAL:** CLI v0.4.3+ is required. Older versions have broken ITA attestation metadata causing deploy failures on all instance types.
|
|
157
28
|
|
|
158
29
|
---
|
|
159
30
|
|
|
160
|
-
##
|
|
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` |
|
|
168
|
-
|
|
169
|
-
### EigenCompute Skill
|
|
170
|
-
|
|
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` |
|
|
31
|
+
## Instance Types
|
|
175
32
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
|
179
|
-
|
|
180
|
-
|
|
|
181
|
-
|
|
|
33
|
+
| Type | vCPUs | Memory | TEE | Notes |
|
|
34
|
+
|------|-------|--------|-----|-------|
|
|
35
|
+
| g1-micro-1v | 2 shared | 1 GB | Shielded VM | Cheapest, attestation can be flaky |
|
|
36
|
+
| g1-medium-1v | 2 shared | 4 GB | Shielded VM | |
|
|
37
|
+
| g1-custom-2-4096s | 2 | 4 GB | SEV-SNP | |
|
|
38
|
+
| g1-standard-2s | 2 | 8 GB | SEV-SNP | |
|
|
39
|
+
| g1-standard-4t | 4 | 16 GB | TDX | **Recommended — most reliable** |
|
|
40
|
+
| g1-standard-8t | 8 | 32 GB | TDX | |
|
|
182
41
|
|
|
183
42
|
---
|
|
184
43
|
|
|
185
|
-
##
|
|
44
|
+
## Deploy (Non-Interactive, Agent-Friendly)
|
|
186
45
|
|
|
187
|
-
|
|
46
|
+
`ecloud compute app deploy` has 6+ interactive prompts. Use the full flag set for CI/agent contexts:
|
|
188
47
|
|
|
189
|
-
|
|
48
|
+
### Step 1: Build & push Docker image (must be linux/amd64)
|
|
190
49
|
|
|
191
|
-
**User:** "What are the top EigenLayer operators by TVL?"
|
|
192
|
-
**Agent reads:** `skills/eigen-restaking/SKILL.md`
|
|
193
|
-
**Agent runs:**
|
|
194
50
|
```bash
|
|
195
|
-
|
|
196
|
-
|
|
51
|
+
docker build --platform linux/amd64 -t <registry/image:tag> .
|
|
52
|
+
docker push <registry/image:tag>
|
|
197
53
|
```
|
|
198
|
-
**Agent formats:** Bold names, TVL in human-readable form, staker counts.
|
|
199
54
|
|
|
200
|
-
|
|
55
|
+
### Step 2: Deploy
|
|
201
56
|
|
|
202
|
-
**User:** "Deploy my Dockerfile to EigenCompute"
|
|
203
|
-
**Agent reads:** `skills/eigen-compute/SKILL.md`
|
|
204
|
-
**Agent runs:**
|
|
205
57
|
```bash
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
#
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
---
|
|
58
|
+
# Remove Dockerfile to avoid "Choose deployment method" prompt
|
|
59
|
+
rm -f Dockerfile
|
|
60
|
+
touch .env # create empty .env if no secrets
|
|
212
61
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
-
|
|
219
|
-
-
|
|
62
|
+
echo "n" | ecloud compute app deploy \
|
|
63
|
+
--name <app-name> \
|
|
64
|
+
--image-ref <registry/image:tag> \
|
|
65
|
+
--skip-profile \
|
|
66
|
+
--env-file .env \
|
|
67
|
+
--instance-type g1-standard-4t \
|
|
68
|
+
--log-visibility public \
|
|
69
|
+
--resource-usage-monitoring enable \
|
|
70
|
+
--verbose
|
|
220
71
|
```
|
|
221
72
|
|
|
222
|
-
###
|
|
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');
|
|
73
|
+
### Dockerfile Requirements
|
|
259
74
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
// Most delegated operators
|
|
264
|
-
const topDelegated = await delegation.getTopDelegatedOperators(10);
|
|
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
|
-
```
|
|
75
|
+
- Use `EXPOSE <port>` to declare your port
|
|
76
|
+
- App must listen on `0.0.0.0`, not `localhost`
|
|
77
|
+
- EigenCompute wraps your CMD with `compute-source-env.sh` entrypoint — do NOT set your own ENTRYPOINT to source it manually
|
|
296
78
|
|
|
297
79
|
---
|
|
298
80
|
|
|
299
|
-
##
|
|
300
|
-
|
|
301
|
-
### eigen-restaking
|
|
302
|
-
|
|
303
|
-
🔄 **Query EigenLayer restaking data**
|
|
81
|
+
## Manage Apps
|
|
304
82
|
|
|
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:**
|
|
324
83
|
```bash
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
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"
|
|
84
|
+
ecloud compute app list
|
|
85
|
+
ecloud compute app info <APP_ID>
|
|
86
|
+
ecloud compute app logs <APP_ID>
|
|
87
|
+
ecloud compute app start <APP_ID>
|
|
88
|
+
ecloud compute app stop <APP_ID>
|
|
89
|
+
ecloud compute app upgrade <APP_ID>
|
|
336
90
|
```
|
|
337
91
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
### eigen-avs
|
|
92
|
+
### Terminate (interactive confirm — pipe "y")
|
|
341
93
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
```
|
|
345
|
-
AVS (Service)
|
|
346
|
-
├── Operators (securing it)
|
|
347
|
-
├── Stakers (delegated via operators)
|
|
348
|
-
├── Registration Events
|
|
349
|
-
└── Operator-Sets (slashing-era grouping)
|
|
94
|
+
```bash
|
|
95
|
+
echo "y" | ecloud compute app terminate <APP_ID>
|
|
350
96
|
```
|
|
351
97
|
|
|
352
|
-
**Key endpoints:**
|
|
353
|
-
|
|
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 |
|
|
362
|
-
|
|
363
98
|
---
|
|
364
99
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
💰 **Query rewards and yield data**
|
|
368
|
-
|
|
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:**
|
|
100
|
+
## Sealed Secrets
|
|
384
101
|
|
|
385
|
-
|
|
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 |
|
|
392
|
-
|
|
393
|
-
---
|
|
394
|
-
|
|
395
|
-
### eigen-delegation
|
|
396
|
-
|
|
397
|
-
🤝 **Query delegation relationships**
|
|
398
|
-
|
|
399
|
-
```
|
|
400
|
-
Staker ──delegates──▶ Operator ──registers──▶ AVS
|
|
401
|
-
│ │
|
|
402
|
-
└── withdrawals └── operator-sets
|
|
102
|
+
```bash
|
|
103
|
+
ecloud compute app env set MY_SECRET="value" API_KEY="key"
|
|
403
104
|
```
|
|
404
105
|
|
|
405
|
-
|
|
406
|
-
|
|
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) |
|
|
106
|
+
Secrets are encrypted and only decryptable inside the TEE via KMS attestation. At boot, `compute-source-env.sh` fetches them and writes to `/tmp/.env`.
|
|
416
107
|
|
|
417
108
|
---
|
|
418
109
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
🔒 **Deploy and manage TEE applications**
|
|
110
|
+
## TEE Internals
|
|
422
111
|
|
|
423
112
|
```
|
|
424
113
|
┌─────────────────────────────────────────┐
|
|
@@ -431,7 +120,6 @@ Staker ──delegates──▶ Operator ──registers──▶ AVS
|
|
|
431
120
|
│ │ • Encrypted memory │ │
|
|
432
121
|
│ │ • Sealed secrets │ │
|
|
433
122
|
│ │ • KMS signing key │ │
|
|
434
|
-
│ │ • Unique wallet identity │ │
|
|
435
123
|
│ │ • Cryptographic attestation │ │
|
|
436
124
|
│ └─────────────────────────────────┘ │
|
|
437
125
|
│ │
|
|
@@ -442,314 +130,36 @@ Staker ──delegates──▶ Operator ──registers──▶ AVS
|
|
|
442
130
|
└─────────────────────────────────────────┘
|
|
443
131
|
```
|
|
444
132
|
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
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 |
|
|
133
|
+
| Path | What |
|
|
134
|
+
|------|------|
|
|
135
|
+
| `/usr/local/bin/compute-source-env.sh` | Entrypoint — fetches secrets, then runs your CMD |
|
|
136
|
+
| `/usr/local/bin/kms-signing-public-key.pem` | KMS signing public key |
|
|
137
|
+
| `/usr/local/bin/kms-client` | KMS client binary |
|
|
573
138
|
|
|
574
|
-
|
|
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 |
|
|
606
|
-
|
|
607
|
-
---
|
|
608
|
-
|
|
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 |
|
|
618
|
-
|
|
619
|
-
---
|
|
620
|
-
|
|
621
|
-
## Demo
|
|
622
|
-
|
|
623
|
-
Run the interactive demo to verify all data skills work:
|
|
624
|
-
|
|
625
|
-
```bash
|
|
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!
|
|
652
|
-
```
|
|
139
|
+
Verify your app: `https://verify-sepolia.eigencloud.xyz/app/<APP_ID>`
|
|
653
140
|
|
|
654
141
|
---
|
|
655
142
|
|
|
656
143
|
## Troubleshooting
|
|
657
144
|
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
|
661
|
-
|
|
662
|
-
| `
|
|
663
|
-
|
|
|
664
|
-
|
|
|
665
|
-
|
|
666
|
-
|
|
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
|
-
|
|
678
|
-
| Issue | Fix |
|
|
679
|
-
|-------|-----|
|
|
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 |
|
|
145
|
+
| Symptom | Cause | Fix |
|
|
146
|
+
|---------|-------|-----|
|
|
147
|
+
| `no ITA verifier client present` | CLI too old (< v0.4.3) | `sudo npm install -g @layr-labs/ecloud-cli@latest` |
|
|
148
|
+
| `failed to quote: error code 0x15` | CLI too old or flaky Shielded VM | Update CLI, use `g1-standard-4t` |
|
|
149
|
+
| `No space left on device` during layering | Docker disk full | `docker system prune -f && docker builder prune -f` |
|
|
150
|
+
| "Choose deployment method" prompt hangs | Dockerfile present in deploy dir | `rm -f Dockerfile` before deploying |
|
|
151
|
+
| App "Running" but port refuses connections | Attestation failed, app never started | Check `ecloud compute app logs <APP_ID>` |
|
|
152
|
+
| IP changes on every deploy | Expected behavior | Don't hardcode IPs |
|
|
153
|
+
| App ID changes on terminate + redeploy | Expected behavior | No persistent identity across deploys |
|
|
683
154
|
|
|
684
155
|
---
|
|
685
156
|
|
|
686
|
-
##
|
|
157
|
+
## Scaffold a New App (Optional)
|
|
687
158
|
|
|
159
|
+
```bash
|
|
160
|
+
ecloud compute app create --name my-app --language typescript --template-repo minimal
|
|
161
|
+
# Languages: typescript, python, golang, rust
|
|
688
162
|
```
|
|
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
|
|
753
163
|
|
|
754
164
|
---
|
|
755
165
|
|
|
@@ -760,5 +170,5 @@ MIT
|
|
|
760
170
|
---
|
|
761
171
|
|
|
762
172
|
<p align="center">
|
|
763
|
-
Built
|
|
173
|
+
Built for <a href="https://eigencloud.xyz">EigenCompute</a> TEE
|
|
764
174
|
</p>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eigen-skills",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
4
|
"description": "Deploy and manage apps on EigenCompute TEE — trusted execution environments with hardware-level isolation, encrypted secrets, and attestation",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"agents": {
|