import { CallOverrides, PopulatedTransaction } from "@ethersproject/contracts";
import { TransactionResponse } from "@ethersproject/providers";
import { ChainId } from "../chain";
import { ServiceInterface } from "../common";
import { Address, Integer, TokenAllowance, TokenMetadata, TypedMap, Usdc } from "../types";
import { Balance, Icon, IconMap, Token } from "../types";
export declare class TokenInterface<C extends ChainId> extends ServiceInterface<C> {
    private cachedFetcherSupported;
    /**
     * Get exchange rate between two tokens.
     * @param from
     * @param to
     * @returns exchange rate
     */
    price(from: Address, to: Address): Promise<Integer>;
    /**
     * Get the suggested Usdc exchange rate for an token.
     * @param token
     * @param overrides
     * @returns Usdc exchange rate (6 decimals)
     */
    priceUsdc<T extends Address>(token: T, overrides?: CallOverrides): Promise<Usdc>;
    /**
     * Get the suggested Usdc exchange rate for list of tokens.
     * @param tokens
     * @param overrides
     * @returns Usdc exchange rate map (6 decimals)
     */
    priceUsdc<T extends Address>(tokens: T[], overrides?: CallOverrides): Promise<TypedMap<T, Usdc>>;
    /**
     * Fetch token balance for a particular account and token addresses.
     *
     * @param account user wallet address
     * @param tokenAddresses list of token addresses
     *
     * @returns list of balances for the supported tokens
     */
    balances(account: Address, tokenAddresses?: Address[]): Promise<Balance[]>;
    /**
     * Fetch all the tokens supported along with some basic metadata.
     * @returns list of tokens supported.
     */
    supported(): Promise<Token[]>;
    /**
     * TODO: Should get a single token directly instead of filtering
     * @param address then token address
     * @returns the token
     */
    findByAddress(address: Address): Promise<Token | undefined>;
    /**
     * Fetch the token amount that spender is allowed to spend on behalf of owner
     * @param ownerAddress
     * @param tokenAddress
     * @param spenderAddress
     * @returns TokenAllowance
     */
    allowance(ownerAddress: Address, tokenAddress: Address, spenderAddress: Address): Promise<TokenAllowance>;
    /**
     * Returns the populated transaction to approve the token amount that spender is allowed to spend on behalf of owner
     * @param ownerAddress
     * @param tokenAddress
     * @param spenderAddress
     * @param amount
     * @param overrides
     * @returns PopulatedTransaction
     */
    populateApprove(ownerAddress: Address, tokenAddress: Address, spenderAddress: Address, amount: Integer, overrides?: CallOverrides): Promise<PopulatedTransaction>;
    /**
     * Approve the token amount that spender is allowed to spend on behalf of owner
     * @param ownerAddress
     * @param tokenAddress
     * @param spenderAddress
     * @param amount
     * @param overrides
     * @returns TransactionResponse
     */
    approve(ownerAddress: Address, tokenAddress: Address, spenderAddress: Address, amount: Integer, overrides?: CallOverrides): Promise<TransactionResponse>;
    /**
     * Fetches supported zapper tokens and sets their icon
     * @returns zapper tokens with icons
     */
    private getZapperTokensWithIcons;
    /**
     * Get an icon url for a particular address.
     * @param address
     */
    icon<T extends Address>(address: T): Icon;
    /**
     * Get a map of icons for a list of addresses.
     * @param addresses
     */
    icon<T extends Address>(addresses: T[]): IconMap<T>;
    private cachedFetcher;
    metadata(addresses?: Address[]): Promise<TokenMetadata[]>;
}
