@aibtc/mcp-server 1.2.0 → 1.3.1

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 (43) hide show
  1. package/dist/api.d.ts +12 -0
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +12 -3
  4. package/dist/api.js.map +1 -1
  5. package/dist/index.js +34 -4
  6. package/dist/index.js.map +1 -1
  7. package/dist/services/x402.service.d.ts.map +1 -1
  8. package/dist/services/x402.service.js +0 -3
  9. package/dist/services/x402.service.js.map +1 -1
  10. package/dist/tools/index.d.ts.map +1 -1
  11. package/dist/tools/index.js +3 -0
  12. package/dist/tools/index.js.map +1 -1
  13. package/dist/tools/wallet-management.tools.js +6 -6
  14. package/dist/tools/wallet-management.tools.js.map +1 -1
  15. package/dist/tools/yield-hunter.tools.d.ts +3 -0
  16. package/dist/tools/yield-hunter.tools.d.ts.map +1 -0
  17. package/dist/tools/yield-hunter.tools.js +574 -0
  18. package/dist/tools/yield-hunter.tools.js.map +1 -0
  19. package/dist/utils/errors.d.ts.map +1 -1
  20. package/dist/utils/errors.js +3 -2
  21. package/dist/utils/errors.js.map +1 -1
  22. package/dist/utils/index.d.ts +1 -0
  23. package/dist/utils/index.d.ts.map +1 -1
  24. package/dist/utils/index.js +1 -0
  25. package/dist/utils/index.js.map +1 -1
  26. package/dist/utils/redact.d.ts +10 -0
  27. package/dist/utils/redact.d.ts.map +1 -0
  28. package/dist/utils/redact.js +16 -0
  29. package/dist/utils/redact.js.map +1 -0
  30. package/dist/utils/storage.d.ts.map +1 -1
  31. package/dist/utils/storage.js +10 -10
  32. package/dist/utils/storage.js.map +1 -1
  33. package/dist/utils/validation.js +2 -2
  34. package/dist/utils/validation.js.map +1 -1
  35. package/dist/wallet.d.ts +27 -0
  36. package/dist/wallet.d.ts.map +1 -1
  37. package/dist/wallet.js +13 -0
  38. package/dist/wallet.js.map +1 -1
  39. package/dist/yield-hunter/index.d.ts +9 -0
  40. package/dist/yield-hunter/index.d.ts.map +1 -0
  41. package/dist/yield-hunter/index.js +319 -0
  42. package/dist/yield-hunter/index.js.map +1 -0
  43. package/package.json +5 -2
