crypull 1.0.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/README.md +209 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +1005 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.mjs +980 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/index.d.mts +227 -0
- package/dist/index.d.ts +227 -0
- package/dist/index.js +711 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +701 -0
- package/dist/index.mjs.map +1 -0
- package/examples/basic.ts +28 -0
- package/package.json +52 -0
- package/src/Crypull.ts +288 -0
- package/src/cli.ts +327 -0
- package/src/index.ts +14 -0
- package/src/providers/binance.ts +74 -0
- package/src/providers/coincap.ts +65 -0
- package/src/providers/coingecko.ts +92 -0
- package/src/providers/coinpaprika.ts +82 -0
- package/src/providers/cryptocompare.ts +56 -0
- package/src/providers/dexscreener.ts +82 -0
- package/src/providers/geckoterminal.ts +70 -0
- package/src/types.ts +130 -0
- package/tests/index.test.ts +15 -0
- package/tsconfig.json +16 -0
- package/tsup.config.ts +11 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/coingecko.ts","../src/providers/dexscreener.ts","../src/providers/geckoterminal.ts","../src/providers/binance.ts","../src/providers/coinpaprika.ts","../src/providers/coincap.ts","../src/providers/cryptocompare.ts","../src/Crypull.ts","../src/index.ts","../src/cli.ts"],"names":["Command","pc","asciichart"],"mappings":"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","file":"cli.js","sourcesContent":["import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\nexport class CoinGeckoProvider implements ICryptoProvider {\n name = 'CoinGecko';\n private baseUrl = 'https://api.coingecko.com/api/v3';\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const res = await fetch(`${this.baseUrl}/search?query=${query}`);\n if (!res.ok) return [];\n const data = await res.json();\n return (data.coins || []).slice(0, 10).map((coin: any) => ({\n id: coin.id,\n name: coin.name,\n symbol: coin.symbol.toUpperCase(),\n source: this.name,\n }));\n } catch (e) {\n return [];\n }\n }\n\n async getPrice(symbolOrId: string): Promise<PriceData | null> {\n try {\n let id = symbolOrId.toLowerCase();\n \n const searchRes = await this.search(id);\n const match = searchRes.find(s => s.symbol.toLowerCase() === id || s.id === id);\n if (match && match.id) {\n id = match.id;\n }\n\n const res = await fetch(`${this.baseUrl}/simple/price?ids=${id}&vs_currencies=usd`);\n if (!res.ok) return null;\n const data = await res.json();\n \n if (!data[id] || typeof data[id].usd === 'undefined') return null;\n\n return {\n symbol: match ? match.symbol : id.toUpperCase(),\n priceUsd: data[id].usd,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch (e) {\n return null;\n }\n }\n\n async getTokenInfo(id: string): Promise<TokenInfo | null> {\n try {\n // By default, assuming id is the coingecko internal ID (like \"bitcoin\")\n const res = await fetch(`${this.baseUrl}/coins/${id.toLowerCase()}?localization=false&tickers=false&market_data=true&community_data=false&developer_data=false&sparkline=false`);\n if (!res.ok) return null;\n const data = await res.json();\n \n if (data.error) return null;\n\n return {\n name: data.name,\n symbol: data.symbol.toUpperCase(),\n description: data.description?.en,\n priceUsd: data.market_data?.current_price?.usd || 0,\n marketCap: data.market_data?.market_cap?.usd,\n marketCapRank: data.market_cap_rank,\n fdv: data.market_data?.fully_diluted_valuation?.usd,\n circulatingSupply: data.market_data?.circulating_supply,\n totalSupply: data.market_data?.total_supply,\n maxSupply: data.market_data?.max_supply,\n volume24h: data.market_data?.total_volume?.usd,\n priceChange24h: data.market_data?.price_change_24h,\n priceChangePercentage24h: data.market_data?.price_change_percentage_24h,\n priceChangePercentage7d: data.market_data?.price_change_percentage_7d,\n ath: data.market_data?.ath?.usd,\n athDate: data.market_data?.ath_date?.usd,\n atl: data.market_data?.atl?.usd,\n atlDate: data.market_data?.atl_date?.usd,\n links: {\n website: data.links?.homepage?.[0],\n twitter: data.links?.twitter_screen_name ? `https://twitter.com/${data.links.twitter_screen_name}` : undefined,\n telegram: data.links?.telegram_channel_identifier ? `https://t.me/${data.links.telegram_channel_identifier}` : undefined,\n discord: data.links?.chat_url?.find((url: string) => url.includes('discord')),\n github: data.links?.repos_url?.github?.[0],\n },\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch (e) {\n return null;\n }\n }\n}","import { DexPairInfo, ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\nexport class DexScreenerProvider implements ICryptoProvider {\n name = 'DexScreener';\n private baseUrl = 'https://api.dexscreener.com/latest/dex';\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const res = await fetch(`${this.baseUrl}/search?q=${query}`);\n if (!res.ok) return [];\n const data = await res.json();\n return (data.pairs || []).slice(0, 10).map((pair: any) => ({\n id: pair.baseToken.address,\n name: pair.baseToken.name,\n symbol: pair.baseToken.symbol.toUpperCase(),\n network: pair.chainId,\n source: this.name,\n }));\n } catch (e) {\n return [];\n }\n }\n\n async getPrice(address: string): Promise<PriceData | null> {\n const info = await this.getTokenInfo(address);\n if (!info) return null;\n return {\n symbol: info.symbol,\n priceUsd: info.priceUsd,\n source: this.name,\n lastUpdated: info.lastUpdated,\n };\n }\n\n async getTokenInfo(address: string): Promise<TokenInfo | null> {\n try {\n const res = await fetch(`${this.baseUrl}/tokens/${address}`);\n if (!res.ok) return null;\n const data = await res.json();\n \n if (!data.pairs || data.pairs.length === 0) return null;\n\n // The first pair is usually the most liquid one\n const pair = data.pairs[0];\n \n // Map out all the pairs available on DEXs for this token\n const mappedPairs: DexPairInfo[] = data.pairs.slice(0, 10).map((p: any) => ({\n dexId: p.dexId,\n url: p.url,\n pairAddress: p.pairAddress,\n baseTokenSymbol: p.baseToken.symbol,\n quoteTokenSymbol: p.quoteToken.symbol,\n priceUsd: parseFloat(p.priceUsd) || 0,\n volume24h: p.volume?.h24,\n liquidityUsd: p.liquidity?.usd,\n }));\n\n return {\n name: pair.baseToken.name,\n symbol: pair.baseToken.symbol.toUpperCase(),\n address: pair.baseToken.address,\n network: pair.chainId,\n priceUsd: parseFloat(pair.priceUsd) || 0,\n fdv: pair.fdv,\n volume24h: pair.volume?.h24,\n liquidityUsd: pair.liquidity?.usd,\n priceChangePercentage24h: pair.priceChange?.h24,\n pairs: mappedPairs,\n links: {\n website: pair.info?.websites?.[0]?.url,\n twitter: pair.info?.socials?.find((s: any) => s.type === 'twitter')?.url,\n telegram: pair.info?.socials?.find((s: any) => s.type === 'telegram')?.url,\n discord: pair.info?.socials?.find((s: any) => s.type === 'discord')?.url,\n },\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch (e) {\n return null;\n }\n }\n}","import { DexPairInfo, ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\nexport class GeckoTerminalProvider implements ICryptoProvider {\n name = 'GeckoTerminal';\n private baseUrl = 'https://api.geckoterminal.com/api/v2';\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const res = await fetch(`${this.baseUrl}/search/pools?query=${query}`);\n if (!res.ok) return [];\n const data = await res.json();\n \n const pools = data.data || [];\n return pools.slice(0, 10).map((pool: any) => {\n const attributes = pool.attributes;\n const baseToken = attributes.name.split(' / ')[0]; // Usually Base / Quote\n return {\n id: pool.id, // e.g. \"eth_0x...\"\n name: attributes.name,\n symbol: baseToken,\n network: pool.relationships.network.data.id,\n source: this.name,\n };\n });\n } catch (e) {\n return [];\n }\n }\n\n async getPrice(address: string, network: string = 'eth'): Promise<PriceData | null> {\n const info = await this.getTokenInfo(address, network);\n if (!info) return null;\n return {\n symbol: info.symbol,\n priceUsd: info.priceUsd,\n source: this.name,\n lastUpdated: info.lastUpdated,\n };\n }\n\n async getTokenInfo(address: string, network: string = 'eth'): Promise<TokenInfo | null> {\n try {\n const res = await fetch(`${this.baseUrl}/networks/${network}/tokens/${address}`);\n if (!res.ok) return null;\n const json = await res.json();\n \n if (!json.data || !json.data.attributes) return null;\n\n const attrs = json.data.attributes;\n\n // Try to get pairs from pools list if geckoterminal provides it via another endpoint or included relationships\n // For now, GeckoTerminal's token endpoint doesn't return rich pairs list natively without separate call.\n // So we map what we can.\n \n return {\n name: attrs.name,\n symbol: attrs.symbol.toUpperCase(),\n address: attrs.address,\n network: network,\n priceUsd: parseFloat(attrs.price_usd) || 0,\n fdv: parseFloat(attrs.fdv_usd),\n volume24h: parseFloat(attrs.volume_usd?.h24 || 0),\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch (e) {\n return null;\n }\n }\n}","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\nexport class BinanceProvider implements ICryptoProvider {\n name = 'Binance';\n private baseUrl = 'https://api.binance.com/api/v3';\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n // Binance doesn't have a direct \"search\" that returns symbols nicely for our format\n // We can fetch exchangeInfo, but it's large. For speed, we return a mock match if they query\n // or we just return an empty array and rely on other providers for search.\n // But let's try a quick hack: if query is short, construct a symbol.\n const symbol = query.toUpperCase();\n const res = await fetch(`${this.baseUrl}/ticker/price?symbol=${symbol}USDT`);\n if (res.ok) {\n return [{\n id: `${symbol}USDT`,\n name: symbol,\n symbol: symbol,\n source: this.name\n }];\n }\n return [];\n } catch (e) {\n return [];\n }\n }\n\n async getPrice(symbol: string): Promise<PriceData | null> {\n try {\n let querySymbol = symbol.toUpperCase();\n if (!querySymbol.endsWith('USDT') && !querySymbol.endsWith('BUSD') && !querySymbol.endsWith('BTC')) {\n querySymbol += 'USDT';\n }\n\n const res = await fetch(`${this.baseUrl}/ticker/price?symbol=${querySymbol}`);\n if (!res.ok) return null;\n const data = await res.json();\n\n return {\n symbol: symbol.toUpperCase(),\n priceUsd: parseFloat(data.price) || 0,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch (e) {\n return null;\n }\n }\n\n async getTokenInfo(symbol: string): Promise<TokenInfo | null> {\n try {\n let querySymbol = symbol.toUpperCase();\n if (!querySymbol.endsWith('USDT') && !querySymbol.endsWith('BUSD') && !querySymbol.endsWith('BTC')) {\n querySymbol += 'USDT';\n }\n\n const res = await fetch(`${this.baseUrl}/ticker/24hr?symbol=${querySymbol}`);\n if (!res.ok) return null;\n const data = await res.json();\n\n return {\n name: symbol.toUpperCase(),\n symbol: symbol.toUpperCase(),\n priceUsd: parseFloat(data.lastPrice) || 0,\n volume24h: parseFloat(data.quoteVolume) || 0, // Quote volume in USDT roughly = USD volume\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch (e) {\n return null;\n }\n }\n}","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\nexport class CoinpaprikaProvider implements ICryptoProvider {\n name = 'Coinpaprika';\n private baseUrl = 'https://api.coinpaprika.com/v1';\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const res = await fetch(`${this.baseUrl}/search?q=${query}&c=currencies&limit=10`);\n if (!res.ok) return [];\n const data = await res.json();\n \n return (data.currencies || []).map((coin: any) => ({\n id: coin.id,\n name: coin.name,\n symbol: coin.symbol.toUpperCase(),\n source: this.name,\n }));\n } catch (e) {\n return [];\n }\n }\n\n async getPrice(symbolOrId: string): Promise<PriceData | null> {\n const info = await this.getTokenInfo(symbolOrId);\n if (!info) return null;\n return {\n symbol: info.symbol,\n priceUsd: info.priceUsd,\n source: this.name,\n lastUpdated: info.lastUpdated,\n };\n }\n\n async getTokenInfo(symbolOrId: string): Promise<TokenInfo | null> {\n try {\n let id = symbolOrId.toLowerCase();\n \n // If it doesn't look like a coinpaprika id (e.g. btc-bitcoin), search for it\n if (!id.includes('-')) {\n const searchRes = await this.search(id);\n const match = searchRes.find(s => s.symbol.toLowerCase() === id || s.id === id);\n if (match && match.id) {\n id = match.id;\n } else if (searchRes.length > 0 && searchRes[0].id) {\n id = searchRes[0].id;\n }\n }\n\n const res = await fetch(`${this.baseUrl}/tickers/${id}`);\n if (!res.ok) return null;\n const data = await res.json();\n \n return {\n name: data.name,\n symbol: data.symbol.toUpperCase(),\n description: data.description,\n priceUsd: data.quotes?.USD?.price || 0,\n marketCap: data.quotes?.USD?.market_cap,\n marketCapRank: data.rank,\n circulatingSupply: data.circulating_supply,\n totalSupply: data.total_supply,\n maxSupply: data.max_supply,\n volume24h: data.quotes?.USD?.volume_24h,\n priceChangePercentage24h: data.quotes?.USD?.percent_change_24h,\n priceChangePercentage7d: data.quotes?.USD?.percent_change_7d,\n ath: data.quotes?.USD?.ath_price,\n athDate: data.quotes?.USD?.ath_date,\n links: {\n website: data.links?.website?.[0],\n twitter: data.links?.twitter?.[0],\n discord: data.links?.discord?.[0],\n github: data.links?.source_code?.[0],\n },\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch (e) {\n return null;\n }\n }\n}","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\nexport class CoinCapProvider implements ICryptoProvider {\n name = 'CoinCap';\n private baseUrl = 'https://api.coincap.io/v2';\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const res = await fetch(`${this.baseUrl}/assets?search=${query}&limit=10`);\n if (!res.ok) return [];\n const data = await res.json();\n \n return (data.data || []).map((coin: any) => ({\n id: coin.id,\n name: coin.name,\n symbol: coin.symbol.toUpperCase(),\n source: this.name,\n }));\n } catch (e) {\n return [];\n }\n }\n\n async getPrice(symbolOrId: string): Promise<PriceData | null> {\n const info = await this.getTokenInfo(symbolOrId);\n if (!info) return null;\n return {\n symbol: info.symbol,\n priceUsd: info.priceUsd,\n source: this.name,\n lastUpdated: info.lastUpdated,\n };\n }\n\n async getTokenInfo(symbolOrId: string): Promise<TokenInfo | null> {\n try {\n let id = symbolOrId.toLowerCase();\n \n const searchRes = await this.search(id);\n const match = searchRes.find(s => s.symbol.toLowerCase() === id || s.id === id);\n if (match && match.id) {\n id = match.id;\n }\n\n const res = await fetch(`${this.baseUrl}/assets/${id}`);\n if (!res.ok) return null;\n const data = await res.json();\n const asset = data.data;\n\n if (!asset) return null;\n\n return {\n name: asset.name,\n symbol: asset.symbol.toUpperCase(),\n priceUsd: parseFloat(asset.priceUsd) || 0,\n marketCap: parseFloat(asset.marketCapUsd),\n volume24h: parseFloat(asset.volumeUsd24Hr),\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch (e) {\n return null;\n }\n }\n}","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\nexport class CryptoCompareProvider implements ICryptoProvider {\n name = 'CryptoCompare';\n private baseUrl = 'https://min-api.cryptocompare.com/data';\n\n async search(query: string): Promise<SearchResult[]> {\n // CryptoCompare search is a bit heavy (fetches all coins), so we mock or skip for basic search\n // Returning empty array and letting other providers handle search is better for perf.\n return [];\n }\n\n async getPrice(symbol: string): Promise<PriceData | null> {\n try {\n const sym = symbol.toUpperCase();\n const res = await fetch(`${this.baseUrl}/price?fsym=${sym}&tsyms=USD`);\n if (!res.ok) return null;\n const data = await res.json();\n \n if (data.Response === 'Error' || !data.USD) return null;\n\n return {\n symbol: sym,\n priceUsd: data.USD,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch (e) {\n return null;\n }\n }\n\n async getTokenInfo(symbol: string): Promise<TokenInfo | null> {\n try {\n const sym = symbol.toUpperCase();\n const res = await fetch(`${this.baseUrl}/pricemultifull?fsyms=${sym}&tsyms=USD`);\n if (!res.ok) return null;\n const data = await res.json();\n \n if (!data.RAW || !data.RAW[sym] || !data.RAW[sym].USD) return null;\n const raw = data.RAW[sym].USD;\n\n return {\n name: sym, // CryptoCompare doesn't give full name in this endpoint\n symbol: sym,\n priceUsd: raw.PRICE || 0,\n marketCap: raw.MKTCAP,\n volume24h: raw.TOTALVOLUME24HTO,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch (e) {\n return null;\n }\n }\n}","import { ChartData, DexPairInfo, GasData, GlobalMarketData, ICryptoProvider, PriceData, SearchResult, SentimentData, TokenInfo, TrendingCoin, TopCoin } from './types.js';\nimport { CoinGeckoProvider } from './providers/coingecko.js';\nimport { DexScreenerProvider } from './providers/dexscreener.js';\nimport { GeckoTerminalProvider } from './providers/geckoterminal.js';\nimport { BinanceProvider } from './providers/binance.js';\nimport { CoinpaprikaProvider } from './providers/coinpaprika.js';\nimport { CoinCapProvider } from './providers/coincap.js';\nimport { CryptoCompareProvider } from './providers/cryptocompare.js';\n\nexport interface CrypullOptions {\n providers?: ICryptoProvider[];\n}\n\nexport class Crypull {\n public providers: ICryptoProvider[];\n \n // Standard free providers\n private coinGecko = new CoinGeckoProvider();\n private dexScreener = new DexScreenerProvider();\n private geckoTerminal = new GeckoTerminalProvider();\n private binance = new BinanceProvider();\n private coinpaprika = new CoinpaprikaProvider();\n private coincap = new CoinCapProvider();\n private cryptoCompare = new CryptoCompareProvider();\n\n constructor(options?: CrypullOptions) {\n this.providers = options?.providers || [\n this.binance,\n this.coinGecko,\n this.coinpaprika,\n this.coincap,\n this.dexScreener,\n this.geckoTerminal,\n this.cryptoCompare\n ];\n }\n\n private isAddress(query: string): boolean {\n return (query.startsWith('0x') && query.length === 42) || query.length > 30;\n }\n\n /**\n * Search for a token or coin across multiple providers in parallel\n */\n async search(query: string): Promise<SearchResult[]> {\n const promises = [\n this.coinGecko.search(query),\n this.dexScreener.search(query),\n this.coinpaprika.search(query),\n this.coincap.search(query)\n ];\n \n const results = await Promise.allSettled(promises);\n const combined: SearchResult[] = [];\n \n for (const res of results) {\n if (res.status === 'fulfilled' && res.value) {\n combined.push(...res.value);\n }\n }\n \n // Deduplicate by symbol to keep results clean\n const seen = new Set();\n return combined.filter(item => {\n const key = `${item.symbol}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }\n\n /**\n * Get the current price of a cryptocurrency\n * @param query Can be a symbol (e.g., 'BTC') or a contract address\n * @param network Optional network for DEX addresses (e.g., 'eth', 'bsc')\n */\n async price(query: string, network?: string): Promise<PriceData | null> {\n if (this.isAddress(query)) {\n let res = await this.dexScreener.getPrice(query);\n if (res) return res;\n \n if (network) {\n res = await this.geckoTerminal.getPrice(query, network);\n if (res) return res;\n }\n } else {\n // Fast top-tier providers first\n let res = await this.binance.getPrice(query);\n if (res) return res;\n\n res = await this.coincap.getPrice(query);\n if (res) return res;\n\n res = await this.coinGecko.getPrice(query);\n if (res) return res;\n\n res = await this.coinpaprika.getPrice(query);\n if (res) return res;\n\n res = await this.cryptoCompare.getPrice(query);\n if (res) return res;\n }\n return null;\n }\n\n /**\n * Get detailed token info (market cap, volume, liquidity, etc.)\n * @param query Can be a symbol (e.g., 'BTC') or a contract address\n * @param network Optional network for DEX addresses\n */\n async info(query: string, network?: string): Promise<TokenInfo | null> {\n if (this.isAddress(query)) {\n let res = await this.dexScreener.getTokenInfo(query);\n if (res) return res;\n\n if (network) {\n res = await this.geckoTerminal.getTokenInfo(query, network);\n if (res) return res;\n }\n } else {\n // Attempt in order of best info\n let res = await this.coinGecko.getTokenInfo(query);\n if (res) return res;\n\n res = await this.coinpaprika.getTokenInfo(query);\n if (res) return res;\n\n res = await this.coincap.getTokenInfo(query);\n if (res) return res;\n\n res = await this.binance.getTokenInfo(query);\n if (res) return res;\n\n res = await this.cryptoCompare.getTokenInfo(query);\n if (res) return res;\n }\n return null;\n }\n\n /**\n * Get global market data\n */\n async market(): Promise<GlobalMarketData | null> {\n try {\n const res = await fetch(`https://api.coingecko.com/api/v3/global`);\n if (!res.ok) return null;\n const data = await res.json();\n const d = data.data;\n\n return {\n totalMarketCapUsd: d.total_market_cap.usd,\n totalVolume24hUsd: d.total_volume.usd,\n bitcoinDominancePercentage: d.market_cap_percentage.btc,\n ethereumDominancePercentage: d.market_cap_percentage.eth,\n activeCryptocurrencies: d.active_cryptocurrencies,\n lastUpdated: d.updated_at * 1000,\n };\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Get trending coins\n */\n async trending(): Promise<TrendingCoin[]> {\n try {\n const res = await fetch(`https://api.coingecko.com/api/v3/search/trending`);\n if (!res.ok) return [];\n const data = await res.json();\n\n return data.coins.slice(0, 10).map((c: any) => ({\n id: c.item.id,\n name: c.item.name,\n symbol: c.item.symbol.toUpperCase(),\n marketCapRank: c.item.market_cap_rank,\n priceUsd: c.item.data?.price,\n priceChange24h: c.item.data?.price_change_percentage_24h?.usd,\n volume24h: c.item.data?.total_volume,\n }));\n } catch (e) {\n return [];\n }\n }\n\n /**\n * Get top 50 coins by market cap\n */\n async top(): Promise<TopCoin[]> {\n try {\n const res = await fetch(`https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=50&page=1&sparkline=false`);\n if (!res.ok) return [];\n const data = await res.json();\n\n return data.map((c: any) => ({\n id: c.id,\n name: c.name,\n symbol: c.symbol.toUpperCase(),\n marketCapRank: c.market_cap_rank,\n priceUsd: c.current_price,\n marketCap: c.market_cap,\n volume24h: c.total_volume,\n priceChange24h: c.price_change_percentage_24h,\n }));\n } catch (e) {\n return [];\n }\n }\n\n /**\n * Get fear and greed index\n */\n async sentiment(): Promise<SentimentData | null> {\n try {\n const res = await fetch(`https://api.alternative.me/fng/?limit=1`);\n if (!res.ok) return null;\n const data = await res.json();\n const item = data.data[0];\n\n return {\n value: parseInt(item.value),\n classification: item.value_classification,\n lastUpdated: parseInt(item.timestamp) * 1000,\n };\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Get current ethereum gas prices (in Gwei)\n */\n async gas(): Promise<GasData | null> {\n try {\n // Using Etherscan public API (rate limited but works for basic usage)\n const res = await fetch(`https://api.etherscan.io/api?module=gastracker&action=gasoracle`);\n if (!res.ok) return null;\n const data = await res.json();\n \n if (data.status !== '1') return null;\n\n return {\n network: 'Ethereum',\n low: parseFloat(data.result.SafeGasPrice),\n average: parseFloat(data.result.ProposeGasPrice),\n high: parseFloat(data.result.FastGasPrice),\n baseFee: parseFloat(data.result.suggestBaseFee),\n };\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Get historical chart data for a coin\n * @param query Coin symbol or ID\n * @param days Number of days (e.g. 1, 7, 30)\n */\n async chart(query: string, days: number = 7): Promise<ChartData | null> {\n try {\n let id = query.toLowerCase();\n // Try to find the correct coingecko ID if a symbol is passed\n const searchRes = await this.coinGecko.search(id);\n const match = searchRes.find(s => s.symbol.toLowerCase() === id || s.id === id);\n if (match && match.id) {\n id = match.id;\n }\n\n const res = await fetch(`https://api.coingecko.com/api/v3/coins/${id}/market_chart?vs_currency=usd&days=${days}`);\n if (!res.ok) return null;\n const data = await res.json();\n\n if (!data.prices || data.prices.length === 0) return null;\n\n const prices = data.prices.map((p: any) => p[1]);\n const timestamps = data.prices.map((p: any) => p[0]);\n\n return {\n prices,\n timestamps,\n minPrice: Math.min(...prices),\n maxPrice: Math.max(...prices),\n };\n } catch (e) {\n return null;\n }\n }\n}","export * from './types.js';\nexport * from './Crypull.js';\nexport * from './providers/coingecko.js';\nexport * from './providers/dexscreener.js';\nexport * from './providers/geckoterminal.js';\nexport * from './providers/binance.js';\nexport * from './providers/coinpaprika.js';\nexport * from './providers/coincap.js';\nexport * from './providers/cryptocompare.js';\n\nimport { Crypull } from './Crypull.js';\n\n// Export a default instance for quick usage\nexport const crypull = new Crypull();\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport * as asciichart from 'asciichart';\nimport { crypull } from './index.js';\n\nconst program = new Command();\n\nprogram\n .name('crypull')\n .description('A human-friendly CLI to fetch crypto prices and info from multiple providers')\n .version('1.0.0');\n\nprogram\n .command('price <query>')\n .description('Get the current price of a cryptocurrency (symbol or contract address)')\n .action(async (query: string) => {\n console.log(pc.cyan(`\\nFetching price for ${pc.bold(query)}...`));\n \n const data = await crypull.price(query);\n \n if (!data) {\n console.log(pc.red(`\\n✖ Could not find price for \"${query}\".`));\n return;\n }\n\n console.log(pc.green(`\\n✔ Success! Found via ${pc.bold(data.source)}`));\n console.log(pc.white(`----------------------------------------`));\n console.log(`${pc.gray('Symbol:')} ${pc.yellow(pc.bold(data.symbol))}`);\n console.log(`${pc.gray('Price:')} ${pc.green('$' + data.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 }))}`);\n console.log(`${pc.gray('Updated:')} ${new Date(data.lastUpdated).toLocaleTimeString()}`);\n console.log(pc.white(`----------------------------------------\\n`));\n });\n\nprogram\n .command('info <query>')\n .description('Get detailed info about a cryptocurrency (market cap, volume, FDV, etc.)')\n .action(async (query: string) => {\n console.log(pc.cyan(`\\nFetching detailed info for ${pc.bold(query)}...`));\n \n const data = await crypull.info(query);\n \n if (!data) {\n console.log(pc.red(`\\n✖ Could not find info for \"${query}\".`));\n return;\n }\n\n console.log(pc.green(`\\n✔ Success! Found via ${pc.bold(data.source)}`));\n console.log(pc.white(`----------------------------------------`));\n console.log(`${pc.gray('Name:')} ${pc.white(pc.bold(data.name))}`);\n console.log(`${pc.gray('Symbol:')} ${pc.yellow(pc.bold(data.symbol))}`);\n console.log(`${pc.gray('Price:')} ${pc.green('$' + data.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 }))}`);\n \n if (data.marketCap) {\n console.log(`${pc.gray('MarketCap:')} ${pc.white('$' + data.marketCap.toLocaleString())}`);\n }\n if (data.marketCapRank) {\n console.log(`${pc.gray('Rank:')} ${pc.magenta('#' + data.marketCapRank)}`);\n }\n if (data.fdv) {\n console.log(`${pc.gray('FDV:')} ${pc.white('$' + data.fdv.toLocaleString())}`);\n }\n if (data.circulatingSupply) {\n console.log(`${pc.gray('Circ. Sup:')} ${pc.white(data.circulatingSupply.toLocaleString())}`);\n }\n if (data.totalSupply) {\n console.log(`${pc.gray('Total Sup:')} ${pc.white(data.totalSupply.toLocaleString())}`);\n }\n if (data.maxSupply) {\n console.log(`${pc.gray('Max Sup:')} ${pc.white(data.maxSupply.toLocaleString())}`);\n }\n if (data.volume24h) {\n console.log(`${pc.gray('24h Vol:')} ${pc.white('$' + data.volume24h.toLocaleString())}`);\n }\n if (data.priceChangePercentage24h !== undefined) {\n const pc24 = data.priceChangePercentage24h;\n const color = pc24 >= 0 ? pc.green : pc.red;\n console.log(`${pc.gray('24h %:')} ${color(pc24.toFixed(2) + '%')}`);\n }\n if (data.liquidityUsd) {\n console.log(`${pc.gray('Liquidity:')} ${pc.white('$' + data.liquidityUsd.toLocaleString())}`);\n }\n if (data.ath) {\n console.log(`${pc.gray('ATH:')} ${pc.green('$' + data.ath.toLocaleString())} ${data.athDate ? pc.gray(`(${new Date(data.athDate).toLocaleDateString()})`) : ''}`);\n }\n if (data.atl) {\n console.log(`${pc.gray('ATL:')} ${pc.red('$' + data.atl.toLocaleString())} ${data.atlDate ? pc.gray(`(${new Date(data.atlDate).toLocaleDateString()})`) : ''}`);\n }\n if (data.network) {\n console.log(`${pc.gray('Network:')} ${pc.magenta(data.network)}`);\n }\n if (data.address) {\n console.log(`${pc.gray('Address:')} ${pc.gray(data.address)}`);\n }\n\n if (data.links && Object.values(data.links).some(l => !!l)) {\n console.log(pc.white(`\\n--- Links ---`));\n if (data.links.website) console.log(`${pc.gray('Website:')} ${pc.blue(data.links.website)}`);\n if (data.links.twitter) console.log(`${pc.gray('Twitter:')} ${pc.blue(data.links.twitter)}`);\n if (data.links.telegram) console.log(`${pc.gray('Telegram:')} ${pc.blue(data.links.telegram)}`);\n if (data.links.discord) console.log(`${pc.gray('Discord:')} ${pc.blue(data.links.discord)}`);\n if (data.links.github) console.log(`${pc.gray('GitHub:')} ${pc.blue(data.links.github)}`);\n }\n\n if (data.description && data.description.length > 0) {\n console.log(pc.white(`\\n--- Description ---`));\n // Truncate to 300 chars to not flood terminal\n const desc = data.description.replace(/(<([^>]+)>)/gi, \"\"); // strip html\n const truncated = desc.length > 300 ? desc.substring(0, 300) + '...' : desc;\n console.log(pc.gray(truncated));\n }\n\n if (data.pairs && data.pairs.length > 0) {\n console.log(pc.white(`\\n--- Top Trading Pairs ---`));\n data.pairs.slice(0, 5).forEach((p, i) => {\n const title = `${p.baseTokenSymbol}/${p.quoteTokenSymbol}`;\n const priceStr = p.priceUsd ? `$${p.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 })}` : 'N/A';\n const volStr = p.volume24h ? `$${p.volume24h.toLocaleString(undefined, { maximumFractionDigits: 0 })}` : 'N/A';\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)}`);\n });\n }\n \n console.log(pc.white(`\\n----------------------------------------`));\n console.log(`${pc.gray('Updated:')} ${new Date(data.lastUpdated).toLocaleTimeString()}`);\n console.log(pc.white(`----------------------------------------\\n`));\n });\n\nprogram\n .command('top')\n .description('Show top 50 cryptocurrencies by market cap')\n .action(async () => {\n console.log(pc.cyan(`\\nFetching top 50 cryptocurrencies...`));\n \n const results = await crypull.top();\n \n if (!results || results.length === 0) {\n console.log(pc.red(`\\n✖ Could not fetch top coins at this time.`));\n return;\n }\n\n console.log(pc.green(`\\n✔ Top 50 Cryptocurrencies:`));\n console.log(pc.white(`----------------------------------------`));\n \n results.forEach((res, i) => {\n const priceStr = res.priceUsd ? `$${res.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 })}` : 'N/A';\n const mcapStr = res.marketCap ? `$${res.marketCap.toLocaleString()}` : 'N/A';\n \n let changeStr = '';\n if (res.priceChange24h !== undefined && res.priceChange24h !== null) {\n const color = res.priceChange24h >= 0 ? pc.green : pc.red;\n changeStr = color(`(${res.priceChange24h >= 0 ? '+' : ''}${res.priceChange24h.toFixed(2)}%)`);\n }\n \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)}`);\n });\n \n console.log(pc.white(`----------------------------------------\\n`));\n });\n\nprogram\n .command('search <query>')\n .description('Search for tokens or coins across multiple providers')\n .action(async (query: string) => {\n console.log(pc.cyan(`\\nSearching for ${pc.bold(query)}...`));\n \n const results = await crypull.search(query);\n \n if (!results || results.length === 0) {\n console.log(pc.red(`\\n✖ No results found for \"${query}\".`));\n return;\n }\n\n console.log(pc.green(`\\n✔ Found ${results.length} results:`));\n console.log(pc.white(`----------------------------------------`));\n \n results.forEach((res, i) => {\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})`)}`);\n if (res.network) {\n console.log(` ${pc.gray('Network:')} ${pc.magenta(res.network)}`);\n }\n if (res.id && res.id.length > 20) {\n console.log(` ${pc.gray('Address:')} ${pc.gray(res.id)}`);\n }\n });\n \n console.log(pc.white(`----------------------------------------\\n`));\n });\n\nprogram\n .command('trending')\n .description('Show top 10 trending coins/tokens right now')\n .action(async () => {\n console.log(pc.cyan(`\\nFetching top trending coins...`));\n \n const results = await crypull.trending();\n \n if (!results || results.length === 0) {\n console.log(pc.red(`\\n✖ Could not fetch trending data at this time.`));\n return;\n }\n\n console.log(pc.green(`\\n✔ Top 10 Trending Coins:`));\n console.log(pc.white(`----------------------------------------`));\n \n results.forEach((res, i) => {\n const priceStr = res.priceUsd ? `$${res.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 })}` : 'N/A';\n let changeStr = '';\n if (res.priceChange24h !== undefined) {\n const color = res.priceChange24h >= 0 ? pc.green : pc.red;\n changeStr = color(`(${res.priceChange24h >= 0 ? '+' : ''}${res.priceChange24h.toFixed(2)}%)`);\n }\n const rankStr = res.marketCapRank ? pc.magenta(`#${res.marketCapRank}`) : '';\n \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}`);\n });\n \n console.log(pc.white(`----------------------------------------\\n`));\n });\n\nprogram\n .command('market')\n .description('Show global cryptocurrency market overview')\n .action(async () => {\n console.log(pc.cyan(`\\nFetching global market data...`));\n \n const data = await crypull.market();\n \n if (!data) {\n console.log(pc.red(`\\n✖ Could not fetch global market data at this time.`));\n return;\n }\n\n console.log(pc.green(`\\n✔ Global Market Overview:`));\n console.log(pc.white(`----------------------------------------`));\n console.log(`${pc.gray('Total Market Cap:')} ${pc.white('$' + data.totalMarketCapUsd.toLocaleString())}`);\n console.log(`${pc.gray('24h Volume:')} ${pc.white('$' + data.totalVolume24hUsd.toLocaleString())}`);\n console.log(`${pc.gray('BTC Dominance:')} ${pc.yellow(data.bitcoinDominancePercentage.toFixed(2) + '%')}`);\n console.log(`${pc.gray('ETH Dominance:')} ${pc.blue(data.ethereumDominancePercentage.toFixed(2) + '%')}`);\n console.log(`${pc.gray('Active Coins:')} ${pc.white(data.activeCryptocurrencies.toLocaleString())}`);\n console.log(pc.white(`----------------------------------------`));\n console.log(`${pc.gray('Updated:')} ${new Date(data.lastUpdated).toLocaleTimeString()}`);\n console.log(pc.white(`----------------------------------------\\n`));\n });\n\nprogram\n .command('sentiment')\n .description('Show current Crypto Fear & Greed Index')\n .action(async () => {\n console.log(pc.cyan(`\\nFetching Fear & Greed Index...`));\n \n const data = await crypull.sentiment();\n \n if (!data) {\n console.log(pc.red(`\\n✖ Could not fetch sentiment data at this time.`));\n return;\n }\n\n const value = data.value;\n let color = pc.white;\n if (value <= 25) color = pc.red;\n else if (value <= 45) color = pc.yellow;\n else if (value <= 55) color = pc.white;\n else if (value <= 75) color = pc.green;\n else color = pc.blue;\n\n console.log(pc.green(`\\n✔ Current Market Sentiment:`));\n console.log(pc.white(`----------------------------------------`));\n console.log(`${pc.gray('Score:')} ${color(pc.bold(value.toString()) + ' / 100')}`);\n console.log(`${pc.gray('Classification:')} ${color(pc.bold(data.classification))}`);\n console.log(pc.white(`----------------------------------------\\n`));\n });\n\nprogram\n .command('gas')\n .description('Show current Ethereum network gas prices')\n .action(async () => {\n console.log(pc.cyan(`\\nFetching network gas prices...`));\n \n const data = await crypull.gas();\n \n if (!data) {\n console.log(pc.red(`\\n✖ Could not fetch gas prices at this time.`));\n return;\n }\n\n console.log(pc.green(`\\n✔ ${data.network} Gas Tracker (Gwei):`));\n console.log(pc.white(`----------------------------------------`));\n console.log(`${pc.gray('Low (Safe):')} ${pc.green(data.low + ' gwei')}`);\n console.log(`${pc.gray('Average:')} ${pc.yellow(data.average + ' gwei')}`);\n console.log(`${pc.gray('High (Fast):')} ${pc.red(data.high + ' gwei')}`);\n if (data.baseFee) {\n console.log(`${pc.gray('Base Fee:')} ${pc.white(data.baseFee + ' gwei')}`);\n }\n console.log(pc.white(`----------------------------------------\\n`));\n });\n\nprogram\n .command('chart <query>')\n .description('Draw a terminal ASCII chart of historical prices')\n .option('-d, --days <days>', 'Number of days to chart', '7')\n .action(async (query: string, options) => {\n const days = parseInt(options.days) || 7;\n console.log(pc.cyan(`\\nFetching ${days}-day chart data for ${pc.bold(query)}...`));\n \n const data = await crypull.chart(query, days);\n \n if (!data || !data.prices || data.prices.length === 0) {\n console.log(pc.red(`\\n✖ Could not fetch chart data for \"${query}\". Note: Charts may only be available for major coins.`));\n return;\n }\n\n // Determine color based on price action\n const firstPrice = data.prices[0];\n const lastPrice = data.prices[data.prices.length - 1];\n const isUp = lastPrice >= firstPrice;\n \n const chartConfig = {\n colors: [isUp ? asciichart.lightgreen : asciichart.lightred],\n height: 10\n };\n\n console.log(pc.green(`\\n✔ ${days}-Day Chart for ${query.toUpperCase()}:`));\n console.log(pc.gray(`Min: $${data.minPrice.toLocaleString(undefined, { maximumFractionDigits: 6 })} | Max: $${data.maxPrice.toLocaleString(undefined, { maximumFractionDigits: 6 })}`));\n console.log(pc.white(`\\n` + asciichart.plot(data.prices, chartConfig) + `\\n`));\n });\n\nprogram.parse(process.argv);"]}
|