@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.
- package/dist/api.d.ts +12 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +12 -3
- package/dist/api.js.map +1 -1
- package/dist/index.js +34 -4
- package/dist/index.js.map +1 -1
- package/dist/services/x402.service.d.ts.map +1 -1
- package/dist/services/x402.service.js +0 -3
- package/dist/services/x402.service.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/wallet-management.tools.js +6 -6
- package/dist/tools/wallet-management.tools.js.map +1 -1
- package/dist/tools/yield-hunter.tools.d.ts +3 -0
- package/dist/tools/yield-hunter.tools.d.ts.map +1 -0
- package/dist/tools/yield-hunter.tools.js +574 -0
- package/dist/tools/yield-hunter.tools.js.map +1 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +3 -2
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/redact.d.ts +10 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +16 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/utils/storage.d.ts.map +1 -1
- package/dist/utils/storage.js +10 -10
- package/dist/utils/storage.js.map +1 -1
- package/dist/utils/validation.js +2 -2
- package/dist/utils/validation.js.map +1 -1
- package/dist/wallet.d.ts +27 -0
- package/dist/wallet.d.ts.map +1 -1
- package/dist/wallet.js +13 -0
- package/dist/wallet.js.map +1 -1
- package/dist/yield-hunter/index.d.ts +9 -0
- package/dist/yield-hunter/index.d.ts.map +1 -0
- package/dist/yield-hunter/index.js +319 -0
- package/dist/yield-hunter/index.js.map +1 -0
- 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.
|
|
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
|
}
|