starkfi 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/LICENSE +1 -1
  2. package/MCP.md +292 -0
  3. package/README.md +424 -54
  4. package/dist/commands/auth/login.js +2 -2
  5. package/dist/commands/auth/login.js.map +1 -1
  6. package/dist/commands/auth/verify.d.ts.map +1 -1
  7. package/dist/commands/auth/verify.js +2 -2
  8. package/dist/commands/auth/verify.js.map +1 -1
  9. package/dist/commands/batch/batch.d.ts +3 -0
  10. package/dist/commands/batch/batch.d.ts.map +1 -0
  11. package/dist/commands/batch/batch.js +155 -0
  12. package/dist/commands/batch/batch.js.map +1 -0
  13. package/dist/commands/chain/tx-status.js +2 -2
  14. package/dist/commands/chain/tx-status.js.map +1 -1
  15. package/dist/commands/config/config.d.ts.map +1 -1
  16. package/dist/commands/config/config.js +23 -34
  17. package/dist/commands/config/config.js.map +1 -1
  18. package/dist/commands/lending/lending.d.ts +1 -0
  19. package/dist/commands/lending/lending.d.ts.map +1 -1
  20. package/dist/commands/lending/lending.js +197 -51
  21. package/dist/commands/lending/lending.js.map +1 -1
  22. package/dist/commands/portfolio/portfolio.d.ts +3 -0
  23. package/dist/commands/portfolio/portfolio.d.ts.map +1 -0
  24. package/dist/commands/portfolio/portfolio.js +76 -0
  25. package/dist/commands/portfolio/portfolio.js.map +1 -0
  26. package/dist/commands/staking/staking.d.ts +1 -1
  27. package/dist/commands/staking/staking.d.ts.map +1 -1
  28. package/dist/commands/staking/staking.js +144 -61
  29. package/dist/commands/staking/staking.js.map +1 -1
  30. package/dist/commands/trade/multi-swap.d.ts +3 -0
  31. package/dist/commands/trade/multi-swap.d.ts.map +1 -0
  32. package/dist/commands/trade/multi-swap.js +141 -0
  33. package/dist/commands/trade/multi-swap.js.map +1 -0
  34. package/dist/commands/trade/status.js +2 -2
  35. package/dist/commands/trade/status.js.map +1 -1
  36. package/dist/commands/trade/swap.d.ts.map +1 -1
  37. package/dist/commands/trade/swap.js +48 -12
  38. package/dist/commands/trade/swap.js.map +1 -1
  39. package/dist/commands/wallet/balance.d.ts.map +1 -1
  40. package/dist/commands/wallet/balance.js +20 -3
  41. package/dist/commands/wallet/balance.js.map +1 -1
  42. package/dist/commands/wallet/deploy.d.ts.map +1 -1
  43. package/dist/commands/wallet/deploy.js +2 -1
  44. package/dist/commands/wallet/deploy.js.map +1 -1
  45. package/dist/commands/wallet/send.d.ts.map +1 -1
  46. package/dist/commands/wallet/send.js +46 -9
  47. package/dist/commands/wallet/send.js.map +1 -1
  48. package/dist/index.js +162 -9
  49. package/dist/index.js.map +1 -1
  50. package/dist/lib/banner.d.ts +6 -0
  51. package/dist/lib/banner.d.ts.map +1 -0
  52. package/dist/lib/banner.js +78 -0
  53. package/dist/lib/banner.js.map +1 -0
  54. package/dist/lib/concurrency.d.ts +2 -0
  55. package/dist/lib/concurrency.d.ts.map +1 -0
  56. package/dist/lib/concurrency.js +21 -0
  57. package/dist/lib/concurrency.js.map +1 -0
  58. package/dist/lib/config.d.ts +0 -11
  59. package/dist/lib/config.d.ts.map +1 -1
  60. package/dist/lib/config.js +0 -20
  61. package/dist/lib/config.js.map +1 -1
  62. package/dist/lib/errors.d.ts +2 -0
  63. package/dist/lib/errors.d.ts.map +1 -1
  64. package/dist/lib/errors.js +2 -0
  65. package/dist/lib/errors.js.map +1 -1
  66. package/dist/lib/fetch.d.ts +4 -0
  67. package/dist/lib/fetch.d.ts.map +1 -0
  68. package/dist/lib/fetch.js +13 -0
  69. package/dist/lib/fetch.js.map +1 -0
  70. package/dist/lib/format.d.ts +12 -2
  71. package/dist/lib/format.d.ts.map +1 -1
  72. package/dist/lib/format.js +86 -23
  73. package/dist/lib/format.js.map +1 -1
  74. package/dist/lib/retry.d.ts +8 -0
  75. package/dist/lib/retry.d.ts.map +1 -0
  76. package/dist/lib/retry.js +25 -0
  77. package/dist/lib/retry.js.map +1 -0
  78. package/dist/lib/types.d.ts +6 -0
  79. package/dist/lib/types.d.ts.map +1 -0
  80. package/dist/lib/types.js +2 -0
  81. package/dist/lib/types.js.map +1 -0
  82. package/dist/lib/validation.d.ts +0 -12
  83. package/dist/lib/validation.d.ts.map +1 -1
  84. package/dist/lib/validation.js +1 -23
  85. package/dist/lib/validation.js.map +1 -1
  86. package/dist/mcp/handlers/batch.d.ts +13 -0
  87. package/dist/mcp/handlers/batch.d.ts.map +1 -0
  88. package/dist/mcp/handlers/batch.js +33 -0
  89. package/dist/mcp/handlers/batch.js.map +1 -0
  90. package/dist/mcp/handlers/config.d.ts +1 -1
  91. package/dist/mcp/handlers/config.d.ts.map +1 -1
  92. package/dist/mcp/handlers/config.js +11 -12
  93. package/dist/mcp/handlers/config.js.map +1 -1
  94. package/dist/mcp/handlers/index.d.ts +3 -0
  95. package/dist/mcp/handlers/index.d.ts.map +1 -1
  96. package/dist/mcp/handlers/index.js +3 -0
  97. package/dist/mcp/handlers/index.js.map +1 -1
  98. package/dist/mcp/handlers/lending.d.ts +12 -1
  99. package/dist/mcp/handlers/lending.d.ts.map +1 -1
  100. package/dist/mcp/handlers/lending.js +67 -23
  101. package/dist/mcp/handlers/lending.js.map +1 -1
  102. package/dist/mcp/handlers/multi-swap.d.ts +27 -0
  103. package/dist/mcp/handlers/multi-swap.d.ts.map +1 -0
  104. package/dist/mcp/handlers/multi-swap.js +73 -0
  105. package/dist/mcp/handlers/multi-swap.js.map +1 -0
  106. package/dist/mcp/handlers/portfolio.d.ts +7 -0
  107. package/dist/mcp/handlers/portfolio.d.ts.map +1 -0
  108. package/dist/mcp/handlers/portfolio.js +11 -0
  109. package/dist/mcp/handlers/portfolio.js.map +1 -0
  110. package/dist/mcp/handlers/staking.d.ts +13 -1
  111. package/dist/mcp/handlers/staking.d.ts.map +1 -1
  112. package/dist/mcp/handlers/staking.js +18 -5
  113. package/dist/mcp/handlers/staking.js.map +1 -1
  114. package/dist/mcp/handlers/trade.d.ts +1 -0
  115. package/dist/mcp/handlers/trade.d.ts.map +1 -1
  116. package/dist/mcp/handlers/trade.js +27 -13
  117. package/dist/mcp/handlers/trade.js.map +1 -1
  118. package/dist/mcp/handlers/wallet.d.ts +1 -0
  119. package/dist/mcp/handlers/wallet.d.ts.map +1 -1
  120. package/dist/mcp/handlers/wallet.js +24 -5
  121. package/dist/mcp/handlers/wallet.js.map +1 -1
  122. package/dist/mcp/server.d.ts.map +1 -1
  123. package/dist/mcp/server.js +45 -4
  124. package/dist/mcp/server.js.map +1 -1
  125. package/dist/mcp/tools/auth.d.ts +3 -0
  126. package/dist/mcp/tools/auth.d.ts.map +1 -0
  127. package/dist/mcp/tools/auth.js +17 -0
  128. package/dist/mcp/tools/auth.js.map +1 -0
  129. package/dist/mcp/tools/error-handling.d.ts +12 -0
  130. package/dist/mcp/tools/error-handling.d.ts.map +1 -0
  131. package/dist/mcp/tools/error-handling.js +28 -0
  132. package/dist/mcp/tools/error-handling.js.map +1 -0
  133. package/dist/mcp/tools/index.d.ts +11 -0
  134. package/dist/mcp/tools/index.d.ts.map +1 -0
  135. package/dist/mcp/tools/index.js +19 -0
  136. package/dist/mcp/tools/index.js.map +1 -0
  137. package/dist/mcp/tools/lending.d.ts +3 -0
  138. package/dist/mcp/tools/lending.d.ts.map +1 -0
  139. package/dist/mcp/tools/lending.js +71 -0
  140. package/dist/mcp/tools/lending.js.map +1 -0
  141. package/dist/mcp/tools/staking.d.ts +3 -0
  142. package/dist/mcp/tools/staking.d.ts.map +1 -0
  143. package/dist/mcp/tools/staking.js +50 -0
  144. package/dist/mcp/tools/staking.js.map +1 -0
  145. package/dist/mcp/tools/trade.d.ts +3 -0
  146. package/dist/mcp/tools/trade.d.ts.map +1 -0
  147. package/dist/mcp/tools/trade.js +63 -0
  148. package/dist/mcp/tools/trade.js.map +1 -0
  149. package/dist/mcp/tools/wallet.d.ts +3 -0
  150. package/dist/mcp/tools/wallet.d.ts.map +1 -0
  151. package/dist/mcp/tools/wallet.js +27 -0
  152. package/dist/mcp/tools/wallet.js.map +1 -0
  153. package/dist/mcp/tools.d.ts.map +1 -1
  154. package/dist/mcp/tools.js +125 -41
  155. package/dist/mcp/tools.js.map +1 -1
  156. package/dist/services/api/client.d.ts +0 -12
  157. package/dist/services/api/client.d.ts.map +1 -1
  158. package/dist/services/api/client.js +7 -16
  159. package/dist/services/api/client.js.map +1 -1
  160. package/dist/services/auth/session.d.ts +1 -7
  161. package/dist/services/auth/session.d.ts.map +1 -1
  162. package/dist/services/auth/session.js +21 -0
  163. package/dist/services/auth/session.js.map +1 -1
  164. package/dist/services/batch/batch.d.ts +35 -0
  165. package/dist/services/batch/batch.d.ts.map +1 -0
  166. package/dist/services/batch/batch.js +110 -0
  167. package/dist/services/batch/batch.js.map +1 -0
  168. package/dist/services/config/config.d.ts +3 -0
  169. package/dist/services/config/config.d.ts.map +1 -1
  170. package/dist/services/config/config.js +30 -1
  171. package/dist/services/config/config.js.map +1 -1
  172. package/dist/services/fibrous/config.d.ts +4 -0
  173. package/dist/services/fibrous/config.d.ts.map +1 -0
  174. package/dist/services/fibrous/config.js +4 -0
  175. package/dist/services/fibrous/config.js.map +1 -0
  176. package/dist/services/fibrous/health.js +1 -1
  177. package/dist/services/fibrous/health.js.map +1 -1
  178. package/dist/services/fibrous/route.d.ts +15 -6
  179. package/dist/services/fibrous/route.d.ts.map +1 -1
  180. package/dist/services/fibrous/route.js +64 -3
  181. package/dist/services/fibrous/route.js.map +1 -1
  182. package/dist/services/portfolio/portfolio.d.ts +31 -0
  183. package/dist/services/portfolio/portfolio.d.ts.map +1 -0
  184. package/dist/services/portfolio/portfolio.js +104 -0
  185. package/dist/services/portfolio/portfolio.js.map +1 -0
  186. package/dist/services/simulate/simulate.d.ts +10 -0
  187. package/dist/services/simulate/simulate.d.ts.map +1 -0
  188. package/dist/services/simulate/simulate.js +57 -0
  189. package/dist/services/simulate/simulate.js.map +1 -0
  190. package/dist/services/staking/staking.d.ts +9 -30
  191. package/dist/services/staking/staking.d.ts.map +1 -1
  192. package/dist/services/staking/staking.js +44 -52
  193. package/dist/services/staking/staking.js.map +1 -1
  194. package/dist/services/starkzap/client.d.ts +2 -1
  195. package/dist/services/starkzap/client.d.ts.map +1 -1
  196. package/dist/services/starkzap/client.js +39 -21
  197. package/dist/services/starkzap/client.js.map +1 -1
  198. package/dist/services/starkzap/config.d.ts +6 -0
  199. package/dist/services/starkzap/config.d.ts.map +1 -0
  200. package/dist/services/starkzap/config.js +13 -0
  201. package/dist/services/starkzap/config.js.map +1 -0
  202. package/dist/services/tokens/balances.d.ts.map +1 -1
  203. package/dist/services/tokens/balances.js +8 -8
  204. package/dist/services/tokens/balances.js.map +1 -1
  205. package/dist/services/tokens/tokens.d.ts +2 -3
  206. package/dist/services/tokens/tokens.d.ts.map +1 -1
  207. package/dist/services/tokens/tokens.js +3 -8
  208. package/dist/services/tokens/tokens.js.map +1 -1
  209. package/dist/services/vesu/api.d.ts +28 -0
  210. package/dist/services/vesu/api.d.ts.map +1 -0
  211. package/dist/services/vesu/api.js +91 -0
  212. package/dist/services/vesu/api.js.map +1 -0
  213. package/dist/services/vesu/config.d.ts +9 -0
  214. package/dist/services/vesu/config.d.ts.map +1 -0
  215. package/dist/services/vesu/config.js +32 -0
  216. package/dist/services/vesu/config.js.map +1 -0
  217. package/dist/services/vesu/index.d.ts +2 -0
  218. package/dist/services/vesu/index.d.ts.map +1 -1
  219. package/dist/services/vesu/index.js +2 -0
  220. package/dist/services/vesu/index.js.map +1 -1
  221. package/dist/services/vesu/lending.d.ts +9 -5
  222. package/dist/services/vesu/lending.d.ts.map +1 -1
  223. package/dist/services/vesu/lending.js +176 -60
  224. package/dist/services/vesu/lending.js.map +1 -1
  225. package/dist/services/vesu/pools.d.ts +6 -12
  226. package/dist/services/vesu/pools.d.ts.map +1 -1
  227. package/dist/services/vesu/pools.js +11 -31
  228. package/dist/services/vesu/pools.js.map +1 -1
  229. package/package.json +88 -82
  230. package/skills/README.md +59 -0
  231. package/skills/authenticate-wallet/SKILL.md +119 -0
  232. package/skills/balance/SKILL.md +80 -0
  233. package/skills/batch/SKILL.md +118 -0
  234. package/skills/config/SKILL.md +144 -0
  235. package/skills/lending/SKILL.md +209 -0
  236. package/skills/multi-swap/SKILL.md +95 -0
  237. package/skills/portfolio/SKILL.md +82 -0
  238. package/skills/send/SKILL.md +82 -0
  239. package/skills/staking/SKILL.md +188 -0
  240. package/skills/trade/SKILL.md +92 -0
