/**
 * Shared CoinGecko HTTP client + short-TTL cache.
 *
 * Carved out of the original `src/trading/data.ts` so every CoinGecko
 * fetcher (price, ohlcv, trending, markets) shares the same rate-limit
 * cooldown, user-agent, timeout, and in-memory cache.
 */
import type { ProviderError } from '../standard-models.js';
export declare const TICKER_TO_ID: Record<string, string>;
/** For tests + cache invalidation. */
export declare function clearIdResolutionCache(): void;
/**
 * Resolve a ticker to its CoinGecko id. Synchronous — checks the static
 * map and the dynamic cache. Falls through to lowercase as a final guess.
 *
 * Use this from `transformData` (which is sync). Use `resolveProviderIdAsync`
 * from `fetchData` to populate the cache before the sync read happens.
 */
export declare function resolveProviderId(ticker: string): string;
/**
 * Like `resolveProviderId`, but on a static-map miss, hits CoinGecko's
 * `/search?query=` to find the canonical id. Caches the result for 7 days
 * so `resolveProviderId` (sync) can read it back during `transformData`.
 *
 * Why not always async: `transformData` is part of the Fetcher contract
 * and is intentionally sync. `fetchData` is async, runs first, and is the
 * right place to do network resolution. The two share state via the cache.
 */
export declare function resolveProviderIdAsync(ticker: string): Promise<string>;
export declare function cached<T>(key: string, ttlMs: number, fn: () => Promise<T>): Promise<T>;
/** For tests: wipe every cached entry. */
export declare function clearCache(): void;
export declare function coingeckoGet(path: string): Promise<unknown | ProviderError>;
export declare const TTL: {
    readonly price: number;
    readonly ohlcv: number;
    readonly trending: number;
    readonly markets: number;
};
