import { Contract, providers, Signer, utils as ethersUtils } from "ethers";
import { Multicall3 } from "./abi/typechain";
type Provider = providers.Provider;
type BlockTag = providers.BlockTag;
type Result = ethersUtils.Result;
export type Call3 = {
    contract: Contract;
    method: string;
    args?: any[];
};
export declare function getMulticallAddress(chainId: number): string | undefined;
export declare function getMulticall3(chainId: number, signerOrProvider: Signer | Provider): Multicall3 | undefined;
export declare function aggregate(multicall3: Contract, calls: Call3[], blockTag?: BlockTag): Promise<Result[]>;
/**
 * Note that this function behaves unexpectedly on Arbitrum chains, where block.number
 * corresponds to the approximate block number of the underlying chain.
 */
export declare function blockAndAggregate(multicall3: Contract, calls: Call3[], blockTag?: BlockTag): Promise<{
    blockNumber: number;
    returnData: Result[];
}>;
/**
 * Deploy a Multicall3 instance.
 * Guidance: https://github.com/mds1/multicall3?tab=readme-ov-file#new-deployments
 * @param signer An Ethers Signer instance with at least 0.1 ETH.
 */
export declare function deploy(signer: Signer): Promise<boolean>;
export {};