@@ -0,0 +1,78 @@
1
+ import readline from "node:readline";
2
+ import chalk from "chalk";
3
+ // A stylish ASCII representation of STARKFI
4
+ // We'll create a simple horizontal wiping animation to reveal it,
5
+ // combined with some color shifting.
6
+ const ASCII_LOGO = [
7
+ " ____ _ _ __ _ ",
8
+ " / ___|| |_ __ _ _ __| | __ / _(_) ",
9
+ " \\___ \\| __/ _` | '__| |/ /| |_| | ",
10
+ " ___) | || (_| | | | < | _| | ",
11
+ " |____/ \\__\\__,_|_| |_|\\_\\|_| |_| ",
12
+ " ",
13
+ " Defi CLI for Starknet ",
14
+ ];
15
+ // Colors for the animation, moving from a subtle blue to a vivid starknet dark blue/purple
16
+ const COLORS = [
17
+ chalk.hex("#1E3A8A"), // tail
18
+ chalk.hex("#3B82F6"),
19
+ chalk.hex("#60A5FA"),
20
+ chalk.hex("#93C5FD"), // head
21
+ chalk.white.bold, // lead
22
+ ];
23
+ /**
24
+ * Renders the animated ASCII banner by wiping it in from left to right.
25
+ * Only blocks for ~1 second total to respect user startup expectations.
26
+ */
27
+ export async function showBanner() {
28
+ // Only run if stdout is a TTY (interactive terminal)
29
+ if (!process.stdout.isTTY)
30
+ return;
31
+ return new Promise((resolve) => {
32
+ // Hide the cursor during animation
33
+ process.stdout.write("\x1B[?25l");
34
+ let frame = 0;
35
+ // Width of the longest line
36
+ const maxWidth = Math.max(...ASCII_LOGO.map((line) => line.length));
37
+ // Ensure we add enough frames to fully reveal the logo plus leave it for a moment
38
+ const totalFrames = maxWidth + 10;
39
+ // Target 60fps (1000/60 ms per frame), keeping total time ~1.2 seconds max.
40
+ const frameRateMs = 20;
41
+ const interval = setInterval(() => {
42
+ // Clear the screen starting from where we are
43
+ readline.cursorTo(process.stdout, 0, 0);
44
+ readline.clearScreenDown(process.stdout);
45
+ let output = "\n"; // Padding at the top
46
+ for (const line of ASCII_LOGO) {
47
+ let lineOutput = "";
48
+ for (let i = 0; i < line.length; i++) {
49
+ const char = line[i] || " ";
50
+ // Calculate distance from the 'wipe' front
51
+ const distance = frame - i;
52
+ if (distance < 0) {
53
+ // Not revealed yet
54
+ lineOutput += " ";
55
+ }
56
+ else if (distance < COLORS.length) {
57
+ // Highlight tip of the wipe
58
+ lineOutput += COLORS[distance](char);
59
+ }
60
+ else {
61
+ // Fully revealed (base color)
62
+ lineOutput += chalk.hex("#4F46E5")(char); // Indigo
63
+ }
64
+ }
65
+ output += lineOutput + "\n";
66
+ }
67
+ process.stdout.write(output);
68
+ frame++;
69
+ if (frame >= totalFrames) {
70
+ clearInterval(interval);
71
+ // Restore cursor
72
+ process.stdout.write("\x1B[?25h");
73
+ resolve();
74
+ }
75
+ }, frameRateMs);
76
+ });
77
+ }
78
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/lib/banner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runConcurrent<T, R>(items: T[], concurrency: number, fn: (item: T) => Promise<R | undefined>): Promise<R[]>;
2
+ //# sourceMappingURL=concurrency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/lib/concurrency.ts"],"names":[],"mappings":"AACA,wBAAsB,aAAa,CAAC,CAAC,EAAE,CAAC,EACvC,KAAK,EAAE,CAAC,EAAE,EACV,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,GACrC,OAAO,CAAC,CAAC,EAAE,CAAC,CAqBd"}
@@ -0,0 +1,21 @@
1
+ // Sliding-window concurrency — starts a new task as soon as one completes.
2
+ export async function runConcurrent(items, concurrency, fn) {
3
+ const results = [];
4
+ let index = 0;
5
+ const worker = async () => {
6
+ while (index < items.length) {
7
+ const current = index++;
8
+ const item = items[current];
9
+ if (!item)
10
+ continue;
11
+ const result = await fn(item);
12
+ if (result !== undefined) {
13
+ results.push(result);
14
+ }
15
+ }
16
+ };
17
+ const workers = Array.from({ length: Math.min(concurrency, items.length) }, () => worker());
18
+ await Promise.all(workers);
19
+ return results;
20
+ }
21
+ //# sourceMappingURL=concurrency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/lib/concurrency.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,KAAU,EACV,WAAmB,EACnB,EAAuC;IAEvC,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACzB,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5F,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3B,OAAO,OAAO,CAAC;AAChB,CAAC"}
@@ -1,16 +1,5 @@
1
- export declare const FIBROUS_BASE_URL = "https://api.fibrous.finance/starknet";
2
- export declare const FIBROUS_GRAPH_URL = "https://graph.fibrous.finance/starknet";
3
- export declare const DEFAULT_SLIPPAGE = 1;
4
- export declare const AVNU_PAYMASTER_URL = "https://starknet.paymaster.avnu.fi";
5
- export declare const AVNU_PAYMASTER_SEPOLIA_URL = "https://sepolia.paymaster.avnu.fi";
6
- export declare const GAS_TOKEN_ADDRESSES: Record<string, string>;
7
- export declare const GASLESS_SUPPORTED_TOKENS: string[];
8
1
  export declare const STARKFI_API_URL_DEFAULT = "http://localhost:3001";
