@paylobster/cli 4.1.0 → 4.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.
- package/IMPLEMENTATION_SUMMARY.md +288 -0
- package/NEW_FEATURES.md +228 -0
- package/dist/src/commands/bridge.d.ts +6 -0
- package/dist/src/commands/bridge.d.ts.map +1 -0
- package/dist/src/commands/bridge.js +273 -0
- package/dist/src/commands/bridge.js.map +1 -0
- package/dist/src/commands/portfolio.d.ts +6 -0
- package/dist/src/commands/portfolio.d.ts.map +1 -0
- package/dist/src/commands/portfolio.js +179 -0
- package/dist/src/commands/portfolio.js.map +1 -0
- package/dist/src/commands/swap.d.ts +6 -0
- package/dist/src/commands/swap.d.ts.map +1 -0
- package/dist/src/commands/swap.js +278 -0
- package/dist/src/commands/swap.js.map +1 -0
- package/dist/src/commands/treasury.d.ts +6 -0
- package/dist/src/commands/treasury.d.ts.map +1 -0
- package/dist/src/commands/treasury.js +781 -0
- package/dist/src/commands/treasury.js.map +1 -0
- package/dist/src/index.js +9 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/types.d.ts +1 -0
- package/dist/src/lib/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/commands/bridge.ts +443 -0
- package/src/commands/portfolio.ts +227 -0
- package/src/commands/swap.ts +365 -0
- package/src/commands/treasury.ts +907 -0
- package/src/index.ts +9 -1
- package/src/lib/types.ts +1 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createBridgeCommand = createBridgeCommand;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const wallet_1 = require("../lib/wallet");
|
|
9
|
+
const display_1 = require("../lib/display");
|
|
10
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
+
const LIFI_API_URL = 'https://li.quest/v1';
|
|
12
|
+
// Chain name to ID mapping
|
|
13
|
+
const CHAIN_IDS = {
|
|
14
|
+
base: 8453,
|
|
15
|
+
solana: 1151111081099710,
|
|
16
|
+
ethereum: 1,
|
|
17
|
+
polygon: 137,
|
|
18
|
+
arbitrum: 42161,
|
|
19
|
+
optimism: 10,
|
|
20
|
+
avalanche: 43114,
|
|
21
|
+
bsc: 56,
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Resolve chain name to chain ID
|
|
25
|
+
*/
|
|
26
|
+
function resolveChainId(input) {
|
|
27
|
+
const lowerInput = input.toLowerCase();
|
|
28
|
+
if (CHAIN_IDS[lowerInput]) {
|
|
29
|
+
return CHAIN_IDS[lowerInput];
|
|
30
|
+
}
|
|
31
|
+
// Try to parse as number
|
|
32
|
+
const parsed = parseInt(input, 10);
|
|
33
|
+
if (!isNaN(parsed)) {
|
|
34
|
+
return parsed;
|
|
35
|
+
}
|
|
36
|
+
throw new Error(`Unknown chain: ${input}`);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Format amount with decimals
|
|
40
|
+
*/
|
|
41
|
+
function formatTokenAmount(amount, decimals) {
|
|
42
|
+
const num = BigInt(amount);
|
|
43
|
+
const divisor = BigInt(10 ** decimals);
|
|
44
|
+
const whole = num / divisor;
|
|
45
|
+
const fraction = num % divisor;
|
|
46
|
+
if (fraction === 0n) {
|
|
47
|
+
return whole.toString();
|
|
48
|
+
}
|
|
49
|
+
const fractionStr = fraction.toString().padStart(decimals, '0');
|
|
50
|
+
const trimmed = fractionStr.replace(/0+$/, '');
|
|
51
|
+
return `${whole}.${trimmed}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parse amount with decimals
|
|
55
|
+
*/
|
|
56
|
+
function parseTokenAmount(amount, decimals) {
|
|
57
|
+
const [whole = '0', fraction = '0'] = amount.split('.');
|
|
58
|
+
const paddedFraction = fraction.padEnd(decimals, '0').slice(0, decimals);
|
|
59
|
+
return (BigInt(whole) * BigInt(10 ** decimals) + BigInt(paddedFraction)).toString();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Call Li.Fi API
|
|
63
|
+
*/
|
|
64
|
+
async function callLiFiAPI(endpoint) {
|
|
65
|
+
const response = await fetch(`${LIFI_API_URL}${endpoint}`);
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
const errorText = await response.text();
|
|
68
|
+
throw new Error(`Li.Fi API error: ${response.status} - ${errorText}`);
|
|
69
|
+
}
|
|
70
|
+
return response.json();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get bridge quote
|
|
74
|
+
*/
|
|
75
|
+
async function getBridgeQuote(fromChain, toChain, fromToken, toToken, amount, fromAddress) {
|
|
76
|
+
const endpoint = `/quote?fromChain=${fromChain}&toChain=${toChain}&fromToken=${fromToken}&toToken=${toToken}&fromAmount=${amount}&fromAddress=${fromAddress}`;
|
|
77
|
+
const response = await callLiFiAPI(endpoint);
|
|
78
|
+
return response;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get bridge status
|
|
82
|
+
*/
|
|
83
|
+
async function getBridgeStatus(txHash) {
|
|
84
|
+
const endpoint = `/status?txHash=${txHash}`;
|
|
85
|
+
return callLiFiAPI(endpoint);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get supported chains
|
|
89
|
+
*/
|
|
90
|
+
async function getChains() {
|
|
91
|
+
const response = await callLiFiAPI('/chains');
|
|
92
|
+
return response.chains;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Create bridge command
|
|
96
|
+
*/
|
|
97
|
+
function createBridgeCommand() {
|
|
98
|
+
const cmd = new commander_1.Command('bridge')
|
|
99
|
+
.description('Cross-chain token bridges using Li.Fi');
|
|
100
|
+
// Bridge quote subcommand
|
|
101
|
+
cmd
|
|
102
|
+
.command('quote')
|
|
103
|
+
.description('Get bridge quote')
|
|
104
|
+
.requiredOption('--from <chain>', 'Source chain (e.g., base, ethereum, solana)')
|
|
105
|
+
.requiredOption('--to <chain>', 'Destination chain')
|
|
106
|
+
.requiredOption('--token <token>', 'Token symbol (e.g., USDC)')
|
|
107
|
+
.requiredOption('--amount <amount>', 'Amount to bridge')
|
|
108
|
+
.option('--json', 'Output as JSON')
|
|
109
|
+
.action(async (options) => {
|
|
110
|
+
try {
|
|
111
|
+
const address = (0, wallet_1.getWalletAddress)();
|
|
112
|
+
const fromChainId = resolveChainId(options.from);
|
|
113
|
+
const toChainId = resolveChainId(options.to);
|
|
114
|
+
// Assume 6 decimals for USDC, 18 for others
|
|
115
|
+
const decimals = options.token.toUpperCase() === 'USDC' ? 6 : 18;
|
|
116
|
+
const amount = parseTokenAmount(options.amount, decimals);
|
|
117
|
+
const quote = await (0, display_1.withSpinner)('Fetching bridge quote...', async () => getBridgeQuote(fromChainId, toChainId, options.token, options.token, amount, address));
|
|
118
|
+
const fromAmount = formatTokenAmount(quote.estimate.fromAmount, quote.action.fromToken.decimals);
|
|
119
|
+
const toAmount = formatTokenAmount(quote.estimate.toAmount, quote.action.toToken.decimals);
|
|
120
|
+
// Calculate fee
|
|
121
|
+
const totalFeeUSD = quote.estimate.feeCosts.reduce((sum, fee) => sum + parseFloat(fee.amountUSD || '0'), 0);
|
|
122
|
+
const feeAmount = parseFloat(fromAmount) - parseFloat(toAmount);
|
|
123
|
+
// Format time
|
|
124
|
+
const timeMinutes = Math.ceil(quote.estimate.executionDuration / 60);
|
|
125
|
+
if ((0, display_1.outputJSON)({
|
|
126
|
+
fromChain: options.from,
|
|
127
|
+
toChain: options.to,
|
|
128
|
+
token: options.token.toUpperCase(),
|
|
129
|
+
fromAmount,
|
|
130
|
+
toAmount,
|
|
131
|
+
fee: feeAmount.toFixed(decimals),
|
|
132
|
+
feeUSD: totalFeeUSD.toFixed(2),
|
|
133
|
+
estimatedTime: `${timeMinutes} min`,
|
|
134
|
+
via: quote.toolDetails.name,
|
|
135
|
+
}, options)) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// Pretty output
|
|
139
|
+
console.log();
|
|
140
|
+
console.log(chalk_1.default.bold.cyan('🌉 Bridge Quote'));
|
|
141
|
+
console.log();
|
|
142
|
+
console.log(' From:', chalk_1.default.white.bold(fromAmount), chalk_1.default.gray(`${options.token.toUpperCase()} (${options.from})`));
|
|
143
|
+
console.log(' To: ', chalk_1.default.white.bold(toAmount), chalk_1.default.gray(`${options.token.toUpperCase()} (${options.to})`));
|
|
144
|
+
console.log(' Fee: ', chalk_1.default.yellow(feeAmount.toFixed(decimals)), chalk_1.default.gray(`${options.token.toUpperCase()} (~$${totalFeeUSD.toFixed(2)})`));
|
|
145
|
+
console.log(' Time:', chalk_1.default.gray(`~${timeMinutes} min`));
|
|
146
|
+
console.log(' Via: ', chalk_1.default.gray(quote.toolDetails.name));
|
|
147
|
+
console.log();
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
(0, display_1.error)(`Failed to get bridge quote: ${err}`);
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
// Bridge execute subcommand
|
|
155
|
+
cmd
|
|
156
|
+
.command('execute')
|
|
157
|
+
.description('Execute cross-chain bridge')
|
|
158
|
+
.requiredOption('--from <chain>', 'Source chain (e.g., base, ethereum, solana)')
|
|
159
|
+
.requiredOption('--to <chain>', 'Destination chain')
|
|
160
|
+
.requiredOption('--token <token>', 'Token symbol (e.g., USDC)')
|
|
161
|
+
.requiredOption('--amount <amount>', 'Amount to bridge')
|
|
162
|
+
.option('--yes', 'Skip confirmation')
|
|
163
|
+
.option('--json', 'Output as JSON')
|
|
164
|
+
.action(async (options) => {
|
|
165
|
+
try {
|
|
166
|
+
const address = (0, wallet_1.getWalletAddress)();
|
|
167
|
+
const fromChainId = resolveChainId(options.from);
|
|
168
|
+
const toChainId = resolveChainId(options.to);
|
|
169
|
+
const decimals = options.token.toUpperCase() === 'USDC' ? 6 : 18;
|
|
170
|
+
const amount = parseTokenAmount(options.amount, decimals);
|
|
171
|
+
const quote = await (0, display_1.withSpinner)('Fetching bridge quote...', async () => getBridgeQuote(fromChainId, toChainId, options.token, options.token, amount, address));
|
|
172
|
+
const fromAmount = formatTokenAmount(quote.estimate.fromAmount, quote.action.fromToken.decimals);
|
|
173
|
+
const toAmount = formatTokenAmount(quote.estimate.toAmount, quote.action.toToken.decimals);
|
|
174
|
+
// Show quote and confirm
|
|
175
|
+
if (!options.yes) {
|
|
176
|
+
console.log();
|
|
177
|
+
console.log(chalk_1.default.bold.cyan('🌉 Bridge Quote'));
|
|
178
|
+
console.log();
|
|
179
|
+
console.log(' From:', chalk_1.default.white.bold(fromAmount), chalk_1.default.gray(`${options.token.toUpperCase()} (${options.from})`));
|
|
180
|
+
console.log(' To: ', chalk_1.default.white.bold(toAmount), chalk_1.default.gray(`${options.token.toUpperCase()} (${options.to})`));
|
|
181
|
+
console.log();
|
|
182
|
+
const confirmed = await (0, display_1.confirm)('Confirm bridge?');
|
|
183
|
+
if (!confirmed) {
|
|
184
|
+
(0, display_1.info)('Cancelled');
|
|
185
|
+
process.exit(0);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
(0, display_1.info)('Bridge execution not yet implemented - requires viem integration');
|
|
189
|
+
(0, display_1.info)('Transaction data available in quote response');
|
|
190
|
+
if ((0, display_1.outputJSON)({
|
|
191
|
+
quote,
|
|
192
|
+
note: 'Execute bridge by sending transaction with quote.transactionRequest',
|
|
193
|
+
}, options)) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (quote.transactionRequest) {
|
|
197
|
+
console.log();
|
|
198
|
+
(0, display_1.info)('To execute this bridge, send a transaction with the following data:');
|
|
199
|
+
console.log(chalk_1.default.gray(' To: '), quote.transactionRequest.to);
|
|
200
|
+
console.log(chalk_1.default.gray(' Data: '), quote.transactionRequest.data.slice(0, 66) + '...');
|
|
201
|
+
console.log();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
(0, display_1.error)(`Failed to execute bridge: ${err}`);
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
// Bridge status subcommand
|
|
210
|
+
cmd
|
|
211
|
+
.command('status')
|
|
212
|
+
.description('Check bridge transaction status')
|
|
213
|
+
.argument('<txHash>', 'Transaction hash')
|
|
214
|
+
.option('--json', 'Output as JSON')
|
|
215
|
+
.action(async (txHash, options) => {
|
|
216
|
+
try {
|
|
217
|
+
const status = await (0, display_1.withSpinner)('Fetching bridge status...', async () => getBridgeStatus(txHash));
|
|
218
|
+
if ((0, display_1.outputJSON)(status, options)) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
console.log();
|
|
222
|
+
console.log(chalk_1.default.bold.cyan('🌉 Bridge Status'));
|
|
223
|
+
console.log();
|
|
224
|
+
console.log(' Status: ', chalk_1.default.white.bold(status.status));
|
|
225
|
+
console.log(' Substatus:', chalk_1.default.gray(status.substatus));
|
|
226
|
+
console.log();
|
|
227
|
+
console.log(' Sending:');
|
|
228
|
+
console.log(' Tx: ', chalk_1.default.gray(status.sending.txHash));
|
|
229
|
+
console.log(' Amount:', chalk_1.default.white(status.sending.amount), chalk_1.default.gray(status.sending.token.symbol));
|
|
230
|
+
if (status.receiving) {
|
|
231
|
+
console.log();
|
|
232
|
+
console.log(' Receiving:');
|
|
233
|
+
console.log(' Tx: ', chalk_1.default.gray(status.receiving.txHash));
|
|
234
|
+
console.log(' Amount:', chalk_1.default.white(status.receiving.amount), chalk_1.default.gray(status.receiving.token.symbol));
|
|
235
|
+
}
|
|
236
|
+
console.log();
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
(0, display_1.error)(`Failed to get bridge status: ${err}`);
|
|
240
|
+
process.exit(1);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
// List chains subcommand
|
|
244
|
+
cmd
|
|
245
|
+
.command('chains')
|
|
246
|
+
.description('List supported chains')
|
|
247
|
+
.option('--json', 'Output as JSON')
|
|
248
|
+
.action(async (options) => {
|
|
249
|
+
try {
|
|
250
|
+
const chains = await (0, display_1.withSpinner)('Fetching supported chains...', async () => getChains());
|
|
251
|
+
if ((0, display_1.outputJSON)({ chains }, options)) {
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
console.log();
|
|
255
|
+
console.log(chalk_1.default.bold.cyan('🌐 Supported Chains'));
|
|
256
|
+
console.log();
|
|
257
|
+
// Show popular chains first
|
|
258
|
+
const popularChains = chains.filter(c => ['bas', 'eth', 'pol', 'arb', 'opt', 'sol', 'ava', 'bsc'].includes(c.key.toLowerCase()));
|
|
259
|
+
for (const chain of popularChains) {
|
|
260
|
+
console.log(chalk_1.default.white.bold(chain.name.padEnd(15)), chalk_1.default.gray(`ID: ${chain.id}`), chalk_1.default.dim(`(${chain.nativeToken.symbol})`));
|
|
261
|
+
}
|
|
262
|
+
console.log();
|
|
263
|
+
console.log(chalk_1.default.dim(`${chains.length} total chains supported`));
|
|
264
|
+
console.log();
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
(0, display_1.error)(`Failed to fetch chains: ${err}`);
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
return cmd;
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../../src/commands/bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../../src/commands/portfolio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwIpC;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAuFhD"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createPortfolioCommand = createPortfolioCommand;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const wallet_1 = require("../lib/wallet");
|
|
9
|
+
const contracts_1 = require("../lib/contracts");
|
|
10
|
+
const config_1 = require("../lib/config");
|
|
11
|
+
const display_1 = require("../lib/display");
|
|
12
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
13
|
+
const BASE_TOKENS = [
|
|
14
|
+
{ symbol: 'ETH', address: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE', decimals: 18, isNative: true },
|
|
15
|
+
{ symbol: 'USDC', address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', decimals: 6 },
|
|
16
|
+
{ symbol: 'WETH', address: '0x4200000000000000000000000000000000000006', decimals: 18 },
|
|
17
|
+
{ symbol: 'DAI', address: '0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb', decimals: 18 },
|
|
18
|
+
{ symbol: 'USDbC', address: '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA', decimals: 6 },
|
|
19
|
+
];
|
|
20
|
+
const ERC20_ABI = [
|
|
21
|
+
{
|
|
22
|
+
inputs: [{ name: 'account', type: 'address' }],
|
|
23
|
+
name: 'balanceOf',
|
|
24
|
+
outputs: [{ name: '', type: 'uint256' }],
|
|
25
|
+
stateMutability: 'view',
|
|
26
|
+
type: 'function',
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
/**
|
|
30
|
+
* Format token amount with decimals
|
|
31
|
+
*/
|
|
32
|
+
function formatTokenAmount(amount, decimals) {
|
|
33
|
+
const num = amount;
|
|
34
|
+
const divisor = BigInt(10 ** decimals);
|
|
35
|
+
const whole = num / divisor;
|
|
36
|
+
const fraction = num % divisor;
|
|
37
|
+
if (fraction === 0n) {
|
|
38
|
+
return whole.toString();
|
|
39
|
+
}
|
|
40
|
+
const fractionStr = fraction.toString().padStart(decimals, '0');
|
|
41
|
+
const trimmed = fractionStr.replace(/0+$/, '');
|
|
42
|
+
const limited = trimmed.slice(0, 6); // Limit to 6 decimal places for display
|
|
43
|
+
return `${whole}.${limited}`;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get token price in USD (mock - in production, use price oracle)
|
|
47
|
+
*/
|
|
48
|
+
async function getTokenPriceUSD(symbol) {
|
|
49
|
+
// Mock prices - in production, integrate with price oracle
|
|
50
|
+
const prices = {
|
|
51
|
+
ETH: 3000,
|
|
52
|
+
WETH: 3000,
|
|
53
|
+
USDC: 1,
|
|
54
|
+
DAI: 1,
|
|
55
|
+
USDbC: 1,
|
|
56
|
+
};
|
|
57
|
+
return prices[symbol] || 0;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get token balance
|
|
61
|
+
*/
|
|
62
|
+
async function getTokenBalance(address, token) {
|
|
63
|
+
const config = (0, config_1.loadConfig)();
|
|
64
|
+
const publicClient = (0, contracts_1.getPublicClient)(config.network);
|
|
65
|
+
if (token.isNative) {
|
|
66
|
+
// Get native ETH balance
|
|
67
|
+
return await publicClient.getBalance({ address });
|
|
68
|
+
}
|
|
69
|
+
// Get ERC20 token balance
|
|
70
|
+
try {
|
|
71
|
+
const balance = await publicClient.readContract({
|
|
72
|
+
address: token.address,
|
|
73
|
+
abi: ERC20_ABI,
|
|
74
|
+
functionName: 'balanceOf',
|
|
75
|
+
args: [address],
|
|
76
|
+
});
|
|
77
|
+
return balance;
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
// If token doesn't exist or error, return 0
|
|
81
|
+
return 0n;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get all token balances
|
|
86
|
+
*/
|
|
87
|
+
async function getPortfolioBalances(address, tokens) {
|
|
88
|
+
const balances = await Promise.all(tokens.map(async (token) => {
|
|
89
|
+
const balanceRaw = await getTokenBalance(address, token);
|
|
90
|
+
const balance = formatTokenAmount(balanceRaw, token.decimals);
|
|
91
|
+
const price = await getTokenPriceUSD(token.symbol);
|
|
92
|
+
const valueUSD = parseFloat(balance) * price;
|
|
93
|
+
return {
|
|
94
|
+
symbol: token.symbol,
|
|
95
|
+
balance,
|
|
96
|
+
balanceRaw,
|
|
97
|
+
valueUSD,
|
|
98
|
+
};
|
|
99
|
+
}));
|
|
100
|
+
// Filter out zero balances and sort by USD value
|
|
101
|
+
return balances
|
|
102
|
+
.filter((b) => b.balanceRaw > 0n)
|
|
103
|
+
.sort((a, b) => b.valueUSD - a.valueUSD);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Create portfolio command
|
|
107
|
+
*/
|
|
108
|
+
function createPortfolioCommand() {
|
|
109
|
+
const cmd = new commander_1.Command('portfolio')
|
|
110
|
+
.description('View token portfolio and balances')
|
|
111
|
+
.option('--chain <chain>', 'Filter by chain (currently only Base supported)', 'base')
|
|
112
|
+
.option('--json', 'Output as JSON')
|
|
113
|
+
.action(async (options) => {
|
|
114
|
+
try {
|
|
115
|
+
const address = (0, wallet_1.getWalletAddress)();
|
|
116
|
+
if (options.chain.toLowerCase() !== 'base') {
|
|
117
|
+
(0, display_1.error)('Currently only Base chain is supported');
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
const balances = await (0, display_1.withSpinner)('Fetching portfolio balances...', async () => getPortfolioBalances(address, BASE_TOKENS));
|
|
121
|
+
if (balances.length === 0) {
|
|
122
|
+
if ((0, display_1.outputJSON)({ balances: [], totalUSD: 0 }, options)) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
console.log();
|
|
126
|
+
console.log(chalk_1.default.yellow('No token balances found'));
|
|
127
|
+
console.log();
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const totalUSD = balances.reduce((sum, b) => sum + b.valueUSD, 0);
|
|
131
|
+
if ((0, display_1.outputJSON)({
|
|
132
|
+
address,
|
|
133
|
+
chain: 'Base',
|
|
134
|
+
balances: balances.map(b => ({
|
|
135
|
+
symbol: b.symbol,
|
|
136
|
+
balance: b.balance,
|
|
137
|
+
valueUSD: b.valueUSD.toFixed(2),
|
|
138
|
+
})),
|
|
139
|
+
totalUSD: totalUSD.toFixed(2),
|
|
140
|
+
}, options)) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// Pretty output
|
|
144
|
+
console.log();
|
|
145
|
+
console.log(chalk_1.default.bold.cyan('💼 Portfolio'));
|
|
146
|
+
console.log(chalk_1.default.gray('─'.repeat(60)));
|
|
147
|
+
console.log(chalk_1.default.gray('Address: ') + chalk_1.default.white(address));
|
|
148
|
+
console.log(chalk_1.default.gray('Chain: ') + chalk_1.default.white('Base'));
|
|
149
|
+
console.log(chalk_1.default.gray('─'.repeat(60)));
|
|
150
|
+
console.log();
|
|
151
|
+
// Create table
|
|
152
|
+
const table = (0, display_1.createTable)({
|
|
153
|
+
head: ['Token', 'Balance', 'Value (USD)'],
|
|
154
|
+
colAligns: ['left', 'right', 'right'],
|
|
155
|
+
});
|
|
156
|
+
for (const token of balances) {
|
|
157
|
+
table.push([
|
|
158
|
+
chalk_1.default.white.bold(token.symbol),
|
|
159
|
+
chalk_1.default.white((0, display_1.formatNumber)(token.balance)),
|
|
160
|
+
chalk_1.default.green('$' + (0, display_1.formatNumber)(token.valueUSD.toFixed(2))),
|
|
161
|
+
]);
|
|
162
|
+
}
|
|
163
|
+
console.log(table.toString());
|
|
164
|
+
console.log();
|
|
165
|
+
console.log(chalk_1.default.gray('─'.repeat(60)));
|
|
166
|
+
console.log(chalk_1.default.white.bold('Total Portfolio Value:'), chalk_1.default.green.bold('$' + (0, display_1.formatNumber)(totalUSD.toFixed(2))));
|
|
167
|
+
console.log(chalk_1.default.gray('─'.repeat(60)));
|
|
168
|
+
console.log();
|
|
169
|
+
console.log(chalk_1.default.dim('Note: Prices are approximate and for display only.'));
|
|
170
|
+
console.log();
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
(0, display_1.error)(`Failed to fetch portfolio: ${err}`);
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
return cmd;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=portfolio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../../src/commands/portfolio.ts"],"names":[],"mappings":";;;;;AA2IA,wDAuFC;AAlOD,yCAAoC;AACpC,0CAAiD;AACjD,gDAAwF;AACxF,0CAA2C;AAC3C,4CAA2F;AAC3F,kDAA0B;AAY1B,MAAM,WAAW,GAAkB;IACjC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,4CAAuD,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;IACjH,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,4CAAuD,EAAE,QAAQ,EAAE,CAAC,EAAE;IACjG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,4CAAuD,EAAE,QAAQ,EAAE,EAAE,EAAE;IAClG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,4CAAuD,EAAE,QAAQ,EAAE,EAAE,EAAE;IACjG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,4CAAuD,EAAE,QAAQ,EAAE,CAAC,EAAE;CACnG,CAAC;AAEF,MAAM,SAAS,GAAG;IAChB;QACE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACxC,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;CACO,CAAC;AASX;;GAEG;AACH,SAAS,iBAAiB,CAAC,MAAc,EAAE,QAAgB;IACzD,MAAM,GAAG,GAAG,MAAM,CAAC;IACnB,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC;IAC5B,MAAM,QAAQ,GAAG,GAAG,GAAG,OAAO,CAAC;IAE/B,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,wCAAwC;IAC7E,OAAO,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,MAAc;IAC5C,2DAA2D;IAC3D,MAAM,MAAM,GAA2B;QACrC,GAAG,EAAE,IAAI;QACT,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,CAAC;QACP,GAAG,EAAE,CAAC;QACN,KAAK,EAAE,CAAC;KACT,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,OAAgB,EAChB,KAAkB;IAElB,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,MAAM,YAAY,GAAG,IAAA,2BAAe,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAErD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,yBAAyB;QACzB,OAAO,MAAM,YAAY,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;YAC9C,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,EAAE,SAAS;YACd,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,CAAC,OAAO,CAAC;SAChB,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,4CAA4C;QAC5C,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CACjC,OAAgB,EAChB,MAAqB;IAErB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACzB,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QAE7C,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO;YACP,UAAU;YACV,QAAQ;SACT,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,iDAAiD;IACjD,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC;SAChC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB;IACpC,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,WAAW,CAAC;SACjC,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,iBAAiB,EAAE,iDAAiD,EAAE,MAAM,CAAC;SACpF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAEE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,yBAAgB,GAAmB,CAAC;YAEpD,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;gBAC3C,IAAA,eAAK,EAAC,wCAAwC,CAAC,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAW,EAChC,gCAAgC,EAChC,KAAK,IAAI,EAAE,CAAC,oBAAoB,CAAC,OAAO,EAAE,WAAW,CAAC,CACvD,CAAC;YAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,IAAA,oBAAU,EAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;oBACvD,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAElE,IAAI,IAAA,oBAAU,EAAC;gBACb,OAAO;gBACP,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC3B,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;iBAChC,CAAC,CAAC;gBACH,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;aAC9B,EAAE,OAAO,CAAC,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YAED,gBAAgB;YAChB,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,eAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,eAAe;YACf,MAAM,KAAK,GAAG,IAAA,qBAAW,EAAC;gBACxB,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC;gBACzC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAQ;aAC7C,CAAC,CAAC;YAEH,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC;oBACT,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC9B,eAAK,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACxC,eAAK,CAAC,KAAK,CAAC,GAAG,GAAG,IAAA,sBAAY,EAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC3D,CAAC,CAAC;YACL,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAC1C,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAA,sBAAY,EAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAC1D,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,eAAK,EAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../../src/commands/swap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6JpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CA4M3C"}
|