import { AcrossConfigStore } from "@across-protocol/contracts";
import * as utils from "@across-protocol/contracts/dist/test-utils";
import chai, { expect } from "chai";
import { Contract, providers } from "ethers";
import sinon from "sinon";
import winston from "winston";
import { AcrossConfigStoreClient as ConfigStoreClient } from "../../src/clients";
import { Deposit, DepositWithBlock, FillWithBlock, RelayData, SlowFillRequestWithBlock } from "../../src/interfaces";
import { Address, BigNumber, BigNumberish, toBN, toBNWei, toWei, utf8ToHex } from "../../src/utils";
import { SpokePoolDeploymentResult, SpyLoggerResult } from "../types";
declare const chaiAssert: Chai.AssertStatic;
export type SignerWithAddress = utils.SignerWithAddress;
export declare const getDepositParams: typeof utils.getDepositParams, getUpdatedV3DepositSignature: typeof utils.getUpdatedV3DepositSignature, modifyRelayHelper: typeof utils.modifyRelayHelper, randomAddress: typeof utils.randomAddress, zeroAddress: string;
export { buildPoolRebalanceLeafTree, buildPoolRebalanceLeaves, buildRelayerRefundTree, buildRelayerRefundLeaves, buildSlowRelayTree, buildV3SlowRelayTree, getParamType, } from "./MerkleLib.utils";
import { getContractFactory } from "./getContractFactory";
export { getContractFactory };
import { hubPoolFixture, deployHubPool } from "../fixtures/HubPool.Fixture";
import { spokePoolFixture, deploySpokePool } from "../fixtures/SpokePool.Fixture";
export { hubPoolFixture, deployHubPool, spokePoolFixture, deploySpokePool };
export { BigNumber, Contract, chai, chaiAssert, expect, sinon, toBN, toBNWei, toWei, utf8ToHex, winston };
export declare function deepEqualsWithBigNumber(x: unknown, y: unknown, omitKeys?: string[]): boolean;
export declare function assertPromiseError<T>(promise: Promise<T>, errMessage?: string): Promise<void>;
export declare function assertPromisePasses<T>(promise: Promise<T>): Promise<void>;
export declare function setupTokensForWallet(contractToApprove: utils.Contract, wallet: utils.SignerWithAddress, tokens: utils.Contract[], weth?: utils.Contract, seedMultiplier?: number): Promise<void>;
export declare function createSpyLogger(): SpyLoggerResult;
export declare function deploySpokePoolWithToken(fromChainId?: number): Promise<SpokePoolDeploymentResult>;
export declare function deployConfigStore(signer: utils.SignerWithAddress, tokensToAdd: utils.Contract[], maxL1TokensPerPoolRebalanceLeaf?: number, maxRefundPerRelayerRefundLeaf?: number, rateModel?: unknown, additionalChainIdIndices?: number[]): Promise<{
    configStore: AcrossConfigStore;
    deploymentBlock: number;
}>;
export declare function deployAndConfigureHubPool(signer: utils.SignerWithAddress, spokePools: {
    l2ChainId: number;
    spokePool: utils.Contract;
}[], finderAddress?: string, timerAddress?: string): Promise<{
    hubPool: utils.Contract;
    mockAdapter: utils.Contract;
    l1Token_1: utils.Contract;
    l1Token_2: utils.Contract;
    hubPoolDeploymentBlock: number;
}>;
export declare function enableRoutesOnHubPool(hubPool: utils.Contract, rebalanceRouteTokens: {
    destinationChainId: number;
    l1Token: utils.Contract;
    destinationToken: utils.Contract;
}[]): Promise<void>;
/**
 * Takes as input a body and returns a new object with the body and a message property. Used to appease the typescript
 * compiler when we want to return a type that doesn't have a message property.
 * @param body Typically a partial structure of a Deposit or Fill.
 * @returns A new object with the body and a message property.
 */
export declare function appendMessageToResult<T>(body: T): T & {
    message: string;
};
export declare function getLastBlockTime(provider: providers.Provider): Promise<number>;
export declare function addLiquidity(signer: utils.SignerWithAddress, hubPool: utils.Contract, l1Token: utils.Contract, amount: utils.BigNumber): Promise<void>;
export declare function deposit(spokePool: Contract, destinationChainId: number, signer: SignerWithAddress, inputToken: Address, inputAmount: BigNumber, outputToken: Address, outputAmount: BigNumber, opts?: {
    destinationChainId?: number;
    recipient?: Address;
    quoteTimestamp?: number;
    message?: string;
    fillDeadline?: number;
    exclusivityDeadline?: number;
    exclusiveRelayer?: Address;
}): Promise<DepositWithBlock>;
export declare function depositV3(spokePool: Contract, destinationChainId: number, signer: SignerWithAddress, inputToken: Address, inputAmount: BigNumber, outputToken: Address, outputAmount: BigNumber, opts?: {
    destinationChainId?: number;
    recipient?: Address;
    quoteTimestamp?: number;
    message?: string;
    fillDeadline?: number;
    exclusivityDeadline?: number;
    exclusiveRelayer?: Address;
}): Promise<DepositWithBlock>;
export declare function requestV3SlowFill(spokePool: Contract, relayData: RelayData, signer: SignerWithAddress): Promise<SlowFillRequestWithBlock>;
export declare function fillRelay(spokePool: Contract, _deposit: Omit<Deposit, "destinationChainId">, signer: SignerWithAddress, repayment?: {
    repaymentChainId: number;
    repaymentAddress: Address;
}): Promise<FillWithBlock>;
/**
 * Grabs the latest block number from the hardhat provider.
 * @returns The latest block number.
 */
export declare function getLastBlockNumber(): Promise<number>;
export declare function convertMockedConfigClient(_client: unknown): _client is ConfigStoreClient;
export declare function bigNumberFormatter(logEntry: winston.Logform.TransformableInfo): winston.Logform.TransformableInfo;
export declare function buildDepositForRelayerFeeTest(amount: BigNumberish, tokenSymbol: string, originChainId: number, toChainId: number): Deposit;
