import { Logger } from 'pino';
import { z } from 'zod';
import { Address } from '@hyperlane-xyz/utils';
import type { ChainMetadataManager } from '../../metadata/ChainMetadataManager.js';
import { MultiProvider } from '../../providers/MultiProvider.js';
import type { ChainNameOrId } from '../../types.js';
import { GetEventLogsResponse } from './types.js';
export type EvmEventLogsReaderConfig = {
    chain: ChainNameOrId;
    useRPC?: boolean;
    paginationBlockRange?: number;
};
export declare const GetLogByTopicOptionsSchema: z.ZodObject<{
    eventTopic: z.ZodEffects<z.ZodString, string, string>;
    contractAddress: z.ZodString;
    fromBlock: z.ZodOptional<z.ZodNumber>;
    toBlock: z.ZodOptional<z.ZodNumber>;
}, "strip", z.ZodTypeAny, {
    contractAddress: string;
    eventTopic: string;
    fromBlock?: number | undefined;
    toBlock?: number | undefined;
}, {
    contractAddress: string;
    eventTopic: string;
    fromBlock?: number | undefined;
    toBlock?: number | undefined;
}>;
export declare const RequiredGetLogByTopicOptionsSchema: z.ZodObject<{
    eventTopic: z.ZodEffects<z.ZodString, string, string>;
    contractAddress: z.ZodString;
    fromBlock: z.ZodNumber;
    toBlock: z.ZodNumber;
}, "strip", z.ZodTypeAny, {
    fromBlock: number;
    toBlock: number;
    contractAddress: string;
    eventTopic: string;
}, {
    fromBlock: number;
    toBlock: number;
    contractAddress: string;
    eventTopic: string;
}>;
type GetLogByTopicOptions = z.infer<typeof GetLogByTopicOptionsSchema>;
type RequiredGetLogByTopicOptions = z.infer<typeof RequiredGetLogByTopicOptionsSchema>;
interface IEvmEventLogsReaderStrategy {
    getContractDeploymentBlockNumber(address: Address): Promise<number>;
    getContractLogs(address: RequiredGetLogByTopicOptions): Promise<GetEventLogsResponse[]>;
}
export declare class EvmEtherscanLikeEventLogsReader implements IEvmEventLogsReaderStrategy {
    protected readonly chain: ChainNameOrId;
    protected readonly config: Awaited<ReturnType<ChainMetadataManager['getExplorerApi']>>;
    protected readonly multiProvider: MultiProvider;
    constructor(chain: ChainNameOrId, config: Awaited<ReturnType<ChainMetadataManager['getExplorerApi']>>, multiProvider: MultiProvider);
    getContractDeploymentBlockNumber(address: string): Promise<number>;
    getContractLogs(options: RequiredGetLogByTopicOptions): Promise<GetEventLogsResponse[]>;
}
export declare class EvmRpcEventLogsReader implements IEvmEventLogsReaderStrategy {
    protected readonly chain: ChainNameOrId;
    protected readonly config: {
        paginationBlockRange?: number;
    };
    protected readonly multiProvider: MultiProvider;
    constructor(chain: ChainNameOrId, config: {
        paginationBlockRange?: number;
    }, multiProvider: MultiProvider);
    getContractDeploymentBlockNumber(address: string): Promise<number>;
    getContractLogs(options: RequiredGetLogByTopicOptions): Promise<GetEventLogsResponse[]>;
}
export declare class EvmEventLogsReader {
    protected readonly config: EvmEventLogsReaderConfig;
    protected readonly multiProvider: MultiProvider;
    protected logReaderStrategy: IEvmEventLogsReaderStrategy;
    protected readonly logger: Logger;
    protected fallbackLogReaderStrategy?: IEvmEventLogsReaderStrategy | undefined;
    private deploymentBlockCache;
    protected constructor(config: EvmEventLogsReaderConfig, multiProvider: MultiProvider, logReaderStrategy: IEvmEventLogsReaderStrategy, logger: Logger, fallbackLogReaderStrategy?: IEvmEventLogsReaderStrategy | undefined);
    static fromConfig(config: EvmEventLogsReaderConfig, multiProvider: MultiProvider, logger?: Logger): EvmEventLogsReader;
    getLogsByTopic(options: GetLogByTopicOptions): Promise<GetEventLogsResponse[]>;
    private getDeploymentBlock;
    private getLogsByTopicWithStrategy;
}
export {};
//# sourceMappingURL=EvmEventLogsReader.d.ts.map