lido-cli 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.
Files changed (53) hide show
  1. package/dist/api/client.d.ts +63 -0
  2. package/dist/api/client.d.ts.map +1 -0
  3. package/dist/api/client.js +146 -0
  4. package/dist/api/client.js.map +1 -0
  5. package/dist/commands/balance.d.ts +3 -0
  6. package/dist/commands/balance.d.ts.map +1 -0
  7. package/dist/commands/balance.js +62 -0
  8. package/dist/commands/balance.js.map +1 -0
  9. package/dist/commands/rewards.d.ts +3 -0
  10. package/dist/commands/rewards.d.ts.map +1 -0
  11. package/dist/commands/rewards.js +72 -0
  12. package/dist/commands/rewards.js.map +1 -0
  13. package/dist/commands/stake.d.ts +3 -0
  14. package/dist/commands/stake.d.ts.map +1 -0
  15. package/dist/commands/stake.js +45 -0
  16. package/dist/commands/stake.js.map +1 -0
  17. package/dist/commands/stats.d.ts +3 -0
  18. package/dist/commands/stats.d.ts.map +1 -0
  19. package/dist/commands/stats.js +59 -0
  20. package/dist/commands/stats.js.map +1 -0
  21. package/dist/commands/withdraw.d.ts +3 -0
  22. package/dist/commands/withdraw.d.ts.map +1 -0
  23. package/dist/commands/withdraw.js +109 -0
  24. package/dist/commands/withdraw.js.map +1 -0
  25. package/dist/commands/wrap.d.ts +4 -0
  26. package/dist/commands/wrap.d.ts.map +1 -0
  27. package/dist/commands/wrap.js +89 -0
  28. package/dist/commands/wrap.js.map +1 -0
  29. package/dist/config/abis.d.ts +212 -0
  30. package/dist/config/abis.d.ts.map +1 -0
  31. package/dist/config/abis.js +146 -0
  32. package/dist/config/abis.js.map +1 -0
  33. package/dist/config/contracts.d.ts +9 -0
  34. package/dist/config/contracts.d.ts.map +1 -0
  35. package/dist/config/contracts.js +19 -0
  36. package/dist/config/contracts.js.map +1 -0
  37. package/dist/config/store.d.ts +11 -0
  38. package/dist/config/store.d.ts.map +1 -0
  39. package/dist/config/store.js +93 -0
  40. package/dist/config/store.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +66 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/mcp.d.ts +2 -0
  46. package/dist/mcp.d.ts.map +1 -0
  47. package/dist/mcp.js +226 -0
  48. package/dist/mcp.js.map +1 -0
  49. package/dist/utils/format.d.ts +15 -0
  50. package/dist/utils/format.d.ts.map +1 -0
  51. package/dist/utils/format.js +43 -0
  52. package/dist/utils/format.js.map +1 -0
  53. package/package.json +48 -0