9
- export declare const DEFAULT_NETWORK: "mainnet";
10
- export declare const FIBROUS_ROUTER_ADDRESS = "0x00f6f4CF62E3C010E0aC2451cC7807b5eEc19a40b0FaaCd00CCA3914280FDf5a";
11
2
  export declare const DATA_DIR: string;
12
- export declare const CACHE_DIR: string;
13
3
  export declare const CONFIG_DIR: string;
14
- export declare const CACHE_TTL: number;
15
4
  export declare function explorerUrl(hash: string, network: "mainnet" | "sepolia"): string;
16
5
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,yCAAyC,CAAC;AACvE,eAAO,MAAM,iBAAiB,2CAA2C,CAAC;AAC1E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,eAAO,MAAM,kBAAkB,uCAAuC,CAAC;AACvE,eAAO,MAAM,0BAA0B,sCAAsC,CAAC;AAI9E,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMtD,CAAC;AAEF,eAAO,MAAM,wBAAwB,UAAmC,CAAC;AAEzE,eAAO,MAAM,uBAAuB,0BAA0B,CAAC;AAE/D,eAAO,MAAM,eAAe,EAAG,SAAkB,CAAC;AAElD,eAAO,MAAM,sBAAsB,uEACkC,CAAC;AAEtE,eAAO,MAAM,QAAQ,QAAa,CAAC;AACnC,eAAO,MAAM,SAAS,QAAc,CAAC;AACrC,eAAO,MAAM,UAAU,QAAe,CAAC;AACvC,eAAO,MAAM,SAAS,QAAsB,CAAC;AAG7C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAIhF"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,uBAAuB,0BAA0B,CAAC;AAE/D,eAAO,MAAM,QAAQ,QAAa,CAAC;AACnC,eAAO,MAAM,UAAU,QAAe,CAAC;AAEvC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAIhF"}
@@ -1,28 +1,8 @@
1
1
  import envPaths from "env-paths";
