import { ChainForkConfig } from "@lodestar/config";
import { CachedBeaconStateAllForks } from "@lodestar/state-transition";
import { Logger } from "@lodestar/utils";
import { IBeaconDb } from "../db/index.js";
import { Metrics } from "../metrics/index.js";
import { Eth1DataAndDeposits, IEth1Provider } from "./interface.js";
import { Eth1Options } from "./options.js";
export type Eth1DepositDataTrackerModules = {
    config: ChainForkConfig;
    db: IBeaconDb;
    metrics: Metrics | null;
    logger: Logger;
    signal: AbortSignal;
};
/**
 * Main class handling eth1 data fetching, processing and storing
 * Upon instantiation, starts fetching deposits and blocks at regular intervals
 */
export declare class Eth1DepositDataTracker {
    private readonly eth1Provider;
    private config;
    private logger;
    private signal;
    private readonly metrics;
    private depositsCache;
    private eth1DataCache;
    private lastProcessedDepositBlockNumber;
    /** Dynamically adjusted follow distance */
    private eth1FollowDistance;
    /** Dynamically adjusted batch size to fetch deposit logs */
    private eth1GetBlocksBatchSizeDynamic;
    /** Dynamically adjusted batch size to fetch deposit logs */
    private eth1GetLogsBatchSizeDynamic;
    private readonly forcedEth1DataVote;
    /** To stop `runAutoUpdate()` in addition to AbortSignal */
    private stopPolling;
    constructor(opts: Eth1Options, { config, db, metrics, logger, signal }: Eth1DepositDataTrackerModules, eth1Provider: IEth1Provider);
    isPollingEth1Data(): boolean;
    stopPollingEth1Data(): void;
    /**
     * Return eth1Data and deposits ready for block production for a given state
     */
    getEth1DataAndDeposits(state: CachedBeaconStateAllForks): Promise<Eth1DataAndDeposits>;
    /**
     * Returns an eth1Data vote for a given state.
     * Requires internal caches to be updated regularly to return good results
     */
    private getEth1Data;
    /**
     * Returns deposits to be included for a given state and eth1Data vote.
     * Requires internal caches to be updated regularly to return good results
     */
    private getDeposits;
    /**
     * Abortable async setInterval that runs its callback once at max between `ms` at minimum
     */
    private runAutoUpdate;
    /**
     * Update the deposit and block cache, returning an error if either fail
     * @returns true if it has catched up to the remote follow block
     */
    private update;
    /**
     * Fetch deposit events from remote eth1 node up to follow-distance block
     * @returns true if it has catched up to the remote follow block
     */
    private updateDepositCache;
    /**
     * Fetch block headers from a remote eth1 node up to follow-distance block
     *
     * depositRoot and depositCount are inferred from already fetched deposits.
     * Calling get_deposit_root() and the smart contract for a non-latest block requires an
     * archive node, something most users don't have access too.
     * @returns true if it has catched up to the remote follow timestamp
     */
    private updateBlockCache;
    private getFromBlockToFetch;
    private getLastProcessedDepositBlockNumber;
}
//# sourceMappingURL=eth1DepositDataTracker.d.ts.map