fibx 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +80 -30
- package/dist/commands/auth/import.d.ts.map +1 -1
- package/dist/commands/auth/import.js +15 -15
- package/dist/commands/auth/import.js.map +1 -1
- package/dist/commands/auth/login.d.ts.map +1 -1
- package/dist/commands/auth/login.js +9 -11
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/logout.d.ts.map +1 -1
- package/dist/commands/auth/logout.js +3 -11
- package/dist/commands/auth/logout.js.map +1 -1
- package/dist/commands/auth/verify.d.ts.map +1 -1
- package/dist/commands/auth/verify.js +10 -9
- package/dist/commands/auth/verify.js.map +1 -1
- package/dist/commands/chain/transaction.d.ts.map +1 -1
- package/dist/commands/chain/transaction.js +13 -13
- package/dist/commands/chain/transaction.js.map +1 -1
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +40 -8
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/defi/aave.d.ts +1 -0
- package/dist/commands/defi/aave.d.ts.map +1 -1
- package/dist/commands/defi/aave.js +105 -40
- package/dist/commands/defi/aave.js.map +1 -1
- package/dist/commands/portfolio/index.d.ts +3 -0
- package/dist/commands/portfolio/index.d.ts.map +1 -0
- package/dist/commands/portfolio/index.js +64 -0
- package/dist/commands/portfolio/index.js.map +1 -0
- package/dist/commands/trade/status.d.ts.map +1 -1
- package/dist/commands/trade/status.js +17 -19
- package/dist/commands/trade/status.js.map +1 -1
- package/dist/commands/trade/swap.d.ts +1 -0
- package/dist/commands/trade/swap.d.ts.map +1 -1
- package/dist/commands/trade/swap.js +156 -101
- package/dist/commands/trade/swap.js.map +1 -1
- package/dist/commands/wallet/address.d.ts.map +1 -1
- package/dist/commands/wallet/address.js +7 -9
- package/dist/commands/wallet/address.js.map +1 -1
- package/dist/commands/wallet/balance.d.ts.map +1 -1
- package/dist/commands/wallet/balance.js +42 -22
- package/dist/commands/wallet/balance.js.map +1 -1
- package/dist/commands/wallet/list.d.ts +1 -1
- package/dist/commands/wallet/list.d.ts.map +1 -1
- package/dist/commands/wallet/list.js +7 -16
- package/dist/commands/wallet/list.js.map +1 -1
- package/dist/commands/wallet/send.d.ts +5 -1
- package/dist/commands/wallet/send.d.ts.map +1 -1
- package/dist/commands/wallet/send.js +66 -24
- package/dist/commands/wallet/send.js.map +1 -1
- package/dist/index.js +185 -22
- package/dist/index.js.map +1 -1
- package/dist/lib/brand.d.ts +5 -0
- package/dist/lib/brand.d.ts.map +1 -0
- package/dist/lib/brand.js +15 -0
- package/dist/lib/brand.js.map +1 -0
- package/dist/lib/cli-helpers.d.ts +10 -0
- package/dist/lib/cli-helpers.d.ts.map +1 -0
- package/dist/lib/cli-helpers.js +20 -0
- package/dist/lib/cli-helpers.js.map +1 -0
- package/dist/lib/concurrency.d.ts +8 -0
- package/dist/lib/concurrency.d.ts.map +1 -0
- package/dist/lib/concurrency.js +26 -0
- package/dist/lib/concurrency.js.map +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +1 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/errors.d.ts +1 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +1 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/format.d.ts +26 -3
- package/dist/lib/format.d.ts.map +1 -1
- package/dist/lib/format.js +131 -31
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/parse-evm-error.d.ts +6 -0
- package/dist/lib/parse-evm-error.d.ts.map +1 -0
- package/dist/lib/parse-evm-error.js +48 -0
- package/dist/lib/parse-evm-error.js.map +1 -0
- package/dist/lib/parseAmount.d.ts.map +1 -1
- package/dist/lib/parseAmount.js +0 -1
- package/dist/lib/parseAmount.js.map +1 -1
- package/dist/lib/retry.d.ts +20 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/lib/retry.js +36 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/mcp/handlers.d.ts +7 -1
- package/dist/mcp/handlers.d.ts.map +1 -1
- package/dist/mcp/handlers.js +86 -18
- package/dist/mcp/handlers.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +4 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +16 -3
- package/dist/mcp/tools.js.map +1 -1
- package/dist/services/auth/session.d.ts.map +1 -1
- package/dist/services/auth/session.js +22 -1
- package/dist/services/auth/session.js.map +1 -1
- package/dist/services/chain/client.d.ts +9376 -241
- package/dist/services/chain/client.d.ts.map +1 -1
- package/dist/services/chain/client.js +0 -1
- package/dist/services/chain/client.js.map +1 -1
- package/dist/services/chain/constants.d.ts.map +1 -1
- package/dist/services/chain/constants.js +1 -2
- package/dist/services/chain/constants.js.map +1 -1
- package/dist/services/chain/erc20.d.ts +5 -183
- package/dist/services/chain/erc20.d.ts.map +1 -1
- package/dist/services/chain/erc20.js +15 -128
- package/dist/services/chain/erc20.js.map +1 -1
- package/dist/services/chain/nonceManager.d.ts.map +1 -1
- package/dist/services/chain/nonceManager.js +0 -3
- package/dist/services/chain/nonceManager.js.map +1 -1
- package/dist/services/config/config.d.ts +2 -0
- package/dist/services/config/config.d.ts.map +1 -1
- package/dist/services/config/config.js +9 -1
- package/dist/services/config/config.js.map +1 -1
- package/dist/services/defi/aave.d.ts +12 -10
- package/dist/services/defi/aave.d.ts.map +1 -1
- package/dist/services/defi/aave.js +83 -46
- package/dist/services/defi/aave.js.map +1 -1
- package/dist/services/defi/abi/aave.d.ts +99 -0
- package/dist/services/defi/abi/aave.d.ts.map +1 -1
- package/dist/services/defi/abi/aave.js +53 -0
- package/dist/services/defi/abi/aave.js.map +1 -1
- package/dist/services/defi/constants.d.ts +0 -4
- package/dist/services/defi/constants.d.ts.map +1 -1
- package/dist/services/defi/constants.js +1 -6
- package/dist/services/defi/constants.js.map +1 -1
- package/dist/services/fibrous/balances.d.ts.map +1 -1
- package/dist/services/fibrous/balances.js +12 -9
- package/dist/services/fibrous/balances.js.map +1 -1
- package/dist/services/fibrous/route.d.ts.map +1 -1
- package/dist/services/fibrous/route.js +17 -9
- package/dist/services/fibrous/route.js.map +1 -1
- package/dist/services/fibrous/tokens.d.ts +1 -0
- package/dist/services/fibrous/tokens.d.ts.map +1 -1
- package/dist/services/fibrous/tokens.js +7 -4
- package/dist/services/fibrous/tokens.js.map +1 -1
- package/dist/services/portfolio/portfolio.d.ts +28 -0
- package/dist/services/portfolio/portfolio.d.ts.map +1 -0
- package/dist/services/portfolio/portfolio.js +116 -0
- package/dist/services/portfolio/portfolio.js.map +1 -0
- package/dist/services/privy/account.d.ts +16 -14
- package/dist/services/privy/account.d.ts.map +1 -1
- package/dist/services/privy/account.js +6 -16
- package/dist/services/privy/account.js.map +1 -1
- package/package.json +9 -9
|
@@ -1,47 +1,55 @@
|
|
|
1
|
-
import ora from "ora";
|
|
2
1
|
import chalk from "chalk";
|
|
3
2
|
import { AaveService } from "../../services/defi/aave.js";
|
|
4
3
|
import { getChainConfig } from "../../services/chain/constants.js";
|
|
5
4
|
import { resolveToken } from "../../services/fibrous/tokens.js";
|
|
6
5
|
import { HEALTH_FACTOR_WARNING_THRESHOLD, HEALTH_FACTOR_CRITICAL_THRESHOLD, } from "../../services/defi/constants.js";
|
|
7
|
-
import {
|
|
6
|
+
import { createSpinner, outputResult, formatResult, formatError } from "../../lib/format.js";
|
|
7
|
+
import { MINT } from "../../lib/brand.js";
|
|
8
8
|
export const aaveCommand = async (action, amount, tokenSymbol, opts) => {
|
|
9
|
-
const spinner =
|
|
9
|
+
const spinner = createSpinner("Initializing Aave service...").start();
|
|
10
10
|
try {
|
|
11
|
-
// Aave V3 is currently Base-only
|
|
12
11
|
const chainConfig = getChainConfig("base");
|
|
13
12
|
const aave = new AaveService(chainConfig);
|
|
14
13
|
try {
|
|
15
14
|
await attemptSessionLogin(aave, chainConfig);
|
|
16
15
|
}
|
|
17
16
|
catch {
|
|
18
|
-
//
|
|
17
|
+
// No session = read-only
|
|
19
18
|
}
|
|
20
19
|
const userAddress = aave.getAccountAddress();
|
|
21
|
-
if (
|
|
22
|
-
if (
|
|
20
|
+
if (action === "status") {
|
|
21
|
+
if (!userAddress) {
|
|
23
22
|
spinner.fail("No wallet connected. Run `fibx auth login` or `fibx auth import`.");
|
|
23
|
+
process.exitCode = 1;
|
|
24
|
+
return;
|
|
24
25
|
}
|
|
25
|
-
|
|
26
|
-
spinner.fail("No active session found. Please login or import a private key.");
|
|
27
|
-
}
|
|
26
|
+
await handleStatus(aave, userAddress, opts, spinner);
|
|
28
27
|
return;
|
|
29
28
|
}
|
|
30
|
-
if (action === "
|
|
31
|
-
await
|
|
29
|
+
if (action === "markets") {
|
|
30
|
+
await handleMarkets(aave, opts, spinner);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Write operations require an active wallet session
|
|
34
|
+
if (!userAddress) {
|
|
35
|
+
spinner.fail("No active session found. Please login or import a private key.");
|
|
36
|
+
process.exitCode = 1;
|
|
32
37
|
return;
|
|
33
38
|
}
|
|
34
39
|
if (!isValidAction(action)) {
|
|
35
40
|
spinner.fail(`Unknown action: ${action}`);
|
|
36
|
-
console.log(chalk.gray("Available actions: status, supply, borrow, repay, withdraw"));
|
|
41
|
+
console.log(chalk.gray("Available actions: status, markets, supply, borrow, repay, withdraw"));
|
|
42
|
+
process.exitCode = 1;
|
|
37
43
|
return;
|
|
38
44
|
}
|
|
39
45
|
if (!tokenSymbol) {
|
|
40
46
|
spinner.fail(`Token is required for action: ${action}`);
|
|
47
|
+
process.exitCode = 1;
|
|
41
48
|
return;
|
|
42
49
|
}
|
|
43
50
|
if (!amount) {
|
|
44
51
|
spinner.fail(`Amount is required for action: ${action}`);
|
|
52
|
+
process.exitCode = 1;
|
|
45
53
|
return;
|
|
46
54
|
}
|
|
47
55
|
spinner.text = `Resolving token ${tokenSymbol}...`;
|
|
@@ -57,7 +65,7 @@ export const aaveCommand = async (action, amount, tokenSymbol, opts) => {
|
|
|
57
65
|
spinner.text = "Interacting with Aave Protocol...";
|
|
58
66
|
switch (action) {
|
|
59
67
|
case "supply":
|
|
60
|
-
await handleSupply(aave, token, amount,
|
|
68
|
+
await handleSupply(aave, token, amount, spinner, opts);
|
|
61
69
|
break;
|
|
62
70
|
case "borrow":
|
|
63
71
|
await handleBorrow(aave, token, amount, spinner, opts);
|
|
@@ -71,12 +79,18 @@ export const aaveCommand = async (action, amount, tokenSymbol, opts) => {
|
|
|
71
79
|
}
|
|
72
80
|
}
|
|
73
81
|
catch (error) {
|
|
74
|
-
spinner.
|
|
75
|
-
|
|
82
|
+
spinner.fail("Aave operation failed");
|
|
83
|
+
console.error(formatError(error));
|
|
84
|
+
process.exitCode = 1;
|
|
76
85
|
}
|
|
77
86
|
};
|
|
78
87
|
function isValidAction(action) {
|
|
79
|
-
return ["status", "supply", "borrow", "repay", "withdraw"].includes(action);
|
|
88
|
+
return ["status", "markets", "supply", "borrow", "repay", "withdraw"].includes(action);
|
|
89
|
+
}
|
|
90
|
+
function getExplorerLink(txHash) {
|
|
91
|
+
const chain = getChainConfig("base");
|
|
92
|
+
const baseUrl = chain.viemChain.blockExplorers?.default.url;
|
|
93
|
+
return baseUrl ? `${baseUrl}/tx/${txHash}` : undefined;
|
|
80
94
|
}
|
|
81
95
|
async function attemptSessionLogin(aave, chainConfig) {
|
|
82
96
|
try {
|
|
@@ -85,22 +99,17 @@ async function attemptSessionLogin(aave, chainConfig) {
|
|
|
85
99
|
const session = loadSession();
|
|
86
100
|
if (session) {
|
|
87
101
|
const walletClient = getWalletClient(session, chainConfig);
|
|
88
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
89
102
|
aave.setWalletClient(walletClient);
|
|
90
103
|
}
|
|
91
104
|
}
|
|
92
105
|
catch {
|
|
93
|
-
//
|
|
106
|
+
// No session
|
|
94
107
|
}
|
|
95
108
|
}
|
|
96
109
|
async function handleStatus(aave, userAddress, opts, spinner) {
|
|
97
|
-
spinner.text = `Fetching data for ${userAddress}...`;
|
|
110
|
+
spinner.text = `Fetching Aave V3 data for ${userAddress.slice(0, 6)}...${userAddress.slice(-4)}...`;
|
|
98
111
|
const data = await aave.getUserAccountData(userAddress);
|
|
99
|
-
spinner.
|
|
100
|
-
if (opts.json) {
|
|
101
|
-
console.log(JSON.stringify(data));
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
112
|
+
spinner.succeed("Position loaded");
|
|
104
113
|
const hf = parseFloat(data.healthFactor);
|
|
105
114
|
let hfColor = chalk.green;
|
|
106
115
|
if (hf < HEALTH_FACTOR_CRITICAL_THRESHOLD)
|
|
@@ -108,38 +117,91 @@ async function handleStatus(aave, userAddress, opts, spinner) {
|
|
|
108
117
|
else if (hf < HEALTH_FACTOR_WARNING_THRESHOLD)
|
|
109
118
|
hfColor = chalk.yellow;
|
|
110
119
|
const hfDisplay = hf > 100 ? "Safe (>100)" : hf.toFixed(2);
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
120
|
+
if (opts.json) {
|
|
121
|
+
outputResult(data, { json: true });
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
console.log(chalk.bold.hex(MINT)("\n Aave V3 Position (Base)\n"));
|
|
125
|
+
console.log(formatResult({
|
|
126
|
+
healthFactor: hfColor(hfDisplay),
|
|
127
|
+
collateral: `$${parseFloat(data.totalCollateralUSD).toFixed(2)}`,
|
|
128
|
+
debt: `$${parseFloat(data.totalDebtUSD).toFixed(2)}`,
|
|
129
|
+
availableBorrow: `$${parseFloat(data.availableBorrowsUSD).toFixed(2)}`,
|
|
130
|
+
}));
|
|
131
|
+
console.log();
|
|
132
|
+
}
|
|
133
|
+
// Format large numbers compactly
|
|
134
|
+
const fmtNum = (s) => {
|
|
135
|
+
const n = parseFloat(s);
|
|
136
|
+
if (n >= 1_000_000)
|
|
137
|
+
return `${(n / 1_000_000).toFixed(2)}M`;
|
|
138
|
+
if (n >= 1_000)
|
|
139
|
+
return `${(n / 1_000).toFixed(2)}K`;
|
|
140
|
+
return n.toFixed(2);
|
|
141
|
+
};
|
|
142
|
+
async function handleMarkets(aave, opts, spinner) {
|
|
143
|
+
spinner.text = "Fetching Aave V3 markets...";
|
|
144
|
+
const markets = await aave.getMarkets();
|
|
145
|
+
spinner.succeed(`Found ${markets.length} active markets`);
|
|
146
|
+
if (opts.json) {
|
|
147
|
+
outputResult(markets, { json: true });
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
console.log(chalk.bold.hex(MINT)("\n Aave V3 Markets on Base\n"));
|
|
151
|
+
// Table header
|
|
152
|
+
const header = [
|
|
153
|
+
"Token".padEnd(10),
|
|
154
|
+
"Supply APY".padEnd(12),
|
|
155
|
+
"Borrow APY".padEnd(12),
|
|
156
|
+
"Total Supply".padEnd(18),
|
|
157
|
+
"Total Borrow".padEnd(18),
|
|
158
|
+
"LTV".padEnd(8),
|
|
159
|
+
].join(" ");
|
|
160
|
+
console.log(chalk.dim(` ${header}`));
|
|
161
|
+
console.log(chalk.dim(` ${"─".repeat(header.length)}`));
|
|
162
|
+
for (const m of markets) {
|
|
163
|
+
const frozen = m.isFrozen ? chalk.yellow(" ❄") : "";
|
|
164
|
+
const supplyColor = chalk.green;
|
|
165
|
+
const borrowVal = parseFloat(m.borrowAPY);
|
|
166
|
+
const borrowColor = borrowVal > 10 ? chalk.red : borrowVal > 5 ? chalk.yellow : chalk.white;
|
|
167
|
+
const row = [
|
|
168
|
+
chalk.white.bold(m.symbol.padEnd(10)),
|
|
169
|
+
supplyColor(m.supplyAPY.padEnd(12)),
|
|
170
|
+
borrowColor(m.borrowAPY.padEnd(12)),
|
|
171
|
+
chalk.dim(fmtNum(m.totalSupply).padEnd(18)),
|
|
172
|
+
chalk.dim(fmtNum(m.totalBorrow).padEnd(18)),
|
|
173
|
+
chalk.white(m.ltv.padEnd(8)),
|
|
174
|
+
].join(" ");
|
|
175
|
+
console.log(` ${row}${frozen}`);
|
|
176
|
+
}
|
|
177
|
+
console.log();
|
|
119
178
|
}
|
|
120
|
-
async function handleSupply(aave, token, amount,
|
|
121
|
-
// If native ETH, allow service to handle auto-wrap (token is already resolved to WETH address)
|
|
179
|
+
async function handleSupply(aave, token, amount, spinner, opts) {
|
|
122
180
|
const txHash = await aave.supplyWithAutoWrap(token.address, amount, (status) => {
|
|
123
181
|
spinner.text = status;
|
|
124
182
|
});
|
|
125
|
-
spinner.succeed("Supply
|
|
183
|
+
spinner.succeed("Supply confirmed");
|
|
184
|
+
const explorer = getExplorerLink(txHash);
|
|
126
185
|
outputResult({
|
|
127
186
|
action: "Supply",
|
|
128
187
|
amount,
|
|
129
188
|
token: token.symbol,
|
|
130
189
|
txHash,
|
|
190
|
+
...(explorer ? { explorer } : {}),
|
|
131
191
|
chain: "base",
|
|
132
192
|
}, { json: !!opts.json });
|
|
133
193
|
}
|
|
134
194
|
async function handleBorrow(aave, token, amount, spinner, opts) {
|
|
135
195
|
spinner.text = "Signaling Aave Borrow...";
|
|
136
196
|
const tx = await aave.borrow(token.address, amount);
|
|
137
|
-
spinner.succeed("Borrow
|
|
197
|
+
spinner.succeed("Borrow confirmed");
|
|
198
|
+
const explorer = getExplorerLink(tx);
|
|
138
199
|
outputResult({
|
|
139
200
|
action: "Borrow",
|
|
140
201
|
amount,
|
|
141
202
|
token: token.symbol,
|
|
142
203
|
txHash: tx,
|
|
204
|
+
...(explorer ? { explorer } : {}),
|
|
143
205
|
chain: "base",
|
|
144
206
|
}, { json: !!opts.json });
|
|
145
207
|
}
|
|
@@ -147,26 +209,29 @@ async function handleRepay(aave, token, amount, spinner, opts) {
|
|
|
147
209
|
const txHash = await aave.repayWithAutoWrap(token.address, amount, (status) => {
|
|
148
210
|
spinner.text = status;
|
|
149
211
|
});
|
|
150
|
-
spinner.succeed("Repay
|
|
212
|
+
spinner.succeed("Repay confirmed");
|
|
213
|
+
const explorer = getExplorerLink(txHash);
|
|
151
214
|
outputResult({
|
|
152
215
|
action: "Repay",
|
|
153
216
|
amount: amount === "-1" || amount.toLowerCase() === "max" ? "MAX" : amount,
|
|
154
217
|
token: token.symbol,
|
|
155
218
|
txHash,
|
|
219
|
+
...(explorer ? { explorer } : {}),
|
|
156
220
|
chain: "base",
|
|
157
221
|
}, { json: !!opts.json });
|
|
158
222
|
}
|
|
159
223
|
async function handleWithdraw(aave, token, amount, spinner, opts, isNativeETH = false) {
|
|
160
|
-
// Delegate to service
|
|
161
224
|
const txHash = await aave.withdrawWithAutoUnwrap(token.address, amount, isNativeETH, (status) => {
|
|
162
225
|
spinner.text = status;
|
|
163
226
|
});
|
|
164
|
-
spinner.succeed("Withdraw
|
|
227
|
+
spinner.succeed("Withdraw confirmed");
|
|
228
|
+
const explorer = getExplorerLink(txHash);
|
|
165
229
|
outputResult({
|
|
166
230
|
action: "Withdraw",
|
|
167
231
|
amount,
|
|
168
232
|
token: isNativeETH ? "ETH (unwrapped)" : token.symbol,
|
|
169
233
|
txHash,
|
|
234
|
+
...(explorer ? { explorer } : {}),
|
|
170
235
|
chain: "base",
|
|
171
236
|
}, { json: !!opts.json });
|
|
172
237
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aave.js","sourceRoot":"","sources":["../../../src/commands/defi/aave.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"aave.js","sourceRoot":"","sources":["../../../src/commands/defi/aave.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/portfolio/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAKN,KAAK,aAAa,EAClB,MAAM,qBAAqB,CAAC;AA6D7B,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBzE"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { getPortfolio } from "../../services/portfolio/portfolio.js";
|
|
3
|
+
import { createSpinner, formatResult, formatTable, formatError, } from "../../lib/format.js";
|
|
4
|
+
import { MINT } from "../../lib/brand.js";
|
|
5
|
+
function formatUsd(value) {
|
|
6
|
+
return `$${value.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
|
|
7
|
+
}
|
|
8
|
+
function printPortfolio(portfolio) {
|
|
9
|
+
const shortAddr = `${portfolio.wallet.slice(0, 6)}...${portfolio.wallet.slice(-4)}`;
|
|
10
|
+
console.log();
|
|
11
|
+
console.log(chalk.bold.hex(MINT)(` Portfolio — ${shortAddr}`));
|
|
12
|
+
console.log(chalk.dim(" " + "═".repeat(52)));
|
|
13
|
+
for (const chain of portfolio.chains) {
|
|
14
|
+
if (chain.assets.length === 0)
|
|
15
|
+
continue;
|
|
16
|
+
console.log();
|
|
17
|
+
console.log(chalk.bold.white(` ${chain.chain}`));
|
|
18
|
+
console.log(formatTable(["Token", "Balance", "USD Value"], chain.assets.map((asset) => [
|
|
19
|
+
asset.symbol,
|
|
20
|
+
parseFloat(asset.balance).toFixed(4),
|
|
21
|
+
formatUsd(asset.usdValue),
|
|
22
|
+
])));
|
|
23
|
+
}
|
|
24
|
+
if (portfolio.defi.length > 0) {
|
|
25
|
+
for (const pos of portfolio.defi) {
|
|
26
|
+
console.log();
|
|
27
|
+
console.log(chalk.bold.white(` DeFi — ${pos.protocol} (${pos.chain})`));
|
|
28
|
+
const hf = parseFloat(pos.healthFactor);
|
|
29
|
+
const hfStr = hf > 100 ? "Safe (>100)" : hf.toFixed(2);
|
|
30
|
+
const hfColor = hf > 2 ? chalk.green : hf > 1.2 ? chalk.yellow : chalk.red;
|
|
31
|
+
console.log(formatResult({
|
|
32
|
+
collateral: formatUsd(pos.collateralUsd),
|
|
33
|
+
debt: `-${formatUsd(pos.debtUsd)}`,
|
|
34
|
+
healthFactor: hfColor(hfStr),
|
|
35
|
+
netPosition: formatUsd(pos.netUsd),
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
console.log();
|
|
40
|
+
console.log(chalk.dim(" " + "═".repeat(52)));
|
|
41
|
+
console.log(formatResult({
|
|
42
|
+
totalPortfolioUsd: chalk.bold.hex(MINT)(formatUsd(portfolio.totalUsd)),
|
|
43
|
+
}));
|
|
44
|
+
console.log();
|
|
45
|
+
}
|
|
46
|
+
export async function portfolioCommand(opts) {
|
|
47
|
+
const spinner = createSpinner("Fetching portfolio across all chains...").start();
|
|
48
|
+
try {
|
|
49
|
+
const portfolio = await getPortfolio();
|
|
50
|
+
spinner.succeed("Portfolio loaded");
|
|
51
|
+
if (opts.json) {
|
|
52
|
+
console.log(JSON.stringify(portfolio, null, 2));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
printPortfolio(portfolio);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
spinner.fail("Failed to load portfolio");
|
|
60
|
+
console.error(formatError(error));
|
|
61
|
+
process.exitCode = 1;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/portfolio/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/trade/status.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/trade/status.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,aAAa,EAAsB,MAAM,qBAAqB,CAAC;AAG3F,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BtE"}
|
|
@@ -1,32 +1,30 @@
|
|
|
1
1
|
import { loadSession } from "../../services/auth/session.js";
|
|
2
2
|
import { checkHealth } from "../../services/fibrous/health.js";
|
|
3
3
|
import { getChainConfig } from "../../services/chain/constants.js";
|
|
4
|
-
import { outputResult
|
|
4
|
+
import { outputResult } from "../../lib/format.js";
|
|
5
|
+
import { runCommand } from "../../lib/cli-helpers.js";
|
|
5
6
|
export async function statusCommand(opts) {
|
|
6
|
-
|
|
7
|
+
await runCommand("Checking status...", "Status check complete", "Status check failed", async (spinner) => {
|
|
7
8
|
const globalOpts = opts;
|
|
8
9
|
const chainName = globalOpts.chain || "base";
|
|
9
10
|
const chain = getChainConfig(chainName);
|
|
10
11
|
const session = loadSession();
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
12
|
+
spinner.text = "Checking Fibrous API...";
|
|
13
|
+
let fibrousHealth;
|
|
14
|
+
try {
|
|
15
|
+
const health = await checkHealth(chain);
|
|
16
|
+
fibrousHealth = { ok: true, message: health.message };
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
fibrousHealth = { ok: false, message: "unreachable" };
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
21
22
|
chain: chain.name,
|
|
22
23
|
chainId: chain.id,
|
|
23
24
|
authenticated: !!session,
|
|
24
|
-
wallet: session?.walletAddress ??
|
|
25
|
-
fibrous: fibrousHealth,
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
catch (error) {
|
|
29
|
-
outputError(error, opts);
|
|
30
|
-
}
|
|
25
|
+
wallet: session?.walletAddress ?? "N/A",
|
|
26
|
+
fibrous: fibrousHealth.ok ? "✓ healthy" : "✗ unreachable",
|
|
27
|
+
};
|
|
28
|
+
}, (data) => outputResult(data, opts));
|
|
31
29
|
}
|
|
32
30
|
//# sourceMappingURL=status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/trade/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/trade/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,YAAY,EAA0C,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAmB;IACtD,MAAM,UAAU,CACf,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,KAAK,EAAE,OAAO,EAAE,EAAE;QACjB,MAAM,UAAU,GAAG,IAAgC,CAAC;QACpD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,IAAI,MAAM,CAAC;QAC7C,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;QAE9B,OAAO,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACzC,IAAI,aAA+C,CAAC;QACpD,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;YACxC,aAAa,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACR,aAAa,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QACvD,CAAC;QAED,OAAO;YACN,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,aAAa,EAAE,CAAC,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,EAAE,aAAa,IAAI,KAAK;YACvC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe;SACzD,CAAC;IACH,CAAC,EACD,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAClC,CAAC;AACH,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { type OutputOptions } from "../../lib/format.js";
|
|
|
2
2
|
interface TradeOptions extends OutputOptions {
|
|
3
3
|
slippage: number;
|
|
4
4
|
approveMax?: boolean;
|
|
5
|
+
simulate?: boolean;
|
|
5
6
|
}
|
|
6
7
|
export declare function tradeCommand(amount: string, from: string, to: string, opts: TradeOptions): Promise<void>;
|
|
7
8
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../../src/commands/trade/swap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../../src/commands/trade/swap.ts"],"names":[],"mappings":"AAiBA,OAAO,EAIN,KAAK,aAAa,EAElB,MAAM,qBAAqB,CAAC;AAE7B,UAAU,YAAa,SAAQ,aAAa;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,YAAY,CACjC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC,CAuQf"}
|