import "@nomiclabs/hardhat-ethers";
import "@openzeppelin/hardhat-upgrades";
import hre from "hardhat";
import { BigNumber, Contract } from "ethers";
import type { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers";
import { zeroAddress } from "../constants";
export { zeroAddress };
/** V2-era relay data with string chain IDs / deposit IDs */
export interface ContractRelayData {
    depositor: string;
    recipient: string;
    destinationToken: string;
    amount: BigNumber;
    realizedLpFeePct: BigNumber;
    relayerFeePct: BigNumber;
    depositId: string;
    originChainId: string;
    destinationChainId: string;
    message: string;
}
export interface V3RelayData {
    depositor: string;
    recipient: string;
    exclusiveRelayer: string;
    inputToken: string;
    outputToken: string;
    inputAmount: BigNumber;
    outputAmount: BigNumber;
    originChainId: number;
    depositId: BigNumber;
    fillDeadline: number;
    exclusivityDeadline: number;
    message: string;
}
export interface V3RelayExecutionParams {
    relay: V3RelayData;
    relayHash: string;
    updatedOutputAmount: BigNumber;
    updatedRecipient: string;
    updatedMessage: string;
    repaymentChainId: number;
}
export interface SlowFill {
    relayData: ContractRelayData;
    payoutAdjustmentPct: BigNumber;
}
export interface V3SlowFill {
    relayData: V3RelayData;
    chainId: number;
    updatedOutputAmount: BigNumber;
}
export interface UpdatedRelayerFeeData {
    newRelayerFeePct: string;
    depositorMessageHash: string;
    depositorSignature: string;
}
export declare const enum FillType {
    FastFill = 0,
    ReplacedSlowFill = 1,
    SlowFill = 2
}
export declare const enum FillStatus {
    Unfilled = 0,
    RequestedSlowFill = 1,
    Filled = 2
}
export declare function getRelayHash(_depositor: string, _recipient: string, _depositId: number, _originChainId: number, _destinationChainId: number, _destinationToken: string, _amount?: BigNumber, _realizedLpFeePct?: BigNumber, _relayerFeePct?: BigNumber, _message?: string): {
    relayHash: string;
    relayData: ContractRelayData;
};
export declare function getV3RelayHash(relayData: V3RelayData, destChainId: number): string;
export declare function getLegacyV3RelayHash(relayData: V3RelayData, destChainId: number): string;
export declare function getDepositParams(args: {
    recipient?: string;
    originToken: string;
    amount: BigNumber;
    destinationChainId: number;
    relayerFeePct: BigNumber;
    quoteTimestamp: number;
    message?: string;
    maxCount?: BigNumber;
}): string[];
export declare function getFillRelayParams(_relayData: ContractRelayData, _maxTokensToSend: BigNumber, _repaymentChain?: number, _maxCount?: BigNumber): string[];
export declare function getFillRelayUpdatedFeeParams(_relayData: ContractRelayData, _maxTokensToSend: BigNumber, _updatedFee: BigNumber, _signature: string, _repaymentChain?: number, _updatedRecipient?: string, _updatedMessage?: string, _maxCount?: BigNumber): string[];
export declare function getExecuteSlowRelayParams(_depositor: string, _recipient: string, _destToken: string, _amount: BigNumber, _originChainId: number, _realizedLpFeePct: BigNumber, _relayerFeePct: BigNumber, _depositId: number, _relayerRefundId: number, _message: string, _payoutAdjustment: BigNumber, _proof: string[]): (string | string[])[];
export declare function modifyRelayHelper(modifiedRelayerFeePct: BigNumber, depositId: string, originChainId: string, depositor: SignerWithAddress, updatedRecipient: string, updatedMessage: string): Promise<{
    signature: string;
}>;
export declare function getUpdatedV3DepositSignature(depositor: SignerWithAddress, depositId: BigNumber, originChainId: number, updatedOutputAmount: BigNumber, updatedRecipient: string, updatedMessage: string): Promise<string>;
export declare function deployMockSpokePoolCaller(spokePool: Contract, rootBundleId: number, leaf: {
    amountToReturn: BigNumber;
    chainId: BigNumber;
    refundAmounts: BigNumber[];
    leafId: BigNumber;
    l2TokenAddress: string;
    refundAddresses: string[];
}, proof: string[]): Promise<Contract>;
/**
 * Deploys a SpokePool with associated tokens for testing.
 * This is a local implementation that uses our local getContractFactory
 * instead of the one from @across-protocol/contracts.
 */
export declare function deploySpokePool(ethers: typeof hre.ethers, spokePoolName?: string): Promise<{
    weth: Contract;
    erc20: Contract;
    spokePool: Contract;
    unwhitelistedErc20: Contract;
    destErc20: Contract;
    erc1271: Contract;
}>;
export declare const spokePoolFixture: () => Promise<{
    weth: Contract;
    erc20: Contract;
    spokePool: Contract;
    unwhitelistedErc20: Contract;
    destErc20: Contract;
    erc1271: Contract;
}>;
