crypull-cli 1.0.2 → 1.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.
- package/dist/cli.js +159 -2
- package/dist/cli.js.map +1 -1
- package/package.json +3 -3
package/dist/cli.js
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
import { Command } from "commander";
|
|
5
5
|
import pc from "picocolors";
|
|
6
6
|
import * as asciichart from "asciichart";
|
|
7
|
-
import { crypull } from "crypull";
|
|
7
|
+
import { crypull, searchChains, listChains } from "crypull";
|
|
8
8
|
import { intro, outro, select, text, isCancel } from "@clack/prompts";
|
|
9
9
|
var program = new Command();
|
|
10
|
-
program.name("crypull").description("A human-friendly CLI to fetch crypto prices and info from multiple providers").version("1.0
|
|
10
|
+
program.name("crypull").description("A human-friendly CLI to fetch crypto prices and info from multiple providers").version("1.1.0");
|
|
11
11
|
var handlePrice = async (query, network) => {
|
|
12
12
|
console.log(pc.cyan(`
|
|
13
13
|
Fetching price for ${pc.bold(query)}...`));
|
|
@@ -279,6 +279,106 @@ Fetching ${days}-day chart data for ${pc.bold(query)}...`));
|
|
|
279
279
|
` + asciichart.plot(data.prices, chartConfig) + `
|
|
280
280
|
`));
|
|
281
281
|
};
|
|
282
|
+
var handleIcon = (query) => {
|
|
283
|
+
const icon = crypull.icon(query);
|
|
284
|
+
if (!icon) {
|
|
285
|
+
console.log(pc.red(`
|
|
286
|
+
\u2716 No local icon for "${query}".`));
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
console.log(pc.green(`
|
|
290
|
+
\u2714 ${icon.kind} icon`));
|
|
291
|
+
console.log(pc.white(`----------------------------------------`));
|
|
292
|
+
console.log(`${pc.gray("Id:")} ${pc.yellow(icon.id)}`);
|
|
293
|
+
console.log(`${pc.gray("Variant:")} ${pc.white(icon.variant)}`);
|
|
294
|
+
console.log(`${pc.gray("File:")} ${pc.gray(icon.filePath)}`);
|
|
295
|
+
console.log(pc.white(`----------------------------------------
|
|
296
|
+
`));
|
|
297
|
+
};
|
|
298
|
+
var handleChains = (query) => {
|
|
299
|
+
const chains = query?.trim() ? searchChains(query.trim(), 25) : listChains({ featured: true, mainnet: true });
|
|
300
|
+
if (chains.length === 0) {
|
|
301
|
+
console.log(pc.red(`
|
|
302
|
+
\u2716 No chains matched "${query}".`));
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
console.log(pc.green(query?.trim() ? `
|
|
306
|
+
\u2714 Chains matching "${query}":` : `
|
|
307
|
+
\u2714 Featured chains:`));
|
|
308
|
+
console.log(pc.white(`----------------------------------------`));
|
|
309
|
+
for (const chain of chains.slice(0, 25)) {
|
|
310
|
+
const id = chain.chainId === null ? chain.family : String(chain.chainId);
|
|
311
|
+
console.log(
|
|
312
|
+
`${pc.blue(id.padStart(8, " "))} ${pc.yellow(chain.nativeCurrency.symbol.padEnd(6, " "))} ${pc.white(chain.name)} ${pc.gray(`(${chain.rpc.length} rpc)`)}`
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
console.log(pc.white(`----------------------------------------
|
|
316
|
+
`));
|
|
317
|
+
};
|
|
318
|
+
var handleRpc = (query) => {
|
|
319
|
+
const chain = crypull.chain(query);
|
|
320
|
+
if (!chain) {
|
|
321
|
+
console.log(pc.red(`
|
|
322
|
+
\u2716 Unknown chain "${query}".`));
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
console.log(pc.green(`
|
|
326
|
+
\u2714 ${chain.name}`));
|
|
327
|
+
console.log(pc.white(`----------------------------------------`));
|
|
328
|
+
console.log(`${pc.gray("Family:")} ${pc.magenta(chain.family)}`);
|
|
329
|
+
if (chain.chainId !== null) console.log(`${pc.gray("ChainId:")} ${pc.white(String(chain.chainId))}`);
|
|
330
|
+
console.log(`${pc.gray("Native:")} ${pc.yellow(`${chain.nativeCurrency.symbol} (${chain.nativeCurrency.decimals} decimals)`)}`);
|
|
331
|
+
if (chain.rpc.length === 0) {
|
|
332
|
+
console.log(pc.gray("RPC: none (see API endpoints)"));
|
|
333
|
+
} else {
|
|
334
|
+
console.log(pc.white(`RPC:`));
|
|
335
|
+
chain.rpc.forEach((url) => console.log(` ${pc.blue(url)}`));
|
|
336
|
+
}
|
|
337
|
+
if (chain.api.length > 0) {
|
|
338
|
+
console.log(pc.white(`API:`));
|
|
339
|
+
chain.api.forEach((url) => console.log(` ${pc.blue(url)}`));
|
|
340
|
+
}
|
|
341
|
+
if (chain.explorers[0]) console.log(`${pc.gray("Explorer:")} ${pc.blue(chain.explorers[0].url)}`);
|
|
342
|
+
console.log(pc.white(`----------------------------------------
|
|
343
|
+
`));
|
|
344
|
+
};
|
|
345
|
+
var handleBalance = async (address, chain) => {
|
|
346
|
+
console.log(pc.cyan(`
|
|
347
|
+
Fetching ${chain} balance for ${pc.bold(address)}...`));
|
|
348
|
+
const balance = await crypull.balance(chain, address);
|
|
349
|
+
if (!balance) {
|
|
350
|
+
console.log(pc.red(`
|
|
351
|
+
\u2716 Could not read a balance on "${chain}".`));
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
console.log(pc.green(`
|
|
355
|
+
\u2714 ${balance.chain.name}`));
|
|
356
|
+
console.log(pc.white(`----------------------------------------`));
|
|
357
|
+
console.log(`${pc.gray("Balance:")} ${pc.green(`${balance.formatted} ${balance.symbol}`)}`);
|
|
358
|
+
console.log(`${pc.gray("Raw:")} ${pc.white(balance.raw.toString())}`);
|
|
359
|
+
console.log(pc.white(`----------------------------------------
|
|
360
|
+
`));
|
|
361
|
+
};
|
|
362
|
+
var handleConvert = async (amount, from, to) => {
|
|
363
|
+
const value = Number(amount);
|
|
364
|
+
if (!Number.isFinite(value)) {
|
|
365
|
+
console.log(pc.red(`
|
|
366
|
+
\u2716 Amount must be a number.`));
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
console.log(pc.cyan(`
|
|
370
|
+
Converting ${amount} ${from.toUpperCase()} to ${to.toUpperCase()}...`));
|
|
371
|
+
const quote = await crypull.convert(value, from, to);
|
|
372
|
+
if (!quote) {
|
|
373
|
+
console.log(pc.red(`
|
|
374
|
+
\u2716 Could not price that pair.`));
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
console.log(pc.green(`
|
|
378
|
+
\u2714 ${quote.amount} ${quote.from} = ${quote.result.toLocaleString(void 0, { maximumFractionDigits: 8 })} ${quote.to}`));
|
|
379
|
+
console.log(pc.gray(`Rate ${quote.rate.toLocaleString(void 0, { maximumFractionDigits: 8 })} via ${quote.source}
|
|
380
|
+
`));
|
|
381
|
+
};
|
|
282
382
|
var handleDonate = () => {
|
|
283
383
|
console.log(pc.cyan(`
|
|
284
384
|
\u{1F496} Support the development of crypull:`));
|
|
@@ -300,6 +400,11 @@ program.command("sentiment").description("Show current Crypto Fear & Greed Index
|
|
|
300
400
|
program.command("gas").description("Show current Ethereum network gas prices").action(handleGas);
|
|
301
401
|
program.command("chart <query>").description("Draw a terminal ASCII chart of historical prices").option("-d, --days <days>", "Number of days to chart", "7").action(handleChart);
|
|
302
402
|
program.command("donate").description("Show donation addresses to support development").action(handleDonate);
|
|
403
|
+
program.command("icon <symbol>").description("Show the local SVG icon for a coin, network, wallet, or exchange").action(handleIcon);
|
|
404
|
+
program.command("chains [query]").description("List featured chains, or search the chain directory").action(handleChains);
|
|
405
|
+
program.command("rpc <chain>").description("Print public RPC and API URLs for a chain").action(handleRpc);
|
|
406
|
+
program.command("balance <address>").description("Read a native balance (EVM, Solana, Bitcoin, or TRON)").option("-c, --chain <chain>", "Chain name or id", "ethereum").action((address, opts) => handleBalance(address, opts.chain));
|
|
407
|
+
program.command("convert <amount> <from> <to>").description("Convert an amount between two symbols, or to usd").action(handleConvert);
|
|
303
408
|
async function interactiveMode() {
|
|
304
409
|
console.clear();
|
|
305
410
|
intro(pc.bgCyan(pc.black(" crypull CLI ")));
|
|
@@ -316,6 +421,10 @@ async function interactiveMode() {
|
|
|
316
421
|
{ value: "sentiment", label: "\u{1F3AD} Show Fear & Greed Index" },
|
|
317
422
|
{ value: "gas", label: "\u26FD Show ETH gas prices" },
|
|
318
423
|
{ value: "chart", label: "\u{1F4C8} Show historical price chart" },
|
|
424
|
+
{ value: "icon", label: "\u{1F5BC}\uFE0F Look up a crypto icon" },
|
|
425
|
+
{ value: "chains", label: "\u{1F517} Browse chains and RPCs" },
|
|
426
|
+
{ value: "balance", label: "\u{1F45B} Read a wallet balance" },
|
|
427
|
+
{ value: "convert", label: "\u{1F504} Convert between coins" },
|
|
319
428
|
{ value: "donate", label: "\u{1F496} Donate / Support" },
|
|
320
429
|
{ value: "exit", label: "\u274C Exit" }
|
|
321
430
|
]
|
|
@@ -358,6 +467,54 @@ async function interactiveMode() {
|
|
|
358
467
|
else if (action === "sentiment") await handleSentiment();
|
|
359
468
|
else if (action === "gas") await handleGas();
|
|
360
469
|
else if (action === "donate") handleDonate();
|
|
470
|
+
else if (action === "icon") {
|
|
471
|
+
const symbol = await text({ message: "Symbol, network, wallet, or exchange:", placeholder: "btc" });
|
|
472
|
+
if (isCancel(symbol)) {
|
|
473
|
+
outro("Goodbye!");
|
|
474
|
+
process.exit(0);
|
|
475
|
+
}
|
|
476
|
+
handleIcon(symbol);
|
|
477
|
+
} else if (action === "chains") {
|
|
478
|
+
const query = await text({
|
|
479
|
+
message: "Search chains (leave empty for the featured list):",
|
|
480
|
+
placeholder: "base",
|
|
481
|
+
defaultValue: ""
|
|
482
|
+
});
|
|
483
|
+
if (isCancel(query)) {
|
|
484
|
+
outro("Goodbye!");
|
|
485
|
+
process.exit(0);
|
|
486
|
+
}
|
|
487
|
+
handleChains(query || void 0);
|
|
488
|
+
} else if (action === "balance") {
|
|
489
|
+
const chain = await text({ message: "Chain:", placeholder: "ethereum", defaultValue: "ethereum" });
|
|
490
|
+
if (isCancel(chain)) {
|
|
491
|
+
outro("Goodbye!");
|
|
492
|
+
process.exit(0);
|
|
493
|
+
}
|
|
494
|
+
const address = await text({ message: "Address:", placeholder: "0x..." });
|
|
495
|
+
if (isCancel(address)) {
|
|
496
|
+
outro("Goodbye!");
|
|
497
|
+
process.exit(0);
|
|
498
|
+
}
|
|
499
|
+
await handleBalance(address, chain);
|
|
500
|
+
} else if (action === "convert") {
|
|
501
|
+
const amount = await text({ message: "Amount:", placeholder: "1", defaultValue: "1" });
|
|
502
|
+
if (isCancel(amount)) {
|
|
503
|
+
outro("Goodbye!");
|
|
504
|
+
process.exit(0);
|
|
505
|
+
}
|
|
506
|
+
const from = await text({ message: "From symbol:", placeholder: "btc" });
|
|
507
|
+
if (isCancel(from)) {
|
|
508
|
+
outro("Goodbye!");
|
|
509
|
+
process.exit(0);
|
|
510
|
+
}
|
|
511
|
+
const to = await text({ message: "To symbol or usd:", placeholder: "eth" });
|
|
512
|
+
if (isCancel(to)) {
|
|
513
|
+
outro("Goodbye!");
|
|
514
|
+
process.exit(0);
|
|
515
|
+
}
|
|
516
|
+
await handleConvert(amount, from, to);
|
|
517
|
+
}
|
|
361
518
|
}
|
|
362
519
|
console.log(pc.gray("\n---\n"));
|
|
363
520
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\r\nimport { Command } from 'commander';\r\nimport pc from 'picocolors';\r\nimport * as asciichart from 'asciichart';\r\nimport { crypull } from 'crypull';\r\nimport { intro, outro, select, text, isCancel } from '@clack/prompts';\r\n\r\ndeclare const __CRYPULL_VERSION__: string;\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('crypull')\r\n .description('A human-friendly CLI to fetch crypto prices and info from multiple providers')\r\n .version(__CRYPULL_VERSION__);\r\n\r\nconst handlePrice = async (query: string, network?: string) => {\r\n console.log(pc.cyan(`\\nFetching price for ${pc.bold(query)}...`));\r\n\r\n const data = await crypull.price(query, network);\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not find price for \"${query}\".`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Success! Found via ${pc.bold(data.source)}`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Symbol:')} ${pc.yellow(pc.bold(data.symbol))}`);\r\n console.log(`${pc.gray('Price:')} ${pc.green('$' + data.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 }))}`);\r\n console.log(`${pc.gray('Updated:')} ${new Date(data.lastUpdated).toLocaleTimeString()}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleInfo = async (query: string, network?: string) => {\r\n console.log(pc.cyan(`\\nFetching detailed info for ${pc.bold(query)}...`));\r\n\r\n const data = await crypull.info(query, network);\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not find info for \"${query}\".`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Success! Found via ${pc.bold(data.source)}`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Name:')} ${pc.white(pc.bold(data.name))}`);\r\n console.log(`${pc.gray('Symbol:')} ${pc.yellow(pc.bold(data.symbol))}`);\r\n console.log(`${pc.gray('Price:')} ${pc.green('$' + data.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 }))}`);\r\n\r\n if (data.marketCap) {\r\n console.log(`${pc.gray('MarketCap:')} ${pc.white('$' + data.marketCap.toLocaleString())}`);\r\n }\r\n if (data.marketCapRank) {\r\n console.log(`${pc.gray('Rank:')} ${pc.magenta('#' + data.marketCapRank)}`);\r\n }\r\n if (data.fdv) {\r\n console.log(`${pc.gray('FDV:')} ${pc.white('$' + data.fdv.toLocaleString())}`);\r\n }\r\n if (data.circulatingSupply) {\r\n console.log(`${pc.gray('Circ. Sup:')} ${pc.white(data.circulatingSupply.toLocaleString())}`);\r\n }\r\n if (data.totalSupply) {\r\n console.log(`${pc.gray('Total Sup:')} ${pc.white(data.totalSupply.toLocaleString())}`);\r\n }\r\n if (data.maxSupply) {\r\n console.log(`${pc.gray('Max Sup:')} ${pc.white(data.maxSupply.toLocaleString())}`);\r\n }\r\n if (data.volume24h) {\r\n console.log(`${pc.gray('24h Vol:')} ${pc.white('$' + data.volume24h.toLocaleString())}`);\r\n }\r\n if (data.priceChangePercentage24h !== undefined) {\r\n const pc24 = data.priceChangePercentage24h;\r\n const color = pc24 >= 0 ? pc.green : pc.red;\r\n console.log(`${pc.gray('24h %:')} ${color(pc24.toFixed(2) + '%')}`);\r\n }\r\n if (data.liquidityUsd) {\r\n console.log(`${pc.gray('Liquidity:')} ${pc.white('$' + data.liquidityUsd.toLocaleString())}`);\r\n }\r\n if (data.ath) {\r\n console.log(`${pc.gray('ATH:')} ${pc.green('$' + data.ath.toLocaleString())} ${data.athDate ? pc.gray(`(${new Date(data.athDate).toLocaleDateString()})`) : ''}`);\r\n }\r\n if (data.atl) {\r\n console.log(`${pc.gray('ATL:')} ${pc.red('$' + data.atl.toLocaleString())} ${data.atlDate ? pc.gray(`(${new Date(data.atlDate).toLocaleDateString()})`) : ''}`);\r\n }\r\n if (data.network) {\r\n console.log(`${pc.gray('Network:')} ${pc.magenta(data.network)}`);\r\n }\r\n if (data.address) {\r\n console.log(`${pc.gray('Address:')} ${pc.gray(data.address)}`);\r\n }\r\n\r\n if (data.links && Object.values(data.links).some((l) => !!l)) {\r\n console.log(pc.white(`\\n--- Links ---`));\r\n if (data.links.website) console.log(`${pc.gray('Website:')} ${pc.blue(data.links.website)}`);\r\n if (data.links.twitter) console.log(`${pc.gray('Twitter:')} ${pc.blue(data.links.twitter)}`);\r\n if (data.links.telegram) console.log(`${pc.gray('Telegram:')} ${pc.blue(data.links.telegram)}`);\r\n if (data.links.discord) console.log(`${pc.gray('Discord:')} ${pc.blue(data.links.discord)}`);\r\n if (data.links.github) console.log(`${pc.gray('GitHub:')} ${pc.blue(data.links.github)}`);\r\n }\r\n\r\n if (data.description && data.description.length > 0) {\r\n console.log(pc.white(`\\n--- Description ---`));\r\n const desc = data.description.replace(/(<([^>]+)>)/gi, '');\r\n const truncated = desc.length > 300 ? desc.substring(0, 300) + '...' : desc;\r\n console.log(pc.gray(truncated));\r\n }\r\n\r\n if (data.pairs && data.pairs.length > 0) {\r\n console.log(pc.white(`\\n--- Top Trading Pairs ---`));\r\n data.pairs.slice(0, 5).forEach((p, i) => {\r\n const title = `${p.baseTokenSymbol}/${p.quoteTokenSymbol}`;\r\n const priceStr = p.priceUsd ? `$${p.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 })}` : 'N/A';\r\n const volStr = p.volume24h ? `$${p.volume24h.toLocaleString(undefined, { maximumFractionDigits: 0 })}` : 'N/A';\r\n console.log(`${pc.blue(String(i + 1) + '.')} ${pc.yellow(title.padEnd(12, ' '))} | ${pc.green(priceStr.padEnd(12, ' '))} | Vol: ${pc.white(volStr)} | DEX: ${pc.magenta(p.dexId)}`);\r\n });\r\n }\r\n\r\n console.log(pc.white(`\\n----------------------------------------`));\r\n console.log(`${pc.gray('Updated:')} ${new Date(data.lastUpdated).toLocaleTimeString()}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleTop = async () => {\r\n console.log(pc.cyan(`\\nFetching top 50 cryptocurrencies...`));\r\n\r\n const results = await crypull.top();\r\n\r\n if (!results || results.length === 0) {\r\n console.log(pc.red(`\\n✖ Could not fetch top coins at this time.`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Top 50 Cryptocurrencies:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n\r\n results.forEach((res, i) => {\r\n const priceStr = res.priceUsd ? `$${res.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 })}` : 'N/A';\r\n const mcapStr = res.marketCap ? `$${res.marketCap.toLocaleString()}` : 'N/A';\r\n\r\n let changeStr = '';\r\n if (res.priceChange24h !== undefined && res.priceChange24h !== null) {\r\n const color = res.priceChange24h >= 0 ? pc.green : pc.red;\r\n changeStr = color(`(${res.priceChange24h >= 0 ? '+' : ''}${res.priceChange24h.toFixed(2)}%)`);\r\n }\r\n\r\n console.log(`${pc.blue(String(i + 1).padStart(2, ' '))}. ${pc.yellow(pc.bold(res.symbol.padEnd(8, ' ')))} | ${pc.green(priceStr.padEnd(12, ' '))} ${changeStr.padEnd(15, ' ')} | Mcap: ${pc.white(mcapStr)}`);\r\n });\r\n\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleSearch = async (query: string) => {\r\n console.log(pc.cyan(`\\nSearching for ${pc.bold(query)}...`));\r\n\r\n const results = await crypull.search(query);\r\n\r\n if (!results || results.length === 0) {\r\n console.log(pc.red(`\\n✖ No results found for \"${query}\".`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Found ${results.length} results:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n\r\n results.forEach((res, i) => {\r\n console.log(`${pc.blue(String(i + 1).padStart(2, ' '))}. ${pc.yellow(pc.bold(res.symbol.padEnd(8, ' ')))} | ${pc.white(res.name)} ${pc.gray(`(via ${res.source})`)}`);\r\n if (res.network) {\r\n console.log(` ${pc.gray('Network:')} ${pc.magenta(res.network)}`);\r\n }\r\n if (res.id && res.id.length > 20) {\r\n console.log(` ${pc.gray('Address:')} ${pc.gray(res.id)}`);\r\n }\r\n });\r\n\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleTrending = async () => {\r\n console.log(pc.cyan(`\\nFetching top trending coins...`));\r\n\r\n const results = await crypull.trending();\r\n\r\n if (!results || results.length === 0) {\r\n console.log(pc.red(`\\n✖ Could not fetch trending data at this time.`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Top 10 Trending Coins:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n\r\n results.forEach((res, i) => {\r\n const priceStr = res.priceUsd ? `$${res.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 })}` : 'N/A';\r\n let changeStr = '';\r\n if (res.priceChange24h !== undefined) {\r\n const color = res.priceChange24h >= 0 ? pc.green : pc.red;\r\n changeStr = color(`(${res.priceChange24h >= 0 ? '+' : ''}${res.priceChange24h.toFixed(2)}%)`);\r\n }\r\n const rankStr = res.marketCapRank ? pc.magenta(`#${res.marketCapRank}`) : '';\r\n\r\n console.log(`${pc.blue(String(i + 1).padStart(2, ' '))}. ${pc.yellow(pc.bold(res.symbol.padEnd(8, ' ')))} | ${pc.green(priceStr.padEnd(12, ' '))} ${changeStr.padEnd(15, ' ')} | ${rankStr}`);\r\n });\r\n\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleMarket = async () => {\r\n console.log(pc.cyan(`\\nFetching global market data...`));\r\n\r\n const data = await crypull.market();\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not fetch global market data at this time.`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Global Market Overview:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Total Market Cap:')} ${pc.white('$' + data.totalMarketCapUsd.toLocaleString())}`);\r\n console.log(`${pc.gray('24h Volume:')} ${pc.white('$' + data.totalVolume24hUsd.toLocaleString())}`);\r\n console.log(`${pc.gray('BTC Dominance:')} ${pc.yellow(data.bitcoinDominancePercentage.toFixed(2) + '%')}`);\r\n console.log(`${pc.gray('ETH Dominance:')} ${pc.blue(data.ethereumDominancePercentage.toFixed(2) + '%')}`);\r\n console.log(`${pc.gray('Active Coins:')} ${pc.white(data.activeCryptocurrencies.toLocaleString())}`);\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Updated:')} ${new Date(data.lastUpdated).toLocaleTimeString()}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleSentiment = async () => {\r\n console.log(pc.cyan(`\\nFetching Fear & Greed Index...`));\r\n\r\n const data = await crypull.sentiment();\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not fetch sentiment data at this time.`));\r\n return;\r\n }\r\n\r\n const value = data.value;\r\n let color = pc.white;\r\n if (value <= 25) color = pc.red;\r\n else if (value <= 45) color = pc.yellow;\r\n else if (value <= 55) color = pc.white;\r\n else if (value <= 75) color = pc.green;\r\n else color = pc.blue;\r\n\r\n console.log(pc.green(`\\n✔ Current Market Sentiment:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Score:')} ${color(pc.bold(value.toString()) + ' / 100')}`);\r\n console.log(`${pc.gray('Classification:')} ${color(pc.bold(data.classification))}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleGas = async () => {\r\n console.log(pc.cyan(`\\nFetching network gas prices...`));\r\n\r\n const data = await crypull.gas();\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not fetch gas prices at this time.`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ ${data.network} Gas Tracker (Gwei):`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Low (Safe):')} ${pc.green(data.low + ' gwei')}`);\r\n console.log(`${pc.gray('Average:')} ${pc.yellow(data.average + ' gwei')}`);\r\n console.log(`${pc.gray('High (Fast):')} ${pc.red(data.high + ' gwei')}`);\r\n if (data.baseFee) {\r\n console.log(`${pc.gray('Base Fee:')} ${pc.white(data.baseFee + ' gwei')}`);\r\n }\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleChart = async (query: string, options: { days: string }) => {\r\n const days = parseInt(options.days, 10) || 7;\r\n console.log(pc.cyan(`\\nFetching ${days}-day chart data for ${pc.bold(query)}...`));\r\n\r\n const data = await crypull.chart(query, days);\r\n\r\n if (!data || !data.prices || data.prices.length === 0) {\r\n console.log(pc.red(`\\n✖ Could not fetch chart data for \"${query}\". Note: Charts may only be available for major coins.`));\r\n return;\r\n }\r\n\r\n const firstPrice = data.prices[0];\r\n const lastPrice = data.prices[data.prices.length - 1];\r\n const isUp = lastPrice >= firstPrice;\r\n\r\n const chartConfig = {\r\n colors: [isUp ? asciichart.lightgreen : asciichart.lightred],\r\n height: 10,\r\n };\r\n\r\n console.log(pc.green(`\\n✔ ${days}-Day Chart for ${query.toUpperCase()}:`));\r\n console.log(pc.gray(`Min: $${data.minPrice.toLocaleString(undefined, { maximumFractionDigits: 6 })} | Max: $${data.maxPrice.toLocaleString(undefined, { maximumFractionDigits: 6 })}`));\r\n console.log(pc.white(`\\n` + asciichart.plot(data.prices, chartConfig) + `\\n`));\r\n};\r\n\r\nconst handleDonate = () => {\r\n console.log(pc.cyan(`\\n💖 Support the development of crypull:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.yellow('BTC:')} ${pc.white('bc1qj4zt3lva4r68xspayg0p8s4hyg40nhjz8fuhqq')}`);\r\n console.log(`${pc.blue('EVM (All):')} ${pc.white('0x63a875d0c4Dad8E18B95D844caE6FF915dF0a2BD')}`);\r\n console.log(`${pc.green('Solana:')} ${pc.white('8J5VvZu6ayQa4XnSAAzx4YX3QsXYyyNrP4Zr7JEx1KFY')}`);\r\n console.log(`${pc.red('TRX:')} ${pc.white('TPgZSrHUhKdjyMwaGd15utJvsbk85oBbit')}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nprogram\r\n .command('price <query>')\r\n .description('Get the current price of a cryptocurrency (symbol or contract address)')\r\n .option('-n, --network <network>', 'DEX network for contract addresses (e.g. eth, bsc, solana)')\r\n .action((query: string, opts: { network?: string }) => handlePrice(query, opts.network));\r\n\r\nprogram\r\n .command('info <query>')\r\n .description('Get detailed info about a cryptocurrency (market cap, volume, FDV, etc.)')\r\n .option('-n, --network <network>', 'DEX network for contract addresses (e.g. eth, bsc, solana)')\r\n .action((query: string, opts: { network?: string }) => handleInfo(query, opts.network));\r\n\r\nprogram\r\n .command('top')\r\n .description('Show top 50 cryptocurrencies by market cap')\r\n .action(handleTop);\r\n\r\nprogram\r\n .command('search <query>')\r\n .description('Search for tokens or coins across multiple providers')\r\n .action(handleSearch);\r\n\r\nprogram\r\n .command('trending')\r\n .description('Show top 10 trending coins/tokens right now')\r\n .action(handleTrending);\r\n\r\nprogram\r\n .command('market')\r\n .description('Show global cryptocurrency market overview')\r\n .action(handleMarket);\r\n\r\nprogram\r\n .command('sentiment')\r\n .description('Show current Crypto Fear & Greed Index')\r\n .action(handleSentiment);\r\n\r\nprogram\r\n .command('gas')\r\n .description('Show current Ethereum network gas prices')\r\n .action(handleGas);\r\n\r\nprogram\r\n .command('chart <query>')\r\n .description('Draw a terminal ASCII chart of historical prices')\r\n .option('-d, --days <days>', 'Number of days to chart', '7')\r\n .action(handleChart);\r\n\r\nprogram\r\n .command('donate')\r\n .description('Show donation addresses to support development')\r\n .action(handleDonate);\r\n\r\nasync function interactiveMode() {\r\n console.clear();\r\n intro(pc.bgCyan(pc.black(' crypull CLI ')));\r\n\r\n while (true) {\r\n const action = await select({\r\n message: 'What would you like to do?',\r\n options: [\r\n { value: 'price', label: '💰 Get token price' },\r\n { value: 'info', label: 'ℹ️ Get detailed token info' },\r\n { value: 'top', label: '🏆 Show top 50 cryptocurrencies' },\r\n { value: 'search', label: '🔍 Search for a token' },\r\n { value: 'trending', label: '🔥 Show trending coins' },\r\n { value: 'market', label: '🌍 Show global market overview' },\r\n { value: 'sentiment', label: '🎭 Show Fear & Greed Index' },\r\n { value: 'gas', label: '⛽ Show ETH gas prices' },\r\n { value: 'chart', label: '📈 Show historical price chart' },\r\n { value: 'donate', label: '💖 Donate / Support' },\r\n { value: 'exit', label: '❌ Exit' },\r\n ],\r\n });\r\n\r\n if (isCancel(action) || action === 'exit') {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n\r\n if (['price', 'info', 'search', 'chart'].includes(action as string)) {\r\n const query = await text({\r\n message: 'Enter token symbol or contract address:',\r\n placeholder: 'e.g., btc, ethereum, 0x...',\r\n validate: (value) => {\r\n if (!value) return 'Please enter a valid query.';\r\n },\r\n });\r\n\r\n if (isCancel(query)) {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n\r\n if (action === 'price') await handlePrice(query as string);\r\n else if (action === 'info') await handleInfo(query as string);\r\n else if (action === 'search') await handleSearch(query as string);\r\n else if (action === 'chart') {\r\n const days = await text({\r\n message: 'Enter number of days for the chart (default 7):',\r\n placeholder: '7',\r\n defaultValue: '7',\r\n });\r\n if (isCancel(days)) {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n await handleChart(query as string, { days: days as string });\r\n }\r\n } else {\r\n if (action === 'top') await handleTop();\r\n else if (action === 'trending') await handleTrending();\r\n else if (action === 'market') await handleMarket();\r\n else if (action === 'sentiment') await handleSentiment();\r\n else if (action === 'gas') await handleGas();\r\n else if (action === 'donate') handleDonate();\r\n }\r\n\r\n console.log(pc.gray('\\n---\\n'));\r\n }\r\n}\r\n\r\nif (process.argv.length <= 2) {\r\n interactiveMode().catch((err) => {\r\n console.error(pc.red('An error occurred:'), err);\r\n process.exit(1);\r\n });\r\n} else {\r\n program.parse(process.argv);\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\r\nimport { Command } from 'commander';\r\nimport pc from 'picocolors';\r\nimport * as asciichart from 'asciichart';\r\nimport { crypull, searchChains, listChains } from 'crypull';\r\nimport { intro, outro, select, text, isCancel } from '@clack/prompts';\r\n\r\ndeclare const __CRYPULL_VERSION__: string;\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('crypull')\r\n .description('A human-friendly CLI to fetch crypto prices and info from multiple providers')\r\n .version(__CRYPULL_VERSION__);\r\n\r\nconst handlePrice = async (query: string, network?: string) => {\r\n console.log(pc.cyan(`\\nFetching price for ${pc.bold(query)}...`));\r\n\r\n const data = await crypull.price(query, network);\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not find price for \"${query}\".`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Success! Found via ${pc.bold(data.source)}`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Symbol:')} ${pc.yellow(pc.bold(data.symbol))}`);\r\n console.log(`${pc.gray('Price:')} ${pc.green('$' + data.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 }))}`);\r\n console.log(`${pc.gray('Updated:')} ${new Date(data.lastUpdated).toLocaleTimeString()}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleInfo = async (query: string, network?: string) => {\r\n console.log(pc.cyan(`\\nFetching detailed info for ${pc.bold(query)}...`));\r\n\r\n const data = await crypull.info(query, network);\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not find info for \"${query}\".`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Success! Found via ${pc.bold(data.source)}`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Name:')} ${pc.white(pc.bold(data.name))}`);\r\n console.log(`${pc.gray('Symbol:')} ${pc.yellow(pc.bold(data.symbol))}`);\r\n console.log(`${pc.gray('Price:')} ${pc.green('$' + data.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 }))}`);\r\n\r\n if (data.marketCap) {\r\n console.log(`${pc.gray('MarketCap:')} ${pc.white('$' + data.marketCap.toLocaleString())}`);\r\n }\r\n if (data.marketCapRank) {\r\n console.log(`${pc.gray('Rank:')} ${pc.magenta('#' + data.marketCapRank)}`);\r\n }\r\n if (data.fdv) {\r\n console.log(`${pc.gray('FDV:')} ${pc.white('$' + data.fdv.toLocaleString())}`);\r\n }\r\n if (data.circulatingSupply) {\r\n console.log(`${pc.gray('Circ. Sup:')} ${pc.white(data.circulatingSupply.toLocaleString())}`);\r\n }\r\n if (data.totalSupply) {\r\n console.log(`${pc.gray('Total Sup:')} ${pc.white(data.totalSupply.toLocaleString())}`);\r\n }\r\n if (data.maxSupply) {\r\n console.log(`${pc.gray('Max Sup:')} ${pc.white(data.maxSupply.toLocaleString())}`);\r\n }\r\n if (data.volume24h) {\r\n console.log(`${pc.gray('24h Vol:')} ${pc.white('$' + data.volume24h.toLocaleString())}`);\r\n }\r\n if (data.priceChangePercentage24h !== undefined) {\r\n const pc24 = data.priceChangePercentage24h;\r\n const color = pc24 >= 0 ? pc.green : pc.red;\r\n console.log(`${pc.gray('24h %:')} ${color(pc24.toFixed(2) + '%')}`);\r\n }\r\n if (data.liquidityUsd) {\r\n console.log(`${pc.gray('Liquidity:')} ${pc.white('$' + data.liquidityUsd.toLocaleString())}`);\r\n }\r\n if (data.ath) {\r\n console.log(`${pc.gray('ATH:')} ${pc.green('$' + data.ath.toLocaleString())} ${data.athDate ? pc.gray(`(${new Date(data.athDate).toLocaleDateString()})`) : ''}`);\r\n }\r\n if (data.atl) {\r\n console.log(`${pc.gray('ATL:')} ${pc.red('$' + data.atl.toLocaleString())} ${data.atlDate ? pc.gray(`(${new Date(data.atlDate).toLocaleDateString()})`) : ''}`);\r\n }\r\n if (data.network) {\r\n console.log(`${pc.gray('Network:')} ${pc.magenta(data.network)}`);\r\n }\r\n if (data.address) {\r\n console.log(`${pc.gray('Address:')} ${pc.gray(data.address)}`);\r\n }\r\n\r\n if (data.links && Object.values(data.links).some((l) => !!l)) {\r\n console.log(pc.white(`\\n--- Links ---`));\r\n if (data.links.website) console.log(`${pc.gray('Website:')} ${pc.blue(data.links.website)}`);\r\n if (data.links.twitter) console.log(`${pc.gray('Twitter:')} ${pc.blue(data.links.twitter)}`);\r\n if (data.links.telegram) console.log(`${pc.gray('Telegram:')} ${pc.blue(data.links.telegram)}`);\r\n if (data.links.discord) console.log(`${pc.gray('Discord:')} ${pc.blue(data.links.discord)}`);\r\n if (data.links.github) console.log(`${pc.gray('GitHub:')} ${pc.blue(data.links.github)}`);\r\n }\r\n\r\n if (data.description && data.description.length > 0) {\r\n console.log(pc.white(`\\n--- Description ---`));\r\n const desc = data.description.replace(/(<([^>]+)>)/gi, '');\r\n const truncated = desc.length > 300 ? desc.substring(0, 300) + '...' : desc;\r\n console.log(pc.gray(truncated));\r\n }\r\n\r\n if (data.pairs && data.pairs.length > 0) {\r\n console.log(pc.white(`\\n--- Top Trading Pairs ---`));\r\n data.pairs.slice(0, 5).forEach((p, i) => {\r\n const title = `${p.baseTokenSymbol}/${p.quoteTokenSymbol}`;\r\n const priceStr = p.priceUsd ? `$${p.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 })}` : 'N/A';\r\n const volStr = p.volume24h ? `$${p.volume24h.toLocaleString(undefined, { maximumFractionDigits: 0 })}` : 'N/A';\r\n console.log(`${pc.blue(String(i + 1) + '.')} ${pc.yellow(title.padEnd(12, ' '))} | ${pc.green(priceStr.padEnd(12, ' '))} | Vol: ${pc.white(volStr)} | DEX: ${pc.magenta(p.dexId)}`);\r\n });\r\n }\r\n\r\n console.log(pc.white(`\\n----------------------------------------`));\r\n console.log(`${pc.gray('Updated:')} ${new Date(data.lastUpdated).toLocaleTimeString()}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleTop = async () => {\r\n console.log(pc.cyan(`\\nFetching top 50 cryptocurrencies...`));\r\n\r\n const results = await crypull.top();\r\n\r\n if (!results || results.length === 0) {\r\n console.log(pc.red(`\\n✖ Could not fetch top coins at this time.`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Top 50 Cryptocurrencies:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n\r\n results.forEach((res, i) => {\r\n const priceStr = res.priceUsd ? `$${res.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 })}` : 'N/A';\r\n const mcapStr = res.marketCap ? `$${res.marketCap.toLocaleString()}` : 'N/A';\r\n\r\n let changeStr = '';\r\n if (res.priceChange24h !== undefined && res.priceChange24h !== null) {\r\n const color = res.priceChange24h >= 0 ? pc.green : pc.red;\r\n changeStr = color(`(${res.priceChange24h >= 0 ? '+' : ''}${res.priceChange24h.toFixed(2)}%)`);\r\n }\r\n\r\n console.log(`${pc.blue(String(i + 1).padStart(2, ' '))}. ${pc.yellow(pc.bold(res.symbol.padEnd(8, ' ')))} | ${pc.green(priceStr.padEnd(12, ' '))} ${changeStr.padEnd(15, ' ')} | Mcap: ${pc.white(mcapStr)}`);\r\n });\r\n\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleSearch = async (query: string) => {\r\n console.log(pc.cyan(`\\nSearching for ${pc.bold(query)}...`));\r\n\r\n const results = await crypull.search(query);\r\n\r\n if (!results || results.length === 0) {\r\n console.log(pc.red(`\\n✖ No results found for \"${query}\".`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Found ${results.length} results:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n\r\n results.forEach((res, i) => {\r\n console.log(`${pc.blue(String(i + 1).padStart(2, ' '))}. ${pc.yellow(pc.bold(res.symbol.padEnd(8, ' ')))} | ${pc.white(res.name)} ${pc.gray(`(via ${res.source})`)}`);\r\n if (res.network) {\r\n console.log(` ${pc.gray('Network:')} ${pc.magenta(res.network)}`);\r\n }\r\n if (res.id && res.id.length > 20) {\r\n console.log(` ${pc.gray('Address:')} ${pc.gray(res.id)}`);\r\n }\r\n });\r\n\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleTrending = async () => {\r\n console.log(pc.cyan(`\\nFetching top trending coins...`));\r\n\r\n const results = await crypull.trending();\r\n\r\n if (!results || results.length === 0) {\r\n console.log(pc.red(`\\n✖ Could not fetch trending data at this time.`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Top 10 Trending Coins:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n\r\n results.forEach((res, i) => {\r\n const priceStr = res.priceUsd ? `$${res.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 })}` : 'N/A';\r\n let changeStr = '';\r\n if (res.priceChange24h !== undefined) {\r\n const color = res.priceChange24h >= 0 ? pc.green : pc.red;\r\n changeStr = color(`(${res.priceChange24h >= 0 ? '+' : ''}${res.priceChange24h.toFixed(2)}%)`);\r\n }\r\n const rankStr = res.marketCapRank ? pc.magenta(`#${res.marketCapRank}`) : '';\r\n\r\n console.log(`${pc.blue(String(i + 1).padStart(2, ' '))}. ${pc.yellow(pc.bold(res.symbol.padEnd(8, ' ')))} | ${pc.green(priceStr.padEnd(12, ' '))} ${changeStr.padEnd(15, ' ')} | ${rankStr}`);\r\n });\r\n\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleMarket = async () => {\r\n console.log(pc.cyan(`\\nFetching global market data...`));\r\n\r\n const data = await crypull.market();\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not fetch global market data at this time.`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Global Market Overview:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Total Market Cap:')} ${pc.white('$' + data.totalMarketCapUsd.toLocaleString())}`);\r\n console.log(`${pc.gray('24h Volume:')} ${pc.white('$' + data.totalVolume24hUsd.toLocaleString())}`);\r\n console.log(`${pc.gray('BTC Dominance:')} ${pc.yellow(data.bitcoinDominancePercentage.toFixed(2) + '%')}`);\r\n console.log(`${pc.gray('ETH Dominance:')} ${pc.blue(data.ethereumDominancePercentage.toFixed(2) + '%')}`);\r\n console.log(`${pc.gray('Active Coins:')} ${pc.white(data.activeCryptocurrencies.toLocaleString())}`);\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Updated:')} ${new Date(data.lastUpdated).toLocaleTimeString()}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleSentiment = async () => {\r\n console.log(pc.cyan(`\\nFetching Fear & Greed Index...`));\r\n\r\n const data = await crypull.sentiment();\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not fetch sentiment data at this time.`));\r\n return;\r\n }\r\n\r\n const value = data.value;\r\n let color = pc.white;\r\n if (value <= 25) color = pc.red;\r\n else if (value <= 45) color = pc.yellow;\r\n else if (value <= 55) color = pc.white;\r\n else if (value <= 75) color = pc.green;\r\n else color = pc.blue;\r\n\r\n console.log(pc.green(`\\n✔ Current Market Sentiment:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Score:')} ${color(pc.bold(value.toString()) + ' / 100')}`);\r\n console.log(`${pc.gray('Classification:')} ${color(pc.bold(data.classification))}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleGas = async () => {\r\n console.log(pc.cyan(`\\nFetching network gas prices...`));\r\n\r\n const data = await crypull.gas();\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not fetch gas prices at this time.`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ ${data.network} Gas Tracker (Gwei):`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Low (Safe):')} ${pc.green(data.low + ' gwei')}`);\r\n console.log(`${pc.gray('Average:')} ${pc.yellow(data.average + ' gwei')}`);\r\n console.log(`${pc.gray('High (Fast):')} ${pc.red(data.high + ' gwei')}`);\r\n if (data.baseFee) {\r\n console.log(`${pc.gray('Base Fee:')} ${pc.white(data.baseFee + ' gwei')}`);\r\n }\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleChart = async (query: string, options: { days: string }) => {\r\n const days = parseInt(options.days, 10) || 7;\r\n console.log(pc.cyan(`\\nFetching ${days}-day chart data for ${pc.bold(query)}...`));\r\n\r\n const data = await crypull.chart(query, days);\r\n\r\n if (!data || !data.prices || data.prices.length === 0) {\r\n console.log(pc.red(`\\n✖ Could not fetch chart data for \"${query}\". Note: Charts may only be available for major coins.`));\r\n return;\r\n }\r\n\r\n const firstPrice = data.prices[0];\r\n const lastPrice = data.prices[data.prices.length - 1];\r\n const isUp = lastPrice >= firstPrice;\r\n\r\n const chartConfig = {\r\n colors: [isUp ? asciichart.lightgreen : asciichart.lightred],\r\n height: 10,\r\n };\r\n\r\n console.log(pc.green(`\\n✔ ${days}-Day Chart for ${query.toUpperCase()}:`));\r\n console.log(pc.gray(`Min: $${data.minPrice.toLocaleString(undefined, { maximumFractionDigits: 6 })} | Max: $${data.maxPrice.toLocaleString(undefined, { maximumFractionDigits: 6 })}`));\r\n console.log(pc.white(`\\n` + asciichart.plot(data.prices, chartConfig) + `\\n`));\r\n};\r\n\r\nconst handleIcon = (query: string) => {\r\n const icon = crypull.icon(query);\r\n if (!icon) {\r\n console.log(pc.red(`\\n✖ No local icon for \"${query}\".`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ ${icon.kind} icon`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Id:')} ${pc.yellow(icon.id)}`);\r\n console.log(`${pc.gray('Variant:')} ${pc.white(icon.variant)}`);\r\n console.log(`${pc.gray('File:')} ${pc.gray(icon.filePath)}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleChains = (query?: string) => {\r\n const chains = query?.trim()\r\n ? searchChains(query.trim(), 25)\r\n : listChains({ featured: true, mainnet: true });\r\n\r\n if (chains.length === 0) {\r\n console.log(pc.red(`\\n✖ No chains matched \"${query}\".`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(query?.trim() ? `\\n✔ Chains matching \"${query}\":` : `\\n✔ Featured chains:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n for (const chain of chains.slice(0, 25)) {\r\n const id = chain.chainId === null ? chain.family : String(chain.chainId);\r\n console.log(\r\n `${pc.blue(id.padStart(8, ' '))} ${pc.yellow(chain.nativeCurrency.symbol.padEnd(6, ' '))} ${pc.white(chain.name)} ${pc.gray(`(${chain.rpc.length} rpc)`)}`\r\n );\r\n }\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleRpc = (query: string) => {\r\n const chain = crypull.chain(query);\r\n if (!chain) {\r\n console.log(pc.red(`\\n✖ Unknown chain \"${query}\".`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ ${chain.name}`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Family:')} ${pc.magenta(chain.family)}`);\r\n if (chain.chainId !== null) console.log(`${pc.gray('ChainId:')} ${pc.white(String(chain.chainId))}`);\r\n console.log(`${pc.gray('Native:')} ${pc.yellow(`${chain.nativeCurrency.symbol} (${chain.nativeCurrency.decimals} decimals)`)}`);\r\n if (chain.rpc.length === 0) {\r\n console.log(pc.gray('RPC: none (see API endpoints)'));\r\n } else {\r\n console.log(pc.white(`RPC:`));\r\n chain.rpc.forEach((url) => console.log(` ${pc.blue(url)}`));\r\n }\r\n if (chain.api.length > 0) {\r\n console.log(pc.white(`API:`));\r\n chain.api.forEach((url) => console.log(` ${pc.blue(url)}`));\r\n }\r\n if (chain.explorers[0]) console.log(`${pc.gray('Explorer:')} ${pc.blue(chain.explorers[0].url)}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleBalance = async (address: string, chain: string) => {\r\n console.log(pc.cyan(`\\nFetching ${chain} balance for ${pc.bold(address)}...`));\r\n const balance = await crypull.balance(chain, address);\r\n if (!balance) {\r\n console.log(pc.red(`\\n✖ Could not read a balance on \"${chain}\".`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ ${balance.chain.name}`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Balance:')} ${pc.green(`${balance.formatted} ${balance.symbol}`)}`);\r\n console.log(`${pc.gray('Raw:')} ${pc.white(balance.raw.toString())}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleConvert = async (amount: string, from: string, to: string) => {\r\n const value = Number(amount);\r\n if (!Number.isFinite(value)) {\r\n console.log(pc.red(`\\n✖ Amount must be a number.`));\r\n return;\r\n }\r\n\r\n console.log(pc.cyan(`\\nConverting ${amount} ${from.toUpperCase()} to ${to.toUpperCase()}...`));\r\n const quote = await crypull.convert(value, from, to);\r\n if (!quote) {\r\n console.log(pc.red(`\\n✖ Could not price that pair.`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ ${quote.amount} ${quote.from} = ${quote.result.toLocaleString(undefined, { maximumFractionDigits: 8 })} ${quote.to}`));\r\n console.log(pc.gray(`Rate ${quote.rate.toLocaleString(undefined, { maximumFractionDigits: 8 })} via ${quote.source}\\n`));\r\n};\r\n\r\nconst handleDonate = () => {\r\n console.log(pc.cyan(`\\n💖 Support the development of crypull:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.yellow('BTC:')} ${pc.white('bc1qj4zt3lva4r68xspayg0p8s4hyg40nhjz8fuhqq')}`);\r\n console.log(`${pc.blue('EVM (All):')} ${pc.white('0x63a875d0c4Dad8E18B95D844caE6FF915dF0a2BD')}`);\r\n console.log(`${pc.green('Solana:')} ${pc.white('8J5VvZu6ayQa4XnSAAzx4YX3QsXYyyNrP4Zr7JEx1KFY')}`);\r\n console.log(`${pc.red('TRX:')} ${pc.white('TPgZSrHUhKdjyMwaGd15utJvsbk85oBbit')}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nprogram\r\n .command('price <query>')\r\n .description('Get the current price of a cryptocurrency (symbol or contract address)')\r\n .option('-n, --network <network>', 'DEX network for contract addresses (e.g. eth, bsc, solana)')\r\n .action((query: string, opts: { network?: string }) => handlePrice(query, opts.network));\r\n\r\nprogram\r\n .command('info <query>')\r\n .description('Get detailed info about a cryptocurrency (market cap, volume, FDV, etc.)')\r\n .option('-n, --network <network>', 'DEX network for contract addresses (e.g. eth, bsc, solana)')\r\n .action((query: string, opts: { network?: string }) => handleInfo(query, opts.network));\r\n\r\nprogram\r\n .command('top')\r\n .description('Show top 50 cryptocurrencies by market cap')\r\n .action(handleTop);\r\n\r\nprogram\r\n .command('search <query>')\r\n .description('Search for tokens or coins across multiple providers')\r\n .action(handleSearch);\r\n\r\nprogram\r\n .command('trending')\r\n .description('Show top 10 trending coins/tokens right now')\r\n .action(handleTrending);\r\n\r\nprogram\r\n .command('market')\r\n .description('Show global cryptocurrency market overview')\r\n .action(handleMarket);\r\n\r\nprogram\r\n .command('sentiment')\r\n .description('Show current Crypto Fear & Greed Index')\r\n .action(handleSentiment);\r\n\r\nprogram\r\n .command('gas')\r\n .description('Show current Ethereum network gas prices')\r\n .action(handleGas);\r\n\r\nprogram\r\n .command('chart <query>')\r\n .description('Draw a terminal ASCII chart of historical prices')\r\n .option('-d, --days <days>', 'Number of days to chart', '7')\r\n .action(handleChart);\r\n\r\nprogram\r\n .command('donate')\r\n .description('Show donation addresses to support development')\r\n .action(handleDonate);\r\n\r\nprogram\r\n .command('icon <symbol>')\r\n .description('Show the local SVG icon for a coin, network, wallet, or exchange')\r\n .action(handleIcon);\r\n\r\nprogram\r\n .command('chains [query]')\r\n .description('List featured chains, or search the chain directory')\r\n .action(handleChains);\r\n\r\nprogram\r\n .command('rpc <chain>')\r\n .description('Print public RPC and API URLs for a chain')\r\n .action(handleRpc);\r\n\r\nprogram\r\n .command('balance <address>')\r\n .description('Read a native balance (EVM, Solana, Bitcoin, or TRON)')\r\n .option('-c, --chain <chain>', 'Chain name or id', 'ethereum')\r\n .action((address: string, opts: { chain: string }) => handleBalance(address, opts.chain));\r\n\r\nprogram\r\n .command('convert <amount> <from> <to>')\r\n .description('Convert an amount between two symbols, or to usd')\r\n .action(handleConvert);\r\n\r\nasync function interactiveMode() {\r\n console.clear();\r\n intro(pc.bgCyan(pc.black(' crypull CLI ')));\r\n\r\n while (true) {\r\n const action = await select({\r\n message: 'What would you like to do?',\r\n options: [\r\n { value: 'price', label: '💰 Get token price' },\r\n { value: 'info', label: 'ℹ️ Get detailed token info' },\r\n { value: 'top', label: '🏆 Show top 50 cryptocurrencies' },\r\n { value: 'search', label: '🔍 Search for a token' },\r\n { value: 'trending', label: '🔥 Show trending coins' },\r\n { value: 'market', label: '🌍 Show global market overview' },\r\n { value: 'sentiment', label: '🎭 Show Fear & Greed Index' },\r\n { value: 'gas', label: '⛽ Show ETH gas prices' },\r\n { value: 'chart', label: '📈 Show historical price chart' },\r\n { value: 'icon', label: '🖼️ Look up a crypto icon' },\r\n { value: 'chains', label: '🔗 Browse chains and RPCs' },\r\n { value: 'balance', label: '👛 Read a wallet balance' },\r\n { value: 'convert', label: '🔄 Convert between coins' },\r\n { value: 'donate', label: '💖 Donate / Support' },\r\n { value: 'exit', label: '❌ Exit' },\r\n ],\r\n });\r\n\r\n if (isCancel(action) || action === 'exit') {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n\r\n if (['price', 'info', 'search', 'chart'].includes(action as string)) {\r\n const query = await text({\r\n message: 'Enter token symbol or contract address:',\r\n placeholder: 'e.g., btc, ethereum, 0x...',\r\n validate: (value) => {\r\n if (!value) return 'Please enter a valid query.';\r\n },\r\n });\r\n\r\n if (isCancel(query)) {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n\r\n if (action === 'price') await handlePrice(query as string);\r\n else if (action === 'info') await handleInfo(query as string);\r\n else if (action === 'search') await handleSearch(query as string);\r\n else if (action === 'chart') {\r\n const days = await text({\r\n message: 'Enter number of days for the chart (default 7):',\r\n placeholder: '7',\r\n defaultValue: '7',\r\n });\r\n if (isCancel(days)) {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n await handleChart(query as string, { days: days as string });\r\n }\r\n } else {\r\n if (action === 'top') await handleTop();\r\n else if (action === 'trending') await handleTrending();\r\n else if (action === 'market') await handleMarket();\r\n else if (action === 'sentiment') await handleSentiment();\r\n else if (action === 'gas') await handleGas();\r\n else if (action === 'donate') handleDonate();\r\n else if (action === 'icon') {\r\n const symbol = await text({ message: 'Symbol, network, wallet, or exchange:', placeholder: 'btc' });\r\n if (isCancel(symbol)) {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n handleIcon(symbol as string);\r\n } else if (action === 'chains') {\r\n const query = await text({\r\n message: 'Search chains (leave empty for the featured list):',\r\n placeholder: 'base',\r\n defaultValue: '',\r\n });\r\n if (isCancel(query)) {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n handleChains((query as string) || undefined);\r\n } else if (action === 'balance') {\r\n const chain = await text({ message: 'Chain:', placeholder: 'ethereum', defaultValue: 'ethereum' });\r\n if (isCancel(chain)) {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n const address = await text({ message: 'Address:', placeholder: '0x...' });\r\n if (isCancel(address)) {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n await handleBalance(address as string, chain as string);\r\n } else if (action === 'convert') {\r\n const amount = await text({ message: 'Amount:', placeholder: '1', defaultValue: '1' });\r\n if (isCancel(amount)) {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n const from = await text({ message: 'From symbol:', placeholder: 'btc' });\r\n if (isCancel(from)) {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n const to = await text({ message: 'To symbol or usd:', placeholder: 'eth' });\r\n if (isCancel(to)) {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n await handleConvert(amount as string, from as string, to as string);\r\n }\r\n }\r\n\r\n console.log(pc.gray('\\n---\\n'));\r\n }\r\n}\r\n\r\nif (process.argv.length <= 2) {\r\n interactiveMode().catch((err) => {\r\n console.error(pc.red('An error occurred:'), err);\r\n process.exit(1);\r\n });\r\n} else {\r\n program.parse(process.argv);\r\n}\r\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "crypull-cli",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"description": "Terminal UI for crypull.
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Terminal UI for crypull. Prices, charts, icons, chains, RPC URLs, and balances.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"crypull": "./dist/cli.js"
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"@clack/prompts": "^1.0.1",
|
|
36
36
|
"asciichart": "^1.5.25",
|
|
37
37
|
"commander": "^14.0.3",
|
|
38
|
-
"crypull": "^1.0
|
|
38
|
+
"crypull": "^1.1.0",
|
|
39
39
|
"picocolors": "^1.1.1"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|