import { Contract, PopulatedTransaction, providers } from "ethers";
import { Deposit, FillStatus, FillWithBlock, RelayData, SpeedUpCommon } from "../../interfaces";
import { BigNumber, EvmAddress, Address } from "../../utils";
type BlockTag = providers.BlockTag;
type ProtoFill = Omit<RelayData, "recipient" | "outputToken"> & Pick<Deposit, "speedUpSignature"> & Partial<SpeedUpCommon> & {
    destinationChainId: number;
    recipient: EvmAddress;
    outputToken: EvmAddress;
};
/**
 * @param spokePool SpokePool Contract instance.
 * @param relayData RelayData instance, supplemented with destinationChainId
 * @param repaymentChainId Optional repaymentChainId (defaults to destinationChainId).
 * @returns An Ethers UnsignedTransaction instance.
 */
export declare function populateV3Relay(spokePool: Contract, relayData: ProtoFill, repaymentAddress: Address, repaymentChainId?: number): Promise<PopulatedTransaction>;
/**
 * Retrieves the time from the SpokePool contract at a particular block.
 * @returns The time at the specified block tag.
 */
export declare function getTimeAt(spokePool: Contract, blockNumber: number): Promise<number>;
/**
 * Retrieves the chain time at a particular block.
 * @note This should be the same as getTimeAt() but can differ in test. These two functions should be consolidated.
 * @returns The chain time at the specified block tag.
 */
export declare function getTimestampForBlock(provider: providers.Provider, blockNumber: number): Promise<number>;
/**
 * Return maximum of fill deadline buffer at start and end of block range.
 * @param spokePool SpokePool contract instance
 * @param startBlock start block
 * @param endBlock end block
 * @returns maximum of fill deadline buffer at start and end block
 */
export declare function getMaxFillDeadlineInRange(spokePool: Contract, startBlock: number, endBlock: number): Promise<number>;
/**
 * Finds the deposit id at a specific block number.
 * @param blockTag The block number to search for the deposit ID at.
 * @returns The deposit ID.
 */
export declare function getDepositIdAtBlock(contract: Contract, blockTag: number): Promise<BigNumber>;
export declare function findDepositBlock(spokePool: Contract, depositId: BigNumber, lowBlock: number, highBlock?: number): Promise<number | undefined>;
/**
 * Find the amount filled for a deposit at a particular block.
 * @param spokePool SpokePool contract instance.
 * @param relayData Deposit information that is used to complete a fill.
 * @param blockTag Block tag (numeric or "latest") to query at.
 * @returns The amount filled for the specified deposit at the requested block (or latest).
 */
export declare function relayFillStatus(spokePool: Contract, relayData: RelayData, blockTag?: BlockTag, destinationChainId?: number): Promise<FillStatus>;
export declare function fillStatusArray(spokePool: Contract, relayData: RelayData[], blockTag?: BlockTag): Promise<(FillStatus | undefined)[]>;
/**
 * Find the block at which a fill was completed.
 * @todo After SpokePool upgrade, this function can be simplified to use the FillStatus enum.
 * @param spokePool SpokePool contract instance.
 * @param relayData Deposit information that is used to complete a fill.
 * @param lowBlockNumber The lower bound of the search. Must be bounded by SpokePool deployment.
 * @param highBlocknumber Optional upper bound for the search.
 * @returns The block number at which the relay was completed, or undefined.
 */
export declare function findFillBlock(spokePool: Contract, relayData: RelayData, lowBlockNumber: number, highBlockNumber?: number): Promise<number | undefined>;
export declare function findFillEvent(spokePool: Contract, relayData: RelayData, lowBlockNumber: number, highBlockNumber?: number): Promise<FillWithBlock | undefined>;
export {};