2
2
  const paths = envPaths("starkfi");
3
- export const FIBROUS_BASE_URL = "https://api.fibrous.finance/starknet";
4
- export const FIBROUS_GRAPH_URL = "https://graph.fibrous.finance/starknet";
5
- export const DEFAULT_SLIPPAGE = 1;
6
- export const AVNU_PAYMASTER_URL = "https://starknet.paymaster.avnu.fi";
7
- export const AVNU_PAYMASTER_SEPOLIA_URL = "https://sepolia.paymaster.avnu.fi";
8
- // Tokens accepted by AVNU Paymaster for Gasless mode (user pays gas in these tokens).
9
- // Maps uppercase symbol → on-chain Starknet address.
10
- export const GAS_TOKEN_ADDRESSES = {
11
- ETH: "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",
12
- STRK: "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d",
13
- USDC: "0x033068f6539f8e6e6b131e6b2b814e6c34a5224bc66947c47dab9dfee93b35fb",
14
- USDT: "0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8",
15
- DAI: "0x05574eb6b8789a91466f902c380d978e472db68170ff82a5b650b95a58ddf4ad",
16
- };
17
- export const GASLESS_SUPPORTED_TOKENS = Object.keys(GAS_TOKEN_ADDRESSES);
18
3
  export const STARKFI_API_URL_DEFAULT = "http://localhost:3001";
19
- export const DEFAULT_NETWORK = "mainnet";
20
- export const FIBROUS_ROUTER_ADDRESS = "0x00f6f4CF62E3C010E0aC2451cC7807b5eEc19a40b0FaaCd00CCA3914280FDf5a";
21
4
  export const DATA_DIR = paths.data;
22
- export const CACHE_DIR = paths.cache;
23
5
  export const CONFIG_DIR = paths.config;
