starkfi 0.1.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.
Files changed (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/dist/commands/auth/import.d.ts +3 -0
  4. package/dist/commands/auth/import.d.ts.map +1 -0
  5. package/dist/commands/auth/import.js +56 -0
  6. package/dist/commands/auth/import.js.map +1 -0
  7. package/dist/commands/auth/login.d.ts +3 -0
  8. package/dist/commands/auth/login.d.ts.map +1 -0
  9. package/dist/commands/auth/login.js +23 -0
  10. package/dist/commands/auth/login.js.map +1 -0
  11. package/dist/commands/auth/logout.d.ts +3 -0
  12. package/dist/commands/auth/logout.d.ts.map +1 -0
  13. package/dist/commands/auth/logout.js +14 -0
  14. package/dist/commands/auth/logout.js.map +1 -0
  15. package/dist/commands/auth/verify.d.ts +3 -0
  16. package/dist/commands/auth/verify.d.ts.map +1 -0
  17. package/dist/commands/auth/verify.js +64 -0
  18. package/dist/commands/auth/verify.js.map +1 -0
  19. package/dist/commands/chain/tx-status.d.ts +3 -0
  20. package/dist/commands/chain/tx-status.d.ts.map +1 -0
  21. package/dist/commands/chain/tx-status.js +39 -0
  22. package/dist/commands/chain/tx-status.js.map +1 -0
  23. package/dist/commands/config/config.d.ts +3 -0
  24. package/dist/commands/config/config.d.ts.map +1 -0
  25. package/dist/commands/config/config.js +122 -0
  26. package/dist/commands/config/config.js.map +1 -0
  27. package/dist/commands/lending/lending.d.ts +8 -0
  28. package/dist/commands/lending/lending.d.ts.map +1 -0
  29. package/dist/commands/lending/lending.js +201 -0
  30. package/dist/commands/lending/lending.js.map +1 -0
  31. package/dist/commands/staking/staking.d.ts +8 -0
  32. package/dist/commands/staking/staking.d.ts.map +1 -0
  33. package/dist/commands/staking/staking.js +272 -0
  34. package/dist/commands/staking/staking.js.map +1 -0
  35. package/dist/commands/trade/status.d.ts +3 -0
  36. package/dist/commands/trade/status.d.ts.map +1 -0
  37. package/dist/commands/trade/status.js +41 -0
  38. package/dist/commands/trade/status.js.map +1 -0
  39. package/dist/commands/trade/swap.d.ts +3 -0
  40. package/dist/commands/trade/swap.d.ts.map +1 -0
  41. package/dist/commands/trade/swap.js +65 -0
  42. package/dist/commands/trade/swap.js.map +1 -0
  43. package/dist/commands/wallet/address.d.ts +3 -0
  44. package/dist/commands/wallet/address.d.ts.map +1 -0
  45. package/dist/commands/wallet/address.js +20 -0
  46. package/dist/commands/wallet/address.js.map +1 -0
  47. package/dist/commands/wallet/balance.d.ts +3 -0
  48. package/dist/commands/wallet/balance.d.ts.map +1 -0
  49. package/dist/commands/wallet/balance.js +46 -0
  50. package/dist/commands/wallet/balance.js.map +1 -0
  51. package/dist/commands/wallet/deploy.d.ts +3 -0
  52. package/dist/commands/wallet/deploy.d.ts.map +1 -0
  53. package/dist/commands/wallet/deploy.js +73 -0
  54. package/dist/commands/wallet/deploy.js.map +1 -0
  55. package/dist/commands/wallet/send.d.ts +3 -0
  56. package/dist/commands/wallet/send.d.ts.map +1 -0
  57. package/dist/commands/wallet/send.js +51 -0
  58. package/dist/commands/wallet/send.js.map +1 -0
  59. package/dist/index.d.ts +3 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +62 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/lib/cache.d.ts +3 -0
  64. package/dist/lib/cache.d.ts.map +1 -0
  65. package/dist/lib/cache.js +33 -0
  66. package/dist/lib/cache.js.map +1 -0
  67. package/dist/lib/command.d.ts +3 -0
  68. package/dist/lib/command.d.ts.map +1 -0
  69. package/dist/lib/command.js +6 -0
  70. package/dist/lib/command.js.map +1 -0
  71. package/dist/lib/config.d.ts +16 -0
  72. package/dist/lib/config.d.ts.map +1 -0
  73. package/dist/lib/config.js +30 -0
  74. package/dist/lib/config.js.map +1 -0
  75. package/dist/lib/errors.d.ts +39 -0
  76. package/dist/lib/errors.d.ts.map +1 -0
  77. package/dist/lib/errors.js +45 -0
  78. package/dist/lib/errors.js.map +1 -0
  79. package/dist/lib/format.d.ts +10 -0
  80. package/dist/lib/format.d.ts.map +1 -0
  81. package/dist/lib/format.js +45 -0
  82. package/dist/lib/format.js.map +1 -0
  83. package/dist/lib/validation.d.ts +14 -0
  84. package/dist/lib/validation.d.ts.map +1 -0
  85. package/dist/lib/validation.js +28 -0
  86. package/dist/lib/validation.js.map +1 -0
  87. package/dist/mcp/handlers/auth.d.ts +7 -0
  88. package/dist/mcp/handlers/auth.d.ts.map +1 -0
  89. package/dist/mcp/handlers/auth.js +22 -0
  90. package/dist/mcp/handlers/auth.js.map +1 -0
  91. package/dist/mcp/handlers/config.d.ts +10 -0
  92. package/dist/mcp/handlers/config.d.ts.map +1 -0
  93. package/dist/mcp/handlers/config.js +79 -0
  94. package/dist/mcp/handlers/config.js.map +1 -0
  95. package/dist/mcp/handlers/index.d.ts +7 -0
  96. package/dist/mcp/handlers/index.d.ts.map +1 -0
  97. package/dist/mcp/handlers/index.js +7 -0
  98. package/dist/mcp/handlers/index.js.map +1 -0
  99. package/dist/mcp/handlers/lending.d.ts +62 -0
  100. package/dist/mcp/handlers/lending.d.ts.map +1 -0
  101. package/dist/mcp/handlers/lending.js +101 -0
  102. package/dist/mcp/handlers/lending.js.map +1 -0
  103. package/dist/mcp/handlers/staking.d.ts +56 -0
  104. package/dist/mcp/handlers/staking.d.ts.map +1 -0
  105. package/dist/mcp/handlers/staking.js +110 -0
  106. package/dist/mcp/handlers/staking.js.map +1 -0
  107. package/dist/mcp/handlers/trade.d.ts +22 -0
  108. package/dist/mcp/handlers/trade.d.ts.map +1 -0
  109. package/dist/mcp/handlers/trade.js +57 -0
  110. package/dist/mcp/handlers/trade.js.map +1 -0
  111. package/dist/mcp/handlers/utils.d.ts +13 -0
  112. package/dist/mcp/handlers/utils.d.ts.map +1 -0
  113. package/dist/mcp/handlers/utils.js +7 -0
  114. package/dist/mcp/handlers/utils.js.map +1 -0
  115. package/dist/mcp/handlers/wallet.d.ts +33 -0
  116. package/dist/mcp/handlers/wallet.d.ts.map +1 -0
  117. package/dist/mcp/handlers/wallet.js +83 -0
  118. package/dist/mcp/handlers/wallet.js.map +1 -0
  119. package/dist/mcp/handlers.d.ts +108 -0
  120. package/dist/mcp/handlers.d.ts.map +1 -0
  121. package/dist/mcp/handlers.js +325 -0
  122. package/dist/mcp/handlers.js.map +1 -0
  123. package/dist/mcp/server.d.ts +2 -0
  124. package/dist/mcp/server.d.ts.map +1 -0
  125. package/dist/mcp/server.js +13 -0
  126. package/dist/mcp/server.js.map +1 -0
  127. package/dist/mcp/tools.d.ts +3 -0
  128. package/dist/mcp/tools.d.ts.map +1 -0
  129. package/dist/mcp/tools.js +156 -0
  130. package/dist/mcp/tools.js.map +1 -0
  131. package/dist/services/api/client.d.ts +26 -0
  132. package/dist/services/api/client.d.ts.map +1 -0
  133. package/dist/services/api/client.js +59 -0
  134. package/dist/services/api/client.js.map +1 -0
  135. package/dist/services/auth/session.d.ts +22 -0
  136. package/dist/services/auth/session.d.ts.map +1 -0
  137. package/dist/services/auth/session.js +36 -0
  138. package/dist/services/auth/session.js.map +1 -0
  139. package/dist/services/config/config.d.ts +20 -0
  140. package/dist/services/config/config.d.ts.map +1 -0
  141. package/dist/services/config/config.js +49 -0
  142. package/dist/services/config/config.js.map +1 -0
  143. package/dist/services/fibrous/balances.d.ts +8 -0
  144. package/dist/services/fibrous/balances.d.ts.map +1 -0
  145. package/dist/services/fibrous/balances.js +23 -0
  146. package/dist/services/fibrous/balances.js.map +1 -0
  147. package/dist/services/fibrous/health.d.ts +5 -0
  148. package/dist/services/fibrous/health.d.ts.map +1 -0
  149. package/dist/services/fibrous/health.js +24 -0
  150. package/dist/services/fibrous/health.js.map +1 -0
  151. package/dist/services/fibrous/route.d.ts +42 -0
  152. package/dist/services/fibrous/route.d.ts.map +1 -0
  153. package/dist/services/fibrous/route.js +41 -0
  154. package/dist/services/fibrous/route.js.map +1 -0
  155. package/dist/services/fibrous/tokens.d.ts +6 -0
  156. package/dist/services/fibrous/tokens.d.ts.map +1 -0
  157. package/dist/services/fibrous/tokens.js +34 -0
  158. package/dist/services/fibrous/tokens.js.map +1 -0
  159. package/dist/services/staking/staking.d.ts +70 -0
  160. package/dist/services/staking/staking.d.ts.map +1 -0
  161. package/dist/services/staking/staking.js +170 -0
  162. package/dist/services/staking/staking.js.map +1 -0
  163. package/dist/services/staking/validators.d.ts +6 -0
  164. package/dist/services/staking/validators.d.ts.map +1 -0
  165. package/dist/services/staking/validators.js +14 -0
  166. package/dist/services/staking/validators.js.map +1 -0
  167. package/dist/services/starkzap/client.d.ts +18 -0
  168. package/dist/services/starkzap/client.d.ts.map +1 -0
  169. package/dist/services/starkzap/client.js +65 -0
  170. package/dist/services/starkzap/client.js.map +1 -0
  171. package/dist/services/tokens/balances.d.ts +8 -0
  172. package/dist/services/tokens/balances.d.ts.map +1 -0
  173. package/dist/services/tokens/balances.js +23 -0
  174. package/dist/services/tokens/balances.js.map +1 -0
  175. package/dist/services/tokens/tokens.d.ts +5 -0
  176. package/dist/services/tokens/tokens.d.ts.map +1 -0
  177. package/dist/services/tokens/tokens.js +24 -0
  178. package/dist/services/tokens/tokens.js.map +1 -0
  179. package/dist/services/vesu/index.d.ts +3 -0
  180. package/dist/services/vesu/index.d.ts.map +1 -0
  181. package/dist/services/vesu/index.js +3 -0
  182. package/dist/services/vesu/index.js.map +1 -0
  183. package/dist/services/vesu/lending.d.ts +17 -0
  184. package/dist/services/vesu/lending.d.ts.map +1 -0
  185. package/dist/services/vesu/lending.js +153 -0
  186. package/dist/services/vesu/lending.js.map +1 -0
  187. package/dist/services/vesu/pools.d.ts +13 -0
  188. package/dist/services/vesu/pools.d.ts.map +1 -0
  189. package/dist/services/vesu/pools.js +35 -0
  190. package/dist/services/vesu/pools.js.map +1 -0
  191. package/package.json +83 -0
@@ -0,0 +1,325 @@
1
+ import { loadSession, requireSession } from "../services/auth/session.js";
2
+ import { initSDKAndWallet } from "../services/starkzap/client.js";
3
+ import { checkFibrousHealth } from "../services/fibrous/health.js";
4
+ import { getBalances } from "../services/fibrous/balances.js";
5
+ import { resolveToken, resolveTokenPreset } from "../services/fibrous/tokens.js";
6
+ import { getCalldata } from "../services/fibrous/route.js";
7
+ import * as stakingService from "../services/staking/staking.js";
8
+ import { getValidators, findValidator } from "../services/staking/validators.js";
9
+ import { ConfigService } from "../services/config/config.js";
10
+ import { Amount, fromAddress } from "starkzap";
11
+ import { FIBROUS_ROUTER_ADDRESS, GASLESS_SUPPORTED_TOKENS } from "../lib/config.js";
12
+ function textResult(text) {
13
+ return { content: [{ type: "text", text }] };
14
+ }
15
+ function jsonResult(data) {
16
+ return textResult(JSON.stringify(data, null, 2));
17
+ }
18
+ export async function handleGetAuthStatus() {
19
+ const session = loadSession();
20
+ const health = await checkFibrousHealth();
21
+ if (!session) {
22
+ return jsonResult({
23
+ authenticated: false,
24
+ fibrous: health,
25
+ message: "Not authenticated. Use 'starkfi auth login' or 'starkfi auth import'.",
26
+ });
27
+ }
28
+ return jsonResult({
29
+ authenticated: true,
30
+ type: session.type,
31
+ network: session.network,
32
+ address: session.address,
33
+ fibrous: health,
34
+ });
35
+ }
36
+ export async function handleGetBalance(args) {
37
+ const session = requireSession();
38
+ const { wallet } = await initSDKAndWallet(session);
39
+ if (args.token) {
40
+ const tokenType = await resolveTokenPreset(args.token);
41
+ if (!tokenType) {
42
+ return textResult(`Token ${args.token} not found.`);
43
+ }
44
+ const balanceAmount = await wallet.balanceOf(tokenType);
45
+ return jsonResult({
46
+ symbol: tokenType.symbol,
47
+ name: tokenType.name,
48
+ balance: balanceAmount.toUnit(),
49
+ });
50
+ }
51
+ const balances = await getBalances(wallet);
52
+ return jsonResult({
53
+ network: session.network,
54
+ address: session.address,
55
+ balances,
56
+ });
57
+ }
58
+ export async function handleDeployAccount() {
59
+ const session = requireSession();
60
+ const { wallet } = await initSDKAndWallet(session);
61
+ const deployed = await wallet.isDeployed();
62
+ if (deployed) {
63
+ return jsonResult({
64
+ alreadyDeployed: true,
65
+ address: session.address,
66
+ network: session.network,
67
+ message: "Account is already deployed. No action needed.",
68
+ });
69
+ }
70
+ const tx = await wallet.deploy();
71
+ await tx.wait();
72
+ return jsonResult({
73
+ alreadyDeployed: false,
74
+ success: true,
75
+ address: session.address,
76
+ network: session.network,
77
+ txHash: tx.hash,
78
+ explorerUrl: tx.explorerUrl,
79
+ message: "Account deployed successfully. You can now send, swap, and stake.",
80
+ });
81
+ }
82
+ export async function handleSwapTokens(args) {
83
+ const session = requireSession();
84
+ const { wallet } = await initSDKAndWallet(session);
85
+ await wallet.ensureReady({ deploy: "if_needed" });
86
+ const tokenIn = await resolveToken(args.from_token);
87
+ const tokenOut = await resolveToken(args.to_token);
88
+ const parsedAmount = Amount.parse(args.amount, tokenIn);
89
+ const rawAmount = parsedAmount.toBase().toString();
90
+ const calldataResponse = await getCalldata(tokenIn, tokenOut, rawAmount, args.slippage ?? 0.5, session.address);
91
+ const tx = await wallet
92
+ .tx()
93
+ .approve(tokenIn, fromAddress(FIBROUS_ROUTER_ADDRESS), parsedAmount)
94
+ .add({
95
+ contractAddress: FIBROUS_ROUTER_ADDRESS,
96
+ entrypoint: "swap",
97
+ calldata: calldataResponse.calldata,
98
+ })
99
+ .send();
100
+ await tx.wait();
101
+ const outputAmount = Amount.fromRaw(calldataResponse.route.outputAmount, tokenOut);
102
+ const outputFormatted = outputAmount.toUnit();
103
+ return jsonResult({
104
+ success: true,
105
+ txHash: tx.hash,
106
+ explorerUrl: tx.explorerUrl,
107
+ amountIn: `${args.amount} ${tokenIn.symbol}`,
108
+ amountOut: `~${outputFormatted} ${tokenOut.symbol}`,
109
+ slippage: `${args.slippage ?? 0.5}%`,
110
+ });
111
+ }
112
+ export async function handleSendTokens(args) {
113
+ const session = requireSession();
114
+ const { wallet } = await initSDKAndWallet(session);
115
+ await wallet.ensureReady({ deploy: "if_needed" });
116
+ const token = await resolveTokenPreset(args.token);
117
+ if (!token) {
118
+ return textResult(`Token ${args.token} not found.`);
119
+ }
120
+ const amount = Amount.parse(args.amount, token);
121
+ const balance = await wallet.balanceOf(token);
122
+ if (balance.lt(amount)) {
123
+ return jsonResult({
124
+ success: false,
125
+ error: `Insufficient balance. You have: ${balance.toFormatted()}, attempting to send: ${amount.toFormatted()}`,
126
+ });
127
+ }
128
+ const tx = await wallet.transfer(token, [{ to: fromAddress(args.recipient), amount }]);
129
+ await tx.wait();
130
+ return jsonResult({
131
+ success: true,
132
+ txHash: tx.hash,
133
+ explorerUrl: tx.explorerUrl,
134
+ amount: `${args.amount} ${args.token.toUpperCase()}`,
135
+ to: args.recipient,
136
+ });
137
+ }
138
+ export async function handleGetTxStatus(args) {
139
+ const session = requireSession();
140
+ const { sdk } = await initSDKAndWallet(session);
141
+ const provider = sdk.getProvider();
142
+ const receipt = await provider.getTransactionReceipt(args.hash);
143
+ const actualFee = "actual_fee" in receipt ? String(receipt.actual_fee) : undefined;
144
+ const blockNumber = "block_number" in receipt ? receipt.block_number : undefined;
145
+ return jsonResult({
146
+ hash: args.hash,
147
+ status: receipt.statusReceipt,
148
+ actualFee,
149
+ blockNumber,
150
+ });
151
+ }
152
+ export async function handleStakeTokens(args) {
153
+ const session = requireSession();
154
+ const { wallet } = await initSDKAndWallet(session);
155
+ await wallet.ensureReady({ deploy: "if_needed" });
156
+ const result = await stakingService.stake(wallet, args.pool, args.amount);
157
+ return jsonResult({
158
+ success: true,
159
+ txHash: result.hash,
160
+ explorerUrl: result.explorerUrl,
161
+ amount: `${args.amount} STRK`,
162
+ pool: args.pool,
163
+ });
164
+ }
165
+ export async function handleUnstakeTokens(args) {
166
+ const session = requireSession();
167
+ const { wallet } = await initSDKAndWallet(session);
168
+ await wallet.ensureReady({ deploy: "if_needed" });
169
+ if (args.action === "intent") {
170
+ if (!args.amount) {
171
+ return textResult("Amount is required for exit intent.");
172
+ }
173
+ const result = await stakingService.exitPoolIntent(wallet, args.pool, args.amount);
174
+ return jsonResult({
175
+ success: true,
176
+ action: "exit_intent",
177
+ txHash: result.hash,
178
+ explorerUrl: result.explorerUrl,
179
+ message: "Exit intent declared. Wait for cooldown period, then call with action='exit'.",
180
+ });
181
+ }
182
+ // action === "exit"
183
+ const result = await stakingService.exitPool(wallet, args.pool);
184
+ return jsonResult({
185
+ success: true,
186
+ action: "exit_complete",
187
+ txHash: result.hash,
188
+ explorerUrl: result.explorerUrl,
189
+ message: "Tokens withdrawn from pool.",
190
+ });
191
+ }
192
+ export async function handleGetStakingInfo(args) {
193
+ const session = requireSession();
194
+ const { wallet } = await initSDKAndWallet(session);
195
+ const position = await stakingService.getPosition(wallet, args.pool);
196
+ if (!position) {
197
+ return jsonResult({
198
+ isMember: false,
199
+ pool: args.pool,
200
+ message: "Not a member of this pool.",
201
+ });
202
+ }
203
+ return jsonResult({
204
+ isMember: true,
205
+ pool: args.pool,
206
+ staked: position.staked,
207
+ rewards: position.rewards,
208
+ total: position.total,
209
+ unpooling: position.unpooling,
210
+ cooldownEndsAt: position.unpoolTime ? position.unpoolTime.toISOString() : null,
211
+ commissionPercent: position.commissionPercent,
212
+ });
213
+ }
214
+ export async function handleListPools(args) {
215
+ const session = requireSession();
216
+ const { sdk, wallet } = await initSDKAndWallet(session);
217
+ const found = findValidator(args.validator, session.network);
218
+ const stakerAddress = found ? found.stakerAddress.toString() : args.validator;
219
+ const pools = await stakingService.getValidatorPools(sdk, stakerAddress, wallet);
220
+ return jsonResult({
221
+ validator: found ? found.name : args.validator,
222
+ stakerAddress,
223
+ pools,
224
+ });
225
+ }
226
+ export async function handleListValidators() {
227
+ const session = requireSession();
228
+ const validators = getValidators(session.network);
229
+ return jsonResult({
230
+ network: session.network,
231
+ count: validators.length,
232
+ validators: validators.map((v) => ({
233
+ name: v.name,
234
+ stakerAddress: v.stakerAddress.toString(),
235
+ })),
236
+ });
237
+ }
238
+ export async function handleCompoundRewards(args) {
239
+ const session = requireSession();
240
+ const { wallet } = await initSDKAndWallet(session);
241
+ await wallet.ensureReady({ deploy: "if_needed" });
242
+ const result = await stakingService.compoundRewards(wallet, args.pool);
243
+ return jsonResult({
244
+ success: true,
245
+ txHash: result.hash,
246
+ explorerUrl: result.explorerUrl,
247
+ compounded: result.compounded,
248
+ });
249
+ }
250
+ export async function handleConfigAction(args) {
251
+ const configService = ConfigService.getInstance();
252
+ switch (args.action) {
253
+ case "set-rpc": {
254
+ if (!args.value)
255
+ return textResult("RPC URL value is required.");
256
+ configService.set("rpcUrl", args.value);
257
+ return jsonResult({ success: true, rpcUrl: args.value });
258
+ }
259
+ case "get-rpc": {
260
+ const rpcUrl = configService.get("rpcUrl");
261
+ return jsonResult({ rpcUrl: rpcUrl || "default (Cartridge RPC)" });
262
+ }
263
+ case "set-network": {
264
+ if (!args.value || !["mainnet", "sepolia"].includes(args.value)) {
265
+ return textResult("Network must be 'mainnet' or 'sepolia'.");
266
+ }
267
+ configService.set("network", args.value);
268
+ return jsonResult({ success: true, network: args.value });
269
+ }
270
+ case "set-gasless": // deprecated alias
271
+ case "set-gasfree": {
272
+ if (!args.value || !["on", "off"].includes(args.value)) {
273
+ return textResult("Gasfree mode must be 'on' or 'off'.");
274
+ }
275
+ const enabled = args.value === "on";
276
+ configService.set("gasfreeMode", enabled);
277
+ if (enabled)
278
+ configService.delete("gasToken"); // mutually exclusive
279
+ return jsonResult({
280
+ success: true,
281
+ gasfreeMode: enabled,
282
+ note: enabled
283
+ ? "Developer sponsors gas via AVNU Paymaster (requires API key + credits)"
284
+ : "Gasfree disabled",
285
+ });
286
+ }
287
+ case "set-gas-token": {
288
+ if (!args.value)
289
+ return textResult("Token symbol or 'off' is required.");
290
+ if (args.value.toLowerCase() === "off") {
291
+ configService.delete("gasToken");
292
+ return jsonResult({
293
+ success: true,
294
+ gasToken: null,
295
+ note: "Reverted to default STRK gas",
296
+ });
297
+ }
298
+ const upper = args.value.toUpperCase();
299
+ if (!GASLESS_SUPPORTED_TOKENS.includes(upper)) {
300
+ return textResult(`Unsupported token '${args.value}'. Supported: ${GASLESS_SUPPORTED_TOKENS.join(", ")}`);
301
+ }
302
+ configService.delete("gasfreeMode"); // mutually exclusive
303
+ configService.set("gasToken", upper);
304
+ return jsonResult({
305
+ success: true,
306
+ gasToken: upper,
307
+ note: `Gasless mode: user pays gas in ${upper} (no STRK needed, no API key required)`,
308
+ });
309
+ }
310
+ case "list": {
311
+ const all = configService.getAll();
312
+ const gasfreeMode = all.gasfreeMode === true;
313
+ const gasToken = all.gasToken;
314
+ let feeMode = "default (pays STRK)";
315
+ if (gasfreeMode)
316
+ feeMode = "gasfree (developer-sponsored via AVNU)";
317
+ else if (gasToken)
318
+ feeMode = `gasless (user pays in ${gasToken})`;
319
+ return jsonResult({ ...all, feeMode });
320
+ }
321
+ default:
322
+ return textResult(`Unknown action: ${args.action}`);
323
+ }
324
+ }
325
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/mcp/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function startMcpServer(): Promise<void>;
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAIA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAUpD"}
@@ -0,0 +1,13 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { registerTools } from "./tools.js";
4
+ export async function startMcpServer() {
5
+ const server = new McpServer({
6
+ name: "starkfi",
7
+ version: "0.1.0",
8
+ });
9
+ registerTools(server);
10
+ const transport = new StdioServerTransport();
11
+ await server.connect(transport);
12
+ }
13
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,cAAc;IACnC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC5B,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO;KAChB,CAAC,CAAC;IAEH,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerTools(server: McpServer): void;
3
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+DzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgSrD"}
@@ -0,0 +1,156 @@
1
+ import { z } from "zod";
2
+ import { handleGetAuthStatus, handleGetBalance, handleDeployAccount, handleGetSwapQuote, handleSwapTokens, handleSendTokens, handleGetTxStatus, handleStakeTokens, handleUnstakeTokens, handleGetStakingInfo, handleGetStakingOverview, handleListPools, handleListValidators, handleCompoundRewards, handleConfigAction, handleListLendingPools, handleGetLendingPosition, handleSupplyAssets, handleWithdrawAssets, handleBorrowAssets, handleRepayDebt, } from "./handlers/index.js";
3
+ import { StarkfiError } from "../lib/errors.js";
4
+ // Standardised error handling wrapper for all MCP tools.
5
+ function withErrorHandling(fn) {
6
+ return async (...args) => {
7
+ try {
8
+ return await fn(...args);
9
+ }
10
+ catch (error) {
11
+ const isStarkfiError = error instanceof StarkfiError;
12
+ const message = error instanceof Error ? error.message : String(error);
13
+ return {
14
+ content: [
15
+ {
16
+ type: "text",
17
+ text: JSON.stringify({
18
+ success: false,
19
+ error: message,
20
+ code: isStarkfiError ? error.code : "UNKNOWN_ERROR",
21
+ ...(isStarkfiError && error.details
22
+ ? { details: error.details }
23
+ : {}),
24
+ }, null, 2),
25
+ },
26
+ ],
27
+ };
28
+ }
29
+ };
30
+ }
31
+ export function registerTools(server) {
32
+ // --- Auth & Generic Info ---
33
+ server.tool("get_auth_status", "Check authentication status and Fibrous API health on Starknet. Use this to verify the user's active wallet.", {}, { readOnlyHint: true, destructiveHint: false }, withErrorHandling(handleGetAuthStatus));
34
+ server.tool("get_tx_status", "Check Starknet transaction status by hash. Use this to verify if a recently submitted transaction has been accepted on L2 or L1.", {
35
+ hash: z.string().describe("Transaction hash (0x...)"),
36
+ }, { readOnlyHint: true, destructiveHint: false }, withErrorHandling(handleGetTxStatus));
37
+ // --- Wallet & Assets ---
38
+ server.tool("get_balance", "Get native token and ERC-20 token balances on Starknet for the authorized user.", {
39
+ token: z
40
+ .string()
41
+ .optional()
42
+ .describe("Specific token symbol (e.g. 'STRK', 'ETH', 'USDC'). Omit to fetch all balances."),
43
+ }, { readOnlyHint: true, destructiveHint: false }, withErrorHandling(handleGetBalance));
44
+ server.tool("deploy_account", "Deploy the Starknet smart contract account on-chain. Required once before sending transactions. Safe to call multiple times (idempotent) — returns status if already deployed.", {}, { readOnlyHint: false, destructiveHint: true, idempotentHint: true }, withErrorHandling(handleDeployAccount));
45
+ server.tool("send_tokens", "Transfer tokens to a recipient on Starknet. Simulates the transfer before broadcasting to catch insufficient funds early.", {
46
+ amount: z.string().describe("Amount to send (e.g. '0.1', '100')"),
47
+ token: z.string().describe("Token symbol (e.g. 'STRK', 'ETH', 'USDC')"),
48
+ recipient: z.string().describe("Recipient Starknet address (0x...)"),
49
+ }, { readOnlyHint: false, destructiveHint: true, idempotentHint: false }, withErrorHandling(handleSendTokens));
50
+ // --- Trading (Fibrous API) ---
51
+ server.tool("get_swap_quote", "Get an expected output and route from Fibrous *without* executing the swap. ALWAYS use this BEFORE calling swap_tokens so the user can review the expected output amount and slippage.", {
52
+ amount: z.string().describe("Amount to swap in (e.g. '0.1', '100')"),
53
+ from_token: z.string().describe("Source token symbol to sell (e.g. 'ETH', 'USDC')"),
54
+ to_token: z.string().describe("Destination token symbol to buy (e.g. 'STRK', 'DAI')"),
55
+ }, { readOnlyHint: true, destructiveHint: false }, withErrorHandling(handleGetSwapQuote));
56
+ server.tool("swap_tokens", "Execute a token swap on Starknet using Fibrous aggregation. Finds optimal route and simulates before execution. ONLY call this after showing the user a quote via get_swap_quote.", {
57
+ amount: z.string().describe("Amount to swap in (e.g. '0.1', '100')"),
58
+ from_token: z.string().describe("Source token symbol to sell (e.g. 'ETH', 'STRK')"),
59
+ to_token: z.string().describe("Destination token symbol to buy (e.g. 'USDC', 'DAI')"),
60
+ slippage: z.number().optional().describe("Slippage tolerance % (default: 0.5)"),
61
+ }, { readOnlyHint: false, destructiveHint: true, idempotentHint: false }, withErrorHandling(handleSwapTokens));
62
+ // --- Staking ---
63
+ server.tool("list_validators", "List all known Starknet staking validators. Use this FIRST to see available validators and their names before trying to find pools.", {}, { readOnlyHint: true, destructiveHint: false }, withErrorHandling(handleListValidators));
64
+ server.tool("list_pools", "List delegation pools for a specific validator. Look up a validator name via list_validators first.", {
65
+ validator: z
66
+ .string()
67
+ .describe("Validator name (e.g. 'Karnot', 'Kakarot') or staker address. Supports partial matches."),
68
+ }, { readOnlyHint: true, destructiveHint: false }, withErrorHandling(handleListPools));
69
+ server.tool("get_staking_info", "Get staking position info (staked balance, unclaimed rewards, total balance, commission, unpooling cooldown) for a specific pool contract.", {
70
+ pool: z.string().describe("Staking pool contract address (0x...)"),
71
+ }, { readOnlyHint: true, destructiveHint: false }, withErrorHandling(handleGetStakingInfo));
72
+ server.tool("get_staking_overview", "Scan ALL known validators and pools to return a consolidated staking dashboard with total staked, total rewards, total value, and per-pool breakdown. Use this to give the user a full picture of their staking portfolio.", {}, { readOnlyHint: true, destructiveHint: false }, withErrorHandling(handleGetStakingOverview));
73
+ server.tool("stake_tokens", "Stake STRK in a delegation pool on Starknet. Smart stake: auto-detects whether the user needs to enter the pool or just add to an existing delegation.", {
74
+ amount: z.string().describe("Amount of STRK to stake (e.g. '100')"),
75
+ pool: z.string().describe("Staking pool contract address (0x...)"),
76
+ }, { readOnlyHint: false, destructiveHint: true, idempotentHint: false }, withErrorHandling(handleStakeTokens));
77
+ server.tool("unstake_tokens", "Unstake STRK from a pool. Unstaking is a TWO-STEP process: 1. call with action='intent', 2. wait for cooldown, 3. call with action='exit' to complete withdrawal.", {
78
+ action: z
79
+ .enum(["intent", "exit"])
80
+ .describe("'intent' strictly starts the unstaking process, 'exit' completes withdrawal after cooldown."),
81
+ pool: z.string().describe("Staking pool contract address (0x...)"),
82
+ amount: z
83
+ .string()
84
+ .optional()
85
+ .describe("Amount of STRK to unstake in STRK (ONLY required when action='intent')"),
86
+ }, { readOnlyHint: false, destructiveHint: true, idempotentHint: false }, withErrorHandling(handleUnstakeTokens));
87
+ server.tool("compound_rewards", "Atomically claim staking rewards and re-stake them recursively into the same pool in a single transaction (compound interest).", {
88
+ pool: z.string().describe("Staking pool contract address (0x...)"),
89
+ }, { readOnlyHint: false, destructiveHint: true, idempotentHint: false }, withErrorHandling(handleCompoundRewards));
90
+ // --- Config / Utilities ---
91
+ server.tool("config_action", "View and modify starkfi global configuration such as active network, RPC URL, and Gas Payment mechanisms.", {
92
+ action: z
93
+ .enum([
94
+ "list",
95
+ "set-rpc",
96
+ "get-rpc",
97
+ "set-network",
98
+ "set-gasfree",
99
+ "set-gas-token",
100
+ "set-gasless",
101
+ ])
102
+ .describe("list: view all. set-gasfree: dev pays gas using AVNU credits. set-gas-token: user pays gas in ERC20 token instead of STRK."),
103
+ value: z
104
+ .string()
105
+ .optional()
106
+ .describe("set-gasfree: 'on'/'off'. set-gas-token: symbol 'USDC'/'ETH' or 'off'. set-rpc: URL string. set-network: 'mainnet'/'sepolia'."),
107
+ }, { readOnlyHint: false, destructiveHint: false }, withErrorHandling(handleConfigAction));
108
+ // --- Lending (Vesu V2) ---
109
+ server.tool("list_lending_pools", "List available Vesu V2 lending pools on Starknet with their supported collateral/debt pairs. Use this FIRST to discover available pools before supplying, borrowing, or checking positions.", {
110
+ name: z
111
+ .string()
112
+ .optional()
113
+ .describe("Filter pools by name (partial match). Omit to list all."),
114
+ }, { readOnlyHint: true, destructiveHint: false }, withErrorHandling(handleListLendingPools));
115
+ server.tool("get_lending_position", "Get the user's lending position (supplied collateral and outstanding debt) in a specific Vesu pool.", {
116
+ pool: z
117
+ .string()
118
+ .describe("Pool name (e.g. 'Genesis', 'Re7') or contract address (0x...)"),
119
+ collateral_token: z.string().describe("Collateral token symbol (e.g. 'ETH', 'STRK')"),
120
+ debt_token: z.string().describe("Debt token symbol (e.g. 'USDC', 'USDT')"),
121
+ }, { readOnlyHint: true, destructiveHint: false }, withErrorHandling(handleGetLendingPosition));
122
+ server.tool("supply_assets", "Supply (lend) tokens into a Vesu V2 pool to earn interest. The tokens are deposited into the pool's ERC-4626 vToken vault.", {
123
+ pool: z
124
+ .string()
125
+ .describe("Pool name (e.g. 'Genesis', 'Re7') or contract address (0x...)"),
126
+ amount: z.string().describe("Amount to supply (e.g. '100', '0.5')"),
127
+ token: z.string().describe("Token symbol to supply (e.g. 'STRK', 'ETH', 'USDC')"),
128
+ }, { readOnlyHint: false, destructiveHint: true, idempotentHint: false }, withErrorHandling(handleSupplyAssets));
129
+ server.tool("withdraw_assets", "Withdraw previously supplied tokens from a Vesu V2 lending pool.", {
130
+ pool: z
131
+ .string()
132
+ .describe("Pool name (e.g. 'Genesis', 'Re7') or contract address (0x...)"),
133
+ amount: z.string().describe("Amount to withdraw (e.g. '100', '0.5')"),
134
+ token: z.string().describe("Token symbol to withdraw (e.g. 'STRK', 'ETH', 'USDC')"),
135
+ }, { readOnlyHint: false, destructiveHint: true, idempotentHint: false }, withErrorHandling(handleWithdrawAssets));
136
+ server.tool("borrow_assets", "Borrow tokens from a Vesu V2 pool by supplying collateral. Atomically deposits collateral and borrows the debt asset in a single transaction.", {
137
+ pool: z
138
+ .string()
139
+ .describe("Pool name (e.g. 'Genesis', 'Re7') or contract address (0x...)"),
140
+ collateral_amount: z.string().describe("Collateral amount to deposit (e.g. '1000')"),
141
+ collateral_token: z.string().describe("Collateral token symbol (e.g. 'STRK', 'ETH')"),
142
+ borrow_amount: z.string().describe("Amount to borrow (e.g. '100')"),
143
+ borrow_token: z.string().describe("Token to borrow (e.g. 'USDC', 'USDT')"),
144
+ }, { readOnlyHint: false, destructiveHint: true, idempotentHint: false }, withErrorHandling(handleBorrowAssets));
145
+ server.tool("repay_debt", "Repay borrowed tokens on an existing Vesu V2 lending position. Approves and repays the specified amount of debt.", {
146
+ pool: z
147
+ .string()
148
+ .describe("Pool name (e.g. 'Genesis', 'Re7') or contract address (0x...)"),
149
+ amount: z.string().describe("Amount to repay (e.g. '50', '100')"),
150
+ token: z.string().describe("Debt token to repay (e.g. 'USDC', 'USDT')"),
151
+ collateral_token: z
152
+ .string()
153
+ .describe("Collateral token of the position (e.g. 'ETH', 'STRK'). Needed to identify the position."),
154
+ }, { readOnlyHint: false, destructiveHint: true, idempotentHint: false }, withErrorHandling(handleRepayDebt));
155
+ }
156
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export declare function apiLogin(email: string): Promise<{
2
+ success: boolean;
3
+ message: string;
4
+ }>;
5
+ export interface VerifyResponse {
6
+ userId: string;
7
+ walletId: string;
8
+ walletAddress: string;
9
+ walletPublicKey: string;
10
+ token: string;
11
+ isExisting: boolean;
12
+ }
13
+ export declare function apiVerify(email: string, code: string): Promise<VerifyResponse>;
14
+ export declare function apiFindWallet(email: string, token: string): Promise<{
15
+ wallet: {
16
+ id: string;
17
+ address: string;
18
+ } | null;
19
+ }>;
20
+ export declare function apiCreateWallet(token: string, userId?: string): Promise<{
21
+ wallet: {
22
+ id: string;
23
+ address: string;
24
+ };
25
+ }>;
26
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/services/api/client.ts"],"names":[],"mappings":"AAuEA,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAE5F;AAED,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAEpF;AAED,wBAAsB,aAAa,CAClC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAAE,CAAC,CAE7D;AAED,wBAAsB,eAAe,CACpC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAEtD"}
@@ -0,0 +1,59 @@
1
+ import { ErrorCode, StarkfiError } from "../../lib/errors.js";
2
+ import { STARKFI_API_URL_DEFAULT } from "../../lib/config.js";
3
+ const REQUEST_TIMEOUT_MS = 30_000;
4
+ function getBaseUrl() {
5
+ return process.env.STARKFI_API_URL ?? STARKFI_API_URL_DEFAULT;
6
+ }
7
+ async function request(path, body, options) {
8
+ const url = `${getBaseUrl()}${path}`;
9
+ const timeout = options?.timeoutMs ?? REQUEST_TIMEOUT_MS;
10
+ const headers = {
11
+ "Content-Type": "application/json",
12
+ };
13
+ if (options?.token) {
14
+ headers.Authorization = `Bearer ${options.token}`;
15
+ }
16
+ const controller = new AbortController();
17
+ const timer = setTimeout(() => controller.abort(), timeout);
18
+ try {
19
+ const res = await fetch(url, {
20
+ method: "POST",
21
+ headers,
22
+ body: JSON.stringify(body),
23
+ signal: controller.signal,
24
+ });
25
+ if (!res.ok) {
26
+ const errorBody = await res
27
+ .json()
28
+ .catch(() => ({ error: { message: res.statusText } }));
29
+ const msg = errorBody?.error?.message ??
30
+ `API error (${res.status})`;
31
+ throw new StarkfiError(ErrorCode.NETWORK_ERROR, msg);
32
+ }
33
+ return (await res.json());
34
+ }
35
+ catch (error) {
36
+ if (error instanceof StarkfiError)
37
+ throw error;
38
+ if (error instanceof DOMException && error.name === "AbortError") {
39
+ throw new StarkfiError(ErrorCode.NETWORK_ERROR, `Request to ${path} timed out after ${timeout / 1000}s. Is starkfi-server running?`);
40
+ }
41
+ throw new StarkfiError(ErrorCode.NETWORK_ERROR, `Failed to connect to starkfi-server at ${getBaseUrl()}. Is the server running?`);
42
+ }
43
+ finally {
44
+ clearTimeout(timer);
45
+ }
46
+ }
47
+ export async function apiLogin(email) {
48
+ return request("/auth/login", { email });
49
+ }
50
+ export async function apiVerify(email, code) {
51
+ return request("/auth/verify", { email, code });
52
+ }
53
+ export async function apiFindWallet(email, token) {
54
+ return request("/wallet/find", { email }, { token });
55
+ }
56
+ export async function apiCreateWallet(token, userId) {
57
+ return request("/wallet/create", { userId }, { token });
58
+ }
59
+ //# sourceMappingURL=client.js.map