coingecko-pro 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/cache.ts","../src/utils/rate-limiter.ts","../src/utils/helpers.ts","../src/errors.ts","../src/client.ts","../src/endpoints/coins.ts","../src/endpoints/exchanges.ts","../src/endpoints/derivatives.ts","../src/endpoints/nfts.ts","../src/endpoints/onchain.ts","../src/endpoints/global.ts","../src/endpoints/treasury.ts","../src/endpoints/meta.ts","../src/index.ts"],"names":["elapsed"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module cache\n * In-memory TTL cache backed by a Map.\n * Each entry stores the value alongside an expiry timestamp; reads that\n * exceed the expiry return `undefined` and are lazily evicted.\n */\n\ninterface CacheEntry<T> {\n value: T;\n expiresAt: number;\n}\n\n/**\n * A simple in-memory key/value cache with per-entry time-to-live support.\n *\n * @template T - The type of values stored in the cache.\n *\n * @example\n * ```ts\n * const cache = new TTLCache<string>(30_000);\n * cache.set('key', 'value');\n * cache.get('key'); // 'value'\n * ```\n */\nexport class TTLCache<T = unknown> {\n private readonly store = new Map<string, CacheEntry<T>>();\n private readonly defaultTtl: number;\n\n /**\n * @param defaultTtl - Default time-to-live in milliseconds for new entries.\n */\n constructor(defaultTtl: number) {\n this.defaultTtl = defaultTtl;\n }\n\n /**\n * Retrieves a value from the cache.\n * Returns `undefined` if the key does not exist or has expired.\n *\n * @param key - Cache key.\n * @returns The cached value, or `undefined` if missing/expired.\n */\n get(key: string): T | undefined {\n const entry = this.store.get(key);\n if (entry === undefined) return undefined;\n\n if (Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return undefined;\n }\n\n return entry.value;\n }\n\n /**\n * Stores a value in the cache with a TTL.\n *\n * @param key - Cache key.\n * @param value - Value to store.\n * @param ttl - Optional TTL in milliseconds. Falls back to the instance default.\n */\n set(key: string, value: T, ttl?: number): void {\n const expiresAt = Date.now() + (ttl ?? this.defaultTtl);\n this.store.set(key, { value, expiresAt });\n }\n\n /**\n * Removes a single entry from the cache.\n *\n * @param key - Cache key to remove.\n * @returns `true` if the key existed, `false` otherwise.\n */\n delete(key: string): boolean {\n return this.store.delete(key);\n }\n\n /**\n * Removes all entries from the cache.\n */\n clear(): void {\n this.store.clear();\n }\n\n /**\n * Returns the number of entries currently in the cache, including expired\n * entries that have not yet been lazily evicted.\n */\n get size(): number {\n return this.store.size;\n }\n}\n","/**\n * @module rate-limiter\n * Token-bucket rate limiter that limits the number of requests per minute.\n *\n * Tokens refill continuously over time rather than in discrete one-minute\n * windows, which smooths traffic and avoids thundering-herd resets.\n */\n\n/**\n * Token-bucket rate limiter.\n *\n * Callers `await acquire()` before sending a request. If tokens are\n * available the call resolves immediately; otherwise it waits until the next\n * token becomes available.\n *\n * @example\n * ```ts\n * const limiter = new RateLimiter(500); // 500 req/min\n * await limiter.acquire();\n * // safe to fire request now\n * ```\n */\nexport class RateLimiter {\n private readonly maxTokens: number;\n /** Milliseconds between individual token refills. */\n private readonly refillIntervalMs: number;\n private tokens: number;\n private lastRefillTime: number;\n\n /**\n * @param maxPerMinute - Maximum number of requests allowed per minute.\n */\n constructor(maxPerMinute: number) {\n this.maxTokens = maxPerMinute;\n this.refillIntervalMs = 60_000 / maxPerMinute;\n this.tokens = maxPerMinute;\n this.lastRefillTime = Date.now();\n }\n\n /**\n * Refills tokens based on elapsed time since the last refill.\n */\n private refill(): void {\n const now = Date.now();\n const elapsed = now - this.lastRefillTime;\n const tokensToAdd = Math.floor(elapsed / this.refillIntervalMs);\n\n if (tokensToAdd > 0) {\n this.tokens = Math.min(this.maxTokens, this.tokens + tokensToAdd);\n this.lastRefillTime += tokensToAdd * this.refillIntervalMs;\n }\n }\n\n /**\n * Acquires a single token, waiting asynchronously if none are available.\n *\n * When the bucket is empty the method calculates exactly how long until the\n * next token is available and waits that duration before retrying, avoiding\n * busy-polling.\n *\n * @returns A promise that resolves when a token has been consumed.\n */\n async acquire(): Promise<void> {\n this.refill();\n\n if (this.tokens > 0) {\n this.tokens -= 1;\n return;\n }\n\n // Calculate how long until the next token arrives.\n const waitMs = this.refillIntervalMs - (Date.now() - this.lastRefillTime);\n await new Promise<void>((resolve) => setTimeout(resolve, Math.max(0, waitMs)));\n return this.acquire();\n }\n}\n","/**\n * @module helpers\n * URL-building utilities used by the HTTP client.\n */\n\n/**\n * Joins arrays into a comma-separated string, and passes scalar values\n * through unchanged.\n *\n * Useful for CoinGecko parameters that accept either a single value or a\n * comma-delimited list (e.g. `ids=bitcoin,ethereum`).\n *\n * @param value - A string, number, boolean, or an array of those types.\n * @returns A string suitable for use as a query-parameter value.\n *\n * @example\n * ```ts\n * formatArrayParam(['bitcoin', 'ethereum']); // 'bitcoin,ethereum'\n * formatArrayParam('bitcoin'); // 'bitcoin'\n * formatArrayParam(42); // '42'\n * ```\n */\nexport function formatArrayParam(value: string | number | boolean | Array<string | number | boolean>): string {\n if (Array.isArray(value)) {\n return value.join(',');\n }\n return String(value);\n}\n\n/**\n * Builds a full URL from a base URL, a path segment, and an optional params\n * object.\n *\n * - `undefined` and `null` parameter values are stripped.\n * - Array values are joined with commas via {@link formatArrayParam}.\n * - Duplicate slashes at the base/path boundary are normalised away.\n *\n * @param base - Base URL (e.g. `https://pro-api.coingecko.com/api/v3`).\n * @param path - Endpoint path (e.g. `/coins/markets`).\n * @param params - Query parameters. `undefined`/`null` values are omitted.\n * @returns The fully-formed URL string.\n *\n * @example\n * ```ts\n * buildUrl('https://api.coingecko.com/api/v3', '/coins/markets', {\n * vs_currency: 'usd',\n * ids: ['bitcoin', 'ethereum'],\n * page: undefined,\n * });\n * // 'https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids=bitcoin%2Cethereum'\n * ```\n */\nexport function buildUrl(\n base: string,\n path: string,\n params?: Record<string, unknown>,\n): string {\n // Normalise the boundary between base and path.\n const normalised = base.replace(/\\/+$/, '') + '/' + path.replace(/^\\/+/, '');\n const url = new URL(normalised);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, formatArrayParam(value as string | number | boolean | Array<string | number | boolean>));\n }\n }\n\n return url.toString();\n}\n","/**\n * @module errors\n * Custom error types for the CoinGecko SDK.\n */\n\n/**\n * Thrown whenever the CoinGecko API returns a non-2xx HTTP status code, or\n * when a network-level failure occurs during a request.\n *\n * @example\n * ```ts\n * try {\n * await client.get('/coins/does-not-exist');\n * } catch (err) {\n * if (err instanceof CoinGeckoError) {\n * console.error(err.status, err.url, err.data);\n * }\n * }\n * ```\n */\nexport class CoinGeckoError extends Error {\n /**\n * The HTTP status code returned by the API, or `0` for network-level\n * failures (e.g. timeout, DNS error).\n */\n readonly status: number;\n\n /**\n * The full URL that was requested when the error occurred.\n */\n readonly url: string;\n\n /**\n * The response body parsed as JSON if possible, otherwise the raw text.\n * `undefined` when the error is network-level and no response was received.\n */\n readonly data: unknown;\n\n /**\n * @param message - Human-readable error description.\n * @param status - HTTP status code (use `0` for network errors).\n * @param url - URL that triggered the error.\n * @param data - Parsed response body, if available.\n */\n constructor(message: string, status: number, url: string, data?: unknown) {\n super(message);\n this.name = 'CoinGeckoError';\n this.status = status;\n this.url = url;\n this.data = data;\n\n // Restore the prototype chain so `instanceof` works correctly after\n // transpilation (TypeScript + older targets).\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","/**\n * @module client\n * Main HTTP client for the CoinGecko REST API.\n *\n * Features:\n * - Automatic base URL selection (Pro vs Free tier)\n * - In-memory TTL cache\n * - Token-bucket rate limiting\n * - Exponential-backoff retry on 429 / 503\n * - AbortController request timeout\n * - Lifecycle hooks (onRequest, onResponse, onError)\n */\n\nimport { TTLCache } from './utils/cache.js';\nimport { RateLimiter } from './utils/rate-limiter.js';\nimport { buildUrl } from './utils/helpers.js';\nimport { CoinGeckoError } from './errors.js';\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\n/**\n * Configuration options accepted by {@link CoinGeckoClient}.\n */\nexport interface CoinGeckoClientConfig {\n /**\n * CoinGecko Pro API key.\n * When present the client targets `pro-api.coingecko.com` and adds the\n * `x-cg-pro-api-key` header.\n */\n apiKey?: string;\n\n /**\n * Override the base URL entirely (useful for testing or proxies).\n * When omitted the base URL is derived from `apiKey`.\n */\n baseUrl?: string;\n\n /**\n * Default response cache TTL in milliseconds.\n * @default 30_000\n */\n cacheTtl?: number;\n\n /**\n * Maximum number of retry attempts for transient errors (429, 503).\n * @default 3\n */\n maxRetries?: number;\n\n /**\n * Base delay in milliseconds for the first retry. Subsequent retries use\n * exponential backoff: `retryDelay * 2^attempt`.\n * @default 1000\n */\n retryDelay?: number;\n\n /**\n * Maximum requests per minute enforced by the built-in rate limiter.\n * Defaults to `500` when an `apiKey` is present (Pro tier), otherwise `30`.\n */\n rateLimit?: number;\n\n /**\n * Request timeout in milliseconds. Requests that exceed this duration are\n * aborted and throw a {@link CoinGeckoError} with `status: 0`.\n * @default 15_000\n */\n timeout?: number;\n\n /**\n * Called immediately before every outgoing request with the resolved URL.\n */\n onRequest?: (url: string) => void;\n\n /**\n * Called after every completed request with the URL, HTTP status, and\n * elapsed time in milliseconds.\n */\n onResponse?: (url: string, status: number, ms: number) => void;\n\n /**\n * Called whenever a request fails (after all retries are exhausted).\n */\n onError?: (url: string, error: Error) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst PRO_BASE_URL = 'https://pro-api.coingecko.com/api/v3';\nconst FREE_BASE_URL = 'https://api.coingecko.com/api/v3';\n\nconst DEFAULT_CACHE_TTL = 30_000;\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_DELAY = 1_000;\nconst DEFAULT_TIMEOUT = 15_000;\nconst DEFAULT_RATE_LIMIT_PRO = 500;\nconst DEFAULT_RATE_LIMIT_FREE = 30;\n\n/** HTTP status codes that should trigger a retry. */\nconst RETRYABLE_STATUSES = new Set([429, 503]);\n\n// ---------------------------------------------------------------------------\n// Client\n// ---------------------------------------------------------------------------\n\n/**\n * HTTP client for the CoinGecko REST API.\n *\n * Instantiate once and reuse across your application. The client is\n * safe to call concurrently; each call is independently rate-limited and\n * cached.\n *\n * @example\n * ```ts\n * // Pro tier\n * const client = new CoinGeckoClient({ apiKey: process.env.CG_KEY });\n * const data = await client.get('/coins/markets', { vs_currency: 'usd' });\n *\n * // Free tier\n * const client = new CoinGeckoClient();\n * ```\n */\nexport class CoinGeckoClient {\n private readonly baseUrl: string;\n private readonly apiKey: string | undefined;\n private readonly cacheTtl: number;\n private readonly maxRetries: number;\n private readonly retryDelay: number;\n private readonly timeout: number;\n private readonly onRequest: ((url: string) => void) | undefined;\n private readonly onResponse: ((url: string, status: number, ms: number) => void) | undefined;\n private readonly onError: ((url: string, error: Error) => void) | undefined;\n\n private readonly cache: TTLCache<unknown>;\n private readonly rateLimiter: RateLimiter;\n\n /**\n * @param config - Optional configuration. See {@link CoinGeckoClientConfig}.\n */\n constructor(config?: CoinGeckoClientConfig) {\n this.apiKey = config?.apiKey;\n this.baseUrl = config?.baseUrl ?? (this.apiKey ? PRO_BASE_URL : FREE_BASE_URL);\n this.cacheTtl = config?.cacheTtl ?? DEFAULT_CACHE_TTL;\n this.maxRetries = config?.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.retryDelay = config?.retryDelay ?? DEFAULT_RETRY_DELAY;\n this.timeout = config?.timeout ?? DEFAULT_TIMEOUT;\n this.onRequest = config?.onRequest;\n this.onResponse = config?.onResponse;\n this.onError = config?.onError;\n\n const rateLimit = config?.rateLimit ?? (this.apiKey ? DEFAULT_RATE_LIMIT_PRO : DEFAULT_RATE_LIMIT_FREE);\n this.cache = new TTLCache<unknown>(this.cacheTtl);\n this.rateLimiter = new RateLimiter(rateLimit);\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n /**\n * Performs a GET request to the given API path.\n *\n * Results are cached by default. Pass `options.cacheTtl = 0` to bypass\n * caching for a specific call.\n *\n * @template T - Expected shape of the response body.\n * @param path - API endpoint path, e.g. `/coins/markets`.\n * @param params - Query parameters. `undefined`/`null` values are omitted.\n * @param options - Per-call overrides.\n * @returns Parsed JSON response body cast to `T`.\n * @throws {@link CoinGeckoError} on non-2xx responses or network failures.\n */\n async get<T>(\n path: string,\n params?: Record<string, unknown>,\n options?: { cacheTtl?: number },\n ): Promise<T> {\n const url = buildUrl(this.baseUrl, path, params);\n const ttl = options?.cacheTtl ?? this.cacheTtl;\n\n // Cache check — skip when ttl is 0.\n if (ttl > 0) {\n const cached = this.cache.get(url);\n if (cached !== undefined) {\n return cached as T;\n }\n }\n\n // Rate limit before the first (and every retry) attempt.\n await this.rateLimiter.acquire();\n\n this.onRequest?.(url);\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n // Exponential backoff delay for retries (not the first attempt).\n if (attempt > 0) {\n const backoff = this.retryDelay * Math.pow(2, attempt - 1);\n await new Promise<void>((resolve) => setTimeout(resolve, backoff));\n // Re-acquire a rate-limit token for each retry.\n await this.rateLimiter.acquire();\n }\n\n const startMs = Date.now();\n\n try {\n const result = await this.fetchWithTimeout<T>(url, startMs, ttl);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n lastError = error;\n\n // Only retry on retryable HTTP errors or timeout.\n if (\n err instanceof CoinGeckoError &&\n !RETRYABLE_STATUSES.has(err.status) &&\n err.status !== 0\n ) {\n // Non-retryable HTTP error — bail immediately.\n this.onError?.(url, error);\n throw err;\n }\n\n // If this was the last attempt, stop retrying.\n if (attempt === this.maxRetries) {\n break;\n }\n }\n }\n\n // All retries exhausted.\n const finalError = lastError ?? new CoinGeckoError('Unknown error', 0, url);\n this.onError?.(url, finalError);\n throw finalError;\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n /**\n * Performs a single fetch with an AbortController timeout, then handles\n * caching and lifecycle hooks.\n */\n private async fetchWithTimeout<T>(\n url: string,\n startMs: number,\n ttl: number,\n ): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n let response: Response;\n\n try {\n const headers: Record<string, string> = {\n 'Accept': 'application/json',\n };\n\n if (this.apiKey) {\n headers['x-cg-pro-api-key'] = this.apiKey;\n }\n\n response = await fetch(url, {\n method: 'GET',\n headers,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n const elapsed = Date.now() - startMs;\n\n if (err instanceof Error && err.name === 'AbortError') {\n const timeoutError = new CoinGeckoError(\n `Request timed out after ${this.timeout}ms`,\n 0,\n url,\n );\n this.onError?.(url, timeoutError);\n throw timeoutError;\n }\n\n const networkError = new CoinGeckoError(\n err instanceof Error ? err.message : String(err),\n 0,\n url,\n );\n this.onResponse?.(url, 0, elapsed);\n throw networkError;\n }\n\n clearTimeout(timer);\n const elapsed = Date.now() - startMs;\n this.onResponse?.(url, response.status, elapsed);\n\n if (!response.ok) {\n // Attempt to parse the error body for a useful message.\n let data: unknown;\n let message = `HTTP ${response.status}`;\n\n try {\n data = await response.json();\n if (\n data !== null &&\n typeof data === 'object' &&\n 'error' in data &&\n typeof (data as Record<string, unknown>)['error'] === 'string'\n ) {\n message = (data as Record<string, unknown>)['error'] as string;\n }\n } catch {\n try {\n data = await response.text();\n } catch {\n // Ignore secondary errors reading the body.\n }\n }\n\n throw new CoinGeckoError(message, response.status, url, data);\n }\n\n const json = (await response.json()) as T;\n\n // Store in cache (only when TTL > 0).\n if (ttl > 0) {\n this.cache.set(url, json, ttl);\n }\n\n return json;\n }\n}\n","/**\n * @module endpoints/coins\n * CoinGecko coin-related endpoints.\n *\n * Covers simple price, coins list, market data, coin detail, tickers,\n * historical charts, OHLC, supply charts, contract-address lookups, and\n * categories.\n */\n\nimport { CoinGeckoClient } from '../client.js';\nimport type {\n // Simple price\n SimplePriceParams,\n SimplePriceResponse,\n SimpleTokenPriceParams,\n // Coins list\n CoinsListParams,\n CoinListEntry,\n // Top gainers / losers\n TopGainersLosersParams,\n TopMoversResponse,\n // New coins\n NewCoin,\n // Coins markets\n CoinsMarketsParams,\n MarketCoin,\n // Coin detail\n CoinDetailParams,\n CoinDetail,\n // Tickers\n CoinTickerParams,\n CoinTickersResponse,\n // History\n CoinHistoryParams,\n CoinHistoricalData,\n // Market chart\n MarketChartParams,\n MarketChartRangeParams,\n MarketChartResponse,\n // OHLC\n OhlcParams,\n OhlcRangeParams,\n OhlcDataPoint,\n // Supply charts\n SupplyChartParams,\n SupplyChartRangeParams,\n SupplyChartResponse,\n // Categories\n CategoriesParams,\n CategoryListEntry,\n Category,\n} from '../types/coins.js';\nimport type { MarketDataPoint } from '../types/common.js';\n\n/**\n * All coin-related CoinGecko API methods.\n *\n * Obtain an instance via the top-level SDK facade, e.g.:\n * ```ts\n * const sdk = new CoinGeckoSDK({ apiKey: '...' });\n * const prices = await sdk.coins.price({ ids: 'bitcoin', vs_currencies: 'usd' });\n * ```\n */\nexport class CoinsEndpoints {\n constructor(private readonly client: CoinGeckoClient) {}\n\n // -------------------------------------------------------------------------\n // Simple price\n // -------------------------------------------------------------------------\n\n /**\n * @description Get the current price of one or more coins in the requested\n * vs-currencies. Optionally include market cap, 24h volume, 24h change, and\n * last-updated timestamp in the response.\n *\n * @param params - Query parameters including required `ids` and\n * `vs_currencies` plus optional data flags.\n * @returns A map of coin ID → currency code → numeric value.\n *\n * @example\n * ```ts\n * const prices = await coins.price({\n * ids: 'bitcoin,ethereum',\n * vs_currencies: 'usd,eur',\n * include_market_cap: true,\n * });\n * // { bitcoin: { usd: 69840, usd_market_cap: 1.38e12 }, ethereum: { usd: 3700 } }\n * ```\n */\n async price(params: SimplePriceParams): Promise<SimplePriceResponse> {\n return this.client.get<SimplePriceResponse>('/simple/price', params as unknown as Record<string, unknown>);\n }\n\n /**\n * @description Get the current price of one or more ERC-20/token contract\n * addresses on a given asset platform (e.g. `ethereum`).\n *\n * @param platformId - Asset platform ID (e.g. `'ethereum'`, `'polygon-pos'`).\n * @param params - Query parameters including required `contract_addresses` and\n * `vs_currencies`.\n * @returns A map of contract address → currency code → numeric value.\n *\n * @remarks Requires Analyst+ plan for more than one address per request.\n *\n * @example\n * ```ts\n * const tokenPrices = await coins.tokenPrice('ethereum', {\n * contract_addresses: '0xdac17f958d2ee523a2206206994597c13d831ec7',\n * vs_currencies: 'usd',\n * });\n * ```\n */\n async tokenPrice(platformId: string, params: SimpleTokenPriceParams): Promise<SimplePriceResponse> {\n return this.client.get<SimplePriceResponse>(\n `/simple/token_price/${platformId}`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n /**\n * @description Get the full list of vs-currency codes supported by CoinGecko\n * (e.g. `'usd'`, `'eur'`, `'btc'`).\n *\n * @returns An array of currency code strings.\n *\n * @example\n * ```ts\n * const currencies = await coins.supportedVsCurrencies();\n * // ['btc', 'eth', 'usd', 'eur', ...]\n * ```\n */\n async supportedVsCurrencies(): Promise<string[]> {\n return this.client.get<string[]>('/simple/supported_vs_currencies');\n }\n\n // -------------------------------------------------------------------------\n // Coin list & markets\n // -------------------------------------------------------------------------\n\n /**\n * @description Get the full list of coins available on CoinGecko, including\n * their IDs, symbols, and names. Optionally include contract addresses per\n * platform.\n *\n * @param params - Optional query parameters.\n * @returns An array of minimal coin entries.\n *\n * @example\n * ```ts\n * const coins = await coins.list({ include_platform: true });\n * // [{ id: 'bitcoin', symbol: 'btc', name: 'Bitcoin', platforms: {} }, ...]\n * ```\n */\n async list(params?: CoinsListParams): Promise<CoinListEntry[]> {\n return this.client.get<CoinListEntry[]>('/coins/list', params as unknown as unknown as Record<string, unknown> | undefined);\n }\n\n /**\n * @description Get coin market data (price, market cap, volume, etc.) for\n * all or a filtered set of coins ordered by market cap.\n *\n * @param params - Query parameters including required `vs_currency`.\n * @returns An array of `MarketCoin` objects with full market statistics.\n *\n * @example\n * ```ts\n * const top10 = await coins.markets({ vs_currency: 'usd', per_page: 10 });\n * ```\n */\n async markets(params: CoinsMarketsParams): Promise<MarketCoin[]> {\n return this.client.get<MarketCoin[]>('/coins/markets', params as unknown as Record<string, unknown>);\n }\n\n /**\n * @description Get the top 30 gaining and top 30 losing coins over a given\n * time duration, filtered by the requested vs-currency.\n *\n * @param params - Optional query parameters including `vs_currency`,\n * `duration`, and `top_coins` filter.\n * @returns An object with `top_gainers` and `top_losers` arrays.\n *\n * @remarks Requires Analyst+ plan.\n *\n * @example\n * ```ts\n * const movers = await coins.topGainersLosers({ vs_currency: 'usd', duration: '24h' });\n * console.log(movers.top_gainers[0]);\n * ```\n */\n async topGainersLosers(params?: TopGainersLosersParams): Promise<TopMoversResponse> {\n return this.client.get<TopMoversResponse>(\n '/coins/top_gainers_losers',\n params as unknown as unknown as Record<string, unknown> | undefined,\n );\n }\n\n /**\n * @description Get a list of the 200 most recently listed coins on CoinGecko,\n * ordered by listing date descending.\n *\n * @returns An array of `NewCoin` entries with activation timestamps.\n *\n * @remarks Requires Analyst+ plan.\n *\n * @example\n * ```ts\n * const newCoins = await coins.listNew();\n * console.log(newCoins[0].activated_at);\n * ```\n */\n async listNew(): Promise<NewCoin[]> {\n return this.client.get<NewCoin[]>('/coins/list/new');\n }\n\n // -------------------------------------------------------------------------\n // Coin by ID\n // -------------------------------------------------------------------------\n\n /**\n * @description Get comprehensive data for a specific coin by its CoinGecko\n * ID, including market data, links, community stats, developer activity, and\n * more.\n *\n * @param id - CoinGecko coin ID (e.g. `'bitcoin'`).\n * @param params - Optional flags controlling which data blocks to include.\n * @returns A `CoinDetail` object with all available metadata.\n *\n * @example\n * ```ts\n * const bitcoin = await coins.getById('bitcoin', { market_data: true, tickers: false });\n * console.log(bitcoin.market_data?.current_price?.usd);\n * ```\n */\n async getById(id: string, params?: CoinDetailParams): Promise<CoinDetail> {\n return this.client.get<CoinDetail>(`/coins/${id}`, params as unknown as unknown as Record<string, unknown> | undefined);\n }\n\n /**\n * @description Get the exchange tickers for a specific coin, optionally\n * filtered by exchange.\n *\n * @param id - CoinGecko coin ID (e.g. `'bitcoin'`).\n * @param params - Optional pagination, exchange filter, and sort params.\n * @returns A `CoinTickersResponse` wrapping the coin name and ticker array.\n *\n * @example\n * ```ts\n * const { tickers } = await coins.tickers('bitcoin', { exchange_ids: 'binance' });\n * ```\n */\n async tickers(id: string, params?: CoinTickerParams): Promise<CoinTickersResponse> {\n return this.client.get<CoinTickersResponse>(\n `/coins/${id}/tickers`,\n params as unknown as unknown as Record<string, unknown> | undefined,\n );\n }\n\n /**\n * @description Get historical snapshot data for a coin on a specific past\n * date, including price, market cap, and volume.\n *\n * @param id - CoinGecko coin ID (e.g. `'bitcoin'`).\n * @param params - Query parameters including required `date` (`dd-mm-yyyy`).\n * @returns A `CoinHistoricalData` snapshot object.\n *\n * @example\n * ```ts\n * const snapshot = await coins.history('bitcoin', { date: '30-12-2022' });\n * console.log(snapshot.market_data?.current_price?.usd);\n * ```\n */\n async history(id: string, params: CoinHistoryParams): Promise<CoinHistoricalData> {\n return this.client.get<CoinHistoricalData>(`/coins/${id}/history`, params as unknown as Record<string, unknown>);\n }\n\n /**\n * @description Get historical market chart data (price, market cap, and\n * volume) for a coin over a given number of days. Data granularity is\n * automatically selected unless `interval` is specified.\n *\n * @param id - CoinGecko coin ID (e.g. `'ethereum'`).\n * @param params - Query parameters including required `vs_currency` and\n * `days`.\n * @returns A `MarketChartResponse` containing price, market cap, and volume\n * time series.\n *\n * @example\n * ```ts\n * const chart = await coins.marketChart('ethereum', { vs_currency: 'usd', days: 30 });\n * const [ts, price] = chart.prices[0];\n * ```\n */\n async marketChart(id: string, params: MarketChartParams): Promise<MarketChartResponse> {\n return this.client.get<MarketChartResponse>(\n `/coins/${id}/market_chart`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n /**\n * @description Get historical market chart data (price, market cap, and\n * volume) for a coin within a UNIX timestamp range.\n *\n * @param id - CoinGecko coin ID.\n * @param params - Query parameters including `vs_currency`, `from`, and `to`\n * UNIX timestamps (seconds).\n * @returns A `MarketChartResponse` containing price, market cap, and volume\n * time series.\n *\n * @example\n * ```ts\n * const chart = await coins.marketChartRange('bitcoin', {\n * vs_currency: 'usd',\n * from: 1640995200,\n * to: 1672531200,\n * });\n * ```\n */\n async marketChartRange(id: string, params: MarketChartRangeParams): Promise<MarketChartResponse> {\n return this.client.get<MarketChartResponse>(\n `/coins/${id}/market_chart/range`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n /**\n * @description Get OHLC (open, high, low, close) candlestick data for a coin\n * over a given number of days.\n *\n * @param id - CoinGecko coin ID.\n * @param params - Query parameters including required `vs_currency` and\n * `days`.\n * @returns An array of OHLC data points, each formatted as\n * `[timestamp_ms, open, high, low, close]`.\n *\n * @remarks Requires Analyst+ plan.\n *\n * @example\n * ```ts\n * const candles = await coins.ohlc('bitcoin', { vs_currency: 'usd', days: 7 });\n * const [ts, open, high, low, close] = candles[0];\n * ```\n */\n async ohlc(id: string, params: OhlcParams): Promise<OhlcDataPoint[]> {\n return this.client.get<OhlcDataPoint[]>(`/coins/${id}/ohlc`, params as unknown as Record<string, unknown>);\n }\n\n /**\n * @description Get OHLC (open, high, low, close) candlestick data for a coin\n * within a UNIX timestamp range.\n *\n * @param id - CoinGecko coin ID.\n * @param params - Query parameters including required `vs_currency`, `from`,\n * and `to` UNIX timestamps (seconds).\n * @returns An array of OHLC data points, each formatted as\n * `[timestamp_ms, open, high, low, close]`.\n *\n * @remarks Requires Analyst+ plan.\n *\n * @example\n * ```ts\n * const candles = await coins.ohlcRange('bitcoin', {\n * vs_currency: 'usd',\n * from: 1640995200,\n * to: 1672531200,\n * });\n * ```\n */\n async ohlcRange(id: string, params: OhlcRangeParams): Promise<OhlcDataPoint[]> {\n return this.client.get<OhlcDataPoint[]>(\n `/coins/${id}/ohlc/range`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n // -------------------------------------------------------------------------\n // Supply charts (Enterprise)\n // -------------------------------------------------------------------------\n\n /**\n * @description Get the historical circulating supply chart for a coin over a\n * given number of days.\n *\n * @param id - CoinGecko coin ID.\n * @param params - Query parameters including required `days`.\n * @returns An array of `[timestamp_ms, supply_value]` data points.\n *\n * @remarks Requires Enterprise plan.\n *\n * @example\n * ```ts\n * const supply = await coins.circulatingSupplyChart('bitcoin', { days: 365 });\n * const [ts, value] = supply[0];\n * ```\n */\n async circulatingSupplyChart(id: string, params: SupplyChartParams): Promise<MarketDataPoint[]> {\n return this.client.get<SupplyChartResponse>(\n `/coins/${id}/circulating_supply_chart`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n /**\n * @description Get the historical circulating supply chart for a coin within\n * a UNIX timestamp range.\n *\n * @param id - CoinGecko coin ID.\n * @param params - Query parameters including required `from` and `to` UNIX\n * timestamps (seconds).\n * @returns An array of `[timestamp_ms, supply_value]` data points.\n *\n * @remarks Requires Enterprise plan.\n *\n * @example\n * ```ts\n * const supply = await coins.circulatingSupplyChartRange('bitcoin', {\n * from: 1640995200,\n * to: 1672531200,\n * });\n * ```\n */\n async circulatingSupplyChartRange(id: string, params: SupplyChartRangeParams): Promise<MarketDataPoint[]> {\n return this.client.get<SupplyChartResponse>(\n `/coins/${id}/circulating_supply_chart/range`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n /**\n * @description Get the historical total supply chart for a coin over a given\n * number of days.\n *\n * @param id - CoinGecko coin ID.\n * @param params - Query parameters including required `days`.\n * @returns An array of `[timestamp_ms, supply_value]` data points.\n *\n * @remarks Requires Enterprise plan.\n *\n * @example\n * ```ts\n * const supply = await coins.totalSupplyChart('ethereum', { days: 90 });\n * ```\n */\n async totalSupplyChart(id: string, params: SupplyChartParams): Promise<MarketDataPoint[]> {\n return this.client.get<SupplyChartResponse>(\n `/coins/${id}/total_supply_chart`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n /**\n * @description Get the historical total supply chart for a coin within a\n * UNIX timestamp range.\n *\n * @param id - CoinGecko coin ID.\n * @param params - Query parameters including required `from` and `to` UNIX\n * timestamps (seconds).\n * @returns An array of `[timestamp_ms, supply_value]` data points.\n *\n * @remarks Requires Enterprise plan.\n *\n * @example\n * ```ts\n * const supply = await coins.totalSupplyChartRange('ethereum', {\n * from: 1640995200,\n * to: 1672531200,\n * });\n * ```\n */\n async totalSupplyChartRange(id: string, params: SupplyChartRangeParams): Promise<MarketDataPoint[]> {\n return this.client.get<SupplyChartResponse>(\n `/coins/${id}/total_supply_chart/range`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n // -------------------------------------------------------------------------\n // Contract address\n // -------------------------------------------------------------------------\n\n /**\n * @description Get full coin data for a token by its smart contract address\n * on a given asset platform.\n *\n * @param platformId - Asset platform ID (e.g. `'ethereum'`, `'binance-smart-chain'`).\n * @param contractAddress - Token contract address (e.g. `'0xdac17f…'`).\n * @returns A `CoinDetail` object equivalent to `/coins/{id}`.\n *\n * @example\n * ```ts\n * const usdt = await coins.getByContract(\n * 'ethereum',\n * '0xdac17f958d2ee523a2206206994597c13d831ec7',\n * );\n * console.log(usdt.name); // 'Tether'\n * ```\n */\n async getByContract(platformId: string, contractAddress: string): Promise<CoinDetail> {\n return this.client.get<CoinDetail>(`/coins/${platformId}/contract/${contractAddress}`);\n }\n\n /**\n * @description Get historical market chart data (price, market cap, volume)\n * for a token identified by its contract address on a given asset platform.\n *\n * @param platformId - Asset platform ID (e.g. `'ethereum'`).\n * @param contractAddress - Token contract address.\n * @param params - Query parameters including required `vs_currency` and\n * `days`.\n * @returns A `MarketChartResponse` with price, market cap, and volume time\n * series.\n *\n * @example\n * ```ts\n * const chart = await coins.contractMarketChart(\n * 'ethereum',\n * '0xdac17f958d2ee523a2206206994597c13d831ec7',\n * { vs_currency: 'usd', days: 30 },\n * );\n * ```\n */\n async contractMarketChart(\n platformId: string,\n contractAddress: string,\n params: MarketChartParams,\n ): Promise<MarketChartResponse> {\n return this.client.get<MarketChartResponse>(\n `/coins/${platformId}/contract/${contractAddress}/market_chart`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n /**\n * @description Get historical market chart data for a token identified by\n * its contract address, within a UNIX timestamp range.\n *\n * @param platformId - Asset platform ID (e.g. `'ethereum'`).\n * @param contractAddress - Token contract address.\n * @param params - Query parameters including required `vs_currency`, `from`,\n * and `to` UNIX timestamps (seconds).\n * @returns A `MarketChartResponse` with price, market cap, and volume time\n * series.\n *\n * @example\n * ```ts\n * const chart = await coins.contractMarketChartRange(\n * 'ethereum',\n * '0xdac17f958d2ee523a2206206994597c13d831ec7',\n * { vs_currency: 'usd', from: 1640995200, to: 1672531200 },\n * );\n * ```\n */\n async contractMarketChartRange(\n platformId: string,\n contractAddress: string,\n params: MarketChartRangeParams,\n ): Promise<MarketChartResponse> {\n return this.client.get<MarketChartResponse>(\n `/coins/${platformId}/contract/${contractAddress}/market_chart/range`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n // -------------------------------------------------------------------------\n // Categories\n // -------------------------------------------------------------------------\n\n /**\n * @description Get a flat list of all coin categories available on\n * CoinGecko, returning only the category ID and name.\n *\n * @returns An array of `CategoryListEntry` items with `category_id` and\n * `name`.\n *\n * @example\n * ```ts\n * const list = await coins.categoriesList();\n * // [{ category_id: 'decentralized-finance-defi', name: 'DeFi' }, ...]\n * ```\n */\n async categoriesList(): Promise<CategoryListEntry[]> {\n return this.client.get<CategoryListEntry[]>('/coins/categories/list');\n }\n\n /**\n * @description Get all coin categories with market data (market cap, 24h\n * change, volume, top coins), optionally sorted.\n *\n * @param params - Optional query parameters for sort order.\n * @returns An array of `Category` objects with market statistics.\n *\n * @example\n * ```ts\n * const categories = await coins.categories({ order: 'market_cap_desc' });\n * console.log(categories[0].name, categories[0].market_cap);\n * ```\n */\n async categories(params?: CategoriesParams): Promise<Category[]> {\n return this.client.get<Category[]>(\n '/coins/categories',\n params as unknown as unknown as Record<string, unknown> | undefined,\n );\n }\n}\n","/**\n * @module endpoints/exchanges\n * Endpoint methods for CoinGecko exchange-related API paths.\n *\n * Covers: /exchanges, /exchanges/list, /exchanges/{id},\n * /exchanges/{id}/tickers, /exchanges/{id}/volume_chart,\n * /exchanges/{id}/volume_chart/range (Analyst+).\n */\n\nimport type { CoinGeckoClient } from '../client.js';\nimport type {\n Exchange,\n ExchangeListEntry,\n ExchangeDetail,\n ExchangeTickersParams,\n ExchangeTickersResponse,\n VolumeChartParams,\n VolumeChartResponse,\n VolumeChartRangeParams,\n} from '../types/index.js';\n\n/**\n * Endpoint group for CoinGecko exchange APIs.\n *\n * Obtain an instance via the SDK's top-level entry point; do not\n * instantiate directly.\n *\n * @example\n * ```ts\n * const exchanges = new ExchangesEndpoints(client);\n * const all = await exchanges.list();\n * ```\n */\nexport class ExchangesEndpoints {\n constructor(private readonly client: CoinGeckoClient) {}\n\n // ---------------------------------------------------------------------------\n // /exchanges\n // ---------------------------------------------------------------------------\n\n /**\n * Returns a paginated list of all active exchanges with market data.\n *\n * @param params - Optional pagination parameters (`per_page`, `page`).\n * @returns Array of {@link Exchange} objects ordered by trust score rank.\n *\n * @example\n * ```ts\n * const page1 = await exchanges.list({ per_page: 50, page: 1 });\n * ```\n */\n async list(params?: { per_page?: number; page?: number }): Promise<Exchange[]> {\n return this.client.get<Exchange[]>('/exchanges', params as Record<string, unknown>);\n }\n\n // ---------------------------------------------------------------------------\n // /exchanges/list\n // ---------------------------------------------------------------------------\n\n /**\n * Returns a lightweight list of all exchange IDs and names.\n *\n * Use this endpoint to resolve exchange API IDs for subsequent calls\n * rather than fetching full exchange data.\n *\n * @returns Array of {@link ExchangeListEntry} objects (`id` + `name` only).\n *\n * @example\n * ```ts\n * const ids = await exchanges.listAll();\n * // [{ id: 'binance', name: 'Binance' }, ...]\n * ```\n */\n async listAll(): Promise<ExchangeListEntry[]> {\n return this.client.get<ExchangeListEntry[]>('/exchanges/list');\n }\n\n // ---------------------------------------------------------------------------\n // /exchanges/{id}\n // ---------------------------------------------------------------------------\n\n /**\n * Returns full details for a single exchange by its API ID.\n *\n * @param id - Exchange API ID (e.g. `\"binance\"`). Use {@link listAll} to\n * discover valid IDs.\n * @returns {@link ExchangeDetail} including social links, trust score, and\n * top 100 tickers.\n *\n * @example\n * ```ts\n * const binance = await exchanges.getById('binance');\n * console.log(binance.trust_score); // 10\n * ```\n */\n async getById(id: string): Promise<ExchangeDetail> {\n return this.client.get<ExchangeDetail>(`/exchanges/${encodeURIComponent(id)}`);\n }\n\n // ---------------------------------------------------------------------------\n // /exchanges/{id}/tickers\n // ---------------------------------------------------------------------------\n\n /**\n * Returns paginated tickers for a specific exchange.\n *\n * @param id - Exchange API ID (e.g. `\"binance\"`).\n * @param params - Optional filter/sort/pagination parameters.\n * @returns {@link ExchangeTickersResponse} containing the exchange name and\n * an array of tickers.\n *\n * @example\n * ```ts\n * const result = await exchanges.tickers('binance', {\n * coin_ids: 'bitcoin,ethereum',\n * order: 'trust_score_desc',\n * });\n * console.log(result.tickers.length);\n * ```\n */\n async tickers(id: string, params?: ExchangeTickersParams): Promise<ExchangeTickersResponse> {\n return this.client.get<ExchangeTickersResponse>(\n `/exchanges/${encodeURIComponent(id)}/tickers`,\n params as Record<string, unknown>,\n );\n }\n\n // ---------------------------------------------------------------------------\n // /exchanges/{id}/volume_chart\n // ---------------------------------------------------------------------------\n\n /**\n * Returns BTC-denominated volume chart data for a specific exchange.\n *\n * @param id - Exchange API ID (e.g. `\"binance\"`).\n * @param params - Required query parameters, including `days`.\n * @returns {@link VolumeChartResponse} — array of `[timestamp_ms, volume_btc]`\n * tuples. Volume is returned as a string to preserve precision.\n *\n * @example\n * ```ts\n * const chart = await exchanges.volumeChart('binance', { days: '30' });\n * // [[1711792200000, '306800.051794'], ...]\n * ```\n */\n async volumeChart(id: string, params: VolumeChartParams): Promise<VolumeChartResponse> {\n return this.client.get<VolumeChartResponse>(\n `/exchanges/${encodeURIComponent(id)}/volume_chart`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n // ---------------------------------------------------------------------------\n // /exchanges/{id}/volume_chart/range (Analyst+)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns BTC-denominated volume chart data for an exchange over a custom\n * Unix timestamp range.\n *\n * @param id - Exchange API ID (e.g. `\"binance\"`).\n * @param params - Required `from` and `to` Unix timestamps (seconds).\n * @returns {@link VolumeChartResponse} — array of `[timestamp_ms, volume_btc]`\n * tuples.\n *\n * @remarks Requires **Analyst+** plan.\n *\n * @example\n * ```ts\n * const chart = await exchanges.volumeChartRange('binance', {\n * from: 1711670400,\n * to: 1712275200,\n * });\n * ```\n */\n async volumeChartRange(id: string, params: VolumeChartRangeParams): Promise<VolumeChartResponse> {\n return this.client.get<VolumeChartResponse>(\n `/exchanges/${encodeURIComponent(id)}/volume_chart/range`,\n params as unknown as Record<string, unknown>,\n );\n }\n}\n","/**\n * @module endpoints/derivatives\n * Endpoint methods for CoinGecko derivatives-related API paths.\n *\n * Covers: /derivatives, /derivatives/exchanges,\n * /derivatives/exchanges/{id}, /derivatives/exchanges/list.\n */\n\nimport type { CoinGeckoClient } from '../client.js';\nimport type {\n DerivativeTicker,\n DerivativesExchangesParams,\n DerivativeExchange,\n DerivativeExchangeDetail,\n DerivativesExchangeByIdParams,\n ExchangeListEntry,\n} from '../types/index.js';\n\n/**\n * Endpoint group for CoinGecko derivatives APIs.\n *\n * Obtain an instance via the SDK's top-level entry point; do not\n * instantiate directly.\n *\n * @example\n * ```ts\n * const deriv = new DerivativesEndpoints(client);\n * const tickers = await deriv.tickers();\n * ```\n */\nexport class DerivativesEndpoints {\n constructor(private readonly client: CoinGeckoClient) {}\n\n // ---------------------------------------------------------------------------\n // /derivatives\n // ---------------------------------------------------------------------------\n\n /**\n * Returns a list of all derivative tickers across all derivatives exchanges.\n *\n * @param params - Optional filter parameters.\n * @param params.include_tickers - Whether to include tickers.\n * `\"all\"` returns all tickers; `\"unexpired\"` excludes expired contracts.\n * @returns Array of {@link DerivativeTicker} objects.\n *\n * @example\n * ```ts\n * const allTickers = await deriv.tickers({ include_tickers: 'unexpired' });\n * ```\n */\n async tickers(params?: { include_tickers?: 'all' | 'unexpired' }): Promise<DerivativeTicker[]> {\n return this.client.get<DerivativeTicker[]>('/derivatives', params as Record<string, unknown>);\n }\n\n // ---------------------------------------------------------------------------\n // /derivatives/exchanges\n // ---------------------------------------------------------------------------\n\n /**\n * Returns a paginated list of all derivatives exchanges.\n *\n * @param params - Optional sort and pagination parameters.\n * @returns Array of {@link DerivativeExchange} objects.\n *\n * @example\n * ```ts\n * const top = await deriv.exchanges({\n * order: 'open_interest_btc_desc',\n * per_page: 10,\n * });\n * ```\n */\n async exchanges(params?: DerivativesExchangesParams): Promise<DerivativeExchange[]> {\n return this.client.get<DerivativeExchange[]>(\n '/derivatives/exchanges',\n params as Record<string, unknown>,\n );\n }\n\n // ---------------------------------------------------------------------------\n // /derivatives/exchanges/{id}\n // ---------------------------------------------------------------------------\n\n /**\n * Returns detailed data for a single derivatives exchange by its API ID.\n *\n * @param id - Derivatives exchange API ID (e.g. `\"binance_futures\"`).\n * @param params - Optional parameters to include ticker data.\n * @returns {@link DerivativeExchangeDetail} with optional tickers array.\n *\n * @example\n * ```ts\n * const detail = await deriv.exchangeById('binance_futures', {\n * include_tickers: 'unexpired',\n * });\n * console.log(detail.open_interest_btc);\n * ```\n */\n async exchangeById(\n id: string,\n params?: DerivativesExchangeByIdParams,\n ): Promise<DerivativeExchangeDetail> {\n return this.client.get<DerivativeExchangeDetail>(\n `/derivatives/exchanges/${encodeURIComponent(id)}`,\n params as Record<string, unknown>,\n );\n }\n\n // ---------------------------------------------------------------------------\n // /derivatives/exchanges/list\n // ---------------------------------------------------------------------------\n\n /**\n * Returns a lightweight list of all derivatives exchange IDs and names.\n *\n * Use this to resolve exchange API IDs for subsequent calls.\n *\n * @returns Array of {@link ExchangeListEntry} objects (`id` + `name` only).\n *\n * @example\n * ```ts\n * const ids = await deriv.exchangesList();\n * // [{ id: 'binance_futures', name: 'Binance (Futures)' }, ...]\n * ```\n */\n async exchangesList(): Promise<ExchangeListEntry[]> {\n return this.client.get<ExchangeListEntry[]>('/derivatives/exchanges/list');\n }\n}\n","/**\n * @module endpoints/nfts\n * Endpoint methods for CoinGecko NFT-related API paths.\n *\n * Covers: /nfts/list, /nfts/{id}, /nfts/{platformId}/contract/{address},\n * /nfts/markets (Analyst+), /nfts/{id}/market_chart (Analyst+),\n * /nfts/{platformId}/contract/{address}/market_chart (Analyst+),\n * /nfts/{id}/tickers (Analyst+).\n */\n\nimport type { CoinGeckoClient } from '../client.js';\nimport type {\n NftListEntry,\n NftCollection,\n NftMarketsParams,\n NftMarketChart,\n NftMarketChartParams,\n NftTickersResponse,\n} from '../types/index.js';\n\n/**\n * Endpoint group for CoinGecko NFT APIs.\n *\n * Obtain an instance via the SDK's top-level entry point; do not\n * instantiate directly.\n *\n * @example\n * ```ts\n * const nfts = new NftsEndpoints(client);\n * const listing = await nfts.list();\n * ```\n */\nexport class NftsEndpoints {\n constructor(private readonly client: CoinGeckoClient) {}\n\n // ---------------------------------------------------------------------------\n // /nfts/list\n // ---------------------------------------------------------------------------\n\n /**\n * Returns a paginated list of all NFT collections supported by CoinGecko.\n *\n * @param params - Optional pagination parameters (`per_page`, `page`).\n * @returns Array of {@link NftListEntry} objects with minimal metadata.\n *\n * @example\n * ```ts\n * const collections = await nfts.list({ per_page: 100, page: 1 });\n * ```\n */\n async list(params?: { per_page?: number; page?: number }): Promise<NftListEntry[]> {\n return this.client.get<NftListEntry[]>('/nfts/list', params as Record<string, unknown>);\n }\n\n // ---------------------------------------------------------------------------\n // /nfts/{id}\n // ---------------------------------------------------------------------------\n\n /**\n * Returns full data for a single NFT collection by its CoinGecko API ID.\n *\n * @param id - NFT collection API ID (e.g. `\"pudgy-penguins\"`). Use\n * {@link list} to discover valid IDs.\n * @returns {@link NftCollection} with floor price, market cap, volume, and\n * other collection metadata.\n *\n * @example\n * ```ts\n * const penguins = await nfts.getById('pudgy-penguins');\n * console.log(penguins.floor_price?.usd);\n * ```\n */\n async getById(id: string): Promise<NftCollection> {\n return this.client.get<NftCollection>(`/nfts/${encodeURIComponent(id)}`);\n }\n\n // ---------------------------------------------------------------------------\n // /nfts/{platformId}/contract/{address}\n // ---------------------------------------------------------------------------\n\n /**\n * Returns full data for a single NFT collection identified by its contract\n * address on a specific asset platform.\n *\n * @param platformId - Asset platform ID (e.g. `\"ethereum\"`).\n * @param address - Token contract address (e.g. `\"0xBd3531...\"`).\n * @returns {@link NftCollection} with the same fields as {@link getById}.\n *\n * @example\n * ```ts\n * const collection = await nfts.getByContract(\n * 'ethereum',\n * '0xBd3531dA5CF5857e7CfAA92426877b022e612cf8',\n * );\n * ```\n */\n async getByContract(platformId: string, address: string): Promise<NftCollection> {\n return this.client.get<NftCollection>(\n `/nfts/${encodeURIComponent(platformId)}/contract/${encodeURIComponent(address)}`,\n );\n }\n\n // ---------------------------------------------------------------------------\n // /nfts/markets (Analyst+)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns a paginated list of NFT collections with market data.\n *\n * @param params - Optional filter and sort parameters.\n * @returns Array of {@link NftCollection} objects with market data.\n *\n * @remarks Requires **Analyst+** plan.\n *\n * @example\n * ```ts\n * const markets = await nfts.markets({\n * asset_platform_id: 'ethereum',\n * order: 'market_cap_usd_desc',\n * per_page: 50,\n * });\n * ```\n */\n async markets(params?: NftMarketsParams): Promise<NftCollection[]> {\n return this.client.get<NftCollection[]>('/nfts/markets', params as Record<string, unknown>);\n }\n\n // ---------------------------------------------------------------------------\n // /nfts/{id}/market_chart (Analyst+)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns historical market chart data for a single NFT collection.\n *\n * @param id - NFT collection API ID (e.g. `\"pudgy-penguins\"`).\n * @param params - Optional query parameters, including `days`.\n * @returns {@link NftMarketChart} with floor price, market cap, and volume\n * time series.\n *\n * @remarks Requires **Analyst+** plan.\n *\n * @example\n * ```ts\n * const chart = await nfts.marketChart('pudgy-penguins', { days: 30 });\n * console.log(chart.floor_price_usd);\n * ```\n */\n async marketChart(id: string, params?: NftMarketChartParams): Promise<NftMarketChart> {\n return this.client.get<NftMarketChart>(\n `/nfts/${encodeURIComponent(id)}/market_chart`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n // ---------------------------------------------------------------------------\n // /nfts/{platformId}/contract/{address}/market_chart (Analyst+)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns historical market chart data for an NFT collection identified by\n * its contract address on a specific asset platform.\n *\n * @param platformId - Asset platform ID (e.g. `\"ethereum\"`).\n * @param address - Token contract address.\n * @param params - Optional query parameters, including `days`.\n * @returns {@link NftMarketChart} with floor price, market cap, and volume\n * time series.\n *\n * @remarks Requires **Analyst+** plan.\n *\n * @example\n * ```ts\n * const chart = await nfts.contractMarketChart(\n * 'ethereum',\n * '0xBd3531dA5CF5857e7CfAA92426877b022e612cf8',\n * { days: 14 },\n * );\n * ```\n */\n async contractMarketChart(\n platformId: string,\n address: string,\n params?: NftMarketChartParams,\n ): Promise<NftMarketChart> {\n return this.client.get<NftMarketChart>(\n `/nfts/${encodeURIComponent(platformId)}/contract/${encodeURIComponent(address)}/market_chart`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n // ---------------------------------------------------------------------------\n // /nfts/{id}/tickers (Analyst+)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns marketplace tickers (floor price, volume) for a single NFT\n * collection across all supported NFT marketplaces.\n *\n * @param id - NFT collection API ID (e.g. `\"pudgy-penguins\"`).\n * @returns {@link NftTickersResponse} with an array of marketplace tickers.\n *\n * @remarks Requires **Analyst+** plan.\n *\n * @example\n * ```ts\n * const result = await nfts.tickers('pudgy-penguins');\n * result.tickers.forEach(t => console.log(t.name, t.floor_price_in_native_currency));\n * ```\n */\n async tickers(id: string): Promise<NftTickersResponse> {\n return this.client.get<NftTickersResponse>(`/nfts/${encodeURIComponent(id)}/tickers`);\n }\n}\n","/**\n * @module endpoints/onchain\n * OnchainEndpoints class covering all GeckoTerminal / on-chain DEX endpoints\n * exposed under the `/onchain` path prefix.\n *\n * All methods delegate to {@link CoinGeckoClient.get} and return typed\n * JSON:API response objects defined in `src/types/onchain.ts`.\n */\n\nimport type { CoinGeckoClient } from '../client.js';\nimport type {\n NetworksListResponse,\n DexListResponse,\n PoolDetail,\n PoolInfo,\n OhlcvResponse,\n OhlcvParams,\n TradesResponse,\n TokenDetailResponse,\n TokenInfoResponse,\n MegafilterParams,\n OnchainCategoriesResponse,\n HolderChartResponse,\n JsonApiListResponse,\n JsonApiSingleResponse,\n PoolAttributes,\n TokenAttributes,\n TopTrader,\n TopHolder,\n} from '../types/onchain.js';\nimport type { PaginationParams } from '../types/common.js';\n\n// ---------------------------------------------------------------------------\n// Simple token price response\n// ---------------------------------------------------------------------------\n\n/**\n * Response from the simple token price endpoint.\n * Maps each token address to a map of currency → price value (string).\n */\nexport type SimpleTokenPriceResponse = Record<string, Record<string, string>>;\n\n// ---------------------------------------------------------------------------\n// Search pools params\n// ---------------------------------------------------------------------------\n\n/**\n * Query parameters for `/onchain/search/pools`.\n */\nexport interface SearchPoolsParams extends PaginationParams {\n /** Optional network ID to narrow the search (e.g. `\"eth\"`). */\n network?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Pool info response\n// ---------------------------------------------------------------------------\n\n/**\n * Response type for the pool info endpoint.\n */\nexport type PoolInfoResponse = JsonApiSingleResponse<PoolAttributes>;\n\n// ---------------------------------------------------------------------------\n// OnchainEndpoints\n// ---------------------------------------------------------------------------\n\n/**\n * Provides typed access to all GeckoTerminal / on-chain DEX endpoints\n * under the `/onchain` prefix.\n *\n * Instantiate indirectly through a higher-level SDK facade, or directly:\n *\n * @example\n * ```ts\n * import { CoinGeckoClient } from '../client.js';\n * import { OnchainEndpoints } from './onchain.js';\n *\n * const client = new CoinGeckoClient({ apiKey: process.env.CG_KEY });\n * const onchain = new OnchainEndpoints(client);\n *\n * const { data } = await onchain.networks();\n * console.log(data.map(n => n.attributes.name));\n * ```\n */\nexport class OnchainEndpoints {\n constructor(private readonly client: CoinGeckoClient) {}\n\n // -------------------------------------------------------------------------\n // Simple\n // -------------------------------------------------------------------------\n\n /**\n * Returns the current USD (or other currency) price of one or more tokens\n * on a given network.\n *\n * @param network - Network ID (e.g. `\"eth\"`, `\"bsc\"`).\n * @param addresses - Token contract address or array of addresses.\n * @returns A map of address → { usd: \"price\" } (or whichever currencies were requested).\n *\n * @example\n * ```ts\n * const prices = await onchain.tokenPrice('eth', [\n * '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * '0xdac17f958d2ee523a2206206994597c13d831ec7',\n * ]);\n * // { '0xa0b8...': { usd: '1.001' }, '0xdac1...': { usd: '0.9998' } }\n * ```\n */\n tokenPrice(\n network: string,\n addresses: string | string[],\n ): Promise<SimpleTokenPriceResponse> {\n const addressParam = Array.isArray(addresses) ? addresses.join(',') : addresses;\n return this.client.get<SimpleTokenPriceResponse>(\n `/onchain/simple/networks/${network}/token_price/${addressParam}`,\n );\n }\n\n // -------------------------------------------------------------------------\n // Networks & DEXes\n // -------------------------------------------------------------------------\n\n /**\n * Returns the list of all supported networks (blockchains) on GeckoTerminal.\n *\n * @param params - Optional pagination parameters.\n * @returns Paginated list of network resources.\n *\n * @example\n * ```ts\n * const { data } = await onchain.networks();\n * data.forEach(n => console.log(n.id, n.attributes.name));\n * ```\n */\n networks(params?: PaginationParams): Promise<NetworksListResponse> {\n return this.client.get<NetworksListResponse>('/onchain/networks', params as unknown as Record<string, unknown> | undefined);\n }\n\n /**\n * Returns the list of DEXes available on a given network.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param params - Optional pagination parameters.\n * @returns Paginated list of DEX resources.\n *\n * @example\n * ```ts\n * const { data } = await onchain.dexes('eth');\n * data.forEach(d => console.log(d.id, d.attributes.name));\n * ```\n */\n dexes(network: string, params?: PaginationParams): Promise<DexListResponse> {\n return this.client.get<DexListResponse>(\n `/onchain/networks/${network}/dexes`,\n params as unknown as Record<string, unknown> | undefined,\n );\n }\n\n // -------------------------------------------------------------------------\n // Pools\n // -------------------------------------------------------------------------\n\n /**\n * Returns detailed data for a single pool by contract address.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param address - Pool contract address.\n * @returns Single pool resource (JSON:API envelope).\n *\n * @example\n * ```ts\n * const { data } = await onchain.pool('eth', '0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640');\n * console.log(data.attributes.name, data.attributes.reserve_in_usd);\n * ```\n */\n pool(network: string, address: string): Promise<PoolDetail> {\n return this.client.get<PoolDetail>(\n `/onchain/networks/${network}/pools/${address}`,\n );\n }\n\n /**\n * Returns data for multiple pools by contract addresses in one request.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param addresses - Array of pool contract addresses (joined as comma-separated path segment).\n * @returns List of pool resources (JSON:API envelope).\n *\n * @example\n * ```ts\n * const { data } = await onchain.pools('eth', [\n * '0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640',\n * '0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8',\n * ]);\n * ```\n */\n pools(network: string, addresses: string[]): Promise<PoolInfo> {\n return this.client.get<PoolInfo>(\n `/onchain/networks/${network}/pools/multi/${addresses.join(',')}`,\n );\n }\n\n /**\n * Returns the top pools on a given network ranked by volume or liquidity.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param params - Optional pagination parameters.\n * @returns Paginated list of pool resources.\n *\n * @example\n * ```ts\n * const { data } = await onchain.topPools('eth', { page: 1 });\n * ```\n */\n topPools(\n network: string,\n params?: PaginationParams,\n ): Promise<JsonApiListResponse<PoolAttributes>> {\n return this.client.get<JsonApiListResponse<PoolAttributes>>(\n `/onchain/networks/${network}/pools`,\n params as unknown as Record<string, unknown> | undefined,\n );\n }\n\n /**\n * Returns the top pools for a specific DEX on a given network.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param dex - DEX ID (e.g. `\"uniswap_v3\"`).\n * @param params - Optional pagination parameters.\n * @returns Paginated list of pool resources.\n *\n * @example\n * ```ts\n * const { data } = await onchain.topPoolsByDex('eth', 'uniswap_v3');\n * ```\n */\n topPoolsByDex(\n network: string,\n dex: string,\n params?: PaginationParams,\n ): Promise<JsonApiListResponse<PoolAttributes>> {\n return this.client.get<JsonApiListResponse<PoolAttributes>>(\n `/onchain/networks/${network}/dexes/${dex}/pools`,\n params as unknown as Record<string, unknown> | undefined,\n );\n }\n\n /**\n * Returns trending pools, either globally or filtered to a specific network.\n *\n * When `network` is omitted, the global trending pools endpoint is used:\n * `GET /onchain/networks/trending_pools`.\n * When `network` is provided: `GET /onchain/networks/{network}/trending_pools`.\n *\n * @param network - Optional network ID to scope results.\n * @param params - Optional pagination parameters.\n * @returns Paginated list of trending pool resources.\n *\n * @example\n * ```ts\n * // Global trending\n * const { data } = await onchain.trendingPools();\n *\n * // Network-scoped trending\n * const { data: ethTrending } = await onchain.trendingPools('eth');\n * ```\n */\n trendingPools(\n network?: string,\n params?: PaginationParams,\n ): Promise<JsonApiListResponse<PoolAttributes>> {\n const path = network\n ? `/onchain/networks/${network}/trending_pools`\n : '/onchain/networks/trending_pools';\n return this.client.get<JsonApiListResponse<PoolAttributes>>(path, params as unknown as Record<string, unknown> | undefined);\n }\n\n /**\n * Returns newly created pools, either globally or filtered to a specific network.\n *\n * When `network` is omitted, the global new pools endpoint is used:\n * `GET /onchain/networks/new_pools`.\n * When `network` is provided: `GET /onchain/networks/{network}/new_pools`.\n *\n * @param network - Optional network ID to scope results.\n * @param params - Optional pagination parameters.\n * @returns Paginated list of new pool resources.\n *\n * @example\n * ```ts\n * // All new pools across all networks\n * const { data } = await onchain.newPools();\n *\n * // New pools on Solana only\n * const { data: solNew } = await onchain.newPools('solana');\n * ```\n */\n newPools(\n network?: string,\n params?: PaginationParams,\n ): Promise<JsonApiListResponse<PoolAttributes>> {\n const path = network\n ? `/onchain/networks/${network}/new_pools`\n : '/onchain/networks/new_pools';\n return this.client.get<JsonApiListResponse<PoolAttributes>>(path, params as unknown as Record<string, unknown> | undefined);\n }\n\n /**\n * Returns pools matching advanced filter criteria (megafilter).\n *\n * @remarks\n * **Requires Analyst+ (💼) plan.** Calls are rejected with HTTP 403 on\n * lower-tier keys.\n *\n * @param params - Filter, sort, and pagination parameters.\n * @returns Paginated list of pool resources matching the criteria.\n *\n * @example\n * ```ts\n * const { data } = await onchain.megafilter({\n * network: 'eth',\n * reserve_in_usd_gte: 100_000,\n * sort: 'h24_volume_usd',\n * page: 1,\n * });\n * ```\n */\n megafilter(\n params: MegafilterParams,\n ): Promise<JsonApiListResponse<PoolAttributes>> {\n return this.client.get<JsonApiListResponse<PoolAttributes>>(\n '/onchain/pools/megafilter',\n params as unknown as Record<string, unknown>,\n );\n }\n\n /**\n * Searches for pools matching a text query across all networks or a\n * specific network.\n *\n * @param query - Search query string (token name, symbol, or pool address).\n * @param params - Optional network filter and pagination parameters.\n * @returns Paginated list of matching pool resources.\n *\n * @example\n * ```ts\n * const { data } = await onchain.searchPools('PEPE');\n * const { data: ethPepe } = await onchain.searchPools('PEPE', { network: 'eth' });\n * ```\n */\n searchPools(\n query: string,\n params?: SearchPoolsParams,\n ): Promise<JsonApiListResponse<PoolAttributes>> {\n return this.client.get<JsonApiListResponse<PoolAttributes>>(\n '/onchain/search/pools',\n { query, ...params },\n );\n }\n\n /**\n * Returns pools that are currently trending in search on GeckoTerminal.\n *\n * @remarks\n * **Requires Analyst+ (💼) plan.** Calls are rejected with HTTP 403 on\n * lower-tier keys.\n *\n * @returns List of trending-search pool resources.\n *\n * @example\n * ```ts\n * const { data } = await onchain.trendingSearchPools();\n * ```\n */\n trendingSearchPools(): Promise<JsonApiListResponse<PoolAttributes>> {\n return this.client.get<JsonApiListResponse<PoolAttributes>>(\n '/onchain/pools/trending_search',\n );\n }\n\n /**\n * Returns rich metadata / info for a single pool.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param poolAddress - Pool contract address.\n * @returns Single pool info resource (JSON:API envelope).\n *\n * @example\n * ```ts\n * const { data } = await onchain.poolInfo('eth', '0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640');\n * ```\n */\n poolInfo(network: string, poolAddress: string): Promise<PoolInfoResponse> {\n return this.client.get<PoolInfoResponse>(\n `/onchain/networks/${network}/pools/${poolAddress}/info`,\n );\n }\n\n /**\n * Returns OHLCV (candlestick) data for a pool.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param poolAddress - Pool contract address.\n * @param timeframe - Candle timeframe: `\"minute\"`, `\"hour\"`, or `\"day\"`.\n * @param params - Optional OHLCV query parameters (aggregate, limit, etc.).\n * @returns OHLCV response containing an array of candles and token metadata.\n *\n * @example\n * ```ts\n * const ohlcv = await onchain.poolOhlcv(\n * 'eth',\n * '0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640',\n * 'hour',\n * { aggregate: '4', limit: 200 },\n * );\n * ohlcv.data?.attributes?.ohlcv_list?.forEach(([ts, o, h, l, c, v]) => {\n * console.log(new Date(ts * 1000).toISOString(), c);\n * });\n * ```\n */\n poolOhlcv(\n network: string,\n poolAddress: string,\n timeframe: string,\n params?: OhlcvParams,\n ): Promise<OhlcvResponse> {\n return this.client.get<OhlcvResponse>(\n `/onchain/networks/${network}/pools/${poolAddress}/ohlcv/${timeframe}`,\n params as unknown as Record<string, unknown> | undefined,\n );\n }\n\n /**\n * Returns recent trades for a pool.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param poolAddress - Pool contract address.\n * @param params - Optional query parameters (e.g. `trade_volume_in_usd_greater_than`).\n * @returns Trades response containing an array of trade objects.\n *\n * @example\n * ```ts\n * const trades = await onchain.poolTrades(\n * 'eth',\n * '0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640',\n * );\n * ```\n */\n poolTrades(\n network: string,\n poolAddress: string,\n params?: Record<string, unknown>,\n ): Promise<TradesResponse> {\n return this.client.get<TradesResponse>(\n `/onchain/networks/${network}/pools/${poolAddress}/trades`,\n params,\n );\n }\n\n // -------------------------------------------------------------------------\n // Tokens\n // -------------------------------------------------------------------------\n\n /**\n * Returns price and market data for a single token by contract address.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param address - Token contract address.\n * @returns Single token resource (JSON:API envelope).\n *\n * @example\n * ```ts\n * const { data } = await onchain.token(\n * 'eth',\n * '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * );\n * console.log(data.attributes.symbol, data.attributes.price_usd);\n * ```\n */\n token(network: string, address: string): Promise<TokenDetailResponse> {\n return this.client.get<TokenDetailResponse>(\n `/onchain/networks/${network}/tokens/${address}`,\n );\n }\n\n /**\n * Returns price and market data for multiple tokens in one request.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param addresses - Array of token contract addresses (joined as comma-separated path segment).\n * @returns List of token resources (JSON:API envelope).\n *\n * @example\n * ```ts\n * const { data } = await onchain.tokens('eth', [\n * '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * '0xdac17f958d2ee523a2206206994597c13d831ec7',\n * ]);\n * ```\n */\n tokens(\n network: string,\n addresses: string[],\n ): Promise<JsonApiListResponse<TokenAttributes>> {\n return this.client.get<JsonApiListResponse<TokenAttributes>>(\n `/onchain/networks/${network}/tokens/multi/${addresses.join(',')}`,\n );\n }\n\n /**\n * Returns rich metadata (socials, description, security flags) for a token.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param address - Token contract address.\n * @returns Token info resource (JSON:API envelope).\n *\n * @example\n * ```ts\n * const { data } = await onchain.tokenInfo(\n * 'eth',\n * '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * );\n * console.log(data.attributes.description, data.attributes.gt_score);\n * ```\n */\n tokenInfo(network: string, address: string): Promise<TokenInfoResponse> {\n return this.client.get<TokenInfoResponse>(\n `/onchain/networks/${network}/tokens/${address}/info`,\n );\n }\n\n /**\n * Returns the list of pools that include a given token.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param address - Token contract address.\n * @param params - Optional pagination parameters.\n * @returns Paginated list of pool resources containing the token.\n *\n * @example\n * ```ts\n * const { data } = await onchain.tokenPools(\n * 'eth',\n * '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * );\n * ```\n */\n tokenPools(\n network: string,\n address: string,\n params?: PaginationParams,\n ): Promise<JsonApiListResponse<PoolAttributes>> {\n return this.client.get<JsonApiListResponse<PoolAttributes>>(\n `/onchain/networks/${network}/tokens/${address}/pools`,\n params as unknown as Record<string, unknown> | undefined,\n );\n }\n\n /**\n * Returns OHLCV (candlestick) data for a token.\n *\n * @remarks\n * **Requires Analyst+ (💼) plan.** Calls are rejected with HTTP 403 on\n * lower-tier keys.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param address - Token contract address.\n * @param timeframe - Candle timeframe: `\"minute\"`, `\"hour\"`, or `\"day\"`.\n * @param params - Optional OHLCV query parameters (aggregate, limit, etc.).\n * @returns OHLCV response containing an array of candles and token metadata.\n *\n * @example\n * ```ts\n * const ohlcv = await onchain.tokenOhlcv(\n * 'eth',\n * '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * 'day',\n * { limit: 30 },\n * );\n * ```\n */\n tokenOhlcv(\n network: string,\n address: string,\n timeframe: string,\n params?: OhlcvParams,\n ): Promise<OhlcvResponse> {\n return this.client.get<OhlcvResponse>(\n `/onchain/networks/${network}/tokens/${address}/ohlcv/${timeframe}`,\n params as unknown as Record<string, unknown> | undefined,\n );\n }\n\n /**\n * Returns recent trades involving a specific token.\n *\n * @remarks\n * **Requires Analyst+ (💼) plan.** Calls are rejected with HTTP 403 on\n * lower-tier keys.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param address - Token contract address.\n * @param params - Optional query parameters.\n * @returns Trades response containing recent trade objects for the token.\n *\n * @example\n * ```ts\n * const trades = await onchain.tokenTrades(\n * 'eth',\n * '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * );\n * ```\n */\n tokenTrades(\n network: string,\n address: string,\n params?: Record<string, unknown>,\n ): Promise<TradesResponse> {\n return this.client.get<TradesResponse>(\n `/onchain/networks/${network}/tokens/${address}/trades`,\n params,\n );\n }\n\n /**\n * Returns the top traders for a specific token over the last 24 hours.\n *\n * @remarks\n * **Requires Analyst+ (💼) plan.** Calls are rejected with HTTP 403 on\n * lower-tier keys.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param address - Token contract address.\n * @returns List response containing top trader entries.\n *\n * @example\n * ```ts\n * const result = await onchain.topTraders(\n * 'eth',\n * '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * );\n * ```\n */\n topTraders(\n network: string,\n address: string,\n ): Promise<JsonApiListResponse<TopTrader>> {\n return this.client.get<JsonApiListResponse<TopTrader>>(\n `/onchain/networks/${network}/tokens/${address}/top_traders`,\n );\n }\n\n /**\n * Returns the top holders (largest wallets) for a specific token.\n *\n * @remarks\n * **Requires Analyst+ (💼) plan.** Calls are rejected with HTTP 403 on\n * lower-tier keys.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param address - Token contract address.\n * @returns List response containing top holder entries.\n *\n * @example\n * ```ts\n * const result = await onchain.topHolders(\n * 'eth',\n * '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * );\n * ```\n */\n topHolders(\n network: string,\n address: string,\n ): Promise<JsonApiListResponse<TopHolder>> {\n return this.client.get<JsonApiListResponse<TopHolder>>(\n `/onchain/networks/${network}/tokens/${address}/top_holders`,\n );\n }\n\n /**\n * Returns a time-series chart of holder count for a specific token.\n *\n * @remarks\n * **Requires Analyst+ (💼) plan.** Calls are rejected with HTTP 403 on\n * lower-tier keys.\n *\n * @param network - Network ID (e.g. `\"eth\"`).\n * @param address - Token contract address.\n * @returns Holder chart response with an array of `[timestamp, count]` data points.\n *\n * @example\n * ```ts\n * const chart = await onchain.holdersChart(\n * 'eth',\n * '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * );\n * chart.data?.attributes?.holders_chart?.forEach(([ts, count]) => {\n * console.log(new Date(ts * 1000).toISOString(), count);\n * });\n * ```\n */\n holdersChart(\n network: string,\n address: string,\n ): Promise<HolderChartResponse> {\n return this.client.get<HolderChartResponse>(\n `/onchain/networks/${network}/tokens/${address}/holders_chart`,\n );\n }\n\n /**\n * Returns a list of tokens whose info was recently updated on GeckoTerminal.\n *\n * Useful for syncing token metadata caches.\n *\n * @returns List of recently-updated token info resources (JSON:API).\n *\n * @example\n * ```ts\n * const { data } = await onchain.recentlyUpdatedTokens();\n * data.forEach(t => console.log(t.attributes.symbol, t.attributes.coingecko_coin_id));\n * ```\n */\n recentlyUpdatedTokens(): Promise<JsonApiListResponse<TokenAttributes>> {\n return this.client.get<JsonApiListResponse<TokenAttributes>>(\n '/onchain/tokens/info_recently_updated',\n );\n }\n\n // -------------------------------------------------------------------------\n // Categories (Analyst+)\n // -------------------------------------------------------------------------\n\n /**\n * Returns the list of GeckoTerminal onchain categories.\n *\n * @remarks\n * **Requires Analyst+ (💼) plan.** Calls are rejected with HTTP 403 on\n * lower-tier keys.\n *\n * @returns Response containing an array of category objects.\n *\n * @example\n * ```ts\n * const { data } = await onchain.categories();\n * data.forEach(c => console.log(c.id, c.attributes?.name));\n * ```\n */\n categories(): Promise<OnchainCategoriesResponse> {\n return this.client.get<OnchainCategoriesResponse>('/onchain/categories');\n }\n\n /**\n * Returns pools belonging to a specific GeckoTerminal onchain category.\n *\n * @remarks\n * **Requires Analyst+ (💼) plan.** Calls are rejected with HTTP 403 on\n * lower-tier keys.\n *\n * @param categoryId - Category ID (e.g. `\"defi\"`, `\"meme\"`).\n * @param params - Optional pagination parameters.\n * @returns Paginated list of pool resources in the category.\n *\n * @example\n * ```ts\n * const { data } = await onchain.categoryPools('meme', { page: 1, per_page: 50 });\n * data.forEach(p => console.log(p.attributes.name, p.attributes.volume_usd?.h24));\n * ```\n */\n categoryPools(\n categoryId: string,\n params?: PaginationParams,\n ): Promise<JsonApiListResponse<PoolAttributes>> {\n return this.client.get<JsonApiListResponse<PoolAttributes>>(\n `/onchain/categories/${categoryId}/pools`,\n params as unknown as Record<string, unknown> | undefined,\n );\n }\n}\n","/**\n * @module endpoints/global\n * Endpoint methods for CoinGecko global market, search, trending,\n * exchange rates, asset platforms, and token list API paths.\n *\n * Covers: /global, /global/decentralized_finance_defi,\n * /global/market_cap_chart (Analyst+), /search, /search/trending,\n * /exchange_rates, /asset_platforms, /token_lists/{platformId}/all.json.\n */\n\nimport type { CoinGeckoClient } from '../client.js';\nimport type {\n GlobalData,\n GlobalDefiData,\n GlobalMarketCapChartParams,\n GlobalMarketCapChartResponse,\n SearchResponse,\n TrendingResponse,\n ExchangeRatesResponse,\n AssetPlatform,\n} from '../types/index.js';\nimport type { AssetPlatformsParams } from '../types/coins.js';\n\n/**\n * Endpoint group for CoinGecko global market, search, and utility APIs.\n *\n * Obtain an instance via the SDK's top-level entry point; do not\n * instantiate directly.\n *\n * @example\n * ```ts\n * const global = new GlobalEndpoints(client);\n * const data = await global.global();\n * console.log(data.data.total_market_cap?.usd);\n * ```\n */\nexport class GlobalEndpoints {\n constructor(private readonly client: CoinGeckoClient) {}\n\n // ---------------------------------------------------------------------------\n // /global\n // ---------------------------------------------------------------------------\n\n /**\n * Returns global cryptocurrency market data, including total market cap,\n * volume, dominance, and number of active coins and exchanges.\n *\n * @returns {@link GlobalData} wrapping a {@link GlobalDataPayload}.\n *\n * @example\n * ```ts\n * const { data } = await global.global();\n * console.log(data.market_cap_percentage?.btc); // BTC dominance %\n * ```\n */\n async global(): Promise<GlobalData> {\n return this.client.get<GlobalData>('/global');\n }\n\n // ---------------------------------------------------------------------------\n // /global/decentralized_finance_defi\n // ---------------------------------------------------------------------------\n\n /**\n * Returns global DeFi market data, including total DeFi market cap, ETH\n * market cap, DeFi dominance, and trading volume.\n *\n * @returns {@link GlobalDefiData} wrapping a {@link GlobalDefiPayload}.\n *\n * @example\n * ```ts\n * const { data } = await global.globalDefi();\n * console.log(data.defi_market_cap);\n * ```\n */\n async globalDefi(): Promise<GlobalDefiData> {\n return this.client.get<GlobalDefiData>('/global/decentralized_finance_defi');\n }\n\n // ---------------------------------------------------------------------------\n // /global/market_cap_chart (Analyst+)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns historical global market cap and volume chart data.\n *\n * @param params - Required query parameters, including `days`.\n * @returns {@link GlobalMarketCapChartResponse} with `market_cap` and\n * `volume` time series arrays.\n *\n * @remarks Requires **Analyst+** plan.\n *\n * @example\n * ```ts\n * const chart = await global.globalMarketCapChart({ days: 30 });\n * console.log(chart.market_cap_chart.market_cap[0]); // [timestamp_ms, value]\n * ```\n */\n async globalMarketCapChart(\n params: GlobalMarketCapChartParams,\n ): Promise<GlobalMarketCapChartResponse> {\n return this.client.get<GlobalMarketCapChartResponse>(\n '/global/market_cap_chart',\n params as unknown as Record<string, unknown>,\n );\n }\n\n // ---------------------------------------------------------------------------\n // /search\n // ---------------------------------------------------------------------------\n\n /**\n * Searches for coins, exchanges, categories, and NFT collections by a\n * free-text query string.\n *\n * @param query - Search term (e.g. `\"bitcoin\"`, `\"uni\"`).\n * @returns {@link SearchResponse} with matched coins, exchanges, categories,\n * and NFTs.\n *\n * @example\n * ```ts\n * const results = await global.search('uniswap');\n * results.coins.forEach(c => console.log(c.id, c.name));\n * ```\n */\n async search(query: string): Promise<SearchResponse> {\n return this.client.get<SearchResponse>('/search', { query });\n }\n\n // ---------------------------------------------------------------------------\n // /search/trending\n // ---------------------------------------------------------------------------\n\n /**\n * Returns the top trending coins, NFTs, and categories on CoinGecko in the\n * last 24 hours, determined by search volume.\n *\n * @returns {@link TrendingResponse} with arrays of trending coins, NFTs, and\n * categories.\n *\n * @example\n * ```ts\n * const { coins } = await global.trending();\n * coins.forEach(({ item }) => console.log(item.name));\n * ```\n */\n async trending(): Promise<TrendingResponse> {\n return this.client.get<TrendingResponse>('/search/trending');\n }\n\n // ---------------------------------------------------------------------------\n // /exchange_rates\n // ---------------------------------------------------------------------------\n\n /**\n * Returns BTC exchange rates against fiat currencies, crypto assets, and\n * commodities.\n *\n * @returns {@link ExchangeRatesResponse} mapping currency codes to rate data.\n *\n * @example\n * ```ts\n * const { rates } = await global.exchangeRates();\n * console.log(rates['usd']?.value); // BTC price in USD\n * ```\n */\n async exchangeRates(): Promise<ExchangeRatesResponse> {\n return this.client.get<ExchangeRatesResponse>('/exchange_rates');\n }\n\n // ---------------------------------------------------------------------------\n // /asset_platforms\n // ---------------------------------------------------------------------------\n\n /**\n * Returns a list of all asset platforms (blockchain networks) supported by\n * CoinGecko.\n *\n * @param params - Optional filter parameters (e.g. `filter: 'nft'`).\n * @returns Array of {@link AssetPlatform} objects.\n *\n * @example\n * ```ts\n * const platforms = await global.assetPlatforms({ filter: 'nft' });\n * ```\n */\n async assetPlatforms(params?: AssetPlatformsParams): Promise<AssetPlatform[]> {\n return this.client.get<AssetPlatform[]>(\n '/asset_platforms',\n params as unknown as Record<string, unknown>,\n );\n }\n\n // ---------------------------------------------------------------------------\n // /token_lists/{platformId}/all.json\n // ---------------------------------------------------------------------------\n\n /**\n * Returns a Uniswap-compatible token list for all tokens on a given asset\n * platform.\n *\n * @param platformId - Asset platform ID (e.g. `\"ethereum\"`).\n * @returns Token list object in the standard Uniswap token list format.\n * The exact shape depends on the platform; typed as `unknown` for\n * flexibility.\n *\n * @example\n * ```ts\n * const list = await global.tokenLists('ethereum');\n * ```\n */\n async tokenLists(platformId: string): Promise<unknown> {\n return this.client.get<unknown>(\n `/token_lists/${encodeURIComponent(platformId)}/all.json`,\n );\n }\n}\n","/**\n * @module endpoints/treasury\n * Endpoint methods for CoinGecko Public Treasury API paths.\n *\n * Covers: /entities/list, /companies/public_treasury/{coinId},\n * /public_treasury/{entityId}, /public_treasury/{entityId}/{coinId}/holding_chart,\n * /public_treasury/{entityId}/transaction_history.\n */\n\nimport type { CoinGeckoClient } from '../client.js';\nimport type {\n Entity,\n CompanyTreasuryResponse,\n PublicTreasuryEntity,\n TreasuryHoldingChartResponse,\n TreasuryHoldingChartParams,\n TreasuryTransactionHistoryResponse,\n TreasuryTransactionHistoryParams,\n} from '../types/index.js';\n\n/**\n * Endpoint group for CoinGecko Public Treasury APIs.\n *\n * Obtain an instance via the SDK's top-level entry point; do not\n * instantiate directly.\n *\n * @example\n * ```ts\n * const treasury = new TreasuryEndpoints(client);\n * const entities = await treasury.entitiesList();\n * ```\n */\nexport class TreasuryEndpoints {\n constructor(private readonly client: CoinGeckoClient) {}\n\n // ---------------------------------------------------------------------------\n // /entities/list\n // ---------------------------------------------------------------------------\n\n /**\n * Returns a list of all public entities (companies and governments) tracked\n * in CoinGecko's public treasury database.\n *\n * @returns Array of {@link Entity} objects with `id`, `name`, `symbol`, and\n * `country`.\n *\n * @example\n * ```ts\n * const entities = await treasury.entitiesList();\n * entities.forEach(e => console.log(e.id, e.name));\n * ```\n */\n async entitiesList(): Promise<Entity[]> {\n return this.client.get<Entity[]>('/entities/list');\n }\n\n // ---------------------------------------------------------------------------\n // /companies/public_treasury/{coinId}\n // ---------------------------------------------------------------------------\n\n /**\n * Returns public company Bitcoin or Ethereum treasury holdings, including\n * aggregate totals and per-company breakdowns.\n *\n * @param coinId - Coin API ID to query holdings for.\n * Currently supported values: `\"bitcoin\"`, `\"ethereum\"`.\n * @returns {@link CompanyTreasuryResponse} with aggregate totals and a\n * `companies` array.\n *\n * @example\n * ```ts\n * const holdings = await treasury.companyHoldings('bitcoin');\n * console.log(holdings.total_holdings);\n * holdings.companies.forEach(c => console.log(c.name, c.total_holdings));\n * ```\n */\n async companyHoldings(coinId: string): Promise<CompanyTreasuryResponse> {\n return this.client.get<CompanyTreasuryResponse>(\n `/companies/public_treasury/${encodeURIComponent(coinId)}`,\n );\n }\n\n // ---------------------------------------------------------------------------\n // /public_treasury/{entityId}\n // ---------------------------------------------------------------------------\n\n /**\n * Returns the full treasury profile for a single public entity, including\n * all cryptocurrency holdings and financial metrics.\n *\n * @param entityId - Entity API ID (e.g. `\"strategy\"`, `\"tesla\"`). Use\n * {@link entitiesList} to discover valid IDs.\n * @returns {@link PublicTreasuryEntity} with holdings, valuation, and PnL.\n *\n * @example\n * ```ts\n * const profile = await treasury.entityHoldings('strategy');\n * console.log(profile.total_treasury_value_usd);\n * profile.holdings?.forEach(h => console.log(h.coin_id, h.amount));\n * ```\n */\n async entityHoldings(entityId: string): Promise<PublicTreasuryEntity> {\n return this.client.get<PublicTreasuryEntity>(\n `/public_treasury/${encodeURIComponent(entityId)}`,\n );\n }\n\n // ---------------------------------------------------------------------------\n // /public_treasury/{entityId}/{coinId}/holding_chart\n // ---------------------------------------------------------------------------\n\n /**\n * Returns historical holding amount and USD value chart data for a specific\n * coin in an entity's treasury.\n *\n * @param entityId - Entity API ID (e.g. `\"strategy\"`).\n * @param coinId - Coin API ID (e.g. `\"bitcoin\"`).\n * @param params - Required query parameters, including `days`.\n * @returns {@link TreasuryHoldingChartResponse} with `holdings` and\n * `holding_value_in_usd` time series.\n *\n * @example\n * ```ts\n * const chart = await treasury.entityHoldingChart('strategy', 'bitcoin', {\n * days: '365',\n * });\n * chart.holdings?.forEach(([ts, amount]) => console.log(ts, amount));\n * ```\n */\n async entityHoldingChart(\n entityId: string,\n coinId: string,\n params: TreasuryHoldingChartParams,\n ): Promise<TreasuryHoldingChartResponse> {\n return this.client.get<TreasuryHoldingChartResponse>(\n `/public_treasury/${encodeURIComponent(entityId)}/${encodeURIComponent(coinId)}/holding_chart`,\n params as unknown as Record<string, unknown>,\n );\n }\n\n // ---------------------------------------------------------------------------\n // /public_treasury/{entityId}/transaction_history\n // ---------------------------------------------------------------------------\n\n /**\n * Returns the paginated transaction history for a public treasury entity,\n * including buy/sell events with price and value data.\n *\n * @param entityId - Entity API ID (e.g. `\"strategy\"`).\n * @param params - Optional pagination and coin filter parameters.\n * @returns {@link TreasuryTransactionHistoryResponse} with a `data` array of\n * {@link TreasuryTransaction} records.\n *\n * @example\n * ```ts\n * const history = await treasury.entityTransactions('strategy', {\n * coin_ids: 'bitcoin',\n * per_page: 50,\n * });\n * history.data?.forEach(tx => console.log(tx.date, tx.transaction_type, tx.amount));\n * ```\n */\n async entityTransactions(\n entityId: string,\n params?: TreasuryTransactionHistoryParams,\n ): Promise<TreasuryTransactionHistoryResponse> {\n return this.client.get<TreasuryTransactionHistoryResponse>(\n `/public_treasury/${encodeURIComponent(entityId)}/transaction_history`,\n params as unknown as Record<string, unknown>,\n );\n }\n}\n","/**\n * @module endpoints/meta\n * Endpoint methods for CoinGecko API meta and connectivity checks.\n *\n * Covers: /ping, /key (Analyst+).\n */\n\nimport type { CoinGeckoClient } from '../client.js';\nimport type { PingResponse, ApiUsageResponse } from '../types/index.js';\n\n/**\n * Endpoint group for CoinGecko meta/utility APIs.\n *\n * Obtain an instance via the SDK's top-level entry point; do not\n * instantiate directly.\n *\n * @example\n * ```ts\n * const meta = new MetaEndpoints(client);\n * const status = await meta.ping();\n * console.log(status.gecko_says);\n * ```\n */\nexport class MetaEndpoints {\n constructor(private readonly client: CoinGeckoClient) {}\n\n // ---------------------------------------------------------------------------\n // /ping\n // ---------------------------------------------------------------------------\n\n /**\n * Checks the API server status. Use this as a lightweight connectivity test\n * before making heavier requests.\n *\n * @returns {@link PingResponse} containing a `gecko_says` status string\n * (e.g. `\"(V3) To the Moon!\"`).\n *\n * @example\n * ```ts\n * const { gecko_says } = await meta.ping();\n * console.log(gecko_says); // \"(V3) To the Moon!\"\n * ```\n */\n async ping(): Promise<PingResponse> {\n return this.client.get<PingResponse>('/ping');\n }\n\n // ---------------------------------------------------------------------------\n // /key (Analyst+)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns usage statistics and plan information for the current Pro API key.\n *\n * @returns {@link ApiUsageResponse} with plan name, rate limit, monthly\n * credit usage, and remaining credits.\n *\n * @remarks Requires a valid **Pro API key** (Analyst+ plan). Returns 401 for\n * free-tier or unauthenticated requests.\n *\n * @example\n * ```ts\n * const usage = await meta.apiUsage();\n * console.log(usage.plan); // \"Analyst\"\n * console.log(usage.current_remaining_monthly_calls); // remaining credits\n * ```\n */\n async apiUsage(): Promise<ApiUsageResponse> {\n return this.client.get<ApiUsageResponse>('/key');\n }\n}\n","/**\n * coingecko-pro — The most comprehensive CoinGecko API SDK for JavaScript\n * and TypeScript. Covers all Pro API and On-chain DEX (GeckoTerminal)\n * endpoints with full type safety.\n *\n * @module coingecko-pro\n *\n * @example\n * ```typescript\n * import { CoinGecko } from 'coingecko-pro';\n *\n * const cg = new CoinGecko({ apiKey: 'CG-xxx' });\n *\n * // Coin data\n * const btc = await cg.coins.getById('bitcoin');\n * const markets = await cg.coins.markets({ vs_currency: 'usd' });\n *\n * // On-chain DEX data (GeckoTerminal)\n * const trending = await cg.onchain.trendingPools();\n * const whales = await cg.onchain.topTraders('eth', '0x...');\n *\n * // Global & meta\n * const status = await cg.ping();\n * ```\n */\n\nimport { CoinGeckoClient, type CoinGeckoClientConfig } from './client.js';\nimport { CoinsEndpoints } from './endpoints/coins.js';\nimport { ExchangesEndpoints } from './endpoints/exchanges.js';\nimport { DerivativesEndpoints } from './endpoints/derivatives.js';\nimport { NftsEndpoints } from './endpoints/nfts.js';\nimport { OnchainEndpoints } from './endpoints/onchain.js';\nimport { GlobalEndpoints } from './endpoints/global.js';\nimport { TreasuryEndpoints } from './endpoints/treasury.js';\nimport { MetaEndpoints } from './endpoints/meta.js';\n\n/**\n * Main entry point for the CoinGecko Pro SDK.\n *\n * Instantiate once and access every API group through its dedicated namespace.\n * The underlying HTTP client handles caching, rate limiting, retries, and\n * timeout management automatically.\n *\n * @example\n * ```typescript\n * import { CoinGecko } from 'coingecko-pro';\n *\n * // Pro tier (higher rate limits, Pro-only endpoints)\n * const cg = new CoinGecko({ apiKey: 'CG-xxx' });\n *\n * // Free tier\n * const cg = new CoinGecko();\n *\n * // With full configuration\n * const cg = new CoinGecko({\n * apiKey: process.env.CG_API_KEY,\n * cacheTtl: 60_000,\n * maxRetries: 5,\n * rateLimit: 500,\n * timeout: 30_000,\n * onError: (url, err) => console.error(`[CoinGecko] ${url}`, err.message),\n * });\n * ```\n */\nexport class CoinGecko {\n /** Coin prices, market data, charts, OHLC, supply, categories, and contract lookups. */\n public readonly coins: CoinsEndpoints;\n\n /** Exchange listings, details, tickers, and volume charts. */\n public readonly exchanges: ExchangesEndpoints;\n\n /** Derivatives tickers and exchange data. */\n public readonly derivatives: DerivativesEndpoints;\n\n /** NFT collections, market data, charts, and tickers. */\n public readonly nfts: NftsEndpoints;\n\n /** On-chain DEX data (GeckoTerminal): pools, tokens, trades, OHLCV, top traders/holders. */\n public readonly onchain: OnchainEndpoints;\n\n /** Global market data, search, trending, exchange rates, and asset platforms. */\n public readonly global: GlobalEndpoints;\n\n /** Public treasury holdings, charts, and transaction history. */\n public readonly treasury: TreasuryEndpoints;\n\n private readonly meta: MetaEndpoints;\n\n /**\n * Creates a new CoinGecko SDK instance.\n *\n * @param config - Optional configuration for the underlying HTTP client.\n * See {@link CoinGeckoClientConfig} for all available options.\n */\n constructor(config?: CoinGeckoClientConfig) {\n const client = new CoinGeckoClient(config);\n this.coins = new CoinsEndpoints(client);\n this.exchanges = new ExchangesEndpoints(client);\n this.derivatives = new DerivativesEndpoints(client);\n this.nfts = new NftsEndpoints(client);\n this.onchain = new OnchainEndpoints(client);\n this.global = new GlobalEndpoints(client);\n this.treasury = new TreasuryEndpoints(client);\n this.meta = new MetaEndpoints(client);\n }\n\n /**\n * Checks the CoinGecko API server status.\n *\n * Use this as a lightweight connectivity and authentication test.\n *\n * @returns Object containing the server status message\n * (`{ gecko_says: \"(V3) To the Moon!\" }`).\n *\n * @example\n * ```typescript\n * const { gecko_says } = await cg.ping();\n * console.log(gecko_says); // \"(V3) To the Moon!\"\n * ```\n */\n async ping() {\n return this.meta.ping();\n }\n\n /**\n * Returns API key usage statistics and plan information.\n *\n * @remarks Requires a valid **Pro API key** (Analyst+ plan). Returns 401 on\n * free-tier or unauthenticated requests.\n *\n * @returns Usage data including plan name, rate limits, and remaining credits.\n *\n * @example\n * ```typescript\n * const usage = await cg.apiUsage();\n * console.log(usage.plan, usage.current_remaining_monthly_calls);\n * ```\n */\n async apiUsage() {\n return this.meta.apiUsage();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports — everything a consumer might need for tree-shaking or\n// standalone usage.\n// ---------------------------------------------------------------------------\n\nexport { CoinGeckoClient, type CoinGeckoClientConfig } from './client.js';\nexport { CoinGeckoError } from './errors.js';\n\n// Endpoint classes (for advanced usage / composition)\nexport { CoinsEndpoints } from './endpoints/coins.js';\nexport { ExchangesEndpoints } from './endpoints/exchanges.js';\nexport { DerivativesEndpoints } from './endpoints/derivatives.js';\nexport { NftsEndpoints } from './endpoints/nfts.js';\nexport { OnchainEndpoints } from './endpoints/onchain.js';\nexport { GlobalEndpoints } from './endpoints/global.js';\nexport { TreasuryEndpoints } from './endpoints/treasury.js';\nexport { MetaEndpoints } from './endpoints/meta.js';\n\n// All type definitions\nexport * from './types/index.js';\n"]}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "coingecko-pro",
3
+ "version": "0.1.0",
4
+ "description": "The most comprehensive CoinGecko API SDK — all 84 endpoints, Pro API + On-chain DEX, TypeScript-first, zero dependencies",
5
+ "author": "0xJesus",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./dist/index.cjs",
9
+ "module": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "require": "./dist/index.cjs"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "keywords": [
24
+ "coingecko",
25
+ "crypto",
26
+ "api",
27
+ "sdk",
28
+ "bitcoin",
29
+ "ethereum",
30
+ "defi",
31
+ "onchain",
32
+ "gecko-terminal",
33
+ "trading",
34
+ "market-data",
35
+ "web3",
36
+ "blockchain"
37
+ ],
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/0xJesus/coingecko-pro"
41
+ },
42
+ "scripts": {
43
+ "build": "tsup",
44
+ "test": "vitest run",
45
+ "test:watch": "vitest",
46
+ "lint": "tsc --noEmit",
47
+ "prepublishOnly": "npm run build"
48
+ },
49
+ "devDependencies": {
50
+ "tsup": "^8.0.0",
51
+ "typescript": "^5.5.0",
52
+ "vitest": "^2.0.0"
53
+ }
54
+ }