@@ -0,0 +1,319 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Yield Hunter - Autonomous sBTC yield farming daemon
4
+ *
5
+ * Automatically deposits sBTC to Zest Protocol and compounds earnings.
6
+ * Uses the wallet configured in ~/.aibtc/
7
+ */
8
+ import { getWalletManager } from "../services/wallet-manager.js";
9
+ import { getZestProtocolService } from "../services/defi.service.js";
10
+ import { getHiroApi } from "../services/hiro-api.js";
11
+ import { ZEST_ASSETS } from "../config/contracts.js";
12
+ import { NETWORK } from "../config/networks.js";
13
+ import { redactSensitive } from "../utils/redact.js";
14
+ import fs from "fs";
15
+ import fsPromises from "fs/promises";
16
+ import path from "path";
17
+ import os from "os";
18
+ const DEFAULT_CONFIG = {
19
+ minDepositThreshold: 10000n, // 0.0001 sBTC (~$10 at $100k BTC)
20
+ checkIntervalMs: 10 * 60 * 1000, // 10 minutes
21
+ execute: false,
22
+ asset: "sBTC",
23
+ };
24
+ const STATE_FILE = path.join(os.homedir(), ".aibtc", "yield-hunter-state.json");
25
+ // ============================================================================
26
+ // State Management
27
+ // ============================================================================
28
+ async function loadState() {
29
+ try {
30
+ const content = await fsPromises.readFile(STATE_FILE, "utf8");
31
+ return JSON.parse(content);
32
+ }
33
+ catch {
34
+ return {
35
+ lastCheck: null,
36
+ totalDeposited: "0",
37
+ totalEarned: "0",
38
+ transactions: [],
39
+ };
40
+ }
41
+ }
42
+ async function saveState(state) {
43
+ await fsPromises.writeFile(STATE_FILE, JSON.stringify(state, null, 2));
44
+ }
45
+ // ============================================================================
46
+ // Helpers
47
+ // ============================================================================
48
+ // Global log file path (set by CLI arg)
49
+ let LOG_FILE_PATH = null;
50
+ function formatSats(sats) {
51
+ const btc = Number(sats) / 100_000_000;
52
+ return `${btc.toFixed(8)} sBTC (${sats.toString()} sats)`;
53
+ }
54
+ function log(message) {
55
+ const timestamp = new Date().toISOString();
56
+ const logLine = `[${timestamp}] ${message}`;
57
+ console.log(logLine);
58
+ // Also write to file if --log-file was specified
59
+ if (LOG_FILE_PATH) {
60
+ try {
61
+ fs.appendFileSync(LOG_FILE_PATH, logLine + "\n");
62
+ }
63
+ catch (error) {
64
+ console.error(`Failed to write to log file: ${redactSensitive(error.message)}`);
65
+ }
66
+ }
67
+ }
68
+ // ============================================================================
69
+ // Core Logic
70
+ // ============================================================================
71
+ async function getSbtcBalance(address) {
72
+ const hiro = getHiroApi(NETWORK);
73
+ const balances = await hiro.getAccountBalances(address);
74
+ // Find sBTC in fungible tokens
75
+ const sbtcToken = ZEST_ASSETS.sBTC.token;
76
+ const sbtcKey = Object.keys(balances.fungible_tokens || {}).find((key) => key.startsWith(sbtcToken));
77
+ if (sbtcKey && balances.fungible_tokens[sbtcKey]) {
78
+ return BigInt(balances.fungible_tokens[sbtcKey].balance);
79
+ }
80
+ return 0n;
81
+ }
82
+ async function runCheck(account, config, state) {
83
+ const zest = getZestProtocolService(NETWORK);
84
+ // Get current sBTC balance in wallet
85
+ const walletBalance = await getSbtcBalance(account.address);
86
+ log(`Wallet sBTC balance: ${formatSats(walletBalance)}`);
87
+ // Get current Zest position
88
+ const position = await zest.getUserPosition(ZEST_ASSETS.sBTC.token, account.address);
89
+ const zestSupplied = position ? BigInt(position.supplied) : 0n;
90
+ log(`Zest supplied: ${formatSats(zestSupplied)}`);
91
+ // Check if we should deposit
92
+ if (walletBalance >= config.minDepositThreshold) {
93
+ log(`Balance above threshold (${formatSats(config.minDepositThreshold)}), depositing...`);
94
+ if (config.execute) {
95
+ try {
96
+ const result = await zest.supply(account, config.asset, walletBalance);
97
+ log(`Deposited ${formatSats(walletBalance)} to Zest. TxID: ${result.txid}`);
98
+ // Update state
99
+ state.totalDeposited = (BigInt(state.totalDeposited) + walletBalance).toString();
100
+ state.transactions.push({
101
+ type: "deposit",
102
+ amount: walletBalance.toString(),
103
+ txid: result.txid,
104
+ timestamp: new Date().toISOString(),
105
+ });
106
+ }
107
+ catch (error) {
108
+ log(`Failed to deposit: ${redactSensitive(error.message)}`);
109
+ }
110
+ }
111
+ else {
112
+ log(`[DRY RUN] Would deposit ${formatSats(walletBalance)} to Zest`);
113
+ }
114
+ }
115
+ else {
116
+ log(`Balance below threshold, no action needed`);
117
+ }
118
+ // Update state
119
+ state.lastCheck = new Date().toISOString();
120
+ await saveState(state);
121
+ }
122
+ // ============================================================================
123
+ // CLI Commands
124
+ // ============================================================================
125
+ async function startDaemon(config) {
126
+ log("Starting Yield Hunter daemon...");
127
+ log(`Network: ${NETWORK}`);
128
+ log(`Min deposit threshold: ${formatSats(config.minDepositThreshold)}`);
129
+ log(`Check interval: ${config.checkIntervalMs / 1000}s`);
130
+ log(`Execute mode: ${config.execute ? "LIVE" : "DRY RUN"}`);
131
+ if (NETWORK !== "mainnet") {
132
+ log("WARNING: Zest Protocol is only available on mainnet");
133
+ process.exit(1);
134
+ }
135
+ // Get wallet
136
+ const walletManager = getWalletManager();
137
+ const wallets = await walletManager.listWallets();
138
+ if (wallets.length === 0) {
139
+ log("No wallets found. Create one with: npx @aibtc/mcp-server");
140
+ log("Then use wallet_create or wallet_import via Claude");
141
+ process.exit(1);
142
+ }
143
+ const activeWalletId = await walletManager.getActiveWalletId();
144
+ if (!activeWalletId) {
145
+ log("No active wallet. Set one with wallet_switch");
146
+ process.exit(1);
147
+ }
148
+ const activeWallet = wallets.find((w) => w.id === activeWalletId);
149
+ log(`Using wallet: ${activeWallet?.name} (${activeWallet?.address})`);
150
+ // Prompt for password
151
+ const password = await promptPassword();
152
+ // Disable auto-lock for daemon mode BEFORE unlocking
153
+ await walletManager.setAutoLockTimeout(0);
154
+ let account;
155
+ try {
156
+ account = await walletManager.unlock(activeWalletId, password);
157
+ log(`Wallet unlocked: ${account.address}`);
158
+ }
159
+ catch (error) {
160
+ log(`Failed to unlock wallet: ${redactSensitive(error.message)}`);
161
+ process.exit(1);
162
+ }
163
+ // Defensive verification: ensure auto-lock is actually disabled
164
+ const sessionInfo = walletManager.getSessionInfo();
165
+ if (sessionInfo?.expiresAt !== null) {
166
+ log("WARNING: Auto-lock still active after disabling, forcing null expiry");
167
+ await walletManager.setAutoLockTimeout(0);
168
+ }
169
+ log("Auto-lock disabled for daemon mode (session never expires)");
170
+ // Load state
171
+ const state = await loadState();
172
+ // Run initial check
173
+ await runCheck(account, config, state);
174
+ // Schedule periodic checks
175
+ log(`\nDaemon running. Press Ctrl+C to stop.\n`);
176
+ const intervalId = setInterval(async () => {
177
+ try {
178
+ await runCheck(account, config, state);
179
+ }
180
+ catch (error) {
181
+ log(`Error during check: ${redactSensitive(error.message)}`);
182
+ }
183
+ }, config.checkIntervalMs);
184
+ // Handle shutdown
185
+ process.on("SIGINT", () => {
186
+ log("\nShutting down...");
187
+ clearInterval(intervalId);
188
+ walletManager.lock();
189
+ process.exit(0);
190
+ });
191
+ process.on("SIGTERM", () => {
192
+ log("\nShutting down...");
193
+ clearInterval(intervalId);
194
+ walletManager.lock();
195
+ process.exit(0);
196
+ });
197
+ }
198
+ async function showStatus() {
199
+ log("Yield Hunter Status");
200
+ log("=".repeat(50));
201
+ const state = await loadState();
202
+ const walletManager = getWalletManager();
203
+ const wallets = await walletManager.listWallets();
204
+ const activeWalletId = await walletManager.getActiveWalletId();
205
+ const activeWallet = wallets.find((w) => w.id === activeWalletId);
206
+ log(`Network: ${NETWORK}`);
207
+ log(`Wallet: ${activeWallet?.name || "None"} (${activeWallet?.address || "N/A"})`);
208
+ log(`Last check: ${state.lastCheck || "Never"}`);
209
+ log(`Total deposited: ${formatSats(BigInt(state.totalDeposited))}`);
210
+ log(`Total earned: ${formatSats(BigInt(state.totalEarned))}`);
211
+ log(`Transaction count: ${state.transactions.length}`);
212
+ if (activeWallet && NETWORK === "mainnet") {
213
+ const zest = getZestProtocolService(NETWORK);
214
+ const position = await zest.getUserPosition(ZEST_ASSETS.sBTC.token, activeWallet.address);
215
+ if (position) {
216
+ log(`\nCurrent Zest Position:`);
217
+ log(` Supplied: ${formatSats(BigInt(position.supplied))}`);
218
+ log(` Borrowed: ${formatSats(BigInt(position.borrowed))}`);
219
+ }
220
+ const walletBalance = await getSbtcBalance(activeWallet.address);
221
+ log(`\nWallet sBTC: ${formatSats(walletBalance)}`);
222
+ }
223
+ }
224
+ async function promptPassword() {
225
+ return new Promise((resolve) => {
226
+ process.stdout.write("Enter wallet password: ");
227
+ // Disable echo for password input
228
+ if (process.stdin.isTTY) {
229
+ process.stdin.setRawMode(true);
230
+ }
231
+ let password = "";
232
+ const onData = (chunk) => {
233
+ const char = chunk.toString();
234
+ if (char === "\n" || char === "\r" || char === "\u0003") {
235
+ process.stdin.removeListener("data", onData);
236
+ if (process.stdin.isTTY) {
237
+ process.stdin.setRawMode(false);
238
+ }
239
+ console.log(); // New line after password
240
+ if (char === "\u0003") {
241
+ process.exit(0);
242
+ }
243
+ resolve(password);
244
+ }
245
+ else if (char === "\u007F" || char === "\b") {
246
+ // Backspace
247
+ password = password.slice(0, -1);
248
+ }
249
+ else {
250
+ password += char;
251
+ }
252
+ };
253
+ process.stdin.resume();
254
+ process.stdin.on("data", onData);
255
+ });
256
+ }
257
+ // ============================================================================
258
+ // Main Entry Point
259
+ // ============================================================================
260
+ export async function main(args) {
261
+ const command = args[0] || "help";
262
+ const config = { ...DEFAULT_CONFIG };
263
+ // Parse flags
264
+ for (const arg of args) {
265
+ if (arg === "--execute" || arg === "-e") {
266
+ config.execute = true;
267
+ }
268
+ else if (arg.startsWith("--threshold=")) {
269
+ config.minDepositThreshold = BigInt(arg.split("=")[1]);
270
+ }
271
+ else if (arg.startsWith("--interval=")) {
272
+ config.checkIntervalMs = parseInt(arg.split("=")[1]) * 1000;
273
+ }
274
+ else if (arg.startsWith("--log-file=")) {
275
+ LOG_FILE_PATH = arg.split("=")[1];
276
+ }
277
+ }
278
+ switch (command) {
279
+ case "start":
280
+ await startDaemon(config);
281
+ break;
282
+ case "status":
283
+ await showStatus();
284
+ break;
285
+ case "help":
286
+ default:
287
+ console.log(`
288
+ Yield Hunter - Autonomous sBTC yield farming
289
+
290
+ Usage:
291
+ npx @aibtc/mcp-server yield-hunter <command> [options]
292
+
293
+ Commands:
294
+ start Start the yield hunting daemon
295
+ status Show current status and positions
296
+ help Show this help message
297
+
298
+ Options:
299
+ --execute, -e Actually execute transactions (default: dry run)
300
+ --threshold=<sats> Minimum sBTC (in sats) before depositing (default: 10000)
301
+ --interval=<seconds> Check interval in seconds (default: 600)
302
+ --log-file=<path> Log to file in addition to stdout
303
+
304
+ Examples:
305
+ npx @aibtc/mcp-server yield-hunter start
306
+ npx @aibtc/mcp-server yield-hunter start --execute
307
+ npx @aibtc/mcp-server yield-hunter start --execute --threshold=100000
308
+ npx @aibtc/mcp-server yield-hunter start --log-file=/tmp/yield-hunter.log
309
+ npx @aibtc/mcp-server yield-hunter status
310
+
311
+ Note: Requires a wallet created via the MCP server. Run:
312
+ npx @aibtc/mcp-server --install
313
+
314
+ Then use Claude to create a wallet with wallet_create or wallet_import.
315
+ `);
316
+ break;
317
+ }
318
+ }
319
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/yield-hunter/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aibtc/mcp-server",
3
- "version": "1.2.0",
3
+ "version": "1.3.1",
4
4
  "description": "Claude Code MCP server for x402 endpoint discovery and execution with Stacks wallet integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -11,6 +11,8 @@
11
11
  "build": "tsc",
12
12
  "start": "node dist/index.js",
13
13
  "dev": "tsx src/index.ts",
14
+ "test": "vitest run",
15
+ "test:watch": "vitest",
14
16
  "prepublishOnly": "npm run build"
15
17
  },
16
18
  "files": [
@@ -53,6 +55,7 @@
53
55
  "devDependencies": {
54
56
  "@types/node": "^22.0.0",
55
57
  "tsx": "^4.19.0",
56
- "typescript": "^5.7.0"
58
+ "typescript": "^5.7.0",
59
+ "vitest": "^4.0.18"
57
60
  }
58
61
  }