package/dist/index.js ADDED
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ const commander_1 = require("commander");
38
+ const balance_1 = require("./commands/balance");
39
+ const stats_1 = require("./commands/stats");
40
+ const stake_1 = require("./commands/stake");
41
+ const wrap_1 = require("./commands/wrap");
42
+ const withdraw_1 = require("./commands/withdraw");
43
+ const rewards_1 = require("./commands/rewards");
44
+ const pkg = require('../package.json');
45
+ const program = new commander_1.Command();
46
+ program
47
+ .name('lido')
48
+ .description('Agent-first CLI for the Lido staking protocol. JSON output by default.')
49
+ .version(pkg.version);
50
+ program.addCommand((0, balance_1.makeBalanceCommand)());
51
+ program.addCommand((0, stats_1.makeStatsCommand)());
52
+ program.addCommand((0, stake_1.makeStakeCommand)());
53
+ program.addCommand((0, wrap_1.makeWrapCommand)());
54
+ program.addCommand((0, wrap_1.makeUnwrapCommand)());
55
+ program.addCommand((0, withdraw_1.makeWithdrawCommand)());
56
+ program.addCommand((0, rewards_1.makeRewardsCommand)());
57
+ // MCP server subcommand
58
+ program
59
+ .command('mcp')
60
+ .description('Start MCP server over stdio (for Claude Desktop, Claude Code, etc.)')
61
+ .action(async () => {
62
+ const { startMcpServer } = await Promise.resolve().then(() => __importStar(require('./mcp')));
63
+ await startMcpServer();
64
+ });
65
+ program.parse();
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,gDAAwD;AACxD,4CAAoD;AACpD,4CAAoD;AACpD,0CAAqE;AACrE,kDAA0D;AAC1D,gDAAwD;AAExD,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEvC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,wEAAwE,CAAC;KACrF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO,CAAC,UAAU,CAAC,IAAA,4BAAkB,GAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,IAAA,wBAAgB,GAAE,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,IAAA,wBAAgB,GAAE,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,IAAA,sBAAe,GAAE,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,IAAA,wBAAiB,GAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,IAAA,8BAAmB,GAAE,CAAC,CAAC;AAC1C,OAAO,CAAC,UAAU,CAAC,IAAA,4BAAkB,GAAE,CAAC,CAAC;AAEzC,wBAAwB;AACxB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,qEAAqE,CAAC;KAClF,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,cAAc,EAAE,GAAG,wDAAa,OAAO,GAAC,CAAC;IACjD,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function startMcpServer(): Promise<void>;
2
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAWA,wBAAsB,cAAc,kBA0OnC"}
package/dist/mcp.js ADDED
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.startMcpServer = startMcpServer;
37
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
38
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
39
+ const zod_1 = require("zod");
40
+ const client_1 = require("./api/client");
41
+ const store_1 = require("./config/store");
42
+ function getClient() {
43
+ return new client_1.LidoClient((0, store_1.getRpcUrl)());
44
+ }
45
+ async function startMcpServer() {
46
+ const server = new mcp_js_1.McpServer({
47
+ name: 'lido-cli',
48
+ version: '1.0.0',
49
+ });
50
+ // Balance tool
51
+ server.tool('lido_balance', 'Get stETH, wstETH, and ETH balances for a wallet', { wallet: zod_1.z.string().describe('Ethereum wallet address') }, async ({ wallet }) => {
52
+ const client = getClient();
53
+ const address = wallet;
54
+ const [eth, stETH, wstETH, rate] = await Promise.all([
55
+ client.getETHBalance(address),
56
+ client.getStETHBalance(address),
57
+ client.getWstETHBalance(address),
58
+ client.getExchangeRate(),
59
+ ]);
60
+ const wstETHInStETH = parseFloat(wstETH.formatted) * parseFloat(rate.stEthPerWstEth);
61
+ const totalStETH = parseFloat(stETH.formatted) + wstETHInStETH;
62
+ return {
63
+ content: [{
64
+ type: 'text',
65
+ text: JSON.stringify({
66
+ wallet: address,
67
+ eth: eth.formatted,
68
+ stETH: stETH.formatted,
69
+ wstETH: wstETH.formatted,
70
+ wstETHValueInStETH: wstETHInStETH.toString(),
71
+ totalStETHEquivalent: totalStETH.toString(),
72
+ exchangeRate: rate.stEthPerWstEth,
73
+ }, null, 2),
74
+ }],
75
+ };
76
+ });
77
+ // Stats tool
78
+ server.tool('lido_stats', 'Get Lido protocol statistics (total pooled ETH, exchange rates, withdrawal queue)', {}, async () => {
79
+ const client = getClient();
80
+ const [protocol, rate, queue] = await Promise.all([
81
+ client.getProtocolStats(),
82
+ client.getExchangeRate(),
83
+ client.getWithdrawalQueueStats(),
84
+ ]);
85
+ return {
86
+ content: [{
87
+ type: 'text',
88
+ text: JSON.stringify({
89
+ totalPooledEther: protocol.totalPooledEther,
90
+ totalShares: protocol.totalShares,
91
+ totalSupply: protocol.totalSupply,
92
+ exchangeRate: rate,
93
+ withdrawalQueue: queue,
94
+ }, null, 2),
95
+ }],
96
+ };
97
+ });
98
+ // Rewards tool
99
+ server.tool('lido_rewards', 'Get staking rewards info and optionally a wallet position', { wallet: zod_1.z.string().optional().describe('Ethereum wallet address (optional)') }, async ({ wallet }) => {
100
+ const client = getClient();
101
+ const [protocol, rate, queue] = await Promise.all([
102
+ client.getProtocolStats(),
103
+ client.getExchangeRate(),
104
+ client.getWithdrawalQueueStats(),
105
+ ]);
106
+ let walletData = null;
107
+ if (wallet) {
108
+ const address = wallet;
109
+ const [stETH, wstETH] = await Promise.all([
110
+ client.getStETHBalance(address),
111
+ client.getWstETHBalance(address),
112
+ ]);
113
+ const wstETHInStETH = parseFloat(wstETH.formatted) * parseFloat(rate.stEthPerWstEth);
114
+ walletData = {
115
+ wallet: address,
116
+ stETH: stETH.formatted,
117
+ wstETH: wstETH.formatted,
118
+ totalStakedStETH: (parseFloat(stETH.formatted) + wstETHInStETH).toString(),
119
+ };
120
+ }
121
+ return {
122
+ content: [{
123
+ type: 'text',
124
+ text: JSON.stringify({
125
+ protocol: {
126
+ totalPooledEther: protocol.totalPooledEther,
127
+ exchangeRate: rate.stEthPerWstEth,
128
+ unfinalizedWithdrawals: queue.unfinalizedStETH,
129
+ },
130
+ ...(walletData ? { wallet: walletData } : {}),
131
+ }, null, 2),
132
+ }],
133
+ };
134
+ });
135
+ // Stake tool
136
+ server.tool('lido_stake', 'Build a transaction to stake ETH via Lido (returns calldata, does not execute)', {
137
+ amount: zod_1.z.string().describe('Amount of ETH to stake'),
138
+ wallet: zod_1.z.string().describe('Wallet address'),
139
+ }, async ({ amount, wallet }) => {
140
+ const client = getClient();
141
+ const tx = client.buildStakeTransaction(amount);
142
+ return {
143
+ content: [{
144
+ type: 'text',
145
+ text: JSON.stringify({ ...tx, from: wallet }, null, 2),
146
+ }],
147
+ };
148
+ });
149
+ // Wrap tool
150
+ server.tool('lido_wrap', 'Build a transaction to wrap stETH into wstETH', { amount: zod_1.z.string().describe('Amount of stETH to wrap') }, async ({ amount }) => {
151
+ const client = getClient();
152
+ const [tx, rate] = await Promise.all([
153
+ Promise.resolve(client.buildWrapTransaction(amount)),
154
+ client.getExchangeRate(),
155
+ ]);
156
+ const estimatedWstETH = parseFloat(amount) * parseFloat(rate.wstEthPerStEth);
157
+ return {
158
+ content: [{
159
+ type: 'text',
160
+ text: JSON.stringify({ ...tx, estimatedOutput: estimatedWstETH.toString(), rate: rate.wstEthPerStEth }, null, 2),
161
+ }],
162
+ };
163
+ });
164
+ // Unwrap tool
165
+ server.tool('lido_unwrap', 'Build a transaction to unwrap wstETH back to stETH', { amount: zod_1.z.string().describe('Amount of wstETH to unwrap') }, async ({ amount }) => {
166
+ const client = getClient();
167
+ const [tx, rate] = await Promise.all([
168
+ Promise.resolve(client.buildUnwrapTransaction(amount)),
169
+ client.getExchangeRate(),
170
+ ]);
171
+ const estimatedStETH = parseFloat(amount) * parseFloat(rate.stEthPerWstEth);
172
+ return {
173
+ content: [{
174
+ type: 'text',
175
+ text: JSON.stringify({ ...tx, estimatedOutput: estimatedStETH.toString(), rate: rate.stEthPerWstEth }, null, 2),
176
+ }],
177
+ };
178
+ });
179
+ // Withdrawal status tool
180
+ server.tool('lido_withdrawal_status', 'Check withdrawal request status for a wallet', { wallet: zod_1.z.string().describe('Ethereum wallet address') }, async ({ wallet }) => {
181
+ const client = getClient();
182
+ const address = wallet;
183
+ const requestIds = await client.getWithdrawalRequests(address);
184
+ if (requestIds.length === 0) {
185
+ return {
186
+ content: [{
187
+ type: 'text',
188
+ text: JSON.stringify({ wallet: address, requests: [] }, null, 2),
189
+ }],
190
+ };
191
+ }
192
+ const { formatEther } = await Promise.resolve().then(() => __importStar(require('viem')));
193
+ const statuses = await client.getWithdrawalStatus(requestIds);
194
+ const requests = requestIds.map((id, i) => ({
195
+ requestId: id.toString(),
196
+ amountStETH: formatEther(statuses[i].amountOfStETH),
197
+ timestamp: new Date(Number(statuses[i].timestamp) * 1000).toISOString(),
198
+ isFinalized: statuses[i].isFinalized,
199
+ isClaimed: statuses[i].isClaimed,
200
+ status: statuses[i].isClaimed ? 'claimed' : statuses[i].isFinalized ? 'ready_to_claim' : 'pending',
201
+ }));
202
+ return {
203
+ content: [{
204
+ type: 'text',
205
+ text: JSON.stringify({ wallet: address, requests }, null, 2),
206
+ }],
207
+ };
208
+ });
209
+ // Withdraw request tool
210
+ server.tool('lido_withdraw_request', 'Build a transaction to request a withdrawal of stETH to ETH', {
211
+ amount: zod_1.z.string().describe('Amount of stETH to withdraw'),
212
+ wallet: zod_1.z.string().describe('Wallet address (owner of withdrawal)'),
213
+ }, async ({ amount, wallet }) => {
214
+ const client = getClient();
215
+ const tx = client.buildWithdrawTransaction(amount, wallet);
216
+ return {
217
+ content: [{
218
+ type: 'text',
219
+ text: JSON.stringify({ ...tx, from: wallet }, null, 2),
220
+ }],
221
+ };
222
+ });
223
+ const transport = new stdio_js_1.StdioServerTransport();
224
+ await server.connect(transport);
225
+ }
226
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare function formatEth(value: string, decimals?: number): string;
2
+ /**
3
+ * Write a structured JSON error to stderr and set exit code.
4
+ */
5
+ export declare function jsonError(message: string, code: string, exitCode: number): void;
6
+ /**
7
+ * Print a styled header (for --pretty mode).
8
+ */
9
+ export declare function header(text: string): void;
10
+ /**
11
+ * Print a label-value row (for --pretty mode).
12
+ */
13
+ export declare function row(label: string, value: string): void;
14
+ export declare function formatTimestamp(timestamp: bigint): string;
15
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAIrE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAG/E;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIzC;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGzD"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.formatEth = formatEth;
7
+ exports.jsonError = jsonError;
8
+ exports.header = header;
9
+ exports.row = row;
10
+ exports.formatTimestamp = formatTimestamp;
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ function formatEth(value, decimals = 6) {
13
+ const num = parseFloat(value);
14
+ if (num === 0)
15
+ return '0';
16
+ return num.toFixed(decimals).replace(/\.?0+$/, '');
17
+ }
18
+ /**
19
+ * Write a structured JSON error to stderr and set exit code.
20
+ */
21
+ function jsonError(message, code, exitCode) {
22
+ process.stderr.write(JSON.stringify({ error: message, code, exitCode }) + '\n');
23
+ process.exitCode = exitCode;
24
+ }
25
+ /**
26
+ * Print a styled header (for --pretty mode).
27
+ */
28
+ function header(text) {
29
+ console.log();
30
+ console.log(chalk_1.default.bold.cyan(text));
31
+ console.log(chalk_1.default.cyan('-'.repeat(text.length)));
32
+ }
33
+ /**
34
+ * Print a label-value row (for --pretty mode).
35
+ */
36
+ function row(label, value) {
37
+ console.log(` ${chalk_1.default.gray(label.padEnd(22))} ${value}`);
38
+ }
39
+ function formatTimestamp(timestamp) {
40
+ const date = new Date(Number(timestamp) * 1000);
41
+ return date.toISOString();
42
+ }
43
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":";;;;;AAEA,8BAIC;AAKD,8BAGC;AAKD,wBAIC;AAKD,kBAEC;AAED,0CAGC;AAnCD,kDAA0B;AAE1B,SAAgB,SAAS,CAAC,KAAa,EAAE,WAAmB,CAAC;IAC3D,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC1B,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,OAAe,EAAE,IAAY,EAAE,QAAgB;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAChF,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAgB,MAAM,CAAC,IAAY;IACjC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,SAAgB,GAAG,CAAC,KAAa,EAAE,KAAa;IAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,eAAe,CAAC,SAAiB;IAC/C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "lido-cli",
3
+ "version": "1.0.0",
4
+ "description": "CLI for interacting with the Lido staking protocol",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "lido": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsx src/index.ts",
12
+ "test": "jest --verbose",
13
+ "test:coverage": "jest --coverage"
14
+ },
15
+ "keywords": [
16
+ "lido",
17
+ "steth",
18
+ "staking",
19
+ "ethereum",
20
+ "cli"
21
+ ],
22
+ "author": "winstain",
23
+ "license": "MIT",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/winstain/lido-cli.git"
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "README.md"
31
+ ],
32
+ "type": "commonjs",
33
+ "dependencies": {
34
+ "@modelcontextprotocol/sdk": "^1.27.1",
35
+ "chalk": "^4.1.2",
36
+ "commander": "^14.0.3",
37
+ "tsx": "^4.21.0",
38
+ "typescript": "^5.9.3",
39
+ "viem": "^2.31.0",
40
+ "zod": "^4.3.6"
41
+ },
42
+ "devDependencies": {
43
+ "@types/jest": "^30.0.0",
44
+ "@types/node": "^25.5.0",
45
+ "jest": "^30.3.0",
46
+ "ts-jest": "^29.4.6"
47
+ }
48
+ }