import { Provider, BlockTag, TransactionResponse, TransactionRequest } from '@ethersproject/abstract-provider';
import { Signer } from '@ethersproject/abstract-signer';
import { ethers, BigNumber, Overrides, CallOverrides, PayableOverrides } from 'ethers';
import { BedrockOutputData, BedrockCrossChainMessageProof } from '@tokamak-network/core-utils';
import { OEContracts, OEContractsLike, MessageLike, MessageRequestLike, TransactionLike, AddressLike, NumberLike, SignerOrProviderLike, CrossChainMessage, CrossChainMessageRequest, CrossChainMessageProof, MessageDirection, MessageStatus, TokenBridgeMessage, MessageReceipt, BridgeAdapterData, BridgeAdapters, StateRoot, StateRootBatch, IBridgeAdapter, ProvenWithdrawal, LowLevelMessage } from './interfaces';
import { DeepPartial } from './utils';
export declare class CrossChainMessenger {
    l1SignerOrProvider: Signer | Provider;
    l2SignerOrProvider: Signer | Provider;
    l1ChainId: number;
    l2ChainId: number;
    nativeTokenAddress: string;
    contracts: OEContracts;
    bridges: BridgeAdapters;
    depositConfirmationBlocks: number;
    l1BlockTimeSeconds: number;
    bedrock: boolean;
    private _outputCache;
    constructor(opts: {
        l1SignerOrProvider: SignerOrProviderLike;
        l2SignerOrProvider: SignerOrProviderLike;
        l1ChainId: NumberLike;
        l2ChainId: NumberLike;
        nativeTokenAddress?: AddressLike;
        depositConfirmationBlocks?: NumberLike;
        l1BlockTimeSeconds?: NumberLike;
        contracts?: DeepPartial<OEContractsLike>;
        bridges?: BridgeAdapterData;
        bedrock?: boolean;
    });
    get l1Provider(): Provider;
    get l2Provider(): Provider;
    get l1Signer(): Signer;
    get l2Signer(): Signer;
    fpac(): Promise<boolean>;
    getMessagesByTransaction(transaction: TransactionLike, opts?: {
        direction?: MessageDirection;
    }): Promise<CrossChainMessage[]>;
    toBedrockCrossChainMessage(message: MessageLike, messageIndex?: number): Promise<CrossChainMessage>;
    toLowLevelMessage(message: MessageLike, messageIndex?: number): Promise<LowLevelMessage>;
    getBridgeForTokenPair(l1Token: AddressLike, l2Token: AddressLike): Promise<IBridgeAdapter>;
    getDepositsByAddress(address: AddressLike, opts?: {
        fromBlock?: BlockTag;
        toBlock?: BlockTag;
    }): Promise<TokenBridgeMessage[]>;
    getWithdrawalsByAddress(address: AddressLike, opts?: {
        fromBlock?: BlockTag;
        toBlock?: BlockTag;
    }): Promise<TokenBridgeMessage[]>;
    toCrossChainMessage(message: MessageLike, messageIndex?: number): Promise<CrossChainMessage>;
    getMessageStatus(message: MessageLike, messageIndex?: number, fromBlockOrBlockHash?: BlockTag, toBlockOrBlockHash?: BlockTag): Promise<MessageStatus>;
    getMessageReceipt(message: MessageLike, messageIndex?: number, fromBlockOrBlockHash?: BlockTag, toBlockOrHash?: BlockTag): Promise<MessageReceipt>;
    waitForMessageReceipt(message: MessageLike, opts?: {
        fromBlockOrBlockHash?: BlockTag;
        toBlockOrHash?: BlockTag;
        confirmations?: number;
        pollIntervalMs?: number;
        timeoutMs?: number;
    }, messageIndex?: number): Promise<MessageReceipt>;
    waitForMessageStatus(message: MessageLike, status: MessageStatus, opts?: {
        fromBlockOrBlockHash?: BlockTag;
        toBlockOrBlockHash?: BlockTag;
        pollIntervalMs?: number;
        timeoutMs?: number;
    }, messageIndex?: number): Promise<void>;
    estimateL2MessageGasLimit(message: MessageRequestLike, opts?: {
        bufferPercent?: number;
        from?: string;
    }, messageIndex?: number): Promise<BigNumber>;
    estimateMessageWaitTimeSeconds(message: MessageLike, messageIndex?: number, fromBlockOrBlockHash?: BlockTag, toBlockOrBlockHash?: BlockTag): Promise<number>;
    getChallengePeriodSeconds(): Promise<number>;
    getProvenWithdrawal(withdrawalHash: string): Promise<ProvenWithdrawal | null>;
    isValidOutputRoot(outputRoot: string, l2BlockNumber: number): Promise<boolean>;
    getMessageBedrockOutput(message: MessageLike, messageIndex?: number): Promise<BedrockOutputData | null>;
    getMessageStateRoot(message: MessageLike, messageIndex?: number): Promise<StateRoot | null>;
    getStateBatchAppendedEventByBatchIndex(batchIndex: number): Promise<ethers.Event | null>;
    getStateBatchAppendedEventByTransactionIndex(transactionIndex: number): Promise<ethers.Event | null>;
    getStateRootBatchByTransactionIndex(transactionIndex: number): Promise<StateRootBatch | null>;
    getMessageProof(message: MessageLike, messageIndex?: number): Promise<CrossChainMessageProof>;
    getBedrockMessageProof(message: MessageLike, messageIndex?: number): Promise<BedrockCrossChainMessageProof>;
    sendMessage(message: CrossChainMessageRequest, opts?: {
        signer?: Signer;
        l2GasLimit?: NumberLike;
        overrides?: Overrides;
    }): Promise<TransactionResponse>;
    resendMessage(message: MessageLike, messageGasLimit: NumberLike, opts?: {
        signer?: Signer;
        overrides?: Overrides;
    }): Promise<TransactionResponse>;
    proveMessage(message: MessageLike, opts?: {
        signer?: Signer;
        overrides?: Overrides;
    }, messageIndex?: number): Promise<TransactionResponse>;
    finalizeMessage(message: MessageLike, opts?: {
        signer?: Signer;
        overrides?: PayableOverrides;
    }, messageIndex?: number): Promise<TransactionResponse>;
    bridgeETH(amount: NumberLike, opts?: {
        recipient?: AddressLike;
        signer?: Signer;
        l2GasLimit?: NumberLike;
        overrides?: Overrides;
    }): Promise<TransactionResponse>;
    withdrawETH(amount: NumberLike, opts?: {
        recipient?: AddressLike;
        signer?: Signer;
        overrides?: Overrides;
    }): Promise<TransactionResponse>;
    bridgeNativeToken(amount: NumberLike, opts?: {
        recipient?: AddressLike;
        signer?: Signer;
        l2GasLimit?: NumberLike;
        overrides?: Overrides;
    }): Promise<TransactionResponse>;
    withdrawNativeToken(amount: NumberLike, opts?: {
        recipient?: AddressLike;
        signer?: Signer;
        overrides?: Overrides;
    }): Promise<TransactionResponse>;
    approveNativeToken(amount: NumberLike, opts?: {
        signer?: Signer;
        overrides?: Overrides;
    }): Promise<TransactionResponse>;
    approval(l1Token: AddressLike, l2Token: AddressLike, opts?: {
        signer?: Signer;
    }): Promise<BigNumber>;
    approveERC20(l1Token: AddressLike, l2Token: AddressLike, amount: NumberLike, opts?: {
        signer?: Signer;
        overrides?: Overrides;
    }): Promise<TransactionResponse>;
    bridgeERC20(l1Token: AddressLike, l2Token: AddressLike, amount: NumberLike, opts?: {
        recipient?: AddressLike;
        signer?: Signer;
        l2GasLimit?: NumberLike;
        overrides?: CallOverrides;
    }): Promise<TransactionResponse>;
    withdrawERC20(l1Token: AddressLike, l2Token: AddressLike, amount: NumberLike, opts?: {
        recipient?: AddressLike;
        signer?: Signer;
        overrides?: Overrides;
    }): Promise<TransactionResponse>;
    populateTransaction: {
        sendMessage: (message: CrossChainMessageRequest, opts?: {
            l2GasLimit?: NumberLike;
            overrides?: Overrides;
        }) => Promise<TransactionRequest>;
        resendMessage: (message: MessageLike, messageGasLimit: NumberLike, opts?: {
            overrides?: Overrides;
        }, messageIndex?: number) => Promise<TransactionRequest>;
        proveMessage: (message: MessageLike, opts?: {
            overrides?: PayableOverrides;
        }, messageIndex?: number) => Promise<TransactionRequest>;
        finalizeMessage: (message: MessageLike, opts?: {
            overrides?: PayableOverrides;
        }, messageIndex?: number) => Promise<TransactionRequest>;
        bridgeETH: (amount: NumberLike, opts?: {
            recipient?: AddressLike;
            l2GasLimit?: NumberLike;
            overrides?: CallOverrides;
        }, isEstimatingGas?: boolean) => Promise<TransactionRequest>;
        withdrawETH: (amount: NumberLike, opts?: {
            recipient?: AddressLike;
            overrides?: Overrides;
        }) => Promise<TransactionRequest>;
        bridgeNativeToken: (amount: NumberLike, opts?: {
            recipient?: AddressLike;
            l2GasLimit?: NumberLike;
            overrides?: CallOverrides;
        }, isEstimatingGas?: boolean) => Promise<TransactionRequest>;
        withdrawNativeToken: (amount: NumberLike, opts?: {
            recipient?: AddressLike;
            overrides?: Overrides;
        }) => Promise<TransactionRequest>;
        approveNativeToken: (amount: NumberLike, opts?: {
            overrides?: Overrides;
        }) => Promise<TransactionRequest>;
        approveERC20: (l1Token: AddressLike, l2Token: AddressLike, amount: NumberLike, opts?: {
            overrides?: Overrides;
        }) => Promise<TransactionRequest>;
        bridgeERC20: (l1Token: AddressLike, l2Token: AddressLike, amount: NumberLike, opts?: {
            recipient?: AddressLike;
            l2GasLimit?: NumberLike;
            overrides?: CallOverrides;
        }, isEstimatingGas?: boolean) => Promise<TransactionRequest>;
        withdrawERC20: (l1Token: AddressLike, l2Token: AddressLike, amount: NumberLike, opts?: {
            recipient?: AddressLike;
            overrides?: Overrides;
        }) => Promise<TransactionRequest>;
    };
    estimateGas: {
        sendMessage: (message: CrossChainMessageRequest, opts?: {
            l2GasLimit?: NumberLike;
            overrides?: CallOverrides;
        }) => Promise<BigNumber>;
        resendMessage: (message: MessageLike, messageGasLimit: NumberLike, opts?: {
            overrides?: CallOverrides;
        }) => Promise<BigNumber>;
        proveMessage: (message: MessageLike, opts?: {
            overrides?: CallOverrides;
        }, messageIndex?: number) => Promise<BigNumber>;
        finalizeMessage: (message: MessageLike, opts?: {
            overrides?: CallOverrides;
        }, messageIndex?: number) => Promise<BigNumber>;
        bridgeETH: (amount: NumberLike, opts?: {
            recipient?: AddressLike;
            l2GasLimit?: NumberLike;
            overrides?: CallOverrides;
        }) => Promise<BigNumber>;
        withdrawETH: (amount: NumberLike, opts?: {
            recipient?: AddressLike;
            overrides?: CallOverrides;
        }) => Promise<BigNumber>;
        bridgeNativeToken: (amount: NumberLike, opts?: {
            recipient?: AddressLike;
            l2GasLimit?: NumberLike;
            overrides?: CallOverrides;
        }) => Promise<BigNumber>;
        withdrawNativeToken: (amount: NumberLike, opts?: {
            recipient?: AddressLike;
            overrides?: CallOverrides;
        }) => Promise<BigNumber>;
        approveNativeToken: (amount: NumberLike, opts?: {
            overrides?: CallOverrides;
        }) => Promise<BigNumber>;
        approveERC20: (l1Token: AddressLike, l2Token: AddressLike, amount: NumberLike, opts?: {
            overrides?: CallOverrides;
        }) => Promise<BigNumber>;
        bridgeERC20: (l1Token: AddressLike, l2Token: AddressLike, amount: NumberLike, opts?: {
            recipient?: AddressLike;
            l2GasLimit?: NumberLike;
            overrides?: CallOverrides;
        }) => Promise<BigNumber>;
        withdrawERC20: (l1Token: AddressLike, l2Token: AddressLike, amount: NumberLike, opts?: {
            recipient?: AddressLike;
            overrides?: CallOverrides;
        }) => Promise<BigNumber>;
    };
}
