@aibtc/mcp-server 1.2.0 → 1.3.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/index.js +25 -1
- package/dist/index.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/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/yield-hunter/index.d.ts +9 -0
- package/dist/yield-hunter/index.d.ts.map +1 -0
- package/dist/yield-hunter/index.js +293 -0
- package/dist/yield-hunter/index.js.map +1 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -47,8 +47,32 @@ async function installToClaudeCode() {
|
|
|
47
47
|
console.log("💡 Tip: Get testnet STX at https://explorer.hiro.so/sandbox/faucet?chain=testnet\n");
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
+
// =============================================================================
|
|
51
|
+
// YIELD HUNTER DAEMON
|
|
52
|
+
// =============================================================================
|
|
53
|
+
async function runYieldHunter() {
|
|
54
|
+
// Dynamic import to avoid loading yield-hunter code unless needed
|
|
55
|
+
const { main } = await import("./yield-hunter/index.js");
|
|
56
|
+
// Pass remaining args after "yield-hunter"
|
|
57
|
+
const yieldHunterArgs = process.argv.slice(3);
|
|
58
|
+
await main(yieldHunterArgs);
|
|
59
|
+
}
|
|
60
|
+
// =============================================================================
|
|
61
|
+
// MAIN ROUTING
|
|
62
|
+
// =============================================================================
|
|
63
|
+
// Check for yield-hunter command
|
|
64
|
+
if (process.argv[2] === "yield-hunter") {
|
|
65
|
+
runYieldHunter()
|
|
66
|
+
.then(() => {
|
|
67
|
+
// Don't exit - daemon runs until interrupted
|
|
68
|
+
})
|
|
69
|
+
.catch((error) => {
|
|
70
|
+
console.error("❌ Yield Hunter error:", error.message);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
50
74
|
// Check for --install flag
|
|
51
|
-
if (process.argv.includes("--install") || process.argv.includes("install")) {
|
|
75
|
+
else if (process.argv.includes("--install") || process.argv.includes("install")) {
|
|
52
76
|
installToClaudeCode()
|
|
53
77
|
.then(() => process.exit(0))
|
|
54
78
|
.catch((error) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAErD,gFAAgF;AAChF,+BAA+B;AAC/B,gFAAgF;AAEhF,KAAK,UAAU,mBAAmB;IAChC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3E,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IAEnE,yCAAyC;IACzC,IAAI,MAAM,GAA6C,EAAE,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG;QAC3B,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,0BAA0B,CAAC;QAClC,GAAG,EAAE;YACH,OAAO,EAAE,OAAO;SACjB;KACF,CAAC;IAEF,eAAe;IACf,MAAM,EAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEtE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,cAAc,gBAAgB,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAElE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED,2BAA2B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoBpE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgDxD"}
|
package/dist/tools/index.js
CHANGED
|
@@ -14,6 +14,7 @@ import { registerDefiTools } from "./defi.tools.js";
|
|
|
14
14
|
// import { registerBitflowTools } from "./bitflow.tools.js";
|
|
15
15
|
import { registerScaffoldTools } from "./scaffold.tools.js";
|
|
16
16
|
import { registerOpenRouterTools } from "./openrouter.tools.js";
|
|
17
|
+
import { registerYieldHunterTools } from "./yield-hunter.tools.js";
|
|
17
18
|
/**
|
|
18
19
|
* Register all tools with the MCP server
|
|
19
20
|
*/
|
|
@@ -48,5 +49,7 @@ export function registerAllTools(server) {
|
|
|
48
49
|
registerScaffoldTools(server);
|
|
49
50
|
// OpenRouter AI (call AI models directly)
|
|
50
51
|
registerOpenRouterTools(server);
|
|
52
|
+
// Yield Hunter (autonomous sBTC yield farming)
|
|
53
|
+
registerYieldHunterTools(server);
|
|
51
54
|
}
|
|
52
55
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,+DAA+D;AAC/D,6DAA6D;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,+DAA+D;AAC/D,6DAA6D;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,mBAAmB;IACnB,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5B,yDAAyD;IACzD,6BAA6B,CAAC,MAAM,CAAC,CAAC;IAEtC,YAAY;IACZ,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,kBAAkB;IAClB,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,OAAO;IACP,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,mBAAmB;IACnB,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE3B,iBAAiB;IACjB,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,iBAAiB;IACjB,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,cAAc;IACd,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,qBAAqB;IACrB,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE3B,iBAAiB;IACjB,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,iCAAiC;IACjC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,+DAA+D;IAC/D,gCAAgC;IAEhC,gDAAgD;IAChD,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,0CAA0C;IAC1C,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAEhC,+CAA+C;IAC/C,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yield-hunter.tools.d.ts","sourceRoot":"","sources":["../../src/tools/yield-hunter.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkWpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsQhE"}
|
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { cvToJSON, hexToCV, contractPrincipalCV } from "@stacks/transactions";
|
|
3
|
+
import { getAccount, getWalletAddress, NETWORK } from "../services/x402.service.js";
|
|
4
|
+
import { getZestProtocolService } from "../services/defi.service.js";
|
|
5
|
+
import { getHiroApi } from "../services/hiro-api.js";
|
|
6
|
+
import { ZEST_ASSETS, MAINNET_CONTRACTS } from "../config/contracts.js";
|
|
7
|
+
import { createJsonResponse, createErrorResponse } from "../utils/index.js";
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Constants
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/** Buffer to keep for x402 fees + tx costs (in sats). ~0.0005 sBTC = 50k sats */
|
|
12
|
+
const FEE_BUFFER_SATS = 50000n;
|
|
13
|
+
/** Maximum retries for failed transactions */
|
|
14
|
+
const MAX_RETRIES = 3;
|
|
15
|
+
/** Delay between retries (ms) */
|
|
16
|
+
const RETRY_DELAY_MS = 5_000;
|
|
17
|
+
/** Timeout for waiting for tx confirmation (ms) */
|
|
18
|
+
const TX_CONFIRMATION_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
19
|
+
/** Poll interval for tx confirmation (ms) */
|
|
20
|
+
const TX_POLL_INTERVAL_MS = 10_000; // 10 seconds
|
|
21
|
+
const state = {
|
|
22
|
+
running: false,
|
|
23
|
+
intervalId: null,
|
|
24
|
+
config: {
|
|
25
|
+
minDepositThreshold: 10000n, // 0.0001 sBTC
|
|
26
|
+
feeBuffer: FEE_BUFFER_SATS,
|
|
27
|
+
checkIntervalMs: 10 * 60 * 1000, // 10 minutes
|
|
28
|
+
asset: "sBTC",
|
|
29
|
+
},
|
|
30
|
+
stats: {
|
|
31
|
+
lastCheck: null,
|
|
32
|
+
totalDeposited: 0n,
|
|
33
|
+
checksRun: 0,
|
|
34
|
+
depositsExecuted: 0,
|
|
35
|
+
lastError: null,
|
|
36
|
+
currentApy: null,
|
|
37
|
+
lastApyFetch: null,
|
|
38
|
+
},
|
|
39
|
+
pendingTx: null,
|
|
40
|
+
logs: [],
|
|
41
|
+
};
|
|
42
|
+
const MAX_LOGS = 100;
|
|
43
|
+
function addLog(type, message) {
|
|
44
|
+
state.logs.unshift({
|
|
45
|
+
timestamp: new Date().toISOString(),
|
|
46
|
+
type,
|
|
47
|
+
message,
|
|
48
|
+
});
|
|
49
|
+
// Keep only last N logs
|
|
50
|
+
if (state.logs.length > MAX_LOGS) {
|
|
51
|
+
state.logs = state.logs.slice(0, MAX_LOGS);
|
|
52
|
+
}
|
|
53
|
+
// Also log to stderr for debugging
|
|
54
|
+
console.error(`[YieldHunter] [${type.toUpperCase()}] ${message}`);
|
|
55
|
+
}
|
|
56
|
+
function formatSats(sats) {
|
|
57
|
+
const btc = Number(sats) / 100_000_000;
|
|
58
|
+
return `${btc.toFixed(8)} sBTC`;
|
|
59
|
+
}
|
|
60
|
+
function formatApy(bps) {
|
|
61
|
+
return `${(bps / 100).toFixed(2)}%`;
|
|
62
|
+
}
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// Core Yield Hunting Logic
|
|
65
|
+
// ============================================================================
|
|
66
|
+
async function getSbtcBalance(address) {
|
|
67
|
+
const hiro = getHiroApi(NETWORK);
|
|
68
|
+
const balances = await hiro.getAccountBalances(address);
|
|
69
|
+
const sbtcToken = ZEST_ASSETS.sBTC.token;
|
|
70
|
+
const sbtcKey = Object.keys(balances.fungible_tokens || {}).find((key) => key.startsWith(sbtcToken));
|
|
71
|
+
if (sbtcKey && balances.fungible_tokens[sbtcKey]) {
|
|
72
|
+
return BigInt(balances.fungible_tokens[sbtcKey].balance);
|
|
73
|
+
}
|
|
74
|
+
return 0n;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Fetch live APY from Zest Protocol on-chain
|
|
78
|
+
* Reads from pool-0-reserve get-reserve-state
|
|
79
|
+
*/
|
|
80
|
+
async function fetchZestApy() {
|
|
81
|
+
try {
|
|
82
|
+
const hiro = getHiroApi(NETWORK);
|
|
83
|
+
const [reserveAddr, reserveName] = MAINNET_CONTRACTS.ZEST_POOL_RESERVE.split(".");
|
|
84
|
+
const [sbtcAddr, sbtcName] = ZEST_ASSETS.sBTC.token.split(".");
|
|
85
|
+
const result = await hiro.callReadOnlyFunction(MAINNET_CONTRACTS.ZEST_POOL_RESERVE, "get-reserve-state", [contractPrincipalCV(sbtcAddr, sbtcName)], reserveAddr);
|
|
86
|
+
if (!result.okay || !result.result) {
|
|
87
|
+
addLog("warning", "Could not fetch Zest APY from chain");
|
|
88
|
+
return state.stats.currentApy || 0;
|
|
89
|
+
}
|
|
90
|
+
const decoded = cvToJSON(hexToCV(result.result));
|
|
91
|
+
const data = decoded?.value || decoded;
|
|
92
|
+
// Extract liquidity rate (APY in 1e8 scale)
|
|
93
|
+
// e.g., 5000000 = 5% APY
|
|
94
|
+
const liquidityRate = data?.["current-liquidity-rate"]?.value;
|
|
95
|
+
if (liquidityRate) {
|
|
96
|
+
// Convert from 1e8 to basis points: rate / 1e8 * 10000 = rate / 1e4
|
|
97
|
+
const apyBps = Number(BigInt(liquidityRate) / 10000n);
|
|
98
|
+
state.stats.currentApy = apyBps;
|
|
99
|
+
state.stats.lastApyFetch = new Date();
|
|
100
|
+
return apyBps;
|
|
101
|
+
}
|
|
102
|
+
return state.stats.currentApy || 0;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
addLog("warning", `Failed to fetch APY: ${error.message}`);
|
|
106
|
+
return state.stats.currentApy || 0;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Wait for transaction confirmation with timeout
|
|
111
|
+
*/
|
|
112
|
+
async function waitForTxConfirmation(txid) {
|
|
113
|
+
const hiro = getHiroApi(NETWORK);
|
|
114
|
+
const startTime = Date.now();
|
|
115
|
+
addLog("info", `Waiting for tx confirmation: ${txid}`);
|
|
116
|
+
while (Date.now() - startTime < TX_CONFIRMATION_TIMEOUT_MS) {
|
|
117
|
+
try {
|
|
118
|
+
const status = await hiro.getTransactionStatus(txid);
|
|
119
|
+
if (status.status === "success") {
|
|
120
|
+
addLog("action", `Tx confirmed in block ${status.block_height}: ${txid}`);
|
|
121
|
+
return { success: true };
|
|
122
|
+
}
|
|
123
|
+
if (status.status === "abort_by_response" || status.status === "abort_by_post_condition") {
|
|
124
|
+
const error = `Tx failed: ${status.status}`;
|
|
125
|
+
addLog("error", error);
|
|
126
|
+
return { success: false, error };
|
|
127
|
+
}
|
|
128
|
+
// Still pending, wait and retry
|
|
129
|
+
await sleep(TX_POLL_INTERVAL_MS);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
// Network error, retry
|
|
133
|
+
addLog("warning", `Tx status check failed, retrying: ${error.message}`);
|
|
134
|
+
await sleep(TX_POLL_INTERVAL_MS);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return { success: false, error: "Transaction confirmation timeout" };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Execute with retry logic
|
|
141
|
+
*/
|
|
142
|
+
async function executeWithRetry(operation, operationName) {
|
|
143
|
+
let lastError = null;
|
|
144
|
+
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
145
|
+
try {
|
|
146
|
+
return await operation();
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
lastError = error;
|
|
150
|
+
const isLastAttempt = attempt === MAX_RETRIES;
|
|
151
|
+
if (isLastAttempt) {
|
|
152
|
+
addLog("error", `${operationName} failed after ${MAX_RETRIES} attempts: ${error.message}`);
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
addLog("warning", `${operationName} attempt ${attempt} failed: ${error.message}. Retrying in ${RETRY_DELAY_MS / 1000}s...`);
|
|
156
|
+
await sleep(RETRY_DELAY_MS * attempt); // Exponential backoff
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
throw lastError;
|
|
160
|
+
}
|
|
161
|
+
function sleep(ms) {
|
|
162
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
163
|
+
}
|
|
164
|
+
async function runYieldCheck() {
|
|
165
|
+
// Skip if there's a pending transaction
|
|
166
|
+
if (state.pendingTx) {
|
|
167
|
+
addLog("info", `Skipping check - waiting for pending tx: ${state.pendingTx.txid}`);
|
|
168
|
+
// Check if pending tx is confirmed
|
|
169
|
+
const result = await waitForTxConfirmation(state.pendingTx.txid);
|
|
170
|
+
if (result.success) {
|
|
171
|
+
state.stats.totalDeposited += state.pendingTx.amount;
|
|
172
|
+
state.stats.depositsExecuted++;
|
|
173
|
+
state.pendingTx = null;
|
|
174
|
+
}
|
|
175
|
+
else if (result.error?.includes("timeout")) {
|
|
176
|
+
addLog("warning", "Pending tx timed out, will retry on next check");
|
|
177
|
+
state.pendingTx = null;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
addLog("error", `Pending tx failed: ${result.error}`);
|
|
181
|
+
state.pendingTx = null;
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
const account = await getAccount();
|
|
187
|
+
const zest = getZestProtocolService(NETWORK);
|
|
188
|
+
// Fetch live APY
|
|
189
|
+
const apy = await fetchZestApy();
|
|
190
|
+
addLog("info", `Current Zest sBTC APY: ${formatApy(apy)}`);
|
|
191
|
+
// Get current sBTC balance in wallet
|
|
192
|
+
const walletBalance = await executeWithRetry(() => getSbtcBalance(account.address), "Fetch wallet balance");
|
|
193
|
+
addLog("info", `Wallet sBTC: ${formatSats(walletBalance)}`);
|
|
194
|
+
// Get current Zest position
|
|
195
|
+
const position = await executeWithRetry(() => zest.getUserPosition(ZEST_ASSETS.sBTC.token, account.address), "Fetch Zest position");
|
|
196
|
+
const zestSupplied = position ? BigInt(position.supplied) : 0n;
|
|
197
|
+
addLog("info", `Zest supplied: ${formatSats(zestSupplied)}`);
|
|
198
|
+
// Calculate amount to deposit (keep fee buffer)
|
|
199
|
+
const effectiveThreshold = state.config.minDepositThreshold + state.config.feeBuffer;
|
|
200
|
+
const depositAmount = walletBalance > state.config.feeBuffer
|
|
201
|
+
? walletBalance - state.config.feeBuffer
|
|
202
|
+
: 0n;
|
|
203
|
+
// Check if we should deposit
|
|
204
|
+
if (walletBalance >= effectiveThreshold && depositAmount > 0n) {
|
|
205
|
+
addLog("action", `Balance (${formatSats(walletBalance)}) above threshold (${formatSats(effectiveThreshold)}). ` +
|
|
206
|
+
`Depositing ${formatSats(depositAmount)}, keeping ${formatSats(state.config.feeBuffer)} as fee buffer...`);
|
|
207
|
+
try {
|
|
208
|
+
const result = await executeWithRetry(() => zest.supply(account, state.config.asset, depositAmount), "Supply to Zest");
|
|
209
|
+
addLog("action", `Deposit tx submitted: ${result.txid}`);
|
|
210
|
+
// Track pending transaction
|
|
211
|
+
state.pendingTx = {
|
|
212
|
+
txid: result.txid,
|
|
213
|
+
type: "deposit",
|
|
214
|
+
amount: depositAmount,
|
|
215
|
+
startedAt: new Date(),
|
|
216
|
+
};
|
|
217
|
+
// Wait for confirmation (non-blocking for next check)
|
|
218
|
+
const confirmation = await waitForTxConfirmation(result.txid);
|
|
219
|
+
if (confirmation.success) {
|
|
220
|
+
state.stats.totalDeposited += depositAmount;
|
|
221
|
+
state.stats.depositsExecuted++;
|
|
222
|
+
state.pendingTx = null;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
addLog("error", `Deposit confirmation failed: ${confirmation.error}`);
|
|
226
|
+
state.stats.lastError = confirmation.error || "Unknown error";
|
|
227
|
+
state.pendingTx = null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
addLog("error", `Deposit failed: ${error.message}`);
|
|
232
|
+
state.stats.lastError = error.message;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else if (walletBalance > 0n && walletBalance < effectiveThreshold) {
|
|
236
|
+
addLog("info", `Balance (${formatSats(walletBalance)}) below threshold (${formatSats(effectiveThreshold)}), ` +
|
|
237
|
+
`keeping for fees. Need ${formatSats(effectiveThreshold - walletBalance)} more to deposit.`);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
addLog("info", `No sBTC in wallet, nothing to deposit`);
|
|
241
|
+
}
|
|
242
|
+
state.stats.lastCheck = new Date();
|
|
243
|
+
state.stats.checksRun++;
|
|
244
|
+
state.stats.lastError = null;
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
addLog("error", `Check failed: ${error.message}`);
|
|
248
|
+
state.stats.lastError = error.message;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// ============================================================================
|
|
252
|
+
// MCP Tools
|
|
253
|
+
// ============================================================================
|
|
254
|
+
export function registerYieldHunterTools(server) {
|
|
255
|
+
// Start yield hunting
|
|
256
|
+
server.registerTool("yield_hunter_start", {
|
|
257
|
+
description: `Start autonomous yield hunting.
|
|
258
|
+
|
|
259
|
+
This will:
|
|
260
|
+
1. Monitor your wallet for sBTC
|
|
261
|
+
2. Automatically deposit sBTC to Zest Protocol when balance exceeds threshold
|
|
262
|
+
3. Keep a fee buffer for x402 payments and transaction costs
|
|
263
|
+
4. Wait for transaction confirmations before proceeding
|
|
264
|
+
5. Retry failed transactions with exponential backoff
|
|
265
|
+
6. Run continuously until stopped
|
|
266
|
+
|
|
267
|
+
Requires an unlocked wallet (use wallet_unlock first).
|
|
268
|
+
Only works on mainnet (Zest Protocol is mainnet-only).
|
|
269
|
+
|
|
270
|
+
Default settings:
|
|
271
|
+
- Deposit threshold: 10,000 sats (0.0001 sBTC)
|
|
272
|
+
- Fee buffer: 50,000 sats (0.0005 sBTC) - kept for x402 fees + tx costs
|
|
273
|
+
- Check interval: 10 minutes`,
|
|
274
|
+
inputSchema: {
|
|
275
|
+
threshold: z
|
|
276
|
+
.string()
|
|
277
|
+
.optional()
|
|
278
|
+
.describe("Minimum sBTC balance (in sats) before depositing. Default: 10000"),
|
|
279
|
+
feeBuffer: z
|
|
280
|
+
.string()
|
|
281
|
+
.optional()
|
|
282
|
+
.describe("sBTC (in sats) to keep for fees, never deposited. Default: 50000"),
|
|
283
|
+
interval: z
|
|
284
|
+
.number()
|
|
285
|
+
.optional()
|
|
286
|
+
.describe("Check interval in seconds. Default: 600 (10 minutes)"),
|
|
287
|
+
},
|
|
288
|
+
}, async ({ threshold, feeBuffer, interval }) => {
|
|
289
|
+
try {
|
|
290
|
+
if (NETWORK !== "mainnet") {
|
|
291
|
+
return createJsonResponse({
|
|
292
|
+
success: false,
|
|
293
|
+
error: "Yield hunting only available on mainnet (Zest Protocol)",
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
if (state.running) {
|
|
297
|
+
return createJsonResponse({
|
|
298
|
+
success: false,
|
|
299
|
+
error: "Yield hunter is already running",
|
|
300
|
+
status: getStatusObject(),
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
// Verify wallet is unlocked
|
|
304
|
+
try {
|
|
305
|
+
await getAccount();
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
return createJsonResponse({
|
|
309
|
+
success: false,
|
|
310
|
+
error: "Wallet not unlocked. Use wallet_unlock first to enable transactions.",
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
// Apply config
|
|
314
|
+
if (threshold) {
|
|
315
|
+
state.config.minDepositThreshold = BigInt(threshold);
|
|
316
|
+
}
|
|
317
|
+
if (feeBuffer) {
|
|
318
|
+
state.config.feeBuffer = BigInt(feeBuffer);
|
|
319
|
+
}
|
|
320
|
+
if (interval) {
|
|
321
|
+
state.config.checkIntervalMs = interval * 1000;
|
|
322
|
+
}
|
|
323
|
+
// Start the yield hunting loop
|
|
324
|
+
state.running = true;
|
|
325
|
+
addLog("info", "Yield hunter started");
|
|
326
|
+
// Fetch initial APY
|
|
327
|
+
const apy = await fetchZestApy();
|
|
328
|
+
addLog("info", `Current Zest sBTC APY: ${formatApy(apy)}`);
|
|
329
|
+
// Run first check immediately
|
|
330
|
+
await runYieldCheck();
|
|
331
|
+
// Schedule periodic checks
|
|
332
|
+
state.intervalId = setInterval(async () => {
|
|
333
|
+
if (state.running) {
|
|
334
|
+
await runYieldCheck();
|
|
335
|
+
}
|
|
336
|
+
}, state.config.checkIntervalMs);
|
|
337
|
+
return createJsonResponse({
|
|
338
|
+
success: true,
|
|
339
|
+
message: "Yield hunter started",
|
|
340
|
+
config: {
|
|
341
|
+
minDepositThreshold: state.config.minDepositThreshold.toString(),
|
|
342
|
+
minDepositThresholdFormatted: formatSats(state.config.minDepositThreshold),
|
|
343
|
+
feeBuffer: state.config.feeBuffer.toString(),
|
|
344
|
+
feeBufferFormatted: formatSats(state.config.feeBuffer),
|
|
345
|
+
effectiveThreshold: (state.config.minDepositThreshold + state.config.feeBuffer).toString(),
|
|
346
|
+
effectiveThresholdFormatted: formatSats(state.config.minDepositThreshold + state.config.feeBuffer),
|
|
347
|
+
checkIntervalMs: state.config.checkIntervalMs,
|
|
348
|
+
asset: state.config.asset,
|
|
349
|
+
},
|
|
350
|
+
currentApy: apy ? formatApy(apy) : "unknown",
|
|
351
|
+
nextCheckIn: `${state.config.checkIntervalMs / 1000} seconds`,
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
return createErrorResponse(error);
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
// Stop yield hunting
|
|
359
|
+
server.registerTool("yield_hunter_stop", {
|
|
360
|
+
description: `Stop autonomous yield hunting.
|
|
361
|
+
|
|
362
|
+
Stops the background process that monitors and deposits sBTC.
|
|
363
|
+
Your existing Zest positions remain untouched.`,
|
|
364
|
+
inputSchema: {},
|
|
365
|
+
}, async () => {
|
|
366
|
+
try {
|
|
367
|
+
if (!state.running) {
|
|
368
|
+
return createJsonResponse({
|
|
369
|
+
success: false,
|
|
370
|
+
error: "Yield hunter is not running",
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
// Stop the interval
|
|
374
|
+
if (state.intervalId) {
|
|
375
|
+
clearInterval(state.intervalId);
|
|
376
|
+
state.intervalId = null;
|
|
377
|
+
}
|
|
378
|
+
state.running = false;
|
|
379
|
+
addLog("info", "Yield hunter stopped");
|
|
380
|
+
return createJsonResponse({
|
|
381
|
+
success: true,
|
|
382
|
+
message: "Yield hunter stopped",
|
|
383
|
+
stats: {
|
|
384
|
+
checksRun: state.stats.checksRun,
|
|
385
|
+
depositsExecuted: state.stats.depositsExecuted,
|
|
386
|
+
totalDeposited: state.stats.totalDeposited.toString(),
|
|
387
|
+
},
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
return createErrorResponse(error);
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
// Get yield hunter status
|
|
395
|
+
server.registerTool("yield_hunter_status", {
|
|
396
|
+
description: `Get current yield hunter status.
|
|
397
|
+
|
|
398
|
+
Shows:
|
|
399
|
+
- Whether yield hunting is active
|
|
400
|
+
- Current configuration
|
|
401
|
+
- Statistics (checks run, deposits made)
|
|
402
|
+
- Recent activity logs
|
|
403
|
+
- Current Zest position`,
|
|
404
|
+
inputSchema: {},
|
|
405
|
+
}, async () => {
|
|
406
|
+
try {
|
|
407
|
+
const status = await getFullStatus();
|
|
408
|
+
return createJsonResponse(status);
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
return createErrorResponse(error);
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
// Configure yield hunter
|
|
415
|
+
server.registerTool("yield_hunter_configure", {
|
|
416
|
+
description: `Configure yield hunter settings.
|
|
417
|
+
|
|
418
|
+
Adjust the deposit threshold, fee buffer, or check interval.
|
|
419
|
+
Changes take effect on the next check cycle.`,
|
|
420
|
+
inputSchema: {
|
|
421
|
+
threshold: z
|
|
422
|
+
.string()
|
|
423
|
+
.optional()
|
|
424
|
+
.describe("Minimum sBTC balance (in sats) before depositing"),
|
|
425
|
+
feeBuffer: z
|
|
426
|
+
.string()
|
|
427
|
+
.optional()
|
|
428
|
+
.describe("sBTC (in sats) to keep for fees, never deposited"),
|
|
429
|
+
interval: z
|
|
430
|
+
.number()
|
|
431
|
+
.optional()
|
|
432
|
+
.describe("Check interval in seconds"),
|
|
433
|
+
},
|
|
434
|
+
}, async ({ threshold, feeBuffer, interval }) => {
|
|
435
|
+
try {
|
|
436
|
+
const changes = [];
|
|
437
|
+
if (threshold) {
|
|
438
|
+
state.config.minDepositThreshold = BigInt(threshold);
|
|
439
|
+
changes.push(`Deposit threshold set to ${formatSats(state.config.minDepositThreshold)}`);
|
|
440
|
+
}
|
|
441
|
+
if (feeBuffer) {
|
|
442
|
+
state.config.feeBuffer = BigInt(feeBuffer);
|
|
443
|
+
changes.push(`Fee buffer set to ${formatSats(state.config.feeBuffer)}`);
|
|
444
|
+
}
|
|
445
|
+
if (interval) {
|
|
446
|
+
state.config.checkIntervalMs = interval * 1000;
|
|
447
|
+
changes.push(`Check interval set to ${interval} seconds`);
|
|
448
|
+
// If running, restart the interval with new timing
|
|
449
|
+
if (state.running && state.intervalId) {
|
|
450
|
+
clearInterval(state.intervalId);
|
|
451
|
+
state.intervalId = setInterval(async () => {
|
|
452
|
+
if (state.running) {
|
|
453
|
+
await runYieldCheck();
|
|
454
|
+
}
|
|
455
|
+
}, state.config.checkIntervalMs);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (changes.length === 0) {
|
|
459
|
+
return createJsonResponse({
|
|
460
|
+
success: false,
|
|
461
|
+
error: "No configuration changes specified",
|
|
462
|
+
currentConfig: getConfigObject(),
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
addLog("info", `Config updated: ${changes.join(", ")}`);
|
|
466
|
+
return createJsonResponse({
|
|
467
|
+
success: true,
|
|
468
|
+
changes,
|
|
469
|
+
config: getConfigObject(),
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
catch (error) {
|
|
473
|
+
return createErrorResponse(error);
|
|
474
|
+
}
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
function getConfigObject() {
|
|
478
|
+
return {
|
|
479
|
+
minDepositThreshold: state.config.minDepositThreshold.toString(),
|
|
480
|
+
minDepositThresholdFormatted: formatSats(state.config.minDepositThreshold),
|
|
481
|
+
feeBuffer: state.config.feeBuffer.toString(),
|
|
482
|
+
feeBufferFormatted: formatSats(state.config.feeBuffer),
|
|
483
|
+
effectiveThreshold: (state.config.minDepositThreshold + state.config.feeBuffer).toString(),
|
|
484
|
+
effectiveThresholdFormatted: formatSats(state.config.minDepositThreshold + state.config.feeBuffer),
|
|
485
|
+
checkIntervalMs: state.config.checkIntervalMs,
|
|
486
|
+
checkIntervalFormatted: `${state.config.checkIntervalMs / 1000} seconds`,
|
|
487
|
+
asset: state.config.asset,
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
// ============================================================================
|
|
491
|
+
// Helpers
|
|
492
|
+
// ============================================================================
|
|
493
|
+
function getStatusObject() {
|
|
494
|
+
return {
|
|
495
|
+
running: state.running,
|
|
496
|
+
config: getConfigObject(),
|
|
497
|
+
stats: {
|
|
498
|
+
lastCheck: state.stats.lastCheck?.toISOString() || null,
|
|
499
|
+
totalDeposited: state.stats.totalDeposited.toString(),
|
|
500
|
+
totalDepositedFormatted: formatSats(state.stats.totalDeposited),
|
|
501
|
+
checksRun: state.stats.checksRun,
|
|
502
|
+
depositsExecuted: state.stats.depositsExecuted,
|
|
503
|
+
lastError: state.stats.lastError,
|
|
504
|
+
currentApy: state.stats.currentApy ? formatApy(state.stats.currentApy) : null,
|
|
505
|
+
currentApyBps: state.stats.currentApy,
|
|
506
|
+
lastApyFetch: state.stats.lastApyFetch?.toISOString() || null,
|
|
507
|
+
},
|
|
508
|
+
pendingTx: state.pendingTx ? {
|
|
509
|
+
txid: state.pendingTx.txid,
|
|
510
|
+
type: state.pendingTx.type,
|
|
511
|
+
amount: state.pendingTx.amount.toString(),
|
|
512
|
+
amountFormatted: formatSats(state.pendingTx.amount),
|
|
513
|
+
startedAt: state.pendingTx.startedAt.toISOString(),
|
|
514
|
+
} : null,
|
|
515
|
+
recentLogs: state.logs.slice(0, 15),
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
async function getFullStatus() {
|
|
519
|
+
const status = getStatusObject();
|
|
520
|
+
// Add current positions if on mainnet
|
|
521
|
+
if (NETWORK === "mainnet") {
|
|
522
|
+
try {
|
|
523
|
+
const address = await getWalletAddress();
|
|
524
|
+
const zest = getZestProtocolService(NETWORK);
|
|
525
|
+
// Fetch all data in parallel
|
|
526
|
+
const [position, walletBalance, apy] = await Promise.all([
|
|
527
|
+
zest.getUserPosition(ZEST_ASSETS.sBTC.token, address),
|
|
528
|
+
getSbtcBalance(address),
|
|
529
|
+
fetchZestApy(),
|
|
530
|
+
]);
|
|
531
|
+
const zestSupplied = BigInt(position?.supplied || "0");
|
|
532
|
+
const availableToDeposit = walletBalance > state.config.feeBuffer
|
|
533
|
+
? walletBalance - state.config.feeBuffer
|
|
534
|
+
: 0n;
|
|
535
|
+
return {
|
|
536
|
+
...status,
|
|
537
|
+
network: NETWORK,
|
|
538
|
+
wallet: address,
|
|
539
|
+
currentPosition: {
|
|
540
|
+
walletSbtc: walletBalance.toString(),
|
|
541
|
+
walletSbtcFormatted: formatSats(walletBalance),
|
|
542
|
+
availableToDeposit: availableToDeposit.toString(),
|
|
543
|
+
availableToDepositFormatted: formatSats(availableToDeposit),
|
|
544
|
+
reservedForFees: state.config.feeBuffer.toString(),
|
|
545
|
+
reservedForFeesFormatted: formatSats(state.config.feeBuffer),
|
|
546
|
+
zestSupplied: position?.supplied || "0",
|
|
547
|
+
zestSuppliedFormatted: formatSats(zestSupplied),
|
|
548
|
+
zestBorrowed: position?.borrowed || "0",
|
|
549
|
+
},
|
|
550
|
+
currentApy: apy ? formatApy(apy) : "unknown",
|
|
551
|
+
currentApyBps: apy,
|
|
552
|
+
estimatedDailyYield: zestSupplied > 0n && apy
|
|
553
|
+
? formatSats((zestSupplied * BigInt(apy)) / (365n * 10000n))
|
|
554
|
+
: "0",
|
|
555
|
+
estimatedAnnualYield: zestSupplied > 0n && apy
|
|
556
|
+
? formatSats((zestSupplied * BigInt(apy)) / 10000n)
|
|
557
|
+
: "0",
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
catch (error) {
|
|
561
|
+
return {
|
|
562
|
+
...status,
|
|
563
|
+
network: NETWORK,
|
|
564
|
+
walletError: error.message,
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
return {
|
|
569
|
+
...status,
|
|
570
|
+
network: NETWORK,
|
|
571
|
+
note: "Zest Protocol only available on mainnet",
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
//# sourceMappingURL=yield-hunter.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yield-hunter.tools.js","sourceRoot":"","sources":["../../src/tools/yield-hunter.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
export declare function main(args: string[]): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/yield-hunter/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAkTH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDxD"}
|
|
@@ -0,0 +1,293 @@
|
|
|
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 fs from "fs/promises";
|
|
14
|
+
import path from "path";
|
|
15
|
+
import os from "os";
|
|
16
|
+
const DEFAULT_CONFIG = {
|
|
17
|
+
minDepositThreshold: 10000n, // 0.0001 sBTC (~$10 at $100k BTC)
|
|
18
|
+
checkIntervalMs: 10 * 60 * 1000, // 10 minutes
|
|
19
|
+
execute: false,
|
|
20
|
+
asset: "sBTC",
|
|
21
|
+
};
|
|
22
|
+
const STATE_FILE = path.join(os.homedir(), ".aibtc", "yield-hunter-state.json");
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// State Management
|
|
25
|
+
// ============================================================================
|
|
26
|
+
async function loadState() {
|
|
27
|
+
try {
|
|
28
|
+
const content = await fs.readFile(STATE_FILE, "utf8");
|
|
29
|
+
return JSON.parse(content);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return {
|
|
33
|
+
lastCheck: null,
|
|
34
|
+
totalDeposited: "0",
|
|
35
|
+
totalEarned: "0",
|
|
36
|
+
transactions: [],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async function saveState(state) {
|
|
41
|
+
await fs.writeFile(STATE_FILE, JSON.stringify(state, null, 2));
|
|
42
|
+
}
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// Helpers
|
|
45
|
+
// ============================================================================
|
|
46
|
+
function formatSats(sats) {
|
|
47
|
+
const btc = Number(sats) / 100_000_000;
|
|
48
|
+
return `${btc.toFixed(8)} sBTC (${sats.toString()} sats)`;
|
|
49
|
+
}
|
|
50
|
+
function log(message) {
|
|
51
|
+
const timestamp = new Date().toISOString();
|
|
52
|
+
console.log(`[${timestamp}] ${message}`);
|
|
53
|
+
}
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// Core Logic
|
|
56
|
+
// ============================================================================
|
|
57
|
+
async function getSbtcBalance(address) {
|
|
58
|
+
const hiro = getHiroApi(NETWORK);
|
|
59
|
+
const balances = await hiro.getAccountBalances(address);
|
|
60
|
+
// Find sBTC in fungible tokens
|
|
61
|
+
const sbtcToken = ZEST_ASSETS.sBTC.token;
|
|
62
|
+
const sbtcKey = Object.keys(balances.fungible_tokens || {}).find((key) => key.startsWith(sbtcToken));
|
|
63
|
+
if (sbtcKey && balances.fungible_tokens[sbtcKey]) {
|
|
64
|
+
return BigInt(balances.fungible_tokens[sbtcKey].balance);
|
|
65
|
+
}
|
|
66
|
+
return 0n;
|
|
67
|
+
}
|
|
68
|
+
async function runCheck(account, config, state) {
|
|
69
|
+
const zest = getZestProtocolService(NETWORK);
|
|
70
|
+
// Get current sBTC balance in wallet
|
|
71
|
+
const walletBalance = await getSbtcBalance(account.address);
|
|
72
|
+
log(`Wallet sBTC balance: ${formatSats(walletBalance)}`);
|
|
73
|
+
// Get current Zest position
|
|
74
|
+
const position = await zest.getUserPosition(ZEST_ASSETS.sBTC.token, account.address);
|
|
75
|
+
const zestSupplied = position ? BigInt(position.supplied) : 0n;
|
|
76
|
+
log(`Zest supplied: ${formatSats(zestSupplied)}`);
|
|
77
|
+
// Check if we should deposit
|
|
78
|
+
if (walletBalance >= config.minDepositThreshold) {
|
|
79
|
+
log(`Balance above threshold (${formatSats(config.minDepositThreshold)}), depositing...`);
|
|
80
|
+
if (config.execute) {
|
|
81
|
+
try {
|
|
82
|
+
const result = await zest.supply(account, config.asset, walletBalance);
|
|
83
|
+
log(`Deposited ${formatSats(walletBalance)} to Zest. TxID: ${result.txid}`);
|
|
84
|
+
// Update state
|
|
85
|
+
state.totalDeposited = (BigInt(state.totalDeposited) + walletBalance).toString();
|
|
86
|
+
state.transactions.push({
|
|
87
|
+
type: "deposit",
|
|
88
|
+
amount: walletBalance.toString(),
|
|
89
|
+
txid: result.txid,
|
|
90
|
+
timestamp: new Date().toISOString(),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
log(`Failed to deposit: ${error.message}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
log(`[DRY RUN] Would deposit ${formatSats(walletBalance)} to Zest`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
log(`Balance below threshold, no action needed`);
|
|
103
|
+
}
|
|
104
|
+
// Update state
|
|
105
|
+
state.lastCheck = new Date().toISOString();
|
|
106
|
+
await saveState(state);
|
|
107
|
+
}
|
|
108
|
+
// ============================================================================
|
|
109
|
+
// CLI Commands
|
|
110
|
+
// ============================================================================
|
|
111
|
+
async function startDaemon(config) {
|
|
112
|
+
log("Starting Yield Hunter daemon...");
|
|
113
|
+
log(`Network: ${NETWORK}`);
|
|
114
|
+
log(`Min deposit threshold: ${formatSats(config.minDepositThreshold)}`);
|
|
115
|
+
log(`Check interval: ${config.checkIntervalMs / 1000}s`);
|
|
116
|
+
log(`Execute mode: ${config.execute ? "LIVE" : "DRY RUN"}`);
|
|
117
|
+
if (NETWORK !== "mainnet") {
|
|
118
|
+
log("WARNING: Zest Protocol is only available on mainnet");
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
// Get wallet
|
|
122
|
+
const walletManager = getWalletManager();
|
|
123
|
+
const wallets = await walletManager.listWallets();
|
|
124
|
+
if (wallets.length === 0) {
|
|
125
|
+
log("No wallets found. Create one with: npx @aibtc/mcp-server");
|
|
126
|
+
log("Then use wallet_create or wallet_import via Claude");
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
const activeWalletId = await walletManager.getActiveWalletId();
|
|
130
|
+
if (!activeWalletId) {
|
|
131
|
+
log("No active wallet. Set one with wallet_switch");
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
const activeWallet = wallets.find((w) => w.id === activeWalletId);
|
|
135
|
+
log(`Using wallet: ${activeWallet?.name} (${activeWallet?.address})`);
|
|
136
|
+
// Prompt for password
|
|
137
|
+
const password = await promptPassword();
|
|
138
|
+
let account;
|
|
139
|
+
try {
|
|
140
|
+
account = await walletManager.unlock(activeWalletId, password);
|
|
141
|
+
log(`Wallet unlocked: ${account.address}`);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
log(`Failed to unlock wallet: ${error.message}`);
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
// Disable auto-lock for daemon mode
|
|
148
|
+
await walletManager.setAutoLockTimeout(0);
|
|
149
|
+
// Load state
|
|
150
|
+
const state = await loadState();
|
|
151
|
+
// Run initial check
|
|
152
|
+
await runCheck(account, config, state);
|
|
153
|
+
// Schedule periodic checks
|
|
154
|
+
log(`\nDaemon running. Press Ctrl+C to stop.\n`);
|
|
155
|
+
const intervalId = setInterval(async () => {
|
|
156
|
+
try {
|
|
157
|
+
await runCheck(account, config, state);
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
log(`Error during check: ${error.message}`);
|
|
161
|
+
}
|
|
162
|
+
}, config.checkIntervalMs);
|
|
163
|
+
// Handle shutdown
|
|
164
|
+
process.on("SIGINT", () => {
|
|
165
|
+
log("\nShutting down...");
|
|
166
|
+
clearInterval(intervalId);
|
|
167
|
+
walletManager.lock();
|
|
168
|
+
process.exit(0);
|
|
169
|
+
});
|
|
170
|
+
process.on("SIGTERM", () => {
|
|
171
|
+
log("\nShutting down...");
|
|
172
|
+
clearInterval(intervalId);
|
|
173
|
+
walletManager.lock();
|
|
174
|
+
process.exit(0);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
async function showStatus() {
|
|
178
|
+
log("Yield Hunter Status");
|
|
179
|
+
log("=".repeat(50));
|
|
180
|
+
const state = await loadState();
|
|
181
|
+
const walletManager = getWalletManager();
|
|
182
|
+
const wallets = await walletManager.listWallets();
|
|
183
|
+
const activeWalletId = await walletManager.getActiveWalletId();
|
|
184
|
+
const activeWallet = wallets.find((w) => w.id === activeWalletId);
|
|
185
|
+
log(`Network: ${NETWORK}`);
|
|
186
|
+
log(`Wallet: ${activeWallet?.name || "None"} (${activeWallet?.address || "N/A"})`);
|
|
187
|
+
log(`Last check: ${state.lastCheck || "Never"}`);
|
|
188
|
+
log(`Total deposited: ${formatSats(BigInt(state.totalDeposited))}`);
|
|
189
|
+
log(`Total earned: ${formatSats(BigInt(state.totalEarned))}`);
|
|
190
|
+
log(`Transaction count: ${state.transactions.length}`);
|
|
191
|
+
if (activeWallet && NETWORK === "mainnet") {
|
|
192
|
+
const zest = getZestProtocolService(NETWORK);
|
|
193
|
+
const position = await zest.getUserPosition(ZEST_ASSETS.sBTC.token, activeWallet.address);
|
|
194
|
+
if (position) {
|
|
195
|
+
log(`\nCurrent Zest Position:`);
|
|
196
|
+
log(` Supplied: ${formatSats(BigInt(position.supplied))}`);
|
|
197
|
+
log(` Borrowed: ${formatSats(BigInt(position.borrowed))}`);
|
|
198
|
+
}
|
|
199
|
+
const walletBalance = await getSbtcBalance(activeWallet.address);
|
|
200
|
+
log(`\nWallet sBTC: ${formatSats(walletBalance)}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async function promptPassword() {
|
|
204
|
+
return new Promise((resolve) => {
|
|
205
|
+
process.stdout.write("Enter wallet password: ");
|
|
206
|
+
// Disable echo for password input
|
|
207
|
+
if (process.stdin.isTTY) {
|
|
208
|
+
process.stdin.setRawMode(true);
|
|
209
|
+
}
|
|
210
|
+
let password = "";
|
|
211
|
+
const onData = (chunk) => {
|
|
212
|
+
const char = chunk.toString();
|
|
213
|
+
if (char === "\n" || char === "\r" || char === "\u0003") {
|
|
214
|
+
process.stdin.removeListener("data", onData);
|
|
215
|
+
if (process.stdin.isTTY) {
|
|
216
|
+
process.stdin.setRawMode(false);
|
|
217
|
+
}
|
|
218
|
+
console.log(); // New line after password
|
|
219
|
+
if (char === "\u0003") {
|
|
220
|
+
process.exit(0);
|
|
221
|
+
}
|
|
222
|
+
resolve(password);
|
|
223
|
+
}
|
|
224
|
+
else if (char === "\u007F" || char === "\b") {
|
|
225
|
+
// Backspace
|
|
226
|
+
password = password.slice(0, -1);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
password += char;
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
process.stdin.resume();
|
|
233
|
+
process.stdin.on("data", onData);
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
// ============================================================================
|
|
237
|
+
// Main Entry Point
|
|
238
|
+
// ============================================================================
|
|
239
|
+
export async function main(args) {
|
|
240
|
+
const command = args[0] || "help";
|
|
241
|
+
const config = { ...DEFAULT_CONFIG };
|
|
242
|
+
// Parse flags
|
|
243
|
+
for (const arg of args) {
|
|
244
|
+
if (arg === "--execute" || arg === "-e") {
|
|
245
|
+
config.execute = true;
|
|
246
|
+
}
|
|
247
|
+
else if (arg.startsWith("--threshold=")) {
|
|
248
|
+
config.minDepositThreshold = BigInt(arg.split("=")[1]);
|
|
249
|
+
}
|
|
250
|
+
else if (arg.startsWith("--interval=")) {
|
|
251
|
+
config.checkIntervalMs = parseInt(arg.split("=")[1]) * 1000;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
switch (command) {
|
|
255
|
+
case "start":
|
|
256
|
+
await startDaemon(config);
|
|
257
|
+
break;
|
|
258
|
+
case "status":
|
|
259
|
+
await showStatus();
|
|
260
|
+
break;
|
|
261
|
+
case "help":
|
|
262
|
+
default:
|
|
263
|
+
console.log(`
|
|
264
|
+
Yield Hunter - Autonomous sBTC yield farming
|
|
265
|
+
|
|
266
|
+
Usage:
|
|
267
|
+
npx @aibtc/mcp-server yield-hunter <command> [options]
|
|
268
|
+
|
|
269
|
+
Commands:
|
|
270
|
+
start Start the yield hunting daemon
|
|
271
|
+
status Show current status and positions
|
|
272
|
+
help Show this help message
|
|
273
|
+
|
|
274
|
+
Options:
|
|
275
|
+
--execute, -e Actually execute transactions (default: dry run)
|
|
276
|
+
--threshold=<sats> Minimum sBTC (in sats) before depositing (default: 10000)
|
|
277
|
+
--interval=<seconds> Check interval in seconds (default: 600)
|
|
278
|
+
|
|
279
|
+
Examples:
|
|
280
|
+
npx @aibtc/mcp-server yield-hunter start
|
|
281
|
+
npx @aibtc/mcp-server yield-hunter start --execute
|
|
282
|
+
npx @aibtc/mcp-server yield-hunter start --execute --threshold=100000
|
|
283
|
+
npx @aibtc/mcp-server yield-hunter status
|
|
284
|
+
|
|
285
|
+
Note: Requires a wallet created via the MCP server. Run:
|
|
286
|
+
npx @aibtc/mcp-server --install
|
|
287
|
+
|
|
288
|
+
Then use Claude to create a wallet with wallet_create or wallet_import.
|
|
289
|
+
`);
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
//# 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