24
- export const CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours
25
- // Returns the Voyager block explorer URL for a transaction hash.
26
6
  export function explorerUrl(hash, network) {
27
7
  const base = network === "mainnet" ? "https://voyager.online" : "https://sepolia.voyager.online";
28
8
  return `${base}/tx/${hash}`;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;AAElC,MAAM,CAAC,MAAM,gBAAgB,GAAG,sCAAsC,CAAC;AACvE,MAAM,CAAC,MAAM,iBAAiB,GAAG,wCAAwC,CAAC;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,MAAM,CAAC,MAAM,kBAAkB,GAAG,oCAAoC,CAAC;AACvE,MAAM,CAAC,MAAM,0BAA0B,GAAG,mCAAmC,CAAC;AAE9E,sFAAsF;AACtF,qDAAqD;AACrD,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IAC1D,GAAG,EAAE,oEAAoE;IACzE,IAAI,EAAE,oEAAoE;IAC1E,IAAI,EAAE,oEAAoE;IAC1E,IAAI,EAAE,oEAAoE;IAC1E,GAAG,EAAE,oEAAoE;CACzE,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;AAEzE,MAAM,CAAC,MAAM,uBAAuB,GAAG,uBAAuB,CAAC;AAE/D,MAAM,CAAC,MAAM,eAAe,GAAG,SAAkB,CAAC;AAElD,MAAM,CAAC,MAAM,sBAAsB,GAClC,oEAAoE,CAAC;AAEtE,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;AACrC,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AAEzD,iEAAiE;AACjE,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAA8B;IACvE,MAAM,IAAI,GACT,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,gCAAgC,CAAC;IACrF,OAAO,GAAG,IAAI,OAAO,IAAI,EAAE,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;AAElC,MAAM,CAAC,MAAM,uBAAuB,GAAG,uBAAuB,CAAC;AAE/D,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;AAEvC,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAA8B;IACvE,MAAM,IAAI,GACT,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,gCAAgC,CAAC;IACrF,OAAO,GAAG,IAAI,OAAO,IAAI,EAAE,CAAC;AAC7B,CAAC"}
@@ -21,6 +21,8 @@ export declare enum ErrorCode {
21
21
  INVALID_AMOUNT = "INVALID_AMOUNT",
22
22
  NETWORK_ERROR = "NETWORK_ERROR",
23
23
  RATE_LIMITED = "RATE_LIMITED",
24
+ VALIDATOR_NOT_FOUND = "VALIDATOR_NOT_FOUND",
25
+ BATCH_LIMIT_EXCEEDED = "BATCH_LIMIT_EXCEEDED",
24
26
  UNKNOWN = "UNKNOWN"
25
27
  }
26
28
  export declare class StarkfiError extends Error {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS;IACpB,aAAa,kBAAkB;IAC/B,WAAW,gBAAgB;IAC3B,eAAe,oBAAoB;IACnC,mBAAmB,wBAAwB;IAC3C,gBAAgB,qBAAqB;IACrC,oBAAoB,yBAAyB;IAC7C,SAAS,cAAc;IACvB,YAAY,iBAAiB;IAC7B,iBAAiB,sBAAsB;IACvC,WAAW,gBAAgB;IAC3B,cAAc,mBAAmB;IACjC,iBAAiB,sBAAsB;IACvC,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;IACjC,aAAa,kBAAkB;IAC/B,YAAY,iBAAiB;IAC7B,OAAO,YAAY;CACnB;AAED,qBAAa,YAAa,SAAQ,KAAK;aAErB,IAAI,EAAE,SAAS;aAEf,OAAO,CAAC,EAAE,OAAO;gBAFjB,IAAI,EAAE,SAAS,EAC/B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,OAAO,YAAA,EACjC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;IAM9B,MAAM;;;;;;CAQN"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS;IACpB,aAAa,kBAAkB;IAC/B,WAAW,gBAAgB;IAC3B,eAAe,oBAAoB;IACnC,mBAAmB,wBAAwB;IAC3C,gBAAgB,qBAAqB;IACrC,oBAAoB,yBAAyB;IAC7C,SAAS,cAAc;IACvB,YAAY,iBAAiB;IAC7B,iBAAiB,sBAAsB;IACvC,WAAW,gBAAgB;IAC3B,cAAc,mBAAmB;IACjC,iBAAiB,sBAAsB;IACvC,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;IACjC,aAAa,kBAAkB;IAC/B,YAAY,iBAAiB;IAC7B,mBAAmB,wBAAwB;IAC3C,oBAAoB,yBAAyB;IAC7C,OAAO,YAAY;CACnB;AAED,qBAAa,YAAa,SAAQ,KAAK;aAErB,IAAI,EAAE,SAAS;aAEf,OAAO,CAAC,EAAE,OAAO;gBAFjB,IAAI,EAAE,SAAS,EAC/B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,OAAO,YAAA,EACjC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;IAM9B,MAAM;;;;;;CAQN"}
@@ -22,6 +22,8 @@ export var ErrorCode;
22
22
  ErrorCode["INVALID_AMOUNT"] = "INVALID_AMOUNT";
23
23
  ErrorCode["NETWORK_ERROR"] = "NETWORK_ERROR";
24
24
  ErrorCode["RATE_LIMITED"] = "RATE_LIMITED";
25
+ ErrorCode["VALIDATOR_NOT_FOUND"] = "VALIDATOR_NOT_FOUND";
26
+ ErrorCode["BATCH_LIMIT_EXCEEDED"] = "BATCH_LIMIT_EXCEEDED";
25
27
  ErrorCode["UNKNOWN"] = "UNKNOWN";
26
28
  })(ErrorCode || (ErrorCode = {}));
