@aibtc/mcp-server 1.3.1 → 1.4.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/config/contracts.d.ts +16 -16
- package/dist/config/contracts.js +5 -5
- package/dist/config/contracts.js.map +1 -1
- package/dist/config/pillar.d.ts +3 -0
- package/dist/config/pillar.d.ts.map +1 -0
- package/dist/config/pillar.js +4 -0
- package/dist/config/pillar.js.map +1 -0
- package/dist/services/pillar-api.service.d.ts +11 -0
- package/dist/services/pillar-api.service.d.ts.map +1 -0
- package/dist/services/pillar-api.service.js +53 -0
- package/dist/services/pillar-api.service.js.map +1 -0
- package/dist/services/scaffold.service.js +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/pillar.tools.d.ts +3 -0
- package/dist/tools/pillar.tools.d.ts.map +1 -0
- package/dist/tools/pillar.tools.js +905 -0
- package/dist/tools/pillar.tools.js.map +1 -0
- package/package.json +1 -1
|
@@ -3,10 +3,10 @@ import { Network } from "./networks.js";
|
|
|
3
3
|
* Known contract addresses for mainnet
|
|
4
4
|
*/
|
|
5
5
|
export declare const MAINNET_CONTRACTS: {
|
|
6
|
-
readonly SBTC_TOKEN: "
|
|
7
|
-
readonly SBTC_DEPOSIT: "
|
|
8
|
-
readonly SBTC_REGISTRY: "
|
|
9
|
-
readonly USDCX: "
|
|
6
|
+
readonly SBTC_TOKEN: "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token";
|
|
7
|
+
readonly SBTC_DEPOSIT: "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-deposit";
|
|
8
|
+
readonly SBTC_REGISTRY: "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-registry";
|
|
9
|
+
readonly USDCX: "SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx";
|
|
10
10
|
readonly BNS: "SP000000000000000000002Q6VF78.bns";
|
|
11
11
|
readonly POX_4: "SP000000000000000000002Q6VF78.pox-4";
|
|
12
12
|
readonly ALEX_AMM_POOL: "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1";
|
|
@@ -41,7 +41,7 @@ export declare const TESTNET_CONTRACTS: {
|
|
|
41
41
|
readonly SBTC_TOKEN: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sbtc-token";
|
|
42
42
|
readonly SBTC_DEPOSIT: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sbtc-deposit";
|
|
43
43
|
readonly SBTC_REGISTRY: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sbtc-registry";
|
|
44
|
-
readonly USDCX: "
|
|
44
|
+
readonly USDCX: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.usdcx";
|
|
45
45
|
readonly BNS: "ST000000000000000000002AMW42H.bns";
|
|
46
46
|
readonly POX_4: "ST000000000000000000002AMW42H.pox-4";
|
|
47
47
|
};
|
|
@@ -49,10 +49,10 @@ export declare const TESTNET_CONTRACTS: {
|
|
|
49
49
|
* Get contract addresses for the specified network
|
|
50
50
|
*/
|
|
51
51
|
export declare function getContracts(network: Network): {
|
|
52
|
-
readonly SBTC_TOKEN: "
|
|
53
|
-
readonly SBTC_DEPOSIT: "
|
|
54
|
-
readonly SBTC_REGISTRY: "
|
|
55
|
-
readonly USDCX: "
|
|
52
|
+
readonly SBTC_TOKEN: "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token";
|
|
53
|
+
readonly SBTC_DEPOSIT: "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-deposit";
|
|
54
|
+
readonly SBTC_REGISTRY: "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-registry";
|
|
55
|
+
readonly USDCX: "SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx";
|
|
56
56
|
readonly BNS: "SP000000000000000000002Q6VF78.bns";
|
|
57
57
|
readonly POX_4: "SP000000000000000000002Q6VF78.pox-4";
|
|
58
58
|
readonly ALEX_AMM_POOL: "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.amm-swap-pool-v1-1";
|
|
@@ -65,7 +65,7 @@ export declare function getContracts(network: Network): {
|
|
|
65
65
|
readonly SBTC_TOKEN: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sbtc-token";
|
|
66
66
|
readonly SBTC_DEPOSIT: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sbtc-deposit";
|
|
67
67
|
readonly SBTC_REGISTRY: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sbtc-registry";
|
|
68
|
-
readonly USDCX: "
|
|
68
|
+
readonly USDCX: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.usdcx";
|
|
69
69
|
readonly BNS: "ST000000000000000000002AMW42H.bns";
|
|
70
70
|
readonly POX_4: "ST000000000000000000002AMW42H.pox-4";
|
|
71
71
|
};
|
|
@@ -83,15 +83,15 @@ export declare function parseContractId(contractId: string): {
|
|
|
83
83
|
export declare const WELL_KNOWN_TOKENS: {
|
|
84
84
|
readonly mainnet: {
|
|
85
85
|
readonly STX: "native";
|
|
86
|
-
readonly sBTC: "
|
|
87
|
-
readonly USDCx: "
|
|
86
|
+
readonly sBTC: "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token";
|
|
87
|
+
readonly USDCx: "SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx";
|
|
88
88
|
readonly ALEX: "SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-alex";
|
|
89
89
|
readonly wSTX: "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wstx-v2";
|
|
90
90
|
};
|
|
91
91
|
readonly testnet: {
|
|
92
92
|
readonly STX: "native";
|
|
93
93
|
readonly sBTC: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sbtc-token";
|
|
94
|
-
readonly USDCx: "
|
|
94
|
+
readonly USDCx: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.usdcx";
|
|
95
95
|
};
|
|
96
96
|
};
|
|
97
97
|
/**
|
|
@@ -111,14 +111,14 @@ export declare function getZestContracts(network: Network): {
|
|
|
111
111
|
} | null;
|
|
112
112
|
export declare function getWellKnownTokens(network: Network): {
|
|
113
113
|
readonly STX: "native";
|
|
114
|
-
readonly sBTC: "
|
|
115
|
-
readonly USDCx: "
|
|
114
|
+
readonly sBTC: "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token";
|
|
115
|
+
readonly USDCx: "SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx";
|
|
116
116
|
readonly ALEX: "SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-alex";
|
|
117
117
|
readonly wSTX: "SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wstx-v2";
|
|
118
118
|
} | {
|
|
119
119
|
readonly STX: "native";
|
|
120
120
|
readonly sBTC: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sbtc-token";
|
|
121
|
-
readonly USDCx: "
|
|
121
|
+
readonly USDCx: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.usdcx";
|
|
122
122
|
};
|
|
123
123
|
/**
|
|
124
124
|
* Bitflow DEX contract addresses
|
package/dist/config/contracts.js
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const MAINNET_CONTRACTS = {
|
|
5
5
|
// sBTC
|
|
6
|
-
SBTC_TOKEN: "
|
|
7
|
-
SBTC_DEPOSIT: "
|
|
8
|
-
SBTC_REGISTRY: "
|
|
6
|
+
SBTC_TOKEN: "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token",
|
|
7
|
+
SBTC_DEPOSIT: "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-deposit",
|
|
8
|
+
SBTC_REGISTRY: "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-registry",
|
|
9
9
|
// Stablecoins
|
|
10
|
-
USDCX: "
|
|
10
|
+
USDCX: "SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx",
|
|
11
11
|
// BNS
|
|
12
12
|
BNS: "SP000000000000000000002Q6VF78.bns",
|
|
13
13
|
// Stacking
|
|
@@ -128,7 +128,7 @@ export const TESTNET_CONTRACTS = {
|
|
|
128
128
|
SBTC_DEPOSIT: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sbtc-deposit",
|
|
129
129
|
SBTC_REGISTRY: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sbtc-registry",
|
|
130
130
|
// Stablecoins
|
|
131
|
-
USDCX: "
|
|
131
|
+
USDCX: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.usdcx",
|
|
132
132
|
// BNS
|
|
133
133
|
BNS: "ST000000000000000000002AMW42H.bns",
|
|
134
134
|
// Stacking
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/config/contracts.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,OAAO;IACP,UAAU,EAAE,sDAAsD;IAClE,YAAY,EAAE,wDAAwD;IACtE,aAAa,EAAE,yDAAyD;IAExE,cAAc;IACd,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/config/contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pillar.d.ts","sourceRoot":"","sources":["../../src/config/pillar.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc,QAAwD,CAAC;AACpF,eAAO,MAAM,cAAc,QAAmC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pillar.js","sourceRoot":"","sources":["../../src/config/pillar.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,uBAAuB,CAAC;AACpF,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare class PillarApiService {
|
|
2
|
+
private baseUrl;
|
|
3
|
+
private apiKey;
|
|
4
|
+
constructor();
|
|
5
|
+
private request;
|
|
6
|
+
get<T>(path: string, queryParams?: Record<string, string | number | boolean | undefined>): Promise<T>;
|
|
7
|
+
post<T>(path: string, body?: unknown): Promise<T>;
|
|
8
|
+
}
|
|
9
|
+
export declare function getPillarApi(): PillarApiService;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=pillar-api.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pillar-api.service.d.ts","sourceRoot":"","sources":["../../src/services/pillar-api.service.ts"],"names":[],"mappings":"AAEA,cAAM,gBAAgB;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;;YAOT,OAAO;IAwCf,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIrG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;CAGxD;AAID,wBAAgB,YAAY,IAAI,gBAAgB,CAK/C"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { PILLAR_API_URL, PILLAR_API_KEY } from "../config/pillar.js";
|
|
2
|
+
class PillarApiService {
|
|
3
|
+
baseUrl;
|
|
4
|
+
apiKey;
|
|
5
|
+
constructor() {
|
|
6
|
+
this.baseUrl = PILLAR_API_URL;
|
|
7
|
+
this.apiKey = PILLAR_API_KEY;
|
|
8
|
+
}
|
|
9
|
+
async request(method, path, body, queryParams) {
|
|
10
|
+
let url = `${this.baseUrl}${path}`;
|
|
11
|
+
if (queryParams) {
|
|
12
|
+
const params = new URLSearchParams();
|
|
13
|
+
for (const [key, value] of Object.entries(queryParams)) {
|
|
14
|
+
if (value !== undefined) {
|
|
15
|
+
params.set(key, String(value));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const qs = params.toString();
|
|
19
|
+
if (qs)
|
|
20
|
+
url += `?${qs}`;
|
|
21
|
+
}
|
|
22
|
+
const headers = {
|
|
23
|
+
"Content-Type": "application/json",
|
|
24
|
+
};
|
|
25
|
+
if (this.apiKey) {
|
|
26
|
+
headers["Authorization"] = `Bearer ${this.apiKey}`;
|
|
27
|
+
}
|
|
28
|
+
const response = await fetch(url, {
|
|
29
|
+
method,
|
|
30
|
+
headers,
|
|
31
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
32
|
+
});
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
const errorText = await response.text();
|
|
35
|
+
throw new Error(`Pillar API error (${response.status}): ${errorText}`);
|
|
36
|
+
}
|
|
37
|
+
return response.json();
|
|
38
|
+
}
|
|
39
|
+
async get(path, queryParams) {
|
|
40
|
+
return this.request("GET", path, undefined, queryParams);
|
|
41
|
+
}
|
|
42
|
+
async post(path, body) {
|
|
43
|
+
return this.request("POST", path, body);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
let _instance = null;
|
|
47
|
+
export function getPillarApi() {
|
|
48
|
+
if (!_instance) {
|
|
49
|
+
_instance = new PillarApiService();
|
|
50
|
+
}
|
|
51
|
+
return _instance;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=pillar-api.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pillar-api.service.js","sourceRoot":"","sources":["../../src/services/pillar-api.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErE,MAAM,gBAAgB;IACZ,OAAO,CAAS;IAChB,MAAM,CAAS;IAEvB;QACE,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAAc,EACd,WAAmE;QAEnE,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QAEnC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBACvD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC7B,IAAI,EAAE;gBAAE,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;QAC1B,CAAC;QAED,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACrD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,IAAY,EAAE,WAAmE;QAC5F,OAAO,IAAI,CAAC,OAAO,CAAI,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,IAAc;QACxC,OAAO,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;CACF;AAED,IAAI,SAAS,GAA4B,IAAI,CAAC;AAE9C,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -301,7 +301,7 @@ const TOKEN_CONTRACTS: Record<'mainnet' | 'testnet', Record<'sBTC' | 'USDCx', To
|
|
|
301
301
|
},
|
|
302
302
|
testnet: {
|
|
303
303
|
sBTC: { address: 'ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT', name: 'sbtc-token' },
|
|
304
|
-
USDCx: { address: '
|
|
304
|
+
USDCx: { address: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM', name: 'usdcx' },
|
|
305
305
|
},
|
|
306
306
|
};
|
|
307
307
|
|
|
@@ -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;AAqBpE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmDxD"}
|
package/dist/tools/index.js
CHANGED
|
@@ -15,6 +15,7 @@ import { registerDefiTools } from "./defi.tools.js";
|
|
|
15
15
|
import { registerScaffoldTools } from "./scaffold.tools.js";
|
|
16
16
|
import { registerOpenRouterTools } from "./openrouter.tools.js";
|
|
17
17
|
import { registerYieldHunterTools } from "./yield-hunter.tools.js";
|
|
18
|
+
import { registerPillarTools } from "./pillar.tools.js";
|
|
18
19
|
/**
|
|
19
20
|
* Register all tools with the MCP server
|
|
20
21
|
*/
|
|
@@ -51,5 +52,7 @@ export function registerAllTools(server) {
|
|
|
51
52
|
registerOpenRouterTools(server);
|
|
52
53
|
// Yield Hunter (autonomous sBTC yield farming)
|
|
53
54
|
registerYieldHunterTools(server);
|
|
55
|
+
// Pillar (handoff to frontend + polling)
|
|
56
|
+
registerPillarTools(server);
|
|
54
57
|
}
|
|
55
58
|
//# 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;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,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;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD;;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;IAEjC,yCAAyC;IACzC,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pillar.tools.d.ts","sourceRoot":"","sources":["../../src/tools/pillar.tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqHpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkjC3D"}
|
|
@@ -0,0 +1,905 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getPillarApi } from "../services/pillar-api.service.js";
|
|
3
|
+
import { createJsonResponse, createErrorResponse } from "../utils/index.js";
|
|
4
|
+
import { exec } from "child_process";
|
|
5
|
+
import * as fs from "fs";
|
|
6
|
+
import * as path from "path";
|
|
7
|
+
import * as os from "os";
|
|
8
|
+
const PILLAR_FRONTEND_URL = "https://pillarbtc.com";
|
|
9
|
+
const POLL_INTERVAL_MS = 3000;
|
|
10
|
+
const POLL_TIMEOUT_MS = parseInt(process.env.PILLAR_POLL_TIMEOUT_MS || "300000", 10); // 5 minutes default
|
|
11
|
+
const MCP_DEFAULT_REFERRAL = process.env.PILLAR_DEFAULT_REFERRAL || "SPV9K21TBFAK4KNRJXF5DFP8N7W46G4V9RCJDC22.beta-v2-wallet";
|
|
12
|
+
const SESSION_FILE = path.join(os.homedir(), ".aibtc", "pillar-session.json");
|
|
13
|
+
function ensureDir(filePath) {
|
|
14
|
+
const dir = path.dirname(filePath);
|
|
15
|
+
if (!fs.existsSync(dir)) {
|
|
16
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function loadSession() {
|
|
20
|
+
try {
|
|
21
|
+
if (fs.existsSync(SESSION_FILE)) {
|
|
22
|
+
const data = fs.readFileSync(SESSION_FILE, "utf-8");
|
|
23
|
+
return JSON.parse(data);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Ignore errors
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
function saveSession(session) {
|
|
32
|
+
ensureDir(SESSION_FILE);
|
|
33
|
+
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
|
|
34
|
+
}
|
|
35
|
+
function clearSession() {
|
|
36
|
+
try {
|
|
37
|
+
if (fs.existsSync(SESSION_FILE)) {
|
|
38
|
+
fs.unlinkSync(SESSION_FILE);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Ignore errors
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Open URL in default browser (cross-platform)
|
|
46
|
+
function openBrowser(url) {
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
const platform = process.platform;
|
|
49
|
+
let cmd;
|
|
50
|
+
if (platform === "darwin") {
|
|
51
|
+
cmd = `open "${url}"`;
|
|
52
|
+
}
|
|
53
|
+
else if (platform === "win32") {
|
|
54
|
+
cmd = `start "" "${url}"`;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
cmd = `xdg-open "${url}"`;
|
|
58
|
+
}
|
|
59
|
+
exec(cmd, (error) => {
|
|
60
|
+
if (error) {
|
|
61
|
+
reject(error);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
resolve();
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// Poll for operation status
|
|
70
|
+
async function pollOperationStatus(opId, timeoutMs = POLL_TIMEOUT_MS) {
|
|
71
|
+
const api = getPillarApi();
|
|
72
|
+
const startTime = Date.now();
|
|
73
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
74
|
+
try {
|
|
75
|
+
const result = await api.get(`/api/mcp/op-status/${opId}`);
|
|
76
|
+
if (result.status === "completed") {
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
if (result.status === "failed" || result.status === "cancelled") {
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
// Still pending, wait and retry
|
|
83
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
// API error, wait and retry
|
|
87
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { status: "timeout", error: "Operation timed out waiting for completion" };
|
|
91
|
+
}
|
|
92
|
+
export function registerPillarTools(server) {
|
|
93
|
+
// Tool 1: Connect to Pillar (handoff to frontend, returns wallet address)
|
|
94
|
+
server.registerTool("pillar_connect", {
|
|
95
|
+
description: "Connect to your Pillar smart wallet. Opens the Pillar website - if you're logged in, " +
|
|
96
|
+
"it will automatically connect and return your wallet address. Use this first before other Pillar actions.",
|
|
97
|
+
inputSchema: {},
|
|
98
|
+
}, async () => {
|
|
99
|
+
try {
|
|
100
|
+
const api = getPillarApi();
|
|
101
|
+
// Step 1: Create connect operation
|
|
102
|
+
const createResult = await api.post("/api/mcp/create-op", {
|
|
103
|
+
action: "connect",
|
|
104
|
+
});
|
|
105
|
+
const { opId } = createResult;
|
|
106
|
+
// Step 2: Open frontend with operation ID
|
|
107
|
+
const url = `${PILLAR_FRONTEND_URL}/?op=${opId}`;
|
|
108
|
+
await openBrowser(url);
|
|
109
|
+
// Step 3: Poll for completion
|
|
110
|
+
const result = await pollOperationStatus(opId);
|
|
111
|
+
if (result.status === "completed" && result.walletAddress) {
|
|
112
|
+
// Save session locally
|
|
113
|
+
const session = {
|
|
114
|
+
walletAddress: result.walletAddress,
|
|
115
|
+
walletName: result.walletName,
|
|
116
|
+
connectedAt: Date.now(),
|
|
117
|
+
};
|
|
118
|
+
saveSession(session);
|
|
119
|
+
return createJsonResponse({
|
|
120
|
+
success: true,
|
|
121
|
+
message: `Connected to Pillar!`,
|
|
122
|
+
walletAddress: result.walletAddress,
|
|
123
|
+
walletName: result.walletName,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if (result.status === "failed") {
|
|
127
|
+
return createJsonResponse({
|
|
128
|
+
success: false,
|
|
129
|
+
message: result.error || "Failed to connect. Make sure you're logged into Pillar.",
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
if (result.status === "cancelled") {
|
|
133
|
+
return createJsonResponse({
|
|
134
|
+
success: false,
|
|
135
|
+
message: "Connection cancelled.",
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// Timeout
|
|
139
|
+
return createJsonResponse({
|
|
140
|
+
success: false,
|
|
141
|
+
message: "Timed out waiting for connection. Please try again.",
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
return createErrorResponse(error);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
// Tool 2: Disconnect from Pillar
|
|
149
|
+
server.registerTool("pillar_disconnect", {
|
|
150
|
+
description: "Disconnect from Pillar. Clears locally stored wallet address.",
|
|
151
|
+
inputSchema: {},
|
|
152
|
+
}, async () => {
|
|
153
|
+
const session = loadSession();
|
|
154
|
+
clearSession();
|
|
155
|
+
return createJsonResponse({
|
|
156
|
+
success: true,
|
|
157
|
+
message: session
|
|
158
|
+
? `Disconnected from ${session.walletName || session.walletAddress}`
|
|
159
|
+
: "Not connected to Pillar.",
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
// Tool 3: Get Pillar connection status
|
|
163
|
+
server.registerTool("pillar_status", {
|
|
164
|
+
description: "Check if you're connected to Pillar and get your wallet address.",
|
|
165
|
+
inputSchema: {},
|
|
166
|
+
}, async () => {
|
|
167
|
+
const session = loadSession();
|
|
168
|
+
if (session) {
|
|
169
|
+
return createJsonResponse({
|
|
170
|
+
connected: true,
|
|
171
|
+
walletAddress: session.walletAddress,
|
|
172
|
+
walletName: session.walletName,
|
|
173
|
+
connectedAt: new Date(session.connectedAt).toISOString(),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return createJsonResponse({
|
|
177
|
+
connected: false,
|
|
178
|
+
message: "Not connected to Pillar. Use pillar_connect to connect.",
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
// Tool 4: Send sBTC (full handoff + polling flow)
|
|
182
|
+
server.registerTool("pillar_send", {
|
|
183
|
+
description: "Send sBTC from your Pillar smart wallet. Requires being connected first (use pillar_connect). " +
|
|
184
|
+
"Opens the frontend for signing, then waits for confirmation. " +
|
|
185
|
+
"Supports three recipient types: 'bns' for BNS names (muneeb.btc), 'wallet' for Pillar wallet names (iphone), 'address' for Stacks addresses (SP...).",
|
|
186
|
+
inputSchema: {
|
|
187
|
+
to: z.string().describe("Recipient: BNS name (muneeb.btc), Pillar wallet name (iphone), or Stacks address (SP...)"),
|
|
188
|
+
amount: z.number().positive().describe("Amount in satoshis"),
|
|
189
|
+
recipientType: z.enum(["bns", "wallet", "address"]).optional().describe("Type of recipient: 'bns' (default), 'wallet' for Pillar smart wallets, or 'address' for raw Stacks addresses"),
|
|
190
|
+
},
|
|
191
|
+
}, async ({ to, amount, recipientType }) => {
|
|
192
|
+
try {
|
|
193
|
+
// Get wallet address from session
|
|
194
|
+
const session = loadSession();
|
|
195
|
+
if (!session) {
|
|
196
|
+
return createJsonResponse({
|
|
197
|
+
success: false,
|
|
198
|
+
message: "Not connected to Pillar. Please use pillar_connect first.",
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
const walletAddress = session.walletAddress;
|
|
202
|
+
const api = getPillarApi();
|
|
203
|
+
// Step 1: Create pending operation
|
|
204
|
+
const createResult = await api.post("/api/mcp/create-op", {
|
|
205
|
+
action: "send",
|
|
206
|
+
walletAddress,
|
|
207
|
+
params: {
|
|
208
|
+
to,
|
|
209
|
+
amount,
|
|
210
|
+
recipientType: recipientType || "bns",
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
const { opId } = createResult;
|
|
214
|
+
// Step 2: Open frontend with operation ID
|
|
215
|
+
const url = `${PILLAR_FRONTEND_URL}/?op=${opId}`;
|
|
216
|
+
await openBrowser(url);
|
|
217
|
+
// Step 3: Poll for completion
|
|
218
|
+
const result = await pollOperationStatus(opId);
|
|
219
|
+
if (result.status === "completed" && result.txId) {
|
|
220
|
+
return createJsonResponse({
|
|
221
|
+
success: true,
|
|
222
|
+
message: `Transaction submitted successfully!`,
|
|
223
|
+
txId: result.txId,
|
|
224
|
+
explorerUrl: `https://explorer.hiro.so/txid/${result.txId}?chain=mainnet`,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
if (result.status === "cancelled") {
|
|
228
|
+
return createJsonResponse({
|
|
229
|
+
success: false,
|
|
230
|
+
message: "Transaction was cancelled by user.",
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
if (result.status === "failed") {
|
|
234
|
+
return createJsonResponse({
|
|
235
|
+
success: false,
|
|
236
|
+
message: `Transaction failed: ${result.error || "Unknown error"}`,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
// Timeout
|
|
240
|
+
return createJsonResponse({
|
|
241
|
+
success: false,
|
|
242
|
+
message: "Timed out waiting for transaction. Check the frontend to see if it completed.",
|
|
243
|
+
opId,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
return createErrorResponse(error);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
// Tool 5: Fund wallet (multiple methods)
|
|
251
|
+
server.registerTool("pillar_fund", {
|
|
252
|
+
description: "Fund your Pillar smart wallet. Supports multiple methods:\n" +
|
|
253
|
+
"- 'exchange': Deposit BTC from an exchange (Coinbase, Binance, etc.) - generates a deposit address\n" +
|
|
254
|
+
"- 'btc': Deposit BTC from your Leather/Xverse wallet - auto-converts to sBTC\n" +
|
|
255
|
+
"- 'sbtc': Deposit sBTC directly from your Leather/Xverse wallet\n" +
|
|
256
|
+
"Opens the frontend with the appropriate deposit flow.",
|
|
257
|
+
inputSchema: {
|
|
258
|
+
method: z.enum(["exchange", "btc", "sbtc"]).describe("Funding method: 'exchange' (deposit from Coinbase/Binance), 'btc' (from Leather/Xverse BTC), 'sbtc' (from Leather/Xverse sBTC)"),
|
|
259
|
+
amount: z.number().positive().optional().describe("Amount in satoshis to deposit (optional, can be set in UI)"),
|
|
260
|
+
},
|
|
261
|
+
}, async ({ method, amount }) => {
|
|
262
|
+
try {
|
|
263
|
+
const session = loadSession();
|
|
264
|
+
if (!session) {
|
|
265
|
+
return createJsonResponse({
|
|
266
|
+
success: false,
|
|
267
|
+
message: "Not connected to Pillar. Please use pillar_connect first.",
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
const api = getPillarApi();
|
|
271
|
+
const createResult = await api.post("/api/mcp/create-op", {
|
|
272
|
+
action: "fund",
|
|
273
|
+
walletAddress: session.walletAddress,
|
|
274
|
+
params: { method, amount },
|
|
275
|
+
});
|
|
276
|
+
const { opId } = createResult;
|
|
277
|
+
await openBrowser(`${PILLAR_FRONTEND_URL}/?op=${opId}`);
|
|
278
|
+
const result = await pollOperationStatus(opId);
|
|
279
|
+
if (result.status === "completed" && result.txId) {
|
|
280
|
+
const methodLabels = {
|
|
281
|
+
exchange: "Exchange deposit",
|
|
282
|
+
btc: "BTC deposit",
|
|
283
|
+
sbtc: "sBTC deposit",
|
|
284
|
+
};
|
|
285
|
+
return createJsonResponse({
|
|
286
|
+
success: true,
|
|
287
|
+
message: `${methodLabels[method] || "Deposit"} submitted successfully!`,
|
|
288
|
+
txId: result.txId,
|
|
289
|
+
explorerUrl: `https://explorer.hiro.so/txid/${result.txId}?chain=mainnet`,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
if (result.status === "cancelled") {
|
|
293
|
+
return createJsonResponse({ success: false, message: "Deposit cancelled." });
|
|
294
|
+
}
|
|
295
|
+
if (result.status === "failed") {
|
|
296
|
+
return createJsonResponse({ success: false, message: `Deposit failed: ${result.error || "Unknown error"}` });
|
|
297
|
+
}
|
|
298
|
+
return createJsonResponse({ success: false, message: "Timed out waiting for deposit.", opId });
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
return createErrorResponse(error);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
// Tool 6: Add backup admin
|
|
305
|
+
server.registerTool("pillar_add_admin", {
|
|
306
|
+
description: "Add a backup admin address to your Pillar smart wallet for recovery purposes. " +
|
|
307
|
+
"The admin can help recover funds if you lose access to your passkey.",
|
|
308
|
+
inputSchema: {
|
|
309
|
+
adminAddress: z.string().optional().describe("Stacks address (SP...) to add as backup admin (can be set in UI)"),
|
|
310
|
+
},
|
|
311
|
+
}, async ({ adminAddress }) => {
|
|
312
|
+
try {
|
|
313
|
+
const session = loadSession();
|
|
314
|
+
if (!session) {
|
|
315
|
+
return createJsonResponse({
|
|
316
|
+
success: false,
|
|
317
|
+
message: "Not connected to Pillar. Please use pillar_connect first.",
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
const api = getPillarApi();
|
|
321
|
+
const createResult = await api.post("/api/mcp/create-op", {
|
|
322
|
+
action: "add-admin",
|
|
323
|
+
walletAddress: session.walletAddress,
|
|
324
|
+
params: { adminAddress },
|
|
325
|
+
});
|
|
326
|
+
const { opId } = createResult;
|
|
327
|
+
await openBrowser(`${PILLAR_FRONTEND_URL}/?op=${opId}`);
|
|
328
|
+
const result = await pollOperationStatus(opId);
|
|
329
|
+
if (result.status === "completed" && result.txId) {
|
|
330
|
+
return createJsonResponse({
|
|
331
|
+
success: true,
|
|
332
|
+
message: "Backup admin added successfully!",
|
|
333
|
+
txId: result.txId,
|
|
334
|
+
explorerUrl: `https://explorer.hiro.so/txid/${result.txId}?chain=mainnet`,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
if (result.status === "cancelled") {
|
|
338
|
+
return createJsonResponse({ success: false, message: "Add admin cancelled." });
|
|
339
|
+
}
|
|
340
|
+
if (result.status === "failed") {
|
|
341
|
+
return createJsonResponse({ success: false, message: `Add admin failed: ${result.error || "Unknown error"}` });
|
|
342
|
+
}
|
|
343
|
+
return createJsonResponse({ success: false, message: "Timed out waiting for add admin.", opId });
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
return createErrorResponse(error);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
// Tool 7: Supply sBTC to Zest
|
|
350
|
+
server.registerTool("pillar_supply", {
|
|
351
|
+
description: "Supply sBTC from your Pillar smart wallet to Zest Protocol to earn yield. " +
|
|
352
|
+
"Your sBTC will be deposited as collateral and earn interest.",
|
|
353
|
+
inputSchema: {
|
|
354
|
+
amount: z.number().positive().optional().describe("Amount in satoshis to supply (optional, can be set in UI)"),
|
|
355
|
+
},
|
|
356
|
+
}, async ({ amount }) => {
|
|
357
|
+
try {
|
|
358
|
+
const session = loadSession();
|
|
359
|
+
if (!session) {
|
|
360
|
+
return createJsonResponse({
|
|
361
|
+
success: false,
|
|
362
|
+
message: "Not connected to Pillar. Please use pillar_connect first.",
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
const api = getPillarApi();
|
|
366
|
+
const createResult = await api.post("/api/mcp/create-op", {
|
|
367
|
+
action: "supply",
|
|
368
|
+
walletAddress: session.walletAddress,
|
|
369
|
+
params: { amount },
|
|
370
|
+
});
|
|
371
|
+
const { opId } = createResult;
|
|
372
|
+
await openBrowser(`${PILLAR_FRONTEND_URL}/?op=${opId}`);
|
|
373
|
+
const result = await pollOperationStatus(opId);
|
|
374
|
+
if (result.status === "completed" && result.txId) {
|
|
375
|
+
return createJsonResponse({
|
|
376
|
+
success: true,
|
|
377
|
+
message: "Supply to Zest submitted successfully!",
|
|
378
|
+
txId: result.txId,
|
|
379
|
+
explorerUrl: `https://explorer.hiro.so/txid/${result.txId}?chain=mainnet`,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
if (result.status === "cancelled") {
|
|
383
|
+
return createJsonResponse({ success: false, message: "Supply cancelled." });
|
|
384
|
+
}
|
|
385
|
+
if (result.status === "failed") {
|
|
386
|
+
return createJsonResponse({ success: false, message: `Supply failed: ${result.error || "Unknown error"}` });
|
|
387
|
+
}
|
|
388
|
+
return createJsonResponse({ success: false, message: "Timed out waiting for supply.", opId });
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
return createErrorResponse(error);
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
// Tool 8: Auto-compound settings
|
|
395
|
+
server.registerTool("pillar_auto_compound", {
|
|
396
|
+
description: "Configure auto-compound for your Pillar wallet. " +
|
|
397
|
+
"When enabled, a keeper will automatically boost your position when sBTC accumulates in your wallet.",
|
|
398
|
+
inputSchema: {
|
|
399
|
+
minSbtc: z.number().nonnegative().optional().describe("Minimum sBTC to keep in wallet (in sats)"),
|
|
400
|
+
trigger: z.number().positive().optional().describe("Amount above minimum that triggers auto-compound (in sats)"),
|
|
401
|
+
},
|
|
402
|
+
}, async ({ minSbtc, trigger }) => {
|
|
403
|
+
try {
|
|
404
|
+
const session = loadSession();
|
|
405
|
+
if (!session) {
|
|
406
|
+
return createJsonResponse({
|
|
407
|
+
success: false,
|
|
408
|
+
message: "Not connected to Pillar. Please use pillar_connect first.",
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
const api = getPillarApi();
|
|
412
|
+
const createResult = await api.post("/api/mcp/create-op", {
|
|
413
|
+
action: "auto-compound",
|
|
414
|
+
walletAddress: session.walletAddress,
|
|
415
|
+
params: { minSbtc, trigger },
|
|
416
|
+
});
|
|
417
|
+
const { opId } = createResult;
|
|
418
|
+
await openBrowser(`${PILLAR_FRONTEND_URL}/?op=${opId}`);
|
|
419
|
+
const result = await pollOperationStatus(opId);
|
|
420
|
+
if (result.status === "completed") {
|
|
421
|
+
return createJsonResponse({
|
|
422
|
+
success: true,
|
|
423
|
+
message: "Auto-compound settings saved!",
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
if (result.status === "cancelled") {
|
|
427
|
+
return createJsonResponse({ success: false, message: "Auto-compound setup cancelled." });
|
|
428
|
+
}
|
|
429
|
+
if (result.status === "failed") {
|
|
430
|
+
return createJsonResponse({ success: false, message: `Auto-compound setup failed: ${result.error || "Unknown error"}` });
|
|
431
|
+
}
|
|
432
|
+
return createJsonResponse({ success: false, message: "Timed out waiting for auto-compound setup.", opId });
|
|
433
|
+
}
|
|
434
|
+
catch (error) {
|
|
435
|
+
return createErrorResponse(error);
|
|
436
|
+
}
|
|
437
|
+
});
|
|
438
|
+
// Tool 9: Unwind (close/reduce leveraged position)
|
|
439
|
+
server.registerTool("pillar_unwind", {
|
|
440
|
+
description: "Close or reduce your leveraged sBTC position. " +
|
|
441
|
+
"Opens a modal to repay borrowed sBTC and withdraw collateral back to your wallet.",
|
|
442
|
+
inputSchema: {
|
|
443
|
+
percentage: z.number().min(1).max(100).optional().describe("Percentage of position to unwind (1-100, optional, can be set in UI)"),
|
|
444
|
+
},
|
|
445
|
+
}, async ({ percentage }) => {
|
|
446
|
+
try {
|
|
447
|
+
const session = loadSession();
|
|
448
|
+
if (!session) {
|
|
449
|
+
return createJsonResponse({
|
|
450
|
+
success: false,
|
|
451
|
+
message: "Not connected to Pillar. Please use pillar_connect first.",
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
const api = getPillarApi();
|
|
455
|
+
const createResult = await api.post("/api/mcp/create-op", {
|
|
456
|
+
action: "unwind",
|
|
457
|
+
walletAddress: session.walletAddress,
|
|
458
|
+
params: { percentage },
|
|
459
|
+
});
|
|
460
|
+
const { opId } = createResult;
|
|
461
|
+
await openBrowser(`${PILLAR_FRONTEND_URL}/?op=${opId}`);
|
|
462
|
+
const result = await pollOperationStatus(opId);
|
|
463
|
+
if (result.status === "completed" && result.txId) {
|
|
464
|
+
return createJsonResponse({
|
|
465
|
+
success: true,
|
|
466
|
+
message: "Unwind position submitted successfully!",
|
|
467
|
+
txId: result.txId,
|
|
468
|
+
explorerUrl: `https://explorer.hiro.so/txid/${result.txId}?chain=mainnet`,
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
if (result.status === "cancelled") {
|
|
472
|
+
return createJsonResponse({ success: false, message: "Unwind cancelled." });
|
|
473
|
+
}
|
|
474
|
+
if (result.status === "failed") {
|
|
475
|
+
return createJsonResponse({ success: false, message: `Unwind failed: ${result.error || "Unknown error"}` });
|
|
476
|
+
}
|
|
477
|
+
return createJsonResponse({ success: false, message: "Timed out waiting for unwind.", opId });
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
return createErrorResponse(error);
|
|
481
|
+
}
|
|
482
|
+
});
|
|
483
|
+
// Tool 10: Boost (create/increase leveraged position)
|
|
484
|
+
server.registerTool("pillar_boost", {
|
|
485
|
+
description: "Create or increase a leveraged sBTC position (up to 1.5x). " +
|
|
486
|
+
"Opens the Pillar website where you can set the amount and confirm the boost. " +
|
|
487
|
+
"Your sBTC is supplied to Zest, borrowed against, and re-supplied for amplified exposure. " +
|
|
488
|
+
"Amounts over 100,000 sats automatically enter DCA mode — split into daily 100k-sat chunks " +
|
|
489
|
+
"(max 700k sats per schedule). The first chunk executes immediately, the rest follow daily.",
|
|
490
|
+
inputSchema: {
|
|
491
|
+
amount: z.number().positive().optional().describe("Amount in satoshis to boost (optional, shown as suggestion)"),
|
|
492
|
+
},
|
|
493
|
+
}, async ({ amount }) => {
|
|
494
|
+
try {
|
|
495
|
+
const session = loadSession();
|
|
496
|
+
if (!session) {
|
|
497
|
+
return createJsonResponse({
|
|
498
|
+
success: false,
|
|
499
|
+
message: "Not connected to Pillar. Please use pillar_connect first.",
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
const api = getPillarApi();
|
|
503
|
+
const createResult = await api.post("/api/mcp/create-op", {
|
|
504
|
+
action: "boost",
|
|
505
|
+
walletAddress: session.walletAddress,
|
|
506
|
+
params: { amount },
|
|
507
|
+
});
|
|
508
|
+
const { opId } = createResult;
|
|
509
|
+
await openBrowser(`${PILLAR_FRONTEND_URL}/?op=${opId}`);
|
|
510
|
+
const result = await pollOperationStatus(opId);
|
|
511
|
+
if (result.status === "completed" && result.txId) {
|
|
512
|
+
return createJsonResponse({
|
|
513
|
+
success: true,
|
|
514
|
+
message: "Boost position submitted successfully!",
|
|
515
|
+
txId: result.txId,
|
|
516
|
+
explorerUrl: `https://explorer.hiro.so/txid/${result.txId}?chain=mainnet`,
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
if (result.status === "cancelled") {
|
|
520
|
+
return createJsonResponse({ success: false, message: "Boost cancelled." });
|
|
521
|
+
}
|
|
522
|
+
if (result.status === "failed") {
|
|
523
|
+
return createJsonResponse({ success: false, message: `Boost failed: ${result.error || "Unknown error"}` });
|
|
524
|
+
}
|
|
525
|
+
return createJsonResponse({ success: false, message: "Timed out waiting for boost.", opId });
|
|
526
|
+
}
|
|
527
|
+
catch (error) {
|
|
528
|
+
return createErrorResponse(error);
|
|
529
|
+
}
|
|
530
|
+
});
|
|
531
|
+
// Tool 11: Get position and balance (opens modal + returns data)
|
|
532
|
+
server.registerTool("pillar_position", {
|
|
533
|
+
description: "View your Pillar wallet balance and Zest position. " +
|
|
534
|
+
"Opens the Position modal in the browser AND returns the data (sBTC balance, collateral, borrowed, LTV, liquidation price).",
|
|
535
|
+
inputSchema: {},
|
|
536
|
+
}, async () => {
|
|
537
|
+
try {
|
|
538
|
+
const session = loadSession();
|
|
539
|
+
if (!session) {
|
|
540
|
+
return createJsonResponse({
|
|
541
|
+
success: false,
|
|
542
|
+
message: "Not connected to Pillar. Please use pillar_connect first.",
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
const walletAddress = session.walletAddress;
|
|
546
|
+
// Fetch balances directly from Hiro API
|
|
547
|
+
const balanceRes = await fetch(`https://api.hiro.so/extended/v1/address/${walletAddress}/balances`);
|
|
548
|
+
let sbtcBalance = 0;
|
|
549
|
+
let zsbtcBalance = 0;
|
|
550
|
+
if (balanceRes.ok) {
|
|
551
|
+
const balanceData = await balanceRes.json();
|
|
552
|
+
// sBTC balance (wallet balance)
|
|
553
|
+
const sbtcKey = Object.keys(balanceData.fungible_tokens || {}).find((k) => k.includes("sbtc-token"));
|
|
554
|
+
if (sbtcKey) {
|
|
555
|
+
sbtcBalance = parseInt(balanceData.fungible_tokens[sbtcKey].balance) || 0;
|
|
556
|
+
}
|
|
557
|
+
// zsBTC balance (collateral in Zest)
|
|
558
|
+
const zsbtcKey = Object.keys(balanceData.fungible_tokens || {}).find((k) => k.includes("zsbtc"));
|
|
559
|
+
if (zsbtcKey) {
|
|
560
|
+
zsbtcBalance = parseInt(balanceData.fungible_tokens[zsbtcKey].balance) || 0;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
// Fetch BTC price for USD values
|
|
564
|
+
let btcPrice = 0;
|
|
565
|
+
try {
|
|
566
|
+
const priceRes = await fetch("https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd");
|
|
567
|
+
if (priceRes.ok) {
|
|
568
|
+
const priceData = await priceRes.json();
|
|
569
|
+
btcPrice = priceData.bitcoin?.usd || 0;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
catch {
|
|
573
|
+
// Price fetch failed, continue without USD values
|
|
574
|
+
}
|
|
575
|
+
// Calculate display values
|
|
576
|
+
const formatBtc = (sats) => (sats / 1e8).toFixed(8).replace(/\.?0+$/, "");
|
|
577
|
+
const formatUsd = (usd) => `$${usd.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
|
|
578
|
+
const sbtcUsd = (sbtcBalance / 1e8) * btcPrice;
|
|
579
|
+
const collateralUsd = (zsbtcBalance / 1e8) * btcPrice;
|
|
580
|
+
const hasPosition = zsbtcBalance > 0;
|
|
581
|
+
// Open the Position modal in frontend for accurate details
|
|
582
|
+
const api = getPillarApi();
|
|
583
|
+
const createResult = await api.post("/api/mcp/create-op", {
|
|
584
|
+
action: "position",
|
|
585
|
+
walletAddress,
|
|
586
|
+
});
|
|
587
|
+
const { opId } = createResult;
|
|
588
|
+
await openBrowser(`${PILLAR_FRONTEND_URL}/?op=${opId}`);
|
|
589
|
+
// Return only accurate data - borrowed/LTV/liq price are shown in modal
|
|
590
|
+
return createJsonResponse({
|
|
591
|
+
success: true,
|
|
592
|
+
walletAddress,
|
|
593
|
+
walletName: session.walletName,
|
|
594
|
+
walletBalance: {
|
|
595
|
+
sbtc: sbtcBalance,
|
|
596
|
+
sbtcFormatted: `${formatBtc(sbtcBalance)} sBTC`,
|
|
597
|
+
sbtcUsd: btcPrice > 0 ? formatUsd(sbtcUsd) : null,
|
|
598
|
+
},
|
|
599
|
+
position: hasPosition ? {
|
|
600
|
+
collateral: zsbtcBalance,
|
|
601
|
+
collateralFormatted: `${formatBtc(zsbtcBalance)} BTC (zsBTC in Zest)`,
|
|
602
|
+
collateralUsd: btcPrice > 0 ? formatUsd(collateralUsd) : null,
|
|
603
|
+
} : null,
|
|
604
|
+
message: hasPosition
|
|
605
|
+
? `Wallet: ${formatBtc(sbtcBalance)} sBTC | Collateral: ${formatBtc(zsbtcBalance)} BTC. See modal for borrowed, LTV, and liquidation price.`
|
|
606
|
+
: `Wallet: ${formatBtc(sbtcBalance)} sBTC | No active position`,
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
catch (error) {
|
|
610
|
+
return createErrorResponse(error);
|
|
611
|
+
}
|
|
612
|
+
});
|
|
613
|
+
// Tool 12: Create a new Pillar wallet
|
|
614
|
+
server.registerTool("pillar_create_wallet", {
|
|
615
|
+
description: "Create a new Pillar smart wallet. Opens the Pillar website to complete registration. " +
|
|
616
|
+
"You'll need to enter your email to receive updates. " +
|
|
617
|
+
"If the user doesn't have a referral link, tell them they can DM @pillar_btc on X (https://x.com/pillar_btc) to request one before signing up.",
|
|
618
|
+
inputSchema: {
|
|
619
|
+
referral: z.string().optional().describe("Referral wallet address (optional, defaults to MCP referral)"),
|
|
620
|
+
},
|
|
621
|
+
}, async ({ referral }) => {
|
|
622
|
+
try {
|
|
623
|
+
// Check if already connected
|
|
624
|
+
const existingSession = loadSession();
|
|
625
|
+
if (existingSession) {
|
|
626
|
+
return createJsonResponse({
|
|
627
|
+
success: false,
|
|
628
|
+
message: `Already connected to wallet ${existingSession.walletName || existingSession.walletAddress}. Use pillar_disconnect first if you want to create a new wallet.`,
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
const api = getPillarApi();
|
|
632
|
+
// Create operation
|
|
633
|
+
const createResult = await api.post("/api/mcp/create-op", {
|
|
634
|
+
action: "create-wallet",
|
|
635
|
+
params: { referral: referral || MCP_DEFAULT_REFERRAL },
|
|
636
|
+
});
|
|
637
|
+
const { opId } = createResult;
|
|
638
|
+
// Open frontend with referral
|
|
639
|
+
const ref = referral || MCP_DEFAULT_REFERRAL;
|
|
640
|
+
const url = `${PILLAR_FRONTEND_URL}/?op=${opId}&ref=${ref}`;
|
|
641
|
+
await openBrowser(url);
|
|
642
|
+
// Poll for completion
|
|
643
|
+
const result = await pollOperationStatus(opId);
|
|
644
|
+
if (result.status === "completed" && result.walletAddress) {
|
|
645
|
+
// Save session
|
|
646
|
+
const session = {
|
|
647
|
+
walletAddress: result.walletAddress,
|
|
648
|
+
walletName: result.walletName,
|
|
649
|
+
connectedAt: Date.now(),
|
|
650
|
+
};
|
|
651
|
+
saveSession(session);
|
|
652
|
+
return createJsonResponse({
|
|
653
|
+
success: true,
|
|
654
|
+
message: "Wallet created successfully!",
|
|
655
|
+
walletAddress: result.walletAddress,
|
|
656
|
+
walletName: result.walletName,
|
|
657
|
+
});
|
|
658
|
+
}
|
|
659
|
+
if (result.status === "cancelled") {
|
|
660
|
+
return createJsonResponse({ success: false, message: "Wallet creation cancelled." });
|
|
661
|
+
}
|
|
662
|
+
if (result.status === "failed") {
|
|
663
|
+
return createJsonResponse({ success: false, message: `Wallet creation failed: ${result.error || "Unknown error"}` });
|
|
664
|
+
}
|
|
665
|
+
return createJsonResponse({ success: false, message: "Timed out waiting for wallet creation.", opId });
|
|
666
|
+
}
|
|
667
|
+
catch (error) {
|
|
668
|
+
return createErrorResponse(error);
|
|
669
|
+
}
|
|
670
|
+
});
|
|
671
|
+
// Tool 13: Get referral/invite link
|
|
672
|
+
server.registerTool("pillar_invite", {
|
|
673
|
+
description: "Get your Pillar referral link to invite friends. Share this link and earn rewards when friends sign up.",
|
|
674
|
+
inputSchema: {},
|
|
675
|
+
}, async () => {
|
|
676
|
+
try {
|
|
677
|
+
const session = loadSession();
|
|
678
|
+
if (!session) {
|
|
679
|
+
return createJsonResponse({
|
|
680
|
+
success: false,
|
|
681
|
+
message: "Not connected to Pillar. Please use pillar_connect first.",
|
|
682
|
+
});
|
|
683
|
+
}
|
|
684
|
+
const referralLink = `${PILLAR_FRONTEND_URL}/?ref=${session.walletAddress}`;
|
|
685
|
+
return createJsonResponse({
|
|
686
|
+
success: true,
|
|
687
|
+
referralLink,
|
|
688
|
+
walletAddress: session.walletAddress,
|
|
689
|
+
message: `Share this link to invite friends: ${referralLink}`,
|
|
690
|
+
});
|
|
691
|
+
}
|
|
692
|
+
catch (error) {
|
|
693
|
+
return createErrorResponse(error);
|
|
694
|
+
}
|
|
695
|
+
});
|
|
696
|
+
// Tool 14: Invite a DCA partner (direct API, no handoff)
|
|
697
|
+
server.registerTool("pillar_dca_invite", {
|
|
698
|
+
description: "Invite a DCA partner by email or wallet address. " +
|
|
699
|
+
"DCA partners hold each other accountable — both must boost each week to keep the streak alive.",
|
|
700
|
+
inputSchema: {
|
|
701
|
+
partner: z.string().describe("Partner's email address or Stacks wallet address (SP...)"),
|
|
702
|
+
},
|
|
703
|
+
}, async ({ partner }) => {
|
|
704
|
+
try {
|
|
705
|
+
const session = loadSession();
|
|
706
|
+
if (!session) {
|
|
707
|
+
return createJsonResponse({
|
|
708
|
+
success: false,
|
|
709
|
+
message: "Not connected to Pillar. Please use pillar_connect first.",
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
const isEmail = partner.includes("@");
|
|
713
|
+
const api = getPillarApi();
|
|
714
|
+
const result = await api.post("/api/dca-partner/invite", {
|
|
715
|
+
walletAddress: session.walletAddress,
|
|
716
|
+
...(isEmail ? { partnerEmail: partner } : { partnerWalletAddress: partner }),
|
|
717
|
+
});
|
|
718
|
+
return createJsonResponse({
|
|
719
|
+
success: true,
|
|
720
|
+
partnershipId: result.partnershipId,
|
|
721
|
+
status: result.status,
|
|
722
|
+
message: isEmail
|
|
723
|
+
? `Invite sent to ${partner}. They'll receive an email with a link to accept.`
|
|
724
|
+
: `Partnership invite sent to ${partner}.`,
|
|
725
|
+
...(result.inviteLink ? { inviteLink: result.inviteLink } : {}),
|
|
726
|
+
});
|
|
727
|
+
}
|
|
728
|
+
catch (error) {
|
|
729
|
+
return createErrorResponse(error);
|
|
730
|
+
}
|
|
731
|
+
});
|
|
732
|
+
// Tool 15: View DCA partners and weekly status (direct API)
|
|
733
|
+
server.registerTool("pillar_dca_partners", {
|
|
734
|
+
description: "View your DCA partners and weekly status. " +
|
|
735
|
+
"Shows active partnerships with streak, PnL, and weekly status badges, plus any pending invites.",
|
|
736
|
+
inputSchema: {},
|
|
737
|
+
}, async () => {
|
|
738
|
+
try {
|
|
739
|
+
const session = loadSession();
|
|
740
|
+
if (!session) {
|
|
741
|
+
return createJsonResponse({
|
|
742
|
+
success: false,
|
|
743
|
+
message: "Not connected to Pillar. Please use pillar_connect first.",
|
|
744
|
+
});
|
|
745
|
+
}
|
|
746
|
+
const api = getPillarApi();
|
|
747
|
+
const result = await api.get("/api/dca-partner/my-partners", { walletAddress: session.walletAddress });
|
|
748
|
+
const active = result.partnerships.filter(p => p.status === "active");
|
|
749
|
+
const pending = result.pendingInvites || [];
|
|
750
|
+
return createJsonResponse({
|
|
751
|
+
success: true,
|
|
752
|
+
activePartnerships: active.map(p => ({
|
|
753
|
+
partnershipId: p.partnershipId,
|
|
754
|
+
partner: p.partnerName || p.partnerAddress,
|
|
755
|
+
streak: p.streak,
|
|
756
|
+
pnl: p.pnl,
|
|
757
|
+
myStatus: p.myStatus,
|
|
758
|
+
partnerStatus: p.partnerStatus,
|
|
759
|
+
})),
|
|
760
|
+
pendingInvites: pending.length,
|
|
761
|
+
pendingDetails: pending.map(p => ({
|
|
762
|
+
partnershipId: p.partnershipId,
|
|
763
|
+
partner: p.partnerEmail || p.partnerAddress,
|
|
764
|
+
direction: p.direction,
|
|
765
|
+
})),
|
|
766
|
+
message: active.length > 0
|
|
767
|
+
? `${active.length} active partnership${active.length > 1 ? "s" : ""}, ${pending.length} pending invite${pending.length !== 1 ? "s" : ""}`
|
|
768
|
+
: `No active partnerships. ${pending.length} pending invite${pending.length !== 1 ? "s" : ""}. Use pillar_dca_invite to invite a partner.`,
|
|
769
|
+
});
|
|
770
|
+
}
|
|
771
|
+
catch (error) {
|
|
772
|
+
return createErrorResponse(error);
|
|
773
|
+
}
|
|
774
|
+
});
|
|
775
|
+
// Tool 16: DCA streak leaderboard (direct API)
|
|
776
|
+
server.registerTool("pillar_dca_leaderboard", {
|
|
777
|
+
description: "View the DCA streak leaderboard. Shows top partnerships by streak length, and highlights your entry if you have one.",
|
|
778
|
+
inputSchema: {},
|
|
779
|
+
}, async () => {
|
|
780
|
+
try {
|
|
781
|
+
const session = loadSession();
|
|
782
|
+
if (!session) {
|
|
783
|
+
return createJsonResponse({
|
|
784
|
+
success: false,
|
|
785
|
+
message: "Not connected to Pillar. Please use pillar_connect first.",
|
|
786
|
+
});
|
|
787
|
+
}
|
|
788
|
+
const api = getPillarApi();
|
|
789
|
+
const result = await api.get("/api/dca-partner/leaderboard", { walletAddress: session.walletAddress });
|
|
790
|
+
return createJsonResponse({
|
|
791
|
+
success: true,
|
|
792
|
+
leaderboard: result.leaderboard.map(entry => ({
|
|
793
|
+
rank: entry.rank,
|
|
794
|
+
partners: entry.partnerNames.join(" & "),
|
|
795
|
+
streak: entry.streak,
|
|
796
|
+
pnl: entry.pnl,
|
|
797
|
+
isYou: entry.isUser || false,
|
|
798
|
+
})),
|
|
799
|
+
yourRank: result.userEntry ? {
|
|
800
|
+
rank: result.userEntry.rank,
|
|
801
|
+
partner: result.userEntry.partnerName,
|
|
802
|
+
streak: result.userEntry.streak,
|
|
803
|
+
pnl: result.userEntry.pnl,
|
|
804
|
+
} : null,
|
|
805
|
+
message: result.userEntry
|
|
806
|
+
? `You're ranked #${result.userEntry.rank} with a ${result.userEntry.streak}-week streak with ${result.userEntry.partnerName}.`
|
|
807
|
+
: "You don't have an active partnership on the leaderboard yet. Use pillar_dca_invite to get started.",
|
|
808
|
+
});
|
|
809
|
+
}
|
|
810
|
+
catch (error) {
|
|
811
|
+
return createErrorResponse(error);
|
|
812
|
+
}
|
|
813
|
+
});
|
|
814
|
+
// Tool 17: Check DCA schedule status (direct API)
|
|
815
|
+
server.registerTool("pillar_dca_status", {
|
|
816
|
+
description: "Check your DCA schedule status. Shows all active DCA schedules (up to 10) with chunk progress " +
|
|
817
|
+
"(completed, pending, failed) and next execution time.",
|
|
818
|
+
inputSchema: {},
|
|
819
|
+
}, async () => {
|
|
820
|
+
try {
|
|
821
|
+
const session = loadSession();
|
|
822
|
+
if (!session) {
|
|
823
|
+
return createJsonResponse({
|
|
824
|
+
success: false,
|
|
825
|
+
message: "Not connected to Pillar. Please use pillar_connect first.",
|
|
826
|
+
});
|
|
827
|
+
}
|
|
828
|
+
const api = getPillarApi();
|
|
829
|
+
const raw = await api.get("/api/pillar/dca-status", { walletAddress: session.walletAddress });
|
|
830
|
+
const result = raw.data;
|
|
831
|
+
if (!result) {
|
|
832
|
+
return createJsonResponse({
|
|
833
|
+
success: true,
|
|
834
|
+
hasSchedule: false,
|
|
835
|
+
activeCount: 0,
|
|
836
|
+
maxSchedules: 10,
|
|
837
|
+
message: "No active DCA schedule. Use pillar_boost with an amount over 100,000 sats to start one.",
|
|
838
|
+
});
|
|
839
|
+
}
|
|
840
|
+
const allSchedules = result.allSchedules || [{ schedule: result.schedule, chunks: result.chunks }];
|
|
841
|
+
const activeCount = result.activeCount ?? (result.schedule.status === "active" ? 1 : 0);
|
|
842
|
+
const maxSchedules = result.maxSchedules ?? 10;
|
|
843
|
+
const formatSchedule = (s, chunks) => {
|
|
844
|
+
const pendingChunks = chunks.filter((c) => c.status === "pending" || c.status === "executing").length;
|
|
845
|
+
const nextPending = chunks
|
|
846
|
+
.filter((c) => c.status === "pending")
|
|
847
|
+
.sort((a, b) => a.scheduledAt - b.scheduledAt)[0];
|
|
848
|
+
const nextExecution = nextPending
|
|
849
|
+
? new Date(nextPending.scheduledAt).toISOString()
|
|
850
|
+
: null;
|
|
851
|
+
return {
|
|
852
|
+
id: s.id,
|
|
853
|
+
status: s.status,
|
|
854
|
+
totalSbtcAmount: s.totalSbtcAmount,
|
|
855
|
+
chunkSizeSats: s.chunkSizeSats,
|
|
856
|
+
progress: `${s.completedChunks}/${s.totalChunks} chunks completed`,
|
|
857
|
+
completedChunks: s.completedChunks,
|
|
858
|
+
pendingChunks,
|
|
859
|
+
failedChunks: s.failedChunks,
|
|
860
|
+
nextExecution,
|
|
861
|
+
createdAt: new Date(s.createdAt).toISOString(),
|
|
862
|
+
};
|
|
863
|
+
};
|
|
864
|
+
const schedules = allSchedules.map((entry) => formatSchedule(entry.schedule, entry.chunks));
|
|
865
|
+
const activeSchedules = schedules.filter((s) => s.status === "active");
|
|
866
|
+
if (activeSchedules.length === 0) {
|
|
867
|
+
// No active, show most recent
|
|
868
|
+
const latest = schedules[0];
|
|
869
|
+
return createJsonResponse({
|
|
870
|
+
success: true,
|
|
871
|
+
hasSchedule: true,
|
|
872
|
+
activeCount: 0,
|
|
873
|
+
maxSchedules,
|
|
874
|
+
schedule: latest,
|
|
875
|
+
message: `DCA ${latest.status}: ${latest.progress}.`,
|
|
876
|
+
});
|
|
877
|
+
}
|
|
878
|
+
if (activeSchedules.length === 1) {
|
|
879
|
+
const s = activeSchedules[0];
|
|
880
|
+
return createJsonResponse({
|
|
881
|
+
success: true,
|
|
882
|
+
hasSchedule: true,
|
|
883
|
+
activeCount,
|
|
884
|
+
maxSchedules,
|
|
885
|
+
schedule: s,
|
|
886
|
+
message: `DCA active: ${s.progress} (${s.chunkSizeSats} sats/chunk). Next: ${s.nextExecution || "pending"}.`,
|
|
887
|
+
});
|
|
888
|
+
}
|
|
889
|
+
// Multiple active schedules
|
|
890
|
+
const summaries = activeSchedules.map((s) => `Schedule ${s.id.slice(0, 8)}: ${s.progress}, next: ${s.nextExecution || "pending"}`);
|
|
891
|
+
return createJsonResponse({
|
|
892
|
+
success: true,
|
|
893
|
+
hasSchedule: true,
|
|
894
|
+
activeCount,
|
|
895
|
+
maxSchedules,
|
|
896
|
+
schedules: activeSchedules,
|
|
897
|
+
message: `${activeCount} active DCA schedules (max ${maxSchedules}):\n${summaries.join("\n")}`,
|
|
898
|
+
});
|
|
899
|
+
}
|
|
900
|
+
catch (error) {
|
|
901
|
+
return createErrorResponse(error);
|
|
902
|
+
}
|
|
903
|
+
});
|
|
904
|
+
}
|
|
905
|
+
//# sourceMappingURL=pillar.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pillar.tools.js","sourceRoot":"","sources":["../../src/tools/pillar.tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED