import { Address, GetLogsReturnType } from 'viem';
import { SplitsPublicClient } from '../types';
import { splitV2FactoryABI } from '../constants/abi/splitV2Factory';
import { splitMainPolygonAbi, splitV2ABI } from '../constants/abi';
import { SplitV2Versions } from '../subgraph/types';
/**
 * Retries a function n number of times with exponential backoff before giving up
 */
export declare function retryExponentialBackoff<T extends (...arg0: any[]) => any>(fn: T, args: Parameters<T>, maxTry: number, retryCount?: number): Promise<ReturnType<T>>;
export declare const isLogsPublicClient: (publicClient: SplitsPublicClient) => boolean;
export declare const isAlchemyPublicClient: (arg0: SplitsPublicClient) => boolean;
export declare const isInfuraPublicClient: (arg0: SplitsPublicClient) => boolean;
export declare const getLargestValidBlockRange: ({ maxBlockRange, publicClient, }: {
    maxBlockRange?: bigint;
    publicClient: SplitsPublicClient;
}) => Promise<bigint>;
type SplitCreatedEventType = (typeof splitV2FactoryABI)[8] | (typeof splitMainPolygonAbi)[14];
type SplitUpdatedEventType = (typeof splitV2ABI)[28] | (typeof splitMainPolygonAbi)[18];
export declare const getSplitCreateAndUpdateLogs: <SplitCreatedEventName extends SplitCreatedEventType["name"], SplitUpdatedEventName extends SplitUpdatedEventType["name"], SplitCreatedLogType extends GetLogsReturnType<SplitCreatedEventType, [SplitCreatedEventType], true, bigint, bigint, SplitCreatedEventName>[0] = GetLogsReturnType<SplitCreatedEventType, [SplitCreatedEventType], true, bigint, bigint, SplitCreatedEventName>[0], SplitUpdatedLogType extends GetLogsReturnType<SplitUpdatedEventType, [SplitUpdatedEventType], true, bigint, bigint, SplitUpdatedEventName>[0] = GetLogsReturnType<SplitUpdatedEventType, [SplitUpdatedEventType], true, bigint, bigint, SplitUpdatedEventName>[0]>({ splitAddress, publicClient, splitCreatedEvent, splitUpdatedEvent, addresses, startBlockNumber, defaultBlockRange, currentUpdateLog, currentEndBlockNumber, maxBlockRange, cachedBlocks, splitV2Version, }: {
    splitAddress: Address;
    publicClient: SplitsPublicClient;
    splitCreatedEvent: SplitCreatedEventType;
    splitUpdatedEvent: SplitUpdatedEventType;
    addresses: Address[];
    startBlockNumber: bigint;
    defaultBlockRange?: bigint;
    currentUpdateLog?: SplitUpdatedLogType;
    currentEndBlockNumber?: bigint;
    maxBlockRange?: bigint;
    cachedBlocks?: {
        createBlock?: bigint;
        updateBlock?: bigint;
        latestScannedBlock: bigint;
    };
    splitV2Version?: SplitV2Versions;
}) => Promise<{
    blockRange: bigint;
    createLog?: SplitCreatedLogType;
    updateLog?: SplitUpdatedLogType;
}>;
export declare const LOGS_SEARCH_BATCH_SIZE = 10;
export declare const searchLogs: <SplitCreatedEventName extends SplitCreatedEventType["name"], SplitUpdatedEventName extends SplitUpdatedEventType["name"], SplitCreatedLogType extends GetLogsReturnType<SplitCreatedEventType, [SplitCreatedEventType], true, bigint, bigint, SplitCreatedEventName>[0], SplitUpdatedLogType extends GetLogsReturnType<SplitUpdatedEventType, [SplitUpdatedEventType], true, bigint, bigint, SplitUpdatedEventName>[0]>({ formattedSplitAddress, publicClient, addresses, splitCreatedEvent, splitUpdatedEvent, startBlock, endBlock, defaultBlockRange, maxBlockRange, currentUpdateLog, cachedBlocks, splitV2Version, }: {
    formattedSplitAddress: Address;
    publicClient: SplitsPublicClient;
    splitCreatedEvent: SplitCreatedEventType;
    splitUpdatedEvent: SplitUpdatedEventType;
    addresses: Address[];
    startBlock: bigint;
    endBlock: bigint;
    defaultBlockRange?: bigint;
    currentUpdateLog?: SplitUpdatedLogType;
    maxBlockRange?: bigint;
    cachedBlocks?: {
        createBlock: bigint;
        updateBlock?: bigint;
        latestScannedBlock: bigint;
    };
    splitV2Version?: SplitV2Versions;
}) => Promise<{
    blockRange: bigint;
    createLog?: SplitCreatedLogType;
    updateLog?: SplitUpdatedLogType;
}>;
export {};
