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.
- package/dist/api/client.d.ts +63 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +146 -0
- package/dist/api/client.js.map +1 -0
- package/dist/commands/balance.d.ts +3 -0
- package/dist/commands/balance.d.ts.map +1 -0
- package/dist/commands/balance.js +62 -0
- package/dist/commands/balance.js.map +1 -0
- package/dist/commands/rewards.d.ts +3 -0
- package/dist/commands/rewards.d.ts.map +1 -0
- package/dist/commands/rewards.js +72 -0
- package/dist/commands/rewards.js.map +1 -0
- package/dist/commands/stake.d.ts +3 -0
- package/dist/commands/stake.d.ts.map +1 -0
- package/dist/commands/stake.js +45 -0
- package/dist/commands/stake.js.map +1 -0
- package/dist/commands/stats.d.ts +3 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +59 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/withdraw.d.ts +3 -0
- package/dist/commands/withdraw.d.ts.map +1 -0
- package/dist/commands/withdraw.js +109 -0
- package/dist/commands/withdraw.js.map +1 -0
- package/dist/commands/wrap.d.ts +4 -0
- package/dist/commands/wrap.d.ts.map +1 -0
- package/dist/commands/wrap.js +89 -0
- package/dist/commands/wrap.js.map +1 -0
- package/dist/config/abis.d.ts +212 -0
- package/dist/config/abis.d.ts.map +1 -0
- package/dist/config/abis.js +146 -0
- package/dist/config/abis.js.map +1 -0
- package/dist/config/contracts.d.ts +9 -0
- package/dist/config/contracts.d.ts.map +1 -0
- package/dist/config/contracts.js +19 -0
- package/dist/config/contracts.js.map +1 -0
- package/dist/config/store.d.ts +11 -0
- package/dist/config/store.d.ts.map +1 -0
- package/dist/config/store.js +93 -0
- package/dist/config/store.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +2 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +226 -0
- package/dist/mcp.js.map +1 -0
- package/dist/utils/format.d.ts +15 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +43 -0
- package/dist/utils/format.js.map +1 -0
- 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 @@
|
|
|
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
|
package/dist/mcp.js.map
ADDED
|
@@ -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
|
+
}
|