import { ethers } from "ethers";
import { CHAIN_CONFIG } from "./config";
import { Config, SwapParams, TokensType } from "./types";
export declare class Client {
    private provider;
    private signer;
    private chain;
    constructor(privateKey: string, chain: string);
    getConfig(): Config;
    getProvider(): ethers.providers.JsonRpcProvider;
    getTokens(): {
        chainId: number;
        address: string;
        decimals: number;
        symbol: string;
        name: string;
        isToken: boolean;
        isNative: boolean;
        wrapped: boolean;
    }[] | {
        chainId: number;
        address: string;
        decimals: number;
        symbol: string;
        name: string;
        isToken: boolean;
        isNative: boolean;
        wrapped: boolean;
    }[] | {
        chainId: number;
        address: string;
        decimals: number;
        symbol: string;
        name: string;
        isToken: boolean;
        isNative: boolean;
        wrapped: boolean;
    }[] | {
        chainId: number;
        address: string;
        decimals: number;
        symbol: string;
        name: string;
        isToken: boolean;
        isNative: boolean;
        wrapped: boolean;
    }[] | {
        chainId: number;
        address: string;
        decimals: number;
        symbol: string;
        name: string;
        isToken: boolean;
        isNative: boolean;
        wrapped: boolean;
    }[] | {
        chainId: number;
        address: string;
        decimals: number;
        symbol: string;
        name: string;
        isToken: boolean;
        isNative: boolean;
        wrapped: boolean;
    }[] | {
        chainId: number;
        address: string;
        decimals: number;
        symbol: string;
        name: string;
        isToken: boolean;
        isNative: boolean;
        wrapped: boolean;
    }[];
    getPoolFactoryContract(): ethers.Contract;
    getQuoterContract(): ethers.Contract;
    getSwapRouterContract(): ethers.Contract;
    protected approveToken(tokenIn: TokensType, tokenABI: any, amountIn: number, wallet: ethers.Wallet, swapRouterAddress: string): Promise<string>;
    getPoolInfo(tokenIn: string, tokenOut: string): Promise<{
        poolContract: ethers.Contract;
        token0: any;
        token1: any;
        fee: any;
    }>;
    quoteSwap(tokenIn: string, tokenOut: string, amountIn: number, gasFee?: number): Promise<string>;
    protected executeSwap(params: SwapParams, explorerUrl: string): Promise<string>;
    swap(tokenIn: string, tokenOut: string, amountIn: number): Promise<{
        txHash: string;
        explorerUrl: string;
        quotedAmount: string;
    }>;
    protected addChainConfig(newChain: string, config: (typeof CHAIN_CONFIG)[keyof typeof CHAIN_CONFIG]): void;
    protected updateChainConfig(chain: string, updatedFields: Partial<(typeof CHAIN_CONFIG)[keyof typeof CHAIN_CONFIG]>): void;
    /**
     * Wrap ETH to WETH
     * @param amountInETH Amount of ETH to wrap
     * @returns Transaction hash and explorer URL
     */
    wrapETHToWETH(amountInETH: number): Promise<{
        txHash: string;
        explorerUrl: string;
    }>;
    unwrapWETHToETH(amountInWETH: number): Promise<{
        txHash: string;
        explorerUrl: string;
    }>;
    /**
     * Get balance of a token (native or ERC20)
     * @param tokenSymbol Token symbol (e.g., 'ETH', 'WETH', 'USDT')
     * @param address Optional address (defaults to signer's address)
     * @returns Balance in token decimals
     */
    getTokenBalance(tokenSymbol: string, address?: string): Promise<string>;
    /**
     * Get native token (ETH) balance for an address
     * @param address Optional address (defaults to signer's address)
     * @returns Balance in ETH
     */
    protected getNativeBalance(address?: string): Promise<string>;
    /**
     * Get ERC20 token balance for an address
     * @param tokenSymbol Token symbol (e.g., 'USDT', 'WETH')
     * @param address Optional address (defaults to signer's address)
     * @returns Balance in token decimals
     */
    protected getErcTokenBalance(tokenSymbol: string, address?: string): Promise<string>;
    /**
     * Get balances for multiple tokens at once
     * @param tokenSymbols Array of token symbols
     * @param address Optional address (defaults to signer's address)
     * @returns Object mapping token symbols to their balances
     */
    getMultipleTokenBalances(tokenSymbols: string[], address?: string): Promise<Record<string, string>>;
    /**
     * Check if an address has sufficient balance for a token
     * @param tokenSymbol Token symbol
     * @param requiredAmount Amount needed
     * @param address Optional address (defaults to signer's address)
     * @returns boolean indicating if balance is sufficient
     */
    hasEnoughBalance(tokenSymbol: string, requiredAmount: number, address?: string): Promise<boolean>;
}
