crypull 1.0.2 → 1.0.3

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.
@@ -1 +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"],"names":[],"mappings":"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","file":"index.mjs","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';\r\nimport { CoinGeckoProvider } from './providers/coingecko.js';\r\nimport { DexScreenerProvider } from './providers/dexscreener.js';\r\nimport { GeckoTerminalProvider } from './providers/geckoterminal.js';\r\nimport { BinanceProvider } from './providers/binance.js';\r\nimport { CoinpaprikaProvider } from './providers/coinpaprika.js';\r\nimport { CoinCapProvider } from './providers/coincap.js';\r\nimport { CryptoCompareProvider } from './providers/cryptocompare.js';\r\n\r\nexport interface CrypullOptions {\r\n providers?: ICryptoProvider[];\r\n}\r\n\r\nexport class Crypull {\r\n public providers: ICryptoProvider[];\r\n \r\n // Standard free providers\r\n private coinGecko = new CoinGeckoProvider();\r\n private dexScreener = new DexScreenerProvider();\r\n private geckoTerminal = new GeckoTerminalProvider();\r\n private binance = new BinanceProvider();\r\n private coinpaprika = new CoinpaprikaProvider();\r\n private coincap = new CoinCapProvider();\r\n private cryptoCompare = new CryptoCompareProvider();\r\n\r\n constructor(options?: CrypullOptions) {\r\n this.providers = options?.providers || [\r\n this.binance,\r\n this.coinGecko,\r\n this.coinpaprika,\r\n this.coincap,\r\n this.dexScreener,\r\n this.geckoTerminal,\r\n this.cryptoCompare\r\n ];\r\n }\r\n\r\n private isAddress(query: string): boolean {\r\n return (query.startsWith('0x') && query.length === 42) || query.length > 30;\r\n }\r\n\r\n /**\r\n * Search for a token or coin across multiple providers in parallel\r\n */\r\n async search(query: string): Promise<SearchResult[]> {\r\n const promises = [\r\n this.coinGecko.search(query),\r\n this.dexScreener.search(query),\r\n this.coinpaprika.search(query),\r\n this.coincap.search(query)\r\n ];\r\n \r\n const results = await Promise.allSettled(promises);\r\n const combined: SearchResult[] = [];\r\n \r\n for (const res of results) {\r\n if (res.status === 'fulfilled' && res.value) {\r\n combined.push(...res.value);\r\n }\r\n }\r\n \r\n // Deduplicate by symbol to keep results clean\r\n const seen = new Set();\r\n return combined.filter(item => {\r\n const key = `${item.symbol}`;\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\r\n }\r\n\r\n /**\r\n * Get the current price of a cryptocurrency\r\n * @param query Can be a symbol (e.g., 'BTC') or a contract address\r\n * @param network Optional network for DEX addresses (e.g., 'eth', 'bsc')\r\n */\r\n async price(query: string, network?: string): Promise<PriceData | null> {\r\n if (this.isAddress(query)) {\r\n let res = await this.dexScreener.getPrice(query);\r\n if (res) return res;\r\n \r\n if (network) {\r\n res = await this.geckoTerminal.getPrice(query, network);\r\n if (res) return res;\r\n }\r\n } else {\r\n // Fast top-tier providers first\r\n let res = await this.binance.getPrice(query);\r\n if (res) return res;\r\n\r\n res = await this.coincap.getPrice(query);\r\n if (res) return res;\r\n\r\n res = await this.coinGecko.getPrice(query);\r\n if (res) return res;\r\n\r\n res = await this.coinpaprika.getPrice(query);\r\n if (res) return res;\r\n\r\n res = await this.cryptoCompare.getPrice(query);\r\n if (res) return res;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Get detailed token info (market cap, volume, liquidity, etc.)\r\n * @param query Can be a symbol (e.g., 'BTC') or a contract address\r\n * @param network Optional network for DEX addresses\r\n */\r\n async info(query: string, network?: string): Promise<TokenInfo | null> {\r\n if (this.isAddress(query)) {\r\n let res = await this.dexScreener.getTokenInfo(query);\r\n if (res) return res;\r\n\r\n if (network) {\r\n res = await this.geckoTerminal.getTokenInfo(query, network);\r\n if (res) return res;\r\n }\r\n } else {\r\n // Attempt in order of best info\r\n let res = await this.coinGecko.getTokenInfo(query);\r\n if (res) return res;\r\n\r\n res = await this.coinpaprika.getTokenInfo(query);\r\n if (res) return res;\r\n\r\n res = await this.coincap.getTokenInfo(query);\r\n if (res) return res;\r\n\r\n res = await this.binance.getTokenInfo(query);\r\n if (res) return res;\r\n\r\n res = await this.cryptoCompare.getTokenInfo(query);\r\n if (res) return res;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Get global market data\r\n */\r\n async market(): Promise<GlobalMarketData | null> {\r\n try {\r\n const res = await fetch(`https://api.coingecko.com/api/v3/global`);\r\n if (!res.ok) return null;\r\n const data = await res.json();\r\n const d = data.data;\r\n\r\n return {\r\n totalMarketCapUsd: d.total_market_cap.usd,\r\n totalVolume24hUsd: d.total_volume.usd,\r\n bitcoinDominancePercentage: d.market_cap_percentage.btc,\r\n ethereumDominancePercentage: d.market_cap_percentage.eth,\r\n activeCryptocurrencies: d.active_cryptocurrencies,\r\n lastUpdated: d.updated_at * 1000,\r\n };\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get trending coins\r\n */\r\n async trending(): Promise<TrendingCoin[]> {\r\n try {\r\n const res = await fetch(`https://api.coingecko.com/api/v3/search/trending`);\r\n if (!res.ok) return [];\r\n const data = await res.json();\r\n\r\n return data.coins.slice(0, 10).map((c: any) => ({\r\n id: c.item.id,\r\n name: c.item.name,\r\n symbol: c.item.symbol.toUpperCase(),\r\n marketCapRank: c.item.market_cap_rank,\r\n priceUsd: c.item.data?.price,\r\n priceChange24h: c.item.data?.price_change_percentage_24h?.usd,\r\n volume24h: c.item.data?.total_volume,\r\n }));\r\n } catch (e) {\r\n return [];\r\n }\r\n }\r\n\r\n /**\r\n * Get top 50 coins by market cap\r\n */\r\n async top(): Promise<TopCoin[]> {\r\n try {\r\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`);\r\n if (!res.ok) return [];\r\n const data = await res.json();\r\n\r\n return data.map((c: any) => ({\r\n id: c.id,\r\n name: c.name,\r\n symbol: c.symbol.toUpperCase(),\r\n marketCapRank: c.market_cap_rank,\r\n priceUsd: c.current_price,\r\n marketCap: c.market_cap,\r\n volume24h: c.total_volume,\r\n priceChange24h: c.price_change_percentage_24h,\r\n }));\r\n } catch (e) {\r\n return [];\r\n }\r\n }\r\n\r\n /**\r\n * Get fear and greed index\r\n */\r\n async sentiment(): Promise<SentimentData | null> {\r\n try {\r\n const res = await fetch(`https://api.alternative.me/fng/?limit=1`);\r\n if (!res.ok) return null;\r\n const data = await res.json();\r\n const item = data.data[0];\r\n\r\n return {\r\n value: parseInt(item.value),\r\n classification: item.value_classification,\r\n lastUpdated: parseInt(item.timestamp) * 1000,\r\n };\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get current ethereum gas prices (in Gwei)\r\n */\r\n async gas(): Promise<GasData | null> {\r\n try {\r\n // Using Etherscan public API V2 (rate limited but works for basic usage)\r\n const res = await fetch(`https://api.etherscan.io/v2/api?chainid=1&module=gastracker&action=gasoracle`);\r\n if (!res.ok) return null;\r\n const data = await res.json();\r\n \r\n if (data.status !== '1') return null;\r\n\r\n return {\r\n network: 'Ethereum',\r\n low: parseFloat(data.result.SafeGasPrice),\r\n average: parseFloat(data.result.ProposeGasPrice),\r\n high: parseFloat(data.result.FastGasPrice),\r\n baseFee: parseFloat(data.result.suggestBaseFee),\r\n };\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get historical chart data for a coin\r\n * @param query Coin symbol or ID\r\n * @param days Number of days (e.g. 1, 7, 30)\r\n */\r\n async chart(query: string, days: number = 7): Promise<ChartData | null> {\r\n try {\r\n let id = query.toLowerCase();\r\n // Try to find the correct coingecko ID if a symbol is passed\r\n const searchRes = await this.coinGecko.search(id);\r\n const match = searchRes.find(s => s.symbol.toLowerCase() === id || s.id === id);\r\n if (match && match.id) {\r\n id = match.id;\r\n }\r\n\r\n const res = await fetch(`https://api.coingecko.com/api/v3/coins/${id}/market_chart?vs_currency=usd&days=${days}`);\r\n if (!res.ok) return null;\r\n const data = await res.json();\r\n\r\n if (!data.prices || data.prices.length === 0) return null;\r\n\r\n const prices = data.prices.map((p: any) => p[1]);\r\n const timestamps = data.prices.map((p: any) => p[0]);\r\n\r\n return {\r\n prices,\r\n timestamps,\r\n minPrice: Math.min(...prices),\r\n maxPrice: Math.max(...prices),\r\n };\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\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"]}
1
+ {"version":3,"sources":["../src/providers/coingecko.ts","../src/providers/dexscreener.ts","../src/providers/geckoterminal.ts","../src/utils.ts","../src/providers/binance.ts","../src/providers/coinpaprika.ts","../src/providers/coincap.ts","../src/providers/cryptocompare.ts","../src/providers/coinmarketcap.ts","../src/providers/coinlore.ts","../src/providers/coinbase.ts","../src/providers/kraken.ts","../src/providers/kucoin.ts","../src/providers/bybit.ts","../src/providers/gateio.ts","../src/Crypull.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n ChartData,\n GlobalMarketData,\n ICryptoProvider,\n PriceData,\n SearchResult,\n TokenInfo,\n TopCoin,\n TrendingCoin,\n} from '../types.js';\n\nexport class CoinGeckoProvider implements ICryptoProvider {\n name = 'CoinGecko';\n addressBased = false;\n private baseUrl = 'https://api.coingecko.com/api/v3';\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const res = await fetch(\n `${this.baseUrl}/search?query=${encodeURIComponent(query)}`\n );\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 {\n return [];\n }\n }\n\n /** Resolve a symbol or slug to a CoinGecko coin id. */\n async resolveId(symbolOrId: string): Promise<{ id: string; symbol: string } | null> {\n const q = symbolOrId.toLowerCase().trim();\n if (!q) return null;\n\n const searchRes = await this.search(q);\n const match =\n searchRes.find((s) => s.id === q) ||\n searchRes.find((s) => s.symbol.toLowerCase() === q);\n\n if (match?.id) {\n return { id: match.id, symbol: match.symbol };\n }\n\n // Already a valid id (e.g. \"bitcoin\") — probe via simple/price\n return { id: q, symbol: q.toUpperCase() };\n }\n\n async getPrice(symbolOrId: string): Promise<PriceData | null> {\n try {\n const resolved = await this.resolveId(symbolOrId);\n if (!resolved) return null;\n\n const res = await fetch(\n `${this.baseUrl}/simple/price?ids=${encodeURIComponent(resolved.id)}&vs_currencies=usd`\n );\n if (!res.ok) return null;\n const data = await res.json();\n\n if (!data[resolved.id] || typeof data[resolved.id].usd === 'undefined') {\n return null;\n }\n\n return {\n symbol: resolved.symbol,\n priceUsd: data[resolved.id].usd,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n\n async getTokenInfo(symbolOrId: string): Promise<TokenInfo | null> {\n try {\n const resolved = await this.resolveId(symbolOrId);\n if (!resolved) return null;\n\n const res = await fetch(\n `${this.baseUrl}/coins/${encodeURIComponent(resolved.id)}?localization=false&tickers=false&market_data=true&community_data=false&developer_data=false&sparkline=false`\n );\n if (!res.ok) return null;\n const data = await res.json();\n\n if (data.error || !data.id) 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] || undefined,\n twitter: data.links?.twitter_screen_name\n ? `https://twitter.com/${data.links.twitter_screen_name}`\n : undefined,\n telegram: data.links?.telegram_channel_identifier\n ? `https://t.me/${data.links.telegram_channel_identifier}`\n : undefined,\n discord: data.links?.chat_url?.find((url: string) =>\n url.includes('discord')\n ),\n github: data.links?.repos_url?.github?.[0],\n },\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n\n async getGlobalMarket(): Promise<GlobalMarketData | null> {\n try {\n const res = await fetch(`${this.baseUrl}/global`);\n if (!res.ok) return null;\n const data = await res.json();\n const d = data.data;\n if (!d) return null;\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 {\n return null;\n }\n }\n\n async getTrending(): Promise<TrendingCoin[]> {\n try {\n const res = await fetch(`${this.baseUrl}/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 {\n return [];\n }\n }\n\n async getTop(limit = 50): Promise<TopCoin[]> {\n try {\n const res = await fetch(\n `${this.baseUrl}/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=${limit}&page=1&sparkline=false`\n );\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 {\n return [];\n }\n }\n\n async getChart(query: string, days = 7): Promise<ChartData | null> {\n try {\n const resolved = await this.resolveId(query);\n if (!resolved) return null;\n\n const res = await fetch(\n `${this.baseUrl}/coins/${encodeURIComponent(resolved.id)}/market_chart?vs_currency=usd&days=${days}`\n );\n if (!res.ok) return null;\n const data = await res.json();\n\n if (!data.prices?.length) return null;\n\n const prices = data.prices.map((p: [number, number]) => p[1]);\n const timestamps = data.prices.map((p: [number, number]) => p[0]);\n\n return {\n prices,\n timestamps,\n minPrice: Math.min(...prices),\n maxPrice: Math.max(...prices),\n };\n } catch {\n return null;\n }\n }\n}\n","import { DexPairInfo, ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\nexport class DexScreenerProvider implements ICryptoProvider {\n name = 'DexScreener';\n addressBased = true;\n private baseUrl = 'https://api.dexscreener.com/latest/dex';\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const res = await fetch(\n `${this.baseUrl}/search?q=${encodeURIComponent(query)}`\n );\n if (!res.ok) return [];\n const data = await res.json();\n\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 {\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(\n `${this.baseUrl}/tokens/${encodeURIComponent(address)}`\n );\n if (!res.ok) return null;\n const data = await res.json();\n\n if (!data.pairs?.length) return null;\n\n // Prefer highest liquidity pair (API does not guarantee order)\n const sorted = [...data.pairs].sort(\n (a: any, b: any) => (b.liquidity?.usd || 0) - (a.liquidity?.usd || 0)\n );\n const pair = sorted[0];\n\n const mappedPairs: DexPairInfo[] = sorted.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 {\n return null;\n }\n }\n}\n","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\nexport class GeckoTerminalProvider implements ICryptoProvider {\n name = 'GeckoTerminal';\n addressBased = true;\n private baseUrl = 'https://api.geckoterminal.com/api/v2';\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const res = await fetch(\n `${this.baseUrl}/search/pools?query=${encodeURIComponent(query)}`\n );\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] || attributes.name;\n return {\n id: pool.id,\n name: attributes.name,\n symbol: typeof baseToken === 'string' ? baseToken.toUpperCase() : String(baseToken),\n network: pool.relationships?.network?.data?.id,\n source: this.name,\n };\n });\n } catch {\n return [];\n }\n }\n\n async getPrice(address: string, network = '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 = 'eth'): Promise<TokenInfo | null> {\n try {\n const res = await fetch(\n `${this.baseUrl}/networks/${encodeURIComponent(network)}/tokens/${encodeURIComponent(address)}`\n );\n if (!res.ok) return null;\n const json = await res.json();\n\n if (!json.data?.attributes) return null;\n const attrs = json.data.attributes;\n\n return {\n name: attrs.name,\n symbol: attrs.symbol.toUpperCase(),\n address: attrs.address,\n network,\n priceUsd: parseFloat(attrs.price_usd) || 0,\n fdv: parseFloat(attrs.fdv_usd) || undefined,\n volume24h: parseFloat(attrs.volume_usd?.h24 || 0) || undefined,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n}\n","/**\n * Detect contract addresses (EVM / Solana-style) vs ticker symbols.\n */\nexport function isContractAddress(query: string): boolean {\n const q = query.trim();\n if (!q) return false;\n\n // EVM: 0x + 40 hex chars\n if (/^0x[a-fA-F0-9]{40}$/.test(q)) return true;\n\n // Solana / base58 addresses are typically 32–44 chars, no 0x prefix\n if (\n q.length >= 32 &&\n q.length <= 44 &&\n !q.includes(' ') &&\n /^[1-9A-HJ-NP-Za-km-z]+$/.test(q)\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Normalize to a Binance USD quote pair (library prices are always USD-oriented).\n * e.g. BTC → BTCUSDT, WBTC → WBTCUSDT, ETHUSDT → ETHUSDT\n */\nexport function toBinancePair(symbol: string): string {\n const upper = symbol.toUpperCase().trim();\n if (!upper) return upper;\n if (upper.endsWith('USDT') || upper.endsWith('BUSD')) return upper;\n return `${upper}USDT`;\n}\n\n/**\n * Strip a Binance USD quote suffix back to the base asset symbol.\n */\nexport function fromBinancePair(pair: string): string {\n const upper = pair.toUpperCase();\n if (upper.endsWith('USDT') && upper.length > 4) return upper.slice(0, -4);\n if (upper.endsWith('BUSD') && upper.length > 4) return upper.slice(0, -4);\n return upper;\n}\n\n/**\n * Default GeckoTerminal network for an address when none is provided.\n */\nexport function defaultDexNetwork(address: string): string {\n if (/^0x[a-fA-F0-9]{40}$/.test(address.trim())) return 'eth';\n return 'solana';\n}\n\n/** Parse a number; return undefined for NaN/non-finite (preserves 0). */\nexport function finiteOrUndefined(value: unknown): number | undefined {\n const n = typeof value === 'number' ? value : parseFloat(String(value));\n return Number.isFinite(n) ? n : undefined;\n}\n","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\nimport { fromBinancePair, toBinancePair, finiteOrUndefined } from '../utils.js';\n\nexport class BinanceProvider implements ICryptoProvider {\n name = 'Binance';\n addressBased = false;\n private baseUrl = 'https://api.binance.com/api/v3';\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const pair = toBinancePair(query);\n const res = await fetch(`${this.baseUrl}/ticker/price?symbol=${pair}`);\n if (!res.ok) return [];\n\n const base = fromBinancePair(pair);\n return [\n {\n id: pair,\n name: base,\n symbol: base,\n source: this.name,\n },\n ];\n } catch {\n return [];\n }\n }\n\n async getPrice(symbol: string): Promise<PriceData | null> {\n try {\n const querySymbol = toBinancePair(symbol);\n const res = await fetch(`${this.baseUrl}/ticker/price?symbol=${querySymbol}`);\n if (!res.ok) return null;\n const data = await res.json();\n if (!data.price) return null;\n\n return {\n symbol: fromBinancePair(querySymbol),\n priceUsd: parseFloat(data.price) || 0,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n\n async getTokenInfo(symbol: string): Promise<TokenInfo | null> {\n try {\n const querySymbol = toBinancePair(symbol);\n const res = await fetch(`${this.baseUrl}/ticker/24hr?symbol=${querySymbol}`);\n if (!res.ok) return null;\n const data = await res.json();\n if (!data.lastPrice) return null;\n\n const base = fromBinancePair(querySymbol);\n return {\n name: base,\n symbol: base,\n priceUsd: parseFloat(data.lastPrice) || 0,\n volume24h: parseFloat(data.quoteVolume) || 0,\n priceChangePercentage24h: finiteOrUndefined(data.priceChangePercent),\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n}\n","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\nexport class CoinpaprikaProvider implements ICryptoProvider {\n name = 'Coinpaprika';\n addressBased = false;\n private baseUrl = 'https://api.coinpaprika.com/v1';\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const res = await fetch(\n `${this.baseUrl}/search?q=${encodeURIComponent(query)}&c=currencies&limit=10`\n );\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 {\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().trim();\n if (!id) return null;\n\n // Coinpaprika ids look like \"btc-bitcoin\"\n if (!id.includes('-')) {\n const searchRes = await this.search(id);\n const match =\n searchRes.find((s) => s.symbol.toLowerCase() === id) ||\n searchRes.find((s) => s.id === id);\n\n if (!match?.id) return null;\n id = match.id;\n }\n\n const res = await fetch(`${this.baseUrl}/tickers/${encodeURIComponent(id)}`);\n if (!res.ok) return null;\n const data = await res.json();\n if (!data.symbol) return null;\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 {\n return null;\n }\n }\n}\n","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\nexport class CoinCapProvider implements ICryptoProvider {\n name = 'CoinCap';\n addressBased = false;\n private baseUrl = 'https://api.coincap.io/v2';\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const res = await fetch(\n `${this.baseUrl}/assets?search=${encodeURIComponent(query)}&limit=10`\n );\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 {\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().trim();\n if (!id) return null;\n\n const searchRes = await this.search(id);\n const match =\n searchRes.find((s) => s.symbol.toLowerCase() === id) ||\n searchRes.find((s) => s.id === id);\n\n if (match?.id) {\n id = match.id;\n }\n\n const res = await fetch(`${this.baseUrl}/assets/${encodeURIComponent(id)}`);\n if (!res.ok) return null;\n const data = await res.json();\n const asset = data.data;\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) || undefined,\n volume24h: parseFloat(asset.volumeUsd24Hr) || undefined,\n priceChangePercentage24h: parseFloat(asset.changePercent24Hr) || undefined,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n}\n","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\nexport class CryptoCompareProvider implements ICryptoProvider {\n name = 'CryptoCompare';\n addressBased = false;\n private baseUrl = 'https://min-api.cryptocompare.com/data';\n\n // CryptoCompare coin list is heavy; search is handled by other providers.\n async search(_query: string): Promise<SearchResult[]> {\n return [];\n }\n\n async getPrice(symbol: string): Promise<PriceData | null> {\n try {\n const sym = symbol.toUpperCase().trim();\n if (!sym) return null;\n\n const res = await fetch(\n `${this.baseUrl}/price?fsym=${encodeURIComponent(sym)}&tsyms=USD`\n );\n if (!res.ok) return null;\n const data = await res.json();\n\n if (data.Response === 'Error' || typeof data.USD !== 'number') return null;\n\n return {\n symbol: sym,\n priceUsd: data.USD,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n\n async getTokenInfo(symbol: string): Promise<TokenInfo | null> {\n try {\n const sym = symbol.toUpperCase().trim();\n if (!sym) return null;\n\n const res = await fetch(\n `${this.baseUrl}/pricemultifull?fsyms=${encodeURIComponent(sym)}&tsyms=USD`\n );\n if (!res.ok) return null;\n const data = await res.json();\n\n const raw = data.RAW?.[sym]?.USD;\n if (!raw) return null;\n\n return {\n name: sym,\n symbol: sym,\n priceUsd: raw.PRICE || 0,\n marketCap: raw.MKTCAP,\n volume24h: raw.TOTALVOLUME24HTO,\n priceChangePercentage24h: raw.CHANGEPCT24HOUR,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n}\n","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\n/**\n * CoinMarketCap keyless public API (no API key required).\n * https://pro-api.coinmarketcap.com/public-api\n */\nexport class CoinMarketCapProvider implements ICryptoProvider {\n name = 'CoinMarketCap';\n addressBased = false;\n private baseUrl = 'https://pro-api.coinmarketcap.com/public-api';\n\n private headers = {\n Accept: 'application/json',\n 'User-Agent': 'crypull',\n };\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const q = query.trim();\n if (!q) return [];\n\n const res = await fetch(\n `${this.baseUrl}/v1/cryptocurrency/map?symbol=${encodeURIComponent(q.toUpperCase())}`,\n { headers: this.headers }\n );\n if (!res.ok) return [];\n const data = await res.json();\n const list = (data.data || [])\n .filter((c: any) => c.is_active === 1)\n .sort((a: any, b: any) => (a.rank || 999999) - (b.rank || 999999))\n .slice(0, 10);\n\n return list.map((c: any) => ({\n id: c.slug || String(c.id),\n name: c.name,\n symbol: c.symbol.toUpperCase(),\n source: this.name,\n }));\n } catch {\n return [];\n }\n }\n\n async getPrice(symbol: string): Promise<PriceData | null> {\n const info = await this.getTokenInfo(symbol);\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(symbolOrSlug: string): Promise<TokenInfo | null> {\n try {\n const q = symbolOrSlug.trim();\n if (!q) return null;\n\n // Prefer symbol lookup; fall back to slug for names like \"bitcoin\"\n let url = `${this.baseUrl}/v3/cryptocurrency/quotes/latest?symbol=${encodeURIComponent(q.toUpperCase())}`;\n let res = await fetch(url, { headers: this.headers });\n let data = res.ok ? await res.json() : null;\n\n if (!data?.data?.length) {\n url = `${this.baseUrl}/v3/cryptocurrency/quotes/latest?slug=${encodeURIComponent(q.toLowerCase())}`;\n res = await fetch(url, { headers: this.headers });\n if (!res.ok) return null;\n data = await res.json();\n }\n\n const coin = data?.data?.[0];\n if (!coin) return null;\n\n const quote = Array.isArray(coin.quote)\n ? coin.quote.find((x: any) => x.symbol === 'USD') || coin.quote[0]\n : coin.quote?.USD;\n\n if (!quote || typeof quote.price !== 'number') return null;\n\n return {\n name: coin.name,\n symbol: coin.symbol.toUpperCase(),\n priceUsd: quote.price,\n marketCap: quote.market_cap,\n marketCapRank: coin.cmc_rank,\n fdv: quote.fully_diluted_market_cap,\n circulatingSupply: coin.circulating_supply,\n totalSupply: coin.total_supply,\n maxSupply: coin.max_supply ?? undefined,\n volume24h: quote.volume_24h,\n priceChangePercentage24h: quote.percent_change_24h,\n priceChangePercentage7d: quote.percent_change_7d,\n source: this.name,\n lastUpdated: quote.last_updated\n ? Date.parse(quote.last_updated)\n : Date.now(),\n };\n } catch {\n return null;\n }\n }\n}\n","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\nimport { finiteOrUndefined } from '../utils.js';\n\n/**\n * CoinLore free public API (no API key).\n * https://api.coinlore.net/api/\n */\nexport class CoinLoreProvider implements ICryptoProvider {\n name = 'CoinLore';\n addressBased = false;\n private baseUrl = 'https://api.coinlore.net/api';\n\n /** Scan top tickers pages to resolve symbol → coin id. */\n private async findTicker(query: string): Promise<any | null> {\n const q = query.toLowerCase().trim();\n if (!q) return null;\n\n // Search first 300 by market cap (3 pages × 100) — covers majors + mid-caps\n for (let start = 0; start < 300; start += 100) {\n const res = await fetch(\n `${this.baseUrl}/tickers/?start=${start}&limit=100`\n );\n if (!res.ok) return null;\n const data = await res.json();\n const list: any[] = data.data || [];\n if (!list.length) break;\n\n const exact =\n list.find((c) => c.symbol?.toLowerCase() === q) ||\n list.find((c) => c.nameid?.toLowerCase() === q) ||\n list.find((c) => c.name?.toLowerCase() === q);\n\n if (exact) return exact;\n }\n return null;\n }\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const q = query.toLowerCase().trim();\n if (!q) return [];\n\n const matches: SearchResult[] = [];\n for (let start = 0; start < 200; start += 100) {\n const res = await fetch(\n `${this.baseUrl}/tickers/?start=${start}&limit=100`\n );\n if (!res.ok) break;\n const data = await res.json();\n const list: any[] = data.data || [];\n if (!list.length) break;\n\n for (const c of list) {\n const sym = (c.symbol || '').toLowerCase();\n const name = (c.name || '').toLowerCase();\n const nameid = (c.nameid || '').toLowerCase();\n if (sym.includes(q) || name.includes(q) || nameid.includes(q)) {\n matches.push({\n id: c.id,\n name: c.name,\n symbol: c.symbol.toUpperCase(),\n source: this.name,\n });\n }\n if (matches.length >= 10) return matches;\n }\n }\n return matches;\n } catch {\n return [];\n }\n }\n\n async getPrice(symbol: string): Promise<PriceData | null> {\n const info = await this.getTokenInfo(symbol);\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 const q = symbolOrId.trim();\n if (!q) return null;\n\n let ticker: any | null = null;\n\n // Numeric CoinLore id\n if (/^\\d+$/.test(q)) {\n const res = await fetch(`${this.baseUrl}/ticker/?id=${q}`);\n if (res.ok) {\n const data = await res.json();\n ticker = Array.isArray(data) ? data[0] : null;\n }\n } else {\n ticker = await this.findTicker(q);\n }\n\n if (!ticker) return null;\n\n return {\n name: ticker.name,\n symbol: ticker.symbol.toUpperCase(),\n priceUsd: parseFloat(ticker.price_usd) || 0,\n marketCap: finiteOrUndefined(ticker.market_cap_usd),\n marketCapRank: finiteOrUndefined(ticker.rank),\n circulatingSupply: finiteOrUndefined(ticker.csupply),\n totalSupply: finiteOrUndefined(ticker.tsupply),\n maxSupply: finiteOrUndefined(ticker.msupply),\n volume24h: finiteOrUndefined(ticker.volume24),\n priceChangePercentage24h: finiteOrUndefined(ticker.percent_change_24h),\n priceChangePercentage7d: finiteOrUndefined(ticker.percent_change_7d),\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n}\n","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\n/**\n * Coinbase public spot price API (no API key).\n * https://api.coinbase.com/v2/\n */\nexport class CoinbaseProvider implements ICryptoProvider {\n name = 'Coinbase';\n addressBased = false;\n private baseUrl = 'https://api.coinbase.com/v2';\n\n async search(query: string): Promise<SearchResult[]> {\n try {\n const sym = query.toUpperCase().trim();\n if (!sym) return [];\n const res = await fetch(`${this.baseUrl}/prices/${encodeURIComponent(sym)}-USD/spot`);\n if (!res.ok) return [];\n const data = await res.json();\n if (!data.data?.amount) return [];\n return [\n {\n id: sym,\n name: sym,\n symbol: sym,\n source: this.name,\n },\n ];\n } catch {\n return [];\n }\n }\n\n async getPrice(symbol: string): Promise<PriceData | null> {\n try {\n const sym = symbol.toUpperCase().trim();\n if (!sym) return null;\n const res = await fetch(\n `${this.baseUrl}/prices/${encodeURIComponent(sym)}-USD/spot`\n );\n if (!res.ok) return null;\n const data = await res.json();\n const amount = parseFloat(data.data?.amount);\n if (!amount) return null;\n\n return {\n symbol: sym,\n priceUsd: amount,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n\n async getTokenInfo(symbol: string): Promise<TokenInfo | null> {\n const price = await this.getPrice(symbol);\n if (!price) return null;\n return {\n name: price.symbol,\n symbol: price.symbol,\n priceUsd: price.priceUsd,\n source: this.name,\n lastUpdated: price.lastUpdated,\n };\n }\n}\n","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\n\n/**\n * Kraken public ticker API (no API key).\n * https://api.kraken.com/0/public/\n *\n * Note: Kraken uses XBT for Bitcoin.\n */\nexport class KrakenProvider implements ICryptoProvider {\n name = 'Kraken';\n addressBased = false;\n private baseUrl = 'https://api.kraken.com/0/public';\n\n private toPair(symbol: string): string {\n let base = symbol.toUpperCase().trim();\n\n // Normalize full pairs back to base (avoid TUSD → T mistaking)\n if (base.endsWith('USDT') && base.length > 4) {\n base = base.slice(0, -4);\n } else if (base.endsWith('USD') && base.length >= 6) {\n // ETHUSD / BTCUSD / SOLUSD (base >= 3 chars)\n base = base.slice(0, -3);\n }\n\n if (base === 'BTC') base = 'XBT';\n return `${base}USD`;\n }\n\n private fromPairKey(pairKey: string, fallback: string): string {\n const key = pairKey.toUpperCase();\n if (key.includes('XBT')) return 'BTC';\n const base = fallback.toUpperCase().trim().replace(/USDT?$/, '');\n return base === 'XBT' ? 'BTC' : base || key;\n }\n\n async search(query: string): Promise<SearchResult[]> {\n const price = await this.getPrice(query);\n if (!price) return [];\n return [\n {\n id: price.symbol,\n name: price.symbol,\n symbol: price.symbol,\n source: this.name,\n },\n ];\n }\n\n async getPrice(symbol: string): Promise<PriceData | null> {\n try {\n const pair = this.toPair(symbol);\n const res = await fetch(\n `${this.baseUrl}/Ticker?pair=${encodeURIComponent(pair)}`\n );\n if (!res.ok) return null;\n const data = await res.json();\n if (data.error?.length || !data.result) return null;\n\n const keys = Object.keys(data.result);\n if (!keys.length) return null;\n const ticker = data.result[keys[0]];\n const last = parseFloat(ticker.c?.[0]);\n if (!last) return null;\n\n return {\n symbol: this.fromPairKey(keys[0], symbol),\n priceUsd: last,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n\n async getTokenInfo(symbol: string): Promise<TokenInfo | null> {\n try {\n const pair = this.toPair(symbol);\n const res = await fetch(\n `${this.baseUrl}/Ticker?pair=${encodeURIComponent(pair)}`\n );\n if (!res.ok) return null;\n const data = await res.json();\n if (data.error?.length || !data.result) return null;\n\n const keys = Object.keys(data.result);\n if (!keys.length) return null;\n const ticker = data.result[keys[0]];\n const last = parseFloat(ticker.c?.[0]);\n if (!last) return null;\n\n const vol = parseFloat(ticker.v?.[1]);\n const vwap = parseFloat(ticker.p?.[1]);\n const sym = this.fromPairKey(keys[0], symbol);\n\n return {\n name: sym,\n symbol: sym,\n priceUsd: last,\n volume24h: vol && vwap ? vol * vwap : undefined,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n}\n","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\nimport { finiteOrUndefined } from '../utils.js';\n\n/**\n * KuCoin public market API (no API key).\n * https://api.kucoin.com/api/v1/\n */\nexport class KuCoinProvider implements ICryptoProvider {\n name = 'KuCoin';\n addressBased = false;\n private baseUrl = 'https://api.kucoin.com/api/v1';\n\n private toSymbol(symbol: string): string {\n const upper = symbol.toUpperCase().trim();\n if (upper.includes('-')) return upper;\n // Only strip USDT — do not strip bare \"USD\" (breaks TUSD, GUSD, etc.)\n if (upper.endsWith('USDT') && upper.length > 4) {\n return `${upper.slice(0, -4)}-USDT`;\n }\n return `${upper}-USDT`;\n }\n\n private baseAsset(pair: string): string {\n return pair.split('-')[0] || pair;\n }\n\n async search(query: string): Promise<SearchResult[]> {\n const price = await this.getPrice(query);\n if (!price) return [];\n return [\n {\n id: `${price.symbol}-USDT`,\n name: price.symbol,\n symbol: price.symbol,\n source: this.name,\n },\n ];\n }\n\n async getPrice(symbol: string): Promise<PriceData | null> {\n try {\n const pair = this.toSymbol(symbol);\n const res = await fetch(\n `${this.baseUrl}/market/orderbook/level1?symbol=${encodeURIComponent(pair)}`\n );\n if (!res.ok) return null;\n const data = await res.json();\n if (data.code !== '200000' || !data.data?.price) return null;\n\n return {\n symbol: this.baseAsset(pair),\n priceUsd: parseFloat(data.data.price) || 0,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n\n async getTokenInfo(symbol: string): Promise<TokenInfo | null> {\n try {\n const pair = this.toSymbol(symbol);\n const res = await fetch(\n `${this.baseUrl}/market/stats?symbol=${encodeURIComponent(pair)}`\n );\n if (!res.ok) return null;\n const data = await res.json();\n if (data.code !== '200000' || !data.data?.last) return null;\n const d = data.data;\n\n return {\n name: this.baseAsset(pair),\n symbol: this.baseAsset(pair),\n priceUsd: parseFloat(d.last) || 0,\n volume24h: finiteOrUndefined(d.volValue),\n priceChangePercentage24h: (() => {\n const rate = finiteOrUndefined(d.changeRate);\n return rate === undefined ? undefined : rate * 100;\n })(),\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n}\n","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\nimport { fromBinancePair, toBinancePair, finiteOrUndefined } from '../utils.js';\n\n/**\n * Bybit public spot ticker API (no API key).\n * https://api.bybit.com/v5/market/\n */\nexport class BybitProvider implements ICryptoProvider {\n name = 'Bybit';\n addressBased = false;\n private baseUrl = 'https://api.bybit.com/v5/market';\n\n async search(query: string): Promise<SearchResult[]> {\n const price = await this.getPrice(query);\n if (!price) return [];\n return [\n {\n id: toBinancePair(price.symbol),\n name: price.symbol,\n symbol: price.symbol,\n source: this.name,\n },\n ];\n }\n\n async getPrice(symbol: string): Promise<PriceData | null> {\n try {\n const pair = toBinancePair(symbol);\n const res = await fetch(\n `${this.baseUrl}/tickers?category=spot&symbol=${encodeURIComponent(pair)}`\n );\n if (!res.ok) return null;\n const data = await res.json();\n const item = data.result?.list?.[0];\n if (!item?.lastPrice) return null;\n\n return {\n symbol: fromBinancePair(pair),\n priceUsd: parseFloat(item.lastPrice) || 0,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n\n async getTokenInfo(symbol: string): Promise<TokenInfo | null> {\n try {\n const pair = toBinancePair(symbol);\n const res = await fetch(\n `${this.baseUrl}/tickers?category=spot&symbol=${encodeURIComponent(pair)}`\n );\n if (!res.ok) return null;\n const data = await res.json();\n const item = data.result?.list?.[0];\n if (!item?.lastPrice) return null;\n\n const base = fromBinancePair(pair);\n return {\n name: base,\n symbol: base,\n priceUsd: parseFloat(item.lastPrice) || 0,\n volume24h: finiteOrUndefined(item.turnover24h),\n priceChangePercentage24h: (() => {\n const pct = finiteOrUndefined(item.price24hPcnt);\n return pct === undefined ? undefined : pct * 100;\n })(),\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n}\n","import { ICryptoProvider, PriceData, SearchResult, TokenInfo } from '../types.js';\nimport { finiteOrUndefined } from '../utils.js';\n\n/**\n * Gate.io public spot API (no API key).\n * https://api.gateio.ws/api/v4/\n */\nexport class GateIoProvider implements ICryptoProvider {\n name = 'Gate.io';\n addressBased = false;\n private baseUrl = 'https://api.gateio.ws/api/v4';\n\n private toPair(symbol: string): string {\n const upper = symbol.toUpperCase().trim();\n if (upper.includes('_')) return upper;\n // Only strip USDT — bare \"USD\" would break TUSD/GUSD tickers\n if (upper.endsWith('USDT') && upper.length > 4) {\n return `${upper.slice(0, -4)}_USDT`;\n }\n return `${upper}_USDT`;\n }\n\n private baseAsset(pair: string): string {\n return pair.split('_')[0] || pair;\n }\n\n async search(query: string): Promise<SearchResult[]> {\n const price = await this.getPrice(query);\n if (!price) return [];\n return [\n {\n id: this.toPair(price.symbol),\n name: price.symbol,\n symbol: price.symbol,\n source: this.name,\n },\n ];\n }\n\n async getPrice(symbol: string): Promise<PriceData | null> {\n try {\n const pair = this.toPair(symbol);\n const res = await fetch(\n `${this.baseUrl}/spot/tickers?currency_pair=${encodeURIComponent(pair)}`\n );\n if (!res.ok) return null;\n const data = await res.json();\n const item = Array.isArray(data) ? data[0] : null;\n if (!item?.last) return null;\n\n return {\n symbol: this.baseAsset(pair),\n priceUsd: parseFloat(item.last) || 0,\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n\n async getTokenInfo(symbol: string): Promise<TokenInfo | null> {\n try {\n const pair = this.toPair(symbol);\n const res = await fetch(\n `${this.baseUrl}/spot/tickers?currency_pair=${encodeURIComponent(pair)}`\n );\n if (!res.ok) return null;\n const data = await res.json();\n const item = Array.isArray(data) ? data[0] : null;\n if (!item?.last) return null;\n\n const base = this.baseAsset(pair);\n return {\n name: base,\n symbol: base,\n priceUsd: parseFloat(item.last) || 0,\n volume24h: finiteOrUndefined(item.quote_volume),\n priceChangePercentage24h: finiteOrUndefined(item.change_percentage),\n source: this.name,\n lastUpdated: Date.now(),\n };\n } catch {\n return null;\n }\n }\n}\n","import {\r\n ChartData,\r\n GasData,\r\n GlobalMarketData,\r\n ICryptoProvider,\r\n PriceData,\r\n SearchResult,\r\n SentimentData,\r\n TokenInfo,\r\n TrendingCoin,\r\n TopCoin,\r\n} from './types.js';\r\nimport { CoinGeckoProvider } from './providers/coingecko.js';\r\nimport { DexScreenerProvider } from './providers/dexscreener.js';\r\nimport { GeckoTerminalProvider } from './providers/geckoterminal.js';\r\nimport { BinanceProvider } from './providers/binance.js';\r\nimport { CoinpaprikaProvider } from './providers/coinpaprika.js';\r\nimport { CoinCapProvider } from './providers/coincap.js';\r\nimport { CryptoCompareProvider } from './providers/cryptocompare.js';\r\nimport { CoinMarketCapProvider } from './providers/coinmarketcap.js';\r\nimport { CoinLoreProvider } from './providers/coinlore.js';\r\nimport { CoinbaseProvider } from './providers/coinbase.js';\r\nimport { KrakenProvider } from './providers/kraken.js';\r\nimport { KuCoinProvider } from './providers/kucoin.js';\r\nimport { BybitProvider } from './providers/bybit.js';\r\nimport { GateIoProvider } from './providers/gateio.js';\r\nimport { defaultDexNetwork, isContractAddress } from './utils.js';\r\n\r\nexport interface CrypullOptions {\r\n providers?: ICryptoProvider[];\r\n}\r\n\r\nfunction createDefaultProviders(): ICryptoProvider[] {\r\n // Order matters: price() walks symbol providers sequentially (fast CEX first)\r\n return [\r\n new BinanceProvider(),\r\n new BybitProvider(),\r\n new KuCoinProvider(),\r\n new GateIoProvider(),\r\n new CoinbaseProvider(),\r\n new KrakenProvider(),\r\n new CoinCapProvider(),\r\n new CoinMarketCapProvider(),\r\n new CoinGeckoProvider(),\r\n new CoinpaprikaProvider(),\r\n new CoinLoreProvider(),\r\n new CryptoCompareProvider(),\r\n new DexScreenerProvider(),\r\n new GeckoTerminalProvider(),\r\n ];\r\n}\r\n\r\nexport class Crypull {\r\n public providers: ICryptoProvider[];\r\n\r\n constructor(options?: CrypullOptions) {\r\n this.providers = options?.providers?.length\r\n ? options.providers\r\n : createDefaultProviders();\r\n }\r\n\r\n private symbolProviders(): ICryptoProvider[] {\r\n return this.providers.filter((p) => !p.addressBased);\r\n }\r\n\r\n private addressProviders(): ICryptoProvider[] {\r\n return this.providers.filter((p) => p.addressBased);\r\n }\r\n\r\n private coinGecko(): CoinGeckoProvider | undefined {\r\n return this.providers.find((p) => p instanceof CoinGeckoProvider) as\r\n | CoinGeckoProvider\r\n | undefined;\r\n }\r\n\r\n /**\r\n * Search for a token or coin across symbol + DEX providers in parallel.\r\n */\r\n async search(query: string): Promise<SearchResult[]> {\r\n const q = query.trim();\r\n if (!q) return [];\r\n\r\n const results = await Promise.allSettled(\r\n this.providers.map((p) => p.search(q))\r\n );\r\n\r\n const combined: SearchResult[] = [];\r\n for (const res of results) {\r\n if (res.status === 'fulfilled' && res.value.length) {\r\n combined.push(...res.value);\r\n }\r\n }\r\n\r\n // Deduplicate by stable identity (id+source, or symbol+network+source)\r\n const seen = new Set<string>();\r\n return combined.filter((item) => {\r\n const key = item.id\r\n ? `${item.source}:${item.id}`\r\n : `${item.symbol}:${item.network ?? ''}:${item.source}`;\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\r\n }\r\n\r\n /**\r\n * Get the current price of a cryptocurrency.\r\n * @param query Symbol (e.g. 'BTC') or contract address\r\n * @param network Optional network for DEX addresses (e.g. 'eth', 'bsc', 'solana')\r\n */\r\n async price(query: string, network?: string): Promise<PriceData | null> {\r\n const q = query.trim();\r\n if (!q) return null;\r\n\r\n if (isContractAddress(q)) {\r\n for (const provider of this.addressProviders()) {\r\n const net =\r\n network ??\r\n (provider instanceof GeckoTerminalProvider\r\n ? defaultDexNetwork(q)\r\n : undefined);\r\n const res = await provider.getPrice(q, net);\r\n if (res) return res;\r\n }\r\n return null;\r\n }\r\n\r\n for (const provider of this.symbolProviders()) {\r\n const res = await provider.getPrice(q);\r\n if (res) return res;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Get detailed token info (market cap, volume, liquidity, etc.)\r\n * @param query Symbol (e.g. 'BTC') or contract address\r\n * @param network Optional network for DEX addresses\r\n */\r\n async info(query: string, network?: string): Promise<TokenInfo | null> {\r\n const q = query.trim();\r\n if (!q) return null;\r\n\r\n if (isContractAddress(q)) {\r\n for (const provider of this.addressProviders()) {\r\n const net =\r\n network ??\r\n (provider instanceof GeckoTerminalProvider\r\n ? defaultDexNetwork(q)\r\n : undefined);\r\n const res = await provider.getTokenInfo(q, net);\r\n if (res) return res;\r\n }\r\n return null;\r\n }\r\n\r\n // Prefer richer info sources first when using defaults\r\n const preferred = [\r\n 'CoinGecko',\r\n 'CoinMarketCap',\r\n 'Coinpaprika',\r\n 'CoinLore',\r\n 'CoinCap',\r\n 'Binance',\r\n 'Bybit',\r\n 'KuCoin',\r\n 'Gate.io',\r\n 'Kraken',\r\n 'Coinbase',\r\n 'CryptoCompare',\r\n ];\r\n const providers = [...this.symbolProviders()].sort((a, b) => {\r\n const ai = preferred.indexOf(a.name);\r\n const bi = preferred.indexOf(b.name);\r\n return (ai === -1 ? 99 : ai) - (bi === -1 ? 99 : bi);\r\n });\r\n\r\n for (const provider of providers) {\r\n const res = await provider.getTokenInfo(q);\r\n if (res) return res;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Get global market data\r\n */\r\n async market(): Promise<GlobalMarketData | null> {\r\n const cg = this.coinGecko();\r\n return cg ? cg.getGlobalMarket() : null;\r\n }\r\n\r\n /**\r\n * Get trending coins\r\n */\r\n async trending(): Promise<TrendingCoin[]> {\r\n const cg = this.coinGecko();\r\n if (cg) return cg.getTrending();\r\n return [];\r\n }\r\n\r\n /**\r\n * Get top 50 coins by market cap\r\n */\r\n async top(): Promise<TopCoin[]> {\r\n const cg = this.coinGecko();\r\n if (cg) return cg.getTop(50);\r\n return [];\r\n }\r\n\r\n /**\r\n * Get fear and greed index\r\n */\r\n async sentiment(): Promise<SentimentData | null> {\r\n try {\r\n const res = await fetch('https://api.alternative.me/fng/?limit=1');\r\n if (!res.ok) return null;\r\n const data = await res.json();\r\n const item = data.data?.[0];\r\n if (!item) return null;\r\n\r\n return {\r\n value: parseInt(item.value, 10),\r\n classification: item.value_classification,\r\n lastUpdated: parseInt(item.timestamp, 10) * 1000,\r\n };\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get current ethereum gas prices (in Gwei)\r\n */\r\n async gas(): Promise<GasData | null> {\r\n try {\r\n const res = await fetch(\r\n 'https://api.etherscan.io/v2/api?chainid=1&module=gastracker&action=gasoracle'\r\n );\r\n if (!res.ok) return null;\r\n const data = await res.json();\r\n if (data.status !== '1' || !data.result) return null;\r\n\r\n return {\r\n network: 'Ethereum',\r\n low: parseFloat(data.result.SafeGasPrice),\r\n average: parseFloat(data.result.ProposeGasPrice),\r\n high: parseFloat(data.result.FastGasPrice),\r\n baseFee: parseFloat(data.result.suggestBaseFee),\r\n };\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get historical chart data for a coin\r\n * @param query Coin symbol or CoinGecko ID\r\n * @param days Number of days (e.g. 1, 7, 30)\r\n */\r\n async chart(query: string, days: number = 7): Promise<ChartData | null> {\r\n const cg = this.coinGecko();\r\n if (!cg) return null;\r\n return cg.getChart(query.trim(), days);\r\n }\r\n}\r\n","export * from './types.js';\nexport * from './Crypull.js';\nexport * from './utils.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';\nexport * from './providers/coinmarketcap.js';\nexport * from './providers/coinlore.js';\nexport * from './providers/coinbase.js';\nexport * from './providers/kraken.js';\nexport * from './providers/kucoin.js';\nexport * from './providers/bybit.js';\nexport * from './providers/gateio.js';\n\nimport { Crypull } from './Crypull.js';\n\n/** Default shared instance for quick usage */\nexport const crypull = new Crypull();\n"]}
package/package.json CHANGED
@@ -1,13 +1,10 @@
1
1
  {
2
2
  "name": "crypull",
3
- "version": "1.0.2",
4
- "description": "All-in-one Node.js package to fetch cryptocurrency prices and token info from CoinGecko, GeckoTerminal, Dexscreener, and Binance.",
3
+ "version": "1.0.3",
4
+ "description": "All-in-one Node.js package to fetch cryptocurrency prices and token info from multiple free CEX/DEX APIs.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
8
- "bin": {
9
- "crypull": "dist/cli.js"
10
- },
11
8
  "exports": {
12
9
  ".": {
13
10
  "types": "./dist/index.d.ts",
@@ -15,6 +12,9 @@
15
12
  "require": "./dist/index.js"
16
13
  }
17
14
  },
15
+ "files": [
16
+ "dist"
17
+ ],
18
18
  "scripts": {
19
19
  "build": "tsup",
20
20
  "dev": "tsx examples/basic.ts",
@@ -24,21 +24,27 @@
24
24
  "crypto",
25
25
  "price",
26
26
  "coingecko",
27
- "geckoterminal",
28
- "dexscreener",
27
+ "coinmarketcap",
29
28
  "binance",
29
+ "bybit",
30
+ "kucoin",
31
+ "kraken",
32
+ "coinbase",
33
+ "dexscreener",
34
+ "geckoterminal",
35
+ "coinlore",
30
36
  "token",
31
37
  "defi",
32
38
  "api"
33
39
  ],
34
40
  "repository": {
35
41
  "type": "git",
36
- "url": "https://github.com/Foisalislambd/crypull.git"
42
+ "url": "https://github.com/Foisalislambd/crypull.git",
43
+ "directory": "packages/crypull"
37
44
  },
38
45
  "author": "Md Foisal Islam <https://github.com/Foisalislambd>",
39
46
  "license": "MIT",
40
47
  "devDependencies": {
41
- "@types/asciichart": "^1.5.8",
42
48
  "@types/node": "^20.19.33",
43
49
  "tsup": "^8.5.1",
44
50
  "tsx": "^4.21.0",
@@ -47,11 +53,5 @@
47
53
  },
48
54
  "engines": {
49
55
  "node": ">=18.0.0"
50
- },
51
- "dependencies": {
52
- "@clack/prompts": "^1.0.1",
53
- "asciichart": "^1.5.25",
54
- "commander": "^14.0.3",
55
- "picocolors": "^1.1.1"
56
56
  }
57
57
  }