27
29
  export class StarkfiError extends Error {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,SAwBX;AAxBD,WAAY,SAAS;IACpB,4CAA+B,CAAA;IAC/B,wCAA2B,CAAA;IAC3B,gDAAmC,CAAA;IACnC,wDAA2C,CAAA;IAC3C,kDAAqC,CAAA;IACrC,0DAA6C,CAAA;IAC7C,oCAAuB,CAAA;IACvB,0CAA6B,CAAA;IAC7B,oDAAuC,CAAA;IACvC,wCAA2B,CAAA;IAC3B,8CAAiC,CAAA;IACjC,oDAAuC,CAAA;IACvC,8CAAiC,CAAA;IACjC,8CAAiC,CAAA;IACjC,8CAAiC,CAAA;IACjC,8CAAiC,CAAA;IACjC,gDAAmC,CAAA;IACnC,8CAAiC,CAAA;IACjC,gDAAmC,CAAA;IACnC,8CAAiC,CAAA;IACjC,4CAA+B,CAAA;IAC/B,0CAA6B,CAAA;IAC7B,gCAAmB,CAAA;AACpB,CAAC,EAxBW,SAAS,KAAT,SAAS,QAwBpB;AAED,MAAM,OAAO,YAAa,SAAQ,KAAK;IAErB;IAEA;IAHjB,YACiB,IAAe,EAC/B,OAAe,EACC,OAAiB,EACjC,OAA6B;QAE7B,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QALR,SAAI,GAAJ,IAAI,CAAW;QAEf,YAAO,GAAP,OAAO,CAAU;QAIjC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC5B,CAAC;IAED,MAAM;QACL,OAAO;YACN,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClD,CAAC;IACH,CAAC;CACD"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,SA0BX;AA1BD,WAAY,SAAS;IACpB,4CAA+B,CAAA;IAC/B,wCAA2B,CAAA;IAC3B,gDAAmC,CAAA;IACnC,wDAA2C,CAAA;IAC3C,kDAAqC,CAAA;IACrC,0DAA6C,CAAA;IAC7C,oCAAuB,CAAA;IACvB,0CAA6B,CAAA;IAC7B,oDAAuC,CAAA;IACvC,wCAA2B,CAAA;IAC3B,8CAAiC,CAAA;IACjC,oDAAuC,CAAA;IACvC,8CAAiC,CAAA;IACjC,8CAAiC,CAAA;IACjC,8CAAiC,CAAA;IACjC,8CAAiC,CAAA;IACjC,gDAAmC,CAAA;IACnC,8CAAiC,CAAA;IACjC,gDAAmC,CAAA;IACnC,8CAAiC,CAAA;IACjC,4CAA+B,CAAA;IAC/B,0CAA6B,CAAA;IAC7B,wDAA2C,CAAA;IAC3C,0DAA6C,CAAA;IAC7C,gCAAmB,CAAA;AACpB,CAAC,EA1BW,SAAS,KAAT,SAAS,QA0BpB;AAED,MAAM,OAAO,YAAa,SAAQ,KAAK;IAErB;IAEA;IAHjB,YACiB,IAAe,EAC/B,OAAe,EACC,OAAiB,EACjC,OAA6B;QAE7B,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QALR,SAAI,GAAJ,IAAI,CAAW;QAEf,YAAO,GAAP,OAAO,CAAU;QAIjC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC5B,CAAC;IAED,MAAM;QACL,OAAO;YACN,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClD,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,4 @@
1
+ export declare function fetchWithTimeout(url: string, options?: RequestInit & {
2
+ timeoutMs?: number;
3
+ }): Promise<Response>;
4
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/lib/fetch.ts"],"names":[],"mappings":"AACA,wBAAsB,gBAAgB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,WAAW,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,OAAO,CAAC,QAAQ,CAAC,CAUnB"}
@@ -0,0 +1,13 @@
1
+ // Fetch with timeout — wraps fetch() with an AbortController that auto-cancels.
2
+ export async function fetchWithTimeout(url, options) {
3
+ const { timeoutMs = 15_000, ...fetchOptions } = options ?? {};
4
+ const controller = new AbortController();
5
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
6
+ try {
7
+ return await fetch(url, { ...fetchOptions, signal: controller.signal });
8
+ }
9
+ finally {
10
+ clearTimeout(timer);
11
+ }
12
+ }
13
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/lib/fetch.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,GAAW,EACX,OAA8C;IAE9C,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAE9D,IAAI,CAAC;QACJ,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACzE,CAAC;YAAS,CAAC;QACV,YAAY,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACF,CAAC"}
@@ -3,8 +3,18 @@ export declare function formatResult(data: Record<string, unknown>, options?: {
3
3
  }): string;
4
4
  export declare function formatError(error: unknown): string;
5
5
  export declare function formatTable(headers: string[], rows: string[][]): string;
6
- export declare function createSpinner(text: string): import("ora").Ora;
6
+ export declare function sectionHeader(title: string): string;
7
7
  export declare function success(msg: string): string;
8
- export declare function info(msg: string): string;
9
8
  export declare function warn(msg: string): string;
9
+ export declare function createSpinner(text: string): NonTtySpinner | import("ora").Ora;
10
+ declare class NonTtySpinner {
11
+ text: string;
12
+ constructor(initialText: string);
13
+ start(): this;
14
+ stop(): this;
15
+ succeed(msg: string): this;
16
+ fail(msg: string): this;
17
+ info(msg: string): this;
18
+ }
19
+ export {};
10
20
  //# sourceMappingURL=format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAehG;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKlD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAUvE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,qBAEzC;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExC"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AA2BA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAmBhG;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGlD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAwBvE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,qCAKzC;AAGD,cAAM,aAAa;IAClB,IAAI,EAAE,MAAM,CAAC;gBACD,WAAW,EAAE,MAAM;IAG/B,KAAK,IAAI,IAAI;IAGb,IAAI,IAAI,IAAI;IAGZ,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI1B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAIvB"}
@@ -1,45 +1,108 @@
1
1
  import chalk from "chalk";
2
2
  import ora from "ora";
3
+ // Brand palette (matches docs/index.html)
4
+ const BLUE = "#a5b4fc"; // pastel-blue
5
+ const MINT = "#99f6e4"; // pastel-mint
6
+ const SLATE = "#cbd5e1"; // slate-300 — table even rows
7
+ function hyperlink(text, url) {
8
+ return `\x1b]8;;${url}\x07${text}\x1b]8;;\x07`;
9
+ }
10
+ // Semantic color by key name for formatResult values.
11
+ function colorizeValue(key, value) {
12
+ if (key === "explorer")
13
+ return chalk.dim(hyperlink(value, value));
14
+ if (key === "txHash")
15
+ return chalk.hex(BLUE).dim(value);
16
+ if (key === "revertReason")
17
+ return chalk.red(value);
18
+ if (key === "mode" && value.includes("SIMULATION"))
19
+ return chalk.yellow(value);
20
+ if (/fee/i.test(key) && !/usd/i.test(key))
21
+ return chalk.yellow(value);
22
+ if (/usd/i.test(key))
23
+ return chalk.hex(MINT)(value);
24
+ return chalk.white(value);
25
+ }
26
+ function bigintReplacer(_key, value) {
27
+ return typeof value === "bigint" ? value.toString() : value;
28
+ }
3
29
  export function formatResult(data, options) {
4
30
  if (options?.json) {
5
31
  return JSON.stringify(data, bigintReplacer, 2);
6
32
  }
7
- const lines = [];
8
- for (const [key, value] of Object.entries(data)) {
9
- const label = chalk.gray(key.padEnd(20));
33
+ const keys = Object.keys(data);
34
+ // Dynamic label width auto-sizes to prevent truncation
35
+ const labelWidth = Math.max(12, ...keys.map((k) => k.length)) + 2;
36
+ return Object.entries(data)
37
+ .map(([key, value]) => {
38
+ const label = chalk.dim(key.padEnd(labelWidth));
10
39
  const val = typeof value === "string" || typeof value === "number"
11
- ? chalk.white(String(value))
40
+ ? colorizeValue(key, String(value))
12
41
  : chalk.dim(JSON.stringify(value, bigintReplacer));
13
- lines.push(` ${label} ${val}`);
14
- }
15
- return lines.join("\n");
42
+ return ` ${label}${val}`;
43
+ })
44
+ .join("\n");
16
45
  }
17
46
  export function formatError(error) {
18
- if (error instanceof Error) {
19
- return chalk.red(`✖ ${error.message}`);
20
- }
21
- return chalk.red(`✖ ${String(error)}`);
47
+ const msg = error instanceof Error ? error.message : String(error);
48
+ return chalk.red(`✖ ${msg}`);
22
49
  }
23
50
  export function formatTable(headers, rows) {
24
- const colWidths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] || "").length)));
25
- const headerLine = headers.map((h, i) => chalk.bold(h.padEnd(colWidths[i]))).join(" ");
26
- const separator = colWidths.map((w) => "─".repeat(w)).join("──");
27
- const dataLines = rows.map((row) => row.map((cell, i) => cell.padEnd(colWidths[i])).join(" "));
51
+ const colWidths = headers.map((h, colIdx) => Math.max(h.length, ...rows.map((r) => (r[colIdx] ?? "").length)));
52
+ const headerLine = " " + headers.map((h, i) => chalk.bold.white(h.padEnd(colWidths[i]))).join(" ");
53
+ const separator = " " + colWidths.map((w) => chalk.dim("─".repeat(w))).join(" ");
54
+ const dataLines = rows.map((row, rowIdx) => {
55
+ const isEven = rowIdx % 2 === 0;
56
+ return (" " +
57
+ row
58
+ .map((cell, colIdx) => {
59
+ const padded = (cell ?? "").padEnd(colWidths[colIdx]);
60
+ if (colIdx === 0)
61
+ return chalk.white(padded);
62
+ return isEven ? chalk.hex(SLATE)(padded) : chalk.dim(padded);
63
+ })
64
+ .join(" "));
65
+ });
28
66
  return [headerLine, separator, ...dataLines].join("\n");
