import type { Address } from 'abitype';
/**
 * A token created by {@link defineToken}: callable with a chain id to produce a
 * chain-specific token config, and exposing the token metadata
 * (`currency`, `decimals`, `name`, `popular`, `symbol`) and the full
 * `addresses` map.
 */
export type Token<token extends defineToken.Parameters = defineToken.Parameters> = defineToken.ReturnType<token>;
/** Collection of tokens to declare on a Client. */
export type Tokens = readonly Token[];
/** A {@link Token} resolved to a specific chain id. */
export type ResolvedToken = {
    /** Token contract address. */
    address: Address;
    /** Token currency denomination. */
    currency?: string | undefined;
    /** Token decimals, used to parse human-readable `amount` strings. */
    decimals: number;
    /** Token name. */
    name?: string | undefined;
    /** Whether the token should be treated as popular in token lists. */
    popular?: boolean | undefined;
    /** Token symbol. */
    symbol?: string | undefined;
};
/**
 * Creates a token from shared metadata (`currency`, `decimals`, `name`,
 * `popular`, `symbol`) and a map of per-chain contract `addresses`. The
 * returned value is callable with a chain id to produce a chain-specific token
 * config while also exposing the metadata and the full `addresses` map.
 *
 * @param token - {@link defineToken.Parameters}
 * @returns The token. {@link defineToken.ReturnType}
 *
 * @example
 * ```ts
 * import { defineToken } from 'viem/tokens'
 *
 * const usdc = defineToken({
 *   addresses: {
 *     1: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
 *     8453: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
 *   },
 *   currency: 'USD',
 *   decimals: 6,
 *   name: 'USD Coin',
 *   popular: true,
 *   symbol: 'USDC',
 * })
 *
 * usdc(1)
 * // {
 * //   address: '0xA0b8…48',
 * //   currency: 'USD',
 * //   decimals: 6,
 * //   name: 'USD Coin',
 * //   popular: true,
 * //   symbol: 'USDC',
 * // }
 *
 * usdc.addresses[8453]
 * // '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
 * ```
 */
export declare function defineToken<const token extends defineToken.Parameters>(token: token): defineToken.ReturnType<token>;
export declare namespace defineToken {
    type ParameterValue<token extends Parameters, key extends keyof Parameters> = token extends {
        [_ in key]?: infer value;
    } ? value : undefined;
    export type Parameters<addresses extends Record<number, Address> = Record<number, Address>> = {
        /** Token contract addresses, keyed by chain id. */
        addresses: addresses;
        /** Currency denomination of the token (e.g. `'USD'`). */
        currency?: string | undefined;
        /** Number of decimals the token uses. */
        decimals: number;
        /** Human-readable name of the token. */
        name?: string | undefined;
        /** Whether the token should be treated as popular in token lists. */
        popular?: boolean | undefined;
        /** Ticker symbol of the token. */
        symbol?: string | undefined;
    };
    export type ReturnType<token extends Parameters = Parameters> = {
        /**
         * Resolves the token config (`address`, `currency`, `decimals`, `name`,
         * `popular`, `symbol`) for a chain id.
         */
        <chainId extends keyof token['addresses']>(chainId: chainId): {
            address: token['addresses'][chainId];
            currency: ParameterValue<token, 'currency'>;
            decimals: token['decimals'];
            name: ParameterValue<token, 'name'>;
            popular: ParameterValue<token, 'popular'>;
            symbol: ParameterValue<token, 'symbol'>;
        };
        /** Token contract addresses, keyed by chain id. */
        addresses: token['addresses'];
        /** Currency denomination of the token (e.g. `'USD'`). */
        currency: ParameterValue<token, 'currency'>;
        /** Number of decimals the token uses. */
        decimals: token['decimals'];
        /** Human-readable name of the token. */
        name: ParameterValue<token, 'name'>;
        /** Whether the token should be treated as popular in token lists. */
        popular: ParameterValue<token, 'popular'>;
        /** Ticker symbol of the token. */
        symbol: ParameterValue<token, 'symbol'>;
    };
    export {};
}
//# sourceMappingURL=defineToken.d.ts.map