import DataLoader from 'dataloader';
import { Contract } from 'ethers';
import { FunctionFragment } from 'ethers/lib/utils';
import { Multicall } from '../contract/contracts';
import { IMulticallWrapper } from './multicall.interface';
export declare type ContractCall = {
    fragment: FunctionFragment;
    address: string;
    params: any[];
    stack?: string;
};
declare type TargetContract = Pick<Contract, 'functions' | 'interface' | 'callStatic' | 'address'>;
export declare const isMulticallUnderlyingError: (err: Error) => boolean;
export declare type MulticallCallbackHooks = {
    beforeCallHook?: (calls: ContractCall[], callRequests: Multicall.CallStruct[]) => void;
};
export declare class EthersMulticall implements IMulticallWrapper {
    private multicall;
    private dataLoader;
    private beforeCallHook?;
    constructor(multicall: Multicall, dataLoaderOptions?: DataLoader.Options<ContractCall, any>, { beforeCallHook }?: MulticallCallbackHooks);
    get contract(): Multicall;
    private doCalls;
    wrap<T extends TargetContract>(contract: T): T;
}
export default EthersMulticall;