29
67
  }
30
- export function createSpinner(text) {
31
- return ora({ text, spinner: "dots" });
68
+ export function sectionHeader(title) {
69
+ return chalk.bold.hex(MINT)(title);
32
70
  }
33
71
  export function success(msg) {
34
- return chalk.green(`✔ ${msg}`);
35
- }
36
- export function info(msg) {
37
- return chalk.blue(`ℹ ${msg}`);
72
+ return chalk.hex(MINT).bold(`✔ ${msg}`);
38
73
  }
39
74
  export function warn(msg) {
40
75
  return chalk.yellow(`⚠ ${msg}`);
41
76
  }
42
- function bigintReplacer(_key, value) {
43
- return typeof value === "bigint" ? value.toString() : value;
77
+ export function createSpinner(text) {
78
+ if (!process.stdout.isTTY) {
79
+ return new NonTtySpinner(text);
80
+ }
81
+ return ora({ text, spinner: "dots" });
82
+ }
83
+ // Minimal shim for non-TTY environments (CI, piped output).
84
+ class NonTtySpinner {
85
+ text;
86
+ constructor(initialText) {
87
+ this.text = initialText;
88
+ }
89
+ start() {
90
+ return this;
91
+ }
92
+ stop() {
93
+ return this;
94
+ }
95
+ succeed(msg) {
96
+ console.log(success(msg));
97
+ return this;
98
+ }
99
+ fail(msg) {
100
+ console.error(formatError(new Error(msg)));
101
+ return this;
102
+ }
103
+ info(msg) {
104
+ console.log(chalk.hex(BLUE)(`ℹ ${msg}`));
105
+ return this;
106
+ }
44
107
  }
45
108
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type ErrorCode } from "./errors.js";
2
+ export interface RetryOptions {
3
+ maxRetries?: number;
4
+ baseDelayMs?: number;
5
+ retryOnCodes?: ErrorCode[];
6
+ }
7
+ export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
8
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/lib/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC;CAC3B;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAyB3F"}
@@ -0,0 +1,25 @@
1
+ import { StarkfiError } from "./errors.js";
2
+ export async function withRetry(fn, options) {
3
+ const { maxRetries = 2, baseDelayMs = 500, retryOnCodes } = options ?? {};
4
+ let lastError;
5
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
6
+ try {
7
+ return await fn();
8
+ }
9
+ catch (error) {
10
+ lastError = error;
11
+ // Don't retry non-retryable domain errors
12
+ if (error instanceof StarkfiError && retryOnCodes?.length) {
13
+ if (!retryOnCodes.includes(error.code)) {
14
+ throw error;
15
+ }
16
+ }
17
+ if (attempt < maxRetries) {
18
+ const delay = baseDelayMs * 2 ** attempt;
19
+ await new Promise((r) => setTimeout(r, delay));
20
+ }
21
+ }
22
+ }
23
+ throw lastError;
24
+ }
25
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/lib/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,MAAM,aAAa,CAAC;AAQ3D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,EAAoB,EAAE,OAAsB;IAC9E,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,WAAW,GAAG,GAAG,EAAE,YAAY,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAC1E,IAAI,SAAkB,CAAC;IAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACJ,OAAO,MAAM,EAAE,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,SAAS,GAAG,KAAK,CAAC;YAElB,0CAA0C;YAC1C,IAAI,KAAK,YAAY,YAAY,IAAI,YAAY,EAAE,MAAM,EAAE,CAAC;gBAC3D,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxC,MAAM,KAAK,CAAC;gBACb,CAAC;YACF,CAAC;YAED,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC;gBACzC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAChD,CAAC;QACF,CAAC;IACF,CAAC;IAED,MAAM,SAAS,CAAC;AACjB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type Network = "mainnet" | "sepolia";
2
+ export interface TxResult {
3
+ hash: string;
4
+ explorerUrl: string;
5
+ }
6
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAE5C,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":""}
@@ -1,14 +1,2 @@
1
- import { z } from "zod";
2
- export declare const NetworkSchema: z.ZodEnum<{
3
- mainnet: "mainnet";
4
- sepolia: "sepolia";
5
- }>;
6
- export type Network = z.infer<typeof NetworkSchema>;
7
- export declare const StarknetAddressSchema: z.ZodString;
8
- export declare const AmountSchema: z.ZodString;
9
- export declare const TokenSymbolSchema: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
10
- export declare const SlippageSchema: z.ZodDefault<z.ZodNumber>;
11
1
  export declare function validateAddress(address: string): string;
