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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 ahmetenesdur
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # StarkFi
2
+
3
+ A minimalist command-line interface and AI Agent toolkit for DeFi operations on **Starknet**.
4
+ Powered by [StarkZap](https://github.com/keep-starknet-strange/starkzap) SDK, [Fibrous](https://fibrous.finance) aggregation, and [AVNU](https://docs.avnu.fi) Paymaster.
5
+
6
+ ## Overview
7
+
8
+ StarkFi provides a unified interface for Starknet interactions, designed for both human CLI usage and AI agent workflows (via MCP).
9
+
10
+ - **Optimal Trading:** Aggregated token swaps via Fibrous.
11
+ - **Gas Abstraction:** Default (STRK), Gasfree (developer-sponsored), or Gasless (user pays in USDC/ETH).
12
+ - **Staking Management:** Full lifecycle support for delegation pools (stake, compound, unstake).
13
+ - **Lending & Borrowing:** Supply, withdraw, borrow, and repay via Vesu V2 lending protocol.
14
+ - **AI Integration:** Built-in Model Context Protocol (MCP) server.
15
+
16
+ ## Quick Start
17
+
18
+ ### 1. Authentication
19
+
20
+ ```bash
21
+ # Via Email OTP (requires starkfi-server)
22
+ npx starkfi auth login user@example.com
23
+ npx starkfi auth verify user@example.com <code>
24
+
25
+ # Or via Private Key (local execution)
26
+ npx starkfi auth import
27
+ ```
28
+
29
+ ### 2. Core Commands
30
+
31
+ ```bash
32
+ # Authentication & Wallet
33
+ npx starkfi auth login <email> # Email OTP login
34
+ npx starkfi auth verify <email> <code> # Verify OTP
35
+ npx starkfi auth import # Import private key
36
+ npx starkfi auth logout # Clear session
37
+ npx starkfi address # Show active address
38
+ npx starkfi deploy # Deploy account on-chain
39
+
40
+ # Assets & Trading
41
+ npx starkfi balance [token] # Show token balances
42
+ npx starkfi send <amount> <token> <recipient> # Transfer tokens
43
+ npx starkfi trade <amount> <from> <to> # Swap tokens via Fibrous
44
+
45
+ # Staking
46
+ npx starkfi validators # List all validators
47
+ npx starkfi pools <validator> # List delegation pools
48
+ npx starkfi staking-stats # Full staking dashboard
49
+ npx starkfi stake <amount> --pool <pool> # Stake tokens
50
+ npx starkfi rewards --pool <pool> [--claim|--compound] # Manage rewards
51
+ npx starkfi unstake <intent|exit> --pool <pool> [--amount <amount>] # Unstake
52
+
53
+ # Network & Config
54
+ npx starkfi tx-status <hash> # Check tx receipt
55
+ npx starkfi config list # View configuration
56
+ npx starkfi config set-rpc <url> # Set custom RPC
57
+ npx starkfi config set-network <network> # Set network (mainnet/sepolia)
58
+ npx starkfi config set-gasfree <on|off> # Toggle AVNU-sponsored gas
59
+ npx starkfi config set-gas-token <token|off> # Pay gas in ERC-20 (USDC, etc)
60
+
61
+ # Lending (Vesu V2)
62
+ npx starkfi lend-pools # List Vesu lending pools
63
+ npx starkfi lend-pools Genesis # Filter by name
64
+ npx starkfi lend-supply 100 -p Genesis -t STRK # Supply assets to earn interest
65
+ npx starkfi lend-withdraw 50 -p Genesis -t STRK # Withdraw supplied assets
66
+ npx starkfi lend-borrow -p Genesis --collateral-amount 1 --collateral-token ETH --borrow-amount 500 --borrow-token USDC
67
+ npx starkfi lend-repay 250 -p Genesis -t USDC --collateral-token ETH # Repay debt
68
+ npx starkfi lend-status -p Genesis --collateral-token ETH --debt-token USDC
69
+ ```
70
+
71
+ ## AI Native (MCP)
72
+
73
+ StarkFi includes a built-in MCP server, exposing all DeFi capabilities to AI editors like Cursor and Claude.
74
+
75
+ ```bash
76
+ npx starkfi mcp-start
77
+ ```
78
+
79
+ > See [MCP.md](MCP.md) for editor configuration and the complete tool registry.
80
+
81
+ ## License
82
+
83
+ MIT
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerImportCommand(program: Command): void;
3
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/import.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2D5D"}
@@ -0,0 +1,56 @@
1
+ import inquirer from "inquirer";
2
+ import { createSDK, connectWallet, resolveFeeModeConfig } from "../../services/starkzap/client.js";
3
+ import { saveSession } from "../../services/auth/session.js";
4
+ import { createSpinner, success, formatResult } from "../../lib/format.js";
5
+ import { ConfigService } from "../../services/config/config.js";
6
+ import { getOrCreateAuthCommand } from "../../lib/command.js";
7
+ export function registerImportCommand(program) {
8
+ const authCmd = getOrCreateAuthCommand(program);
9
+ authCmd
10
+ .command("import")
11
+ .description("Import a Stark private key to authenticate")
12
+ .option("-n, --network <network>", "Network (mainnet or sepolia)", "mainnet")
13
+ .action(async (opts) => {
14
+ try {
15
+ const { privateKey } = await inquirer.prompt([
16
+ {
17
+ type: "password",
18
+ name: "privateKey",
19
+ message: "Enter your Stark private key:",
20
+ mask: "*",
21
+ validate: (input) => {
22
+ if (!input || !input.startsWith("0x")) {
23
+ return "Private key must start with 0x";
24
+ }
25
+ return true;
26
+ },
27
+ },
28
+ ]);
29
+ const network = (opts.network === "sepolia" ? "sepolia" : "mainnet");
30
+ const spinner = createSpinner("Connecting wallet...").start();
31
+ const configService = ConfigService.getInstance();
32
+ const rpcUrl = configService.get("rpcUrl");
33
+ const gasfreeMode = configService.get("gasfreeMode") === true;
34
+ const gasToken = configService.get("gasToken");
35
+ const { needsPaymaster } = resolveFeeModeConfig(gasfreeMode, gasToken);
36
+ const sdk = createSDK(network, rpcUrl, needsPaymaster);
37
+ const wallet = await connectWallet(sdk, {
38
+ type: "local",
39
+ network,
40
+ address: "",
41
+ privateKey,
42
+ });
43
+ await wallet.ensureReady({ deploy: "if_needed" });
44
+ const address = wallet.address.toString();
45
+ saveSession({ type: "local", network, address, privateKey });
46
+ spinner.succeed("Wallet connected");
47
+ console.log(formatResult({ network, address }));
48
+ console.log(success("Session saved. You can now use starkfi commands."));
49
+ }
50
+ catch (error) {
51
+ console.error("Import failed:", error instanceof Error ? error.message : error);
52
+ process.exit(1);
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../../src/commands/auth/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerLoginCommand(program: Command): void;
3
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoB3D"}
@@ -0,0 +1,23 @@
1
+ import { apiLogin } from "../../services/api/client.js";
2
+ import { createSpinner, success } from "../../lib/format.js";
3
+ import { getOrCreateAuthCommand } from "../../lib/command.js";
4
+ export function registerLoginCommand(program) {
5
+ const authCmd = getOrCreateAuthCommand(program);
6
+ authCmd
7
+ .command("login <email>")
8
+ .description("Send OTP to email for Privy wallet authentication")
9
+ .action(async (email) => {
10
+ try {
11
+ const spinner = createSpinner("Sending OTP...").start();
12
+ await apiLogin(email);
13
+ spinner.succeed("OTP sent");
14
+ console.log(success(`Check your email (${email}) for the code.`));
15
+ console.log(`Run: starkfi auth verify ${email} <code>`);
16
+ }
17
+ catch (error) {
18
+ console.error("Login failed:", error instanceof Error ? error.message : error);
19
+ process.exit(1);
20
+ }
21
+ });
22
+ }
23
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACpD,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAEhD,OAAO;SACL,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC/B,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC;YAExD,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;YAEtB,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,KAAK,iBAAiB,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,SAAS,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerLogoutCommand(program: Command): void;
3
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAU5D"}
@@ -0,0 +1,14 @@
1
+ import { clearSession } from "../../services/auth/session.js";
2
+ import { success } from "../../lib/format.js";
3
+ import { getOrCreateAuthCommand } from "../../lib/command.js";
4
+ export function registerLogoutCommand(program) {
5
+ const authCmd = getOrCreateAuthCommand(program);
6
+ authCmd
7
+ .command("logout")
8
+ .description("Clear session and log out")
9
+ .action(() => {
10
+ clearSession();
11
+ console.log(success("Logged out. Session cleared."));
12
+ });
13
+ }
14
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACrD,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAEhD,OAAO;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,GAAG,EAAE;QACZ,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerVerifyCommand(program: Command): void;
3
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/verify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0E5D"}
@@ -0,0 +1,64 @@
1
+ import { apiVerify } from "../../services/api/client.js";
2
+ import { saveSession } from "../../services/auth/session.js";
3
+ import { createSpinner, success, formatResult } from "../../lib/format.js";
4
+ import { STARKFI_API_URL_DEFAULT } from "../../lib/config.js";
5
+ import { createSDK, connectWallet, resolveFeeModeConfig } from "../../services/starkzap/client.js";
6
+ import { ConfigService } from "../../services/config/config.js";
7
+ import { getOrCreateAuthCommand } from "../../lib/command.js";
8
+ export function registerVerifyCommand(program) {
9
+ const authCmd = getOrCreateAuthCommand(program);
10
+ authCmd
11
+ .command("verify <email> <code>")
12
+ .description("Verify OTP and connect Privy wallet")
13
+ .option("-n, --network <network>", "Network (mainnet or sepolia)", "mainnet")
14
+ .action(async (email, code, opts) => {
15
+ try {
16
+ const network = (opts.network === "sepolia" ? "sepolia" : "mainnet");
17
+ const spinner = createSpinner("Verifying OTP...").start();
18
+ const result = await apiVerify(email, code);
19
+ const serverUrl = (process.env.STARKFI_API_URL ?? STARKFI_API_URL_DEFAULT) + "/sign/hash";
20
+ const tempSession = {
21
+ type: "privy",
22
+ network,
23
+ address: result.walletAddress,
24
+ userId: result.userId,
25
+ walletId: result.walletId,
26
+ publicKey: result.walletPublicKey,
27
+ token: result.token,
28
+ serverUrl,
29
+ };
30
+ const configService = ConfigService.getInstance();
31
+ const rpcUrl = configService.get("rpcUrl");
32
+ const gasfreeMode = configService.get("gasfreeMode") === true;
33
+ const gasToken = configService.get("gasToken");
34
+ const { needsPaymaster } = resolveFeeModeConfig(gasfreeMode, gasToken);
35
+ const sdk = createSDK(network, rpcUrl, needsPaymaster);
36
+ const wallet = await connectWallet(sdk, tempSession);
37
+ const actualAddress = wallet.address.toString();
38
+ saveSession({ ...tempSession, address: actualAddress });
39
+ spinner.succeed("Wallet connected");
40
+ console.log(formatResult({
41
+ network,
42
+ address: actualAddress,
43
+ walletId: result.walletId,
44
+ message: result.isExisting
45
+ ? "Existing wallet found and connected."
46
+ : "New wallet created and session saved.",
47
+ }));
48
+ console.log(success("Ready. You can now use starkfi commands."));
49
+ if (!result.isExisting) {
50
+ console.log("\n Next steps:\n" +
51
+ " 1. Send some ETH or STRK to your address above\n" +
52
+ " 2. Run: starkfi deploy\n" +
53
+ " 3. Start using: starkfi send, starkfi trade\n\n" +
54
+ " Or enable gasfree mode (no funds needed):\n" +
55
+ " starkfi config set-gasfree on\n");
56
+ }
57
+ }
58
+ catch (error) {
59
+ console.error("Verification failed:", error instanceof Error ? error.message : error);
60
+ process.exit(1);
61
+ }
62
+ });
63
+ }
64
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/commands/auth/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerTxStatusCommand(program: Command): void;
3
+ //# sourceMappingURL=tx-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-status.d.ts","sourceRoot":"","sources":["../../../src/commands/chain/tx-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuC9D"}
@@ -0,0 +1,39 @@
1
+ import { requireSession } from "../../services/auth/session.js";
2
+ import { createSDK } from "../../services/starkzap/client.js";
3
+ import { ConfigService } from "../../services/config/config.js";
4
+ import { createSpinner, formatResult } from "../../lib/format.js";
5
+ import { explorerUrl } from "../../lib/config.js";
6
+ export function registerTxStatusCommand(program) {
7
+ program
8
+ .command("tx-status")
9
+ .description("Check transaction status by hash")
10
+ .argument("<hash>", "Transaction hash (0x...)")
11
+ .action(async (hash) => {
12
+ const spinner = createSpinner("Checking transaction...").start();
13
+ try {
14
+ const session = requireSession();
15
+ const configService = ConfigService.getInstance();
16
+ const rpcUrl = configService.get("rpcUrl");
17
+ const sdk = createSDK(session.network, rpcUrl);
18
+ const provider = sdk.getProvider();
19
+ const receipt = await provider.getTransactionReceipt(hash);
20
+ spinner.succeed("Transaction found");
21
+ const actualFee = "actual_fee" in receipt ? String(receipt.actual_fee) : "N/A";
22
+ const blockNumber = "block_number" in receipt ? String(receipt.block_number) : "pending";
23
+ console.log(formatResult({
24
+ hash,
25
+ status: JSON.stringify(receipt.statusReceipt),
26
+ actualFee,
27
+ blockNumber,
28
+ network: session.network,
29
+ explorer: explorerUrl(hash, session.network),
30
+ }));
31
+ }
32
+ catch (error) {
33
+ spinner.fail("Failed to get transaction status");
34
+ console.error(error instanceof Error ? error.message : error);
35
+ process.exit(1);
36
+ }
37
+ });
38
+ }
39
+ //# sourceMappingURL=tx-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-status.js","sourceRoot":"","sources":["../../../src/commands/chain/tx-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACvD,OAAO;SACL,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,QAAQ,CAAC,QAAQ,EAAE,0BAA0B,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC9B,MAAM,OAAO,GAAG,aAAa,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEjE,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;YACjC,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAuB,CAAC;YACjE,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAE/C,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAE3D,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAErC,MAAM,SAAS,GAAG,YAAY,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC/E,MAAM,WAAW,GAChB,cAAc,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAEtE,OAAO,CAAC,GAAG,CACV,YAAY,CAAC;gBACZ,IAAI;gBACJ,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC;gBAC7C,SAAS;gBACT,WAAW;gBACX,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC;aAC5C,CAAC,CACF,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerConfigCommand(program: Command): void;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/commands/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8I5D"}
@@ -0,0 +1,122 @@
1
+ import { ConfigService } from "../../services/config/config.js";
2
+ import { success, formatResult, warn } from "../../lib/format.js";
3
+ import { GASLESS_SUPPORTED_TOKENS } from "../../lib/config.js";
4
+ export function registerConfigCommand(program) {
5
+ const configCmd = program.command("config").description("Manage starkfi configuration");
6
+ configCmd
7
+ .command("set-rpc")
8
+ .description("Set custom RPC URL for Starknet")
9
+ .argument("<url>", "RPC URL")
10
+ .action((url) => {
11
+ const configService = ConfigService.getInstance();
12
+ configService.set("rpcUrl", url);
13
+ console.log(success(`RPC URL set to: ${url}`));
14
+ });
15
+ configCmd
16
+ .command("get-rpc")
17
+ .description("Show current RPC URL")
18
+ .action(() => {
19
+ const configService = ConfigService.getInstance();
20
+ const rpcUrl = configService.get("rpcUrl");
21
+ console.log(formatResult({
22
+ rpcUrl: rpcUrl || "default (StarkZap preset)",
23
+ }));
24
+ });
25
+ configCmd
26
+ .command("set-network")
27
+ .description("Set default network (mainnet or sepolia)")
28
+ .argument("<network>", "mainnet or sepolia")
29
+ .action((network) => {
30
+ if (!["mainnet", "sepolia"].includes(network)) {
31
+ console.log(warn("Network must be 'mainnet' or 'sepolia'"));
32
+ process.exit(1);
33
+ }
34
+ const configService = ConfigService.getInstance();
35
+ configService.set("network", network);
36
+ console.log(success(`Network set to: ${network}`));
37
+ });
38
+ // Gasfree mode: developer sponsors gas via AVNU API key
39
+ configCmd
40
+ .command("set-gasfree")
41
+ .description("Enable/disable Gasfree mode — developer sponsors all gas costs via AVNU Paymaster")
42
+ .argument("<mode>", "on or off")
43
+ .action((mode) => {
44
+ if (!["on", "off"].includes(mode)) {
45
+ console.log(warn("Mode must be 'on' or 'off'"));
46
+ process.exit(1);
47
+ }
48
+ const configService = ConfigService.getInstance();
49
+ configService.set("gasfreeMode", mode === "on");
50
+ if (mode === "on") {
51
+ // Gasfree and Gasless are mutually exclusive
52
+ configService.delete("gasToken");
53
+ console.log(success("Gasfree mode: on (developer sponsors gas via AVNU)"));
54
+ }
55
+ else {
56
+ console.log(success("Gasfree mode: off"));
57
+ }
58
+ });
59
+ // Kept as hidden alias for backwards compatibility
60
+ configCmd
61
+ .command("set-gasless", { hidden: true })
62
+ .description("Alias for set-gasfree (deprecated)")
63
+ .argument("<mode>", "on or off")
64
+ .action((mode) => {
65
+ if (!["on", "off"].includes(mode)) {
66
+ console.log(warn("Mode must be 'on' or 'off'"));
67
+ process.exit(1);
68
+ }
69
+ const configService = ConfigService.getInstance();
70
+ configService.set("gasfreeMode", mode === "on");
71
+ if (mode === "on")
72
+ configService.delete("gasToken");
73
+ console.log(warn("Hint: 'set-gasless' is deprecated. Use 'starkfi config set-gasfree' instead."));
74
+ console.log(success(`Gasfree mode: ${mode}`));
75
+ });
76
+ // Gasless mode: user pays gas in a non-STRK token
77
+ configCmd
78
+ .command("set-gas-token")
79
+ .description(`Set gas payment token for Gasless mode — user pays gas in this token instead of STRK.\nSupported: ${GASLESS_SUPPORTED_TOKENS.join(", ")}\nUse 'off' to disable Gasless mode.`)
80
+ .argument("<token>", `Token symbol or 'off'. Supported: ${GASLESS_SUPPORTED_TOKENS.join(", ")}`)
81
+ .action((token) => {
82
+ const configService = ConfigService.getInstance();
83
+ if (token.toLowerCase() === "off") {
84
+ configService.delete("gasToken");
85
+ console.log(success("Gasless mode disabled — reverting to default STRK gas"));
86
+ return;
87
+ }
88
+ const upper = token.toUpperCase();
89
+ if (!GASLESS_SUPPORTED_TOKENS.includes(upper)) {
90
+ console.log(warn(`Unsupported token '${token}'. Supported: ${GASLESS_SUPPORTED_TOKENS.join(", ")}`));
91
+ process.exit(1);
92
+ }
93
+ // Gasless and Gasfree are mutually exclusive
94
+ configService.delete("gasfreeMode");
95
+ configService.set("gasToken", upper);
96
+ console.log(success(`Gasless mode: on — gas will be paid in ${upper} (no STRK needed)`));
97
+ });
98
+ configCmd
99
+ .command("list")
100
+ .description("Show all configuration settings")
101
+ .action(() => {
102
+ const configService = ConfigService.getInstance();
103
+ const all = configService.getAll();
104
+ if (Object.keys(all).length === 0) {
105
+ console.log(" No custom settings. Using defaults.\n");
106
+ return;
107
+ }
108
+ // Human-readable fee mode summary
109
+ const gasfreeMode = all.gasfreeMode === true;
110
+ const gasToken = all.gasToken;
111
+ let feeModeSummary = "default (pays STRK)";
112
+ if (gasfreeMode)
113
+ feeModeSummary = "gasfree (developer-sponsored via AVNU)";
114
+ else if (gasToken)
115
+ feeModeSummary = `gasless (user pays in ${gasToken})`;
116
+ console.log(formatResult({
117
+ ...all,
118
+ feeMode: feeModeSummary,
119
+ }));
120
+ });
121
+ }
122
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/commands/config/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerLendPoolsCommand(program: Command): void;
3
+ export declare function registerLendSupplyCommand(program: Command): void;
4
+ export declare function registerLendWithdrawCommand(program: Command): void;
5
+ export declare function registerLendBorrowCommand(program: Command): void;
6
+ export declare function registerLendRepayCommand(program: Command): void;
7
+ export declare function registerLendStatusCommand(program: Command): void;
8
+ //# sourceMappingURL=lending.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lending.d.ts","sourceRoot":"","sources":["../../../src/commands/lending/lending.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuC/D;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoChE;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyClE;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmDhE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8C/D;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4ChE"}