12
- export declare function validateAmount(amount: string): string;
13
- export declare function validateNetwork(network: string): Network;
14
2
  //# sourceMappingURL=validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,aAAa;;;EAAiC,CAAC;AAC5D,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD,eAAO,MAAM,qBAAqB,aAE0B,CAAC;AAE7D,eAAO,MAAM,YAAY,aAEiD,CAAC;AAE3E,eAAO,MAAM,iBAAiB,wDAIK,CAAC;AAEpC,eAAO,MAAM,cAAc,2BAIb,CAAC;AAEf,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExD"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD"}
@@ -1,28 +1,6 @@
1
1
  import { z } from "zod";
2
- export const NetworkSchema = z.enum(["mainnet", "sepolia"]);
3
- export const StarknetAddressSchema = z
4
- .string()
5
- .regex(/^0x[0-9a-fA-F]{1,64}$/, "Invalid Starknet address");
6
- export const AmountSchema = z
7
- .string()
8
- .regex(/^(\d+\.?\d*|\.\d+|max)$/, "Invalid amount (use number or 'max')");
9
- export const TokenSymbolSchema = z
10
- .string()
11
- .min(1, "Token symbol required")
12
- .max(20, "Token symbol too long")
13
- .transform((s) => s.toUpperCase());
14
- export const SlippageSchema = z
15
- .number()
16
- .min(0.01, "Slippage too low")
17
- .max(50, "Slippage too high")
18
- .default(0.5);
2
+ const StarknetAddressSchema = z.string().regex(/^0x[0-9a-fA-F]{1,64}$/, "Invalid Starknet address");
19
3
  export function validateAddress(address) {
20
4
  return StarknetAddressSchema.parse(address);
21
5
  }
22
- export function validateAmount(amount) {
23
- return AmountSchema.parse(amount);
24
- }
25
- export function validateNetwork(network) {
26
- return NetworkSchema.parse(network);
27
- }
28
6
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAG5D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC;KACpC,MAAM,EAAE;KACR,KAAK,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,CAAC;AAE7D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC;KAC3B,MAAM,EAAE;KACR,KAAK,CAAC,yBAAyB,EAAE,sCAAsC,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAChC,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC;KAC/B,GAAG,CAAC,EAAE,EAAE,uBAAuB,CAAC;KAChC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC7B,MAAM,EAAE;KACR,GAAG,CAAC,IAAI,EAAE,kBAAkB,CAAC;KAC7B,GAAG,CAAC,EAAE,EAAE,mBAAmB,CAAC;KAC5B,OAAO,CAAC,GAAG,CAAC,CAAC;AAEf,MAAM,UAAU,eAAe,CAAC,OAAe;IAC9C,OAAO,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC5C,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC9C,OAAO,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,CAAC;AAEpG,MAAM,UAAU,eAAe,CAAC,OAAe;IAC9C,OAAO,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare function handleBatchExecute(args: {
2
+ operations: {
3
+ type: "swap" | "stake" | "supply" | "send";
4
+ params: Record<string, string>;
5
+ }[];
6
+ simulate?: boolean;
7
+ }): Promise<{
8
+ content: {
9
+ type: "text";
10
+ text: string;
11
+ }[];
12
+ }>;
13
+ //# sourceMappingURL=batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../../src/mcp/handlers/batch.ts"],"names":[],"mappings":"AAOA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC9C,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,EAAE,CAAC;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;;;;;GAgCA"}
@@ -0,0 +1,33 @@
1
+ import { requireSession } from "../../services/auth/session.js";
2
+ import { initSDKAndWallet } from "../../services/starkzap/client.js";
3
+ import { buildBatch } from "../../services/batch/batch.js";
4
+ import { simulateTransaction } from "../../services/simulate/simulate.js";
5
+ import { jsonResult } from "./utils.js";
6
+ export async function handleBatchExecute(args) {
7
+ const session = requireSession();
8
+ const { wallet } = await initSDKAndWallet(session);
9
+ await wallet.ensureReady({ deploy: "if_needed" });
10
+ const operations = args.operations;
11
+ const { builder, summary } = await buildBatch(wallet, session, operations);
12
+ if (args.simulate) {
13
+ const sim = await simulateTransaction(builder);
14
+ return jsonResult({
15
+ success: sim.success,
16
+ mode: "SIMULATION (no TX sent)",
17
+ operations: summary,
18
+ estimatedFee: sim.estimatedFee,
19
+ estimatedFeeUsd: sim.estimatedFeeUsd,
20
+ callCount: sim.callCount,
21
+ ...(sim.revertReason ? { revertReason: sim.revertReason } : {}),
22
+ });
23
+ }
24
+ const tx = await builder.send();
25
+ await tx.wait();
26
+ return jsonResult({
27
+ success: true,
28
+ txHash: tx.hash,
29
+ explorerUrl: tx.explorerUrl,
30
+ operations: summary,
31
+ });
32
+ }
33
+ //# sourceMappingURL=batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../../src/mcp/handlers/batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAGxC;IACA,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAEnD,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAElD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAyC,CAAC;IAElE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAE3E,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC/C,OAAO,UAAU,CAAC;YACjB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,yBAAyB;YAC/B,UAAU,EAAE,OAAO;YACnB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IAEhB,OAAO,UAAU,CAAC;QACjB,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,EAAE,CAAC,IAAI;QACf,WAAW,EAAE,EAAE,CAAC,WAAW;QAC3B,UAAU,EAAE,OAAO;KACnB,CAAC,CAAC;AACJ,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export declare function handleConfigAction(args: {
2
- action: "set-rpc" | "get-rpc" | "set-network" | "set-gasfree" | "set-gasless" | "set-gas-token" | "list";
2
+ action: "set-rpc" | "get-rpc" | "set-network" | "set-gasfree" | "set-gas-token" | "list";
3
3
  value?: string;
4
4
  }): Promise<{
5
5
  content: {